
Структуры.pptx
- Количество слайдов: 20
Структуры и объединения 1
Формат описания структуры (struct) struct [имя типа] { тип 1 имя_поля 1; тип 2 имя_поля 2; … тип n имя_поля_n; }[список определений]; 2
Пример структуры «Студент» //описание структуры struct student { char fio[30]; int group, mark; }s 1, s 2; //создание переменной s 3 типа student и массива s с элементами типа student struct student s 3, s[40]; 3
Пример структуры «Дата» struct date { int day; int month; int year; }; 4
Создание и обращение переменных «Студент» //Объявление переменных struct date today, yesterday; //Изменение значение поля День today. day=1; //Изменение значение поля Год yesterday. year=2008; 5
Пример использования «Даты» #include <stdio. h> int main(void) { struct date // описание структуры { int day; int month; int year; }; struct date today; // объявление структурной переменной today. day=25; today. month=2; today. year=2010; printf(“Сегодня %d/%. 2 d/%d”, today. day, today. month, today. year); // %. 2 d производит заполнение нулем до 2 -х позиций return 0; } Результат: Сегодня 25/02/2010 6
Присвоение полей структуры 7
Увеличение даты на 1 день tomorrow. day=today. day+1; tomorrow. month=today. month; tomorrow. year=today. year; Некорректный результат: • если текущий день приходится на конец года • если текущий день приходится на конец месяца 8
Программа увеличения даты (начало) #include<stdio. h> int main(void) { struct date // описание структуры { int day; int month; int year; }; struct date today, tomorrow; const int days. Per. Month[12]={31, 28, 31, 30, 31}; printf(“Введите текущую дату: ”); scanf(“%d%d%d”, &today. day, &today. month, &today. year); 9
Программа увеличения даты (окончание) if (today. day!= days. Per. Month[today. month-1]) { tomorrow. day=today. day+1; tomorrow. month=today. month; tomorrow. year=today. year; } else if (today. month==12) //Конец года { tomorrow. day=1; tomorrow. month=1; tomorrow. year=today. year+1; } else //Конец месяца { tomorrow. day=1; tomorrow. month=today. month+1; tomorrow. year=today. year; } printf(“Завтра будет %. 2 d %d”, tomorrow. day, tomorrow. month, tomorrow. year); return 0; } Замечание: Не решена проблема високосного года! 10
Инициализация и присваивание //Объявление и инициализация struct date day 1={25, 2, 2010}, day 2={8, 3, 2010}; //Присвоение day 1=day 2; //Команда, копирующая содержимое одной области памяти в другую //копирует nbytes байт, начиная с адреса source и помещает их по адресу destn memcpy(char *destn, char &source, int nbytes) ////Пример использования //Описание структуры Книга struct book { char bookname[25]; char author[20]; float price; } //Объявление переменных struct book 1, book 2; //Копирование содержимого переменной book 1 в book 2 memcpy(&book 2, &book 1, sizeof(struct book)); 11
Вложенные структуры struct issue //выдача { char fio[20]; char data_vidachi[8]; struct books; } a; //Инициализация struct issue a={“Ivanov”, ” 04/11/2007”, {“Twilight”, ”St. Mayer ”, 23. 12}} //Обращение к полям a. fio=. . . a. books. author=. . . 12
Функция расчета количества дней в месяце int number. Of. Days(struct date d) { int days; //возвращаемое количество дней const int days. Per. Month[12]= {31, 28, 31, 30, 31}; if ((d. month==2) && ((d. year%4==0 && d. year%100!=0) || d. year%400==0)) days=29; else days=days. Per. Month[d. month-1]; return days; } 13
Функция расчета завтрашней даты struct date. Update (struct date today) { struct date tomorrow; if (today. day!= number. Of. Days(today)) //здесь идет обращение к описанной выше функции { tomorrow. day=today. day+1; tomorrow. month=today. month; tomorrow. year=today. year; } else if (today. month==12) //Конец года { tomorrow. day=1; tomorrow. month=1; tomorrow. year=today. year+1; } else //Конец месяца { tomorrow. day=1; tomorrow. month=today. month+1; tomorrow. year=today. year; } return tomorrow; } 14
Программа учитывающая високосный год #include<stdio. h> struct date // описание структуры { int day; int month; int year; }; //Функция расчета количества дней в месяце int number. Of. Days(struct date d) {---текст см. выше} //Функция расчета завтрашней даты struct date. Update (struct date today) {---текст см. выше} int main(void) { struct date thisday, nextday; printf(“Введите сегодняшнюю дату: ”); scanf(“%d%d%d”, &thisday. day, &thisday. month, &thisday. year); nextday=date. Update(thisday); printf(“%. 2 d %d”, &next. day, &next. month, &next. year); return 0; } 15
Массивы структур //Объявление struct date birthdays[15]; //Использование birthdays[1]. month=8; birthdays[1]. day=8; birthdays[1]. year=1990; ////Пример использования в программе получения последующих дней от дат в массиве //Функция расчета завтрашней даты struct date. Update (struct date today) {---текст см. выше} //главная функция. Для 15 -ти дней вычислить дату следующего дня struct date days[15]; // массив из 15 -ти дат for(int i=0; i<15; i++) { nextday=date. Update(days[i]); printf(“%. 2 d %d”, &next. day, &next. month, &next. year); } 16
Указатели на структуры //Создание указателя struct book * ptr_bk; //Объявление переменной struct books={“Twilight”, ”St. Mayer ”, 23. 12}; //Присвоение указателю адреса переменной в памяти ptr_bk=&books; //Обращение к полю структуры через адрес в памяти ptr_bk->author //Обращение к полю структуры через имя переменной books. author //Обращение к полю структуры через содержимое памяти по указателью (переменной структуры) (*ptr_bk). author 17
Объединения (union) //Описание объединения mixed union mixed { char c; float f; int I; }; //Объявление union mixed x; //Использование x. c=’K’; printf(“Символ = %c”, x. c); x. f=345. 65; x. i=count/2; 18
Программа, использующая объединение как поле структуры #include<stdio. h> #include<conio. h> int main(void) { struct { char fio[20]; int year; int pol; union { int children; int rang; } d; // поле, являющееся объединением назовем d } s 1; // определим структурную переменную s 1 clrscr(); printf("n. Введите ФИО "); gets(s 1. fio); printf("n. Введите ГР "); scanf("%d", &s 1. year); printf("n. Введите пол (1 -M, 2 -Ж)"); scanf("%d", &s 1. pol); 19
продолжение… switch (s 1. pol) // взависимости от пола по разному заполняем объединение d { case 1: {printf ("Введите воинскую обязанность (1 -нет 2 -солдат 3 -офицер)"); scanf ("%d", &s 1. d. rang); printf ("n ФИО %s, ГР %d, мужчина", s 1. fio, s 1. year); if ( s 1. d. rang==1) printf(" не военнообязанный"); else if ( s 1. d. rang==2) printf(" солдат"); else printf (" офицер"); break; } case 2: {printf ("Введите количество детей"); scanf ("%d", &s 1. d. children); printf ("n ФИО %s, ГР %d, женщина, детей %d", s 1. fio, s 1. year, s 1. d. children); } } getch(); return 0; } 20
Структуры.pptx