Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - методичка2.doc
Скачиваний:
0
Добавлен:
01.01.2020
Размер:
403.97 Кб
Скачать

Работа с перечислениями (enum)

Тип данных перечисление (enumeration) используется для создания мнемонических (смысловых) идентификаторов для набора целых констант. Синтаксис для описания переменной типа перечисление подобен описанию структурной переменной двумя способами:

1) совместное описание шаблона и переменной:

enum [имя_шаблона] { имя1[ =константа ],…} переменная1,…;

2) определение переменной с предварительно описанным шаблоном:

enum имя_шаблона переменная1,…;

где части, заключенные в [ ] можно опускать;

enum – ключевое слово;

имя_шаблона – идентификатор, именующий шаблон;

имя1 и т.д. – именованные константы, которые по умолчанию начинаются с 0, а последующие увеличиваются на 1;

константа – явно задаваемое значение именованной константе, причем следующая увеличивается на 1, если не задана явно;

переменная1, . . . – идентификаторы переменных типа enum.

Пример. Описание шаблона и переменных типа перечисления:

еnum days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } weekday , anyday ;

Можно описать тип перечисления и использовать для определения переменных этого типа, например,

typedef enum { Saturday=0, Sunday=0, Monday, Tuesday, Wednesday, Thursday, Friday

} DAYS ; /* новый тип перечисления */

DAYS workday, anyday; /* переменные типа перечисления */

Имя переменной перечисления может использоваться всюду в выражениях и описаниях типов. Переменной типа enum могут присваиваться только значения, задаваемые перечисляемыми именованными константами.

Пример. В программе требуется определить по номеру введенного дня (от 0 до 6) предыдущий и последующий дни недели. Используется новый тип перечисления DAYS, применяемый в функциях для определения переменных типа перечисления. Для определения названий дней недели применяется массив указателей.

Программа:

#include<stdio.h>

#include<conio.h>

#define NUMDAYS 7 /* количество дней недели */

typedef enum { /* именованные константы, начиная с 0 : */

Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

} DAYS; /* объявление нового типа */

void main ( ) /* главная функция */

{ /* описание переменных и функций: */

DAYS today, before, after, day_before( ), day_after( );

void print_day (DAYS); /* прототип функции */

clrscr( ); /* очистка экрана */

do /* цикл диалога */

{ printf (“Введите день недели (от 0 до 6):”);

scanf (“%d”, &today); /* ввод номера дня недели */

if (today <0 || today >= NUMDAYS) /* проверка значения дня недели */

{ puts (“Ошибка!”);

goto next; /* переход к новому циклу */

}

after = day_after (today); /* определение следующего дня */

before = day_before (today); /* определение предыдущего дня */

printf (“если сегодня”);

print_day (today); /* вывод названия дня */

printf (“, то завтра будет”);

print_day (after); /* вывод названия дня */

printf (“,\na вчера был(а, о)”);

print_day (before) /* вывод названия дня */

printf (“.\n”); /* перевод курсора на экране */

next : printf (“Хотите продолжить? Если НЕТ, введите 0, “ “ДА – любую другую цифру:”);

scanf (“%d”, &today); /* ввод числа */

} while (today); /* окончание цикла диалога */

}

DAYS day_after (DAYS day) /*функция определения следующего дня */

{

return ((day+1) % numdays); /* остаток от деления по модулю */

}

DAYS day_before (DAYS day) /* функция для предыдущего дня */

{ int prev;

prev=(day-1) % NUMDAYS;

return (prev<0) ? (NUMDAYS –1) : prev ; /* если prev == –1, то NUMDAYS –1 == 6 */

}

void print_day ( DAYS day ) /* функция вывода дня недели */

{ int day_i = day; /* полученное значения дня недели */

static char days[ ]= { /* массив указателей на название дней недели: */

“воскресенье”, “понедельник”, “вторник”,

“среда”, “четверг”, “пятница”, “суббота”

} ;

printf (“%s”, days[day_i]); /* выбор из массива названия дня недели */

}

Результаты программы:

Введите день недели (от 0 до 6): 0

если сегодня воскресенье, то завтра будет понедельник,

а вчера был(а, о) суббота.

Хотите продолжить? Если НЕТ введите 0, ДА – любую другую цифру: 1

Введите день недели (от 0 до 6): 7

Ошибка!

Хотите продолжить? Если НЕТ введите 0, ДА – любую другую цифру:0