- •Учебное пособие по дисциплине «программирование»
- •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
- •Асинхронное программирование
- •Необходимость работать асинхронно
- •Список источников
Лабораторная работа №30. Разработка пользовательского интерфейса Цель работы:
Формирование навыков разработки графических пользовательских интерфейсов с использованием средств MS Visual Studio 2010.
Обеспечение: 1). Персональный компьютер; 2). Среда Microsoft Office; 3). Среда MS Visual Studio 2010
Задание
В соответствии с вариантом задания и спроектированным приложением разработать пользовательский интерфейс в среде визуального проектирования MS Visual Studio 2010.
Используя схемы и диаграммы (ЛР №29), выполнить проектирование сценариев диалога и построить граф диалога.
Выполнить кодирование обработчиков событий в среде MS Visual Studio 2010.
Оформить отчет. Содержание отчета:
тема лабораторной работы;
цель лабораторной работы;
ответы на контрольные вопросы;
задание на лабораторную работу;
окна с разработанным пользовательским интерфейсом;
таблицу компонентов, свойств, значений, используемых в приложении;
сценарии диалогов и графы диалогов;
листинг приложения;
вывод о проделанной работе.
Методические указания Контрольные вопросы
Что такое интерфейс?
Какие типы пользовательских интерфейсов существуют?
Перечислите этапы разработки пользовательских интерфейсов?
К какому типу интерфейсов будет относиться интерфейс, разработанный в данной лабораторной работе?
Какие модели интерфейсов существуют?
Какая модель интерфейса будет использована в данной работе?
Что такое диалог?
Какие типы диалогов существуют?
Какие формы диалога Вы знаете?
Какой тип диалога и какая форма диалога будет использована в данной работе?
Методы отладки и тестирования программы Теоретические сведения
В предыдущей главе, обсуждая жизненный цикл программы, мы отметили, что этап отладки и тестирования программного продукта — это обязательная и существенная часть процесса разработки. Подсчитано, что отладка занимает от трети до половины всего времени, отведенного на разработку. Даже после этого в готовом программном продукте зачастую остаются ошибки, выявляемые уже в процессе его эксплуатации. Поэтому отладке и тестированию надо уделить особое внимание.
Ошибки, сделанные в программе, можно разделить на два типа: синтаксические и семантические. Синтаксические ошибки возникают при нарушении правил записи программы на выбранном языке программирования. Современные компиляторы хорошо выявляют такие ошибки и выводят на экран толковые сообщения о типе ошибки и месте ее обнаружения. Эти сообщения позволяют быстро найти место ошибки и исправить ее. Дело несколько осложняется тремя обстоятельствами.
Во-первых, компилятор указывает не ту строку исходного текста программы, в которой произошла ошибка, а ту, в которой она проявилась. Эта строка может оказаться гораздо ниже, чем та, на которой сделана ошибка. Например, если вы забудете закончить описание класса на языке С++ точкой с запятой, как в следующем примере, то компилятор будет считать, что описание продолжается, и сообщит об ошибке только тогда, когда в этом "продолжении" возникнет какое-нибудь противоречие. Оно может проявиться спустя несколько десятков строк исходного текста, и вы будете ломать голову, недоумевая, какая же в этом месте может быть ошибка. Нужен некоторый опыт, чтобы сообразить, что ошибка находится гораздо выше.
class А{ int п;
public:
A(int n){ this.n = n;
}
}
class B{ } ;
Во-вторых, ошибка может произойти по разным причинам, компилятор же укажет только одну. Иногда компилятор честно сообщает, что не может определить причину ошибки, написав просто: "Syntax error". В большинстве случаев он указывает наиболее часто встречающуюся, по мнению разработчиков компилятора, ошибку, в вашей программе может оказаться совсем другая, поэтому принимайте сообщения компилятора не как истину, а только как один из возможных вариантов.
В-третьих, некоторые ошибки компилятор не в состоянии обнаружить. К ним относится деление на ноль или переполнение в арифметических выражениях, отрицательное или слишком большое значение индекса массива, и другие ошибки, возникающие в процессе вычислений. Такие ошибки проявляются уже на этапе выполнения (run time) программы и сообщает о них не компилятор, а исполняющая система. Их следует учитывать уже при проектировании, включая в программу обработку исключительных ситуаций.
Синтаксические ошибки обнаруживаются и устраняются довольно легко после нескольких запусков программы. Без исправления этих ошибок программа просто не будет работать. Гораздо труднее исправить семантические ошибки — ошибки в алгоритме работы программы.
Часто встречающаяся семантическая ошибка — неправильная расстановка скобок в выражении. Компилятор может проверить парность скобок, но если число открывающих скобок совпадает с числом закрывающих скобок, то компилятор не может сказать, в нужных ли местах они стоят. Здесь надо быть особенно внимательным и отдавать себе отчет в том, что вы хотите вычислить. Например, переменная х может получить значение, вычисленное следующим оператором:
double х = 2 * (а - Ь) / (а + Ь) + к * 5 * (а + Ь) / (а * Ь) ;
Но значение х вполне можно вычислить и таким оператором:
double х = 2 * (а - b) / (а + Ь) + к * (5 * а + Ь) / (а * Ь) ;
Компилятору обе записи "кажутся" правильными. Выбор того или иного оператора зависит от задачи, в которой вычисляется переменная х.
Еще одна распространенная ошибка, не обнаружимая компилятором, возникает из-за неправильной расстановки или отсутствия фигурных скобок.
В следующем примере, очевидно, переменная s, в которой накапливается сумма, должна изменяться при каждой итерации цикла, но компилятор не может "понять", что, фактически, она меняется только один раз: после выполнения цикла.
int m, S = 0;
for (int k = 0; k < a.sizeO - 1; k++) m = a[k + 1] - a[k]; s += 2 * m * m - 3 * m + 2;
Чтобы избежать таких ошибок, специалисты рекомендуют записывать тело любого составного оператора в фигурных скобках.
Семантические ошибки выявить гораздо труднее, чем синтаксические. Поскольку компилятор не может их заметить, он не выдает никаких сообщений. Программа может долго работать, не попадая в условия, в которых проявляются семантические ошибки. Бывает, что ошибочные результаты появляются только после нескольких месяцев эксплуатации программы. Поэтому для выявления таких ошибок зачастую приходится прикладывать специальные усилия, а в проекте необходимо предусматривать специальную фазу отладки и тестирования.
Процесс отладки проходит несколько этапов. Ошибку сначала надо обнаружить. Потом найти место ее появления, как говорят, локализовать ошибку. После этого ошибку надо устранить. Рассмотрим подробнее каждую стадию отладки.
