Обработка матриц
Цель работы: изучение приёмов обработки двумерных массивов данных, выработка умений алгоритмизации и программирования задач с двумерными массивами, отладки и тестирования программ с массивами.
/* Программа 10 меняет знак у "-"-ых элементов матрицы размером n х n ниже главной диагонали, n <= 10.
*/
#include <stdio.h>
#include <conio.h>
void in_matr(int x[ ][10], int n); // ввод матрицы размером n х n с консоли
void in_matr_rand(int x[ ][10], int n); // заполнение матрицы размером n х n
// случайными числами из интервала [-10, 10]
void out_matr(int x[ ][10], int n); // вывод матрицы размером n х n на экран
void processing(int x[ ][10], int n); // изменение знака у «-»-ых элементов
// матрицы ниже главной диагонали
Int main()
{ int n, x[10][10];
char ch;
// Вв/выв исходных данных:
// Не совмещайте ввод данных и их обработку !!! (Почему ?)
printf("Введите размер матрицы n <=10:”);
scanf("%d", &n);
printf("\n Ввод матрицы с консоли - 'c' или random() - 'r'? - ");
scanf("%c%c", &ch, &ch);
if((ch=='c') || (ch=='C')) in_matr( x, n);
else { randomize(); in_matr_rand( x, n); }
printf("\n Исходная матрица %d*%d \n", n, n);
out_matr( x, n );
processing(x, n);
printf("\n Обработанная матрица: \n");
out_matr( x, n );
getch();
return 0;
}
void in_matr(int x[ ][10], int n)
{ int I, j;
printf("\n Введите элементы матрицы n х n: \n");
scanf("%d", &n);
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
scanf("%d", &x[i][j]);
}
void out_matr(int x[ ][10], int n)
{ int i, j;
for ( i = 0; i < n; i++ )
{ for (j = 0; j < n; j++ )
printf("%d\t", x[i][j]);
printf("\n");
}
}
void processing(int x[ ][10], n) // Обработка матрицы:
{ int i, j;
for ( i = 1; i < n; i++)
for ( j = 0; j < i; j++)
if ( x[i][j] < 0 ) x[i][j] = -x[i][j];
}
void in_matr_rand(int x[][10], int n)
{ int i, j;
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
x[i][j]) = random(21) - 10;
}
Вопросы и упражнения
1. Как располагаются в памяти компьютера элементы двумерного массива?
2. Дополните программу 10 функцией out_matr_ptr( ) и протестируйте её.
void out_matr_ptr(int x[ ][10], int n)
{ int i, j, *pm;
pm=&x[0][0];
printf("\n Вывод матрицы по указателю: \n");
for ( i = 0; i < n*n; i++ )
{ printf("%5d", *pm++);
if((i+1)%n == 0) printf("\n");
}
}
3. Какое значение имеет объект программы имя двумерного массива?
4. Какое значение имеет объект программы x[k], если в программе объявлен массивint x[10][10]? Можно ли в программе использовать объект x[k]? Если «да», то в каких случаях?
5. Как обратиться по указателю к элементу матрицы matr [i] [j]?
6. Напишите операторы вывода элементов двумерного массива по заданному условию: а) элементов k-й строки, б) элементов k-го столбца, в) элементов правой и левой диагоналей, г) элементов выше правой диагонали, д) элементов ниже левой диагонали.
7. Напишите функции: а) поиск столбца с минимальной суммой элементов, б) поиск строки с наибольшим числом «+»-ых элементов.
8. Выполните упражнения 6-а и 6-б с указателями, не используя индексацию для выбора элементов матрицы.