Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двумерные массивы.doc
Скачиваний:
2
Добавлен:
17.07.2019
Размер:
336.38 Кб
Скачать
  1. Алгоритмы обработки двумерных массивов

    1. Ввод и вывод матрицы

//Ввод матрицы

float x[10][10];

puts("Введите m,n");

scanf("%d %d",&m,&n);

for(i=0;i<m;i++)

for(j=0;j<n;j++)

{

printf("Введите x[%d][%d]=",i,j);

scanf("%f",&x[i][j]);

}

// Вывод матрицы

puts("Матрица x:");

for(i=0;i<m;i++)

{ for(j=0;j<n;j++)

printf("%8.2f",x[i][j]);

printf("\n");

}

Примечание. Ввод-вывод динамической матрицы отличается от ввода-вывода статической матрицы лишь описанием матрицы

2.2 Определить количество элементов, больших заданного а и расположенных в строках с нечетными номерами

Графическая схема алгоритма

Таблица соответствия

Переменные в задаче

Имя на языке Си

Тип

Комментарий

K

K

int

Искомое количество элементов

B

B

float

Двумерный статический массив

A

A

float

Заданное число

-

i

int

Номер строки

-

j

int

Номер столбца

/* Определнеие количество элементов, больших заданного А и расположенных в строках с нечетными номерами */

# include <stdio.h>

# include <math.h>

void main ( )

{

int i, j, m, n, K;

float B [10][10];

float A; //Описание переменных

printf (“ Введите число строк и столбцов”);

scanf (“%d %d”, &n, &m);

for(i=0; i<n; i++)

for(j=0; j<m; j++)

{

printf(“Введите B[%d, %d]=”, i, j);

scanf(“%f”, &B[i] [j]);

}

puts (“ введите число A”);

scanf (“%f”, &A);

K=0;

for ( i=1; i<n; i=i+2)

for ( j=0; j<m; j++)

if( B[i]>A) K=K+1;

printf(“%f \n”, K);

}

Тесты:

- 3; 8; -2; 10; 7; 82; -4

1) В= -9; 0; -3; 85; 3; 40; -9 A= 4; K=7.

-1; 8; 7; -95; 4; -5; 67

-4; -7; 8; 9; 2; -8; -5

2) B= -2; 10; 0; 9; -8; 7; -5 A=10; K=0.

-7; 6; -9; 7; 0; -3; 7

    1. Поиск в матрице строки с максимальной суммой

Графическая схема алгоритма

Текст программы

/* Строка с максимальной суммой*/

#include <stdio.h>

main()

{

int m,n,nmax,i,j;

float max,s, x[10][10];

puts("Введите m,n");

scanf("%d %d",&m,&n);

for(i=0;i<m;i++)

for(j=0;j<n;j++)

{ printf("Введите x[%d][%d]=",i,j);

scanf("%f",&x[i][j]);

}

puts("Матрица x:");

for(i=0;i<m;i++)

{ for(j=0;j<n;j++)

printf("%8.2f",x[i][j]);

printf("\n");

}

s=0; for(j=0; j<n; j++) s =s+x[0][j]; //Нач. знач. мax – сумма элем. 0-ой стр.

max=s; nmax=0;

for(i=0;i<m;i++)

{ s=0;

for(j=0;j<n;j++) s+=x[i][j]; // Сумма элем. строк

if(max<s)

{ max=s; nmax=i;}

}

printf("Максимальная сумма %.2f в строке %d\n",max,nmax);

fflush(stdin); getchar();

return(0);

}

2.4 Пример обработки динамического двумерного массива

Задача. Определить количество строк матрицы, в которых суммы всех элементов отрицательные. Массив объявить как динамический.

Решение.

Таблица соответствия.

Переменные в задаче

Имя на языке Си

Тип

Комментарий

S

S

float

Сумма элементов i-той строки

A

A

float

Двумерный динамический массив

K

K

float

Количество искомых строк

-

n

int

Количество всех строк в матрице

-

m

int

Количество столбцов

-

i

int

Номер строки

-

j

int

Номер столбца

/*Пример обработки двумерного динамического массива*/

# include <stdio.h>

# include <math.h>

void main ( )

{

int i, j, m, n;

float K, S; //Описание переменных

puts (“ введите n, m”); // Вывод сообщения

scanf (“%d %d”, &n, &m); // Ввод исх.числа строк и столбцов

float**A=new float*[n];

for(i=0; i<n; i++)

A[i]=new float[m];

for(i=0; i<n; i++)

for(j=0; j<m; j++)

{

printf(“Введите A[%d; %d]=”, i, j);

scanf(“%f”, &A[i] [j]);

}

K=0;

for(i=0; i<n; i++)

{

S=0;

for(j=0; j<m; j++)

S=S+A[i] [j];

if(S<0) K=K+1;

}

printf(“%f \n”, K);

for(i=0; i<n; i++) //Освобождение динамической памяти

delete[]A[i];

delete[]A;

}

