Stl

Firiat

Well-known member
19.10.2010
48
0
#1
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";
}
 
S

shuttle

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

вот сам тип 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;
}
вот как то так
 

Firiat

Well-known member
19.10.2010
48
0
#3
Спс за ответ. А вот организовать вывод упорядоченных по фамилиям авторов с помощью контейнера vector отдельно можно? Как я делал с выводом по авторам , году .
 
S

shuttle

#4
Спс за ответ. А вот организовать вывод упорядоченных по фамилиям авторов с помощью контейнера vector отдельно можно? Как я делал с выводом по авторам , году .
Не понял.
После сортировки они и так упорядочены по фамилиям авторов. если нужна сортировка и по году добавь сравнение по годам в предикат
если нужно выводить конкретные книги добавь соответствующие сравнение в вывод.
 
R

rrrFer

#5
можно хранить записи сразу в нужном порядке.
При добавлении элемента вставлять не в конец, а так чтобы порядок сохранялся.
Но с вектором это не удобно, лучше list использовать.