powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста оптимизировать код программы
29 сообщений из 29, показаны все 2 страниц
Помогите, пожалуйста оптимизировать код программы
    #34474209
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте
Помогите, пожалуйста оптимизировать код программы
Программу я написал(Все работает), но больно она какая то корявая(((
Задача:
В задаче нужно самостоятельно определить структуру записи и характеристики ее элементов, выполнить описание данной структуры и написать программу, содержащую функции создания файла, вывода на экран всей информации и информации, соответствующей условиям поиска.
Запись должна содержать следующую информацию: фамилия и инициалы авторов, название книги, издательство, год издания, количество страниц, количество глав в книге, название дисциплины.
Для проверки правильности работы программы ее нужно протестировать. Для этого необходимо записать в файл 8-10 записей и далее выполнить вывод на экран вначале всей инфомации, а затем информации, соответствующей условию поиска.

условие поиска
Напечатать фамилии авторов, названия и количество страниц книг, обеспечивающих дисциплину, название которой введено с клавиатуры.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <deque>
#include <fstream>
#include <conio.h>

struct book
{
public:
    std::string surname;
    std::string name;
    std::string title;
    std::string discipline;    
    int page_num;
    int chap_num;
    int pub_year;
    book():surname("N/A"),name("N/A"),title("N/A"),discipline("N/A"),page_num( 0 ),chap_num( 0 ),pub_year( 1980 ){}
    book(std::string _surname,std::string _name,std::string _title, std::string _discipline, int _page_num, int _chap_num, int _pub_year):surname(_surname),name(_name),title(_title),discipline(_discipline),page_num(_page_num),chap_num(_chap_num),pub_year(_pub_year){}
};

class manager
{
private:
    std::deque<book*> m_BookBase; 
    std::string m_path;
    bool m_isСhanged;
public:
    void display_all()const;
    void display_spec()const;
    void add();
    void open();
    void save();
    void save_as();    
    const bool are_changes()const;
    manager();
    ~manager();
};
//////////////////////////////////////
///Отобразить все записи
void manager::display_all()const
{
    //Выводим на экран
    for (int i= 0 ;i<m_BookBase.size();++i)
    {
        std::cout << "\n--------------------------------\n";
        std::cout << "Position: " << i << std::endl;
        std::cout << "Name: " << m_BookBase[i]->name << std::endl;
        std::cout << "Surname: " << m_BookBase[i]->surname << std::endl;
        std::cout << "Title: " << m_BookBase[i]->title << std::endl;
        std::cout << "Discipline: " << m_BookBase[i]->discipline << std::endl;
        std::cout << "Page number: " << m_BookBase[i]->page_num << std::endl;
        std::cout << "Chapter number: " << m_BookBase[i]->chap_num << std::endl;
        std::cout << "Publishment`s year: " << m_BookBase[i]->pub_year << std::endl;
        std::cout << "--------------------------------";
    }
}
//////////////////////////////////////
///Отобразить записи с заданной дисциплиной
void manager::display_spec()const
{
    bool flag=false;//Флаг c заданной дисциплиной
    std::string discipline;
    std::cout << "Enter discipline: ";
    std::cin >> discipline;
    for (int i= 0 ;i<m_BookBase.size();++i)
    {
        if (std::strcmp(m_BookBase[i]->discipline.c_str(),discipline.c_str())) continue;
        std::cout << "\n--------------------------------\n";
        std::cout << "Position: " << i << std::endl;
        std::cout << "Surname: " << m_BookBase[i]->surname << std::endl;
        std::cout << "Title: " << m_BookBase[i]->title << std::endl;
        std::cout << "Page number: " << m_BookBase[i]->page_num << std::endl;
        std::cout << "--------------------------------";
        flag=true;
    }
    if (flag==false) std::cout << "The are no books of such a discipline";
}
//////////////////////////////////////
///Вставка записи
void manager::add()
{
    std::string surname;
    std::string name;
    std::string title;
    std::string discipline;    
    int page_num;
    int chap_num;
    int pub_year;
    std::cout << "--------------------------------\n";
    std::cout << "Enter name: ";
    std::getline(std::cin,name);
    std::cout << "Enter surname: ";
    std::getline(std::cin,surname);
    std::cout << "Enter title: ";
    std::getline(std::cin,title);
    std::cout << "Enter Discipline: ";
    std::getline(std::cin,discipline);
    std::cout << "Enter page number: ";
    std::cin >> page_num;
    std::cout << "Enter chapters number: ";
    std::cin >> chap_num;
    std::cout << "Enter a year of publishment: ";
    std::cin >> pub_year;
    m_BookBase.push_back(new book(surname,name,title,discipline,page_num,chap_num,pub_year));
    _flushall();
}
//////////////////////////////////////
///Сохранение изменений
void manager::save()
{
    std::ofstream file;
    if (m_path.size()== 0 )//Если данный проект не связан с каким-то файлом (мы не открывали файла и еще не сохраняли
    {
        std::cout << "Enter path to file: ";
        _flushall();
        std::getline(std::cin,m_path);
    }
    file.open(m_path.c_str(),std::ios::binary);
    if(!file)
    {
        throw ("Could not open path");
    }
    std::cout << "Saving base ";
    for (int i= 0 ;i<static_cast<int>(m_BookBase.size());i++)
    {
        std::cout << ".";
        //Сохраняем размер и строку поля Name
        int tmp_size = m_BookBase[i]->name.size();
        file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));
        file.write(m_BookBase[i]->name.c_str(),sizeof(char)*tmp_size);
        //Сохраняем размер и строку поля Surname
        tmp_size = m_BookBase[i]->surname.size();
        file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));
        file.write(m_BookBase[i]->surname.c_str(),sizeof(char)*tmp_size);
        //Сохраняем размер и строку поля Title
        tmp_size = m_BookBase[i]->title.size();
        file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));
        file.write(m_BookBase[i]->title.c_str(),sizeof(char)*tmp_size);
        //Сохраняем размер и строку поля Discipline
        tmp_size = m_BookBase[i]->discipline.size();
        file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));
        file.write(m_BookBase[i]->discipline.c_str(),sizeof(char)*tmp_size);
        //Сохраняем поля Page Number, Chapter Number, Publishment year
        file.write(reinterpret_cast<char*>(&m_BookBase[i]->page_num),sizeof(int));
        file.write(reinterpret_cast<char*>(&m_BookBase[i]->chap_num),sizeof(int));
        file.write(reinterpret_cast<char*>(&m_BookBase[i]->pub_year),sizeof(int));
    }
    file.close();
    m_isСhanged=false;//Теперь в нашем файле тоже самое, что и было в памяти, следовательно изменений нет
    std::cout << " Ok\n";
}
//////////////////////////////////////
///Сохранить как
void manager::save_as()
{
    std::cout << "Enter path to file: ";
    _flushall();
    std::getline(std::cin,m_path);
    save();
}
//////////////////////////////////////
///Открытие файла
void manager::open()
{
    std::fstream file;
    if (m_isСhanged==true) //Проверяем есть ли что-нибудь в памяти (изменены данные ранее открытого файла или просто в памяти уже присуствует какая-либо база
    {
        std::cout << "Do you want to save changes before closing file? y/n";
        char choice;
        std::cin >> choice;
        switch (choice)
        {
        case 'y':save();
            break;
        case 'Y':save();
            break;
        case 'n':break;
        case 'N':break;
        default:std::cout << "Incorrect choice\n";
            break;
        }
    }
    //Открываем файл
    std::cout << "Enter path to file: ";
    _flushall();
    std::getline(std::cin,m_path);
    std::cout << m_path << std::endl;
    file.open(m_path.c_str(),std::ios::binary | std::ios::in);
    std::deque<book*> temp_arr;
    if (!file)
    {
        file.clear();
        throw ("Could not open file");
    }
    std::cout << "Reading file ";
    //Чтение записей
    while (!file.eof())
    {
        std::cout << ".";
        std::string surname,name,title,discipline;    
        int size_surname,size_name,size_title,size_discipline;
        int page_num;
        int chap_num;
        int pub_year;
        //Читаем размер поля Name и пишим данные в переменную name
        file.read(reinterpret_cast<char*>(&size_name),sizeof(int));
        name.resize(size_name);
        file.read(&name[ 0 ],size_name);
        //Читаем размер поля Surname и пишим данные в переменную surname
        file.read(reinterpret_cast<char*>(&size_surname),sizeof(int));
        surname.resize(size_surname);
        file.read(&surname[ 0 ],size_surname);
        //Читаем размер поля Title и пишим данные в переменную title
        file.read(reinterpret_cast<char*>(&size_title),sizeof(int));
        title.resize(size_title);
        file.read(&title[ 0 ],size_title);
        //Читаем размер поля Discipline и пишим данные в переменную discipline
        file.read(reinterpret_cast<char*>(&size_discipline),sizeof(int));
        discipline.resize(size_discipline);
        file.read(&discipline[ 0 ],size_discipline);
        //Читаем данные поля Page Number, Chapter Number, Publishment Year и заносим в соотвествующие переменные
        file.read(reinterpret_cast<char*>(&page_num),sizeof(int));
        file.read(reinterpret_cast<char*>(&chap_num),sizeof(int)); 
        file.read(reinterpret_cast<char*>(&pub_year),sizeof(int)); 
        if(file.eof()) 
        {
            file.clear();
            break;        
        }    
        temp_arr.push_back(new book(surname,name,title,discipline,page_num,chap_num,pub_year));
    }
    file.close();
    if (m_BookBase.size()!= 0 )//Если основная база непуста - чистим ее
    {
        for (std::deque<book*>::iterator iter=m_BookBase.begin();iter!=m_BookBase.end();++iter)
        {
            delete *iter;
        }
        m_BookBase.clear();
    }
    m_BookBase.resize(static_cast<int>(temp_arr.size()));
    std::copy(temp_arr.begin(),temp_arr.end(),m_BookBase.begin());
    std::cout << " Ok\n";
}
//////////////////////////////////////
///Есть ли изменения
const bool manager::are_changes()const
{
    return m_isСhanged;
}
////Кострукторы
manager::manager():m_isСhanged(false){}
////Деструктор
manager::~manager()
{
    try
    {
        for(int i= 0 ;i<m_BookBase.size();++i) delete m_BookBase[i];
        m_BookBase.clear();
    }
    catch(...)
    {
        std::cout << "An error occuried while killing a book";
    }
}



