Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка по алфавиту
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Nike0
Доброго времени суток, появилась проблема: есть структура, читаю из файла, нужно вывести только те спектакли, которые поставленны введенным режиссером. Проблема заключается в том, что в структуре все данные объявлены как 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;
}

Нажмите для просмотра прикрепленного файла
volvo
Цитата
а замена стринга на чар приводит к ошибке Lvalue required
Что-то я совсем ничего не понимаю. У тебя фамилия режиссера - это std::string? Почему ты хочешь это менять на char? Смысл в чем? Второе: почему не воспользоваться стандартным алгоритмом std::sort? Зачем делать свою сортировку? Зачем вообще делать сортировку? Просто пройти по массиву и проверить совпадение фамилий. Почему в конце концов массив, а не std::vector, в котором для поиска совпадений существует целый ряд специальных функций? smile.gif У тебя С++ же вроде, что ж ты не используешь его?
Nike0
Цитата(volvo @ 20.12.2010 12:53) *

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

стандартную знаю сортировку, он будет сортировать фамилию по алфавиту? т.е сравнивает коды символов и упорядочивает их? просто как-то про это не подумал smile.gif
volvo
Цитата
он будет сортировать фамилию по алфавиту?
Переопредели оператор "<" для своей структуры как тебе нужно, будет сортировать хоть по длине фамилии smile.gif
Nike0
Цитата(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;
}

файл для сортировки суточку изменил, и может я что-то не правильно понял с переопределением?Нажмите для просмотра прикрепленного файла
volvo
Цитата
может я что-то не правильно понял с переопределением?
Угу. Я ж написал:
Цитата
Переопредели оператор "<" для своей структуры как тебе нужно
, а те что сделал? Написал функцию 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;
}

Nike0
Цитата(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
volvo
Какого языка? 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 там тоже написано...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.