Практическое занятие № 9

Тема: «Создание многофайловых программ на С++»

Цель занятия: получить практические навыки по созданию программных модулей в больших программах

 

Ход работы

1. Пусть имеется некоторый объект «товар». Данный объект имеет ряд свойств:

Над объектом можно выполнить ряд действий:

Для выбора нужного действия на экран выдать меню пользователя.

Каждое действие с данными оформить в виде отдельного программного модуля.

 

 

Выполнение работы

1. Для реализации первой функции программы создадим модуль для ввода n записей в файл. Файл модуля может иметь вид:

 

#ifndef MODUL1_H

#define MODUL1_H

 

//подключаем модули для вода/вывода и работы с файлами

#include <iostream.h>

#include <fstream.h>

 

//описываем структуру для работы с объектом «товар»

struct tovar

{

char shifr[10], nazv[10];

float cena;

};

//прототип функции для ввода товаров в файл

void vvodtovar();

 

//реализация функции ввода товаров в файл

void vvodtovar()

{

//описываем счетчик цикла и количество товаров

int i,n;

//переменная tov для работы со структурой

tovar tov;

//очищаем экран

system("cls");

//вводим количество товаров

cout<<"Введите количество товаров: " ;

cin>>n; 

//очищаем ввод от клавиши Enter

cin.get();

//открываем файл для записи

ofstream f1("tovary.dat",ios::binary);

cout<<"Введите данные о товарах:\n";

//в цикле вводим данные о товаре

//и записываем в файл

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

      {

         cout<<i+1<<"-й товар:\n";

         cout<<"-шифр: ";        cin.getline(tov.shifr,10);

         cout<<"-название: ";    cin.getline(tov.nazv,20);

         cout<<"-цена: ";        cin>>tov.cena;

cin.get();

         //записываем введенные данные в файл

         f1.write ((char*) &tov, sizeof tov);

     }

//закрываем файл

f1.close();

//выдаем сообщение о завершении операции

cout<<"Файл создан. Нажмите любую клавишу...\n";

//делаем паузу для просмотра

system("pause");

//завершаем функцию

return;

}

 

#endif

 

Сохраните файл под именем modul1.h.

 

2. Для реализации второй функции создадим модуль для добавления m записей в файл. Файл модуля может иметь вид:

 

#ifndef MODUL2_H

#define MODUL2_H

 

//подключаем библиотеку для переименования и удаления файлов

#include <stdio.h>

//подключаем из текущей папки созданный модуль с описанной структурой

#include "modul1.h"

 

//обратите внимание, что подключать модули iostream.h, conio.h, fstream.h не нужно

//так как они уже подключены внутри модуля modul1.h

 

//прототип функции для добавления товаров в файл

void addtovar();

 

//реализация функции для добавления товаров в файл

void addtovar()

{

//описываем счетчик цикла и

//количество добавляемых товаров

int i,m;

//переменная tov для работы со структурой

tovar tov;

 

//переписываем файл tovary.dat в файл buffer.dat

//открываем tovary.dat для чтения

ifstream f1("tovary.dat",ios::in);

//открываем buffer.dat для записи

ofstream f2("bufer.dat",ios::binary);

//в цикле читаем данные и tovary.dat

//и записываем в buffer.dat

while (f1.read ((char*) &tov, sizeof tov))

f2.write ((char*) &tov, sizeof tov);

 

//очищаем экран

system("cls");

//вводим количество добавляемых товаров

cout<<"Введите количество товаров: " ;

cin>>m;      

cin.get();

//в цикле вводим товары и дописываем их в bufer.dat

cout<<"Введите данные о товарах:\n";

for (i=0;i<=m-1;i++)

{

cout<<i+1<<"-й товар:\n";

cout<<"-шифр: ";        cin.getline(tov.shifr,10);

cout<<"-название: ";    cin.getline(tov.nazv,20);

cout<<"-цена: ";        cin>>tov.cena;

cin.get();

f2.write ((char*) &tov, sizeof tov);

}

//закрываем оба файла

f1.close();

f2.close();

 

//удаляем файл tovary.dat

remove("tovary.dat");

//переименовываем файл buffer.dat в tovary.dat

rename("bufer.dat","tovary.dat");

//выводим сообщение о завершении операции

cout<<"Данные добавлены. Нажмите любую клавишу...\n";

//делаем паузу для просмотра

system("pause");

//конец работы функции

return;

}