int main(int argc, char* argv[])
{
    manager man;
    char choice;
    do
    {
        std::cout << "\nChoose action:\n"
             << "'a' - add book\n" 
             << "'e' - display book with a specified discipline\n"
             << "'d' - display all books\n"    
             << "'o' - open file\n"
             << "'s' - save changes\n" 
             << "'p' - save as\n"
             << "'q' - quit\n";    
        choice=_getch();
        try
        {
            switch(choice)
            {
            case 'a':man.add();
                break;
            case 'e':man.display_spec();
                break;
            case 'o':man.open();
                break;
            case 'd':man.display_all();
                break;
            case 's':man.save();
                break;
            case 'p':man.save_as();
                break;
            case 'q':break;
            default:std::cout << "Incorrect choice\n";
                break;
            }
        }
        catch (char* msg)
        {
            std::cout << msg;
        }
        catch (...)
        {
            std::cout << "Unhalded exception";
        }
    }while(choice!='q');
    if (man.are_changes()==true)
    {
        char choice;
        do
        {
            std::cout << "Yo have made changes to file. Do you want to save them? y/n ";
            std::cin >> choice;
            if (choice=='y' || choice=='Y')
            {
                man.save();
                break;
            }
        }while(choice!='n' && choice!='N');
    }
    std::cin.get();
    return  0 ;
}