Тесты:

- 3 -2 2 6 -3

1) A= 6 7 -1 20 -4 K=2.

-4 -2 -3 6 -1

- 4 -2 4 6 4

2) A= 3 5 7 2 0 K=0.

5 0 -2 9 0

2.5 Определение, есть ли в матрице столбец, содержащий хотя бы один нулевой элемент

Решение.

Введем две вспомогательные переменные t и w:

Текст программы

#include <stdio.h>

main()

{

int m,n,i,j,t,w;

float x[10][10];

puts("Введите m,n");

scanf("%d %d",&m,&n);

for(i=0;i<m;i++)

for(j=0;j<n;j++)

{ printf("Введите x[%d][%d]=",i,j);

scanf("%f",&x[i][j]);

}

puts("Матрица x:");

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)

printf("%8.2f",x[i][j]);

printf("\n");

}

t=1; j=0; //Столбец еще не найден

while(j<n && t)

{ w=1; i=0; //В столбце не найден элем., равный нулю

while(i<m && w)

if(x[i][j]==0) w=0;

else i++;

if(w) j++; // В столбце нет равного 0 элем.

else t=0; // В столбце есть равный 0 элем.

}

if(t) printf("Нет\n");

else printf("Есть %d %d\n",i,j);

fflush(stdin); getchar();

return(0);

}

2.5 Обработка элементов квадратных матриц относительно главной и побочной диагоналей

/* "Разминка". Фомирование матрицы */

#include <stdio.h>

main()

{

const m=10;

int i,j,N;

int x[m][m];

/* Обнуление матрицы */

for(i=0;i<m;i++)

for(j=0;j<m;j++)

x[i][j]=0;

puts("Номер варианта?");

scanf("%d",&N);

printf("Вариант %d:\n",N);

switch(N)

{ case 1:{ /* Вариант 1 */

for(i=0;i<m;i++)

for(j=0;j<i+1;j++)

x[i][j]=i-j+1;

break;}

case 2:{ /* Вариант 2 */

for(j=0;j<m;j++)

for(i=j;i<m;i++)

x[i][j]=j+1;

break; }

case 3: { /* Вариант 3 */

for(i=0;i<m;i++)

for(j=i;j<m;j++)

x[i][j]=i+1;

break; }

case 4: { /* Вариант 4 */

for(i=0;i<m;i++)

for(j=i;j<m;j++)

x[i][j]=j-i+1;

break; }

case 5:{ /* Вариант 5 */

for(i=0;i<m;i++)

for(j=0;j<m;j++)

x[i][j]=i+1;

break; }

case 6:{ /* Вариант 6 */

for(i=0;i<m;i++)

for(j=i;j<m;j++)

if (i==j) x[i][j]=1;

else x[i][j]=2;

break; }

case 7:{ /* Вариант 7 */

for(i=0;i<m;i++)

for(j=0;j<i+1;j++)

x[i][j]=1;

break; }

case 8:{ /* Вариант 8 */

for(i=0;i<m;i++)

for(j=0;j<i+1;j++)

x[i][j]=(i-j+1)*(i-j+1);

break; }

case 9:{ /* Вариант 9 */

for(j=0;j<m;j++)

for(i=j;i<m;i++)

x[i][j]=(j+1)*(j+1);

break; }

case 10:{ /* Вариант 10 */

for(j=0;j<m;j++)

for(i=0;i<m;i++)

if((i+j)%2==0) x[i][j]=1;

else x[i][j]=0;

break; }

case 11:{ /* Вариант 11 */

for(i=0;i<m;i++)

for(j=m-i-1;j<m;j++)

x[i][j]=1;

break; }

case 12:{ /* Вариант 12 */

for(i=0;i<m;i++)

for(j=0;j<m;j++)

x[i][j]=(i+1)*(i+1);

break; }

case 13:{ /* Вариант 13 */

for(i=0;i<m;i++)

for(j=m-i-1;j<m;j++)

if (i+j==m-1) x[i][j]=1;

else x[i][j]=2;

break; }

case 14:{ /* Вариант 14 */

for(i=0;i<m;i++)

for(j=i;j<m;j++)

x[i][j]=(j-i+1)*(j-i+1);

break;}

} // Вывод матрицы

for(i=0;i<m;i++)

{ for(j=0;j<m;j++)

printf("%4d",x[i][j]);

printf("\n");

}

fflush(stdin); getchar();

return(0);

}