IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Сортировка по алфавиту, С++
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Доброго времени суток, появилась проблема: есть структура, читаю из файла, нужно вывести только те спектакли, которые поставленны введенным режиссером. Проблема заключается в том, что в структуре все данные объявлены как string, а не char (тут я знаю как сортировать по алфавиту), а замена стринга на чар приводит к ошибке Lvalue required, если не ошибаюсь, пытается присвоить что-то константе mas[20], хотя этого нельзя сделать. Кто знает подскажите пожалуйста.
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <fstream.h>
#include <ostream.h>
#include <string>

using namespace std;

struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};

void print(theatre mas[20],int nomer)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
}

void change(theatre mas[20],int element)
{
cout<<"Nazvanie: ", cin>>mas[element-1].spekt;
cout<<"Avtor: ", cin>>mas[element-1].avtor;
cout<<"Rezhiser: ", cin>>mas[element-1].rezhiser;
cout<<"Data: ", cin>>mas[element-1].data;
cout<<"Vremya: ", cin>>mas[element-1].time;
}

int del(theatre mas[20],int element,int nomer)
{
int j=0;
mas[element-1].spekt="del";
for (int i = 0; i < nomer; i++)
if (mas[i].spekt != "del")
{
mas[j].spekt = mas[i].spekt;
mas[j].avtor = mas[i].avtor;
mas[j].rezhiser = mas[i].rezhiser;
mas[j].data = mas[i].data;
mas[j].time = mas[i].time;
j++;
}
cout<<"Zapis' udalena!\n";
return nomer=nomer-1;
}

void save(theatre mas[20], int nomer)
{
ofstream f("baza.txt");
for (int i = 0; i < nomer; i++)
if (i!= nomer-1)
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
else
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
f.close();
cout<<"Dannye sohraneny v file 'baza.txt'.\n";
}

int main()
{
theatre mas[20];
int b,element,nomer=0;
string c;
cout<<"Chtenie dannyh iz faila 'baza.txt'...\n";
ifstream f("baza.txt");
while (!f.eof())
{
f>>mas[nomer].spekt;
f>>mas[nomer].avtor;
f>>mas[nomer].rezhiser;
f>>mas[nomer].data;
f>>mas[nomer].time;
nomer++;
}
f.close();
while (true)
{
cout<<"\nVyberite odno iz deistvii:\n";
cout<<"1) Izmenit' zapis'.\n2) Udalit' zapis'.\n3) Prosmotret' dannye.\n";
cout<<"4) Sohranit' dannye.\n5) Informaciya o spektaklyah, postavlennyh";
cout<<" dannym rezhiserom.\n6) Exit.\n";
cin>>b;
switch(b)
{
case 1:
{
cout<<"Vvedite nomer izmenyaemoi zapisi: ";
cin>>element;
change(mas,element);
break;
}
case 2:
{
cout<<"Vvedite nomer udalyaemoi zapisi: ";
cin>>element;
nomer=del(mas,element,nomer);
break;
}
case 3:
{
print(mas,nomer);
break;
}
case 4:
{
save(mas,nomer);
break;
}
case 5:
{
/* theatre tmp;
bool sort = true;
int i;
string a;
while (sort)
{
sort=false;
for (i=0; i < nomer-1; i++)
if ((strlen(mas[i].spekt)>(strlen(mas[i+1].spekt))
{
tmp=mas[i];
mas[i]=mas[i+1];
mas[i+1]=tmp;
sort=true;
}
}
cout<<"\nVvedite familiyu rezhisera: ";
cin>>a;
if (a == mas[i].rezhiser)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<j<<")/n";
cout<<"Nazvanie: "<<mas[i].spekt<<endl<<"Avtor: "<<mas[i].avtor<<
endl<<"Rezhiser: "<<mas[i].rezhiser<<endl<<"Data: "<<mas[i].data<<endl<<
"Vremya: "<<mas[i].time<<endl;
}
}
else
{
cout<<"\nSpektaklei, postavlennyh dannym rezhisserom net!\n";
} */
}
case 6: return 0;
default: cout<<"Nevernye dannye!\n";
}
}
system("pause");
return 0;
}

Прикрепленный файл  baza.txt ( 107 байт ) Кол-во скачиваний: 503
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
а замена стринга на чар приводит к ошибке Lvalue required
Что-то я совсем ничего не понимаю. У тебя фамилия режиссера - это std::string? Почему ты хочешь это менять на char? Смысл в чем? Второе: почему не воспользоваться стандартным алгоритмом std::sort? Зачем делать свою сортировку? Зачем вообще делать сортировку? Просто пройти по массиву и проверить совпадение фамилий. Почему в конце концов массив, а не std::vector, в котором для поиска совпадений существует целый ряд специальных функций? smile.gif У тебя С++ же вроде, что ж ты не используешь его?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(volvo @ 20.12.2010 12:53) *

