Практическая часть.



Пример 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!