#endif

 

Сохраните файл под именем modul2.h.

 

3. Создадим модуль для поиска товаров по названию. Файл модуля может иметь вид:

 

#ifndef MODUL3_H

#define MODUL3_H

 

//подключаем из текущей папки созданный модуль с описанной структурой

#include "modul1.h"

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

#include <string.h>

 

//обратите внимание, что подключать модули iostream.h, conio.h, fstream.h не нужно

//так как они уже подключены внутри модуля modul1.h

 

 

//прототип функции  поиска товаров

//по введенному названию

void poisktovar();

 

//реализация функции  поиска товаров

//по введенному названию

 

void poisktovar()

{

//переменная tov для работы со структурой

tovar tov;

//переменная nazv для ввода названия искомого товара

char nazv[20];

//очищаем экран

system("cls");

//очищаем буфер клавиатуры

cin.get();

//вводим название искомого товара

cout<<"Введите название товара для поиска: " ;

cin.getline(nazv,20);

//открываем файл для чтения

ifstream f1("tovary.dat",ios::in);

cout<<"Список найденных товаров:\n";

cout<<"      Шифр            Название      Цена\n";

//в цикле читаем данные из файла

while (f1.read ((char*) &tov, sizeof tov))

//если название товара совпадает с введенным значением

if (strnicmp(tov.nazv,nazv,strlen(nazv))==0)

{

//выводим данные о товаре на экран

cout.width(10);

cout<<tov.shifr;

cout.width(20);

cout<<tov.nazv;

cout.width(10);

cout<<tov.cena<<"\n";

}

//закрываем файл

f1.close();

//выводим сообщение

cout<<"Нажмите любую клавишу...\n";

//делаем паузу для просмотра

system("pause");

//завершаем функцию

return;

}

#endif

 

Сохраните файл под именем modul3.h.

 

4. Для использования созданных модулей создадим главную программу.

Текст главной программы может иметь вид:

 

//подключаем заголовочные файлы

#include <iostream.h>

//подключаем созданные модули из текущего каталога

#include "modul1.h"

#include "modul2.h"

#include "modul3.h"

 

//главная программа

int main()

{

system("chcp 1251>nul");

//переменная k для выбора из меню

//переменная и для организации цикла выдачи меню

int k,b=0;

 

//пока b=0 работает цикл

while (b==0)

{

//очищаем экран

system("cls");

//выдаем меню пользователя

cout<<"1-создание файла\n";

cout<<"2-добавление в файл\n";

cout<<"3-поиск в файле\n";

cout<<"4-выход\n";

//запрашиваем выбор из меню

cout<<"Сделайте выбор: ";cin>>k;

 

//обрабатываем выбор

switch (k)

{

//если выбран первый пункт

case 1:

{

//вызываем функцию ввода товаров в файл

vvodtovar();

//выходим из оператора switch

break;

}

//если выбран второй пункт

case 2:

{

//добавляет товары в файл

addtovar();

//выходим из оператора switch

break;

}

//если выбран третий пункт

case 3:

{

//вызываем функцию поиска товаров в файле

poisktovar();

//выходим из оператора switch

break;

}

//если выбран четвертый пункт

case 4:

{

//переменная b=1 (завершение работы цикла)

b=1;

//выходим из оператора switch

break;

}

}    //конец swicth

}    //конец while

//конец главной программы

return 0;

}

 

Решить самостоятельно:

Задание 1. Для предыдущей задачи создайте следующие модули:

modul4.h, с помощью которого посчитайте максимальную цену товара и выведите название товара с максимальной ценой;

modul5.h для подсчета средней цены товара;

modul6.h для вывода данных из файла. Усовершенствуйте программу так, чтобы перед каждым действием был просмотр содержимого файла.

 

Задание 2. Каждого студента можно описать при помощи характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу (с использованием файлов и функций), определяющую количество студентов:

·      сдавших сессию на «отлично»;

·      не сдавших хотя бы 1 экзамен.