- •Экзамен 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 и 3, другое число - окончание: 1
Вы ввели 1, поэтому была вызвана func1
Введите число между 1 и 3, другое число - окончание: 2
Вы ввели 2, поэтому была вызвана func2
Введите число между 1 и 3, другое число - окончание: 3
Вы ввели 3, поэтому была вызвана func3
Введите число между 1 и 3, другое число - окончание: 10
Вы ввели 10 для окончания
В программе определены три функции — func1, func2, func3 - каждая из которых принимает целый аргумент и ничего не возвращает. Указатели на эти три функции хранятся в массиве f, который объявлен следующим образом:
void (*f[3])(int) = {func1, func2, func3};
Массив получает в качестве начальных значений имена 3-х функций. Когда пользователь вводит значения 1, 2 или 3, это значение (минус 1) используется в качестве индекса в массиве указателей на функции.
Вызов функции выполняется следующим образом:
(*f[choice-1])(choice);
В этом вызове (*f[choice-1]) определяет указатель, расположенный в элементе массива с индексом choice-1. Указатель разыменовывается, чтобы вызвать функцию, и choice передается функции как аргумент. Каждая функция печатает имя функции, чтобы показать, что вызов верен.
Определения структур
Ранние версии языков программирования содержали только простые встроенные типы данных - целые, вещественные, логические и т.п. Эти данные можно было организовывать в массивы. Для вычислительных задач этого было достаточно. По мере развития компьютеры стали использовать для обработки текстов, графических изображений, ведения баз данных и т.п.
Разнообразие обрабатываемой информации привело к созданию объекта нового типа в языках программирования - данных типа структуры. В структуры можно объединять разнородные данные - числовые данные, массивы, строки, сами структуры и т.д. Из структур можно образовывать массивы. Структуру можно использовать как единое целое и по частям. Понятие структуры является как бы мостиком между обычным программированием и объектно-ориентированным. Объектно-ориентированные языки оперируют с классами. Класс в каком-то роде - это структура, которая объединяет в себе данные и функции их обработки. Но, об этом позже. Итак, структуры.
Структура - это составной тип данных, построенный с использованием других типов. |
Поскольку структура - это тип данных, создаваемый программистом, то именно на него (программиста) возлагается описание вновь создаваемого типа. Этим работа со структурами существенно отличается от работы со стандартными типами данных, которые "понятны" компилятору без всяких описаний.
Структура состоит из полей. Поля (элементы структуры) - переменные или массивы стандартного типа (int, char и т.п) или другие, ранее описанные структуры.
Описанный тип данных можно использовать для объявления переменных типа структур. В программе может быть сколько угодно целых или вещественных переменных. То же верно и для структур - можно объявлять сколько угодно переменных с одной и той же структурой. В одной программе может быть множество разных структур. Из структур можно организовывать массивы.
Объявление структуры осуществляется с помощью ключевого слова struct, за которым идет ее имя и далее список элементов, заключенных в фигурные скобки:
struct [имя] {
тип_элемента_1 имя_элемента_1;
тип_элемента_2 имя_элемента_2;
...
тип_элемента_n имя_элемента_n;
};
Имя структуры используется при объявлении переменных данного типа. Именем элемента может быть любой идентификатор. Через запятую можно записывать несколько идентификаторов одного типа. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать элементы с одинаковыми именами. Каждое определение структуры должно заканчиваться точкой с запятой. Например,
struct date { int day, month, year; };
или
struct date {
int day;
int month;
int year;
};
Элементы структуры могут быть любого типа и одна структура может содержать элементы многих разных типов. Структура не может, однако, содержать экземпляры самой себя. Например, элемент типа date не может быть объявлен в определении структуры date.
struct date {
int day;
int month;
int year;
date last_date; // ошибка!
};
Следом за фигурной скобкой, заканчивающей список элементов, могут записываться переменные данного типа, например:
struct date { ... } a, b, c; (при этом выделяется
соответствующая память под переменные a, b и c).
Описание без последующего списка не резервирует никакого пространства в памяти; определение только создает новый тип данных, который используется для объявления переменных.
Переменные структуры объявляются так же, как переменные других типов. Например,
date days;
или
struct date days; (запись в стиле Си)
Теперь переменная days имеет тип date.
При необходимости структуры можно инициализировать, помещая за объявлением список начальных значений элементов.
struct POINT { // объявление структуры POINT
int x; // определение элементов структуры x и y
int y;
} spot = { 20, 40 }; // Переменная spot имеет
// значения x = 20, y = 40
Поля структуры могут быть сами структурами, т.е. разрешается вкладывать структуры одна в другую, например:
struct Man {
char name [30], fam [20];
struct date bd;
int age;
};
Здесь name и fam - символьные массивы, соответственно размером 30 и 20 байт. Переменная bd представлена составным элементом типа date, переменная age содержит значения целого типа.
Как видно из спецификации, не обязательно указывать имя структуры. Такое определение структуры называется анонимным. Например,
struct {
char abbreviation[8];
char fullname[60];
} title;
Часто такие структуры применяются как вложенные структуры. Например,
struct PersonInPhoneBook {
struct {
char firstname[25];
char Name[15];
char lastname[25];
} name;
struct {
char country[35];
char town[25];
char street[35];
char home[35];
} address;
struct {
char code_country[5];
char code_town[5];
char number[7];
} phone;
} persons[100];
В С++ разрешено использовать массивы структур. Объявление выше описывает структуру PersonInPhoneBook и массив persons из ста элементов нового типа .
К отдельным частям структуры можно обращаться через составное имя. Формат обращения:
имя_структуры.имя_поля
Чтобы обратиться к отдельному элементу структуры, необходимо указать ее имя, поставить точку и сразу за ней написать имя нужного элемента. |
Например,
...
int a;
...
struct date birthday; /*объявление переменной birthday типа date
равнозначно объявлению date birthday;*/
a = birthday.month; /* переменной a присваивается
значение поля month переменной birthday*/
birthday.year = 2001; /* полю year переменной birthday
присваивается число 2001*/
Поскольку структура - это составной тип, Вы, наверное, уже догадываетесь, что существуют некоторые особенности их использования. Например, структуры не могут быть выведены на экран или введены с клавиатуры как единое целое, а только по одному элементу, нельзя сравнивать структуры в целом, их надо сравнивать элемент за элементом, однако разрешается присваивать одну структуру другой по их именам.
Теперь рассмотрим небольшой пример с использоваем структур. Написать программу сложения двух комплексных чисел. Напоминание: комплексное число состоит из двух частей: мнимой и действительной. При сложении мнимая часть складывается с мнимой, действительная с действительной.
Программа |
/* программа сложения двух комплексных чисел */ #include <iostream.h>
void main() { // описание структуры complex struct complex { float re; // действительная часть float im; // мнимая часть };
struct complex a, b, c; // объявление переменных типа complex float temp; // промежуточная переменная
cout << "Введите первое слагаемое: " << "\n действительная часть = "; cin >> temp; a.re = temp; cout << "\n мнимая часть = "; cin >> temp; a.im = temp;
cout << "Введите второе слагаемое: " << "\n действительная часть = "; cin >> temp; b.re = temp; cout << "\n мнимая часть = "; cin >> temp; b.im = temp;
// складываем действительные части c.re = a.re + b.re; // складываем мнимые части c.im = a.im + b.im;
// вывод результатов на экран cout << "Результат сложения = " << c.re << " + " << c.im << "i \n"; } |