Добавил:
ФКН Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Семестр 1 / Алгоритмизация Практика 11 язык С

.pdf
Скачиваний:
109
Добавлен:
05.12.2019
Размер:
307.28 Кб
Скачать

Алгоритмизация и программирование Си

Практическое занятие №11

«Двумерныемассивы»

Общие сведения

Многомерные массивы

Многомерный массив — это массив массивов. Например, объявим двумерный массив, содержащий 5 массивов по 10 элементов в каждом:

int arr2d[5][10];

Вданном примере:

5 — это старшая размерность, 10 — младшая;

всего в массиве содержится 5x10=50 элементов;

элементы имеют номера от [0][0] до [4][9];

если массив объявлен внутри функции, его элементы никак не инициализированы и содержат «мусор».

Лучше всего представлять себе такой массив как матрицу, содержащую 5 строк и 10 столбцов:

arr2d[0][0]

arr2d[0][1]

arr2d[0][9]

arr2d[1][0]

arr2d[1][1]

arr2d[1][9]

 

 

 

 

arr2d[2][0]

arr2d[2][1]

arr2d[2][9]

arr2d[3][0]

arr2d[3][1]

arr2d[3][9]

 

 

 

 

arr2d[4][0]

arr2d[4][1]

arr2d[4][9]

 

 

 

 

(arr2d[0] — это первая строка целиком, arr2d[1] — вторая и т.д.)

Указатели

Указатель — это переменная, которая хранит в себе адрес некоторой ячейки памяти. При объявлении такой переменной обязательно надо указывать тип того значения, которое хранится по этому адресу (для того, чтобы мог работать механизм контроля типов). Тип самой переменнойуказателя обозначается как “T*”, где T — тип значения, на которое он будет указывать. Тот факт, что некоторая переменная-указатель хранит в себе адрес некоторой другой области памяти, на иллюстрациях изображен стрелкой:

Например, пусть указатель px указывает на целочисленную переменную x:

Таблица 1. Графическое изображение переменных и указателей.

Код на C

 

Иллюстрация

 

 

 

int x

= 4;

px

 

x

int *px;

 

 

4

 

 

 

 

 

px =

&x;

 

 

 

 

 

 

 

 

 

 

 

 

Доступ к самой ячейке, на которую указывает указатель, осуществляется при помощи операции разадресации (разыменования) указателя (*). Если изменить значение в ячейке посредством разыменования указателя на нее, то это изменение будет заметно и при любом другом способе обращения к этой ячейке:

Практическоезанятие№11

Страница1

Алгоритмизация и программирование Си

Код на

C

Результат на экране

 

 

 

 

int x = 4;

 

 

 

int* px;

 

 

 

px = &x;

 

x= 4

*px= 4

