- •Экзамен 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
- •Форматирование данных при обменах с потоками.
- •Состояние потока.
- •Использование аргументов командной строки.
- •Ввод/вывод в с.
- •Домашнее задание
- •Определение шаблонов функций
- •Переопределение шаблонов функций
- •Шаблоны классов
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Шаблонный класс вектор
- •Введение
- •Обработка исключительных ситуаций
- •Практический пример
- •Программа
- •Домашнее задание
- •Экзамен
Примеры решения задач
Задача: Игра "Угадай-ка". Написать программу, которая как можно быстрее (за меньшее число попыток) отгадывает число, задуманное пользователем в диапазоне от 1 до 100.
Существует множество алгоритмов решения этой задачи, как впрочем и любой другой.
Вариант 1. Например, можно угадывать число, используя метод полного перебора. В этом случае можно только посочувтсвовать пользователю, задумавшему число 100 :) (Конечно только в том случае, если начать перебор с единицы). Программа 1 реализует данный алгоритм. В цикле, начиная с единицы, последовательно задаем вопрос пользователю, является ли текущее число задуманным. Если на каком-то шаге пользователь подтверждает, что очередное предложенное пограммой число - его число, то выходим из цикла и выводим число на экран, иначе продолжаем цикл. Таким образом, выход из цикла происходит в двух случаях: 1. по окончании цикла, т.е., если ни одно из чисел от 1 до 99 не является числом, задуманным пользователем, тогда остается последний вариант - это число 100, о чем программа и сообщает. И второй случай, выход из цикла происходит по достижении оператора break; т.е., когда пользователь подтверждает, что число отгадано. Очевидно, что количество попыток при данном алгоритме в наихудшем случае равно 100.
Программа 1
/* Программа угадывает число, задуманное пользователем
в диапазоне от 0 до 100, используя метод полного перебора.
*/
#include <iostream.h>
void main()
{
int i;
char c;
/* в цикле, начиная с 1, программа последовательно опрашивает
пользователя, является ли текущее число задуманным */
for (i = 1; i < 100; i++)
{
cout << "Ваше число " << i << "?\n (Да - 'y' или 'Y') ";
cin >> c;
/* если программа нашла число, выходим из цикла */
if (c == 'y' || c == 'Y')
break;
}
// выводим задуманное число на экран
cout << "Задуманное число = " << i << "\n";
}
Вариант 2.Можно, например, пытаться случайным образом угадывать число. Т.е. программа будет генерировать случайное число в указанном диапазоне и спрашивать пользователя, угадала она или нет. По теории вероятности рано или поздно программа угадает число. Причем, это может произойти практически с первых попыток, но может быть и нет :) Следующая небольшая программа демонстрирует, что процесс угадывания при таком методе может затянуться очень надолго.
Программа 2
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int count = 0;
int num;
srand(time(NULL));
do
{
// в цикле генерируем случайное число
num = rand()%100 + 1;
// и увеличиваем переменную-счетчик на 1
count++;
}
while (num !=100); // выходим их цикла, когда num = 100
cout << "Число 100 получили за : " << count << " попыток \n";
}
Программа 2 в цикле генерирует случайные числа до тех пор, пока это не получит число 100, и выводит на экран, с какого раза ей это удалось. Попробуйте запустить ее и Вы убедитсь, что довольно часто число попыток превосходит 200, а то и 300 попыток!!!
Конечно можно модифицировать этот вариант, например добавив, чтобы программа спрашивала задуманное число больше или меньше текущего, предложенного ею варианта, и уже на основе ответа генерировала новое число. Программа 3 реализует эту идею.
Программа 3
/* Программа угадывает число, задуманное пользователем
в диапазоне от 0 до 100, используя генерацию случайных чисел
(улучшенный вариант).
*/
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int num;
int max = 100;
int min = 0;
char c;
srand(time(NULL));
do
{
// если max - min не равно 0, то генерируем случайное число
(max - min) ? num = rand()%(max-min) + min + 1 : num = max;
cout << "Ваше число больше, чем " << num
<< "\n Для подтверждения введите 'y' или 'Y', "
<< "'с' или 'С', если число угадано, "
<< "в противном случае любой другой символ \n";
cin >> c;
if(c == 'y' || c == 'Y') min = num;
else max = num;
// выходим из цикла, если число отгадано
if(c == 'c' || c == 'C') {min = max - 1; break;}
}
while (max!=min+1 && max != min);
cout << "Ваше число: " << max << "\n";
}
Вариант 3 (наилучший). Но можно воспользоваться приемом, известным, как метод деления отрезка пополам. Вы познакомились с этим методом в уроке 8 при рассмотрении алгоритма бинарного поиска. В этом случае максимальное число попыток, которое сделает программа, чтобы отгадать число равно 8! Давайте воспользуемся этим методом.
Программа 4
/* Программа угадывает число, задуманное пользователем
в диапазоне от 0 до 100, используя метод деления отрезка пополам.
*/
#include <iostream.h>
void main()
{
int min = 0, max = 100;
char c;
int num;
do
{
// выбираем число и предлагаем его пользователю
num = (max+min)/2;
cout << "Ваше число " << num
<< "\n Для подтверждения введите 'y' или 'Y', "
<< "'с' или 'С', если число угадано, "
<< " в противном случае любой другой символ \n";
cin >> c;
// переназначаем границы интервала
if(c == 'y' || c == 'Y') min = num;
else max = num;
// выходим из цикла, если число отгадано
if(c == 'c' || c == 'C') {min = max - 1; break;}
}
while (max!=min+1);
cout << "Ваше число: " << max << "\n";
}