- •Учебное пособие по дисциплине «программирование»
- •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
- •Асинхронное программирование
- •Необходимость работать асинхронно
- •Список источников
Программа дает неверные результаты
Эта ситуация встречается чаще всего. Она может возникнуть по самым разным причинам. К ней могут привести и простая ошибка в наборе текста программы, и неверный алгоритм решения задачи. Например, вы можете случайно исказить оператор присваивания:
double х = 3.45 * а[к - 1] + 2.5 * а[к + 1];
и написать, поставив вместо десятичной точки звездочку: double х = 3.45 * а[к - 1] + 2*5 * а[к + 1];
Из-за этой мало заметной ошибки значение переменной х изменится в четыре раза.
Такие ошибки легко обнаружить, но очень трудно локализовать. Зачастую приходится делать полную трассировку программы, поставив отладочную печать после почти каждого оператора, тем самым тщательно отслеживая изменения переменных. Трассировкой не следует злоупотреблять: в результате выдается масса информации, которую трудно проанализировать. Поэтому на практике к этому методу прибегают только в самых крайних случаях.
Гораздо чаще для обнаружения ошибки в программу устанавливаются контрольные точки (breakpoints), в те места, где ошибки наиболее вероятны. Программа останавливается на каждой контрольной точке. После останова можно просмотреть значения переменных и продолжить выполнение программы до следующей контрольной точки. Многие инструментальные средства программирования позволяют даже изменить переменные в контрольной точке и продолжить выполнение программы с другими значениями.
Еще одно средство поиска ошибок — пошаговое выполнение программы, при котором она приостанавливается после выполнения каждого оператора. После останова можно просмотреть промежуточные значения переменных и выполнить следующий оператор. Разумеется, полное пошаговое выполнение всей программы займет слишком много времени. Поэтому его обычно начинают с какой-либо контрольной точки и прекращают, как только ошибка найдена.
Еще труднее найти ошибки в алгоритме решения задачи. Они могут накапливаться понемногу от оператора к оператору. По отладочной печати трудно отследить момент появления таких ошибок. Пошаговое выполнение программы тоже не поможет найти ее. В таком случае надо проверять сам алгоритм и убеждаться в его правильности. Методы решения этой непростой задачи обсуждаются в следующей главе.
Программа дает правдоподобные результаты
Это самая коварная ситуация. Получив результаты, близкие к предполагаемым, вы можете подумать, что программа работает правильно, и передать ее в эксплуатацию.
Как убедиться в том, что результаты правильны, а не правдоподобны? Здесь помогает тестирование программы. Тщательно подобранные тесты позволят отличить правдоподобные значения от правильных результатов. Как правило, одного набора тестов недостаточно для убедительного доказательства неверности работы программы. Специалисты-тестировщики всегда подбирают несколько наборов тестов так, чтобы точнее выявить дефекты программы.
Выявить правдоподобные результаты часто помогает прием, заимствованный из математики. Обычно мы проверяем правильность вычисления корня уравнения, подставляя его в уравнение и убеждаясь в том, что левая часть уравнения равна правой его части. Тем не менее, математикам давно известно, что из того, что левая часть уравнения, при подстановке в него приближенно вычисленного корня, почти совпадает с правой частью, вовсе не вытекает, что этот корень близок к настоящему корню уравнения.
Особенность таких некорректных задач заключается в том, что небольшое изменение исходных данных приводит к сильному изменению результата, хотя такой сильный скачок не вытекает из условий задачи. Это дает способ проверки правильности правдоподобных результатов. При тестировании программы надо провести серию испытаний с близкими значениями исходных данных и следить за тем, как меняются результаты ее работы. Неоправданно сильное изменение результатов при незначительном изменении данных должно вызвать сомнение в правильности вычислений, если только это не вытекает из условий задачи.
Локализация ошибки
После обнаружения ошибки надо найти место ее возникновения, как говорят, локализовать ошибку. Это не такая простая задача, как кажется поначалу. Ошибка может быть сделана где-то в начале исходного текста программы, а обнаружена позже, спустя несколько десятков строк исходного текста или даже в другой функции. Для локализации приходится делать обратный просмотр исходного текста программы, начиная от места обнаружения ошибки. В этом помогает трассировка программы, расстановка контрольных точек и пошаговое выполнение. Контрольная точка устанавливается в некотором отдалении от места обнаружения ошибки, в том месте, где по вашим соображениям может начаться неправильное выполнение программы. После этого тщательно проверяется участок программы от контрольной точки до места обнаружения ошибки.
Иногда такое обратное отслеживание хода выполнения программы не помогает. Тогда приходится прослеживать ее работу по исходному тексту, просматривая выполнение операторов со значениями, полученными из контрольной печати, и доходя до места обнаружения ошибки. Такое прослеживание часто называют прокруткой программы. Прокрутка программы — трудоемкое занятие, ее лучше проводить на небольшом участке программы, сузив предварительно участок прокрутки с помощью отладочной печати.
Когда и прокрутка не помогает, приходится проверять логику выполнения программы. Проверка начинается с места обнаружения ошибки. Просматривается полученная в этой точке отладочная печать, и проводятся рассуждения вроде следующих: "Такие результаты мог дать оператор А или оператор В. Но оператор В в этом случае не может выполняться. Значит, посмотрим на оператор А. Оператор А дал значение С, а оно могло получиться только в ситуации D. Чтобы возникла ситуация D, надо, чтобы...". На каждом логическом шаге приходится делать отладочную печать и небольшую прокрутку. Привлечение логических рассуждений помогает быстрее проделать эту трудную работу, поскольку концентрирует внимание только на тех переменных, которые могут получить ошибочные значения, а таких переменных немного.
Наконец, каждый программист знает, что при попытке объяснить ошибку, которая никак не поддается локализации, своему коллеге по работе или постороннему консультанту, неожиданно, в процессе рассказа, самому автору программного кода вдруг становится ясно, в чем заключается ошибка. Иногда даже письменное изложение проблемы помогает найти ее решение. Это объясняется тем, что при последовательном изложении проблемы мысли приходят в порядок, выстраивается логическая цепочка, приводящая к решению задачи. Поэтому очень важно периодически обсуждать возникающие проблемы всей командой разработчиков. Такие обсуждения не только позволяют устранять трудности, возникающие в процессе разработки, но и держат программистов в курсе всех задач, решаемых на каждом этапе реализации проекта.