printf("x= %d\t *px=

%d\n", x, *px);

x = 2;

 

x= 2

*px= 2

printf("x= %d\t *px=

%d\n", x, *px);

*px = 3;

 

x= 3

*px= 3

printf("x= %d\t *px=

%d\n", x, *px);

 

 

 

 

Указатели на массивы и арифметика указателей

Особенно велика польза от указателей, когда они указывают на некоторую ячейку массива:

/* создадим двумерный массив */ int arr2d[5][10];

/* здесь код заполнения массива arr2d*/ printf("Какую строку массива распечатать: \n"); int row;

scanf("%d", &row);

/* пусть указатель указывает на первый элемент row-той строки*/ int* p = &arr2d[row][0];

/* распечатаем эту строку, используя доступ через указатель*/ for(int i=0; i<10; i++)

{

printf("%d\t",*(p+i));

}

Вданном примере выражение «*(p+i)» означает:

вычислить адрес i-ой ячейки, лежащей после той, на которую указывает указатель p (т.е. просто прибавить к хранимому в нем адресу число i. На самом деле надо прибавлять, конечно же, не просто i, а i*sizeof(int). Именно такой код в реальности и генерирует компилятор, когда встречает подобное выражение. А для того, чтобы он мог так сделать, задаем тип указателя — int *);

разыменовать полученный адрес — т.е. обратиться к самой ячейке, лежащей по этому адресу (а затем вывести полученное значение на экран).

Самое главное, что надо знать про указатели

В языке Си указатели и массивы взаимозаменяемы. В том смысле, что указатель можно использовать как массив:

 

int*

p = &some_arr[0];

 

 

 

printf("%d\t", p[i])); // эквивалентно: printf("%d\t",*(p+i));

 

 

 

 

а массив — как указатель:

 

 

 

int arr[10];

 

 

 

int*

p = arr;

// эквивалентно: int* p = &arr[0];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Практическоезанятие№11

Страница2

Алгоритмизация и программирование Си

Задания для самостоятельного решения (2 балла)

Задание 1 (1 балл).

Выполнить свой вариант индивидуального задания №1. Требования к заданию:

1.Все массивы должны быть статическими и генерироваться автоматически.

2.Отдельно должны быть описаны функции заполнения и печати массивов через указатели.

3.Размеры массива М и N задаются в виде констант в исходном коде программы.

4.Когда речь идет о «четных», «нечетных» или номерах k и р, то имеется в виду, что нумерация начинается с единицы.

5.Параметрами функций должны быть только необходимые по функциональности переменные. Числа k и р передаются в функцию в качестве параметров.

6.НЕ использовать глобальные переменные напрямую в функциях, а передавать их при необходимости через параметры.

Варианты к заданию 1.

1Дан двумерный целочисленный массив размера M N и целое число k. Написать функцию, которая вычисляет количество всех элементов, равных k в нечетных строках.

Дан двумерный целочисленный массив размера M N и целое число k. Написать

2функцию, которая вычисляет количество всех положительных элементов, расположенных в столбцах, кратных k.

Дан двумерный целочисленный массив размера M N и целые числа k и р. Написать

3функцию, которая вычисляет сумму всех четных значений, расположенных между k- тым и р-тым столбцами.

Дан двумерный целочисленный массив размера M N и целое число k. Написать

4функцию, которая вычисляет сумму всех элементов, расположенных после строки, содержащей хотя бы один элемент, равный k.

Дан двумерный целочисленный массив размера M N и целые числа k и р. Написать

5функцию, которая вычисляет номер первого столбца, содержащего все элементы, значения которых принадлежат диапазону [k, p].

6Дан двумерный целочисленный массив размера M N, заполненный 0 и 1, и целое число k. Написать функцию, которая вычисляет номер первой строки, содержащей k нулей.

Дан двумерный целочисленный массив размера M N (М - нечетное), заполненный 0 и

71. Написать функцию, которая вычисляет количество столбцов, содержащих больше единиц, чем нулей.

Дан двумерный целочисленный массив размера M N и целое число k. Написать

8функцию, которая вычисляет сумму всех четных значений, расположенных в строках с номерами от k до р (включительно).

Дан двумерный целочисленный массив размера M N и целые числа k и р. Написать

9функцию, которая вычисляет количество всех нечетных значений, расположенных между k-той и р-той строками.

Дан двумерный целочисленный массив размера M N, заполненный 0 и 1, и целое число

10k. Написать функцию, которая вычисляет количество всех строк, содержащих более k нулей.

Практическоезанятие№11

Страница3

Алгоритмизация и программирование Си

Задание 2 (1 балл).

Напишите такую программу.

Вы — начинающий кинорежиссер и только что завершили работу над своим дебютным проектом. Вскоре Вам предстоит премьерный показ, на котором Вы планируете попросить всех гостей (а всего их 20 человек) выставить Вашему фильму оценку по стандартной IMDb -шной шкале — от 1 до 10 баллов. Для этого Вам нужна компьютерная программа, которая:

1.Прочитает с клавиатуры 20 оценок, выставленных гостями.

2.Выведет на экран таблицу вида: «оценка — количество гостей, выставивших эту оценку».

Например, эта таблица могла бы выглядеть следующим образом:

оценка

количество голосов

1

3

2

0

3

0

4

0

5

1

 

 

7

3

8

5

 

 

9

5

10

3

Итого голосов

20

Очевидно, сумма элементов правого столбца таблицы должна равняться 20.

Практическоезанятие№11

Страница4