Что-то я совсем ничего не понимаю. У тебя фамилия режиссера - это std::string? Почему ты хочешь это менять на char? Смысл в чем? Второе: почему не воспользоваться стандартным алгоритмом std::sort? Зачем делать свою сортировку? Зачем вообще делать сортировку? Просто пройти по массиву и проверить совпадение фамилий. Почему в конце концов массив, а не std::vector, в котором для поиска совпадений существует целый ряд специальных функций? smile.gif У тебя С++ же вроде, что ж ты не используешь его?

стандартную знаю сортировку, он будет сортировать фамилию по алфавиту? т.е сравнивает коды символов и упорядочивает их? просто как-то про это не подумал smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
он будет сортировать фамилию по алфавиту?
Переопредели оператор "<" для своей структуры как тебе нужно, будет сортировать хоть по длине фамилии smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(volvo @ 20.12.2010 14:54) *

Переопредели оператор "<" для своей структуры как тебе нужно, будет сортировать хоть по длине фамилии smile.gif

я не знаю, правильно или нет, но что-то тут не то)
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <fstream.h>
#include <ostream.h>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

bool compare(const string &a, const string &b)
{
return a.length()<b.length();
}

struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
bool operator<(theatre ob2)
{
return (spekt < ob2.spekt);
}
};

void print(theatre mas[20],int nomer)
{
int j=1;
for (int i = 0; i < nomer; i++)
{
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
}

void change(theatre mas[20],int element)
{
cout<<"Nazvanie: ", cin.ignore(), getline(cin,mas[element-1].spekt);
cout<<"Avtor: ", cin.ignore(), getline(cin,mas[element-1].avtor);
cout<<"Rezhiser: ", cin.ignore(), getline(cin,mas[element-1].rezhiser);
cout<<"Data: ", cin.ignore(), getline(cin,mas[element-1].data);
cout<<"Vremya: ", cin.ignore(), getline(cin,mas[element-1].time);
}

int del(theatre mas[20],int element,int nomer)
{
int j=0;
mas[element-1].spekt="del";
for (int i = 0; i < nomer; i++)
if (mas[i].spekt != "del")
{
mas[j].spekt = mas[i].spekt;
mas[j].avtor = mas[i].avtor;
mas[j].rezhiser = mas[i].rezhiser;
mas[j].data = mas[i].data;
mas[j].time = mas[i].time;
j++;
}
cout<<"Zapis' udalena!\n";
return nomer=nomer-1;
}

void save(theatre mas[20], int nomer)
{
ofstream f("baza.txt");
for (int i = 0; i < nomer; i++)
if (i!= nomer-1)
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
else
{
f<<mas[i].spekt; f<<endl;
f<<mas[i].avtor; f<<endl;
f<<mas[i].rezhiser; f<<endl;
f<<mas[i].data; f<<endl;
f<<mas[i].time; f<<endl;
}
f.close();
cout<<"Dannye sohraneny v file 'baza.txt'.\n";
}

int main()
{
theatre mas[20];
int b,element,nomer=0;
string c;
vector<theatre>teatr;
cout<<"Chtenie dannyh iz faila 'baza.txt'...\n";
ifstream f("baza.txt");
while (!f.eof())
{
f>>mas[nomer].spekt;
f>>mas[nomer].avtor;
f>>mas[nomer].rezhiser;
f>>mas[nomer].data;
f>>mas[nomer].time;
teatr.push_back(*mas);
nomer++;
}
f.close();
while (true)
{
cout<<"\nVyberite odno iz deistvii:\n";
cout<<"1) Izmenit' zapis'.\n2) Udalit' zapis'.\n3) Prosmotret' dannye.\n";
cout<<"4) Sohranit' dannye.\n5) Informaciya o spektaklyah, postavlennyh";
cout<<" dannym rezhiserom.\n6) Exit.\n";
cin>>b;
switch(b)
{
case 1:
{
cout<<"Vvedite nomer izmenyaemoi zapisi: ";
cin>>element;
change(mas,element);
break;
}
case 2:
{
cout<<"Vvedite nomer udalyaemoi zapisi: ";
cin>>element;
nomer=del(mas,element,nomer);
break;
}
case 3:
{
print(mas,nomer);
break;
}
case 4:
{
save(mas,nomer);
break;
}
case 5:
{
cout<<"Vvedite familiyu rezhisera: ", cin.ignore(), getline(cin, c);
int j=1;
for (int i=0; i < nomer; i++)
if (c == mas[i].spekt)
{
sort(teatr.begin(), teatr.end());
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl<<" Avtor: "<<mas[i].avtor<<
endl<<" Rezhiser: "<<mas[i].rezhiser<<endl<<" Data: "<<mas[i].data<<endl<<
" Vremya: "<<mas[i].time<<endl;
j++;
}
else
cout<<"Takogo rezhisera net!\n";
}
case 6: return 0;
default: cout<<"Nevernye dannye!\n";
}
}
system("pause");
return 0;
}

файл для сортировки суточку изменил, и может я что-то не правильно понял с переопределением?Прикрепленный файл  baza.txt ( 101 байт ) Кол-во скачиваний: 499
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
может я что-то не правильно понял с переопределением?
Угу. Я ж написал:
Цитата
Переопредели оператор "<" для своей структуры как тебе нужно
, а те что сделал? Написал функцию compare()?

struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};

