
M_A_S_S_I_V__2.pptx
- Количество слайдов: 20
МАССИВЫ в. СИ
Одномерные и многомерные массивы Массивы – это группа элементов одного типа (double, float, int и т. д. ). 1) Одномерные массивы. Объявление массива имеет два формата: Константное выражение в квадратных скобках задает количество элементов массива: Массив занимает непрерывную область памяти. Для одномерного массива полный объем занимаемой памяти в байтах вычисляется по формуле: Массив представляет собой набор однотипных данных, расположенных в памяти таким образом, чтобы по индексам элементов можно было легко вычислить адрес соответствующего значения. Например, пусть одномерный массив А состоит из элементов, расположенных в памяти подряд по возрастанию индексов, и каждый элемент занимает по k байт. Тогда адрес i-того элемента вычисляется по формуле:
2) Многомерные массивы. Объявление массива имеет формат: Пример: Объем занимаемой памяти в байтах для двухмерного массива вычисляется по формуле : Если речь идет о двумерном массиве В размерности М*N , расположенным в памяти по строкам, то адрес и B[i][j] вычисляется по формуле:
Отсутствие проверки границ массива В языке Си не производится проверки границ массивов: ничто не остановит Вас при выходе за границы массива. Переполнение массива может привести к присвоению лишних значений другим переменным или включению в текст программы. Вы можете объявить массив размером N и указать индекс элемента, выходящий за пределы N, что не приведет к появлению сообщений об ошибке. Пример: Так как индексы в Си всегда отсчитываются от 0, то в массиве элементы: находятся
Инициализация массивов Инициализация – возможность задать начальные значения элементов массива без программирования соответствующих действий. Пример: 1) задание начальных значений всех элементов массива или только нескольких первых элементов: 2) Инициализация многомерного массива:
Задача 1. Подсчитать сумму элементов массива.
Задача 2: Найти первый отрицательный элемент массива.
Указатели Когда компилятор обрабатывает оператор определения переменной, например, int i = 0, он выделяет память в соответствии с типом int и инициализирует ее указанным значением 10. Все обращения в программе к переменной по её имени i заменяются компилятором на адрес памяти, в которой хранится значение переменной. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями. Указатель - это адрес памяти, распределенной для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала). Три вида указателей: 1) Указатели на объект. 2) Указатели на функцию. 3) Указатели на void.
1) Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного). Форма записи: 2) Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции, то есть адрес, по которому передается управление при вызове функции. Форма записи: Например: объявление задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую два аргумента типа double. 3) Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов). Примеры:
Связь указателей и массивов В языке СИ между указателями и массивами существует тесная связь. например, когда объявляется массив в виде int array[25], то при этом выделяется память не только для двадцати пяти элементов массива, но и для указателя с именем array, значение которого становится равным адресу первого по счету (нулевого) элемента массива. Таким образом, сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именем array. С точки зрения синтаксиса языка указатель array является константой, значение которой можно использовать в выражениях, но изменить это значение нельзя. Пример: Здесь указатель p устанавливается на адрес первого элемента масcива, причем операцию присваивания p=array можно записать в эквивалентной форме p=&array[0].
Для доступа к элементам массива существует два различных способа: 1. Использование индексных выражений в квадратных скобках, например, array[16]=3 или array[2]=7. Записи array[16] и 16[array] будут эквивалентными обозначают семнадцатый элемент массива. 2. Использование адресных выражений и операции разадресации, например *(p+15)=3 или *(p+1)=7. При таком способе доступа адресное выражение, равное адресу шестнадцатого элемента массива тоже может быть записано разными способами *(p+15) или *(15+p). Операции с указателями Над указателями можно выполнять унарные операции: инкремент (++) и декремент (--). При выполнении данных операций значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель. Пример:
Динамическое размещение массивов При динамическом распределении памяти для массивов следует описать соответствующий указатель, которому будет присвоено значение адреса начала области выделенной памяти. Адрес формируется как возвращаемое значение при обращении к функции calloc или malloc. Одномерный массив a[10] из элементов типа float можно создать следующим образом : Для создания двухмерного массива вначале нужно распределить память для массива указателей на одномерные массивы, а затем распределять память для одномерных массивов. Пусть, например, требуется создать массив a[n][m]. Это можно сделать следующим образом:
Следует только помнить, что в дальнейшем ненужную для выполнения программы память следует освобождать при помощи функции free.
Генератор случайных чисел randomize • Функция randomize инициализирует генератор случайных чисел. • Прототип данной функции содержится в файле stdlib. h. • Так как randomize это макро-функция, то рекомендуется при использовании этой функции также включить файл time. h.
Формы записи: 1) rand()%100 – случайные числа от 0 до 99 2) 1 + rand()%100 – случайные числа от 1 до 100 3) 200 - rand()%400 – случайные числа от -199 до 200 Задача 3: Вывести 10 случайных целых чисел от 0 до 99
Обработка массивов Задача 4. Заполнить матрицу случайными числами в диапазоне от 0 до 99. Найти в полученной матрице максимальное значение.
Задача 4. Написать программу, которая выводит минимальный элемент введенного с клавиатуры массива целых чисел. Для доступа к элементам массива используйте указатель.
Задача 3. Написать программу, которая вводит по строкам с клавиатуры двумерный массив и вычисляет сумму его элементов столбца.
Задача 4. Написать программу, которая методом прямого выбора сортирует по убыванию введенный с клавиатуры одномерный массив.