Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 15:

Объединения и перечислимые типы в языке С

< Лекция 14 || Лекция 15: 123 || Лекция 16 >

Задание 2

  1. Выполните программу для всех возможных случаев.
  2. По программному коду запишите формулы для расчета площадей и длин граничных линий каждой из фигур.
  3. Предусмотрите ввод с клавиатуры параметров выбранной фигуры.

Пример 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.

Пример выбора полей  перечисления по дням недели

Рис. 14.3. Пример выбора полей перечисления по дням недели

Задание 3

  1. В программе используйте кодовые страницы (Windows или DOS) для работы с русскими шрифтами (с подключением заголовка <locale.h> ).
  2. Видоизмените программу для выбора месяца года (с учетом п.1).
  3. Видоизмените программу для выбора одного из 7 цветов ( К аждый О хотник Ж елает З нать, Г де С идят Ф азаны – красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый) с выводом на консоль цвета и его кода RGB ( R ed, G reen, B lue – красный, зеленый, синий).
  4. Выполните изменения в программе, чтобы выбор дня недели осуществлялся при инициализации переменной day1, например, day1 = Sun.
  5. Напишите программу вывода на консоль названия месяца до и после заданного (введенного пользователем) номера месяца года с помощью перечислимого типа данных 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.

Подсчет количества дней в месяце года

Рис. 14.4. Подсчет количества дней в месяце года

Задание 4

  1. Произведите запись в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
  2. Создайте переменную перечислимого типа compX, где Х – номер компьютера, за которым выполняется лабораторная работа.
  3. Предусмотрите вывод названия месяца и количества его дней.
  4. Предусмотрите количество дней в феврале для високосного года (без добавления разделительного союза "или").

Контрольные вопросы

  1. Какие отличия и общие черты имеются у структур и объединений?
  2. Для чего используются объединения в языке С? Как они определяются?
  3. Как осуществляется инициализация полей объединения?
  4. Как можно вывести значения полей объединения на дисплей?
  5. Для чего служит перечислимый тип данных в языке С? Как он определяется?
  6. Какие операции разрешено выполнять над объединениями?
  7. Какие значения по умолчанию присваиваются полям перечислимого списка?
< Лекция 14 || Лекция 15: 123 || Лекция 16 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов