
- •Общие методические указания по выполнению лабораторных работ
- •Работа со структурами данных (struct)
- •Описание структур и структурных переменных
- •Вложенные структуры
- •Обращение к полям структуры
- •Например, для переменных, описанных шаблоном
- •Массивы структурных переменных
- •Объявление типов в языке Си
- •Введите оценки ( 2 целых числа от 3 до 5 ): 5 5
- •Использование структур в функциях
- •Использование глобальных данных
- •Обработка вложенных структур
- •Толстой л.Н. Война и мир 1995 6 Структуры и поразрядные операции
- •Поразрядные операции
- •Сдвиговые поразрядные операции
- •Операнд сдвиг число_битов
- •Структуры с битовыми полями
- •Работа с объединениями (union)
- •Работа с перечислениями (enum)
- •Работа с файлами Понятие файла и потока ввода-вывода данных в компьютере
- •Открытие и закрытие файла
- •Потоки стандартного ввода-вывода
- •Повторное открытие файла
- •Позиционирование указателя записи-чтения
- •Int fseek (указатель_потока, (long) смещение, начало_отсчета),
- •Начало_отсчета может принимать следующие значения:
- •Функции файлового ввода-вывода
- •Посимвольный ввод-вывод
- •Вывод символов из файла:
- •Построчный ввод-вывод Пусть описан символьный массив
- •Форматированный ввод-вывод данных
- •Блоковый ввод-вывод
- •Работа с динамическими структурами данных Динамическое распределение памяти
- •Очередь
- •Рекурсивные функции
- •Деревья
Работа с перечислениями (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