Обработка матриц

Цель работы: изучение приёмов обработки двумерных массивов данных, выработка умений алгоритмизации и программирования задач с двумерными массивами, отладки и тестирования программ с массивами.

/* Программа 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-б с указателями, не используя индексацию для выбора элементов матрицы.