Содержание
Содержание 3
1. Массивы в языке С_ 4
1.1. Понятие массива 4
1.2. Динамические массивы_ 5
2. Алгоритмы обработки одномерных массивов 7
2.1. Инициализация массива 7
2.2. Ввод – вывод одномерного массива 7
2.3. Перестановка двух элементов массива 9
2.4. Вычисление суммы элементов массива 10
2.5. Подсчет количества элементов массива, удовлетворяющих заданному условию_ 15
2.6. Вычисление произведения элементов массива 18
2.7. Поиск элементов, обладающих заданным свойством_ 21
2.8 Поиск в упорядоченном массиве 22
2.9. Поиск минимального и максимального элемента массива и его порядкового номера (индекса) 25
2.10. Копирование массивов 26
2.10 Формирование нового массива 27
Литература 31
Приложение 32
Примеры решения задач по обработке одномерных массивов 32
Задача 1. Вычисление сумм, количеств и произведений элементов массива 32
Задача.2. Вычисление сумм, количеств и произведений элементов массива 36
Массивы в языке С
Понятие массива
Массив – это совокупность элементов одного типа, имеющих одно имя и расположенных в памяти ПК вплотную друг к другу. Массивы могут состоять из арифметических данных, символов, строк, структур, указателей. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.
При объявлении массива в программе определяется имя массива, тип его элементов, размерность и размер. Размерность или количество измерений массива определяется количеством индексов при обращении к элементам массива. Массивы бывают одномерные, двухмерные, трехмерные и т.д.. Размер массива – это количество его элементов по соответствующим размерностям. Общий вид объявления массива:
|
<имя_типа> <имя_массива> [k1] [k2] … [kn];
где k1, k2, …, kn – количество элементов массива – константы или константные выражения по 1, 2, …, n измерениям. Причем значения индексов могут изменяться от 0 до ki – 1.
Такое объявление массива называют статическим, поскольку предельное количество его элементов известно заранее и оно уже не может быть изменено в ходе выполнения программы. При работе с массивами необходимо следовать следующим правилам:
¨ современные трансляторы языка Си не контролируют допустимость значений индексов, это должен делать программист;
¨ количество измерений массива не ограничено;
¨ в памяти элементы массива располагаются так, что при переходе от элемента к элементу наиболее быстро меняется самый правый индекс массива, т.е. матрица, например, располагается в памяти по строкам;
¨ имя массива является указателем – константой на первый элемент массива;
¨ операций над массивами в Си нет, поэтому пересылка элементов одного массива в другой может быть реализована только поэлементно с помощью цикла;
¨ над элементами массива допускаются те же операции что и над простыми переменными того же типа;
¨ ввод/вывод значений элементов массива можно производить только поэлементно;
¨ начальные значения элементам массива можно присвоить при объявлении массива.
Примеры объявления массивов:
int A [10]; //одномерный массив из 10 целочисленных величин
float X [20]; //одномерный массив из 20 вещественных величин
int a[5]={1, 2, 3, 4, 5}; //массив с инициализацией его элементов
|
int c[]={–1, 2, 0, –4, 5, –3, –5, –6, 1}; // массив размерность которого 6определяется числом инициализирующих элементов
Обращения к элементам одномерного массива могут иметь вид: A[0], A[1], A[2],…A[9], A[2*3].
В Си нет массивов с переменными границами. Но, если количество элементов массива известно до выполнения программы, можно определить его как константу с помощью директивы #define, а затем использовать ее в качестве границы массива, например,
#define n 10;
Main ()
{ int a[n], b[n]; // Объявление 2–х одномерных массивов
Если количество элементов массива определяется в процессе выполнения программы, используют динамическое выделение оперативной памяти компьютера.
Динамические массивы
Если до начала работы программы неизвестно, сколько в массиве элементов, в программе используют динамические массивы. Память под них выделяется с помощью оператора new во время выполнения программы. Адрес начала массива хранится в переменной, называемой указателем. Например.
int n=20;
int *a = new int[n];
Здесь описан указатель a на целую величину, которому присваивается адрес начала непрерывной области динамической памяти, выделенной с помощью оператора new. Выделяется столько памяти, сколько необходимо для хранения n величин типа int. Величина n может быть переменной.
Примечание: Обнуление памяти при ее выделении не происходит. Инициализировать динамический массив нельзя.
Обращение к элементу динамического массива осуществляется также, как и к элементам обычного массива. Например: a [0], a[1], …, a[9].
Можно обратиться к элементу массива другим способом: *(a+9), *(a+i), т.к. в переменной – указателе a хранится адрес начала массива. Для получения адреса, например, 9 – го его элемента к этому адресу прибавляется 9· sizeof(int) (9 умножить на·длину элемента типа int), т.е. к начальному адресу a прибавляется смещение 9. Затем с помощью операции * (разадресации) выполняется выборка значения из указанной области памяти.
|
После использования массива выделенная динамическая память освобождается с помощью опереатора: delete [ ] имя массива. Так например, для одномерного массива a:
delete [ ] a;.
Время "жизни" динамического массива определяется с момента выделения динамической памяти до момента ее освобождения.
Алгоритмы обработки одномерных массивов
Инициализация массива
Инициализация массива – это присваивание элементам массива начальных значений. Инициализацию массива можно выполнить на этапе описания массива, как это показано в п.1.1. Но в том случае, когда начальные значения получают лишь некоторые элементы массива, а остальные вычисляются в процессе выполнения программы, в программе записывают операторы присваивания. Например:
a[0]= –1; a[1]=1.1;
Присваивание всем элементам массива одного и того же значения осуществляется в цикле. Например, чтобы всем элементам массива a присвоить значение 0, можно воспользоватся алгоритмом изображенный на рис. 2.1.
for(i=0;i<n;i++) a[i]=0; // или с помощью цикла while i=0; while (i<n) { a[i]=0; i=i+1; } |
Рисунок 2.1 Алгоритм и фрагмент программы
инициализации массива
В представленном алгоритме все элементы массива в цикле последовательно инициализируются значением – 0.