С++: Л/р№4 Структуры, объединения и перечисления

Лабораторная работа № 4 <br/>Структуры, объединения и перечисления (4 часа) <br/><br/>Цель работы: изучение правил описания и использования структур, объединений и перечислений. <br/><br/>Порядок выполнения работы <br/>1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются. <br/>2.Выполнить задания. <br/>3.Защитить выполненную работу. <br/><br/>Контрольные вопросы <br/>1.Как работают программы примеров? <br/>2.Какие преимущества даёт использование указателей при работе со структурами? <br/>3.Как передается структура функции? <br/><br/>Примеры <br/><br/>Пример 1. Демонстрация передачи и возврата целой структурной переменной. <br/>#include &lt;stdio.h&gt; <br/>#include &lt;string.h&gt; // заголовочный файл для...
1 июня 2004, вторник 20:31
4upuk4ek для раздела Блоги
Лабораторная работа № 4
Структуры, объединения и перечисления (4 часа)


Цель работы: изучение правил описания и использования структур, объединений и перечислений.

Порядок выполнения работы
1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются.
2.Выполнить задания.
3.Защитить выполненную работу.

Контрольные вопросы
1.Как работают программы примеров?
2.Какие преимущества даёт использование указателей при работе со структурами?
3.Как передается структура функции?

Примеры

Пример 1. Демонстрация передачи и возврата целой структурной переменной.
#include <stdio.h> 

#include <string.h> // заголовочный файл для работы со строками

typedef struct { /* внешний шаблон видим всюду в файле */
char name[20]; // имя автора
char title[44]; // наименование книги
int year; // год издания
float price; // цена
} BOOKS;

BOOKS example(BOOKS); /* прототип функции, принимающей и
возвращающей значение типа BOOKS */
void main(void)
{
BOOKS first = {
"Малютин А.Г.",
"Как правильно завалить студента",
2004,
500
}, ret;
ret = example(first);
/*
Распечатаем структурную переменную first для того, чтобы
убедиться в ее неизменности.
*/
printf("%-20s %-20s Год изд. %d. Цена - %5.2f\n",
first.name, first.title, first.year, first.price);
/*
Распечатаем структурную переменную ret.
*/
printf("%-20s %-20s Год изд. %d, Цена - %5.2f\n",
ret.name, ret.title, ret.year, ret.price);
}

BOOKS example(BOOKS first)
{
strcpy(first.name, "Толстой Л.Н."); // копирование строки
strcpy(first.title, "Крейцерова соната.");
first.year = 1990;
first.price = 5.75;
return first;
}

Пример 2. Демонстрация передачи и возврата структурной переменной через указатель.
#include <stdio.h>

#include <string.h>

typedef struct { /* внешний шаблон видим всюду в файле */
char name[20];
char title[44];
int year;
float price;
} BOOKS;

void example(BOOKS *); /* прототип функции, принимающей указатель на тип BOOKS */

void main(void)
{
BOOKS ret;
example(&ret); /* вызов функции с передачей указателя на
структурную переменную ret */
/*
Распечатаем структурную переменную ret.
*/
printf("%-20s %-20s Год изд. %d, Цена - %5.2f\n",
ret.name, ret.title, ret.year, ret.price);
}

void example(BOOKS * first)
{
strcpy(first -> name, "Толстой Л.Н.");
strcpy(first -> title, "Крейцерова соната.");
first -> year = 1990;
first -> price = 5.75;
}


Пример 3. Пример использования битовых полей в структурах.
#include <stdio.h> 


void main(void)
{
struct EXAMPLE {

int i: 2;
unsigned j: 2;
int : 2;
int k: 2;
int dummy: 8;
} my_struct;
my_struct.dummy = 0;
my_struct.i = 1;
my_struct.j = 3;
my_struct.k = -1;
printf("%x\n", my_struct);
printf("Отдельные поля: %d %u %d\n",
my_struct.i, my_struct.j, my_struct.k);
}


