Объединения и перечислимые типы в языке С
Задание 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, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Предусмотрите вывод названия месяца и количества его дней.
- Предусмотрите количество дней в феврале для високосного года (без добавления разделительного союза "или").
Контрольные вопросы
- Какие отличия и общие черты имеются у структур и объединений?
- Для чего используются объединения в языке С? Как они определяются?
- Как осуществляется инициализация полей объединения?
- Как можно вывести значения полей объединения на дисплей?
- Для чего служит перечислимый тип данных в языке С? Как он определяется?
- Какие операции разрешено выполнять над объединениями?
- Какие значения по умолчанию присваиваются полям перечислимого списка?