Форма отчета по лабораторной работе

Отчет должен содержать: титульный лист; цель работы; условие задачи; текст программы с комментариями; в зависимости от задачи для проверки правильности работы алгоритма представить результаты работы программы по расчету контрольного примера вместе с ручным расчетом контрольного примера или результаты работы программы и заранее известное точное значение решения задачи; выводы по работе.

Вопросы для самоконтроля

1. Разновидности операторов циклов в языке Си.

2. Итерация цикла.

3. Условие выполнения цикла.

4. Тело цикла.

Лабораторная работа № 3. Изучение массивов в языке Си

Цель и задачи работы, требования к результатам ее выполнения

Цель работы состоит в овладении навыками разработки программ на языке Си, использующих массивы как одномерные, так и многомерные. Для достижения цели необходимо выполнить следующие задачи:

- изучить учебный материал, посвященный массивам в языке Си [1, 3];

- разработать программу на языке Си для решения заданных вариантов заданий;

- отладить программу;

- выполнить решение контрольного примера небольшой размерности с помощью программы и ручной расчет контрольного примера;

- подготовить отчет по лабораторной работе.

Краткая характеристика объекта изучения

Дадим следующее определение массива

Массив– это производный тип, представляющий собой множество элементов, все элементы массива имеют один и тот же тип и следуют в памяти друг за другом.

Массивы бывают одномерными и многомерными.

Одномерные массивы

Формат определения одномерного массива:

<type> <имя_массива>[<конст_выражение>];

Примеры:

int A[100]; // Объявление массива из 100 элементов типа int

char C1[20], C2[150]; // Объявляются 2 массива элементов типа char из

// 20 и 150 элементов

Описание массива может не содержать число элементов.

extern float y[]; // Описание

…….

float y[20]; // Определение

Обращение к элементам массива осуществляется с помощью специальной операции [] – обращение по индексу.

int m[10];

m[0]=1; // Элементу массива с индексом 0 присваивается значение 1

m[1]=2; // Элементу массива с индексом 1 присваивается значение 2

… ;

m[9]=10; // Элементу массива с индексом 9 присваивается значение 10

Индексация всегда начитается с 0, последний элемент имеет индекс n-1.

Элемент массива может участвовать в любом выражении, где допустимо использование переменной соответствующего типа.

m[5]=m[3]+m[4]*100;

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

Массив может иметь инициализацию, если массив имеет инициализацию, то размерность можно не указывать, она определяется по умолчанию.

int a1[4]={ 2, 5, 9, 10 }; // Массив из 4-х элементов

int a2[7]={ 3, 4, 5 }; // Массив из 7 элементов, проинициализированы первые 3

char c1[]={ ‘A’, ‘g’, ‘1’, ‘y’, ‘I’ }; // Массив из 5 элементов,

// размерность определяется по умолчанию

Если массив объявлен за пределами блоков, то по умолчанию его элементы инициализируются 0.

Массивы и указатели

Имя массива, используемое внутри выражения без [], является указателем на первый элемент массива (элемент с индексом 0). Данный указатель является константным, т.е. его значение нельзя изменять.

Для некоторого массива, например

int A[10];

выполняется равенство A==&A[0]

Доступ к элементу массива возможен или через индексное выражение или через операцию обращения по адресу.

for (int i=0; i<10; i++) A[i]=2*i;

for (int i=0; i<10; i++) *(A+i)=2*i; // Наличие скобок обязательно,

// так как приоритет операции * выше,

// чем операции +

Кроме того имя массива без скобок является указателем, тип которого соответствует указателю на тип элемента массива. Допустим следующий порядок работы с массивом:

int a[10];

int *p;

p=a;

for(int i=0; i<10; i++) p[i]=i*i;

или

for(int i=0; i<10; i++) *(p+i)=i*i;

Строки

Строка– это символьный массив, заканчивающийся символом с кодом 0 (символ NULL) – это служебный символ, являющийся признаком конца строки.

Практически все стандартные функции, работающие со строками, используют это свойство для определения конца строки.

Примеры:

char str[]=“ABCD”; // Это строка, выделяется память под 5 символов (последний 0)

char c[]={‘A’, ‘B’, ‘C’, ‘D’ }; // Это просто массив из 4-х символов

char *s=“Пример строки”; // Допустимо такое определение строки

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

int len=0; // Длина строки

for(; s[len]; len++) ;

Динамические массивы

Память для массива может выделяться и уничтожаться динамически с помощью специальных функций, например, для выделения памяти могут использоваться функции: malloc, calloc, realloc, а для освобождения памяти функция free (в Си++ существуют специальные операторы new и delete). Особенно это удобно в том случае, когда число элементов заранее не известно, а становится известным только во время выполнения программы, например, число элементов может вычисляться при работе программы, вводиться с клавиатуры и т.д.

Функция malloc имеет заголовок, определенный в заголовочном файле stdlib.h:

void * malloc(unsigned int _Size);

Данная форма заголовка является упрощенной, функция имеет один параметр, определяющий размер выделяемой динамически области памяти в байтах, функция возвращает указатель на выделяемую область памяти, тип указателя void *, что обеспечивает его неявное приведение к указателям на любые стандартные типы.

Возвращает выделенную память обратно операционной системе функция с упрощенным заголовком (заголовочный файл stdlib.h):

void free(void * _Memory);

Функция имеет один параметр – указатель на блок освобождаемой памяти.

Ниже представлен пример выделения памяти под массив, размерность которого вводится с клавиатуры, далее массив заполняется случайными числами, выводится на печать, в конце работы программы выделенная память освобождается. Пример реализован на языке Си (файл с расширением .c). Если реализовывать его на языке Си++ (файл с расширением .cpp), то при использовании malloc необходимо применять операцию явного преобразования типа.

#include <stdio.h>

#include <stdlib.h>

void main()

{

int *p; // Указатель, может быть использован для выделения памяти под массив динамически

int n; // Заранее неизвестное число элементов массива

int i; // Индексная переменная

printf_s("n="); scanf_s("%d", &n); // Ввод с клавиатуры числа элементов массива

p = malloc(n*sizeof(int)); // Выделяем память под массив динамически в Си

// p=(int *) malloc(n*sizeof(int)); в Си++ требуется преобразование типа!!!!!!

// Заполняем массив случайными числами и печатаем его

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

{

p[i] = rand() % 100; // Получаем псевдослучайное целое число в интервале

// 0..99

printf_s("%d ", p[i]);

}

free(p); // Возвращаем выделенную память операционной системе,

// когда она не нужна

system("pause");

}

Многомерные массивы

Многомерный массив – это массив массивов.

Пример определения:

int A[2][3];

Данное определение можно раскрыть следующим образом: А – массив из двух элементов, элементами массива являются массивы из трех элементов типа int.

Элементы следуют в памяти в следующем порядке:

A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2]

Обращаться к элементам массива можно с помощью индексного выражения или с помощью указателей

A[0][1]=5;

A[i][j]=i+j; // или

*(*(A+i)+j)=i+j;

Наши рекомендации