Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
53
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

98

14. СТРУКТУРЫ

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

Описание структуры делается так:

Struct имя структуры

{тип и имя элемента структуры 1; тип и имя элемента структуры2;

тип и имя элемента структуры2};

А затем новый структурный тип, как обычно, можно использовать для объявления новых переменных. Доступ к отдельным элементам структуры осуществляется операцией. (точка) для объекта и операцией –> (стрелка) для указателя на объект.

Например, мы создадим структуру типа date:

struct date {int day;

enum muns {jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}; int year; }

И затем объявим переменнуюden типа date. Тогда элементы такой структурной переменной будут обозначаться: den.day, den.muns, den.year.

Пример 14.1. Даны два класса учащихся. Определить, являются ли они параллельными.

#include <iostream> #include <iomanip> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

int main()

{struct clas {int god;

char bukwa;};

clas x,y;

cout<<Rus("\n введи номера классов "); cin>>x.god>>y.god;

cout<<Rus("\n введи буквы классов "); cin>>x.bukwa>>y.bukwa;

if ((x.god == y.god) && (x.bukwa != y.bukwa))

99

cout <<Rus(" ЯВЛЯЕТСЯ ПАРАЛЛЕЛЬНЫМИ "); else cout <<Rus(" не параллельны ") ;

cout<<"\n"; return 0;} char* Rus(const char* str)

{AnsiToOem(str, str_rus); return str_rus;}

Заметим, что в качестве элемента структуры может быть в свою очередь структура. Кроме того, из структур можно формировать и массивы.

Пример 14.2. Список учащихся состоит из10 записей. Каждая запись содержит фамилию и дату рождения ученика. Найти тех, кто родился в один и тот же день (год рождения может и отличаться).

// ученики, родившиеся в один день

#include <iostream> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

struct date {int day; int muns; int year;};

struct child {char fam[15]; date den; };

int main()

{child spis[11]; const int n=10; int i,k; for (i=1; i<=n; i++)

{cout<<Rus("\n введи фамилию ученика ")<<i<<' '; cin>> spis[i].fam;

cout<<Rus("введи день, месяц и год рождения ученика ") <<i<<" "; cin>>spis[i].den.day>>spis[i].den.muns>>spis[i].den.year;}; cout<<Rus("\n РОДИЛИСЬ В ОДИН ДЕНЬ \n");

for (i=1; i<=n-1; i++) for (k=i+1; k<=n; k++)

if ((spis[i].den.day==spis[k].den.day) && (spis[i].den.muns==spis[k].den.muns))

{cout<<spis[i].den.day <<" "<<spis[i].den.muns<<" "; cout<<spis[i].fam<<" "<< spis[k].fam; cout<<"\n";} return 0; }

char* Rus(const char* str)

{AnsiToOem(str, str_rus); return str_rus;}

При запуске получим примерно такой результат (рис. 8.34).

100

Рис. 8.34. Результат работы программы примера 14.2

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

Пример 14.3. Список учащихся состоит из10 записей. Каждая запись содержит фамилию ученика, класс и поля – оценки по семи предметам. Вывести фамилии и класс тех учеников, кто имеет пятерки по всем предметам и сформировать из них отдельный список

– список отличников.

101

// поиск отличников в списке

#include <iostream> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

struct clas{ int god;

char bukwa;};

struct chil { char fam[15]; clas cl;

int ocenky[8];};

chil spis[11], spisotl[11]; int k,s,i,j; int main()

{for (i=1; i<=10; i++)

{cout<<Rus("\n введи фамилию ученика, номер и букву его класса"); cin>>spis[i].fam >> spis[i].cl.god >> spis[i].cl.bukwa;

for (j=1; j<=7; j++) {cout<<Rus("введи оценку ")<<j<<" ";

cin>>spis[i].ocenky[j];}; cout<<"i="<<i; }; k=0;

for (i=1; i<=10; i++) { s=0;

for (j=1; j<=7; j++) if (spis[i].ocenky[j]==5) s=s+1; if (s==7) { k=k+1; spisotl[k]=spis[i]; } };

cout<<Rus("\n СПИСОК ОТЛИЧНИКОВ "); for (i=1; i<=k; i++)

{cout<<"\n"<<spisotl[i].fam<<" "<<spisotl[i].cl.god<<" " <<spisotl[i].cl.bukwa;}

return 0;}

char* Rus(const char* str) { AnsiToOem(str, str_rus);

return str_rus;

}

Практические задания

В задачах 14.1–14.4 одинаковое начало условия задачи:

Дан список учащихся из 10 записей. Каждая запись имеет поля: фамилия, имя, номер класса, буква класса.

14.1. Найти однофамильцев, обучающихся в одном классе.

14.2. Найти тезок (одинаковые имена), обучающихся в одном классе.

14.3. Найти двух учащихся, у которых совпадают имя и фамилия.

102

14.4. Вывести фамилию и первую букву имени для всех учеников указанного извне класса.

В задачах 14.5–14.8 одинаковое начало условия задачи:

Багаж пассажира характеризуется количеством вещей(целый тип) и общим весом вещей (вещественный тип). Дан список из сведений о багаже 10 пассажиров.

14.5. Найти багаж, средний вес одной вещи, в котором отличается не более, чем на 0,3 кг от общего среднего веса одной вещи по всему списку.

14.6. Найти число пассажиров, имеющих более двух вещей. 14.7. Число пассажиров, количество вещей которых превосхо-

дит среднее число вещей по всему списку.

14.8. Выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом менее 30 кг.

В задачах 14.9–14.10 одинаковое начало условия задачи:

Список книг состоит из 10 записей. Запись содержит поля: фамилия автора (тип string), название книги (тип строка), год издания (тип целый).

14.9. Найти названия книг данного автора, изданных с 1960 г. 14.10. Определить, имеются ли книги с названием «Информати-

ка» и если да, то сообщить фамилии авторов, год издания этих книг.

В задачах 14.11–14.16 одинаковое начало условия задачи:

Дана структура, задающая дату вида: Struct date {int day;

int month; int year;};

Пользуясь таким структурным типом, составить программу, определяющую:

14.11. дату следующего (относительно сегодняшнего) дня; 14.12. дату предыдущего дня;

14.13. дату, которая наcтупит через m дней;

14.14. дату, которая была за m дней до сегодняшнего дня; 14.15. число суток, прошедших от заданной даты d1 до даты d2; 14.16. день недели, выпадающий на дату d1, если известно, что

впервый день нашей эры был понедельник;

Взадачах 14.17–14.18 одинаковое начало условия задачи:

Дана структура, задающая время, вида: struct time { int hour;

int min; int sec;};