...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34474223
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что за странные способы ввода/вывода данных при работе с файлами? вот так уже не кавайно? :

автор
ofsteram outf("file.txt");
int i(0), j(1);
outf << "i=" << i << "; j= " << j << endl;


аналогично со вводом. зачем использовать write/read?

И еще. есть гораздо более красивые методы преобразования чисел в строки (если уж так хочется это вручную делать, а не использовать стандартный вывод). К примеру, sprintf... или поток в строку...

Если в общем по алгоритму - то он на столько простой, что по-моему принципиально оптимизировать то и нечего... Хотя сейчас посмотрю более внимательно.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34475054
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lrad пишет:
> #include "stdafx.h"
Этот "stdafx.h"
лишний, он не нужен. Можешь выкидывать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34475061
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как говорил один мой знакомый: Если у вас что-то не получается, - добавьте классов. На мойвзгляд класс managerслишком перегружен, он умеет и хранить книжки и записывать/читать свое содежимое в/из файл, и печатать в нескольких форматах свое содержимое на экран. Кстати ты сделалне все - печати содержимого библиотеки по условию ты не написал.
Я бы за manager оставил только отвественность контейнера книжек, не более того, а остальное вынес в другие классы. Да и название у него нескольк не удачное
ну например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
class Bookshelf // хочется скрыть стандартный контейнер, чтобы не зависеть от реализации контейнера
{
  deque<book> books; // для задачки совершенно не обязатель хранить указатель, можно и по значению
public:
  typedef deque<book> container;
  typedef container::iterator iterator;
  typedef container::const_iterator const_iterator;

  iterator begin();
  iterator end();
...  //здесь все что потребуется от контейнера
  virtual ~Bookshelf() {}
  void remove(iterator i);
  iterator add();

