Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции Гуревича по с++, первый сем / Лекции ОАиП Гуревич (I сем.) №4

.doc
Скачиваний:
63
Добавлен:
15.06.2014
Размер:
34.82 Кб
Скачать

10.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. 1 2 3 4

  2. 11 12 13 14

  3. 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 выполняет любой вызов функции за один шаг. После каждого шага можно вновь просмотреть значения переменных; кроме того, становится наглядно видна последовательность выполнения операторов.

Для удобства пошагового выполнения, рекомендуется избегать написания нескольких операторов в одной строчке.