// Я вот это имел в виду:
bool operator < (const theatre &a, const theatre &b)
{
return a.avtor < b.avtor;
}

- проект будет компилироваться.

А вообще - я тебя не понимаю. Ты пишешь, что тебе надо получить информацию о спектаклях, поставленных определенным режиссером, и тут же приплетаешь зачем-то if (c == mas[i].spekt). Просил что ввести? Фамилию режиссера. При чем тут спектакль? На фиг тут сортировки, все элементарно:
case 5:
{
cout<<"Vvedite familiyu rezhisera: ", cin.ignore(), getline(cin, c);
int j = 0;
for(int i = 0; i < nomer; i++)
{
if(mas[i].rezhiser == c)
{
j += 1;
cout<<"\n"<<j<<")";
cout<<" Nazvanie: "<<mas[i].spekt<<endl
<<" Avtor: "<<mas[i].avtor<<endl
<<" Rezhiser: "<<mas[i].rezhiser<<endl
<<" Data: "<<mas[i].data<<endl
<<" Vremya: "<<mas[i].time<<endl;
}
}
if(!j)
{
cout<<"Takogo rezhisera net!\n";
}
break;
}

 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата(volvo @ 21.12.2010 16:25) *

Угу. Я ж написал:
, а те что сделал? Написал функцию compare()?

struct theatre
{
string spekt;
string avtor;
string rezhiser;
string data;
string time;
};

// Я вот это имел в виду:
bool operator < (const theatre &a, const theatre &b)
{
return a.avtor < b.avtor;
}

- проект будет компилироваться.

если честно, то я не очень понимаю что значит переопределить оператор, насколько я помню нам мимолетом их рассказали в классах, без пояснений и т.д.
Цитата(volvo @ 21.12.2010 16:25) *

А вообще - я тебя не понимаю. Ты пишешь, что тебе надо получить информацию о спектаклях, поставленных определенным режиссером, и тут же приплетаешь зачем-то if (c == mas[i].spekt). Просил что ввести? Фамилию режиссера. При чем тут спектакль? На фиг тут сортировки, все элементарно:

да я в колледж спешил, с разгона и впихнул вместо режиссера спектакль, если почитать внимательно cout, то там написано "введите фамилию режиссера" smile.gif с кем не бывает. И еще. Сортировки нет, но по идее её и не должно быть, так как почитав скудный запас информации в интернете, надо как-то обращатсья к этому оператору, но и то, там были примеры с классами и не с булевыми значениями. Если не тяжело, можете пояснить или дать ссылку чтобы до конца разобраться с этой долей языка smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Какого языка? smile.gif С++? На С++ это вообще вот так делается:
struct theatre
{
friend ostream& operator << (ostream& os, const theatre& th);

string spekt;
string avtor;
string rezhiser;
string data;
string time;
};

// Перегружаем оператор вывода в поток
ostream& operator << (ostream& os, const theatre& th)
{
os << " Nazvanie: " << th.spekt << endl
<< " Avtor: " << th.avtor << endl
<< " Rezhiser: " << th.rezhiser << endl
<< " Data: " << th.data << endl
<< " Vremya: " << th.time << endl;
return os;
}

// пишем свой функтор, который будет сравнивать поле структуры со строкой
struct finder : std::binary_function<theatre, string, bool>
{
bool operator()(theatre const &in, string id) const
{
return (id == in.rezhiser);
}
};

// ...

// и, наконец, как сделать поиск по введенному режиссеру:
case 5:
{
string to_find;
cout << "Введите фамилию режиссера: ", cin.ignore(), getline(cin, to_find);
remove_copy_if(teatr.begin(), teatr.end(), std::ostream_iterator<theatre>(std::cout,"\n"),
std::not1(bind2nd(finder(), to_find)));
break;
}

Вот это - именно "плюсы". А делать все на циклах - это несерьезно...

Книгу? Я пользуюсь "The C++ Standard Library: A Tutorial and Reference" Н. Джосаттиса, если надо что-то из stl-ных алгоритмов посмотреть. Про использование std::sort там тоже написано...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 6:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name