Студопедия — ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Для переменной типа объединения предусмотреть ввод, и вывод элементов ее полей.
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Для переменной типа объединения предусмотреть ввод, и вывод элементов ее полей.






Пример 1. Для переменной типа объединения предусмотреть ввод, и вывод элементов ее полей.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #define N 79 union hold { char str[N+1]; double bigf; char ch; int digit; }; int main (void) { double D2; int i = 0, digit2; char str2[80], ch2; union hold fit, *PTR = &fit; //PTR = &fit; // вариант взятия адреса printf("\n\t Fields of the \"union\":\n \ 1) string, 2) double, 3) character, 4) integer\n"); do { printf("\n Enter %d field of the \"union\": ", i+1); _flushall(); if (i == 0) { gets_s(str2, N); strcpy_s(PTR->str, strlen(str2) + 1, str2); printf(" The first field: %c\n", PTR->str); i++; } else if (i == 1) { scanf_s("%lf", &D2); printf(" The second field: %1.4f\n", PTR->bigf = D2); i++; } else if (i == 2) { scanf_s("%c", &ch2); printf(" The third field: %c\n", PTR->ch = ch2); i++; } else { scanf_s("%d", &digit2); printf(" The fourth field: %d\n", PTR->digit = digit2); i++; } } if (i < 4); printf("\n 1 field: %c\n 2 field: %1.4f\n \ 3 field: %c\n 4 field: %d\n", \ PTR->str, PTR->bigf, PTR->ch, PTR->digit); printf("\n Press any key: "); getch(); return 0; }

Результат выполнения программы показан на рис. 14.1.


Рис. 14.1. Результат заполнения полей объединения

Как видно из рис. 14.1, заполнение четырех полей объединения возможно поочередно. После «прохода» всех полей строчные поля не сохранились.

Задание 1

1. В программе переставьте очередность полей объединения. Проанализируйте результат выполнения измененной программы.

2. Определите размерность объединения с помощью оператора sizeof().

3. Введите свою фамилию, средний балл за последнюю сессию, начальную букву своего имени и год своего рождения.

4. Вместо операции стрелка примените операцию точка.

5. С помощью оператора typedef создайте переменную объединения с именем compX, где Х – номер компьютера, на котором выполняется лабораторная работа.

Пример 2. Написать программу, в которой информация о геометрических фигурах представляется на основе комбинированного использования переменных типа структуры и объединения. В качестве фигур принять эллипс с заданными полуосями, окружность с заданным радиусом и координатами центра, равнобочную трапецию с заданными основаниями и боковыми сторонами. Общие компоненты фигур: площадь фигур, периметр трапеции, длина окружности, длина эллипса.

Программный код решения примера

#include <stdio.h> #include <conio.h> // #define _USE_MATH_DEFINES #include <math.h> const double pi = 3.14159265358979; int main (void) { double Ltr, AK; struct figure { double area, perimeter; int type; union select { double R[3]; // circle double E[2]; // ellipse double Trap[3]; //trapezium } geom_fig; } geom, *PTR = &geom; printf("\n Figures: 1 - Circle, 2 - Ellipse, 3 - trapezium"); printf("\n\n Select figure: "); scanf_s("%d", &(PTR->type)); switch (PTR->type) { case 1: PTR->geom_fig.R[0] = 5.0; // радиус круга PTR->geom_fig.R[1] = 1.5; // x0 PTR->geom_fig.R[2] = 2.5; // y0 PTR->area = pi*(PTR->geom_fig.R[0])*(PTR->geom_fig.R[0]); PTR->perimeter = 2*pi*(PTR->geom_fig.R[0]); printf("\n %d) Circle:\n R = %1.4f, \ x0 = %1.4f, y0 = %1.4f, area = %1.4f, L = %1.4f\n", \ PTR->type, PTR->geom_fig.R[0], PTR->geom_fig.R[1], PTR->geom_fig.R[2], \ PTR->area, PTR->perimeter); break; case 2: PTR->geom_fig.E[0] = 5.0; // a - большая полуось PTR->geom_fig.E[1] = 4.0; // b - малая полуось PTR->area = pi*(PTR->geom_fig.E[0])*(PTR->geom_fig.E[1]); PTR->perimeter = 2.0*pi*(PTR->geom_fig.E[0])*\ (PTR->geom_fig.E[0] - PTR->geom_fig.E[1])/(PTR->geom_fig.E[0]); printf("\n %d) - Ellipse:\n a = %1.4f, b = %1.4f, \ area = %1.4f, L = %1.4f\n", \ PTR->type, PTR->geom_fig.E[0], PTR->geom_fig.E[1], \ PTR->area,PTR->perimeter); break; case 3: PTR->geom_fig.Trap[0] = 12.0;// AD PTR->geom_fig.Trap[1] = 7.0; // BD PTR->geom_fig.Trap[2] = 5.5; // h AK = (PTR->geom_fig.Trap[0] - PTR->geom_fig.Trap[1])/2.0; Ltr = (PTR->geom_fig.Trap[0] + PTR->geom_fig.Trap[1]) + \ 2.0*sqrt(AK*AK + (PTR->geom_fig.Trap[2])*(PTR->geom_fig.Trap[2]) ); PTR->area = 0.5*(PTR->geom_fig.Trap[0] + PTR->geom_fig.Trap[1])*\ (PTR->geom_fig.Trap[2]); PTR->perimeter = Ltr; printf("\n %d) Trapezium:\n AD = %.4f, BC = %.4f, h = %.4f, \ Area = %1.4f, L = %1.4f\n", \ PTR->type, PTR->geom_fig.Trap[0], PTR->geom_fig.Trap[1], \ PTR->geom_fig.Trap[2], PTR->area, PTR->perimeter); break; default: printf("\n\t Error! Break\n"); break; } printf("\n Press any key: "); getch(); return 0; }

