- •Экзамен 374 Предварительные рассуждения Вступительное слово
- •Исторические факты
- •Начнем!
- •Проба пера
- •Открытие сохраненного проекта
- •Вывод данных
- •Типы данных
- •Хороший стиль программирования
- •Переменные и константы
- •Практический пример
- •Ввод данных
- •Например:
- •Пример:
- •Арифметические операции с числами
- •Литералы
- •Некоторые примеры
- •Домашнее задание
- •Напишите программу, которая вводит число из трех цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга с тремя пробелами между ними. Преобразование типов
- •Перечисляемые типы
- •Типичная ошибка
- •Хороший стиль программирования
- •Типичная ошибка
- •Выражения
- •Оператор if
- •Структура программы
- •Логические операции
- •Структура множественного выбора switch
- •Практический пример
- •Цикл for
- •Практический пример
- •Цикл do-while
- •Домашнее задание
- •Вызов функции
- •Прототипы функций
- •Разбор программы
- •Область видимости
- •Аргументы по умолчанию
- •Встраивание
- •Перегрузка функций
- •Учебный пример перегруженных функций. Иллюстрация перегрузки
- •Результат работы программы
- •Практические примеры
- •Домашнее задание
- •Примеры домашней работы урока 1 Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Примеры домашних работ на создание функций Пример №1
- •Как работает программа
- •Пример №2
- •Как работает программа
- •Массивы
- •Объявление массивов
- •Примеры использования массивов
- •Программа 1
- •Программа 2
- •Обратите внимание!
- •Типичная ошибка программирования
- •Типичная ошибка программирования
- •Программа 3
- •Типичная ошибка программирования
- •Замечание по технике программирования
- •Программа 4
- •Программа 5
- •Программа нахождения минимального и максимального элементов массива
- •Сортировка массивов
- •Домашнее задание
- •Что такое указатели?
- •За кулисами...
- •Как работать с указателями?..
- •Зачем нужны указатели?
- •Указатели и Массивы.
- •Примеры задач
- •Пример 1
- •Пример 2
- •Пример 3
- •Указатели - аргументы функций.
- •Ссылочные параметры
- •Примеры решения задач
- •Домашнее задание
- •Операторы свободной памяти new и delete
- •Функции работы со строками из библиотеки обработки строк
- •Пример 1.
- •Пример2
- •Пример 3
- •Пример задачи на новый материал
- •Домашнее задание
- •Двухмерные массивы, как частный случай многомерных массивов
- •Программа.
- •Результаты работы программы.
- •Многомерные динамические массивы
- •Пример на многомерные динамические массивы
- •Домашнее задание
- •Рекурсия
- •Рекурсии или итерации
- •Указатели на функции
- •Пример №1
- •Результат выполнения программы:
- •Пример №2
- •Результат выполнения программы
- •Пример №3
- •Результаты выполнения программы
- •Определения структур
- •Пример #1 на использование структур
- •Пример #2 на использование структур
- •Оператор указателя на структуру
- •Домашнее задание
- •Тест по c Группа ___________________ф. И. О. ______________________
- •Объектно-ориентированное программирование.
- •Наследование (Inheritance).
- •Инкапсуляция (Encapsulation).
- •Определение класса
- •Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- •Основное назначение конструкторов - инициализация объектов.
- •Использование конструкторов с аргументами по умолчанию
- •Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- •Использование деструкторов
- •Когда вызываются конструкторы и деструкторы.
- •Домашнее задание
- •Конструктор копирования
- •Синтаксис конструктора копирования
- •Памятка
- •Пример использования конструктора копирования.
- •Перегруженные конструкторы
- •Экскурс в историю
- •Послесловие к примеру
- •Маленькое замечание
- •Домашнее задание
- •Создание класса ''строка''
- •Перегрузка операций.
- •Общие принципы перегрузки операторов.
- •Преобразования, определяемые классом
- •Пример строкового класса с перегруженными операторами
- •Домашнее задание
- •Дружественные функции (Friend Functions)
- •Пример строкового класса с перегруженными операторами и дружественными функциями
- •Перегрузка операторов new и delete
- •Перегрузка оператора индексирования
- •Класс вектор. Часть1.
- •Класс вектор. Часть 2.
- •Класс вектор. Часть 3.
- •Домашнее задание
- •Наследование (Inheritance). Часть 1.
- •Наследование (Inheritance). Часть 2.
- •Множественное наследование (multiple inheritance)
- •Пример множественного наследования
- •Домашнее задание
- •Статические члены данных
- •Раннее и позднее связывание
- •Виртуальные функции
- •Пример.
- •Абстрактные классы
- •Виртуальный базовый класс
- •Практический пример
- •Домашнее задание
- •Потоки ввода-вывода.
- •Iostream.H: stream - поток, "I" - сокр. Input - ввод, "o" - сокр. Output - вывод.
- •Предопределенные потоки.
- •Операции помещения в поток и извлечения из потока.
- •Файловый ввод-вывод с применением потоков.
- •Конструкторы файловых потоков.
- •Функции для открытия и закрытия файлов.
- •Функции для обмена с потоками.
- •Часто применяемые функции потока.
- •Ввод/вывод массива в/из файл(-а).
- •Практический пример: перекодировка файла.
- •Домашнее задание
- •Немного о файлах...
- •И снова файлы...
- •Пример "Телефонная книга"
- •Файл abonent.H
- •Форматирование данных при обменах с потоками.
- •Состояние потока.
- •Использование аргументов командной строки.
- •Ввод/вывод в с.
- •Домашнее задание
- •Определение шаблонов функций
- •Переопределение шаблонов функций
- •Шаблоны классов
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Введение
- •Обработка исключительных ситуаций
- •Практический пример
- •Программа
- •Домашнее задание
- •Экзамен
Структура множественного выбора switch
Мы рассмотрели структуру с единственным выбором if (). Но порой алгоритм может содержать ряд альтернативных решений, причем некоторую переменную (или выражение) надо проверять отдельно для каждого постоянного целого значения, которое она может принимать, и в зависимости от результатов этой проверки должны выполняться различные действия. Для принятия подобных решений в C++ имеется структура множественного выбора switch ().
Структура switch () состоит из ряда меток case и необязательной метки default (умолчание). Программа, приведенная ниже, использует switch () для перевода различных буквенных оценок, полученных студентами на экзамене, в цифровые.
/* программа, выполняющая перевод буквенных оценок в цифровые */
#include <iostream.h>
void main() {
char cRate;
cout<<"Input your char-rate\n";
cin>>cRate;
switch (cRate) {
case 'A':
cout<<"Your rate is 5\n";
break;
case 'B':
cout<<"Your rate is 4\n";
break;
case 'C':
cout<<"Your rate is 3\n";
break;
case 'D':
cout<<"Your rate is 2\n";
break;
default:
cout<<"This rate isn't correct\n";
}
}
Пользователь вводит оценку с клавиатуры. Когда он нажимает «Ввод» символ читается функцией cin>>. Далее начинает работать структура switch (). За ключевым словом switch следует в скобках имя переменной cRate. Это так называемое управляющее выражение. Предположим, пользователь ввел в качестве оценки букву «С». «С» автоматически сравнивается с каждым условием case в структуре switch. Если встречается совпадение (case 'С':), то выполняется оператор, следующий за этой меткой case. В случае буквы «С» на экран выводится сообщение «Your rate is 3» и работа структуры switch немедленно завершается по оператору break. Оператор break вызывает передачу программного управления на первый оператор после структуры switch. Оператор break используется потому, что в противном случае условия case в операторе switch работают совместно. Если везде в структуре switch не использовать break, тогда каждый раз, когда одно из условий case удовлетворяется, будут выполняться операторы всех последующих меток case. Если ни одно условие не выполнено, то выполняются операторы после метки default (умолчание), печатающие в нашей программе сообщение об ошибке.
После каждой метки case может быть предусмотрено одно или более действий. В общем случае структура множественного выбора switch() при использовании break в каждом разделе case соответствует блок-схеме, приведенной ниже
Из этой блок-схемы видно, что каждый оператор break в конце case вызывает немедленный выход из структуры switch.
Типичная ошибка программирования
Забывают вставить оператор break, когда он нужен в структуре switch().
case и целым значением, которое проверяется в структуре switch(), может вызвать логическую ошибку. Например, запись case3: вместо case 3: просто создаст неиспользуемую метку (мы поговорим об этом подробнее в одном из следующих уроков). Дело в том, что в этой структуре switch() не будут совершены соответствующие действия, когда управляющее выражение switch() будет иметь значение 3.
Хороший стиль программирования
default в оператор switch. Случаи неудачных проверок в операторе switch без метки default будут игнорироваться. Включение метки default фиксирует внимание программиста на необходимости обрабатывать исключительную ситуацию. Но бывают ситуации, в которых никакой обработки по метке default не требуется.
case и default могут размещаться в структуре switch() в произвольном порядке, стоит учесть практику качественного программирования - помещать default в конце.
Если в структуре switch() предложение default помещено последним в списке, то оператор break в нем не требуется. Но некоторые программисты включают break и тут для четкости и для симметрии с другими случаями.
Отметим, что последовательное перечисление несколько меток (например, case 'D' : case 'd' :) позволяет выполнять один и тот же набор действий для разных значений проверяемого выражения
Когда используете структуру switch, помните, что она может применяться только для проверки на совпадение с константным целым выражением, т.е. с любой комбинацией символьных и целых констант, которая имеет целое постоянное значение. Символьная константа представляется как соответствующий символ, заключенный в одиночные кавычки, например, 'А'. Целая константа — просто целое число
Пример
Рассмотрим комплексный пример на использование инструкций switch и enum. Тщательно проанализируйте программу
//Программа переводит указанную пользователем сумму в USD, DM,
// российские рубли
#include <iostream.h >
void main()
{
// объявление перечислимого типа
enum Valuta { USD = 1, DM, RUS};
// переменная Val_Count для хранения суммы в гривнах
float Val_Count = 0;
// объявление переменной перечислимого типа Valuta
Valuta Val_Case;
// переменная для определения выбора пункта меню
int Menu_Case;
// приглашение ввести данные
cout << "Введите сумму, которую Вы хотите поменять: ";
cin >> Val_Count;
// вывод меню
cout << "\n Обмен возмжен на "
<< "\n 1. USD"
<< "\n 2. DM"
<< "\n 3. Российские рубли"
<< "\n \n Выберите тип валюты, который Вас интересует"
<< "\n Укажите 1, 2 или 3\n";
cin >> Menu_Case;
// преобразование Menu_Case к типу Valuta и
//инициализация переменной Val_Case
Val_Case = Valuta(Menu_Case);
// в зависимости от выбора пользователя выполняются
//соответсвующие действия
switch (Val_Case)
{
case USD: // если был выбран 1-й пункт меню
cout << Val_Count << "грн. = "
<< 5.40 * Val_Count << "USD \n";
break;
case DM: // если был выбран 2-й пункт меню
cout << Val_Count << "грн. = " << 2.37 * Val_Count << "DM \n";
break;
case RUS: // если был выбран 3-й пункт меню
cout << Val_Count << "грн. = " << 0.23 * Val_Count
<< "рос. руб. \n";
break;
default: cout << "Выбор валюты от 1 до 3"; // др. случаи
}
}
Домашнее задание
Задача 1
Измените программу примера c if () таким образом, чтобы в случае ввода ошибочных данных (R1<0, R2<0 либо R1>R2) она выводила на экран соответствующее предупреждение и не проводила никаких вычислений.
Задача 2
Измените программу примера с оператором switch () таким образом, чтобы она обрабатывала не только прописные, но и строчные буквы. То есть цифровая оценка 5 соответствует буквенным оценкам «А» и «а».
Задача 3
Напишите программу, проверяющую число на четность.
Задача 4
Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела.
Цикл while
В 60-х годах исследование Бома и Джакопини показало, что все программы могут быть написаны с использованием всего трех управляющих структур, названных структура следования, структура выбора и структура повторения.
Структура следования встроена в С++. Пока не указано иное, компьютер выполняет операторы С++ один за другим в той последовательности, в которой они записаны. Со структурами выбора мы познакомились в прошлый раз. Напомним еще раз. С++ обеспечивает три типа структур выбора альтернатив:
структура с единственным выбором if (ЕСЛИ) выполняет некоторое действие, если проверяемое условие истинно, или пропускает его, если ложно; структура с двойным выбором if/else (ЕСЛИ-ИНАЧЕ), выполняет одно действие, если условие истинно и другое действие, если оно ложно; структура с множественным выбором switch (ВЫБОР), выполняет одно из множества действий в зависимости от значения проверяемого выражения.
Сегодня, мы познакомимся со структурами повторения. С++ обеспечивает три типа структур повторения (циклов), называемых while (ПОКА), do-while (ЦИКЛ-ПОКА) и for (ЦИКЛ).
Любая программа на С++ формируется из такого количества комбинаций каждого типа управляющих структур, которое нужно для осуществления соответствующего алгоритма. А теперь, как и обещано, давайте поближе познакомся со структурами повторения.
Структура повторения позволяет программисту определить действие, которое должно повторяться, пока некоторое условие остается истинным. Например, предложение
ПОКА имеются незачеркнутые элементы в моем списке покупок
Сделать следующую покупку и вычеркнуть ее из списка
описывает повторные действия при посещении магазина. Условие "имеются незачеркнутые элементы в моем списке покупок" может быть истинным или ложным. Если оно истинно, то осуществляется действие "Сделать следующую покупку и вычеркнуть ее из списка". Это действие будет повторяться до тех пор, пока условие остается истинным. Оператор (или операторы), записанные в цикле while (ПОКА) составляют тело while, которое может быть отдельным или составным оператором. Очевидно, что когда-нибудь условие станет ложным (когда будет осуществлена и вычеркнута из списка последняя покупка). Начиная с этого момента повторение прерывается и выполняется первое действие, следующее за структурой повторения.
Обобщенная форма цикла while:
while ( выражение ) оператор;
Вначале вычисляется выражение. Если результат отличен от нуля (true), тогда выполняется оператор и управление переходит обратно к началу цикла while. Это приводит к выполнению тела цикла while, а именно оператора, который будет выполняться до тех пор, пока выражение не станет равным нулю (false). Затем управление передается следующему оператору. Таким образом, цикл может выполняться ноль или более раз. Например:
/* Пример выводит на экрон 5 строк типа "Строка" + "индекс" +
"выводится в цикле", где "индекс" меняется от 0 до 4 */
#include < iostream.h >
void main()
{
int i = 0; /*Объявление и инициализация переменной i*/
cout << "\n Начало цикла";
while (i != 5) /*Проверяется выражение (i != 5),
если результат - истина, выполняется операторы тела цикла,
в противном случае управление передается оператору, следующему за циклом. */
{
cout << "Строка " << i << "выводится в цикле \n";
i++;
}
cout << "\n Оператор, следующий за циклом";
}
Чтобы материал стал более понятным рассмотрим еще такой пример:
/*Программа выводит на экран данные таблицы умножения на 2*/
#include < iostream.h >
void main()
{
int i = 0;
cout << "Таблица умножения на 2 \n";
while ( i ++ < 10)
cout << i << " * 2 = " << i * 2 << '\n';
cout << "\n Все";
}
Давайте остановимся на операторе while в данном примере и по шагам посмотрим, как он работает.
while ( i ++ < 10)
cout << i << " * 2 = " << i * 2 << '\n';
Цикл состоит из двух частей: условие цикла и тело цикла. Обратите внимание на условие цикла - это выражение i++ < 10 . Условие гласит, что тело цикла будет выполняться пока выполняется условие i < 10 . ПОСЛЕ проверки этого условия значение переменной i увеличивается на 1 (об этом говорит оператор i++). Тело цикла состоит всего из одного оператора, а именно:
cout << i << " * 2 = " << i * 2 << '\n';
Итак, 1-й шаг цикла
1.1 Значение переменной i равно 0 (так она была проинициализирована).
1.2 Проверка условия i < 10 дает истина (т.к. 0 < 10)
1.3 Значение переменной i увеличивается на 1, теперь i = 1.
1.4 Так как проверка условия цикла дала значение истина управление
передается оператору тела цикла, т.е. на экран выводится строка 1 * 2 = 2
1.5 Далее управление передается циклу while
2-й шаг цикла
2.1 Значение переменной i равно 1.
2.2 Результат проверки условия цикла - истина (1 < 10)
2.3 Значение переменной i увеличивается на 1, теперь i = 2.
2.4 Так как проверка условия цикла дала значение истина управление
передается оператору тела цикла, т.е. на экран выводится строка 2 * 2 = 4
2.5 Далее управление передается циклу while
. . .
9-й шаг цикла
9.1 Значение переменной i равно 8.
9.2 Результат проверки условия цикла - истина (8 < 10)
9.3 Значение переменной i увеличивается на 1, теперь i = 9.
9.4 Так проверка условия цикла дала значение истина управление
передается оператору тела цикла, т.е. на экран выводится строка 9 * 2 = 18
9.5 Далее управление передается циклу while
10-й шаг цикла
10.1 Значение переменной i равно 9.
10.2 Результат проверки условия цикла - истина ( 9 < 10)
10.3 Значение переменной i увеличивается на 1, теперь i = 10.
10.4 Так проверка условия цикла дала значение истина управление
передается оператору тела цикла, т.е. на экран выводится строка 10 * 2 = 20
10.5 Далее управление передается циклу while
11-й шаг цикла
11.1 Значение переменной i равно 10.
11.2 Результат проверки условия цикла - ложь ( 10 равно 10, а не меньше!)
11.3 Значение переменной i увеличивается на 1, теперь i = 11.
11.4 Так проверка условия цикла дала значение ложь, управление
НЕ передается в тело цикла, т.е. выполнение цикла заканчивается,
и управление переходит к оператору, следующему за while,
т.е. к cout << "\n Все";
В данном примере, мы рассмотрели случай с заранее определенным числом повторений, однако характеру оператора while наиболее соотвествуют ситуации, когда заранее неизвестно, количество повторений цикла.