Практическое занятие № 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
экзамен.