  // а теперь сохранение в файл
  void save(BookStore& bs) const {  bs.save(begin(), end()); }
  void restore(BookStore&);  
};

class BookStore
{
public: 
  virtual ~BookStore() {}
protected:
  friend class Bookshelf;
  template<class forward_iterator> 
      virtual void save(forward_iterator begin, forward_iterator end) =  0 ;
  template<class insert_iterator> 
      virtual void restore(insert_iterator) =  0 ;    
};

class BinFileBookStore : public BookStore
{
public:
  BinFileBookStore(string filename);
  ~BinFileBookStore();
protected:
  template<class forward_iterator>
      void save(forward_iterator begin, forward_iterator end); // из manager сюда
  template<class insert_iterator> 
      void restore(insert_iterator);    
};

//теперь чтобы печатать сделаем отдельный класс
 
class BookPrinter : public binary_function< ostream&, const book&, ostream&>
{
public:
  ostream& operator() (ostream& o, const book& b) { return print(o, b); }
proteced:
  virtual ostream& print(ostream&,const book&) =  0 ;
};

// Теперь наследников этого класса очень удобно пихать в стандартные алгоритмы
// В твоей задаче нужно как минимум 2 принтера

// Теперь чтобы  выбирать  только нужные книжки надо сделать фильтр, мы его тоже сляпаем в стиле STL

class BookFilter : public unary_function< const book&, bool>
{
public:
  ~virtual BookFilter() {}
  bool operator() (const book& b) { return ok(b); }
proteced:
  virtual bool ok(const book&) =  0 ;
};
// Ну вот теперь можно рисовать ему наследников 

Ввод с клавиатуры - особ статья, можно с cin, можно формочку нарисовать поэтому это отдельная ветка. Ну вот, щас на меня нападут, что я лапши нарезал.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34475181
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 blinded

С каких это пор в С++ появились шаблонные виртуальные функции:

Код: plaintext
1.
2.
3.
4.
5.
  
  template<class forward_iterator> 
      virtual void save(forward_iterator begin, forward_iterator end) =  0 ;
  template<class insert_iterator> 
      virtual void restore(insert_iterator) =  0 ;     

? %)
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34475424
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 blinded

С каких это пор в С++ появились шаблонные виртуальные функции:

Код: plaintext
1.
2.
3.
4.
5.
  
  template<class forward_iterator> 
      virtual void save(forward_iterator begin, forward_iterator end) =  0 ;
  template<class insert_iterator> 
      virtual void restore(insert_iterator) =  0 ;     

? %)
Да-да это я маханул, просто мысля бежала впереди паровоза
надо вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  

virtual void save(Bookshelf::const_iterator begin, Bookshelf:const_iterator end) =  0 ;
virtual void restore(Bookshelf::insert_iterator i) =  0 ;

// а в bookshelf оперделить insert_iterator
typedef back_insert_iterator< container > insert_iterator;

Во так правильно
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34477641
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Всем кто откликнулся
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34478409
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: plaintext
1.
#include <conio.h>
Нестандартный заголовок. Попробуй обойтись стандратными средствами.
2.
public: для struct лишнее. Ибо это умолчание.
3.
Код: plaintext
1.
2.
3.
using std::string;
using std::cout;
etc
тебя спасут.
4.
_name и прочие: не стоит использовать идентификаторы с ведущего подчеркивания. Впрочем, тут это дело вкуса.
5.
Код: plaintext
if(!file)
неправильная проверка успешности открытия файла. В случае неуспеха file не станет NULL.

Пость пофиксенный вариант.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34478537
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg
4.
_name и прочие: не стоит использовать идентификаторы с ведущего подчеркивания. Впрочем, тут это дело вкуса.


Здесь не только дело вкуса, стандарт отводит идентификаторы начинающиеся на '_' разработчикам компиляторов и библиотек, поэтому использование таких идентификаторов, мягко говоря, нежелательно.

grieg
5.
Код: plaintext
if(!file)
неправильная проверка успешности открытия файла. В случае неуспеха file не станет NULL.


вполне корректная проверка, ведь file это std::ofstream.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34478590
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Стандарт резервирует идентификаторы, начинающиеся с подчеркивания и заглавной буквы или содержащме двойное подчеркивание. В любом случае -- это темные уголки стандарта. Не надо использовать ведущее подчеркивание и все.

2.
http://www.cplusplus.com/reference/iostream/ofstream/open.html
On failure, the failbit flag is set (which can be checked with member fail), and depending on the value set with exception an exception may be thrown.
Так что я все-таки полагаю, что проверка некорректна.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34478616
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Здесь не только дело вкуса, стандарт отводит идентификаторы начинающиеся на '_' разработчикам компиляторов и библиотек, поэтому использование таких идентификаторов, мягко говоря, нежелательно