В программе одним из полей структуры geom является объединение. В зависимости от выбора типа – метки активного элемента type – происходит вывод на консоль параметров фигуры, ее площади и длины граничной линии (периметр трапеции и т. д.). Компонент type используется для указания, какой из компонентов (полей) объединения geom_fig является активным в данный момент. Подобную структуру называют переменной структурой.

Определение числа p (M_PI) может быть выполнено с помощью препроцессорного определения #define _USE_MATH_DEFINES и подключения математической библиотеки #include <math.h>;. В программе это определение числа p закомментировано. Используется прямое определение числа p с помощью типа const double.

Результат выполнения программы представлен на рис. 14.2.


Рис. 14.2. Результат выбора и расчета плоской фигуры

Задание 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(" %c\n", days[day_i]); }

В программе использован спецификатор класса памяти static для массива указателей, инициированных названиями дней недели. В этом случае массив указателей с заданным именем будет недоступен за пределами функции, где он определен. Для данной программы класс памяти static внутри функции print_day() инициирует выделение памяти для объекта (массив указателей) и служит определением массива указателей.


Возможный результат выполнения программы приведен на рис. 14.3.

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

Задание 3

1. В программе используйте кодовые страницы (Windows или DOS) для работы с русскими шрифтами (с подключением заголовка <locale.h>;).

2. Видоизмените программу для выбора месяца года (с учетом п. 1).

3. Видоизмените программу для выбора одного из 7 цветов (каждый охотник желает знать, где сидят фазаны – красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый) с выводом на консоль цвета и его кода RGB (red, green, blue – красный, зеленый, синий).

4. Выполните изменения в программе, чтобы выбор дня недели осуществлялся при инициализации переменной day1, например day1 = Sun.

5. Напишите программу вывода на консоль названия месяца до и после заданного (введенного пользователем) номера месяца года с помощью перечислимого типа данных enum.

Пример 4. Написать программу вывода количества дней для каждого месяца не високосного года на основе перечислимого типа данных [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. Какие значения по умолчанию присваиваются полям перечислимого списка?

 

 







Дата добавления: 2015-09-06; просмотров: 486. Нарушение авторских прав; Мы поможем в написании вашей работы!



Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Основные структурные физиотерапевтические подразделения Физиотерапевтическое подразделение является одним из структурных подразделений лечебно-профилактического учреждения, которое предназначено для оказания физиотерапевтической помощи...

Конституционно-правовые нормы, их особенности и виды Характеристика отрасли права немыслима без уяснения особенностей составляющих ее норм...

Толкование Конституции Российской Федерации: виды, способы, юридическое значение Толкование права – это специальный вид юридической деятельности по раскрытию смыслового содержания правовых норм, необходимый в процессе как законотворчества, так и реализации права...

Значення творчості Г.Сковороди для розвитку української культури Важливий внесок в історію всієї духовної культури українського народу та її барокової літературно-філософської традиції зробив, зокрема, Григорій Савич Сковорода (1722—1794 pp...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия