- •Методические указания к лабораторным работам
- •Лабораторная работа №1 простые программы с циклами и операторами консольного ввода/вывода
- •Задание
- •Описание примера
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №2 работа с текстовыми файлами, структурами данных и меню
- •Задание
- •Структурное программирование и функциональная декомпозиция системы
- •Функции
- •Организация меню в консольном приложении
- •Структуры данных
- •Операции с файлами
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №3 разработка и спецификация функций и модулей программы
- •Задание
- •Модульная структура программ
- •Параметры командной строки
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №4 разработка и спецификация структур данных, использование указателей и динамических массивов структур
- •Задание
- •Указатели
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №5 использование объектно-ориентированного программирования в разработке приложений
- •Задание
- •Конструкторы и деструкторы
- •Конструктор по умолчанию
- •Конструктор копирования
- •Массивы объектов
- •Friend-конструкции
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №6 использование наследования, полиморфизма и абстрактных классов
- •Задание
- •Наследование данных и методов
- •Полиморфизм и виртуальные функции
- •Абстрактный класс
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №7
- •Сложные структуры из объектов классов
- •Цель работы - изучение организации различных структур данных и разработка методов манипулирования данными.
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №8 разработка windows-интерфейса приложения
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №9 разработка и использование com-сервера
- •Задание
- •Шаблоны классов
- •Использование библиотеки atl для создания серверов сом
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Литература
Организация меню в консольном приложении
Для организации меню удобно использовать оператор switch:.
void Proc1() { …. }
void Proc2() { …. }
void Proc3() { …. }
void main()
{
unsigned c=l;
while (с)
{ // Цикл проверки printf ("\n\tSelect a function (0 - to quit)\n" "\n 0. Quit" "\n 1. Call proc 1" "\n 2. Call proc 2" "\n 3. Call proc 3 \n\n\t"); с = getch() -'0'; // Реакция пользователя
switch(c)
{
case 1: Proc1(); break;
case 2: Proc2(); break;
case 3: Proc3(); break;
case 0: break;
default: с =0;
}
}
}
Оператор switch позволяет передать управление на какую-то одну из множества ветвей типа case в зависимости от результата выражения в скобках (в данном случае, значения переменной с). Результатом выражения должно быть значение одного из целых типов.
Каждый case-оператор должен быть снабжен константной меткой целого типа (или сводимого к нему). Управление после вычисления выражения передается той ветви, метка которой совпадает со значением выражения. Если такой константы не нашлось, управление передается в ветвь default. Наличие этой ветви не обязательно. Если ее нет и нет подходящей константы, то ни одна из ветвей не получит управления. Допустимым считается случай, когда два или более case-оператора обозначают одну и ту же ветвь. Порядок следования ветвей произвольный, поэтому ветвь с меткой default может быть как первой, так и любой другой. Последовательность выполнения операторов в случае попадания в любую ветвь обычная, поэтому после выполнения всех операторов данной ветви управление передается в следующую ветвь, так как метки при выполнении игнорируются. Чтобы в конце ветви передать управление за пределы оператора switch, необходимо использовать оператор break.
Обратите внимание на выражение getch()-'0', использованное для анализа символа, введенного пользователем. Вычитая код символа '0' (равный 48), мы преобразуем код введенного символа в целое число, равное расстоянию символа в таблице кодов от символа '0'. Таким образом, если была введена цифра, то выражение дает число, равное этой цифре. Если введена не цифра, то переменная unsigned c содержит некоторое недопустимое число, которое игнорируется, и цикл запроса ввода повторяется.
Структуры данных
Структуры служат для объединения в одной переменной элементов разных типов. Например, нижеследующая структура Man объединяет элементы типов int и char:
struct Man // Структура как тип данных для учета людей
{
int Age; // Возраст
char Name[50]; //Имя
};
Идентификатор Man определяет новый тип данных, используемый в программе. Чтобы иметь возможность работы с реальной структурой, надо создать представитель типа, то есть определить переменную типа Man:
Man m;
Добраться до элемента структуры можно с помощью операции <точка>. Например, оператор m.Age=49; присваивает элементу Age структуры m типа Man значение 49. Если к полю структуры обращаются через указатель на структуру, то вместо символа «точка» необходимо использовать другую операцию выбора (->) — два символа («минус» и «больше»), образующие стрелку—указание на объект. Следующий пример показывает различные варианты обращения к полю Age структуры Man:
Man m, *p=&m, d[10], *pm[10];
m.Age=20;
р->Аge=20;
d[2].Age=31;
pm[0]->Age=23;
Языки С и C++ позволяют определить новый тип переменных, присвоив символьное имя (идентификатор) какому-то заданному типу. Например:
typedef int SHORT;
typedef char *PTRSTR;
typedef int *STRFUNC();
typedef struct
{
int nCode;
char aValue[30];
} IDENTRY;
SHORT a, b;
PTRSTR name, text;
STRFUNC x, y;
IDENTRY data;