
Лекции Гуревича по с++, первый сем / Лекции ОАиП Гуревич (I сем.) №4
.doc10.3. Многомерные массивы
Многомерные массивы отличаются от одномерных только тем, что каждый элемент характеризуется не одним, а двумя или более индексами. Они используются, например, для хранения таблиц (каждый элемент таблицы имеет 2 индекса - № строки и № столбца).
Декларация многомерного массива имеет следующий формат:
тип ID [размер1] [размер2]…[размерN] =
{ {список начальных значений},
{список начальных значений},
…
};
Списки начальных значений – атрибут необязательный.
Пример:
int a[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };
Аналогично, при обращении к конкретному элементу многомерного массива указывается имя массива и затем - последовательно индексы элемента, каждый в квадратных скобках; например:
a[2][1]
a[i+1][k]
Рассмотрим особенности работы с многомерными массивами на конкретном примере двумерного массива (двумерные массивы называют также матрицами):
#include <stdio.h>
void main()
{
int i, j;
int m[3][4] = { { 1, 2, 3, 4}, {11,12,13,14}, {21,22,23,24} };
for (i=0; i<3; i++) {
printf("\n %2d)", i+1);
for (j=0; j<4; j++)
printf(" %3d",m[ i ] [ j ]);
}
}
Результаты работы программы:
-
1 2 3 4
-
11 12 13 14
-
21 22 23 24
10.4. Примеры алгоритмов, использующих двумерные массивы.
а) Простейшие примеры
Задача 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 -количество элементов в полученном массиве.
20. Отладка и пошаговое выполнение программы
Как показывает практика, даже профессиональные программисты допускают ошибки в процессе написания программ. Поэтому задача обучающегося программированию - не столько научиться писать программу сразу без ошибок, сколько научиться самостоятельно и быстро находить и исправлять свои ошибки. Процесс поиска и исправления ошибок называется отладкой программы (по-английски Debug).
При отладке необходимо:
-
проверять работу программы при различных исходных данных;
-
выводить на экран не только окончательные, но и промежуточные результаты программы, чтобы проверить их правильность.
Процесс отладки больших, сложных программ значительно облегчает функциональная декомпозиция, т.к. она позволяет вначале отладить каждую функцию по отдельности, и лишь затем, будучи почти уверенным в их правильности, переходить к отладке программы в целом.
Для вывода промежуточных результатов можно добавлять в середину текста программы операторы вывода, а после отладки - удалять их или оформлять как комментарии. Но это - трудоемкий способ, поэтому в большинстве сред программирования предусмотрены средства пошагового выполнения программы. Пошаговое выполнение означает возможность "приостановить" работу программы в желаемом ее месте и посмотреть текущие значения переменных, после чего продолжить ее работу дальше.
Среда С++ Builder обладает богатейшими средствами пошагового выполнения программ (для их использования служат команды среды C++ Builder'а, которые могут быть вызваны либо через ее меню (пункт Run), либо через горячие клавиши):
-
точки останова;
-
клавиши пошагового выполнения (с заходом в функцию и без);
-
просмотр значений переменных во всплывающей подсказке или в отдельном окне;
-
просмотр массивов и строк как целого.
Точка останова - это строка программы, достигнув которой, машина приостанавливает процесс выполнения программы, давая человеку возможность просмотреть текущие результаты и значения переменных. Точка останова может быть поставлена на любую строку программы, содержащую исполняемые операторы (не объявления), с помощью щелчка мыши слева от строки, и убирается так же. Точка останова в среде С++ Builder выделяется красным цветом. В одной программе одновременно может быть несколько точек останова. Кроме того, с помощью команды Run to cursor (клавиша F4) можно заставить программу выполняться до того места, где стоит курсор, и остановиться по его достижении (подобно одноразовой точке останова). Однако при "перескакивании" (невыполнении) строки программы с точкой останова (например, с помощью оператора if ) выполнение программы не приостанавливается.
Чтобы в момент останова посмотреть текущее значение переменной, в среде С++ Builder достаточно просто подвести курсор мыши к имени этой переменной в любом месте текста программы и ненадолго задержать его там. Значение переменной появится во всплывающей подсказке. (Разумеется, показывается текущее (на момент останова) значение переменной, независимо от места текста, куда подведен курсор). Отображаются также значения строк и статических (нединамических) массивов, как целого. Но показываются лишь значения переменных, в чью область видимости входит точка останова.
Существует также возможность просматривать значения переменных в отдельном окне с помощью команды Evaluate / Modify (клавиша Ctrl+F7).
Чтобы продолжить выполнение программы до конца (либо до следующей точки останова), нужна команда Run (клавиша F9). Чтобы полностью прекратить выполнение программы, нужна команда Program Reset (клавиша Ctrl+F2). Но существует также возможность выполнения программы по одному оператору (точнее, по одной строчке) с помощью команд Trace Into (клавиша F7) или Step Over (клавиша F8). Различие между ними в том, что Trace Into заходит и внутрь функций для их пошагового выполнения, а Step Over выполняет любой вызов функции за один шаг. После каждого шага можно вновь просмотреть значения переменных; кроме того, становится наглядно видна последовательность выполнения операторов.
Для удобства пошагового выполнения, рекомендуется избегать написания нескольких операторов в одной строчке.