- •Введение
- •1Основы программирования Тема 1.1. Введение в программирование
- •1.1.1Основные понятия программирования
- •1.1.2Первая программа
- •1.1.3Комментарии
- •1.1.4Переменные и типы данных
- •1.1.5Ключевые слова и идентификаторы
- •1.1.6Вывод информации на экран
- •1.1.8Вывод русских букв
- •1.1.9Простые вычисления
- •1.1.10Контрольные вопросы
- •Тема 1.2. Математические вычисления
- •1.2.1Операции и выражения
- •1.1.7Ввод информации с клавиатуры
- •1.2.2Оператор присваивания
- •1.2.3Приоритет операций
- •1.2.4Смешанные выражения и преобразование типов
- •1.2.5Явное преобразование типов
- •1.2.6Функции и их аргументы
- •1.2.7Математические функции
- •1.2.8Контрольные вопросы
- •Тема 1.3. Условный оператор if-else
- •1.3.1Примеры использования условных операторов
- •1.3.2Конструкция if-else
- •1.3.3Оператор ?: и сокращенная запись для if-else
- •1.3.4Логические операторы и выражения
- •1.3.5Использование оператора if без ветки else
- •1.3.6Лесенка if-else-if
- •1.3.7Контрольные вопросы
- •Тема 1.4. Условный оператор switch-case
- •1.4.1Синтаксис оператора switch-case
- •1.4.2Исключение операторов break из switch
- •1.4.3Реализация простого консольного меню
- •1.4.4Контрольные вопросы
- •Тема 1.5. Символы и строки
- •1.5.1Объявление и вывод строк
- •1.5.2Кавычки и апострофы
- •1.5.3Ввод русских символов
- •1.5.4Контрольные вопросы
- •2Циклы и массивы Тема 2.1. Цикл на базе if и goto
- •2.1.1Синтаксис оператора goto
- •2.1.2Использование оператора goto при реализации меню
- •2.1.3Оператор goto и игра «Угадай число!»
- •2.1.4Реализация цикла на базе if и goto
- •2.1.5Контрольные вопросы
- •Тема 2.2. Циклы while и do-while
- •2.2.1Назначение циклов и базовые понятия
- •2.2.2Цикл while
- •2.2.3Условие, вложенное в цикл
- •2.2.4Обработка данных в цикле
- •2.2.5Неизвестное число итераций
- •2.2.6Цикл do-while
- •2.2.7Перевод числа в другую систему счисления
- •2.2.8Бесконечный цикл while
- •2.2.9Контрольные вопросы
- •Тема 2.3. Цикл for
- •2.3.1Предпосылки к созданию цикла for
- •2.3.2Синтаксис цикла for
- •2.3.3Вариации цикла for
- •2.3.4Оператор break
- •2.3.5Бесконечный цикл for
- •2.3.6Контрольные вопросы
- •Тема 2.4. Массивы
- •2.4.1Зачем нужны массивы?
- •2.4.2Объявление массива
- •2.4.3Работа с массивом заранее неизвестного размера
- •2.4.4Сравнение и присваивание массивов
- •2.4.5Вычисление суммы элементов массива
- •2.4.6Подсчет количества элементов с нужным свойством
- •2.4.7Поиск элемента в массиве
- •2.4.8Нахождение максимального элемента в массиве
- •2.4.9Контрольные вопросы
- •Тема 2.5. Обработка строк
- •2.5.1Подготовка к работе
- •2.5.2Поиск символа в строке
- •2.5.3Вывод символов с определенным свойством
- •2.5.4Контрольные вопросы
- •3Процедуры и функции Тема 3.1. Процедуры
- •3.1.1Подпрограммы, функции, процедуры
- •3.1.2Создание и вызов процедуры
- •3.1.3Пример создания процедуры
- •3.1.4Пример вызова процедуры
- •3.1.5Распространенная ошибка
- •3.1.6Процедуры с аргументами
- •3.1.7Название процедуры
- •3.1.8Формальные и фактические аргументы
- •3.1.9Тело процедуры
- •3.1.10Создание нескольких процедур
- •3.1.11Создание заголовочного файла
- •3.1.12Контрольные вопросы
- •Тема 3.2. Функции
- •3.2.1Возвращаемое значение
- •3.2.2Определение и вызов функции
- •3.2.3Название функции
- •3.2.4Формальные и фактические аргументы
- •3.2.9Контрольные вопросы
- •3.2.5Тело функции
- •3.2.6Оператор return
- •3.2.7Глобальные и локальные переменные
- •3.2.8Прототипы функций
- •Тема 3.3. Рекурсивные функции
- •3.3.1Понятие рекурсивной функции
- •3.3.2Рекурсивные процедуры
- •3.3.3Рекурсивные функции, принимающие более одного аргумента
- •3.3.4Контрольные вопросы
- •Тема 3.4. Логические функции
- •3.4.1Примеры громоздких логических конструкций
- •3.4.2Создание и вызов логической функции
- •3.4.3Сравнивать с true не обязательно
- •3.4.4Вызов логических функций внутри циклов
- •3.4.5Контрольные вопросы
- •Тема 3.5. Прикладной программный интерфейс (api)
- •3.5.1 Простой вложенный цикл
- •3.5.2Вынесение вложенного цикла в функцию
- •3.5.3Зависимость вложенных циклов
- •3.5.4 Два цикла, вложенные в третий
- •3.5.5Понятие api
- •3.5.6Вложенные циклы и вывод цифр
- •3.5.7Контрольные вопросы
- •4Простые структуры данных Тема 4.1. Матрицы
- •4.1.1Основные понятия
- •4.1.2Объявление матрицы
- •4.1.3Инициализация матрицы
- •4.1.4Вывод матрицы на экран
- •4.1.5Вывод ровных столбцов матрицы
- •4.1.6Заполнение матрицы в автоматическом режиме
- •4.1.7Работа с матрицей заранее не известного размера
- •4.1.8Заполнение матрицы случайными числами
- •4.1.9Заполнение матрицы с условием
- •4.1.10Обработка матрицы
- •4.1.11Обработка строк и столбцов
- •4.1.12Комбинированная обработка матрицы
- •4.1.13Контрольные вопросы
- •Тема 4.2. Массивы строк
- •4.2.1Объявление и инициализация массива строк
- •4.2.2Присвоение элементов массива строк
- •4.2.3Вывод и ввод массива строк
- •4.2.4Обращение к отдельным символам массива строк
- •4.2.5Сортировка массива строк
- •4.2.6Пример работы с массивом строк
- •4.2.7Контрольные вопросы
- •Тема 4.3. Файлы
- •4.3.1Запись информации в файл
- •4.3.2Чтение информации из файла
- •4.3.3Распространенная ошибка
- •4.3.4Контрольные вопросы
- •Тема 4.4. Структуры
- •4.4.1Причины использования структур
- •4.4.2Объявление структуры
- •4.4.3Обращение к полям структуры и оператор «точка»
- •4.4.4Ввод и вывод содержимого структуры
- •4.4.5Вложенные структуры
- •4.4.6Массив структур
- •4.4.7Вывод массива структур в виде таблицы
- •4.4.8Сортировка массива структур
- •4.4.9Передача структур в качестве аргументов функций
- •4.4.10Возврат структуры в качестве значения функции
- •4.4.11Контрольные вопросы
- •Тема 4.5. Реализация динамических структур данных на основе массива
- •4.5.1Пометка элементов
- •4.5.2Пометка элементов с оберткой
- •4.5.3Реализация стека на основе массива
- •4.5.4Реализация очереди на основе массива
- •4.5.5Реализация списка на основе массива
- •4.5.6Контрольные вопросы
- •Глоссарий
- •Литература
- •Основное (обязательное) обеспечение
- •Дополнительное обеспечение
3.1.3Пример создания процедуры
Для примера создадим процедуру, приветствующую пользователя на трех разных языках. Начнем с псевдокода этой процедуры.
Процедура ВывестиПриветствие
Начало
Вывести приветствие по-русски;
Вывести приветствие по-английски;
Вывести приветствие по-французски;
Конец.
Переведем этот псевдокод на язык C++:
void say_hello() {
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
}
В данном примере say_hello – это название процедуры, void – это указание того, что say_hello является процедурой; точнее, void – это пустой тип, значит, подпрограмма say_hello не возвращает никакого значения. В последующих темах рассматриваются функции, которые возвращают какие-либо значения. При их создании вместо типа void указывается тип возвращаемого значения, например, int, float, double, string и пр.
Открывающая и закрывающая фигурные скобки означают слова Начало и Конец соответственно. Тело процедуры расположено между фигурными скобками и печатается с отступом. Пустые круглые скобки после названия процедуры указывают на отсутствие аргументов. Если процедура или функция принимает аргументы, то они перечисляются в этих скобках. Если аргументов нет, то скобки все равно ставятся.
3.1.4Пример вызова процедуры
Создание процедуры без вызова не приводит к каким-либо действиям. Единственное, что может произойти, – это сообщение об ошибке компиляции, если процедура имеет синтаксические ошибки. Чтобы процедура выполнила действия, ее требуется вызвать. Рассмотрим пример создания и вызова процедуры.
#include <iostream>
using namespace std;
//Создание (определение) процедуры
void say_hello() {
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
}
int main() {
say_hello(); //Вызов функции
say_hello(); //Вызов функции
system("pause");
return 0;
}
Разберем эту программу. В данном случае процедура say_hello() выводит три приветствия, выполняя группу из трех команд
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
После этого внутри функции main() созданная процедура вызывается два раза. Значит, эта программа выполнит те же действия, что и следующая программа.
int main() {
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
system("pause");
return 0;
}
3.1.5Распространенная ошибка
Определять процедуры локально (внутри других функций и процедур) нельзя! Вызывать можно, но определять – нет. Например, следующая программа ошибочна, поскольку функция say_hello() определяется внутри функции main().
int main() {
//Локальное определение недопустимо!
void say_hello() {
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
}
}
3.1.6Процедуры с аргументами
Рассмотренная процедура say_hello() работает всегда одинаково, другими словами, сколько бы раз она ни вызывалась, результат всегда один: приветствие на трех языках. Для управления процессом исполнения процедур и функций можно использовать аргументы. Аргументы – это параметры, которые передаются в функцию при вызове и доступны внутри нее.
Создадим три процедуры, первая из которых выводит на экран три звездочки, вторая – пять, а третья – семь.
void drawThreeStars() {
for (int i=1; i<=3; i++) {
cout << "*";
}
}
void drawFiveStars() {
for (int i=1; i<=5; i++) {
cout << "*";
}
}
void drawFiveStars() {
for (int i=1; i<=7; i++) {
cout << "*";
}
}
Все три процедуры одинаковы за исключением одного параметра внутри цикла. Получается, что из-за одного параметра приходится создавать новые процедуры. Кроме того, при таком подходе возникают сложности с изменением числа выводимых звездочек. Данную проблему можно решить, используя аргументы. Создадим процедуру, которая принимает аргумент и выводит на экран ряд звездочек, количество которых определяется этим аргументом. Для этого необходимо придумать имя этому аргументу и указать его вместе с типом в скобках после названия функции. Очевидно, что количество звездочек должно иметь целый тип.
void drawStars(int n) {
for (int i=1; i<=n; i++) {
cout << "*";
}
}
Наконец, создадим программу целиком.
#include <iostream>
using namespace std;
void drawStars(int n) {
for (int i=1; i<=n; i++) {
cout << "*";
}
cout << endl;
}
int main() {
drawStars(10); //Вывод 10 звездочек
drawStars(2); //Вывод 2 звездочек
int x=7;
drawStars(x); //Вывод x звездочек
drawStars(2*x+5); //Вывод 2*x+5 звездочек
system("pause");
return 0;
}
В качестве фактического аргумента в процедуру можно передать число, переменную или выражение типа int.
