Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Многомерные массивы

Многомерный массив представляется в С++ как массив, состоящий из массивов. Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор int matr[6][8]; задаёт описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j].

При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки, например, int m[3][2]={ {1, 1}, {0, 2}, {1, 0} }; , либо задаётся общий список элементов в том порядке, в котором элементы располагаются в памяти: int m[3][2]={ 1, 1, 0, 2, 1, 0 };. Таким образом, эти две формы записи определяют следующую матрицу:

1

1

0

2

1

0

Рассмотрим программу, которая определяет в целочисленной матрице 2×3 номер строки, которая содержит наибольшее количество элементов, равных нулю.

#include <iostream>

#include <iomanip>

#include <conio>

using namespace std;

int main() {

const int Nstr=2, Nstb=3; //размерности массива

int b[Nstr][Nstb]; int i, j;

for(i=0; i<Nstr; i++)

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

cout << "Vvedite element stroki " << i << ", stolbca " << j << ": ";

cin >> b[i][j];

}

cout << "\nVvedena matrica: " << endl;

for(i=0; i<Nstr; i++) {

for(j=0; j<Nstb; j++)

cout << setw(3) << b[i][j];

cout << endl;

}

// поиск номера строки, содержащей максим. кол-во нулей

int NomerStr = -1, MaxKol = 0;

for(i=0; i<Nstr; i++) {

int Kol=0;

for(j=0; j<Nstb; j++) if(b[i][j] == 0) Kol++;

if(Kol > MaxKol) { NomerStr = i; MaxKol = Kol; }

}

if(NomerStr == -1) cout << "Nulevyh elementov v matrice NET!";

else cout << "Max. kol-vo nulevyh elementov v stroke " << NomerStr;

getch(); return 0;

}

Номер искомой строки хранится в переменной NomerStr , количество нулевых элементов в текущей строке – в переменной Kol , максимальное количество нулевых элементов – в переменной MaxKol. Массив просматривается по строкам, в каждой из них подсчитывается количество нулевых элементов. Наибольшее количество и номер соответствующей строки запоминаются.

Результат работы программы:

Vvedite element stroki 0, stolbca 0: 1

Vvedite element stroki 0, stolbca 1: 0

Vvedena matrica:

1 0 0

-1 3 0

Max. kol-vo nulevyh elementov v stroke 0

Строки

В С++ используются два вида строк: а) строка как массив символов типа char; б) строка как объект класса string. В этом семестре мы остановимся на изучении строк как массива элементов типа char. По сравнению со string он более примитивен и легко понимается.

Итак, строка представляет собой массив символов, заканчивающийся нуль-символом (нулевым символом). Нуль-символ – это символ с кодом в ASCII, равным 0, что записывается в виде управляющей последовательности '\0'. По положению нуль-символа определяется фактическая длина строки. Как и другие типы данных, строки могут быть переменными и константными.

Строку можно инициализировать следующим образом: char str[10] = "Vasia";. В этом примере под строку выделяется 10 байт (1 символ – 1 байт), 5 из которых занято под символы строки, а шестой – под нуль-символ:

'V'

'a'

's'

'i'

'a'

'\0'

Если строка при определении инициализируется, её размерность можно опускать (компилятор сам выделит соответствующее количество байт):

char str[ ] = "Vasia"; // выделено и заполнено 6 байт

Рассмотрим элементарную программу, осуществляющую ввод и вывод строки:

int main() {

const int MAX = 10; // максимальный размер строки

char str[MAX]; // сама строка

cout << "Vvedite stroku: "; // ввод строки

cin >> str;

cout << "Vy vveli: " << str << endl; // показ результата

getch(); return 0;

}

Данная программа отражает принцип описания строк и имеет ряд недостатков. Во-первых, может произойти ошибка из-за того, что пользователь введёт строку, которая окажется длиннее, чем массив, используемый для её хранения. Необходимо помнить, что в С++ нет встроенного механизма, защищающего программу от помещения элементов за пределы массива. Однако существует масса возможностей ограничить количество символов, помещаемых в массив. Во-вторых, если в данной программе ввести строку, содержащую более одного слова, то программа выведет только первое слово. Это вызвано тем, что операция >> считает пробел нулевым символом, и всё напечатанное после пробела отбрасывается. Приведём пример, исправляющий указанные недостатки:

int main() {

const int MAX = 10; // максимальный размер строки

char str[MAX]; // сама строка

cout << "Vvedite stroku: "; // ввод строки

cin.get(str, MAX);

cout << "Vy vveli: " << str << endl; // показ результата

getch(); return 0;

}

В данной версии программы, для считывания строк, содержащих пробелы, мы применили метод cin.get(str, MAX); . Здесь, первый аргумент определяет адрес массива, куда будет помещена введённая строка, а второй аргумент определяет максимальный размер массива, автоматически предупреждая, таким образом, его переполнение. Существует ещё метод cin.getline(), который работает аналогично cin.get(), но не оставляет в потоке символ перевода строки '\n', вместо которого записывается завершающий 0.

Метод cin.get(); может иметь третий аргумент, позволяющий решать проблему считывания нескольких строк. Этот аргумент определяет символ, на котором метод завершает считывание строки. Пример:

int main() {

const int MAX = 200; // максимальный размер строки

char str[MAX]; // сама строка

cout << "Vvedite Vashe polnoe imya i adres v neskolko strok: "; // ввод строки

cin.get(str, MAX, '$');

cout << "Vy vveli: " << str << endl; // показ результата

getch(); return 0;

}

Здесь, метод cin.get(str, MAX, '$'); обеспечивает принятие символов до тех пор, пока вы не введёте завершающий символ (или до тех пор, пока вводимые данные не превысят размер массива). Результат работы программы:

Vvedite Vashe polnoe imya i adres v neskolko strok: Ivanov

Ivan Petrovich

g. Moskva, ul. Sadovaja, 10

$

Vy vveli: Ivanov

Ivan Petrovich

g. Moskva, ul. Sadovaja, 10