Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод реком Программ КР.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
325.12 Кб
Скачать

Int Age; // Возраст

double Rating; // Успеваемость

} BestStudent;

int main()

{

BestStudent = {"ИВАНОВА", "ПР. ЛЕНИНА 9-А", 17, 10.57};

// Вывод на печать содержимого полей экземпляра структуры

cout << " СТУДЕНТ Ф_ТА ЭИ \n";

cout << "\n ИМЯ:\t" << BestStudent.Name

<< "\n Адрес:\t" << BestStudent.Address

<< "\n Возраст:\t" << BestStudent.Age

<< "\n Успеваемость:\t" << BestStudent.Rating << endl;

return 0;

}

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

Методика создания массивов структур – точно такая же, как и при создании массивов. Например, что бы создать массив из 100 экземпляров BestStudent структуры Student, необходима следующая запись:

Student BestStudent[100];

В результате будет создан сто элементный массив BestStudent типа Student. Следовательно, каждый элемент массива, такой как BestStudent[0] или BestStudent[99], - это объект типа Student, и доступ к его полям можно организовать уже рассмотренным выше образом:

cin >> BestStudent[0].Name; // Инициализация поля Name

cout << >> BestStudent [99].Rating; //Вывод на экран содержимого поля Rating

Следует иметь в виду, что сам BestStudent - это массив, а не структура, так что конструкции типа BestStudent.Name являются ошибочными.

Рассмотрим следующий пример. Требуется разработать программу, последовательно формирующую в процессе диалога с пользователем документ такого содержания:

СВЕДЕНИЯ О СТОИМОСТИ ВЫДАННЫХ ДЕТАЛЕЙ

N/n

ДЕТАЛЬ

СТОИМОСТЬ .

ВЫДАНО

РАСХОД

n

а[8]

t

k

c = t * k

ИТОГО:

s1

s2

s3

Диалог должен осуществляться по следующему сценарию:

и т.д.

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

Из постановки задачи следует, что запись содержит несколько разнотипных полей: порядковый номер детали (n/n), для его хранения целесообразно использовать тип int; наименование детали (ДЕТАЛЬ) – здесь может использоваться массив, например из 8-и символов; количество выданных деталей (ВЫДАНО) – данному полю соответствует тип int; а полю стоимости детали (РАСХОД) – тип double. Очевидно, что применение массива в данном случае не представляется возможным. Действительно, массив может содержать несколько элементов, однако каждый элемент должен быть одного типа, что противоречит условию задачи. Выходом из создавшейся ситуации будет применение структуры – более универсальной формы данных, чем массив.

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

// Программа 2

// Решение экономической задачи с использованием массивов структур

#include <iostream>

#include <iomanip> // Для использования манипуляторов потока setw()

// и setprecision()

const int n=3; // Размерность обрабатываемого массива структур

struct zap // Рабочий вариант объявление структуры zap,

{

char a[8];

double t;

int k;

double c;

} ;

int main()

{

double s1,s2,s3; // Расчетные суммы

zap zapis[n]; // Отдельное определение массива zapis[n] экземпляров

// структур типа zap

// Ввод исходных данных:

cout << "ФОРМИРОВАНИЕ ДОКУМЕНТА: \n";

cout << "ДОКУМЕНТ ДОЛЖЕН СОДЕРЖАТЬ " << n

<< " СТРОКИ - ЗАПИСИ: \n";

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

{

cout << "\nФОРМИРОВАНИЕ " << i + 1 << " ЗАПИСИ";

cout << "\nВВЕДИТЕ НАЗВАНИЕ ДЕТАЛИ (НЕ БОЛЕЕ 8 СИМВОЛОВ): ";

cin >> zapis[i] . a; // Доступ к элементу а экземпляра структуры zapis[i]

// выполняется операцией точка (.)

cout << "\nУКАЖИТЕ СТОИМОСТЬ ДЕТАЛИ : ";

cin >> zapis[i] . t; // Доступ к элементу t экземпляра структуры zapis[i]

cout << "\nНЕОБХОДИМОЕ КОЛИЧЕСТВО - (ЦЕЛ. ЧИСЛО): \n";

cin >> zapis[i] .k; // Доступ к элементу k экземпляра структуры zapis[i]

}

// Выполнение расчетов:

s1=0;s2=0;s3=0;

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

{

zapis[i].c = zapis[i].t * zapis[i].k;

s1 += zapis[i].t;

s2 += zapis[i].k;

s3 += zapis[i].c;

}

// Построение "шапки" таблицы

clrscr();

cout << "\n СВЕДЕНИЯ О СТОИМОСТИ ВЫДАННЫХ ДЕТАЛЕЙ ";

cout << "\n|---------------------------------------------------------------------------------|";

cout << "\n| n/n | ДЕТАЛЬ | СТОИМОСТЬ | ВЫДАНО | РАСХОД |";

cout << "\n|---------------------------------------------------------------------------------|";

// Заполнение таблицы данными:

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

cout << "\n|" << setw(7) << i+1 << "|" << setw(8) << (zapis[i]).a << "|"

// ------

// |-> манипулятор потока, указывает, что следующая

// выходная величина (i+1) будет напечатана с ши

// риной поля, равной 7 символам

<< setw(13) << setprecision(2) << (zapis[i]).t << "|"

// --------------

// |-> манипулятор потока, указывает, что следующая

// выходная будет напечатана с двумя цифрами по

// сле десятичной точки

<< setw(8) << setprecision(2) << (zapis[i]).k << "|"

<< setw(8) << setprecision(2) << (zapis[i]).c << "|";

cout << "\n|-------------------------------------------------------------------------| ";

cout << "\n| ИТОГО: |" << setw(13) << setprecision(2) << s1

<< "|" << setw(8) << s2<< "|" <<setw(8) << setprecision(2) << s3 << "|";

cout << "\n|--------------------------------------------------------------------------|";

return 0;

}

Для форматирования вывода информации на монитор в программе используются манипуляторы потока setw и setprecision. Их назначение приведено в соответствующих комментариях программы_1_2.

Одни из возможных результатов работы программы при формировании трехстрочного документа имеет следующий вид: