Stl

Тема в разделе "C/C++/C#", создана пользователем Firiat, 8 ноя 2011.

  1. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    Код (C++):
    /*
    Здорова .    Как сделать выдачу сведений о всех книгах, упорядоченных по фамилиям авторов с помощью контейнера vector ? Спс.
    */

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    void add();//добавление книг и данных
    void vivod();//вывод данных о книгах
    void allavtor(string);//вывод по автору
    void allgod(int);//вывод по году
    int t,u;
    vector <int> god,kol;
    vector <string> famil,imy,naz;
    void main()
    {
    setlocale (0,"Rus");
    bool q=0;
    while (q!=1)
    {
    cout<<"Выберите :\n";
    cout<<"1 - Добавление данных о книгах\n";
    cout<<"2 - Вывод о всех книгах\n";
    cout<<"4 - Вывод сведений по автору\n";
    cout<<"5 - Вывод сведений по году\n";
    cout<<"0 - Выход\n";

    char n;

    cin>>n;
    switch(n)
    {
    case '1':
    {
    add();
    break;
    }
    case '2':
    {  
    vivod();
    break;
    }
    case '3':
    {
    cout<<"Введите автора книги:\n";
    string j;
    cin>>j;
    allavtor(j);
    break;
    }
    case '4':
    {
    cout<<"Введите год издания:\n";
    int g;
    cin>>g;
    allgod(g);
    break;
    }
    case '0':
    {
    q=1;
    break;
    }
    default:cout<<"Введите другие данные\n";
    }
    }
    }
    void add()//добавление книг
    {
    cout<<"Сколько нужно добавить книг?\n";
    int a;
    cin>>a;
    t=a;
    for (int i=0;i<a;i++)
    {
    cout<<"Введите фамилию автора:\n";
    string r;
    cin>>r;
    famil.push_back(r);
    cout<<"Введите имя:\n";
    string e;
    cin>>e;
    imy.push_back(e);
    cout<<"Введите название книги:\n";
    string s;
    cin>>s;
    naz.push_back(s);
    cout<<"Введите год издания:\n";
    int k;
    cin>>k;
    god.push_back(k);
    cout<<"Введите количество экземпляров:\n";
    int m;
    cin>>m;
    kol.push_back(m);
    }
    }
    void vivod()//вывод данных о всех книгах
    {
    for (int i=0;i<t;i++)
    {
    cout<<"Фамилия автора: "<<famil[i]<<"\n";
    cout<<"Имя автора: "<<imy[i]<<"\n";
    cout<<"Название книги: "<<naz[i]<<"\n";
    cout<<"Год издания книги: "<<god[i]<<"\n";
    cout<<"Количество экземпляров: "<<kol[i]<<"\n\n";
    }
    }

    void allavtor(string a)
    bool r=0;
    for (int i=0;i<t;i++)
    {
    if (famil[i]==a)
    {
    cout<<"Фамилия автора: "<<famil[i]<<"\n";
    cout<<"Имя автора: "<<imy[i]<<"\n";
    cout<<"Название книги: "<<naz[i]<<"\n";
    cout<<"Год издания книги: "<<god[i]<<"\n";
    cout<<"Количество экземпляров: "<<kol[i]<<"\n\n";
    r=1;
    }
    }
    if (r==0) cout<<"Такого автора нет\n";
    }
    void allgod(int a)
    {
    bool r=0;
    for (int i=0;i<t;i++)
    {
    if (god[i]==a)
    {
    cout<<"Фамилия автора: "<<famil[i]<<"\n";
    cout<<"Имя автора: "<<imy[i]<<"\n";
    cout<<"Название книги: "<<naz[i]<<"\n";
    cout<<"Год издания книги: "<<god[i]<<"\n";
    cout<<"Количество экземпляров: "<<kol[i]<<"\n\n";
    r=1;
    }
    }
    if (r==0) cout<<"Такого года издания нет\n";
    }
     
  2. shuttle

    shuttle Гость

    Не стоит хранить данные в отдельных векторах. Лучше сделать структуру или класс типа Книга со всеми этими данными и затем создать вектор с данным типом. А сортировать его предикатом.

    вот сам тип Book с конструктором
    Код (C++):
    struct Book
    {
    std::string m_sSurname;
    std::string m_sName;
    std::string m_sNameBook;
    int m_nQuantity;
    int m_nYear;

    Book(std::string sSurname,
    std::string sName,
    std::string sNameBook,
    int nQuantity,
    int nYear):
    m_sSurname(sSurname),
    m_sName(sName),
    m_sNameBook(sNameBook),
    m_nQuantity(nQuantity),
    m_nYear(nYear)
    {} 
    };
    предикат для сортировки
    Код (C++):
    class StringCompare
    {
    public:
    bool operator()(const Book& book1, const Book& book2)
    {
    return book1.m_sSurname < book2.m_sSurname;
    }
    };
    ну и собственно сам код
    Код (C++):
    #include "stdafx.h"
    #include <string>
    #include <vector>
    #include <iostream>
    #include <iterator>
    #include <algorithm>



    struct Book
    {
    std::string m_sSurname;
    std::string m_sName;
    std::string m_sNameBook;
    int m_nQuantity;
    int m_nYear;

    Book(std::string sSurname,
    std::string sName,
    std::string sNameBook,
    int nQuantity,
    int nYear):
    m_sSurname(sSurname),
    m_sName(sName),
    m_sNameBook(sNameBook),
    m_nQuantity(nQuantity),
    m_nYear(nYear)
    {} 
    };

    std::ostream& operator<<(std::ostream& os, const Book& book)
    {
    os<<"Surname = "<<book.m_sSurname<<
    "\nName = "<<book.m_sName<<
    "\nNameBook = "<<book.m_sNameBook<<
    "\nQuantity = "<<book.m_nQuantity<<
    "\nYear = "<<book.m_nYear<<
    "\n-----------------------------------------------------"<<std::endl;
    return os;
    }

    class StringCompare
    {
    public:
    bool operator()(const Book& book1, const Book& book2)
    {
    return book1.m_sSurname < book2.m_sSurname;
    }
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
    std::vector<Book> vectorBook;

    vectorBook.push_back(Book("Stroustrup", "Bjarne", "The Design and Evolution of C++", 10000, 1994));
    vectorBook.push_back(Book("Stroustrup", "Bjarne", "The C++ Programming Language", 10000, 2000));
    vectorBook.push_back(Book("McConnell", "Steve", "Code Complete", 10000, 2005));


    std::cout<<"Befor sort"<<std::endl<<std::endl;
    for(std::vector<Book>::iterator it=vectorBook.begin(); it!=vectorBook.end();++it)
    std::cout<<*it;
    std::cout<<std::endl<<std::endl<<std::endl;

    std::sort(vectorBook.begin(), vectorBook.end(), StringCompare());

    std::cout<<"After sort"<<std::endl<<std::endl;
    for(std::vector<Book>::iterator it=vectorBook.begin(); it!=vectorBook.end();++it)
    std::cout<<*it;

    return 0;
    }
    вот как то так
     
  3. Firiat

    Firiat Well-Known Member

    Регистрация:
    19 окт 2010
    Сообщения:
    48
    Симпатии:
    0
    Спс за ответ. А вот организовать вывод упорядоченных по фамилиям авторов с помощью контейнера vector отдельно можно? Как я делал с выводом по авторам , году .
     
  4. shuttle

    shuttle Гость

    Не понял.
    После сортировки они и так упорядочены по фамилиям авторов. если нужна сортировка и по году добавь сравнение по годам в предикат
    если нужно выводить конкретные книги добавь соответствующие сравнение в вывод.
     
  5. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    можно хранить записи сразу в нужном порядке.
    При добавлении элемента вставлять не в конец, а так чтобы порядок сохранялся.
    Но с вектором это не удобно, лучше list использовать.
     
Загрузка...
Похожие Темы - Stl
  1. Cheburan
    Ответов:
    2
    Просмотров:
    513
  2. Antonim
    Ответов:
    4
    Просмотров:
    1.811
  3. Lavanda
    Ответов:
    6
    Просмотров:
    4.565

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