Вот разработчикам STL можно, а мне нельзя. Это чегой-то за дискриминация?
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34478796
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 grieg

Вот цитата из стандарта:

автор27.4.4.3 basic_ios iostate flags functions
operator void*() const;
1 Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success.
bool operator!() const;
2 Returns: fail().
iostate rdstate() const;
3 Returns: The error state of the stream buffer.

Как видно, в выражении !file будет использован перегруженный оператор !, который, согласно стандарта, возвращает значение fail. Так что проверка, вполне,коректна.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34479329
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Был не прав, погорячился.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34486785
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не посмотрите переработанный код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
#include <iostream>

#include <string>

#include <deque>

#include <fstream>




using std::cin;

using std::cout;

using std::endl;




namespace BookEditor

{

       using std::string;

       using std::fstream;

       using std::ofstream;

       using std::ifstream;

       using std::copy;

       using std::deque;

       using std::ios;




       struct book

       {

               string m_surname;

               string m_name;

               string m_title;

               string m_discipline;    

               int m_page_num;

               int m_chap_num;

               int m_pub_year;

               book():m_surname("N/A"),m_name("N/A"),m_title("N/A"),m_discipline("N/A"),m_page_num( 0 ),m_chap_num( 0 ),m_pub_year( 1980 ){}

               book(const string& surname, const string& name, const string& title, const string& discipline, int page_num, int chap_num, int pub_year):m_surname(surname),m_name(name),m_title(title),m_discipline(discipline),m_page_num(page_num),m_chap_num(chap_num),m_pub_year(pub_year){}

       };




       class driver

       {

               friend class manager;

               //Открыть

               void open(const string& path, deque<book*>& BookBase);

               //Сохранить

               void save(const string& path, deque<book*>& BookBase);

               driver(){};

               ~driver(){};

       };

       //////////////////////////////////////

       ///Сохранение изменений

       void driver::save(const string& path, deque<book*>& BookBase)

       {

               ofstream file(path.c_str(), ios::binary);

               if(!file.is_open()) throw ("Could not open path");

               for (int i =  0 ; i < BookBase.size(); i++)

               {

                       cout << ".";

                       //Сохраняем размер и строку поля Name

                       int tmp_size = BookBase[i]->m_name.size();

                       file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));

                       file.write(BookBase[i]->m_name.c_str(),sizeof(char)*tmp_size);

                       //Сохраняем размер и строку поля Surname

                       tmp_size = BookBase[i]->m_surname.size();

