Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_практикум_ч2_2008_1.DOC
Скачиваний:
12
Добавлен:
10.11.2019
Размер:
155.14 Кб
Скачать

Учреждение образования «высший государственный колледж связи»

Кафедра ПОСТ

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

по дисциплине

«Основы алгоритмизации и программирования»

для студентов специальности

2 -45 01 03 – Сети телекоммуникаций

Минск 2008

Составители: Черноморец О.П., Труханович Т.Л.,

Прихожий А.А.

Издание утверждено на заседании кафедры ПОСТ

« 7 » марта 2007г. Протокол № 7

Зав. Кафедрой______________ Прихожий А.А.

Содержание

Лабораторная работа № 6. Написание программы на ЯП С с использованием линейных массивов 4

Лабораторная работа № 7. Написание программы на ЯП С с использованием многомерных массивов. 12

ЛАБОРАТОРНАЯ РАБОТА № 8. Написание программы на ЯП С с использованием указателей 17

Лабораторная работа № 6. Написание программы на яп с с использованием линейных массивов

Цель работы: формирование знаний и умений по работе с линейными массивами.

Краткие теоретические сведения

В массивах объединяются элементы одного и того же типа. Может быть массив целых чисел, массив значений с плавающей запятой или массив символов. Массив может состоять из одного элемента, а может запомнить столько, сколько позволяет объем оперативной памяти.

Объявление

int scores[100];

определяет массив с именем scores, способный хранить 100 значений типа int. Если scores – глобальная переменная, то элементы массива с именем scores инициализируются нулями. Если массив локален (т.е. объявляется внутри какой-либо функции), то его значения не инициализируются и содержат случайные значения.

Одно только имя массива scores (без скобок) представляет весь массив как единое целое. Чтобы получить доступ к конкретному элементу, после имени массива добавьте индекс в квадратных скобках. Например, оператор

scores[5]=89;

присваивает значение 89 шестому элементу массива scores. Почему шестому? Потому что первый элемент массива имеет индекс 0. Оператор

scores[0]=1000;

присваивает первому элементу массива круглую сумму.

Замечание. Поскольку первый индекс массива равен нулю, то для любого объявления вида T name[N], (где Т – тип данных) допустимые значения индексов находятся в диапазоне от 0 до N – 1. Использование индекса вне этого диапазона (например name[-2] ) приведет к ссылке на область памяти, не принадлежащую массиву, что может вызвать серьезные ошибки.

Элементы массива запоминаются в памяти последовательно. Как показано на рис. 1, массив напоминает штабель ящиков. Выражение scores[0] представляет первый ящик. Сразу за ним в памяти располагается элемент scores[1]. Затем идет scores[2], scores[3] и т.д. Последним элементом является scores[99].

Рисунок 1 - Массив похож на штабель ящиков

Индексами массивов могут служить любые целые выражения - константы, переменные, результаты функций и т.д. Если у вас объявлена целая переменная i, то можно использовать следующие параметры для отображения шестого элемента массива scores:

i=5;

printf(score = %d\n,scores[i]);

Чтобы обработать все элементы массива обычно используется цикл for.

Перед вами один из способов отображения значений всех элементов массива scores:

for(i=0;i<100;i++)

printf(scores[%d]=%d\n, i,scores[i]);

Инициализация массивов

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

int digits[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

создает 10-элементный массив целых чисел с именем digits и последовательно присваивает значения от 0 до 9 каждому элементу массива. Результат действия этого объявления аналогичен результату работы следующих операторов:

int i,digits[10]; /* индекс i и массив из 10 целых */

for(i=0;i<10;i++)

digits[i]=i;

Вы даже можете заставить компилятор автоматически вычислить размер массива. Объявление

int digits[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

создает массив из 10 целых, как и раньше. Но в этом случае пустые скобки заставляют компилятор выделить ровно столько памяти, сколько необходимо для хранения перечисленных элементов.

При явном задании размера массива в квадратных скобках совершенно не обязательно задавать значение для каждого элемента массива. Например, объявление

int digits[10]={0, 1, 2, 3, 4};

создает массив из 10 целых, но инициализирует только первые пять.

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

int digits[5]={0, 1, 2, 3, 4, 5, 6};

то он поперхнется и выдаст: Too many initializers (Слишком много инициализаторов).

Использование sizeof с массивами

Если anyArray – это имя какого-то массива, то выражение sizeof(anyArray) равно числу байтов, занимаемых массивом в памяти, а sizeof(anyArray[0]) – числу байтов, занимаемых одним элементом.

Во время инициализации массива можно использовать sizeof(), чтобы точно определить число элементов. Вместо строк

#define MAX 5;

int anyArray[MAX]={0, 1, 2, 3, 4};

вы можете написать

int anyArray[]={0, 1, 2, 3, 4};

#define MAX (sizeof(anyArray) / sizeof(anyArray[0]));

В первой строке объявляется массив неопределенного размера, и элементам присваиваются начальные значения. Поскольку в скобках не указан размер массива, компилятор выделяет ровно столько памяти, сколько необходимо для запоминания перечисленных значений. Вторая строка определяет символическую константу MAX, равную размеру массива в байтах, деленному на размер одного элемента. Поскольку элементы массива запоминаются в памяти последовательно, то константа MAX теперь равна числу элементов в массиве.

Использование этого метода поможет избежать ошибок, вызванных заданием слишком малого числа элементов массива. Например, компилятор не станет жаловаться на объявление следующего вида:

#define MAX 5;

int anyArray[MAX]={0, 1, 2, 3};

Здесь элементу anyArray[4] значение в явном виде не присваивается (этот факт легко не заметить), и в дальнейшем может быть допущена трудноуловимая ошибка.

Использование массивов констант

Чтобы не допустить изменений в элементах массива, предваряйте его объявление ключевым словом const. Это особенно важно для программ, которые сопровождают несколько человек. Объявление

const int anyArray[ ]={0, 1, 2, 3, 4};

создает пятиэлементный массив с именем anyArray. Благодаря модификатору const любой оператор, который пытается изменить значение элементов массива, не будет компилироваться:

anyArray[4]++; / * ошибка * /

Символьные массивы

Строки в языке С представляют собой массивы значений типа char. Объявление

char name[128];

задает символьный массив name, содержащий 128 элементов типа char. Аналогично тому, как это делается в других массивах, вы можете использовать индексное выражение для доступа к конкретному элементу, в данном случае, к символу. Если a является переменной типа char, то оператор

a=name[3];

присваивает четвертый символ массива name переменной a.

Чтобы инициализировать символьный массив, присвойте ему литерную строку, заключенную в кавычки:

char composer[ ]= Peter Tchaikovsky;

Как и в других объявлениях массивов, пустые скобки заставляют компилятор вычислять объем памяти, необходимый для запоминания инициализирующего значения. Не забывайте, что все строки заканчиваются невидимым нулевым байтом, поэтому строка в этом примере имеет длину 12 байтов, а не 11.