Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

g30zAZLYUG

.pdf
Скачиваний:
3
Добавлен:
15.04.2023
Размер:
1.89 Mб
Скачать

п. 5. Статический массив записей

В любом текстовом редакторе откройте прилагаемый к комплекту лабораторных работ текстовый файл с именем StudPmi и посмотрите его содержимое.

Здесь первая строка – заголовочная, а далее следует список студентов с оценками за экзамен. Каждая строка файла, кроме первой, содержит

запись, состоящую из трёх полей:

 

1) фамилия студента;

2) имя студента;

3) оценка за экзамен.

В этом пункте решим следующую задачу:

из входного текстового файла с именем StudPmi прочитаем данные в статический массив записей;

в выходной текстовый файл с именем max_ball выведем список отличников;

выведем на консоль имя студента с заданной фамилией.

5.1. При объявлении статического массива его размером должна яв-

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

#define MAX_NODES 100 // Максимально возможное число записей

11

5.2. Ниже, в области объявления глобальных переменных (перед процедурой main), вставьте объявление структуры записей с именем MY_NODE и в этом же операторе объявление статического массива таких записей (имя массива myArray):

struct MY_NODE

// Структура "Запись"

{

 

 

 

char

surname[24];

// Фамилия

char

name[18];

// Имя

int

ball;

 

// Оценка

}

 

 

 

myArray[MAX_NODES];

// Массив записей

 

 

 

 

Каждая запись содержит три поля, два из которых – строки символов, а последнее – целочисленное. Предполагается, что фамилия состоит не более чем из 24 символов, а имя – не более чем из 18 символов. Количество элементов в массиве myArray определяется объявленной ранее кон-

стантой MAX_NODES.

5.3. В начале процедуры main объявите две целочисленные перемен-

ные:

int i, count=0;

Первая понадобится в качестве переменной цикла, а во второй будет подсчитываться количество записей.

5.4.Объявите переменную «f» типа ifstream и откройте текстовый файл StudPmi для чтения (если уже забыли, как это делается, то загляните

впункт 4.4).

5.5.Считываем информацию из файла, после чего его закрываем:

char lin[81];

// пропускаем первую строку входного файла, содержащую заголовок f.getline(lin,sizeof(lin));

while (!f.eof()) // пока не будет достигнут конец файла

{

//читаем строку из файла и одновременно

//формируем очередную запись массива myArray

f >> myArray[count].surname >> myArray[count].name >> myArray[count].ball;

count++;

};

f.close();

12

В результате выполнения цикла будет сформирован массив myArray, причём в переменной count сохранится общее количество прочитанных из файла записей (с 0-й по count–1-ю). Чтобы убедиться, что считывание информации и формирование массива myArray прошло успешно, выведем его на экран:

if (count>0)

{ for (i=0; i<count; i++)

{

cout << myArray[i].surname << myArray[i].name << myArray[i].ball; };

};

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

Цель достигнута, но вывод на экран, мягко говоря, некрасивый. Измените оператор вывода, добавив табуляцию "\t" и переход на новую стро-

ку "\n":

cout << myArray[i].surname << "\t" << myArray[i].name << "\t" << myArray[i].ball << "\n";

Запустите программу на выполнение. Ситуация улучшилась. На этом варианте и остановимся.

5.6.С учётом изложенной выше информации попытайтесь самостоятельно описать переменную типа ofstream, открыть для записи выходной файл (см. пункт 4.7) и вывести в него те записи, у которых значение поля ball равно 5. Результат (программный код и сформированный выходной файл) покажите преподавателю.

5.7.Наконец, в соответствии с задачей, поставленной в начале пунк-

та 5, выведем на консоль имя студента с заданной фамилией.

В начале процедуры main объявите две переменные строкового типа:

char surname1[24], name1[75]="Нет студента с такой фамилией";

В любом подходящем для этой цели редакторе (например, в блокноте) создайте текстовый файл с именем SurnameInput и поместите туда любую фамилию из списка. Например, Беккер. Сохраните файл в той же папке, где расположены cpp-файлы Вашего проекта.

5.8. В процедуре main после печати введённого массива добавьте операторы ввода переменной surname1:

13

f.open("SurnameInput.txt"); f >> surname1;

f.close();

cout << "Ищем запись о студенте с фамилией: " << surname1 <<"\n";

По введённому значению мы и будем осуществлять поиск.

5.9. Вот теперь-то и пригодятся изученные выше функции для работы со строковыми переменными. Чтобы найти запись о студенте с заданной фамилией, будем сравнивать значение, которое возвращает функция strcmp, с нулём. Если равенство выполнится, то фамилии совпали. Тогда, с помощью функции strcpy, сохраним имя данного студента в переменной name1, тем самым, переопределив её начальное значение «Нет студента с такой фамилией». После окончания цикла выведем значение переменной name1 на консоль:

if (count>0)

{

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

{

if (strcmp(surname1, myArray[i].surname)==0) // Фамилии совпали

{

strcpy(name1,myArray[i].name);

break;

}

}

};

cout << "Имя студента: " << name1 <<"\n";

Запустите программу на выполнение. Всё работает правильно:

14

В порядке эксперимента в файл SurnameInput запишите такую фамилию, которой нет в списке. И в этом случае программа успешно справляется с поставленной задачей:

ЗАДАНИЕ № 1. Статический массив записей

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

Вариант № 1. Набор данных “Ткани” содержит для каждого из имеющихся в продаже видов ткани:

артикул (12 символов);

количество рулонов (целое значение);

цвет (10 символов);

цена за рулон (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной cost1 (целое значение). Вывести в выходной текстовый файл записи о тех обоях, цена которых не превосходит значение переменной cost1.

Прочитать из файла значение переменной color1 (10 символов). Вывести на консоль артикул тех тканей, цвет которых определяется значением переменной color1.

Вариант № 2. Набор данных “Магазины” содержит для каждого магазина:

номер (целое значение),

название (14 символов),

адрес (36 символов),

площадь помещения (действительное значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной area1 (действительное значение). Вывести в выходной текстовый файл записи о тех магазинах, площадь которых больше по сравнению со значением переменной area1.

Прочитать из файла значение переменной name1 (14 символов). Вывести на консоль адрес магазина, название которого определяется значением переменной name1.

15

Вариант № 3. Набор данных “Конкурс” содержит для каждого участника:

фамилию, инициалы (20 символов);

возраст (целое значение);

прошел ли в следующий тур? (логическое значение);

сколько баллов набрал? (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной b1 (целое значение). Вывести в выходной текстовый файл записи о тех участниках, которые набрали баллов больше по сравнению со значением переменной b1.

Прочитать из файла значение переменной suname1 (20 символов). Вывести на консоль информацию об участнике, фамилия которого определяется значением переменной suname1.

Вариант № 4. Набор данных “Книги” содержит следующую информацию по каждой книге:

фамилию, инициалы автора (20 символов);

название (40 символов);

количество страниц (целое значение);

тираж (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной edition1 (целое значение). Вывести в выходной текстовый файл записи о тех книгах, тираж которых больше значения переменной edition1.

Прочитать из файла значение переменной suname1 (20 символов). Вывести на консоль название книги того автора, фамилия которого определяется значением переменной suname1.

Вариант № 5. Набор данных “Лекарства от гриппа” содержит для каждого лекарства:

название (23 символа);

есть ли противопоказания (логическое значение);

цена (целое значение);

количество на складе (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной cost1 (целое значение). Вывести в выходной текстовый файл записи о тех лекарствах, которые дешевле по сравнению со значением переменной cost1.

Прочитать из файла значение переменной name1 (23 символа). Вывести на консоль количество на складе для того лекарства, название которого определяется значением переменной name1.

16

Вариант № 6. Набор данных “Самолеты” содержит следующие сведения о рейсах:

номер рейса (целое значение);

пункт назначения (16 символов);

стоимость билета (целое значение);

время в пути (действительное значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной number1 (целое значение) – номер рейса. Вывести в выходной текстовый файл запись о том рейсе, номер которого равен значению переменной number1.

Прочитать из файла значение переменной destination1 (16 символов). Вывести на консоль номера рейсов, направляющихся в пункт назначения, который определяется значением переменной destination1.

Вариант № 7. Набор данных “Автомагазин” содержит для каждого из имеющихся в продаже автомобилей:

марку (12 символов);

год выпуска (целое значение);

цвет (10 символов);

количество на складе (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной year1 (целое значение). Вывести в выходной текстовый файл записи о тех автомобилях, которые «моложе» значения переменной year1.

Прочитать из файла значение переменной color1 (10 символов). Вывести на консоль марку тех автомобилей, цвет которых определяется значением переменной color1.

Вариант№ 8. Набор данных “Зачёт” содержит для каждого студента:

фамилию, инициалы (20 символов);

номер группы (5 символов);

наличие или отсутствие зачёта (логическое значение);

количество набранных баллов (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной b1 (целое значение). Вывести в выходной текстовый файл записи о тех студентах, которые набрали больше баллов по сравнению со значением переменной b1.

Прочитать из файла значение переменной suname1 (20 символов). Вывести на консоль информацию о наличии зачёта у того студента, фамилия которого определяется значением переменной suname1.

17

Вариант № 9. Набор данных “Зоопарк” содержит для каждого вида животных:

название животного (22 символа);

количество животных этого вида в зоопарке (целое значение);

денежная сумма, необходимая для содержания одного животного в течение месяца (целое значение);

площадь занимаемого вольера (действительное значение). Прочитать исходные данные из входного текстового файла. Сформи-

ровать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной n1 (целое значение). Вывести в выходной текстовый файл записи о тех животных, количество которых в зоопарке больше по сравнению со значением переменной n1.

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

Вариант № 10. Набор данных “Налоги” содержит для каждого налога:

название налога (50 символов);

процентная ставка (целое значение);

облагаются ли этим налогом госбюджетные служащие (логическое значение);

год введения налога (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной n1 (целое значение). Вывести в выходной текстовый файл записи о тех налогах, процентная ставка которых меньше по сравнению со значением переменной n1.

Прочитать из файла значение переменной tax1 (50 символов). Вывести на консоль информацию о процентной ставке того налога, название которого определяется значением переменной tax1.

Вариант № 11. Набор данных “Ипподром” содержит следующие сведения о каждом из участников заезда:

номер участника (целое значение);

фамилию, инициалы жокея (20 символов);

кличка лошади (16 символов);

возраст лошади (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной a1 (целое значение). Вывести в выходной текстовый файл записи о тех участниках, у которых возраст лошади больше по сравнению со значением переменной a1.

18

Прочитать из файла значение переменной name1 (16 символов). Вывести на консоль фамилию и инициалы жокея, который выступает на лошади с кличкой, определяемой значением переменной name1.

Вариант № 12. Набор данных “Младенцы” содержит для каждого ребенка:

фамилию, имя (26 символов);

вес (действительное значение);

рост (целое значение);

цвет глаз (20 символов).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной weight1 (действительное значение). Вывести в выходной текстовый файл записи о тех младенцах, которые весят меньше, чем значение переменной weight1. Прочитать из файла значение переменной color1 (10 символов). Вывести на консоль фамилию тех младенцев, цвет глаз которых определяется значением пере-

менной color1.

Вариант № 13. Набор данных “Поезда” содержит следующие сведения о поездах, отправляющихся из г. Мурманска:

номер поезда (целое значение);

станция назначения (16 символов);

время в пути (целое значение);

время прибытия (действительное значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной number1 (целое значение) – номер поезда. Вывести в выходной текстовый файл запись о том поезде, номер которого равен значению переменной number1.

Прочитать из файла значение переменной destination1 (16 символов). Вывести на консоль номера поездов, направляющихся на станцию назначения, которая определяется значением переменной destination1.

Вариант № 14. Набор данных “Кафедра” содержит следующую информацию о преподавателях:

фамилию и инициалы (20 символов);

ученая степень (10 символов);

стаж работы (целое значение),

количество публикаций (целое значение).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной experience1 (целое значение). Вывести в выходной текстовый файл записи о тех преподавателях,

19

стаж работы которых больше по сравнению со значением переменной experience1.

Прочитать из файла значение переменной degree1 (10 символов). Вывести на консоль фамилию и инициалы тех преподавателей, учёная степень которых определяется значением переменной degree1.

Вариант № 15. Набор данных “Университет” содержит следующую информацию о каждом из факультетов:

название факультета (19 символов);

количество специальностей (целое значение);

количество студентов (целое значение);

адрес здания (30 символов).

Прочитать исходные данные из входного текстового файла. Сформировать из них массив записей и вывести его на консоль.

Прочитать с консоли значение переменной n1 (целое значение). Вывести в выходной текстовый файл записи о тех факультетах, на которых количество студентов больше по сравнению со значением переменной n1.

Прочитать из файла значение переменной department1 (19 символов). Вывести на консоль адрес факультета, название которого определяется значением переменной department1.

п. 6. STL контейнер vector (вектор) – динамический массив

В настоящее время статические массивы используют, пожалуй, исключительно в учебных целях, так как в результате их применения компь-

ютерная память расходуется крайне неэффективно.

Например, в пункте 5 мы выделили память под 101 элемент, тогда как во входном файле оказалось всего 24 записи. Таким образом, более 75% выделенной памяти не использовалось!

Хотелось бы выделять под массив столько памяти, сколько нужно для хранения реального количества элементов. В языке С++ для этого су-

ществует несколько возможностей, одна из которых состоит в применении STL контейнера vector (вектор), который позволяет создавать массивы переменной длины в зависимости от конкретной ситуации. Вся информация об этой структуре хранится в библиотеке < vector >.

Чтобы создать новый массив, его надо объявить в коде программы следующим образом:

vector < type > name;

Здесь type – тип элементов, помещаемых в массив, а name – имя массива. Рассмотрим простой пример использования контейнера vector.

6.1. Сохраните текущий cpp-файл lab_01 под другим именем (например, lab_01_5) и закройте его. Откройте файл lab_01. Закомментируйте или удалите содержимое процедуры main, оставив следующий фрагмент:

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]