Пример 4. Пример использования объединения для приема и анализа нажатий клавиш на клавиатуре.
Функция bioskey() с параметром 0 или 1 возвращает двухбайтовый код нажатия клавиши. Об этих кодах известно, что если нажимается одиночная клавиша, помеченная буквой или цифрой, клавиша Еsc, Enter, то младший байт результата не равен нулю и содержит ASCII-код символа, соответствующего нажатой клавише. Если нажимается клавиша со стрелкой, клавиши F1-F12, комбинации Ctrl-клавиша, Alt-клавиша и другие им подобные, то младший байт кода клавиши равен нулю, зато старший байт уникально идентифицирует специальную клавишу или комбинацию клавиш.
#include <stdio.h> #include <bios.h>


void main(void)
{
union KEY {
int i;
char ch[2];
} press;
puts("Нажмите желаемую клавишу ...");
press.i = bioskey(0); /* прием с ожиданием нажатия клавиши*/

if(press.ch[0]) /* нажата ASCII-клавиша */
{
printf("Нажата ASCII-клавиша\n");
printf("ASCII-код %d, скэн-код %d\n", press.ch[0], press.ch[1]);
}
else /* нажата специальная клавиша */
{
printf("Нажата специальная клавиша\n");
printf("Код клавиши %d, скэн-код %d\n", press.ch[0], press.ch[1]);
}
}

Пример 5. Демонстрация применения перечислений.
#include <stdio.h> 


void main(void)
{
typedef enum
{
monday = 1,
tuesday,
wednesday,
thurday,
friday,
saturday,
sunday
} DAYS;
DAYS week_day;
int current_day, to_end, from_start;
fputs("Введите день недели (от 1 до 7): ", stdout);
scanf("%d", &current_day);
week_day = sunday;
to_end = week_day - current_day;
from_start = monday;
printf("Понедельник -%d-й день недели. Сейчас - %d-й. "\
"До конца недели - %d дня(дней)\n", from_start, current_day, to_end);
}

Задания

Задание 1.

Написать программу, в которой:
– описывается вложенная структура TimeDay, объединяющая в себе день недели Day (см. последний пример с перечислением) и время Time (в часах, минутах и секундах);
– созданы функции ввода дня и времени с клавиатуры и вывода их на экран (ввод времени и вывод осуществляется как по отдельным полям так и в секундах с последующим преобразованием в часы, минуты и секунды).

Решение задания
#include <stdio.h>

#include <stdlib.h>
#include <conio.h>
void main(void)
{
clrscr();
//
int Q;
long int d=1,c=0,s=0,m=0,h=0;
char* nedelja[7] = { "Понедельник","Вторник","Среда",
"Четверг","Пятница ","Суббота","Воскресенье"};
//
struct a{ long int chas;
long int minuta;
long int sekunda;
}Time,Sek;
//

typedef enum{ponedelnik = 1,vtor,sred,chet,pjat,subb,voskr}DenNed;
DenNed weekday;
//
struct b{DenNed weekend; struct a Time; struct a Sek;}TimeDay;

////////////////VVOD/////////////////////////////////////////
printf("vvedite den'");
scanf("%d",&c);
printf("vvedite chas");
scanf("%li",&(Time.chas));
printf("vvedite min");
scanf("%li",&(Time.minuta));
printf("vvedite sek");
scanf("%li",&(Time.sekunda));
printf("vvedite vremja v secundah");
scanf("%li",&(Sek.sekunda));
////////////////RAS4ET_PO_VVEDENNYM_D_M_4_S///////////////////
weekday=c%7;
Q=weekday;
printf("\nOmskoe vremja %lichasa(ov) %liminut(i) %lisekund(i) ",
Time.chas,Time.minuta,Time.sekunda);
printf("\nDen' nedeli %s",nedelja[Q-1]);
////////////////////////////////RAS4ET_PO_SEKYNDAM/////////////
d=Sek.sekunda/86400;
h=Sek.sekunda/3600-d*24;
m=(Sek.sekunda-(d-1)*86400)%3600/60;
s=(Sek.sekunda-(d-1)*86400)%3600%60;
printf("\nperevedennoe is sekund vremja %lichas(a) %liminut(y) %lisekund(y)",
h,m,s);
printf("\nDen' nedeli %s,\nego nomer %d",nedelja[d%7],d+1 );
getch();
}

По материалам ОмГУПС, все права защищены...


[Содержание ПС]