Практическая часть.
Пример 1. Напишите программу заполнения квадратной матрицы (заданного размера n > 2) по спирали натуральными числами начиная с левого верхнего угла (принимая его за номер 1) и двигаясь по часовой стрелке.
Образец заполнения:
Рис.6.1. Образец заполнения матрицы числами по спирали
Программный код решения примера:
#include <stdio.h>#include <conio.h>#define n 13 int main(void) { int i = 1, j, k; int p = n/2; int A[n][n]; // Обнуление матрицы for (j = 0; j < n; ++j) for (k = 0; k < n; ++k) A[j][k] = 0; printf("\n\t Spiral matrix of dimention (%d x %d):\n", n, n); for (k = 1; k <= p; k++) // Число спиралей { // Верхний горизонтальный столбец for (j = (k-1); j < (n-k+1); j++) A[(k-1)][j] = i++; // Правый верхний столбец for (j = k; j < (n-k+1); j++) A[j][n-k] = i++; // Нижний горизонтальный столбец for (j = (n-k-1); j >= (k-1); --j) A[n-k][j] = i++; // Левый верхний столбец for (j = (n-k-1); j >= k; j--) A[j][(k-1)] = i++; } if (n % 2) A[p][p] = n*n; // Распечатка матрицы for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) { printf("%5d", A[i][j]); if (j == (n-1)) printf("\n"); } printf("\n Press any key: "); _getch(); return 0;}Результат выполнения программы показан на рис. 6.2.
Рис. 6.2. Заполнение матрицы по спирали
Пример 2. Каждый день производятся замеры некоторых величин (вещественных значений), причем значения этих величин сводятся в прямоугольную таблицу размера 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 30const 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.
Возможный результат выполнения программы показан на рис. 6.3.
Рис. 6.3. Вывод данных за каждый 10-й день
Пример 3. Напишите программу по перемножению двух матриц А и В с размерностями (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.
Рис. 6.4. Результат произведения двух матриц
Пример 5. Напишите программу транспонирования матрицы, размерности которой (количество строк и количество столбцов) вводятся с клавиатуры, а элементы – вещественные случайные числа, распределенные по равномерному закону из интервала [0;15].
По определению транспонированная матрица – это матрица полученная из исходной матрицы заменой строк на столбцы.
Программный код решения примера:
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <time.h>#include <locale.h>int main (void) { int i, j, n, m; double *A_ptr, *B_buf;// Для рандомизации псевдослучайных чиселsrand((unsigned)time(NULL));setlocale(LC_ALL, "Russian");printf("\n Введите размерность матрицы - \n число строк и число столбцов через пробел: "); scanf_s("%d%d", &n, &m);A_ptr = (double *) calloc((n*m),sizeof(double));B_buf = (double *) calloc((n*m),sizeof(double));for (i = 0; i < n*m; ++i)A_ptr[i] = 15.0*rand()/RAND_MAX;setlocale(LC_NUMERIC, "English");printf("\n Исходная матрица:\n");for (i = 0; i < n; ++i) { printf("\n");for(j = 0; j < m; ++j)printf(" %8.4f", A_ptr[i*m+j]); }// Основной фрагмент транспонированияfor (i = 0; i < n; ++i)for (j = 0; j < m; ++j)B_buf[j*n+i] = A_ptr[i*m+j];printf("\n\n Транспонированная матрица:\n");for (j = 0; j < m; ++j) { printf("\n");for(i = 0; i < n; ++i)printf(" %8.4f", B_buf[j*n+i]); }// Освобождение выделенной памятиfree(A_ptr); free(B_buf); printf("\n\n Press any key: ");_getch(); return 0; }В программе использованы библиотечные функции для установки русских шрифтов setlocale(LC_ALL, "Russian") и вывода элементов матрицы с плавающей точкой: setlocale(LC_NUMERIC, "English"). Для этих функций подключен заголовочный файл locale.h.
|
|
Возможный результат работы программы показан на рис. 6.5.
Рис. 6.5. Пример транспонирования матрицы
Пример 4. Создать блок-схему и программу нахождения суммы квадратов индексов максимального элемента матрицы, ввод элементов матрицы сделать с клавиатуры.
Программный код решения примера:
//Шестая программа
//Автор Загребельный С.Л.
#include <stdio.h>
#include <conio.h>
#define m 3
int main (void) {
int i, j, k, l,max,sum; // переменные циклов
int A[m][m];
// Ввод элементов матрицы
for (i = 0; i < m; i++)
{printf("\n vvedite 3 elementa %d stroki\n",i+1);
for (j = 0; j < m; j++)
scanf("%i,%j",&A[i][j]);}
// Распечатка матриц
printf("\n Ishodnaya matrica (%dx%d):\n", m, m);
for (i = 0; i < m; i++) {
printf("\n");
for (j = 0; j < m; j++)
printf(" %4d", A[i][j]);
}
//
max=A[0][0];
for (i = 0; i < m; i++)
for (j = 0; j < m; j++)
if (A[i][j]>max) {max=A[i][j];k=i+1;l=j+1;}
printf(" \n maximalniy element matrici= %d ego nomer stroki =%d nomer stolbca=%d\n", max,k,l);
sum=k*k+l*l;
printf(" \n summa kvadratov indeksov maximalnogo elementa matrici %d\n", sum);
printf("\n\n... Press any key: ");
_getch();
return 0;
}
Рис.6.6. Окно примера
Рис.6.7. Обработка элементов матрицы
Рис.6.8. Блок-схема задания
Дата добавления: 2015-12-20; просмотров: 28; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!