![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
В задачах на обработку двумерных массивов наиболее часто встречаются следующие алгоритмы:
· обработка всего массива;
· обработка отдельно по строкам и столбцам;
· обработка относительно диагоналей.
Для обработки двумерных массивов могут применяться методы решения задач, рассмотренные в пункте "Типовые задачи на обработку одномерных массивов". В отличие от одномерных массивов, для перебора всех элементов двумерного массива надо использовать двойной цикл.
Пример. Программа поиска максимального элемента двумерного массива и его индексов.
#include <stdio.h>
void main()
{
const int m=3,n=4;
int i,j,A[m][n],max,imax,jmax;
printf("Введите элементы массива\n");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
printf("A[%d][%d]= ", i,j);
scanf("%d", &A[i][j]);
}
max=A[0][0]; imax=0; jmax=0;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if (A[i][j]>max)
{ max=A[i][j]; imax=i; jmax=j; }
printf("Максимальный элемент: A[%d][%d]=%d\n",imax,jmax,max);
}
или
#include <stdio.h>
void main()
{
const int m=3,n=4;
int i,j,A[m][n],imax,jmax;
// ввод массива А
imax=0; jmax=0;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if (A[i][j]> A[imax][jmax]) {imax=i; jmax=j;}
printf("Максимальный элемент: A[%d][%d]=%d\n",
imax,jmax,A[imax][jmax]);
}
Пример. Программа подсчета количества отрицательных элементов двумерного массива.
#include <stdio.h>
void main()
{
const int m=5,n=6;
int i,j,A[m][n],k=0;
printf("Введите элементы массива\n");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
printf("A[%d][%d]= ", i,j);
scanf("%d", &A[i][j]);
if (A[i][j]<0) k++;
}
printf("Количество отрицательных элементов массива: %d\n",k);
}
Пример. Программа обработки двумерного массива, в которой:
1. массив заполняется с клавиатуры и выводится на экран в виде таблицы;
2. подсчитываются суммы элементов каждой строки;
3. определяются минимальные значения каждого столбца.
#include <stdio.h>
void main()
{
const int m=4,n=6;
int i,j,A[m][n],S,min;
printf("Введите элементы массива\n");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
printf("A[%d][%d]=", i,j);
scanf("%d", &A[i][j]);
}
printf("Введенный массив:\n");
for(i=0; i<m; i++)
{
for(j=0; j<n; j++) printf(" %d", A[i][j]);
printf("\n");
}
//вложенные циклы для нахождения сумм по строкам
for(i=0; i<m; i++)
{
S=0;
for(j=0; j<n; j++) S=S+A[i][j];
printf("Сумма элементов %d-й строки: %d\n", i+1,S);
}
//вложенные циклы для нахождения минимумов по столбцам
for(j=0; j<n; j++)
{
min=A[0][j];
for(i=1; i<m; i++)
if (A[i][j]<min) min=A[i][j];
printf("Минимальный элемент %d-го столбца: %d\n",j+1,min);
}
}
Пример. Найти сумму элементов квадратной матрицы, лежащих выше главной диагонали (рис. 1).
Рис. 1. Рисунок к условию задачи из примера
Алгоритм решения данной задачи построен следующим образом: с помощью двух циклов (первый по строкам, второй по столбцам) просматривается каждый элемент матрицы, но суммирование происходит только в том случае, если этот элемент находится выше главной диагонали, то есть выполняется свойство i < j.
#include <stdio.h>
void main()
{
const int n=8;
int i,j,A[n][n],S=0;
// ввод массива А
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if (i<j) S+=A[i][j];
printf("Сумма элементов выше главной диагонали: %d\n", S);
}
Возможен еще один вариант решения данной задачи. В нем проверка условия i < j не выполняется, но, тем не менее, в нем также суммируются элементы матрицы, находящиеся выше главной диагонали. В первой строке заданной матрицы необходимо сложить все элементы, начиная со второго. Во второй – все, начиная с третьего, в i -й строке процесс начнется с (i +1)-го элемента и так далее.
#include <stdio.h>
void main()
{
const int n=8;
int i,j,A[n][n],S=0;
// ввод массива А
for(i=0; i<n; i++)
for(j=i+1; j<n; j++)
S+=A[i][j];
printf("Сумма элементов выше главной диагонали: %d\n", S);
}
Пример. Программа преобразования двумерного массива в одномерный.
Иногда надо скопировать двумерный массив А размером m на n в одномерный массив В размером m * n. Очевидно, что при копировании по строкам (сначала первая строка, затем вторая и т.д.) элемент первой строки А[0][j] надо скопировать в B[j], элементы второй строки А[1][j] – в B[n+j] и т.д. Отсюда следует, что для любой строки i элемент А[i][j] копируется в B[i*n+j].
#include <stdio.h>
void main()
{
const int m=4,n=6;
int i,j,A[m][n],B[m*n];
// ввод массива А
printf("Введенный массив:\n");
for(i=0; i<m; i++)
{
for(j=0; j<n; j++) printf(" %d", A[i][j]);
printf("\n");
}
for(i=0; i<m; i++)
for(j=0; j<n; j++)
B[i*n+j]=A[i][j];
printf("Преобразованный массив:\n");
for(i=0; i<m*n; i++)
printf(" %d", B[i]);
}
Дата публикования: 2015-01-23; Прочитано: 275 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!