- •А. В. Кибардин
- •Часть 1 Основы структурного и модульного программирования
- •Оглавление
- •Введение
- •1. Структурное программирование
- •Состав языка
- •Константы
- •Комментарии
- •Типы данных
- •Основные типы данных
- •Структура программы
- •Переменные и выражения Переменные
- •Операции
- •Примеры операций
- •Выражения
- •Функции ввода-вывода Основные функции ввода-вывода в стиле с
- •Спецификации формата
- •Модификаторы формата
- •Операторы Оператор «выражение»
- •Условный операторif
- •Оператор switch
- •Цикл с предусловием
- •Цикл с постусловием
- •Цикл с параметромfor
- •Операторы передачи управления Оператор безусловного перехода
- •Оператор break
- •Оператор continue
- •Оператор return
- •Указатели и ссылки
- •Инициализация указателей
- •Операции с указателями
- •Массивы Одномерные массивы
- •Динамические массивы
- •Многомерные массивы
- •Задание Написать программу, вычисляющую среднее арифметическое для каждого столбца и каждой строки двумерного числового массива a[4, 5]. Строки
- •Типы данных, определенные пользователем
- •Переименование типов
- •Перечисления
- •Структуры
- •2. Модульное программирование
- •Функции Объявление и определение функций
- •Глобальные переменные
- •Возвращаемое значение
- •Параметры функции
- •Передача массивов в качестве параметров
- •Передача имен функций в качестве параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Правила описания перегруженных функций
- •Шаблоны функций
- •Функции стандартной библиотеки
- •Функции ввода/вывода
- •Открытие потока
- •Ввод/вывод
- •Закрытие потока
- •Обработка ошибок
- •Функции работы со строками и символами
- •Математические функции
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •Области действия и пространства имен
- •Внешние объявления
- •Поименованные области
- •Библиографический список
- •Часть 1 основы структурного и модульного программирования
- •620034, Екатеринбург, ул. Колмогорова, 66
Многомерные массивы
Многомерные массивы задаются указателем каждого измерения в квадратных скобках, например:
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» встречается в строке несколько раз, рапорт должен быть выдан один раз).