C_Kurs_Lekt / DOC_RAZNOE / Лаб раб 8-9 Работа с масивами
.pdfЛабораторные работы №8, 9.
Работа 8 – одномерные массивы (векторы)
Работа 9 – двумерные массивы (матрицы)
В общем случае для объявления массива может потребоваться динамическое выделение памяти.
Рассмотрим несколько примеров:
Для динамического выделения памяти используют функции: malloc, calloc, realloc, free (#include stdlib.h)
Мы будем использовать calloc – для выделения памяти и заполнения ее нулями и free для очистки (освобождения) памяти.
ВЕКТОРЫ 1) Целые числа
…
int n=15; // n – число элементов int *vekt; // указатель на массив
vekt = (int *)calloc(n,sizeof(int)); // выделение (без проверки) // … работаем с вектором, например,
vekt[10]= 12;
free(vekt); // очистка памяти
При работе с памятью лучше выполнять проверку правильности выделения памяти:
Т.е. вместо
vekt = (int *) calloc(n, sizeof(int));
пишем:
if(vekt =(int *)calloc(n, sizeof(int)) ==NULL) { printf("Ошибка выделения памяти!!! \n"); exit(1);
}
т.е. если программе не удалось выделить память – мы завершаем работу программы или пишем код для повторной попытки выделения памяти.
2)Действительные числа (для экономии места – пишем без проверки правильности выделения памяти)
int n=15; // n – число элементов double *vekt; // указатель на массив
vekt = (double *)calloc(n,sizeof(double)); // выделение (без проверки) // … работаем с вектором, например,
vekt[10]= 12.34; free(vekt); // очистка памяти
МАТРИЦЫ (двумерные массивы) 1) Целые числа
int n=5; // n – числострок
int m=7; // m – число столбцов
int **matrix; // указатель на указатель на целое ( матрица ) matrix = (int **)calloc(n,sizeof(int *));
for(i=0; i <n; i++)
matrix[i] = (int *)calloc(n,sizeof(int)); // … работаем с матрицей, например, matrix[1][6]= 5;
for(i=0; i <n; i++) free(matrix[i]);
free(matrix); // очистка памяти
2) Действительные числа int n=5; // n – числострок
int m=7; // m – число столбцов
double **matrix; // указатель на указатель на целое ( матрица ) matrix = (double **)calloc(n,sizeof(double *));
for(i=0; i <n; i++)
matrix[i] = (double *)calloc(n,sizeof(double)); // … работаем с матрицей, например, matrix[1][6]= 5.71;
for(i=0; i <n; i++) free(matrix[i]); free(matrix);
Как это выглядит в памяти ?
1)Для вектора
2)Для матрицы
Получение «случайных» чисел (псевдослучайных) CodeBlock
Для работы необходимо #include stdlib.h
1)
Целые числа от а до b - [a,b] a + rand()%(b – a + 1)
2)
Действительные числа от а до b - [a, b]
a + (double)rand()/RAND_MAX*(b – a)