- •Учреждение образования «высший государственный колледж связи»
- •«Основы алгоритмизации и программирования»
- •Содержание
- •Лабораторная работа № 6. Написание программы на яп с с использованием линейных массивов
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 7. Написание программы на яп с с использованием многомерных массивов.
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 8. Написание программы на яп с с использованием указателей
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •«Основы алгоритмизации и программирования»
Учреждение образования «высший государственный колледж связи»
Кафедра ПОСТ
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
по дисциплине
«Основы алгоритмизации и программирования»
для студентов специальности
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.