Числовые массивы в языке программирования С
Пример 6. Каждый день производятся замеры некоторых величин (вещественных значений), причем значения этих величин сводятся в прямоугольную таблицу размера n m. Составьте многомерный массив данных за 30 дней. Формирование данных произвести по случайному равномерному закону из интервала от –12 до 21.
Этот пример относится к определению трехмерного массива данных. Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> #define n 6 #define m 7 #define N 30 const int Left = -12; // Левая граница const int Right = 21; // Правая граница int main (void) { float R, r; float A[N][n][m]; int i, j, k; // Инициализация генератора случайных чисел srand((unsigned) time(NULL)); printf("\n\t The values of every 10 days from 30 days:"); // Формирование данных за 30 дней for (k = 0; k < N; ++k) for (i = 0; i < n; ++i) for (j = 0; j < m; ++j) { r = (float) rand()/RAND_MAX; R = Left + (Right - Left)*r; A[k][i][j] = R; } // Печать данных за каждый 10-й день for (k = 0; k < N; k += 10) { printf("\n"); for (i = 0; i < n; ++i) { printf("\n"); for (j = 0; j < m; ++j) printf("%10.4f", A[k][i][j]); } } printf("\n Press any key: "); _getch(); return 0; }
В программе используется трехмерный массив размера 30 6 7. Это означает, что прямоугольная таблица (массив) данных размера 6 7 как бы скрепляется 30 раз – по заданному числу дней. Границы случайных чисел определены с помощью спецификатора const.
Возможный результат выполнения программы показан на рис. 5.6.
Задание 6
- В программе сделайте предварительное обнуление трехмерного массива.
- Измените тип вещественных данных float на тип double. Проверьте работу программы.
- Найдите максимальный и минимальный элементы массивов.
- Найдите абсолютные значения максимального и минимального элементов всего трехмерного массива.
- Выполните заполнение трехмерного массива размера 3 5 7 натуральными числами и выведите на консоль полученный многомерный массив.
Пример 7. Напишите программу по перемножению двух матриц А и В с размерностями ( m r ) и ( r n ) соответственно. Матрицу А примите размером 4 5, матрицу В – размером 5 3 (обе целочисленные).
Условием перемножения двух матриц А и В является равенство числа столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет размер m r, то вторая матрица В должна иметь размер r n. В результате перемножения получим матрицу С размера m n. Приведем следующую схему по размерностям:
Поэлементное перемножение двух матриц в стандартной математической форме имеет следующий вид:
С учетом синтаксиса формирования массивов в языке С индексация должна начинаться с нуля, поэтому формулу перепишем в следующем виде:
Программный код решения примера:
#include <stdio.h> #include <conio.h> #define m 4 #define r 5 #define n 3 int main (void) { int i, j, k; // переменные циклов const int A[m][r] = {{1,2,3,4,5}, {2,3,4,5,6}, {2,2,2,2,2}, {3,3,3,3,3}}; const int B[r][n] = {{9,8,7}, {1,2,3}, {4,5,6}, {7,8,9}, {1,1,1}}; // Массив под результат произведения двух матриц int C[m][n]; // Обнуление результирующей матрицы for (i = 0; i < m; i++) for (j = 0; j < n; j++) C[i][j] = 0; // Формирование результата произведения двух матриц for (i = 0; i < m; i++) for (j = 0; j < n; j++) for (k = 0; k < r; k++) C[i][j] = C[i][j] + A[i][k]*B[k][j]; // Распечатка результата произведения двух матриц printf("\n 1) Index: \"ijk\". Matrix (%dx%d):\n", m, n); for (i = 0; i < m; i++) { printf("\n"); for (j = 0; j < n; j++) printf(" %4d", C[i][j]); } printf("\n\n ... Press any key: "); _getch(); return 0; }
В программе используются три цикла по формированию произведения двух матриц. Первый цикл (переменная i ) связан с количеством строк первой матрицы (матрицы А ), второй цикл (переменная j ) связан с количеством столбцов второй матрицы (матрица В ), третий цикл (переменная k ) связан со смежной размерностью матриц, которая исчезает в результирующей матрице С. Матрицы А и В определены как неизменяемы типы ( const int ). Приведенный программный метод можно назвать как первый метод, метод "ijk".
Результат выполнения программы показан на рис. 5.7.
Задание 7
- Измените программу, чтобы циклы были организованы в порядке "jki". Это можно назвать вторым методом программного перемножения двух матриц.
- Измените программу, чтобы циклы были организованы в порядке "kji". Это можно назвать третьим методом программного перемножения двух матриц.
- Примените тип float для заданных матриц. Предусмотрите форматированный вывод результата на консоль.
Контрольные вопросы
- Как организуются многомерные числовые массивы в языке С?
- Как организуется индексирование числовых массивов в языке С?
- На кого или на что возлагается контроль границ числовых массивов в языке программирования С?
- В какой очередности и как происходит заполнение многомерных числовых массивов в программах на языке С?
- Для чего применяется начальная инициализация числовых массивов при дальнейшем их использовании?
- Сколько потребуется операторов цикла для вывода на консоль двухмерного числового массива (матрицы чисел)?
- Почему при определении размерности массива с помощью препроцессорной директивы define не используется точка с запятой после числового значения?