L
lrad
Условие задачи:
1. Описать класс (структуру) со следующими полями:
- фамилия, инициалы авторов;
- название книги;
- издательство;
- год издания;
- количество страниц;
- количество глав в книге;
- название дисциплины.
2. Написать программу, выполняющую следующие действия:
- ввод информации в файл;
- вывод всей информации на экран;
- вывод на экран информации о фамилии автора, название и количества страниц книги, обеспечивающих дисциплину, название которой введено с клавиатуры.
1. Описать класс (структуру) со следующими полями:
- фамилия, инициалы авторов;
- название книги;
- издательство;
- год издания;
- количество страниц;
- количество глав в книге;
- название дисциплины.
2. Написать программу, выполняющую следующие действия:
- ввод информации в файл;
- вывод всей информации на экран;
- вывод на экран информации о фамилии автора, название и количества страниц книги, обеспечивающих дисциплину, название которой введено с клавиатуры.
Код:
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <conio.h>
#include <iomanip.h>
#include <stdlib.h>
#define FIO 20
#define name 20
#define PUBLISHERS 20
#define YEAR 4
#define PAGES 6
#define CHAPTER 6
//--------------------------------------------------------------------------------------
struct book
{
char fio[25];
char name_book [25];
char publishers[25];
int year_publishers;
int pages;
int chapter;
char discipline[17];
};
//----------------------------------------------------------------------------------------
// прототипы функций
void sozdanie();
void prosmotr();
void vibor();
void tabl();
//-----------------------------------------------------------------------------------------
// Опеpация-функция ввода с клавиатуpы
istream &operator >> (istream &in, book &x)
{
cout<<"\nФамилия и инициалы:";
in.seekg(0,ios::end);
in.get(x.fio,FIO-1,'\n');
cout<<" \nНазвание книги:";
in.seekg(0,ios::end);
in.get(x.name_book,name-1,'\n');
cout<<"\nИздательство:";
in.seekg(0,ios::end);
in.get(x.publishers,PUBLISHERS-1,'\n');
cout<<"\nГод издания:";
in.seekg(0,ios::end);
in >>x.year_publishers,YEAR-1;
cout<<"\nКоличество страниц:";
in.seekg(0,ios::end);
in >>x.pages, PAGES-1;
cout<<"\nКоличество глав в книге:";
in.seekg(0,ios::end);
in>>x.chapter, CHAPTER-1;
cout<<" \nНазвание дисциплины:";
in.seekg(0,ios::end);
in >>x.discipline;
return in;
}
//------------------------------------------------------------------------
// Опеpация-функция вывода на дисплей
ostream &operator << (ostream &out, book x)
{
out.setf (ios::left); // установка флага равнения по левому краю
out << "|" << setw(17) << x.fio << "|" << setw(15) << x.name_book
<< "|"<< setw(11)<< x.publishers << "|" << x.year_publishers
<< "|" << setw(4)<< x.pages << "|"<< setw(4)<< x.chapter
<< "|" <<setw(16)<< x.discipline << "|\n";
return out;
}
// Опеpация-функция чтения из файла
ifstream &operator >> (ifstream &in, book &x)
{
in.getline(x.fio,FIO,'\n');
in.getline(x.name_book, name,'\n');
in.getline(x.publishers,PUBLISHERS,'\n');
in>>x.year_publishers,YEAR;
in>>x.pages, PAGES-1;
in>>x.chapter, CHAPTER-1;
in >>x.discipline;
in.seekg (2L, ios::cur);
return in;
}
// Опеpация-функция записи в файл
ofstream &operator << (ofstream &out, book &x)
{
out << x.fio << endl
<< x.name_book << endl
<< x.publishers << endl
<< x.year_publishers << endl
<< x.pages << endl
<< x.chapter << endl
<< x.discipline << endl;
return out;
}
//------------------------------------------------------------------------
void main(void)
{
char c;
while (1)
{
cout << endl << "1. Создание файла";
cout << endl << "2. Просмотр содержимого";
cout << endl << "3. Вывод на экран информации о фамилии автора," << endl;
cout <<" название книги и количество страниц";
cout << endl << "4. Выход";
cout << endl << "Ваш выбор -> ";
cin.seekg(0,ios::end);
c = cin.get();
switch(c)
{
case '1':
sozdanie();
break;
case '2':
prosmotr();
break;
case '3':
vibor();
break;
case '4':
return;
default:
cout << "Вводите только цифры от 1 до 4" << endl;
}
}
}
// определение функции вывода на экран шапки таблицы
void tabl()
{
cout << "-------------------------------------------------------------------------------------------\n";
cout << "| Ф.И.О. | Название книги| Изд-во | Год|Стр.|Глав| Дисциплина |\n";
cout << "|-----------------|--------------------|----- ------|-----|-----|------|-------------------|\n";
}
// определение функции создания файла
void sozdanie()
{
char c;
ofstream ff; // создание потока ff для записи в файл
book s;
ff.open( "bok.txt" );
// открытие файла book.txt и связывание его
// c потоком ff
if ( !ff) // проверка открытия файла
{
cerr << "Ошибка открытия файла bok.txt для записи\n";
exit(1); // аварийный выход
}
// Цикл записи элементов в файл
do
{
cin >> s; // обращение к операции-функции ввода с клавиатуpы
ff << s; // обращение к операции-функции записи в файл
cout<<"\nПpодолжить ввод?(Y/N или Д/H)";
cin.seekg(0L, ios::end);
c = cin.get();
}
while ( c == 'y' || c == 'Y' || c == 'д' || c == 'Д');
ff.close(); // закpытие файла
}
// определение функции вывода всей информации на экран
void prosmotr()
{
ifstream finp; // создание потока finp для чтения из файла
book s;
finp.open( "bok.txt", ios::in );
// открытие файла bok.txt и связывание его
// с потоком finp
if ( !finp ) // проверка открытия файла
{
cerr << "Ошибка открытия файла bok.txt для чтения\n";
exit(1); // аварийный выход
}
cout << "\nСписок элементов из файла\n";
tabl(); // вывод на экран шапки таблицы
while ( finp )
{
finp >> s; // обращение к операции-функции чтения из файла
if ( strlen ( s.discipline) <= 0 )
// длина первого поля в записи меньше либо равна нулю
break; // выход из цикла
cout << s; // обращение к операции-функции вывода на экран
}
finp.close(); // закpытие файла
}
// определение функции вывода на экран информации,
// отвечеющей условию поиска
void vibor()
{
char discipline[15]; // для ввода условия поиска
ifstream fi; // создание потока fi для чтения из файла
book b;
fi.open("bok.txt", ios::in);
// открытие файла bok.txt и связывание его
// с потоком fi
if ( !fi ) // проверка открытия файла
{
cerr << "Ошибка открытия файла bok.txt для чтения\n";
exit(1); // аварийный выход
}
cout << "Введите название дисциплины:";
cin.seekg(0,ios::end);
cin.get(discipline,'\n');
cout << "Информация о книге\n";
tabl(); // вывод на экран шапки таблицы
while (!fi.eof())
{
fi >> b; // обращение к операции-функции чтения из файла
if (strcmp(b.discipline,discipline)==0)
// дисциплины совпали
cout << b; // обращение к операции-функции вывода на экран
}
fi.close();
}