Не работает цикл с классовым типом данных

Тема в разделе "C/C++/C#", создана пользователем ilya1989, 23 май 2011.

  1. ilya1989

    ilya1989 Гость

    Уважаемые господа-программисты!
    Не могу уже который день разобраться с 2-мя проблемами:
    1.В данной программе первая функция sozdanie() организованна с циклом while при вводе данных с клавиатуры.В данном случае,вводится информация по книгам(библиотека).После(окончания ввода данных
    об одной книге в цикле while задано,что пока пользователь нажимает 'Д','д','Y','y'.ввод данных с клавиатуры не прекращается.ПРОГРАММУ ПИСАЛ ПО МЕТОДИЧКЕ ПРЕПОДАВАТЕЛЯ,Т.К. ПРЕПОД УКАЗАЛ,ЧТО ОТКЛОНЕНИЙ ПРИ НАПИСАНИИ ПРОГРАММЫ ОТ ЕЁ РАБОТЫ БЫТЬ НЕ ДОЛЖНО!
    Но,при нажатии вышеуказанных символов программа почему-то возвращает меня в main().
    2.Функция prosmotr() так же тупит!Она почему-то выдает при выводе не 5 введенных данных,а 6

    Вот код программы
    Код (C++):
    #include <iostream.h>
    #include <fstream.h>
    #include <conio.h>
    #include <iomanip.h>
    #include <io.h>
    #define A 2
    class Book
    {
    public:
    char name[15];
    char FIO[20];
    int page;
    char publishing_office[15];
    char publication_date[12];
    };
    void sozdanie();
    void tabl();
    void prosmotr();
    void poisk();


    //1.ввод с клавиатуры
    istream &operator>>(istream &vvod,Book &book)
    {

    cout<<"\nВведите название книги :";
    vvod.ignore();
    vvod.get(book.name,14,'\n');
    cout<<"\nВведите ФИО Автора :";
    vvod.ignore();
    vvod.get(book.FIO,19,'\n');
    cout<<"\nВведите колличество страниц в книге :";
    cin.ignore();
    cin>>book.page;
    cout<<"\nВведите название издательства книги :";
    vvod.ignore();
    vvod.get(book.publishing_office,14,'\n');
    cout<<"\nВведите дату публикации книги(год) :";
    vvod.ignore();
    vvod.get(book.publication_date,11,'\n');
    return vvod;
    }

    //2.Вывод на дисплей
    ostream &operator<<(ostream &vivod,Book &book)
    {
    vivod.setf(ios::left);
    vivod<<setw(15)<<book.name<<"|"<<setw(20)<<book.FIO<<"|"<<setw(5)
    <<book.page<<"|"<<setw(15)<<book.publishing_office<<"|"<<setw(12)<<book.publication_date<<endl;
    return vivod;
    }

    //3.Чтение из файла
    ifstream &operator>>(ifstream &read,Book &book)
    {
    read.getline(book.name,15,'\n');
    read.getline(book.FIO,20,'\n');
    read>>book.page;
    read.seekg(2L,ios::cur);
    read.getline(book.publishing_office,15,'\n');
    read.getline(book.publication_date,12,'\n');
    return read;
    }

    //4.Запись в файл
    ofstream &operator<<(ofstream &write,Book &book)
    {
    write<<book.name<<endl;
    write<<book.FIO<<endl;
    write<<book.page<<endl;
    write<<book.publishing_office<<endl;
    write<<book.publication_date<<endl;
    return write;
    }

    void tabl()
    {
    cout<<"------------------------------------------------------------------------\n";
    cout<<"|     Название |      ФИО     | Кол.| Наименование |   Дата |\n";
    cout<<"|     книги  |      АВТОРА     | стр.| издательства | публикации|\n";
    cout<<"------------------------------------------------------------------------\n";
    }


    //создание файла
    void sozdanie()
    {
    char x;
    ofstream new_f("Book.txt",ios::app);
    Book a;
    if(!new_f)
    {
    cerr<<"Do not create of file Book.txt"<<endl;
    return;
    }
    do
    {
    cin>>a;
    new_f<<a;
    cout<<"Продолжить ввод? (Д/Н,Y/N)";
    cin.get(x);
    }
    while(x=='Y'||x=='y'||x=='Д'||x=='д');
    new_f.close();
    getch();
    }

    //вывод всей информации на дисплей
    void prosmotr()
    {
    ifstream out("Book.txt",ios::in);
    Book b;
    if(!out)
    {
    cerr<<"Не удалось открыть файл Book.txt для чтения!"<<endl;
    return;
    }
    cout<<"Вывод всей информации из файла \n";
    tabl();
    while(out)
    {
    out>>b;
    cout<<b;
    }
    out.close();
    cout<<"\n|--------------|------------------|----------|---------------|----------|"<<endl;
    getch();
    }

    //поиск данных по условиям
    void poisk()
    {
    char izdatelstvo[15];
    char date[12];
    int kol=0;
    ifstream poisk("Book.txt",ios::in);
    Book s;
    if(!poisk)
    {
    cerr<<"Ошибка открытия файла Book.txt для чтения ";
    return;
    }
    cin.ignore();
    cout<<"Введите наименование издательства :";
    cin.getline(izdatelstvo,14,'\n');
    cout<<"Введите год издания книги :";
    cin.getline(date,11,'\n');
    cout<<"Результаты поиска";
    tabl();
    while(!poisk.eof())
    {
    poisk>>s;
    if(!strcmp(izdatelstvo,s.publishing_office)||(!strcmp(date,s.publication_date)))
    {
    kol++;
    cout<<s;
    }
    }
    if(kol==0)
    {
    cout<<"Zapisey ne naydeno!";
    }
    getch();
    poisk.close();

    cout<<"|--------------|------------------|----------|---------------|----------|"<<endl;
    }

    void main(void)
    {
    char c;
    while (1)
    {
    cout << endl << "1. Создание файла";
    cout << endl << "2. Просмотр содержимого";
    cout << endl << "3. Вывод информации о книге(ах)";
    cout << endl << "4. Выход";
    cout << endl << "Ваш выбор -> ";
    cin.get(c);
    switch(c)
    {
    case '1':
    sozdanie();
    break;

    case '2':
    prosmotr();
    break;

    case '3':
    poisk();
    break;

    case '4':
    return;
    default:
    cout << "Вводите только цифры от 1 до 4" << endl;
    }
    }
    }

    вот скриншот первой функции
    1.jpg
    в данном случае я ввел ради проверки все "1"
    после нажатия 'Y' меня вернуло в главное меню,а ввод-то должен продолжаться!

    вот второй скриншот вывода всех данных из файла,но вывод так же не работает,поскольку откуда-то взялась при выводе лишняя 1!

    2.jpg

    Заранее очень благодарен всем,кто откликнется!
     

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      127,6 КБ
      Просмотров:
      48
    • 2.jpg
      2.jpg
      Размер файла:
      111,4 КБ
      Просмотров:
      44
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    В функции sozdanie замени cin.get(x); на cin >> x;
     
  3. ilya1989

    ilya1989 Гость

    Вопросик:а чем отличается cin.get(x) от cin >> x? просто в методичке препода было указанно именно так,а чем отличаются эти два действия,не совсем понимаю...
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
  5. ilya1989

    ilya1989 Гость

    Тогда вопрос остаётся,что делать с функцией вывода всей информации на дисплей?откуда берется вывод одной и той же цифры в столбце 2 раза(рис.2)?
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Может ты все же напишешь русский текст транслитом! Мне, если честно, лень гадать что у тебя на изображениях...
     
  7. ilya1989

    ilya1989 Гость

    Запросто
    cout<<"------------------------------------------------------------------------\n";
    cout<<"| Название | ФИО | Кол.| Наименование | Дата |\n";
    cout<<"| книги | АВТОРА | стр.| издательства | публикации|\n";
    (name) (FIO) (page) (publishing_office) (publication_date)
    cout<<"------------------------------------------------------------------------\n";

    Так нормально будет?
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Нет, не нормально. Просто переведи весь русский текст программы на транслит.
     
Загрузка...

Поделиться этой страницей