Консультация онлайн # 160951

Раздел: С / С++
Автор вопроса: Васильев Дмитрий
Дата: 20.02.2009, 03:39 Консультация неактивна
Поступило ответов: 1
Уважаемые эксперты, подскажите, пожалуйста, как реализовать :
поиск по названию-
поиск по жанру-
поиск по режиссеру-
самый популярный фильм в жанре-
в приложении, которое прилагаю. Не получается правильно написать сравнение введенного значения. Вообще изначально условие такое:

Создать структуру ВИДЕОМАГАЗИН со следующими полями:
Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска

Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление
Приложение:

Ответ # 1, Micren (Посетитель)

Здравствуйте, Васильев Дмитрий!
Поскольку Вы пишете на C++ то и ответ на нем. Если Вам нужна непременно структура, то замените class на struct. Программа тестировалась на Visual Studio 2008.
Код
#include <locale>
#include <limits>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class CDisk
{
public:
	CDisk(wstring Movie,wstring Director,wstring Genre,int Rate,double Price)
	{
		_movie=Movie;
		_director=Director;
		_genre=Genre;
		_rate=Rate;
		_price=Price;
	}
	static bool ifMovie(wstring str,const CDisk& disk)
	{
		if(str==disk._movie)return true;
		else return false;
	}
	static bool ifDirector(wstring str,const CDisk& disk)
	{
		if(str==disk._director)return true;
		else return false;
	}
	static bool ifGenre(wstring str,const CDisk& disk)
	{
		if(str==disk._genre)return true;
		else return false;
	}
	int rate() const
	{
		return _rate;
	}
	double price()const
	{
		return _price;
	}
	friend wostream& operator<<(wostream& stream,const CDisk& disk);
private:
	wstring _movie;
	wstring _director;
	wstring _genre;
	int _rate;
	double _price;
};

vector<CDisk> collection;

int GetOperation();
void ShowAndAdd();
void FindMovie();
void FindDirector();
void FindGenre();
void FindMaxRateInGenre();

int main()
{
	locale::global(locale("rus_rus.866"));
	while(true)
	{
		switch(GetOperation())
		{
		case 1:
			FindMovie();
			break;
		case 2:
			FindDirector();
			break;
		case 3:
			FindGenre();
			break;
		case 4:
			FindMaxRateInGenre();
			break;
		case 5:
			ShowAndAdd();
			break;
		case 6:
			return 0;
		}
	}
	return 0;
}

wostream& operator<<(wostream& stream,const CDisk& disk)
{
	stream<<L"Название:"<<disk._movie<<endl;
	stream<<L"Режиссер:"<<disk._director<<endl;
	stream<<L"Жанр:"<<disk._genre<<endl;
	stream<<L"Популярность:"<<disk._rate<<endl;
	stream<<L"Цена:"<<setprecision(2)<<disk._price<<endl;
	return stream;
}

void line()
{
	wcout<<L"----------------------------------------------------------------"<<endl;
}

int GetOperation()
{
	while(true)
	{
		wcout<<L"Выберите наобходимое действие"<<endl;
		wcout<<L"1-Поиск по названию"<<endl;
		wcout<<L"2-Поиск по режиссеру"<<endl;
		wcout<<L"3-Поиск пожанру"<<endl;
		wcout<<L"4-Самый популярный фильм в жанре"<<endl;
		wcout<<L"5-Показ всех записей и добавление"<<endl;
		wcout<<L"6-Выход"<<endl;
		wcout<<L"Сделайте свой выбор:";
		int choice;
		wcin>>choice;
		if(wcin.fail())
		{
			wcout<<L"Ошибка. Будьте внимательней."<<endl;
			wcin.clear();
			wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
			continue;
		}		
		wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
		if(choice>=1&&choice<=6)return choice;
		else
		{
			wcout<<L"Неверный выбор"<<endl;
		}
		line();
	}
}

void print(const CDisk& disk)
{
	wcout<<disk;
	line();
}

void ShowAndAdd()
{
	wcout<<L"В коллекции имеются следующие фильмы:"<<endl;
	line();
	for_each(collection.begin(),collection.end(),print);
	wcout<<L"Добавьте фильмы в коллекцию"<<endl;
	while(true)
	{
		wstring movie,director,genre;
		int rate;
		double price;
		wcout<<L"Название(пустая строка для завершения):";
		getline(wcin,movie);
		if(!movie.length())break;
		wcout<<L"Режиссер:";
		getline(wcin,director);
		wcout<<L"Жанр:";
		getline(wcin,genre);
		wcout<<L"Популярность:";
		wcin>>rate;
		wcout<<L"Цена:";
		wcin>>price;
		collection.push_back(CDisk(movie,director,genre,rate,price));		
		wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
	}
}

void FindDisk(wstring str,bool (*boolFunc)(wstring,const CDisk&),void (*actionFunc)(const CDisk&))
{
	for(vector<CDisk>::iterator it=collection.begin();it!=collection.end();it++)
	{
		if(boolFunc(str,*it))
			actionFunc(*it);
	}
}

