Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Пример #1 на использование структур

Создайте структуру которая содержала бы следующую информацию о студентах: Фамилия, Имя, Возраст, Адрес, Телефон (если телефон отсутствует, то значение ноль). Организуйте ввод данных о 7 студентах и вывод фамилии и имени всех студентов у которых телефон начинается с 5.

Проведем анализ условия задачи. Необходимо организовать ввод информации о нескольких человеках (следовательно будем использовать массив для хранения данных о нескольких человеках), произвести поиск в массиве по заданому критерию (Телефон начинается с 5). Чтобы не усложнять самим себе задачу, для Телефона будем использовать символьный массив.

Таким образом, нам необходимо реализовать в программе следующие этапы: ввод данных в массив, поиск по критерию, вывод результата.

Ниже приведена реализация сказанного выше на С++ с дополнительными комментариями по ходу программы.

#include <iostream.h>

void main()

{

const int col=3; //количество студентов можно изменять здесь

struct {

char lastname[20], firstname[15], phone[7];

int age;

} students[col];

/*создали структуру и тут же объявили массив, каждый

элемент которого представляет собою описанную выше структуру*/

cout << "\nEnter data\n"; /*сообщаем пользователю, что

он должен ввести данные */

for (int i=0; i < col; i++)

{ //производим ввод данных

cout << "Surname is ";

cin >> students[i].lastname;

cout << "Name is ";

cin>>students[i].firstname;

cout << "Age is ";

cin >> students[i].age;

cout << "Phone is ";

cin >> students[i].phone;

cout << endl;

}

cout << "PC had found next records...\n";

//были найдены следующие записи

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

{

if (students[i].phone[0]=='5') /* действительно ли

телефон начинается с 5? */

{

cout << "\nSurname: "

<< students[i].lastname; //таки да, такая запись есть

cout << "\nName: " << students[i].firstname

<< "\n"; //значит выведем ее

};

}

}

Протокол выполнения программы

Enter data

Surname is Petrov

Name is Ivan

Age is 15

Phone is 515252

Surname is Ivanov

Name is Petr

Age is 16

Phone is 242424

Surname is Pronin

Name is Roman

Age is 21

Phone is 515151

PC had found next records...

Surname: Petrov

Name: Ivan

Surname: Pronin

Name is Roman

Замечание к задаче: Как Вы думаете, что и почему произойдет, если заменить

cout << "\nSurname: " << students[i].lastname;

на

cout << "\nSurname: " << students[i];

Пример #2 на использование структур

Расмотрим еще один пример на использование структур.

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

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

Размеры таблицы выбираются максимальными для данной задачи. Внутри таблицы есть однородные данные - оценки, которые выгодно представить в виде массива. Таким образом, этот пример демонстрирует использование массива внутри структуры и массива структур.

Если поле структуры является массивом, то к нему обращаются как к обычному массиву - через квадратные скобки. Например, str.ms[5] = 10; присвоение значение пятому элементу массива ms, который является полем структуры str. К массиву структур обращаются тоже через квадратные скобки: st[i].val = 3; - присвоение значения полю val i-ой структуре в массиве структур. В примере ниже встречается комбинация этих конструкций: exam[i].ball[j] - обращение к j-му элементу поля ball i-ой структуры массива структур exam.

Программа

#include<iostream.h>

float sr(int q, int ball[])

{

int i;

float s; /*Переменная - накопитель*/

for(i=0, s=0; i<q; i++)

s+=ball[i];

return s/q; /*Вернуть среднюю оценку*/

}

void main()

{

const int NAMEL = 30;

struct EXAM {

char name[30]; /* Имя студента*/

int ball[7]; /* Оценки по экзаменам */

};

int i,j; /* Переменные циклов */

int qs, /* Количество студентов */

qe; /* Количество экзаменов*/

struct EXAM exam[50]; /* Объявление массива структур*/

cout << "Количество студентов в группе (<50):";

cin >> qs;

cout << "Количество экзаменов (<7):";

cin >> qe;

for (i=0; i < qs; i++) /*Ввод оценок студентов*/

{

cout << "Введите фамилию студента: ";

cin >> exam[i].name;

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

{

cout << "Введите оценку по " << j+1 << "экзамену";

cin >> exam[i].ball[j];

}

}

/*Вывести на экран список студентов по категориям*/

float sr1;

cout << "\nОтличники (ср. балл > 4.5):";

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

if(sr(qe, exam[i].ball) > 4.5)

cout << endl << exam[i].name;

cout << "\nХорошисты (ср. балл > 3.5 и <= 4.5): ";

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

{

sr1 = sr(qe, exam[i].ball);

if(sr1 <= 4.5 && sr1 > 3.5)

cout << endl << exam[i].name;

}

cout << "\nТроечники (ср. балл <= 3.5 и > 2.5):";

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

{

sr1 = sr(qe, exam[i].ball);

if(sr1 <= 3.5 && sr1 > 2.5)

cout << endl << exam[i].name;

}

cout << "\nДвоечники (ср. балл <= 2.5):";

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

if(sr(qe, exam[i].ball) <= 2.5)

cout << endl << exam[i].name;

cout << endl;

}

Протокол выполнения программы

Количество студентов в группе (<50):2

Количество экзаменов (<7): 2

Введите фамилию студента: Иванов

Введите оценку по 1-му экзамену: 4

Введите оценку по 2-му экзамену: 5

Введите фамилию студента: Петров

Введите оценку по 1-му экзамену: 2

Введите оценку по 2-му экзамену: 2

Отличники (ср. балл > 4.5):

Хорошисты (ср. балл > 3.5 и <= 4.5):

Иванов

Троечники (ср. балл <= 3.5 и > 2.5):

Двоечники (ср. балл <= 2.5):

Петров