Классы. Сортировка строк, добавление. С++
Мне нужно предусмотреть в этой программе функцию добавления авторов, не знаю как сделать. И еще такой вопрос я сделал сортировку книг по названию, но с помощью char(то есть я не могу делать пробелы в названии) возможно ли сделать ее с string как-то?
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
using namespace std;
class Book
{
char name[50];
int k;
string author;
int year;
int pages;
public:
Book():
name(""), k(0), author(""), year(0), pages(0) {}
~Book() {}
void data();
void out();
friend void sort1(Book *a, int n);
char *getname(void)
{
return name ;
}
};
void sort1(Book *a, int n)
{
for(int i = 0; i < n - 1; i++)
for(int j = i + 1; j < n; j++)
if(strcmp(a[i].getname(), a[j].getname())> 0)
{
Book t = a[i];
a[i] = a[j];
a[j] = t;
}
}
void Book::data()
{
setlocale(LC_ALL,"Russian");
cin.ignore(100,'\n');
cout<<"Название книги: "<<endl;
cin>>name;
cout<<"Количество авторов: "<<endl;
cin>>k;
cin.ignore(100,'\n');
cout<<"Автор(ы): "<<endl;
getline(cin, author);
cout<<"Год издания: "<<endl;
cin>>year;
cout<<"Количество страниц: "<<endl;
cin>>pages;
}
void Book::out()
{
cout<<"Название книги: "<<name<<endl;
cout<<"Количество авторов: "<<k<<endl;
cout<<"Автор(ы): "<<author<<endl;
cout<<"Год издания: "<<year<<endl;
cout<<"Количество страниц: "<<pages<<endl;
}
int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int n,i;
cout<<"Введите количество книг: ";
cin>>n;
Book *a=new Book[n];
for (i=0;i<n;i++)
{
cout<<"Книга "<<i+1<<endl;
a[i].data();
}
for (i=0;i<n;i++)
{
a[i].out();
}
sort1(a, n);
cout<<endl;
cout<<"Названия книг по алфавиту: "<<endl;
for (i=0;i<n;i++)
{
a[i].out();
}
return 0;
}
Ответы (1 шт):
Автор решения: Кирилл
→ Ссылка
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
#include <vector> //подключаем векторы
using namespace std;
class Book
{
string name;
int k;
vector<string> author; //поменяли string на vector<string>
int year;
int pages;
public:
Book() :
name(""), k(0), author(vector<string>(1,"")), year(0), pages(0) {} //authot("") => author(vector<string>(1,""))
~Book() {}
void data();
void out();
friend void sort1(Book* a, int n);
const char* getname(void)
{
return name.c_str(); // костыль, что бы не менять код sort1, возвращаем строку в виде const char*
}
};
void sort1(Book* a, int n)
{
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (strcmp(a[i].getname(), a[j].getname()) > 0)
{
Book t = a[i];
a[i] = a[j];
a[j] = t;
}
}
void Book::data()
{
setlocale(LC_ALL, "Russian");
cin.ignore(100, '\n');
cout << "Название книги: " << endl;
getline(cin, name); //изменено cin>>name;
cout << "Количество авторов: " << endl;
cin >> k;
cin.ignore(100, '\n');
cout << "Автор(ы): " << endl;
string temp;
int i = k; //
while (i--!=0) { //
getline(cin, temp); // построчно считываем авторов
author.push_back(temp); //
} //
cout << "Год издания: " << endl;
cin >> year;
cout << "Количество страниц: " << endl;
cin >> pages;
}
void Book::out()
{
cout << "Название книги: " << name << endl;
cout << "Количество авторов: " << k << endl;
cout << "Автор(ы): "; //
for (auto elem : author) // выводим всех авторов одной строкой
cout << elem << " "; //
cout << endl; //
cout << "Год издания: " << year << endl;
cout << "Количество страниц: " << pages << endl;
}
int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int n, i;
cout << "Введите количество книг: ";
cin >> n;
Book* a = new Book[n];
for (i = 0; i < n; i++)
{
cout << "Книга " << i + 1 << endl;
a[i].data();
}
for (i = 0; i < n; i++)
{
a[i].out();
}
sort1(a, n);
cout << endl;
cout << "Названия книг по алфавиту: " << endl;
for (i = 0; i < n; i++)
{
a[i].out();
}
return 0;
}