Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 8_Структуры и перечисления.doc
Скачиваний:
7
Добавлен:
10.03.2016
Размер:
220.16 Кб
Скачать

8.2. Массивы структур

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

//Листинг 8.2 Массивы структур

// demoStruct2.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cstdlib>

using namespace std;

#include <conio.h>

struct Marks

{

char name[80];

int phys;

int chem;

int maths;

};

int main()

{

const int n=3;

bool state;

char s [80];

Marks students[n];

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

{

cout << ("Student name: ") ;

gets(students[i].name);

students[i].phys=3+rand()%3;

students[i].chem=3+rand()%3;

students[i].maths=3+rand()%3;

}

do

{

cout<<"What is the student name? ";

gets (s);

if(!strcmp(s,"exit")) return 0;

state=true;

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

{

if(!strcmp(students[i].name,s))

{

state=false;

cout<<"Physiscs : "<<students [i] .phys<<endl;

cout<<"Chemistry: "<<students [ i ] . chem<<endl;

cout<<"Mathematics : "<<students [i] .maths<<endl;

break;

}

}

if (state) cout<<"There is no student with such name\n";

}while(true);

getch();

}

Пример выполнения программы может выглядеть следующим образом (жирным шрифтом выделен текст, вводимый пользователем):

Student name: Sergei Ivanov

Student name: Igor Petrov

Student name: Ivan Sidorov

What is the student name? Sergei Ivanov

Physics: 5

Chemistry: 5

Mathematics: 4

What is the student name? Ivan Sidorov

Physics: 3

Chemistry: 3

Mathematics: 4

What is the student name? Igor Petrovski

There is no student with such name

What is the student name? Igor Petrov

Physics: 4

Chemistry: 5

Mathematics: 4

What is the student name? exit

В программе командой Marks students [n] определяется массив students переменных структуры Marks из n элементов (предварительно объявлена

целочисленная константа const int n=3). Заполнение элементов массива выполняется в рамках оператора цикла. Индексная переменная i пробегает значения от 0 до n - 1 включительно. Каждый раз выводится запрос на ввод имени учащегося и это имя командой gets (students [i] . name) записывается в поле name переменной структуры students [i] - элемента массива students. Оценки по трем предметам для каждого учащегося определяются как случайные числа командами students[i].phys=3+rand()%3, students[i].chem=3+rand()%3 и students[i].maths=3+rand () %3. К базовой оценке 3 прибавляется целое случайное число в диапазоне от 0 до 2 включительно (результат команды rand () %3 — остаток от деления случайного числа на 3).

Командой char s [80] объявляется символьный массив, в который будет выполняться считывание вводимого пользователем имени учащегося для отображения его оценок. Этот массив используется в операторе цикла do{ . . . }while (true). Причем стоит обратить внимание, что в качестве проверяемого условия указано логическое значение true, что означает, что формально цикл бесконечный. Возможность выхода из этого цикла предусмотрена в самом цикле.

В начале цикла оператора командой cout << "What is the student name?" выводится запрос на ввод имени учащегося. Введенное пользователем имя с помощью команды gets (s) считывается и записывается в массив s. После того, как имя учащегося введено, выполняется условный оператор if (! strcmp (s, "exit") ) return 0. Этой командой предусмотрена возможность не только выхода из оператора цикла, но и завершения работы программы: если пользователь в качестве имени exit, работа программы завершается (инструкция return 0).

Там же командой state=true логической переменной state (переменная используется для индикации того, найдено совпадение имен или нет) присваивается значение true. После этого посредством оператора цикла выполняется последовательный перебор элементов массива students и производится сравнивание значений строк, записанных в массив s и в поле - массив students [i] .name. Для сравнения строк используется функция strcmp (). Напомним, что если строки совпадают, то в качестве значения функцией возвращается 0, поэтому в условном операторе указано условие ! strcmp (students [i] .name, s). Если условие истинно, командой state=false меняется состояние логической переменной state, после чего выводится информация об оценках соответствующего учащегося. В конце условного оператора размещена команда break для преждевременного выхода из оператора цикла - если совпадение найдено, продолжать поиск не имеет смысла.

Если совпадения нет (т.е, введенное пользователем имя не найдено при просмотре полей элементов массива students), переменная state имеет значение true. На этот случай предусмотрена команда if (state) cout << "There is no student with such name\n".