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

ТЕМА: Создание программ по работе с файлами

ЦЕЛЬ РАБОТЫ: получить практические навыки по использованию файлов в программах на С++

 

Ход работы

 

1. Объект книга описывается свойствами: шифр, автор, название, цена. Составить программу, выполняющую следующие функции:

        1.1. Выдать меню с режимами работы:

                    1 - создание файла

                    2 - добавление в файл

                    3 - книги с максимальной ценой

                    4 - книги указанного автора

                    5 - выход;

        1.2. При выборе первого пункта создается файл BIBLIO.DAT и записывается в него информация об N книг;

        1.3. При выборе второго пункта можно добавить в  файл еще M книг;

        1.4. При выборе пункта 3  на экран из файла выводятся названия книг с максимальной ценой;

        1.5. При выборе пункта 4 программа подсчитывает количество книг указанного автора (автора ввести с клавиатуры);

 

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

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

#include <iostream.h>

#include <iomanip.h>

#include <fstream.h>

#include <string.h>

#include <stdio.h>

 

//описываем структуру "книга"

struct book

{

    int shifr;

    char autor[15], nazv[30];

    float cena;

};

int main()

{

 system("chcp 1251>nul");

 

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

 book bk;

 //описываем вспомогательные переменные

 int i,n,k,b,kol;

 float maxcena;

 char autor[15];

 

 //обнуляем признак завершения программы

 b=0;

 //пока b=0 будем повторять цикл выдачи меню

 while (b==0)

 {

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

     system("cls");

     //выдаем меню программы

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

     cout<<"2 - просмотр файла\n";

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

     cout<<"4 - книги с максимальной ценой\n";

     cout<<"5 - книги указанного автора\n";

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

     //запрашиваем выбор пользователя из меню

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

     //обрабатываем выбранный пункт меню

     switch (k)

     {

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

     case 1:

     {

          //описываем переменную для записи в файл

          ofstream file1;

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

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

          file1.open("biblio.dat",ios::binary);

          //вводим количество книг

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

          cin>>n;

          //организуем цикл для ввода данных

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

          {

             //вводим данные об i книге

             cout<<i+1<<"-я книга:\n";

             cout<<"-шифр: ";     cin>>bk.shifr;

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

             cin.get();

             cout<<"-автор: ";         cin.getline(bk.autor,15);

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

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

             //записываем i книгу в файл

             file1.write((char*) &bk, sizeof bk);

          }

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

          file1.clear();

          file1.close();

          cout<<"Файл успешно создан!"<<endl;

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

          system("pause");

          break;

     }

    

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

      case 2:

      {

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

          ifstream file1;

          //связываем переменную с файлом biblio.dat

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

          file1.open("biblio.dat",ios::in);

          cout<<"Данные из файла:\n";

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

          while (file1.read((char*) &bk, sizeof bk))

          {

                  //выводим шифр книги, отводим под шифр 10 позиций - setw(10)

               //выравниваем текст по левому краю (left)

               //не переходим на новую строку

                cout<<setw(10)<<left<<bk.shifr;         

                 //выводим автора, отводим для него 15 позиций

                cout<<setw(15)<<left<<bk.autor;         

                  //выводим название книги, отводим 20 позиций

                cout<<setw(20)<<left<<bk.nazv;           

                  //выводим цену книги, отводим под нее 6 позиций

                  //выводим число с плавающей запятой (fixed)

                  //устанавливаем 2 знака после запятой (setprecision(2))

                cout<<setw(6)<<left<<fixed<<setprecision(2)<<bk.shifr;              

                  //переходим на новую строку

                  cout<<endl;

          }

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

          file1.clear();

          file1.close();

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

          system("pause");

          break;

      }

      

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

     case 3:

     {

          //переменная file1 для добавления в файл

          ofstream file1;

          //переменная file1 связывается с файлом biblio.dat в режиме добавления

          file1.open("biblio.dat",ios::app);

          //вводим количество книг для добавления

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

          cin>>n;

          //в цикле вводим данные об i книге

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

          {

             cout<<i+1<<"-я книга:\n";

             cout<<"-шифр: ";     cin>>bk.shifr;

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

             cin.get();

             cout<<"-автор: ";         cin.getline(bk.autor,15);

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

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

             //записываем данные об i книге в file1

             file1.write((char*) &bk, sizeof bk);

          }

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

          file1.clear();

          file1.close();

          cout<<"Данные успешно добавлены!"<<endl;         

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

          system("pause");

          break;

     }

    

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

     case 4:

     {

          //предполагаем, что максимальная цена равна 0

          maxcena=0;

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

          ifstream file1;

          //связываем переменную file1 с файлом biblio.dat

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

          file1.open("biblio.dat",ios::in);

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

          //и находим максимальную цену

          while (file1.read((char*) &bk, sizeof bk))

             if (bk.cena>maxcena)

                  maxcena=bk.cena;

          //выводим максимальную цену на экран

          cout<<"Максимальная цена="<<maxcena<<"\n";

          cout<<"Список книг с максимальной ценой:\n";

          //разблокируем файл file1

          file1.clear();

          //переходим на начало файла

          file1.seekg(0);

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

          while (file1.read((char*) &bk, sizeof bk))

              //если цена равна максимальному значению

              if (bk.cena==maxcena)

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

                   cout<<bk.nazv<<"\n";

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

          file1.clear();

          file1.close();

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

          system("pause");

          break;

     }

    

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

     case 5:

     {

          cin.get();

          //вводим автора для поиска

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

          cin.getline(autor,15);

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

          ifstream file1;

          //связываем переменную с файлом biblio.dat

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

          file1.open("biblio.dat",ios::in);

          //предполагаем, что количество равно 0

          kol=0;

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

          while (file1.read((char*) &bk, sizeof bk))

               //если начальные символы автора книги воспадают с введенным автором

               if (strnicmp(bk.autor,autor,strlen(autor))==0)

                  //количество увеличивается на 1

                  kol++;

          //выводим количество книг на экран

          cout<<"Количество книг указанного автора равно "<<kol<<"\n";

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

          file1.clear();

          file1.close();

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

          system("pause");

          break;

     }

    

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

     case 6:

     {

          //признак выхода из цикла программы равен 1

          b=1;

          break;

     }

     } //конец switch

     } //конец while

    return 0;

}

 

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

 

Задача 1.

Имеются данные о товарах: номер товара, название, количество, цена за единицу и вычисляемое поле стоимость=количество*цена за единицу.

Составить программу, выполняющую следующие функции:

        1.1. Выдать меню с режимами работы:

                    1 - создание файла

                    2 - добавление в файл

                    3 – задание 1

                    4 – задание 2

                    5 – задание 3

                    6 – задание 4

                    7 - выход;

        1.2. При выборе первого пункта создается файл TOVARI.DAT и записывается в него информация об N товарах;

        1.3. При выборе второго пункта можно добавить в файл еще M товаров;

        1.4. При выборе пункта 3 на экран из файла выводится по заданной части названия товара информация о товаре;

        1.5. При выборе пункта 4 программа подсчитывает суммарную стоимость всех товаров;

        1.6. При выборе пункта 5 программа подсчитывает максимальное количество товаров заданного наименования;

        1.7. При выборе пункта 6 программа вывести товары с наименьшим количеством.

 

При выполнении пунктов 3, 4, 5, 6 обязательно вывести все данные из файла, а затем результаты – с поясняющим текстом.