Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_С++_ч_1.doc
Скачиваний:
15
Добавлен:
22.11.2018
Размер:
324.61 Кб
Скачать

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

Многомерные массивы задаются указателем каждого измерения в квадратных скобках, например:

int matr [6] [8];

Здесь задается описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Для доступа к элементу массива указываются все его индексы: matr [i] [j] или *(matr[i] + j)

или *(*matr + i ) +j).

!!! При обращении к элементам массива автоматический контроль выхода индекса за объявленные границы не производится.

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

int mass1 [3] [2] = {{1, 1}, {0, 1}, {1, 0}};

int mass2 [3] [2] = {1, 1, 0, 1, 0, 1};

Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной), например:

int nstr = 5;

int **m = (int**) new int [nstr] [10];

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

int nstr, nstb;

cout << "Введите количество строк и столбцов";

cin >> nstr >> nstb;

int **a = new int *[nstr];

for (int i = 0; i < nstr; i + +)

a[i] = new int [nstb];

...

Задание Написать программу, вычисляющую среднее арифметическое для каждого столбца и каждой строки двумерного числового массива a[4, 5]. Строки

Строка представляет собой массив символов, заканчивающийся нуль-символом. Нуль-символ − это символ с кодом, равным нулю, что записывается в виде управляющей последовательности '\0'. По положению нуль-символа определяется фактическая длина строки. Строку можно инициализировать строковым литералом.

Пример

char str[10] = "Привет";

// выделено 10 элементов с номерами от 0 до 9

Если строка при определении инициализируется, ее размерность можно опускать:

char str[ ] = "Привет";

Оператор

char *str = "Привет";

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

Объявление:

сhar *str [10];

Задает массив из десяти строк.

Операция присваивания значения одной строки другой не определена и может выполняться с помощью цикла или функций стандартной библиотеки (см. раздел "Функции работы со строками и символами" методических указаний “Программирование на языке С++. Часть 2” ).

В стандартной библиотеке С++ определен класс string, который обеспечивает индексацию, присваивание, сравнение и ряд других операций со строками (см. раздел "Строки" в методических указаниях “Программирование на языке С++. Часть 4”).

!!! При вводе с клавиатуры с помощью стандартного потока cin ввод производится до первого пробела, все остальные символы игнорируются. Например:

char str [100];

cin >> str;

При вводе с клавиатуры строки "один два три" в переменную str поместится текст "один". При необходимости ввода строки целиком (т.е. до символа '\n') следует использовать методы потоковых классов get и getline (см. тему "Потоковые классы").

Пример. Программа, запрашивающая пароль у пользователя:

# include <stdio.h>

# include <string.h> //подключаем библиотеку работы со строками

int main ( ) {

char s[5], passw[ ] = "bond";

printf ( "Введите пароль: \n");

gets(s); // функция ввода строки

if (strcmp(s, passw) = = 0) printf ("\n Пароль верен \n");

// strcmp( ) − функция сравнивает две строки

else printf ("\n Пароль не верен \n");

return 0;

}

Задание

Написать программу, выполняющую частотный анализ строки, введенной пользователем (т. е. вычисляющей, сколько раз в строку входит данный символ). Рапорт по каждому символу выдавать только один раз (например, символ “a” встречается в строке несколько раз, рапорт должен быть выдан один раз).