- •Учебное пособие по дисциплине «программирование»
- •11.03.02 «Инфокоммуникационные технологии и системы связи»
- •1. Основные структуры управления 8
- •12. Стандартная библиотека шаблонов 264
- •13. Обработка исключительных ситуаций. 284
- •15. Многопоточное программирование, thread-safety 298
- •19. Работа с базой данных 400
- •20. Разработка сетевых приложений 435
- •21. Жизненный цикл программы 449
- •22. Методы отладки и тестирования программы 478
- •Введение
- •Основные структуры управления
- •Краткая теория Описание среды разработки Microsoft Visual Studio
- •Создание простейшего приложения
- •Этапы компиляции
- •Цель и порядок работы
- •Примеры
- •Контрольные вопросы
- •Задание
- •Содержание отчета
- •Краткая теория
- •Идентификатор
- •Константы и переменные
- •Описание и инициализация переменных
- •Int k; // это переменная целого типа int
- •Основные типы данных
- •Операторы языка программирования
- •1 Присваивание
- •2 Ввод-вывод данных с использованием библиотеки потокового ввода вывода
- •3 Манипуляторы и форматирование ввода-вывода
- •4 Ввод вывод с использованием стандартной библиотеки ввода-вывода stdio.H
- •5 Математические функции
- •Операции
- •Приоритеты операций в выражениях
- •Примеры программ Пример программы нахождения среднего арифметического из двух целых чисел и одного вещественного числа:
- •Программа вычисления значения выражения:
- •Лабораторная работа № 2. Проектирование программ линейной структуры Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •Содержание отчета
- •Операторы ветвления и выбора Краткая теория
- •Оператор ветвления
- •Оператор выбора
- •Оператор switch
- •2 Цикл с предусловием (do while)
- •3 Цикл с параметром (for)
- •2 Операторы передачи управления
- •1 Оператор безусловного перехода (goto)
- •2 Оператор возврата из функции (return)
- •3 Оператор выхода из цикла (break)
- •4 Оператор перехода к следующей итерации цикла (continue)
- •2 Вложенные циклы
- •3 Итерационные циклы
- •Лабораторная работа № 5. Итерационные и арифметические циклы. Вложенные циклы Цель и порядок работы
- •Контрольные вопросы
- •Содержание отчета
- •Массивы
- •Массивы.
- •Базовый_тип имя_массива [размерность];
- •Int a[100];//массив из 100 элементов целого типа
- •2 Многомерные массивы
- •3. Сортировка массивов
- •3.1. Сортировка с помощью включения
- •3.2. Сортировка методом простого выбора
- •3.3. Сортировка методом простого обмена
- •2 Многомерные массивы (матрицы)
- •Операции с указателями
- •Указатели и массивы
- •Динамические массивы
- •Примеры программ
- •Лабораторная работа № 7. Указатели и ссылки. Имя массива как указатель. Динамические массивы Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •1 Указатели
- •2 Имя массива как указатель
- •Содержание отчета
- •Функции Краткая теория
- •1 Описание функций
- •2 Параметры функции
- •3 Передача массивов в функцию
- •4 Указатели на функции
- •Лабораторная работа № 8. Функции Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •1 Функции, параметры функций
- •2 Передача массивов в функцию (одномерные массивы)
- •3 Передача массивов в функцию (многомерные массивы)
- •Содержание отчета
- •Краткая теория
- •1 Понятие отладки
- •2 Разновидности ошибок
- •2.1 Ошибки этапа компиляции
- •2.2 Ошибки этапа выполнения
- •2.3 Логические ошибки
- •3 Методы отладки
- •3.1 Установка точки прерывания
- •3.2 Выполнение программы до точки прерывания
- •3.3 Прекращение отладки
- •3.4 Пошаговое выполнение программы и трассировка
- •3.5 Выполнение программы до курсора
- •3.6 Отслеживание значений переменных во время выполнения программы
- •3.7 Создание условной точки останова
- •4 Работа с отладчиком
- •4.1 Выполнение программы по шагам без захода в функцию
- •4.2 Выполнение программы по шагам с заходом в функцию (трассировка)
- •Цель и порядок работы
- •Контрольные вопросы
- •Задание
- •Задание для выполнения работы
- •1 Часть первая
- •2 Часть вторая
- •2 Перечисления (enum)
- •3 Структуры (struct)
- •4 Объединения (union)
- •5 Битовые поля
- •6 Пример
- •Лабораторная работа № 10. Типы данных, определяемые пользователем. Структуры и объединения Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •Содержание отчета
- •Краткая теория
- •1.1 Ввод-вывод строк
- •1.2 Операции со строками
- •Ввод и вывод русских букв в консоли можно сделать разными способами.
- •1.3 Некоторые Стандартные функции работы со троками
- •Режимы открытия файлов
- •Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •2 Рекурсивные функции
- •3 Шаблоны функций
- •4 Функции с переменным количеством параметров
- •Лабораторная работа № 12. Перегрузка функций. Шаблоны функций Цель и порядок работы
- •Контрольные вопросы
- •Варианты заданий
- •1 Перегрузка функций
- •2 Добавление новых файлов в проект в среде разработки Visual Studio 2008
- •3 Пример работы с многофайловыми проектами
- •4 Препроцессор
- •Лабораторная работа № 13. Модули. Многофайловые проекты. Препроцессор. Цель и порядок работы
- •Контрольные вопросы
- •Задание
- •Варианты заданий
- •Содержание отчета
- •Введение в OpenGl.
- •Работа с OpenGl при помощи
- •Библиотеки glut
- •Создание консольного приложения, использующего OpenGl
- •Лабораторная работа №14. Создание приложения с использованием OpenGl. Рисование примитивов. Цель работы:
- •Задания
- •Примеры рисования многоугольников:
- •Конструктор копирования и операция присваивания Конструктор копирования
- •Перегруженная операция присваивания
- •Лабораторная работа № 15. Классы Цель работы:
- •Контрольные вопросы
- •Задания для самостоятельной работы
- •Перегрузка операций и дружественные функции. Указатели на функции, методы и члены данных Перегрузка операций и дружественные функции.
- •Указатели на функции
- •В заданиях 11 – 20 перегрузить операции ввода и вывода исходных данных.
- •Виртуальные функции. Абстрактные классы.
- •Пространства имен
- •Лабораторная работа № 17. Наследование. Открытое и закрытое наследование. Цель работы:
- •Контрольные вопросы
- •Задания на самостоятельное выполнение
- •Содержание отчета
- •Шаблоны (На самостоятельное изучение)
- •Шаблон класса
- •Шаблонные функции.
- •Шаблонные методы
- •Стандартная библиотека шаблонов
- •Stl Строки
- •Строковые потоки
- •Итераторы
- •Итераторы обеспечивают доступ к элементам в коллекции
- •Алгоритмы
- •Предикаты
- •Заключение
- •Лабораторная работа № 18. Стандартная библиотека шаблонов Цель.
- •Порядок выполнения работы.
- •Содержание отчета.
- •Варианты заданий.
- •Обработка исключительных ситуаций. Теория
- •Введение
- •"Создание" исключений
- •Операторы throw без параметров
- •Заключение
- •Цель работы:
- •Контрольные вопросы
- •Задание
- •Содержание отчета
- •Краткая теория
- •Многопоточное программирование, thread-safety
- •Инициализация потока
- •Id потока
- •Пространство имен this_thread
- •Одновременный доступ к ресурсам
- •Содержание отчета
- •Механизмы синхронизации Вводные понятия синхронизации потоков
- •Работа с потоками с помощью функций WinApi Несинхронизированные потоки
- •Критические секции
- •Мьютексы (взаимоисключения)
- •События
- •Потокобезапасность
- •Типовые задачи синхронизации
- •Механизм семафоров
- •Семафорное решение задачи о философах
- •Лабораторная работа № 21. Семафоры: защита критических секций, условная синхронизация Цели и задачи:
- •Порядок выполнения лабораторной работы
- •Варианты заданий
- •Содержание отчета
- •Создание проекта библиотеки динамической компоновки (dll)
- •Добавление класса в библиотеку динамической компоновки
- •Создание приложения, ссылающегося на библиотеку динамической компоновки
- •Использование функциональных возможностей библиотеки классов в консольном приложении
- •Запуск приложения
- •Создание проекта статической библиотеки
- •Добавление класса в статическую библиотеку
- •Создание приложения, ссылающегося на статическую библиотеку
- •Использование функциональных возможностей статической библиотеки в консольном приложении
- •Запуск приложения
- •Создание нового проекта библиотеки классов
- •Добавление класса в библиотеку классов
- •Создание приложения, ссылающегося на библиотеку классов
- •Использование функциональных возможностей библиотеки классов в консольном приложении
- •Запуск приложения
- •Создание dll
- •Использование dll без библиотеки импорта. Динамическое подключение.
- •Результаты работы dllrun02.Exe
- •Цель работы:
- •Постановка задачи
- •Варианты
- •Методические указания
- •Содержание отчета
- •Краткая теория
- •Метасимволы в регулярных выражениях
- •Поиск в тексте по шаблону
- •Редактирование текста
- •Цель работы:
- •Задание
- •Содержание отчета
- •Краткая теория Философия .Net Framework
- •Библиотека Windows Forms
- •Класс Form, MessageBox и компоненты Класс Form
- •Диалог MessageBox
- •Компоненты и панель ToolBox
- •Работа с элементами управления
- •Цель работы:
- •Задания
- •Содержание отчета
- •Пример 1.
- •Пример 2.
- •Редактирование таблицы базы данных ms Access в среде Visual Studio без написания программного кода
- •Чтение всех записей из таблицы бд ms Access на консоль с помощью объектов классов Command и DataReader
- •Создание базы данных ms Access в программном коде
- •Добавление записей в таблицу базы данных ms Access
- •Чтение всех записей из таблицы базы данных c помощью объектов классов Command, DataReader и элемента управления DataGridView
- •Чтение данных из бд в сетку данных DataGridView с использованием объектов классов Command, Adapter и DataSet
- •Обновление записей в таблице базы данных ms Access
- •Удаление записей из таблицы базы данных с использованием sql-запроса и объекта класса Command
- •Лабораторная работа № 25. Работа с базой данных Цель работы:
- •Порядок выполнения работы
- •Методические указания
- •Варианты заданий
- •1. Библиотека
- •2. Университет
- •3. Оптовая база
- •4. Производство
- •5. Сеть магазинов
- •6. Авторемонтные мастерские
- •7. Деканат
- •8. Договорная деятельность организации
- •9. Поликлиника
- •10. Телефонная станция
- •11. Спорт
- •12. Сельскохозяйственные работы
- •13. Городской транспорт
- •14. География
- •15. Домоуправление
- •16. Аэропорт
- •7. Прикладной
- •1. Аппаратный (Физический)
- •Общая схема работы с сокетами в Windows
- •Пример. Клиентское и серверное приложение
- •Клиент:
- •Сервер:
- •Лабораторная работа № 26. Разработка сетевых приложений Цель работы:
- •Порядок выполнения работы
- •Задания:
- •Варианты
- •Содержание отчета
- •Жизненный цикл программы
- •Программный продукт и определение требований к продукту Программный продукт
- •Определение требований к продукту
- •Требования к функционированию продукта
- •Требования к надежности продукта
- •Условия эксплуатации продукта
- •Требования к техническим средствам
- •Требования к установке продукта
- •Техническое задание
- •Упражнения
- •Лабораторная работа №27. Разработка технического задания на программный продукт Цель работы:
- •Задание
- •Варианты заданий
- •Контрольные вопросы
- •Содержание отчета
- •Проектирование программного продукта
- •Разработка эскизного проекта
- •Разработка технического проекта
- •Рабочий проект
- •Упражнения
- •Задание
- •Отладка
- •Тестирование
- •Сопровождение продукта
- •Модификация продукта
- •Цикличность разработки продукта
- •Контрольные вопросы
- •Лабораторная работа №29. Проектирование структуры приложения Цель работы:
- •Задание
- •Методические указания Контрольные вопросы
- •Лабораторная работа №30. Разработка пользовательского интерфейса Цель работы:
- •Задание
- •Методические указания Контрольные вопросы
- •Методы отладки и тестирования программы Теоретические сведения
- •Обнаружение ошибки
- •Программа не дает результатов
- •Программа дает неверные результаты
- •Программа дает правдоподобные результаты
- •Устранение ошибки
- •Средства отладки
- •Упражнения
- •Тестирование
- •Unit-тестирование
- •Методики тестирования
- •Функциональное тестирование
- •Тестирование обращений к базам данных
- •Тестирование бизнес-логики программы
- •Нагрузочное тестирование
- •Стрессовое тестирование
- •Тестирование интерфейса пользователя
- •Тестирование безопасности и прав доступа
- •Тестирование инсталляции программного продукта
- •Наборы тестов
- •Процесс тестирования
- •Особенности тестирования объектно-ориентированных программ
- •Средства тестирования
- •Обеспечение качества программного продукта
- •Упражнения
- •Контрольные вопросы
- •Лабораторная работа № 31. Тестирование и отладка приложения Цель работы:
- •Задание
- •Методические указания Контрольные вопросы
- •Boost::threads. Многопоточное программирование Создание потока
- •Мьютексы
- •Условные переменные
- •Локальная память потока
- •Однократно вызываемые функции
- •Инициализация параметров
- •Основные алгоритмы
- •Небольшое отступление от алгоритма, для описания его параметров. Эти параметры используются во всех алгоритмах, но рассмотрим их только здесь.
- •Вспомогательные средства
- •Содержание отчета
- •Boost::bind (на самостоятельное изучение) Использование с глобальной функцией
- •Использование с указателями на функции члены
- •Использование с указателем на член данных
- •Каскадное использование связывателей
- •Перегруженные операторы
- •Использование ссылок
- •Пример использования.
- •Boost::asio (::io_service) (Самостоятельное изучение) boost::asio основы
- •Boost::asio асинхронный
- •Использование boost::asio
- •Асинхронное программирование
- •Необходимость работать асинхронно
- •Список источников
Boost::asio (::io_service) (Самостоятельное изучение) boost::asio основы
boost::asio на самом деле, хоть и называется библиотекой асинхронной, но может выполнять и синхронные, и асинхронные операции. Вся библиотека при этом завязана на объекты класса boost::asio::io_service – именно asio::io_service предоставляет программе связь с нативными объектами ввода/вывода. Соответственно, что бы ваша программа могла работать с boost::asio, нужно создать хотя бы один объект этого класса и уже после этого “аттачить” все другие объекты к нему, например вот так:
boost::asio::io_service io_service; boost::asio::ip::tcp::socket socket(io_service); |
Подключить только что созданный сокет к серверу тоже не представляет из себя проблемы:
boost::system::error_code ec; // здесь будет записана ошибка, если она была socket.connect(server_endpoint, ec); // server_endpoint задаёт куда подключаемся |
После того как мы подключили объекты ввода-вывода (в данном случае socket) к asio::io_service – этот сервис будет осуществлять взаимодействие с операционной системой и получать/отправлять данные.
Boost::asio асинхронный
Тот вариант, что мы рассмотрели выше – это синхронное взаимодействие, т.е., в данном случае это значит, что пока происходит подключение – наша программа “зависнет” до того момента, пока подключение не выполнится, либо не произойдёт ошибка. Если же мы хотим что бы работа boost::asio была асинхронной, надо идти немного другим путём, который тоже предусмотрен в библиотеке. Для работы с асинхронными операциями мы должны передать в функцию так называемый completion handler, или, говоря по русски, функцию, которая будет вызвана, когда операция завершится (т.е. либо подключится, либо возникнет ошибка):
void your_completion_handler(const boost::system::error_code& ec) { // тут обрабатываем подключение либо ошибку }
boost::asio::io_service io_service; boost::asio::ip::tcp::socket socket(io_service); socket.async_connect(server_endpoint, your_completion_handler); |
Все асинхронные функции в boost::asio работают
именно по такому принципу. С одной
стороны, это довольно удобно для
программирования – логика работы каждой
из функций отделена от других, с другой
стороны это может может показаться Вам
немного непривычным. Но, я уверен, Вы
освоитесь
Использование boost::asio
Приведу короткий и простой пример использования boost::asio , это код примера из самого boost, лишь перевёл комментарии:
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
if (argc != 3) // если аргументы не заданы или заданы не все
{
std::cout << "Usage: sync_client <server> <path>\n";
std::cout << "Example:\n";
std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n";
return 1;
}
boost::asio::io_service io_service; // основной класс asio
// Получаем список конечных точек для указанного сервера
tcp::resolver resolver(io_service);
tcp::resolver::query query(argv[1], "http");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;
// Перебираем эти конечные точки и пробуем подключиться
tcp::socket socket(io_service);
boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end)
{
socket.close();
socket.connect(*endpoint_iterator++, error);
}
if (error) // подключиться не удалось
throw boost::system::system_error(error);
// Формируем запрос к веб-серверу. Указываем "Connection: close" что бы
// сервер закрыл соединение как только отправит нам данные. Это
// позволит нам узнать что отправка завершенна как только возникнет EOF
boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET " << argv[2] << " HTTP/1.0\r\n";
request_stream << "Host: " << argv[1] << "\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";
// Отправляем сформированный запрос веб-серверу.
boost::asio::write(socket, request);
// Читаем ответ сервер. streambuf response примет все данные
// он сам будет увеличиваться по мере поступления данных от сервера.
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");
// Проверяем что бы не было ошибок.
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/") // ошибка
{
std::cout << "Invalid response\n";
return 1;
}
if (status_code != 200) // если код ответа не 200, то это тоже ошибка
{
std::cout << "Response returned with status code " << status_code << "\n";
return 1;
}
// Читаем ответ. Он закончится пустой строкой.
boost::asio::read_until(socket, response, "\r\n\r\n");
// Парсим заголовки
std::string header;
while (std::getline(response_stream, header) && header != "\r")
std::cout << header << "\n";
std::cout << "\n";
// Выводим в лог
if (response.size() > 0)
std::cout << &response;
// Теперь читаем до конца
while (boost::asio::read(socket, response,
boost::asio::transfer_at_least(1), error))
std::cout << &response;
if (error != boost::asio::error::eof) // ошибка
throw boost::system::system_error(error);
}
catch (std::exception& e) // возникло исключение
{
std::cout << "Exception: " << e.what() << "\n";
}
return 0;
}
Вот эти 100 строк кода работают как HTTP-клиент и позволяют нам читать страницы с веб-серверов. Мне кажется, что код не сложный, особенно, когда он с комментариями.
