Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачник_Главы 7-9.doc
Скачиваний:
7
Добавлен:
15.08.2019
Размер:
2.6 Mб
Скачать

Глава 7. Типы определяемые пользователем Структуры

Языки программирования Си/С++ поддерживают определяемые пользователем типы данных, например, структуры.

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

Пример определения структуры:

struct student

{

char fam[20];

char name[20];

int kurs;

char group[5];

};

Для того, чтобы объявить переменные типа struct student, можно написать:

struct student stud1;

Доступ к полям структуры осуществляется с помощью операции ”точка”.

Например, printf("Курс: %d",stud1.kurs);

Структуры, как и переменные другого типа, могут объединяться в массивы структур. Чтобы объявить массив структур, необходимо сначала задать шаблон структуры, а затем объявить массив:

struct student students[100];

Пример 7.1

Сформировать запись библиотечной картотеки: шифр, автор, наименование книги, количество страниц, год издания, издательство. Вывести запись в виде библиотечной карточки.

/*************************************************/

/* Структуры */

/* Сформировать запись библиотечной картотеки: */

/* шифр, автор, наименование книги, количество */

/* страниц, год издания, издательство. */

/* Вывести запись в виде библиотечной карточки. */

/*************************************************/

#include <stdio.h>

#include <conio.h>

#define size 20

struct kartochka // структура типа kartochka

{

int shifr; // шифр

char avtor[30]; // автор

char nazv[40]; // название книги

int kol; // количество

int god; // год издания

char izdat[20]; // издательство

};

void main()

{

clrscr();

// Объявление переменной типа kartochka

struct kartochka book;

// Ввод данных в карточку

printf("\n\t Ввод данных о книге: \n\n");

printf("\t Автор: ");

gets(book.avtor);

printf("\t Название: ");

gets(book.nazv);

printf("\t Количество страниц: ");

scanf("%d",&book.kol);

printf("\t Год издания: ");

scanf("%d",&book.god);

fflush(stdin); // очистка буфера

printf("\t Издательство: ");

gets(book.izdat);

printf("\t Шифр: ");

scanf("%d",&book.shifr);

// Вывод карточки

printf("\n\n\t Вывод данных о книге: ");

printf("\n \t ----------------------------------");

printf("\n \t \t КАРТОЧКА: \n\n");

printf("\n \t Шифр: %d",book.shifr);

printf("\n \t Автор: %s",book.avtor);

printf("\n \t Название: %s",book.nazv);

printf("\n \t Количество страниц: %d",book.kol);

printf("\n \t Год издания: %d",book.god);

printf("\n \t Издательство: %s",book.izdat);

printf("\n\t -----------------------------------");

getch();

}

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

Ввод данных о книге:

Автор: Пушкин А.С.

Название: Евгений Онегин

Количество страниц: 217

Год издания: 2005

Издательство: Детская литература

Шифр: 12345

Вывод данных о книге:

----------------------------------

КАРТОЧКА:

Шифр: 12345

Автор: Пушкин А.С.

Название: Евгений Онегин

Количество страниц: 217

Год издания: 2005

Издательство: Детская литература

-----------------------------------

Язык С++ предусматривает потоковый ввод/вывод как альтернативу функциям printf() и scanf().

Простой пример:

printf(Введите число);

scanf(%d, &n);

Используя потоковый ввод/вывод эти операции можно записать следующим образом:

cout<<Введите число;

cin>>n;

В первом операторе используются стандартный выходной поток cout и операция << (операция передачи в поток). Во втором операторе используются стандартный входной поток cin и операция >> (операция извлечения из потока). Эти операции не требуют форматирующих строк и спецификаторов преобразования для указания на тип входных и выходных данных, а также операции взятия адреса & переменной n.

Для организации потокового ввода/вывода программы на С++ должны содержать заголовочный файл iostream.h.

В следующем примере приведем пример использования функций cin и cout.

Пример 7.2

Ввести информацию о сотрудниках фирмы: фамилия, пол, зарплата. Определить сотрудников, имеющих максимальную зарплату.

/*************************************************/

/* Структуры */

/* Ввести информацию о сотрудниках фирмы: */

/* фамилия, пол, зарплата. */

/* Определить сотрудников, */

/* имеющих максимальную зарплату. */

/*************************************************/

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#define size 20

struct people // структура типа people

{

char fam[20]; // фамилия

char pol; // пол

float zarp; // зарплата

};

void main()

{

clrscr();

int i,kol;

struct people sotrud[size]; // массив сотрудников

float max; // максимальная зарплата

int k=0; // кол-во человек с макс.зарплатой

cout<<"\n \t Введите количество сотрудников: ";

cin>>kol;

cout<<"\t Введите данные о сотрудниках: ";

for(i=0; i<kol;i++)

{

fflush(stdin);

cout<<"\n\t Фамилия: ";

cin>>sotrud[i].fam;

cout<<"\t Пол: ";

cin>>sotrud[i].pol;

cout<<"\t Зарплата: ";

cin>>sotrud[i].zarp;

}

// Вывод списка сотрудников

cout<<"\n \t Данные о сотрудниках: \n";

cout<<"\n Фамилия " <<"\t Пол " <<"\t Зарплата \n";

cout<<" -----------------------------------------";

for(i=0; i<kol;i++)

{

cout<<"\n"<<sotrud[i].fam <<"\t ";

cout<<sotrud[i].pol<<"\t"<<sotrud[i].zarp;

}

// Поиск максимальной зарплаты

max=sotrud[0].zarp;

for(i=1; i<kol;i++)

{

if(sotrud[i].zarp>max)

max=sotrud[i].zarp;

}

// Вывод сотрудников с максимальной зарплатой

cout<<"\n\n Сотрудник(и) с макс.зарплатой "<<max;

cout<<" рублей:";

for(i=0; i<kol;i++)

if(sotrud[i].zarp==max)

{

cout<<"\n\t"<<sotrud[i].fam;

k++;

}

cout<<"\n Всего "<<k<<" чел.";

getch();

}

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