                       file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));

                       file.write(BookBase[i]->m_surname.c_str(),sizeof(char)*tmp_size);

                       //Сохраняем размер и строку поля Title

                       tmp_size = BookBase[i]->m_title.size();

                       file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));

                       file.write(BookBase[i]->m_title.c_str(),sizeof(char)*tmp_size);

                       //Сохраняем размер и строку поля Discipline

                       tmp_size = BookBase[i]->m_discipline.size();

                       file.write(reinterpret_cast<char*>(&tmp_size),sizeof(int));

                       file.write(BookBase[i]->m_discipline.c_str(),sizeof(char)*tmp_size);

                       //Сохраняем поля Page Number, Chapter Number, Publishment year

                       file.write(reinterpret_cast<char*>(&BookBase[i]->m_page_num),sizeof(int));

                       file.write(reinterpret_cast<char*>(&BookBase[i]->m_chap_num),sizeof(int));

                       file.write(reinterpret_cast<char*>(&BookBase[i]->m_pub_year),sizeof(int));

               }

               file.close();

       }

       //////////////////////////////////////

       ///Открытие файла

       void driver::open(const string& path, deque<book*>& BookBase)

       {

               ifstream file(path.c_str(),ios::binary);

               std::deque<book*> temp_arr; //Сначала загрузим данные во временную базу и если все пройдет хорошо - запишем в основную

               if (!file.is_open())

               {

                       file.clear();

                       throw ("Could not open file");

               }

               //Чтение записей

               while (!file.eof())

               {

                       cout << ".";

                       string surname,name,title,discipline;    

                       int size_surname,size_name,size_title,size_discipline;

                       int page_num, chap_num, pub_year;

                       //Читаем размер поля Name и пишим данные в переменную name

                       file.read(reinterpret_cast<char*>(&size_name),sizeof(int));

                       name.resize(size_name);

                       file.read(&name[ 0 ],size_name);

                       //Читаем размер поля Surname и пишим данные в переменную surname

                       file.read(reinterpret_cast<char*>(&size_surname),sizeof(int));

                       surname.resize(size_surname);

                       file.read(&surname[ 0 ],size_surname);

                       //Читаем размер поля Title и пишим данные в переменную title

                       file.read(reinterpret_cast<char*>(&size_title),sizeof(int));

                       title.resize(size_title);

                       file.read(&title[ 0 ],size_title);

                       //Читаем размер поля Discipline и пишим данные в переменную discipline

                       file.read(reinterpret_cast<char*>(&size_discipline),sizeof(int));

                       discipline.resize(size_discipline);

                       file.read(&discipline[ 0 ],size_discipline);

                       //Читаем данные поля Page Number, Chapter Number, Publishment Year и заносим в соотвествующие переменные

                       file.read(reinterpret_cast<char*>(&page_num),sizeof(int));

                       file.read(reinterpret_cast<char*>(&chap_num),sizeof(int)); 

                       file.read(reinterpret_cast<char*>(&pub_year),sizeof(int)); 

                       if(file.eof()) 

                       {

                               file.clear();

                               break;        

                       }    

                       temp_arr.push_back(new book(surname,name,title,discipline,page_num,chap_num,pub_year));

               }

               file.close();

               if (BookBase.size() !=  0 )//Если основная база непуста - чистим ее

               {

                       for (int i =  0 ; i < BookBase.size(); ++i)

                               delete BookBase[i];

                       BookBase.clear();

               }

               BookBase.resize(temp_arr.size());

               copy(temp_arr.begin(),temp_arr.end(),BookBase.begin());

       }




       class manager

       {

       private:

               deque<book*> m_BookBase; 

               string m_path;

               driver m_driver;

               bool m_are_changes;

       public:

               void add();

               void display_all() const;

               void display_spec() const;

               void open();

               void save();

               void save_as();

               const bool are_changes()const

               {

                       return m_are_changes;

               }

               manager():m_are_changes(false){}

               ~manager()

               {

                       try

                       {

                               for (int i =  0 ; i < m_BookBase..size(); ++i)

                                       delete m_BookBase[i];

                               m_BookBase.clear();

                       }

                       catch(...)

                       {

                               cout << "An error";

                       }

               }

       };

       //////////////////////////////////////

       ///Вставка записи

       void manager::add()

       {

               _flushall();

               string surname, name, title, discipline;    

               int page_num, chap_num, pub_year;

               cout << "--------------------------------\n";

               cout << "Enter name: ";

               getline(cin,name);

               cout << "Enter surname: ";

               getline(cin,surname);

               cout << "Enter title: ";

               getline(cin,title);

               cout << "Enter Discipline: ";

               getline(cin,discipline);

               cout << "Enter page number: ";

               cin >> page_num;

               cout << "Enter chapters number: ";

               cin >> chap_num;

               cout << "Enter a year of publishment: ";

               cin >> pub_year;

               m_BookBase.push_back(new book(surname,name,title,discipline,page_num,chap_num,pub_year));

               m_are_changes = true;

               _flushall();

       }

       //////////////////////////////////////

       ///Отобразить все записи

       void manager::display_all() const

       {

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

               for (int i =  0 ; i < m_BookBase.size(); ++i)

               {

                       cout << "\n--------------------------------\n";

                       cout << "Position: " << i << endl;

                       cout << "Name: " << m_BookBase[i]->m_name << endl;

                       cout << "Surname: " << m_BookBase[i]->m_surname << endl;

                       cout << "Title: " << m_BookBase[i]->m_title << endl;

                       cout << "Discipline: " << m_BookBase[i]->m_discipline << endl;

                       cout << "Page number: " << m_BookBase[i]->m_page_num << endl;

                       cout << "Chapter number: " << m_BookBase[i]->m_chap_num << endl;

                       cout << "Publishment`s year: " << m_BookBase[i]->m_pub_year << endl;

                       cout << "--------------------------------";

               }

       }

       //////////////////////////////////////

       ///Отобразить записи с заданной дисциплиной

       void manager::display_spec() const

       {

               bool flag = false;//Флаг c заданной дисциплиной

               string discipline;

               cout << "Enter discipline: ";

               cin >> discipline;

               for (int i =  0 ;i < m_BookBase.size(); ++i)

               {

                       if (m_BookBase[i]->m_discipline != discipline) continue;

                       cout << "\n--------------------------------\n";

                       cout << "Position: " << i << endl;

                       cout << "Surname: " << m_BookBase[i]->m_surname << endl;

                       cout << "Title: " << m_BookBase[i]->m_title << endl;

                       cout << "Page number: " << m_BookBase[i]->m_page_num << endl;

                       cout << "--------------------------------";

                       flag = true;

               }

               if (flag == false) cout << "The are no books of such a discipline";

       }

       //////////////////////////////////////

       ///Загрузка базы из файла

       void manager::open()

       {

               _flushall();

               cout << "Enter path to file: ";

               getline(cin, m_path);

               m_driver.open(m_path, m_BookBase);

               cout << " Ok\n";

       }

       //////////////////////////////////////

       ///Сохранение базы в текущий файл

       void manager::save()

       {

               m_driver.save(m_path, m_BookBase);

               m_are_changes = false;

               cout << " Ok\n";

       }

       //////////////////////////////////////

       ///Сохранение базы в иной файл

       void manager::save_as()

       {

               if (m_are_changes == true) //Проверяем есть ли что-нибудь в памяти (изменены данные ранее открытого файла или просто в памяти уже присуствует какая-либо база

               {

                       cout << "Do you want to save changes before closing file? y/n";

                       char choice;

                       cin >> choice;

                       switch (choice)

                       {

                       case 'y':save();

                               break;

                       case 'Y':save();

                               break;

                       case 'n':break;

                       case 'N':break;

                       default:cout << "Incorrect choice\n";

                               break;

                       }

               }

               //Открываем файл

               cout << "Enter path to file: ";

               _flushall();

               getline(cin,m_path);

               save();

       }

}




