Опубликован: 14.12.2010 | Уровень: для всех | Доступ: платный
Лекция 6:

Числовые массивы в языке программирования С

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Пример 6. Каждый день производятся замеры некоторых величин (вещественных значений), причем значения этих величин сводятся в прямоугольную таблицу размера n \times 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 \times 6 \times 7. Это означает, что прямоугольная таблица (массив) данных размера 6 \times 7 как бы скрепляется 30 раз – по заданному числу дней. Границы случайных чисел определены с помощью спецификатора const.

Возможный результат выполнения программы показан на рис. 5.6.

Вывод данных за каждый 10-й день

Рис. 5.6. Вывод данных за каждый 10-й день

Задание 6

  1. В программе сделайте предварительное обнуление трехмерного массива.
  2. Измените тип вещественных данных float на тип double. Проверьте работу программы.
  3. Найдите максимальный и минимальный элементы массивов.
  4. Найдите абсолютные значения максимального и минимального элементов всего трехмерного массива.
  5. Выполните заполнение трехмерного массива размера 3 \times 5 \times 7 натуральными числами и выведите на консоль полученный многомерный массив.

Пример 7. Напишите программу по перемножению двух матриц А и В с размерностями ( m \times r ) и ( r \times n ) соответственно. Матрицу А примите размером 4 \times 5, матрицу В – размером 5 \times 3 (обе целочисленные).

Условием перемножения двух матриц А и В является равенство числа столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет размер m \times r, то вторая матрица В должна иметь размер r \times n. В результате перемножения получим матрицу С размера m \times n. Приведем следующую схему по размерностям:


Поэлементное перемножение двух матриц в стандартной математической форме имеет следующий вид:

C_{ij}=\sum^{n}_{k=1}a_{il}*b_{kj}, i=1,2,\cdots,n, j=1,2,\cdots,m.

С учетом синтаксиса формирования массивов в языке С индексация должна начинаться с нуля, поэтому формулу перепишем в следующем виде:

C_{ij}=\sum^{n-1}_{k=1}a_{il}*b_{kj}, i=1,2,\cdots,n-1, j=0,1,2,\cdots,m-1.

Программный код решения примера:

#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.

Результат произведения двух матриц

Рис. 5.7. Результат произведения двух матриц

Задание 7

  1. Измените программу, чтобы циклы были организованы в порядке "jki". Это можно назвать вторым методом программного перемножения двух матриц.
  2. Измените программу, чтобы циклы были организованы в порядке "kji". Это можно назвать третьим методом программного перемножения двух матриц.
  3. Примените тип float для заданных матриц. Предусмотрите форматированный вывод результата на консоль.

Контрольные вопросы

  1. Как организуются многомерные числовые массивы в языке С?
  2. Как организуется индексирование числовых массивов в языке С?
  3. На кого или на что возлагается контроль границ числовых массивов в языке программирования С?
  4. В какой очередности и как происходит заполнение многомерных числовых массивов в программах на языке С?
  5. Для чего применяется начальная инициализация числовых массивов при дальнейшем их использовании?
  6. Сколько потребуется операторов цикла для вывода на консоль двухмерного числового массива (матрицы чисел)?
  7. Почему при определении размерности массива с помощью препроцессорной директивы define не используется точка с запятой после числового значения?
< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
Александр Соболев
Александр Соболев
Россия
Артем Полутин
Артем Полутин
Россия, Саранск