Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги / 277.pdf
Скачиваний:
12
Добавлен:
07.06.2023
Размер:
1.06 Mб
Скачать

{ printf("Введите %d-й элемент массива:\n»,i+1); scanf("%f», &a[i]);

}

/*_______ Соpтиpовка_________*/ do

{

fl = 1;// Флаг поднять

// В очередной раз просматриваем элементы массива for (i = 0; i<n-1; i++)

if ( a[i] > a[i+1] )

{ //Меняем местами соседние элементы d=a[i];

a[i]=a[i+1];

a[i+1]=d;

fl=0; //Если был обмен, то флаг опускаем

}

}

while (!fl); //Если fl = 1, то массив отсортирован for (i=0;i<n;i++)

printf("%7.2f», a[i]); getch();

}

Основной цикл do while прекращает выполняться, когда значение переменной fl остается равной 1 после выполнения вложенного цикла for. Это происходит в том случае, если ни одну пару элементов не удается переставить, что указывает на то, что все элементы стоят на своих местах.

Обработка двумерных массивов

Двумерные массивы имеют аналогию с таким понятием в математике, как матрица. Двумерный массив - это одномерный массив, элементами которого являются одномерные массивы (рис. 29).

Рис. 32

int b[N][M]; float a[3][4];

89

В описании N и M - количество строк и количество столбцов матрицы. Традиционно в качестве идентификатора номера строки используют символ i, а столбца - j. При изменении второго индекса j на единицу перемещение идет вдоль строки, а при изменении первого индекса i на единицу - вертикально вдоль столбца. Элемент одномерного массива а[i] является указателем на начало i -ой строки матрицы. К элементу двумерного массива, описанному выше, можно обратиться с помощью идентификатора а[i][j].

Ниже приведены примеры обращения к элементам двумерных массивов:

a[i][j] = 13.13; a[0][1] = 8; b[5][6] = 7; b[i][8] = 0;

 

При обработке двумерных массивов

 

возникают такие же задачи, как и при обработке

 

одномерных массивов: ввод элементов массива,

 

нахождение суммы, произведения, среднего и т.

 

д., поиск некоторого элемента в массиве,

 

сортировка элементов массива, вывод элементов

 

массива.

 

На рис. 30 приведена схема алгоритма

 

формирования элементов массива с помощью

 

датчика случайных чисел, вывод элементов

 

массива на экран, вычисление суммы всех

 

элементов двумерного массива. Программа дана в

 

примере pr20.

 

В графической схеме алгоритма совмещены

 

в одном цикле формирование, нахождение суммы

 

и вывод элементов массива. Анализируя

 

предложенную программу, можно заметить, что

 

для ввода, вывода и нахождения суммы элементов

 

массива используются два вложенных цикла.

 

Обычно разбивают решение задачи на три этапа:

 

ввод, обработка и вывод информацию. Так как

 

массив располагается в непрерывной области

 

памяти построчно, более рационально будет и

 

обрабатывать элементы построчно. В программе

 

во вложенных циклах для каждого значения

 

индекса i индекс j изменяется от 0 до m-1, т. е.

Рис. 33

индекс j изменяется чаще. При выводе элементов

 

90

массива на экран для каждого значения i в теле цикла выполняются два оператора: первый оператор цикла выводит на экран в строчку элементы одной строки, а второй оператор вывода переводит курсор на новую строку, что как раз и обеспечивает вывод матрицы в виде прямоугольника.

//Пример pr20 #include <stdio.h> #include <conio.h> #include <stdlib.h> void main ()

{ const int N1 = 10, M1 = 10; int a[N1][M1], i, j, n, m;

printf ( «Введите число стpок и столбцов массива:» ); scanf ( «%d%d», &n, &m );

int s = 0;

printf ( «Полученный массив\n» ); for ( i = 0; i<n; i++ )

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

{a[i][j] = rand();

printf ( «%5d «, a[i][j] ); s = s+a[i][j];

}

printf ( «\n» );

}

printf ( «s = %d \n», s ); getch ();

}

Следующий пример иллюстрирует работу с диагоналями матрицы. Дана квадратная матрица. Заменить отрицательные элементы побочной диагонали суммой элементов главной диагонали матрицы. Главная диагональ проходит из левого верхнего в правый нижний угол. Так как работаем с квадратной матрицей, только на главной диагонали будут лежать элементы, индексы строк и столбцов которых одинаковы. Именно этот факт и используется при решении задачи. Мы не будем перебирать все элементы массива и проверять, совпали ли индексы, а сразу задаем оба индекса с помощью одного идентификатора i. Побочная диагональ проходит из правого верхнего в левый нижний угол матрицы. Нетрудно заметить, что при движении по побочной диагонали номер строки возрастает от 1 до n, номер столбца убывает от n до 1. Значит, только на

91

побочной диагонали лежат элементы, у которых номер столбца определяется по формуле j=n-i+1. В то же время, если обратить внимание на эту формулу в программе, она там другая j = n-i-1, так как индексы в языке С++ изменяются от 0. Программа приведена в примере pr21, графическая схема алгоритма - на рис. 31.

Рис. 34

//Пример pr21 #include <stdio.h> #include <conio.h> #include <stdlib.h> void main()

{

const int N1 = 10, //максимальнoе число стpок M1 = 10; // и столбцов матрицы

int a[N1][M1], //матрица i, // текущий номеp строки

j, // текущий номеp столбца

n, m, s; // текущий размер матрицы

printf ( «Введите число стpок и столбцов массива:» ); scanf ( «%d%d», &n, &m );

92

Соседние файлы в папке книги