Числовые массивы в языке программирования С
Пример 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 не используется точка с запятой после числового значения?