using BookEditor::manager;







int main(int argc, char* argv[])

{

       manager man;

    char choice = '\0';

    do

    {

               choice = '\0';

        cout << "\nChoose action:\n"

             << "'a' - add book\n" 

             << "'e' - display book with a specified discipline\n"

             << "'d' - display all books\n"    

             << "'o' - open file\n"

             << "'s' - save changes\n" 

             << "'p' - save as\n"

             << "'q' - quit\n";    

        cin >> choice;

        try

        {

            switch(choice)

            {

            case 'a':man.add();

                break;

                       case 'e':man.display_spec();

                break;

            case 'o':man.open();

                break;

                       case 'd':man.display_all( );

                break;

            case 's':man.save();

                break;

            case 'p':man.save_as();

                break;

            case 'q':break;

            default:cout << "Incorrect choice\n";

                break;

            }

        }

        catch (char* msg)

        {

                       cout << msg;

               }

        catch (...) 

        {

                       cout << "Unhalded exception";

        }

    }while(choice != 'q');

    if (man.are_changes() == true)

    {

        char choice;

        do

        {

            cout << "Yo have made changes to file. Do you want to save them? y/n ";

            cin >> choice;

            if (choice == 'y' || choice == 'Y')

            {

                man.save();

                break;

            }

        }while(choice != 'n' && choice != 'N');

    }

       cin.sync();

    cin.get();

    return  0 ;

}

...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34486863
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а практически ничего и не изменилось. Ну добавился класс, driver только вот его появление не привнесло ничего нового, не получилось гибкой структуры. Вот захочется тебе заменить запись в двоичный код на запись в xml формат и что делать? А ежели захочется чтобы оба формата жили в одной программе? Тоже самое мжно сказать и о выводе на экран. Нужно выводить в двух форматах, ну так и сделай под каждый формат свой класс, понадобится третий- просто добавишь класс. А если так как сейчас - придется дописывать manager и перетестировать его. А что там у нас с поиском? Испарился?
Вот на первый взгляд
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498008
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью переработал код программы
компилируется под Борланд 3.11
что скажете?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
#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();
  
}

...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498180
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
Устаревшие заголовки. Следует использовать iostream, fstream, etc. и пространство имен std. Или борланд еще не в курсе?

Код: plaintext
1.
#include <conio.h>
Нестандартный и ненужный заголовок

Код: plaintext
1.
#include <stdlib.h>
Лишний заголовок?

Код: plaintext
1.
2.
3.
4.
5.
6.
#define FIO  20 
#define name  20 
#define PUBLISHERS  20 
#define YEAR  4 
#define PAGES   6 
#define CHAPTER  6 
Не согласованы с объявлением структуры book.

