- •Экзамен 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
- •Форматирование данных при обменах с потоками.
- •Состояние потока.
- •Использование аргументов командной строки.
- •Ввод/вывод в с.
- •Домашнее задание
- •Определение шаблонов функций
- •Переопределение шаблонов функций
- •Шаблоны классов
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Введение
- •Обработка исключительных ситуаций
- •Практический пример
- •Программа
- •Домашнее задание
- •Экзамен
Структура программы
Давайте решим следующую задачу. На плоскости нарисовано кольцо с центром в точке (x0,y0). И радиусами границ r1<r2. Кроме того, на этой же плоскости дана точка с координатами (x, y).
Необходимо определить, принадлежит ли эта точка кольцу. Пусть вас не смущает "математическая окраска" задачи. Решение ее весьма тривиально: мы должны вычислить расстояние от центра кольца до точки, и сравнить его с радиусами. Если логическое выражение r1<L<r2 верно, то точка принадлежит кольцу. Если же хотя бы одно из этих условий не выполнено, то точка не принадлежит кольцу. Программа, реализующая это решение, приведена ниже:
// Точка и кольцо
#include <iostream.h>
#include <math.h>
void main() {
// Объявление переменных
int x0, y0, r1, r2, x, y;
float L;
// Пусть пользователь введет данные
cout<<"Input coordinates of circle’s center (X0, Y0): ";
cin>>x0>>y0;
cout<<"Input circle radiuses R1 and R2: ";
cin>>r1>>r2;
cout<<"Input point coordinates (X, Y): ";
cin>>x>>y;
L = sqrt(pow(x - x0, 2) + pow(y - y0, 2));
if ((r1 < L) && (L < r2 )) {
cout<<"This point is situated inside the circle.\n";
} else {
cout<<"This point is not situated inside the circle.\n";
}
}
В этой программе появилось несколько новых элементов. Во-первых, это функция sqrt(), которая вычисляет квадратный корень и входит в состав библиотеки math.h.
Логические операции
Пока мы рассматривали только простые условия, которые выражали в терминах операций отношения
> |
< |
>= |
<= |
и операций проверки на равенство
== |
!= |
Каждое решение принималось на основе одного условия. Если мы хотим в процессе принятия решения проверять несколько условий, мы вынуждены были бы реализовывать эти проверки отдельными операторами или вложенными структурами
if или if/else.
Например,
#include < iostream.h >
// Необходимо определить принадлежит ли число, введенное пользователем, интервалу (1, 10).
void main()
{
int i;
cout << "Input i: " << "\n";
cin >> i;
// Здесь мы используем вложенный оператор if
if ( i > 1 )
if (i < 10 )
cout << " i принадлежит интервалу (1, 10)"<< "\n";
else
cout << " i не принадлежит интервалу (1, 10)" << "\n";
}
Чтобы избежать подобных вложений, С++ предоставляет нам логические операции, которые могут использоваться для формирования сложных условий путем комбинирования простых.
Логическими операциями являются |
||
&& |
- |
(логическое И), |
|| |
- |
(логическое ИЛИ) и |
! |
- |
(логическое НЕ, называемое также логическое отрицание). |
Рассмотрим примеры каждой из них.
Предположим, мы хотим обеспечить в некоторой точке программы, чтобы определенный путь расчета выбирался только в случае, когда два условия одновременно истинны. Тогда мы можем применить логическую операцию && (логическое И), например:
if (gender == 1 && age >= 65) ++seniorFemales;
Этот оператор if содержит два простых условия. Условие gender == 1 может проверяться, например, чтобы определить, является ли данное лицо женщиной.
Условие age >= 65 проверяется, чтобы определить, является ли человек пожилым гражданином. Проверка этих двух простых условий выполняется первой, поскольку приоритет обеих операций == и >= выше, чем приоритет операции & &. Затем оператор if рассматривает комбинацию этих условий
(gender ==1) && (age >= 65)
и если она истинна, то выполняется оператор ++seniorFemales;
Таблица ниже поясняет действие операции && . Эта таблица показывает все четыре возможных сочетания комбинаций ложного (false , нулевого) и истинного (true, ненулевого) значений первого и второго выражений. Подобные таблицы часто называются таблицами истинности. C++ воспринимает как 0 или как 1 все выражения, содержащие операции отношения, проверки на равенство или логические операции. Хотя C++ возвращает 1, если результат равен true, он воспринимает как true любое ненулевое значение.
Таблица истинности для && |
||
выражение 1 |
выражение 2 |
выражение 1 & & выражение 2 |
true |
true |
true |
true |
false |
false |
false |
true |
false |
false |
false |
false |
Таким образом,
результат операции логического И ( & &) будет истинна, тогда и только тогда, когда оба условия истинны!
Теперь давайте посмотрим, как использование логического И ( & &) упростит наш пример.
#include < iostream.h >
// Необходимо определить принадлежит ли число, введенное пользователем, интервалу (1, 10).
void main()
{
int i;
cout << "Input i: " << "\n";
cin >> i;
if ( i > 1 && i < 10 )
cout << " i принадлежит интервалу (1, 10)"<< "\n";
else
cout << " i не принадлежит интервалу (1, 10)" << "\n";
}
Логическая операция || (логическое ИЛИ). Предположим, мы хотим обеспечить в некоторой точке программы, чтобы определенный путь расчета выбирался только в случае, когда хотя бы одно из двух условий истинно. В этом случае мы можем применить логическую операцию ||. Например,
if (semesterAverage >= 90 || finalExam >= 90) cout << "Оценка студента - A \n";
Этот оператор также содержит два простых условия. Условие semesterAverage >= 90 проверяется, чтобы определить, заслужил ли студент оценки "А" за курс в результате постоянной работы в течение семестра. Условие finalExam >== 90 проверяется, чтобы определить, заслужил ли студент оценки "А" за курс вследствие выдающихся результатов на заключительном экзамене. Затем оператор if рассматривает комбинацию этих условий
(semesterAverage >= 90) || (finalExam >= 90)
и присуждает студенту оценку "А", если любое из этих условий или оба они истины. Отметим, что сообщение "Оценка студента - А" не печатается только, если оба простых условия ложны (если их значения равны 0). Ниже приводится таблица истинности для логической операции ИЛИ (||).
Таблица истинности для || |
||
выражение 1 |
выражение 2 |
выражение 1 || выражение 2 |
true |
true |
true |
true |
false |
true |
false |
true |
true |
false |
false |
false |
Таким образом, результат операции логического ИЛИ (||) будет истинна, когда хотя бы одно из двух условий истинна!
Операция && имеет более высокий приоритет, чем операция ||. Обе эти операции имеют ассоциативность слева направо. Выражение, содержащее операции && и ||, оценивается только до тех пор, пока его истинность или ложность не станет очевидной. Таким образом, анализ выражения
gender ==1 && age >= 65
будет немедленно остановлен, если значение gender не равно 1 (т.е. условие в целом заведомо ложно), и продолжится, если значение gender равно 1 (т.е. в целом может оказаться истинным, если будет истинным условие age >= 65).
C++содержит логическую операцию ! (логическое отрицание), чтобы программист мог изменить значение условия на "противоположное". В отличие от операций && и ||, которые комбинируют два условия (и, следовательно, являются бинарными операциями), операция отрицания имеет в качестве операнда только одно условие (и, следовательно, является унарной операцией). Операция логического отрицания помещается перед соответствующим условием, когда мы хотим выбрать некоторый вариант расчета в случае, если первоначально (без учета операции логического отрицания) это условие ложно. Приведем пример фрагмента программы:
if ( !(grade == sentineValue) ) cout << "Следующая оценка - " << grade <<"\n ";
Скобки, в которые помещено условие grade == sentineValue необходимы, так как операция логического отрицания имеет более высокий приоритет, чем операция проверки равенства. Ниже приводится таблица истинности операции логического отрицания.
Таблица истинности для ! |
|
выражение |
! выражение |
true |
false |
false |
true |
В большинстве случаев программист может избежать применения логического отрицания, изменив выражение условия с помощью соответствующих операций отношения и проверки равенства. Например, предыдущий оператор может быть записан в виде
if ( grade != sentineValue ) cout << "Следующая оценка - " << grade << "\n ";
Подобная гибкость часто может помочь программисту выразить условие в наиболее естественном и удобном виде.