Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_ЛабРаботы.doc
Скачиваний:
13
Добавлен:
28.09.2019
Размер:
716.8 Кб
Скачать

Организация меню в консольном приложении

Для организации меню удобно использовать оператор 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;