Код: plaintext
1.
2.
3.
4.
5.
struct  book
{
  char fio[ 25 ];
  char name_book [ 25 ];
  char publishers[ 25 ];
Явные числа -- зло. Такие вещи следует вынести в константы

Код: plaintext
1.
2.
3.
4.
5.
// прототипы функций
void sozdanie();
void prosmotr();
void vibor();
void tabl(); 
Стоит разбить проект файла на три: main.cpp, library.h, library.cpp. Протитипы (с комментариями, поясняющими назначение, перенести в h -файл.


Код: plaintext
1.
 void main(void)
Неверный прототип функции main.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498193
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grieg Устаревшие заголовки. Следует использовать iostream, fstream, etc. и пространство имен std. Или борланд еще не в курсе?

Борланд 3.11 именно не в курсе - не компилируется если я так напишу(а задание именно в нем написать)

grieg Не согласованы с объявлением структуры book.

не согласованны с чем?
с этим?
Код: plaintext
1.
2.
3.
4.
5.
6.
struct  book
{
  char fio[ 25 ];
  char name_book [ 25 ];
  char publishers[ 25 ];


можно тогда так написать?
Код: plaintext
1.
2.
3.
4.
5.
6.
struct  book
{
  char fio[];
  char name_book [];
  char publishers[];

...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498213
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про Борланд: Ужас-ужас.
Про define
Вот это:
Код: plaintext
1.
#define FIO  20  
противоречит
Код: plaintext
1.
char fio[ 25 ];
Сколько символов отводится под ФИО (включая завершающий ноль)? Пиши так.
Код: plaintext
1.
char fio[FIO];
А число 20 (25) в явном виде не используй. Написать
Код: plaintext
1.
char fio[];
нельзя, ибо места в структуре под строку не будет.
А вообще, по хорошему, надо хранить строки в std::string и не париться с выделением/освобождением.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498221
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть должно быть так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#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 
#define Discipline   17 
//--------------------------------------------------------------------------------------
struct  book
{
  char fio[FIO];
  char name_book [name];
  char publishers[PUBLISHERS];
  int year_publishers;
  int pages;
  int chapter;
  char discipline[Discipline ];
};
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498335
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так более осмысленно.
Еще раз: зачем тебе conio.h и stdlib.h?
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498376
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
#include <iostream.h>
#include <conio.h>
убрал, действительно лишнее(#include<conio.h> было скорее по привычке для функции getch() )

Код: plaintext
1.
2.
#include <stdlib.h>

Нужен для библиотечной функции " exit(1); // аварийный выход"
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498385
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lradНужен для библиотечной функции " exit(1); // аварийный выход"
Пока забудь о ее существовании, при ее вызове НЕ ВЫЗЫВАЮТСЯ ДЕСТРУКТОРЫ СТАТИЧЕСКИХ ОБЪЕКТОВ, костей не соберешь.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34498427
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблема с программой:
При сохранении данных в английской раскладке все замечательно
а при сохранении в русской раскладке - не работает поиск
что можно придумать? кроме конечно же сохранения только в английской раскладке..
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34500709
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "не работает"? Функция strcmp считает неправильно сравнивает русскоязычные строки? Или что? Под дебагером посмотри.
А вообще правильней строки в std::string хранить.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34500733
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Русскоязычные строки(именно дисциплина) неправильно сравниваются
при выводе результатов поиска - пустая шапка
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34501178
lrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался сам
только не понял почему так
в функции vibor()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
void vibor()
{
   char discipline[Discipline ];  // для ввода условия поиска
   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();
  
}

я вместо
Код: plaintext
1.
2.
 
cin.get(discipline,'\n');
написал просто
Код: plaintext
1.
cin>>discipline;
и все заработало
А какая разница?
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34501225
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай описание функции get
http://www.cplusplus.com/reference/iostream/istream/get.html
Я так понимаю, ты по ошибке взял
Код: plaintext
1.
istream& get ( char* s, streamsize n );
'\n' неявно преобразовалось в число. А это не совсем то, что тебе было нужно.

То, как сделано сейчас, будет некорректно обрабатывать пробелы и подобные символы. Попробуй найди книгу, у которой в названии дисциплины есть пробел.
...
Рейтинг: 0 / 0
Помогите, пожалуйста оптимизировать код программы
    #34501242
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, в книжку пришлось лезть.
Во первых метода get(char* buf, char delim) нету
есть
get(char* buf, streamsize sz) - читает не более sz-1 символов до ближайщего '\n'
get(char* buf, streamsize sz, char delim) -читает не более sz-1 до указанного разделителя
но так как char компилятор запросто перевел в int ты читал меньше символов чем хотел
кстати писать
cin >> buf тоже не совсем корректно buf у тебя ограничен, а поток то будет тебе читать пока перевод каретки не встртит, писать надо
сin >> setw(17) >> buf;
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста оптимизировать код программы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]