Задача 16. Отсортировать массив по возрастанию (т.е. расположить его элементы в порядке возрастания).
Для этой задачи придумано множество различных алгоритмов. Один из них - сортировка методом прямого выбора:
for(i=0; i<n; i++)
for(k=i+1; k<n; k++)
if (a[k]<a[i]) {
p=a[k]; // Обмен a[k] и a[i]
a[k]=a[i];
a[i]=p;
}
Здесь на каждой итерации внешнего цикла происходит помещение на i-ую позицию наименьшего из "оставшихся" (т.е. расположенных от i-ой позиции до конца массива) значений элементов.
Этот алгоритм включает в себя, таким образом, алгоритмы поиска минимума и обмена.
Задача 17. Найти в массиве элемент, повторяющийся наибольшее количество раз. (Если таких элементов несколько, вывести любой из них).
for(max=i=0; i<n; i++){
s=1; // s - число повторений i-го элемента
for(k=i+1; k<n; k++)
if (a[k]==a[i]) s++;
if (s>max) {
max=s; // max - число повторений x
x=a[i]; // x - значение наиболее
} // частого элемента
}
Заметим, что x здесь не присвоено начальное значение, т.к. оператор x=a[i]; обязательно выполнится хотя бы раз (max вначале = 0, а s не меньше 1), а использовано x будет лишь впоследствии.
Многомерные массивы отличаются от одномерных только тем, что каждый элемент характеризуется не одним, а двумя или более индексами. Они используются, например, для хранения таблиц (каждый элемент таблицы имеет 2 индекса - № строки и № столбца).
Декларация многомерного массива имеет следующий формат:
Аналогично, при обращении к конкретному элементу многомерного массива указывается имя массива и затем - последовательно индексы элемента, каждый в квадратных скобках; например:
a[2][1]
a[i+1][k]
Рассмотрим особенности работы с многомерными массивами на конкретном примере двумерного массива (двумерные массивы называют также матрицами):
Задача 1. Ввести матрицу и увеличить все ее элементы на единицу.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main() {
int a[10][10],n,m,i,j;
// Ввод матрицы
cout<<"Vvedite n,m <=10:";
cin>>n>>m;
cout<<"Vvedite massiv:\n";
for (i=0; i<n; i++)
for (j=0; j<m; j++)
cin>>a[i][j];
// Увеличение на 1
for (i=0; i<n; i++)
for (j=0; j<m; j++)
a[i][j]++;
// Вывод матрицы
puts("Result:");
for (i=0; i<n; i++)
for (j=0; j<m; j++)
printf("%3d%c", a[i][j], j==m-1? '\n' : ' ');
getch();
}
Задача 2. Найти в матрице наибольший элемент и его позицию.
max=a[0][0];
im=jm=0;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
if (a[i][j]>max) {
max=a[i][j];
im=i;
jm=j;
}
printf("Max element a[%d][%d]=%d\n", im, jm, max);
Задача 3. Переписать матрицу в одномерный массив.
int b[100];
for (i=k=0; i<n; i++)
for (j=0; j<m; j++)
b[k++]=a[i][j];
После выполнения этого участка программы k=n*m -количество элементов в полученном массиве.
Квадратной называется матрица, у которой число строк равно числу столбцов. Ее главной диагональю называется диагональный ряд элементов, идущий из верхнего левого угла в нижний правый, а побочной диагональю - идущий из верхнего правого угла в нижний левый:
Обозначим размер матрицы буквой N, индекс строки буквой I, а индекс столбца буквой J. Тогда у элементов, лежащих на главной диагонали, I = J , а у элементов, лежащих на побочной диагонали, I + J = N - 1 .
Задача 4. Найти сумму элементов матрицы, лежащих над главной диагональю.
Из рисунка видно, что у элементов, лежащих над главной диагональю,
I < J .
Можно учесть это в условии оператора if, либо цикла for :
for (i=s=0; i<n; i++)
for (j=i+1; j<n; j++)
s+=a[i][j];
Строка или столбец матрицы аналогичны одномерному массиву. Поэтому к ним применимы все алгоритмы, рассмотренные для одномерных массивов.
В применении же ко всей матрице это обычно требует дополнительного внешнего цикла (циклов).
Задача 5. Поменять местами первую и последнюю строки матрицы.
for (j=0; j<m; j++) {
p=a[0][j];
a[0][j]=a[n-1][j];
a[n-1][j]=p;
}
Задача 6. Найти сумму элементов в каждой строке матрицы.
Поскольку строк в матрице несколько, ответом будет не одно число, а одномерный массив:
int b[10];
for (i=0; i<n; i++) {
for (j=s=0; j<m; j++)
s+=a[i][j];
b[i]=s;
}
for(i=0; i<n; i++)
printf("%d ", b[i]);
puts("");
Задача 7. Найти сумму элементов в каждом столбце матрицы.
По сравнению с предыдущей задачей, здесь изменится порядок циклов (ведь сначала нужно целиком подсчитать сумму в одном столбце, и только затем - в другом и т.д.):
for (j=0; j<m; j++) {
for (i=s=0; i<n; i++)
s+=a[i][j];
b[j]=s;
}
for(j=0; j<m; j++)
printf("%d ", b[j]);
puts("");
Задача 8. В каждой строке матрицы определить количество элементов, равных нулю. Отсортировать строки матрицы по убыванию этого количества.
Прежде всего, нужно определить эти количества и занести их в одномерный массив (обозначим его b):
for (i=0; i<n; i++) {
for (j=s=0; j<m; j++)
if (a[i][j]==0) s++;
b[i]=s;
}
Затем нужно отсортировать матрицу. В процессе этого обменивать местами нужно как сами строки, так и соответствующие им элементы одномерного массива b (чтобы каждый его элемент продолжал соответствовать своей строке):
for (i=0; i<n; i++)
for (k=i+1; k<n; k++)
if (b[k]>b[i]) {
for(j=0; j<m; j++)
{ p=a[i][j]; a[i][j]=a[k][j]; a[k][j]=p; }
p=b[i]; b[i]=b[k]; b[k]=p;
}
В оконном режиме ввод и вывод массивов обычно организуется с использованием компоненты StringGrid, предназначенной для отображения информации в виде двумерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну Edit):
Доступ к информации осуществляется с помощью свойства Cells[ACol][ARow] типа AnsiString, где целочисленные значения ACol, ARow указывают позицию элемента.
Внимание! Первый индекс ACol определяет номер столбца, а второй ARow – номер строки в отличие от индексов массива.
В инспекторе объектов значения ColCount и RowCount устанавливают начальные значения количества столбцов и строк в таблице, а FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны. Фиксированная зона выделена другим цветом и обычно используется для надписей.