Введите количество сотрудников: 6

Введите данные о сотрудниках:

Фамилия: Кошкин

Пол: м

Зарплата: 7900

Фамилия: Собакин

Пол: м

Зарплата: 10700

Фамилия: Коровин

Пол: м

Зарплата: 8090

Фамилия: Овечкин

Пол: м

Зарплата: 10700

Фамилия: Мышкина

Пол: ж

Зарплата: 5700

Фамилия: Быкова

Пол: ж

Зарплата: 10700

Данные о сотрудниках:

Фамилия Пол Зарплата

-----------------------------------------------

Кошкин м 7900

Собакин м 10700

Коровин м 8090

Овечкин м 10700

Мышкина ж 5700

Быкова ж 10700

Сотрудник(и) с максимальной зарплатой 10700 рублей:

Собакин

Овечкин

Быкова

Всего 3 чел.

Примечание.

Используя потоковый ввод/ вывод, необходимо помнить, что при вводе строк извлечение происходит до ближайшего пробела. Поэтому, если необходимо ввести из входного потока всю строку целиком (до символа '\n'), например, ”улица Дзержинского 100 -90”, используют функции ввода строки getline(). Пример рассмотрен в следующем примере 7.3

Пример 7.3

Создать массив данных об абитуриентах.

Внести сведения:

Ф.И.О., дата рождения, место рождения, оценки за три экзамена, средний балл. Вывести данные об абитуриентах со средним

баллом выше 4.

/*************************************************/

/* Структуры */

/* Создать массив данных об абитуриентах. */

/* Внести сведения: */

/* Ф.И.О., дата рождения, место рождения, */

/* оценки за три экзамена, средний балл. */

/* Вывести данные об абитуриентах со средним */

/* баллом выше 4. */

/*************************************************/

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#define size 20

struct date // структура типа date

{

int day; // день

int month; // месяц

int year; // год

};

struct people // структура типа people

{

char fam[20]; // фамилия

char im[20]; // имя

char otch[20]; // отчество

struct date bd; // дата рождения

char adres[20]; // адрес

int mark[3]; // оценки за три экзамена

float sred; // средний балл

};

void main()

{

clrscr();

int i,j;

struct people abitur[size]; // массив структур

int kol;

cout<<"\n \t Введите количество абитуриентов: ";

cin>>kol;

cout<<"\t Введите данные об абитуриентах: ";

for(i=0; i<kol;i++)

{

cin.get(); // считывание символа из потока

// и очистка буфера

cout<<"\n \t Фамилия: ";

cin>>abitur[i].fam;

cout<<"\t Имя: ";

cin>>abitur[i].im;

cout<<"\t Отчество: ";

cin>>abitur[i].otch;

cout<<"\t Дата рождения: ";

cin>>abitur[i].bd.day;

cin>>abitur[i].bd.month;

cin>>abitur[i].bd.year;

cin.get();

cout<<"\t Адрес: ";

cin.getline(abitur[i].adres,20);

// cin.getline - читает всю строку с пробелами

cout<<"\t Введите оценки: ";

for (j=0;j<3;j++)

cin>>abitur[i].mark[j];

}

// Нахождение среднего балла оценок

for (i=0;i<kol;i++)

{

abitur[i].sred=0;

for (j=0;j<3;j++)

abitur[i].sred+=abitur[i].mark[j];

abitur[i].sred=abitur[i].sred/3;

}

// Вывод массива записей

cout<<"\n\t Абитуриенты со сред.баллом выше 4: \n";

cout<<"\t----------------------------------------";

for(i=0; i<kol;i++)

{

if (abitur[i].sred>=4)

{

cout<<"\n \n \t Фамилия, имя: ";

cout<<abitur[i].fam <<"\t";

cout<< abitur[i].im;

cout<<"\n \t Оценки: ";

for (j=0;j<3;j++)

cout<<" "<<abitur[i].mark[j];

cout<<"\t Средний балл: "<<abitur[i].sred;

}

}

getch(); }

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

Введите количество абитуриентов: 4

Введите данные об абитуриентах:

Фамилия: Березкин

Имя: Иван

Отчество: Иванович

Дата рождения: 12 12 90

Адрес: Ленина 100-99

Введите оценки: 3 4 5

Фамилия: Соснова

Имя: Елена

Отчество: Михайловна

Дата рождения: 17 11 91

Адрес: Победы 70-73

Введите оценки: 3 3 3

Фамилия: Рябинина

Имя: Анна

Отчество: Борисовна

Дата рождения: 21 12 90

Адрес: Дзержинского 1-1

Введите оценки: 5 4 4

Фамилия: Тополев

Имя: Сергей

Отчество: Сергеевич

Дата рождения: 13 10 90

Адрес: Ломинского 14-12

Введите оценки: 5 5 5

Список абитуриентов со средним баллом выше 4:

-----------------------------------------

Фамилия, имя: Березкин Иван

Оценки: 3 4 5 Средний балл: 4

Фамилия, имя: Рябинина Анна

Оценки: 5 4 4 Средний балл: 4.333333

Фамилия, имя: Тополев Сергей

Оценки: 5 5 5 Средний балл: 5