
- •Глава 3. Производные типы данных. Массивы.
- •3.3. Многомерные массивы.
- •3.4. Базовые алгоритмы обработки двумерных массивов.
- •Глава 4. Функции.
- •4.1. Стандартное определение функции.
- •4.2. Локальные переменные.
- •4.3. Размещение тела функции. Прототип функции.
- •4.4. Глобальные переменные.
- •4.5. Классы памяти.
- •5.1. Директива # define.
- •5.2. Использование макроопределений с аргументами.
- •5.3. Директива # include. Включение файла.
- •5.4. Условная компиляция.
Глава 3. Производные типы данных. Массивы.
Одномерные массивы.
Под массивом понимается именованный структурированный тип данных, элементы которого относятся к одному и тому же базовому типу, при этом элементы массива занимают непрерывную область памяти. Массив должен иметь имя, должен быть определен тип элементов массива и размер массива.
Поскольку массивы тесно связаны с циклами, рассмотрим их использование в программах, не затрагивая пока более глубокие вопросы.
Формат описания массива:
тип элементов имя массива [константное выражение];
Константное выражение определяет размер массива. Например, объявим массив с именем veb из 12 элементов типа float:
float veb [12];
Диапазон изменения индексов от 0 до 11, всего 12 элементов.
veb[0], veb[1], ..... veb[11].
В языке Си нельзя определять произвольные диапазоны для индексов ( позже рассмотрим в связи с чем накладываются ограничения на индексы массива). Нижняя граница диапазона всегда равна 0, соответственно размер массива на единицу больше верхней границы диапазона.
Размер массива может явно не указываться, если при его объявлении производится инициализация значений элементов. Например, int v[ ]={-2, 10, 4, 0, 3, 16};
В этом случае создается массив из 6 элементов значения, которых соответственно равны:
v[0] =-2, v[1]=10, v[2]=4, v[3]=0, v[4]=3, v[5]=16.
Можно указать явно размер массива при его объявлении, но при этом задать начальные значения, только нескольким первым элементам. Например, float f[5]={1.0, 2.0}.
В этом случае остальные элементы массива должны получить свои значения в процессе выполнения программы.
3.2. Базовые алгоритмы для обработки одномерных массивов.
— Заполнение массива;
— вывод значений элементов массива на внешнее устройство;
— нахождение суммы элементов массива;
— определение максимального (минимального) элемента массива;
— упорядочение элементов массива;
— поиск элемента в упорядоченном массиве.
Примеры 1.
Заполнить массив случайными числами, вычислить сумму элементов массива, определить максимальный элемент.
#include <conio.h>
void main ( )
{
const n=10;
int a[10];
int i;
int s, max;
randomize( ); // установка датчика случайных чисел.
// блок заполнения
for (i=0; i<n; i++)
a[i]= rand( )%1000;
// блок вычисления суммы
s=0;
for (i=0; i<n; i++) s+=a[i];
// блок нахождения максимального элемента
max=a[0];
for (i=1; i<n; i++)
if( a[i]>max)
max=a[i];
}
Примечание: функция rand( ) возвращает псевдослучайное целое число из диапазона 0..215-1.
Пример 2.
Сортировка массива методом выбора.
# include <conio.h>
void main( )
{
int а[ ]={15, 7, 0, -2, 1, 3, 41};
int i, j, n;
int max, num;
clrscr( );
n=sizeof(а)/sizeof (а[0]);
for (i=0; i<n-1, i++)
{
max=а[i];
num=i;
for(j=i+1; j<n; j++)
if(а[j]>max)
{
max=а[j];
num=j;
}
а[num]=а[i];
а[i]=max;
}
//вывод значений элементов массива
Опишем метод сортировки выбором: найти элемент массива, имеющий наибольшее значение и его номер и поменять его местами с первым элементом. Таким образом, наибольший элемент исходного массива расположился на первом месте. Повторить те же самые действия для элементов массива, начиная со второго и т.д. И так до тех пор, пока не будут рассмотрены все последовательные участки исходного массива и длина последнего участка не станет равной единице. Следовательно, внешний цикл по переменной i, повторяет алгоритм поиска максимального элемента n-1 раз, внутренний цикл отвечает за нахождение максимального элемента и его номера на очередном «укороченном» отрезке массива.
Рассмотрим текст программы.
Функция clrscr( ) очищает экран и устанавливает курсор в левый верхний угол, (Заголовочный файл conio.h). Массив а инициализирован. Для того, чтобы определить его размер воспользуемся операцией sizeof. Результат выполнения операции sizeof (а) равен размеру в памяти всего массива- 7 элементов по 2 байта=14байтов. Результат операции sizeof (а[0]) равен размеру одного элемента массива- 2 байта. Результат операции деления sizeof (а)/sizeof (A[0]) равен длине массива, т.е. 7 элементов.
В результате выполнения программы элементы массива а расположатся следующим образом: 41, 15, 7, 3, 1, 0, -2.
Пример3.
Поиск элемента в упорядоченном массиве.
Для поиска нужного элемента используем метод деления пополам.
…
int a[7]={1, 2, 3, 4, 5, 6, 7};
int i, p, q, r;
int b; //искомое число
int flag; //переменная flag примет значение истина, если элемент найден, ноль если нет.
b=3; //ищем в массиве а заданное число, равное 3
p=0; q=6; //устанавливаем начальные значения границ массива
while (p<q)
{
r=(p+q)/2;
if (a[r]<b)
p=r+1;
else
q=r;
}
if (a[p]= =b)
flag=1;
else
flag=0;
Примечание. Для того, чтобы проверить работоспособность всех ветвей алгоритма в режиме отладки заменить значение переменной b на 45 .