- •Глава 7. Типы определяемые пользователем Структуры
- •Задания
- •Формирование структуры
- •7.2 Массивы структур
- •Глава 8 Файлы.
- •Примеры составления программ на языке с.
- •Задания.
- •Глава 9. Численные методы
- •9.1 Приближенные методы решения уравнений.
- •Метод половинного деления
- •Метод хорд.
- •Метод Ньютона.
- •Метод простой итерации.
- •Задания
- •9.2 Решение систем уравнений
- •9.3 Вычисление интегралов
- •9.4 Вычисление сумм числовых рядов Вычисление конечных сумм
- •Список литературы
- •456776, Г. Снежинск, ул. Комсомольская, 8
Глава 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