void FindMovie()
{
	wstring movie;
	wcout<<L"Введите название фильма для поиска:";
	getline(wcin,movie);
	if(movie.length())
	{
		wcout<<L"С названием \""<<movie<<L"\" найдены следующие фильмы:"<<endl;
		FindDisk(movie,CDisk::ifMovie,print);
	}
}

void FindDirector()
{
	wstring director;
	wcout<<L"Введите имя режиссера для поиска:";
	getline(wcin,director);
	if(director.length())
	{
		wcout<<L"С режиссером \""<<director<<L"\" найдены следующие фильмы:"<<endl;
		FindDisk(director,CDisk::ifDirector,print);
	}
}

void FindGenre()
{
	wstring genre;
	wcout<<L"Введите жанр для поиска:";
	getline(wcin,genre);
	if(genre.length())
	{
		wcout<<L"В жанре \""<<genre<<L"\" найдены следующие фильмы:"<<endl;
		FindDisk(genre,CDisk::ifGenre,print);
	}
}

static const CDisk* maxRate;

void MaxInGenre(const CDisk& disk)
{
	if(maxRate)
	{
		if(maxRate->rate()<disk.rate())
			maxRate=&disk;
	}
	else maxRate=&disk;
}

void PrintIfMaxInGenre(const CDisk& disk)
{
	if(maxRate&&(disk.rate()==maxRate->rate()))print(disk);
}

void FindMaxRateInGenre()
{
	wstring genre;
	wcout<<L"Введите жанр для поиска:";
	getline(wcin,genre);
	maxRate=0;
	if(genre.length())
	{
		FindDisk(genre,CDisk::ifGenre,MaxInGenre);
		wcout<<L"Максимальный рейтинг у следующих фильмов:"<<endl;
		FindDisk(genre,CDisk::ifGenre,PrintIfMaxInGenre);
	}
	maxRate=0;
}

Пример работы:
Код
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:5
В коллекции имеются следующие фильмы:
----------------------------------------------------------------
Добавьте фильмы в коллекцию
Название(пустая строка для завершения):Бойцовский клуб
Режиссер:Финчер
Жанр:боевик
Популярность:9
Цена:40
Название(пустая строка для завершения):Список Шиндлера
Режиссер:Спилберг
Жанр:драма
Популярность:9
Цена:45
Название(пустая строка для завершения):Криминальное чтиво
Режиссер:Тарантино
Жанр:криминал
Популярность:8
Цена:35
Название(пустая строка для завершения):Матрица
Режиссер:Вачовски
Жанр:фантастика
Популярность:8
Цена:30
Название(пустая строка для завершения):Чужой 3
Режиссер:Финчер
Жанр:фантастика
Популярность:7
Цена:30
Название(пустая строка для завершения):
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:5
В коллекции имеются следующие фильмы:
----------------------------------------------------------------
Название:Бойцовский клуб
Режиссер:Финчер
Жанр:боевик
Популярность:9
Цена:40
----------------------------------------------------------------
Название:Список Шиндлера
Режиссер:Спилберг
Жанр:драма
Популярность:9
Цена:45
----------------------------------------------------------------
Название:Криминальное чтиво
Режиссер:Тарантино
Жанр:криминал
Популярность:8
Цена:35
----------------------------------------------------------------
Название:Матрица
Режиссер:Вачовски
Жанр:фантастика
Популярность:8
Цена:30
----------------------------------------------------------------
Название:Чужой 3
Режиссер:Финчер
Жанр:фантастика
Популярность:7
Цена:30
----------------------------------------------------------------
Добавьте фильмы в коллекцию
Название(пустая строка для завершения):
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:1
Введите название фильма для поиска:Матрица
С названием "Матрица" найдены следующие фильмы:
Название:Матрица
Режиссер:Вачовски
Жанр:фантастика
Популярность:8
Цена:30
----------------------------------------------------------------
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:2
Введите имя режиссера для поиска:Финчер
С режиссером "Финчер" найдены следующие фильмы:
Название:Бойцовский клуб
Режиссер:Финчер
Жанр:боевик
Популярность:9
Цена:40
----------------------------------------------------------------
Название:Чужой 3
Режиссер:Финчер
Жанр:фантастика
Популярность:7
Цена:30
----------------------------------------------------------------
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:3
Введите жанр для поиска:фантастика
В жанре "фантастика" найдены следующие фильмы:
Название:Матрица
Режиссер:Вачовски
Жанр:фантастика
Популярность:8
Цена:30
----------------------------------------------------------------
Название:Чужой 3
Режиссер:Финчер
Жанр:фантастика
Популярность:7
Цена:30
----------------------------------------------------------------
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:4
Введите жанр для поиска:боевик
Максимальный рейтинг у следующих фильмов:
Название:Бойцовский клуб
Режиссер:Финчер
Жанр:боевик
Популярность:9
Цена:40
----------------------------------------------------------------
Выберите наобходимое действие
1-Поиск по названию
2-Поиск по режиссеру
3-Поиск пожанру
4-Самый популярный фильм в жанре
5-Показ всех записей и добавление
6-Выход
Сделайте свой выбор:

Micren

Посетитель
20.02.2009, 13:51
Нет оценки ответа

Мини-форум консультации # 160951


Нет сообщений в мини-форуме
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.