ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.09.2024
Просмотров: 21
Скачиваний: 0
for (i = 0; i <= n - 1; i++)
{ for (j = 0; j <= m - 1; j++)
fprintf(f1,"%d ", а[i][j]); // Запис елементу матриці у файл.
fprintf(f1,"\n"); // Переклад покажчика файлу на інший рядок файлу.
}
fclose(f1);
getch(); }
Перебір елементів матриці
Розглянемо прості схеми переборів елементів матриці. Ці схеми представлені на малюнку 1.
а б в г
Мал. 1
Програма. Перебір елементів за схемою мал. 1, а.
void main(void)
{ int n, m; // n, m – для числа рядків і стовпців матриці.
int i,j; // i – для номерів рядків; j – для номерів стовпців.
clrscr();
cout << "Введи число рядків матриці n= ";
cin >> n;
cout << "Введи число стовпців матриці m= ";
cin >> m;
for (i = 0; i <= n-1; i++) // Формується індекс поточного рядка.
{
for (j = 0; j <= m-1; j++) // Формується індекс поточного стовпця.
printf("%d,%d ", i, j); // Вивід на екран монітора індексу
// поточного елементу матриці.
printf("\n"); // Переклад курсора на наступний рядок
// екрану монітора.
}
getch(); }
Зауваження. У реальних завданнях там, де значення елементів матриці використовуються для якихось обчислень замість директиви printf("%d,%d ", i, j), повинні стояти оператори, які виконують обробку елементів а[i][j].
Програма. Перебір елементів матриці за схемою мал. 1, б.
void main(void)
{
int n, m; // n, m – для числа рядків і стовпців матриці.
int i,j; // i – для номерів рядків; j – для номерів стовпців.
clrscr();
cout << "Введи число рядків матриці n= ";
cin >> n;
cout << "Введи число стовпців матриці m= ";
cin >> m;
for (i = 0; i <= m - 1; i++) // Перебираємо індекси стовпців.
{
for ( j = 0; j <= n-1; j++) // Перебираємо індекси рядків.
printf("%d,%d ",j, i); // Виведення елементів стовпців.
printf("\n"); // Переклад курсора на інший рядок екрану.
}
getch(); }
Зауваження. Якщо j – порядковий індекс елементу i-й рядка від початку, то (m – 1 – j) – порядковий індекс елементу i-й рядка від кінця (j = 0, 1, ..., m – 1).
Програма. Перебір елементів матриці за схемою мал. 1, в
Перебір елементів рядка з парним індексом відбувається послідовно від першого елементу рядка до останнього елементу. Перебір елементів рядка з непарним індексом походить від останнього елементу до першого.
void main(void)
{ int n, m;
int i,j;
clrscr();
cout << "Введи число рядків матриці n= ";
cin >> n;
cout << "Введи число стовпців матриці m= ";
cin >> m;
for (i = 0; i <= n-1; i++) // Формований (фіксуємо) поточний
{ // індекс рядка.
for (j = 0; j <= m-1; j++) // Формований поточний індекс стовпця.
{
if( i % 2 == 0 ) // Якщо індекс рядка парний, то
printf("%d,%d ", i, j); // вивід від першого елементу рядка i.
else // Якщо індекс рядка непарний
printf("%d,%d ", i, m – 1 - j); // те вивід від останнього
// елементу рядка.
}
printf("\n");
}
getch(); }
Зауваження. Якщо i – порядковий номер елементу j-го стовпця
від початку, то n – 1 – i – порядковий номер елементу j-го стовпця від кінця
(i= 0, 1, ..., n – 1).
Програма. Перебір елементів матриці за схемою мал. 1, г.
Перебір елементів стовпців з парними індексами відбувається послідовно від першого елементу стовпця до останнього. Перебір елементів стовпців з непарними індексами походить від останнього елементу стовпця до першого.
void main(void)
{ const n, m;
int i,j;
clrscr();
cout << "Введи число рядків матриці n= ";
cin >> n;
cout << "Введи число стовпців матриці m= ";
cin >> m;
for (j = 0; j <= m-1; j++)
{
for (i = 0; i <= n-1; i++)
{ if( j % 2 == 0)
printf("%d,%d ", i, j); // Якщо індекс парний.
else
printf("%d,%d ", n-1-i, j); // Якщо індекс непарний.
}
printf("\n");
}
getch(); }
Програма. Перебір елементів матриці, розташованих вище головній діагоналі.
void main(void)
{ int i, j, n;
clrscr();
cout << "Введи розмір матриці n = ";
cin >> n;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++) // Перебір елементів рядка починається
// не з індексу 0, а з індексу i.
cout << i << "<< j << " ";
cout << "\n";
}
getch(); }
Програма. Перебір елементів матриці, розташованих нижче головній діагоналі.
void main(void)
{
int i, j, n;
clrscr();
cout << "Введи розмір матриці n= ";
cin >> n;
for (i = 0; i < n; i++)
{
for ( j = 0; j <= i; j++) // Перебір елементів рядка закінчується
// не індексом n, а індексом i.
cout << i << "<< j << " ";
cout << "\n";
}
getch(); }
Програма. Перебір елементів матриці, розташованих вище побічній діагоналі.
void main(void)
{
int i, j, n;
clrscr();
cout << "Введи розмір матриці n = ";
cin >> n;
for (i = 0; i < n; i++)
{
for (j = 0; j < n – i; j++) // Перебір елементів рядка закінчується
// не індексом n, а індексом n – i.
cout << i << "<< j << " ";
cout << "\n";
}
getch(); }
Програма. Перебір елементів матриці, розташованих нижче побічній діагоналі.
void main(void)
{ int i, j, n;
clrscr();
cout << "Введи розмір матриці n = ";
cin >> n;
for (i = 0; i < n; i++)
{ for (j=n-1 - i; j < n; j++) // Перебір елементів рядка починається
// не з індексу 0, а з індексу n - 1 - i.
cout << i << "<< j << " ";
cout << "\n";
}
getch(); }
Програма. Переставити рядки k та l матриці.
void main(void)
{ const n = 5, m =5;
FILE *f1;
int i,j, а[n][m];
int l, k, b;
clrscr();
// Введення елементів матриці з файлу.
f1 = fopen("t3.dat", "r");
for (i = 0; i <= n-1; i++)
for (j = 0; j <= m-1; j++)
fscanf( f1, "%d" &a[i][j] );
fclose(f1);
cout << "Матриця до перестановки рядків: \n";
for (i = 0; i <= n-1; i++)
{ for (j = 0; j <= m-1; j++)
printf("%d ", а[i][j]);
printf("\n"); }
cout << "\nПерестав рядок l= ";
cin >> l;
cout << "\n із рядком k= ";
cin >> до;
l--; до--; // Індекс рядка і стовпця на одиницю менше номера.
for (j = 0; j <m; j++)
{
b= а[l][j]; // Елемент а[l][j] рядки l переставляється
а[l][j]= а[k][j]; // з елементом а[k][j] рядки k.
а[k][j]= b;
}
cout << "\n\n Матриця після перестановки рядків: \n";
for (i = 0; i <= n-1; i++)
{
for (j = 0; j <= m-1; j++)
printf("%d ", а[i][j]);
printf("\n");
}
getch(); }
Програма. Перебір елементів верхнього трикутника матриці.
void main()
{ int i,j, n, k;
clrscr();
cout << "Введи розмір матриці n= ";
cin >> n;
cout << "Елементи верхнього трикутника матриці: \n";
if (n % 2 == 0)
до = n / 2; // Число рядків в матриці, якщо n парно.
else
до = n / 2 + 1; // Число рядків в матриці, якщо n непарно.
for (i = 0; i <= до; i++)
{ for (j = i; j <= n - 1 - i; j++)
printf("%d,%d ", i, j); // Виведення індексів елементів
// верхнього трикутника матриці.
printf("\n");
}
getch(); }
Програма. Перебір елементів нижнього трикутника матриці.
void main()
{int i, j, k, n;
clrscr();
cout << "Введи розмір матриці n= ";
cin >> n;
cout << "Елементи нижнього трикутника матриці від вершини: \n";
if (n % 2 == 0) до = n / 2; // Число рядків в матриці, якщо n парно.
else
до = n / 2 – 1; // Число рядків в матриці, якщо n непарно.
for (i = k; i <= n – 1; i++)
{ for (j = n – 1 – i; j <= i; j++)
printf("%d,%d ", i, j); // Виведення індексів елементів
// нижнього трикутника матриці.
printf("\n");
}
getch(); }
Приклади завдань обробки матриць
Умова завдання 1:
Сформувати матрицю C(N,M), елементами якої є випадкові числа, рівномірно розподілені в інтервалі (-4,8). Переставляючи її рядки і стовпці, добитися того, аби найменший елемент цієї матриці виявився в лівому верхньому кутку.
Рішення:
Першим етапом рішення є формування матриці N*M, що містить числа в інтервалі від -4 до 8. За умовчанням функція rand() формує рівномірно розподілені псевдовипадкові числа. Нам залишається обмежити діапазон. Для цього необхідне отримане за допомогою функції rand() число поділити на число рівне нижньому кордону по модулю плюс верхній кордон і від отриманого результату відняти нижній кордон по модулю. Хай, x - випадкове число, а - нижній кордон, b - верхній кордон % - операція обчислення залишку від ділення, тоді число у в заданому діапазоні виходить по формулі y=(x%(|a|+1+b))-|a|.
Після формування матриці, необхідно знайти позицію мінімального елементу. Пошук мінімуму здійснюється порівнянням i елементу масиву з i-1 елементом масиву, при цьому запам'ятовується позиція мінімального елементу. Далі відбувається переміщення рядків, тим самим рядок з мінімальним елементом виявляється верхнім, а потім відбувається переміщення стовпців, переміщаючи мінімальний елемент в лівий верхній кут.
Листинг программы:
#include <stdio.h> #include <stdlib.h> #include <conio.h>
int main() { randomize(); printf("\n\nMatrix :\n"); const int n=4, m=5; int matrix[n][m]; // объявление матрицы int i, j;
// заполнение матрицы значениями в заданном диапазоне for(i=0; i<n; i++) { for(j=0; j<m; j++) { matrix[i][j]=rand()%13-4;
printf("%d\t", matrix[i][j]); } printf("\n"); } int min=matrix[1][1]; int x, y;
// поиск минимума for(i=0; i<n; i++) { for(j=0; j<m; j++) { if(matrix[i][j]<min) { min=matrix[i][j]; x=i; y=j; } } } printf("\n min = %d, stroka=%d, stolbec=%d", min, x+1, y+1); int z;
// перестановка строк for(i=0; i<m; i++) { z=matrix[0][i]; matrix[0][i]=matrix[x][i]; matrix[x][i]=z; }
// перестановка столбцов for(i=0; i<n; i++) { z=matrix[i][0]; matrix[i][0]=matrix[i][y]; matrix[i][y]=z; } printf("\n\n New matrix :\n");
// вывод преобразованной матрицы for(i=0; i<n; i++) { for(j=0; j<m; j++) { printf("%d\t", matrix[i][j]); } printf("\n"); } getch(); return 0; }
Контрольні питання:
-
Яким чином у пам'яті розташовується багатовимірний масив?
-
Властивості квадратних матриць
-
Яким чином здійснюється введення значень двовимірного массиву?
-
Яким чином здійснюється виведення елементів двовимірного массиву?
-
Яким чином виконується перебір елементів матриці?
Література:
-
П. Франка. C++. Учебный курс. 2003 год., 528 стр.
-
С. В. Глушаков, А. В. Коваль, С. В. Смирнов. Язык программирования C++. Учебный курс. 2002 год., 505 стр.
-
Х. Дейтл, П. Дейтл. Как программировать С++. 2001 год., 1006 стр.
-
С.Х. Дьюхэрст. Скользкие места С++. Как избежать проблем при проектировании и компиляции ваших программ. 2006 год., 265 стр.
-
М. Динман. С++. Освой на примерах. 2006 год. 384стр.
-
Лаптев и др. С++. Объектно-ориентированное программирование. Задачи и упражнения. 2007 год. 288 стр.
-
Дж. Либерти. Освой самостоятельно C++. 3-изд. 2009 год. 820 стр.
-
Стенли Б. Липпман, Жози Лажойе. С++ для начинающих. 2001 год.