
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Многомерные массивы
Многомерный массив представляется в С++ как массив, состоящий из массивов. Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор 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