Объединения и перечислимые типы в языке С
Задание 2
- Выполните программу для всех возможных случаев.
- По программному коду запишите формулы для расчета площадей и длин граничных линий каждой из фигур.
- Предусмотрите ввод с клавиатуры параметров выбранной фигуры.
Пример 3. Напишите программу вывода на консоль дня недели до и после заданного номера дня недели с помощью перечислимого типа данных enum. Программный код решения примера:
#include <stdio.h>
#include <conio.h>
const int NUMDAYS = 7;
enum DAYS
{
Mon, // Monday,
Tue, // Tuesday,
Wed, // Wednesday,
Thu, // Thursday,
Fri, // Friday,
Sat, // Saturday,
Sun // Sunday
} day1, day2, day3; // сегодня, вчера, завтра
// Прототипы функций
int day_before(DAYS);
int day_after(DAYS);
void print_day(DAYS);
int main (void) {
printf("\n Days of week:\n 1) Monday, 2) Tuesday, 3) Wednesday, \
4) Thursday,\n 5) Friday, 6) Saturday, 7) Sunday\n");
printf("\n Select the number of days a week: ");
scanf_s("%d", &day1);
if (day1 > 7 || day1 < 1)
printf("\n\t Error!\n");
else {
day2 = day_before(day1);
day3 = day_after(day1);
printf("\n If today ");
print_day(day1);
printf("\n yesterday was ");
print_day(day2);
printf("\n and tomorrow will be ");
print_day(day3);
}
printf("\n\n Press any key: ");
_getch();
return 0; }
// Описание функции
int day_after(day) {
int aft, ex;
aft = (day+1) % NUMDAYS; // Остаток от деления по модулю
if (aft == 0)
ex = NUMDAYS;
else
ex = aft;
return ex; }
// Описание функции
int day_before(day) {
int pre, ex;
pre = (day-1) % NUMDAYS;
if (pre == 0)
ex = NUMDAYS;
else
ex = pre;
return ex; }
// Описание функции
void print_day(day) {
int day_i = day-1;
// Массив указателей
static char *days[] =
char *days[] =
{"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday" };
printf(" %s\n", days[day_i]); }В программе использован спецификатор класса памяти static для массива указателей, инициированных названиями дней недели. В таком случае массив указателей с заданным именем будет не доступен за пределами функции, где он определен. Для данной программы класс памяти static внутри функции print_day() инициирует выделение памяти для объекта (массив указателей) и служит определением массива указателей.
Возможный результат выполнения программы показан на рис. 14.3.
Задание 3
- В программе используйте кодовые страницы (Windows или DOS) для работы с русскими шрифтами (с подключением заголовка <locale.h> ).
- Видоизмените программу для выбора месяца года (с учетом п.1).
- Видоизмените программу для выбора одного из 7 цветов ( К аждый О хотник Ж елает З нать, Г де С идят Ф азаны – красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый) с выводом на консоль цвета и его кода RGB ( R ed, G reen, B lue – красный, зеленый, синий).
- Выполните изменения в программе, чтобы выбор дня недели осуществлялся при инициализации переменной day1, например, day1 = Sun.
- Напишите программу вывода на консоль названия месяца до и после заданного (введенного пользователем) номера месяца года с помощью перечислимого типа данных enum.
Пример 4. Напишите программу вывода количества дней для каждого месяца не високосного года на основе перечислимого типа данных [14.5].
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main (void) {
enum month {january = 1, february, march, april, may, june,july, august, september, october, november,
december } aMonth;
int days;
printf("\n Enter the number of the month (1 - 12): ");
scanf_s("%d", &aMonth);
switch (aMonth)
{
// 31 день
case january:
case march:
case may:
case july:
case august:
case october:
case december:
days = 31;
break;
// 30 дней
case april:
case june:
case september:
case november:
days = 30;
break;
case february:
days = 28;
break;
default:
printf("\n\t Wrong number of the month\n");
days = 0;
break;
}
if (days)
printf("\n The number of days of the month: %d\n", days);
if (aMonth == february)
printf("\n ... or 29 if it is a leap year\n");
printf("\n\n Press any key: ");
_getch();
return 0;
}Возможный результат выполнения программы показан на рис. 14.4.
Задание 4
- Произведите запись в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Создайте переменную перечислимого типа compX, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Предусмотрите вывод названия месяца и количества его дней.
- Предусмотрите количество дней в феврале для високосного года (без добавления разделительного союза "или").
Контрольные вопросы
- Какие отличия и общие черты имеются у структур и объединений?
- Для чего используются объединения в языке С? Как они определяются?
- Как осуществляется инициализация полей объединения?
- Как можно вывести значения полей объединения на дисплей?
- Для чего служит перечислимый тип данных в языке С? Как он определяется?
- Какие операции разрешено выполнять над объединениями?
- Какие значения по умолчанию присваиваются полям перечислимого списка?

