struct film{
string name;
double price;
};
Застрял на функциях, отстал от всех.
Название фильма
Цена диска
Реализовать следующие возможности:
Поиск по названию
Показ всех записей и добавление
читаются или вводить надо?
Создать так можно:
Код:
Потом в main() создаешь массив :
Код:
int counter;
cin>>counter;
film *a = new film[counter];
for(int i = 0;i<counter;++i){
cout<<"Enter film name "<<endl;
cin>>a.name;
cout<<"Price"<<endl;
cin>>a.price;
}...
delete[] a;
cin>>counter;
film *a = new film[counter];
for(int i = 0;i<counter;++i){
cout<<"Enter film name "<<endl;
cin>>a.name;
cout<<"Price"<<endl;
cin>>a.price;
}...
delete[] a;
И пишешь ф-ии поиска ,печати и добавления.Все:) Конкретней спрашивай.
cout<<"Enter film name "<<endl;
cin>>a->name;
cout<<"Price"<<endl;
cin>>a->price;
.....
т.к. обьъекты структур в дин. памяти и доступ к их полям получаем через указатель.
Цитата: dox
Привет. только надо делать так:
cout<<"Enter film name "<<endl;
cin>>a->name;
cout<<"Price"<<endl;
cin>>a->price;
.....
т.к. обьъекты структур в дин. памяти и доступ к их полям получаем через указатель.
cout<<"Enter film name "<<endl;
cin>>a->name;
cout<<"Price"<<endl;
cin>>a->price;
.....
т.к. обьъекты структур в дин. памяти и доступ к их полям получаем через указатель.
Уверен? Давай смотреть:
Запись [FONT="Courier New"][SIZE="2"]a[/SIZE][/FONT] эквивалентна записи [FONT="Courier New"][SIZE="2"]*(a + (i * sizeof(*a)))[/SIZE][/FONT].
т.е. элемент массива будет получен. А поскольку он (элемент) не является в данном примере указателем, то доступ к данным осуществляется посредством оператора ".", и поэтому выражения [FONT="Courier New"][SIZE="2"]a.name[/SIZE][/FONT] и [FONT="Courier New"][SIZE="2"]a.price[/SIZE][/FONT] являются верными.
а почему при объявлении массива на структуры фильм, используется идентификатор магазин?
Да,сори,сейчас исправлю.Там надо не magazine,a film.
Цитата: OlgaKr
а почему при объявлении массива на структуры фильм, используется идентификатор магазин?
Да, действительно странно. Я имел ввиду следущее:
Код:
struct film {
string name;
double price;
};
...
film* magazine = new film[counter];
...
cin >> magazine.name;
cin >> magazine.price;
...
string name;
double price;
};
...
film* magazine = new film[counter];
...
cin >> magazine.name;
cin >> magazine.price;
...
что у аффтара проблема с ф-иями,не может, наверно ,увеличить массив при добавлении и или сравнивает не правильно.
Код:
struct film {
string name;
double price;
};
vector<film> magazine;
...
film data;
cin >> data.name;
cin >> data.price;
// добавим новый фильм
magazine.push_back(data);
...
// очистим магазин
magazine.clear();
...
string name;
double price;
};
vector<film> magazine;
...
film data;
cin >> data.name;
cin >> data.price;
// добавим новый фильм
magazine.push_back(data);
...
// очистим магазин
magazine.clear();
...
Имя фильма - уникальный ключ,цена - значение.Не попадут фильмы
дубликаты.Как то так:
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
using namespace std;
int Menu();
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"How many films?"<<endl;
int counter;
cin>>counter;
map<string,double> film;
string name;
double price;
for(int i = 0;i<counter;++i){
cout<<"Enter film name "<<endl;
cin>>name;
cout<<"Price"<<endl;
cin>>price;
film.insert(map<string,double>::value_type(string(name),double (price)));
}
int menu = 0;
while(menu != 4){
menu = Menu();
switch(menu){
case 1:
cout<<"\tFilms collection"<<endl;
for(map<string,double>::iterator it = film.begin();
it != film.end(); ++it){
cout<<'\t'<<it->first<<endl;
cout<<'\t'<<it->second<<endl;
}
break;
case 2:
cout<<"Enter name"<<endl;
cin>>name;
for(map<string,double>::iterator it = film.begin();
it != film.end(); ++it){
if(it->first == name){
cout<<'\t'<<it->first<<endl;
cout<<'\t'<<it->second<<endl;
}
}
break;
case 3:
cout<<"Enter film name "<<endl;
cin>>name;
cout<<"Price"<<endl;
cin>>price;
film.insert(map<string,double>::value_type(string(name),double(price)));
break;
case 4:
exit(0);
default:
break;
}
}
return 0;
}
int Menu()
{
int answer=0;
cout<<"1. Print\n2. Search\n3. New element\n4. Exit\n";
cin>>answer;
return answer;
}
#include <iostream>
#include <string>
#include <map>
using namespace std;
int Menu();
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"How many films?"<<endl;
int counter;
cin>>counter;
map<string,double> film;
string name;
double price;
for(int i = 0;i<counter;++i){
cout<<"Enter film name "<<endl;
cin>>name;
cout<<"Price"<<endl;
cin>>price;
film.insert(map<string,double>::value_type(string(name),double (price)));
}
int menu = 0;
while(menu != 4){
menu = Menu();
switch(menu){
case 1:
cout<<"\tFilms collection"<<endl;
for(map<string,double>::iterator it = film.begin();
it != film.end(); ++it){
cout<<'\t'<<it->first<<endl;
cout<<'\t'<<it->second<<endl;
}
break;
case 2:
cout<<"Enter name"<<endl;
cin>>name;
for(map<string,double>::iterator it = film.begin();
it != film.end(); ++it){
if(it->first == name){
cout<<'\t'<<it->first<<endl;
cout<<'\t'<<it->second<<endl;
}
}
break;
case 3:
cout<<"Enter film name "<<endl;
cin>>name;
cout<<"Price"<<endl;
cin>>price;
film.insert(map<string,double>::value_type(string(name),double(price)));
break;
case 4:
exit(0);
default:
break;
}
}
return 0;
}
int Menu()
{
int answer=0;
cout<<"1. Print\n2. Search\n3. New element\n4. Exit\n";
cin>>answer;
return answer;
}
Код:
...
using namespace std;
typedef pair<string, double> film;
typedef list<film> magazine;
...
using namespace std;
typedef pair<string, double> film;
typedef list<film> magazine;
...
посту лучше поиск делать так:
Код:
map<string,double>::iterator iter;
...
iter = film.find(name);
cout<<'\t'<<iter->first<<endl;
cout<<'\t'<<iter->second<<endl;
...
...
iter = film.find(name);
cout<<'\t'<<iter->first<<endl;
cout<<'\t'<<iter->second<<endl;
...
Но в любом случае STL:)
для полноты коллекции решений, можно также написать работу со списками, а то вдруг автору СТЛ пользоваться нельзя :)
2Lerkin, а вообще то тут втавок много , так что пожалуй ты прав -list .Но автору скорее всего структура нужна и только.
я имею ввиду работу с связаннами списками, можно оформить в виде класса, только автор новичек, не уверенна что ему это нужно.
OlgaKr,Если для коллекции надо могу написать( заодно и поупражняюсь):) Выложу,потом проверите.
Код:
template <typename T>
struct list_object
{
T _data;
list_object<T>* _next;
list_object( void ):
_next( NULL )
{
}
~list_object( void )
{
}
};
template <typename T>
class mylist
{
unsigned int _count;
list_object<T> *_begin, *_end;
public:
mylist( void ):
_count( 0 )
{
_end = _begin = NULL;
}
~mylist( void )
{
clear();
}
void append( const T& data )
{
list_object<T>* obj = new list_object<T>;
obj->_data = data;
if (_begin)
_end = _end->_next = obj;
else
_end = _begin = obj;
_count++;
}
void clear( void )
{
if (!_count)
return;
while (_begin)
{
list_object<T>* ptr = _begin->_next;
delete _begin;
_begin = ptr;
}
}
unsigned int size( void ) const
{
return _count;
}
T operator[]( unsigned int index )
{
if (index >= _count)
return -1;
list_object<T>* ptr = _begin;
while (index--)
ptr = ptr->_next;
return ptr->_data;
}
};
// пример использования
int main( void )
{
mylist<int> li;
for (unsigned int i = 0; i < 5; ++i )
li.append( i * i );
cout << "Элементов в списке: " << li.size() << endl;
for( i = 0; i < 6; ++i )
cout << li << endl;
li.clear();
return 0;
}
struct list_object
{
T _data;
list_object<T>* _next;
list_object( void ):
_next( NULL )
{
}
~list_object( void )
{
}
};
template <typename T>
class mylist
{
unsigned int _count;
list_object<T> *_begin, *_end;
public:
mylist( void ):
_count( 0 )
{
_end = _begin = NULL;
}
~mylist( void )
{
clear();
}
void append( const T& data )
{
list_object<T>* obj = new list_object<T>;
obj->_data = data;
if (_begin)
_end = _end->_next = obj;
else
_end = _begin = obj;
_count++;
}
void clear( void )
{
if (!_count)
return;
while (_begin)
{
list_object<T>* ptr = _begin->_next;
delete _begin;
_begin = ptr;
}
}
unsigned int size( void ) const
{
return _count;
}
T operator[]( unsigned int index )
{
if (index >= _count)
return -1;
list_object<T>* ptr = _begin;
while (index--)
ptr = ptr->_next;
return ptr->_data;
}
};
// пример использования
int main( void )
{
mylist<int> li;
for (unsigned int i = 0; i < 5; ++i )
li.append( i * i );
cout << "Элементов в списке: " << li.size() << endl;
for( i = 0; i < 6; ++i )
cout << li << endl;
li.clear();
return 0;
}
Можно доработать до серьёзного контейнера, ввести итераторы и т.д.
и операторы =,+,==,!=,<=,>=,>,<.Но для pair не годится.Может кому то понадобится.
Код:
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
template <typename T>
struct Elem
{
// Любые данные
T data;
Elem<T>* next, * prev;
};
template <typename T>
class List
{
// Голова хвост
Elem<T>* Head, * Tail;
int Count;
public:
List();
List(const List&);
~List();
int GetCount();
Elem<T>* GetElem(int);
void DelAll();
void Del(int);
void Del();
void AddTail();
void AddTail(T);
void AddHead(T);
void AddHead();
void Insert();
void Print();
void Print(int pos);
List& operator = (const List&);
List operator + (const List&);
bool operator == (const List&);
bool operator != (const List&);
bool operator <= (const List&);
bool operator >= (const List&);
bool operator < (const List&);
bool operator > (const List&);
List operator - ();
};
template <typename T>
List<T>::List()
{
Head = Tail = 0;
Count = 0;
}
template <typename T>
List<T>::List(const List & L)
{
Head = Tail = 0;
Count = 0;
Elem<T> * temp = L.Head;
while(temp != 0)
{
AddTail(temp->data);
temp = temp->next;
}
}
template <typename T>
List<T>::~List()
{
DelAll();
}
template <typename T>
Elem<T>* List<T>::GetElem(int pos)
{
Elem<T> *temp = Head;
// Позиция от 1 до Count?
if(pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
while(i < pos && temp != 0)
{
temp = temp->next;
i++;
}
if(temp == 0)
return 0;
else
return temp;
}
template <typename T>
void List<T>::AddHead()
{
Elem<T> * temp = new Elem<T>;
temp->prev = 0;
int n;
cout << "Input new number: ";
cin >> n;
temp->data = n;
temp->next = Head;
if(Head != 0)
Head->prev = temp;
if(Count == 0)
Head = Tail = temp;
else
Head = temp;
Count++;
}
template <typename T>
void List<T>::AddHead(T n)
{
Elem<T> * temp = new Elem<T>;
temp->prev = 0;
temp->data = n;
temp->next = Head;
if(Head != 0)
Head->prev = temp;
if(Count == 0)
Head = Tail = temp;
else
Head = temp;
Count++;
}
template <typename T>
void List<T>::AddTail()
{
Elem<T> * temp = new Elem<T>;
temp->next = 0;
int n;
cout << "Input new number: ";
cin >> n;
temp->data = n;
temp->prev = Tail;
if(Tail != 0)
Tail->next = temp;
if(Count == 0)
Head = Tail = temp;
else
Tail = temp;
Count++;
}
template <typename T>
void List<T>::AddTail(T n)
{
Elem<T> * temp = new Elem<T>;
temp->next = 0;
temp->data = n;
temp->prev = Tail;
if(Tail != 0)
Tail->next = temp;
if(Count == 0)
Head = Tail = temp;
else
Tail = temp;
Count++;
}
template <typename T>
void List<T>::Del()
{
int n;
cout << "Input position: ";
cin >> n;
if(n < 1 || n > Count)
{
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
Elem<T> * Del = Head;
while(i <= n)
{
// Доходим до элемента, который удаляется
Del = Del->next;
i++;
}
// Доходим до элемента, который предшествует удаляемому
Elem<T> * PrevDel = Del->prev;
// Доходим до элемента, который следует за удаляемым
Elem<T> * AfterDel = Del->next;
if(PrevDel != 0 && Count != 1)
PrevDel->next = AfterDel;
if(AfterDel != 0 && Count != 1)
AfterDel->prev = PrevDel;
if(n == 1)
Head = AfterDel;
if(n == Count)
Tail = PrevDel;
delete Del;
Count--;
}
template <typename T>
void List<T>::Del(int n)
{
if(n < 1 || n > Count)
{
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
Elem<T> * Del = Head;
while(i < n)
{
// Доходим до элемента, который удаляется
Del = Del->next;
i++;
}
// Доходим до элемента, который предшествует удаляемому
Elem<T> * PrevDel = Del->prev;
// Доходим до элемента, который следует за удаляемым
Elem<T> * AfterDel = Del->next;
if(PrevDel != 0 && Count != 1)
PrevDel->next = AfterDel;
if(AfterDel != 0 && Count != 1)
AfterDel->prev = PrevDel;
if(n == 1)
Head = AfterDel;
if(n == Count)
Tail = PrevDel;
delete Del;
Count--;
}
template <typename T>
void List<T>::Print(int pos)
{
// Позиция от 1 до Count?
if(pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
Elem<T> * temp;
// Определяем с какой стороны
// быстрее двигаться
if(pos <= Count / 2)
{
// Отсчет с головы
temp = Head;
int i = 1;
while(i < pos)
{
// Двигаемся до нужного элемента
temp = temp->next;
i++;
}
}
else
{
// Отсчет с хвоста
temp = Tail;
int i = 1;
while(i <= Count - pos)
{
// Двигаемся до нужного элемента
temp = temp->prev;
i++;
}
}
// Вывод элемента
cout << pos << " element: ";
cout << temp->data << endl;
}
template <typename T>
void List<T>::Print()
{
if(Count != 0)
{
Elem<T> * temp = Head;
while(temp != 0)
{
cout << temp->data<< ' ';
temp = temp->next;
}
}
}
template <typename T>
void List<T>::DelAll()
{
while(Count != 0)
Del(1);
}
template <typename T>
void List<T>::Insert()
{
// если параметр отсутствует или равен 0, то запрашиваем его
int pos = 0;
if(pos == 0)
{
cout << "Input position: ";
cin >> pos;
}
// Позиция от 1 до Count?
if(pos < 1 || pos > Count + 1)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
// Если вставка в конец списка
if(pos == Count + 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в конец списка
AddTail(data);
return;
}
else if(pos == 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в начало списка
AddHead(data);
return;
}
// Счетчик
int i = 1;
// Отсчитываем от головы n - 1 элементов
Elem<T>* Ins = Head;
while(i < pos)
{
// Доходим до элемента,
// перед которым вставляемся
Ins = Ins->next;
i++;
}
// Доходим до элемента,
// который предшествует
Elem<T>* PrevIns = Ins->prev;
// Создаем новый элемент
Elem<T>* temp = new Elem<T>;
// Вводим данные
cout << "Input new number: ";
cin >> temp->data;
// настройка связей
if(PrevIns != 0 && Count != 1)
PrevIns->next = temp;
temp->next = Ins;
temp->prev = PrevIns;
Ins->prev = temp;
Count++;
}
template <typename T>
int List<T>::GetCount()
{
return Count;
}
template <typename T>
List<T>& List<T>::operator = (const List<T> & L)
{
if(this == &L)
return *this;
this->~List();
Elem<T> * temp = L.Head;
while(temp != 0)
{
AddTail(temp->data);
temp = temp->next;
}
return *this;
}
template <typename T>
List<T> List<T>::operator + (const List<T>& L)
{
List Result(*this);
Elem<T> * temp = L.Head;
while(temp != 0)
{
Result.AddTail(temp->data);
temp = temp->next;
}
return Result;
}
template <typename T>
bool List<T>::operator == (const List<T>& L)
{
if(Count != L.Count)
return false;
Elem<T> *t1, *t2;
t1 = Head;
t2 = L.Head;
while(t1 != 0)
{
if(t1->data != t2->data)
return false;
t1 = t1->next;
t2 = t2->next;
}
return true;
}
template <typename T>
bool List<T>::operator != (const List& L)
{
if(Count != L.Count)
return true;
Elem<T> *t1, *t2;
t1 = Head;
t2 = L.Head;
while(t1 != 0)
{
if(t1->data != t2->data)
return true;
t1 = t1->next;
t2 = t2->next;
}
return false;
}
template <typename T>
bool List<T>::operator >= (const List& L)
{
if(Count > L.Count)
return true;
if(*this == L)
return true;
return false;
}
template <typename T>
bool List<T>::operator <= (const List& L)
{
if(Count < L.Count)
return true;
if(*this == L)
return true;
return false;
}
template <typename T>
bool List<T>::operator > (const List& L)
{
if(Count > L.Count)
return true;
return false;
}
template <typename T>
bool List<T>::operator < (const List& L)
{
if(Count < L.Count)
return true;
return false;
}
template <typename T>
List<T> List<T>::operator - ()
{
List Result;
Elem<T> * temp = Head;
while(temp != 0)
{
Result.AddHead(temp->data);
temp = temp->next;
}
return Result;
}
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(0));
List <int> L;
// тут по усмотрению можно меню и т.д
return 0;
}
#include <iostream>
#include <ctime>
using namespace std;
template <typename T>
struct Elem
{
// Любые данные
T data;
Elem<T>* next, * prev;
};
template <typename T>
class List
{
// Голова хвост
Elem<T>* Head, * Tail;
int Count;
public:
List();
List(const List&);
~List();
int GetCount();
Elem<T>* GetElem(int);
void DelAll();
void Del(int);
void Del();
void AddTail();
void AddTail(T);
void AddHead(T);
void AddHead();
void Insert();
void Print();
void Print(int pos);
List& operator = (const List&);
List operator + (const List&);
bool operator == (const List&);
bool operator != (const List&);
bool operator <= (const List&);
bool operator >= (const List&);
bool operator < (const List&);
bool operator > (const List&);
List operator - ();
};
template <typename T>
List<T>::List()
{
Head = Tail = 0;
Count = 0;
}
template <typename T>
List<T>::List(const List & L)
{
Head = Tail = 0;
Count = 0;
Elem<T> * temp = L.Head;
while(temp != 0)
{
AddTail(temp->data);
temp = temp->next;
}
}
template <typename T>
List<T>::~List()
{
DelAll();
}
template <typename T>
Elem<T>* List<T>::GetElem(int pos)
{
Elem<T> *temp = Head;
// Позиция от 1 до Count?
if(pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
while(i < pos && temp != 0)
{
temp = temp->next;
i++;
}
if(temp == 0)
return 0;
else
return temp;
}
template <typename T>
void List<T>::AddHead()
{
Elem<T> * temp = new Elem<T>;
temp->prev = 0;
int n;
cout << "Input new number: ";
cin >> n;
temp->data = n;
temp->next = Head;
if(Head != 0)
Head->prev = temp;
if(Count == 0)
Head = Tail = temp;
else
Head = temp;
Count++;
}
template <typename T>
void List<T>::AddHead(T n)
{
Elem<T> * temp = new Elem<T>;
temp->prev = 0;
temp->data = n;
temp->next = Head;
if(Head != 0)
Head->prev = temp;
if(Count == 0)
Head = Tail = temp;
else
Head = temp;
Count++;
}
template <typename T>
void List<T>::AddTail()
{
Elem<T> * temp = new Elem<T>;
temp->next = 0;
int n;
cout << "Input new number: ";
cin >> n;
temp->data = n;
temp->prev = Tail;
if(Tail != 0)
Tail->next = temp;
if(Count == 0)
Head = Tail = temp;
else
Tail = temp;
Count++;
}
template <typename T>
void List<T>::AddTail(T n)
{
Elem<T> * temp = new Elem<T>;
temp->next = 0;
temp->data = n;
temp->prev = Tail;
if(Tail != 0)
Tail->next = temp;
if(Count == 0)
Head = Tail = temp;
else
Tail = temp;
Count++;
}
template <typename T>
void List<T>::Del()
{
int n;
cout << "Input position: ";
cin >> n;
if(n < 1 || n > Count)
{
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
Elem<T> * Del = Head;
while(i <= n)
{
// Доходим до элемента, который удаляется
Del = Del->next;
i++;
}
// Доходим до элемента, который предшествует удаляемому
Elem<T> * PrevDel = Del->prev;
// Доходим до элемента, который следует за удаляемым
Elem<T> * AfterDel = Del->next;
if(PrevDel != 0 && Count != 1)
PrevDel->next = AfterDel;
if(AfterDel != 0 && Count != 1)
AfterDel->prev = PrevDel;
if(n == 1)
Head = AfterDel;
if(n == Count)
Tail = PrevDel;
delete Del;
Count--;
}
template <typename T>
void List<T>::Del(int n)
{
if(n < 1 || n > Count)
{
cout << "Incorrect position !!!\n";
return;
}
int i = 1;
Elem<T> * Del = Head;
while(i < n)
{
// Доходим до элемента, который удаляется
Del = Del->next;
i++;
}
// Доходим до элемента, который предшествует удаляемому
Elem<T> * PrevDel = Del->prev;
// Доходим до элемента, который следует за удаляемым
Elem<T> * AfterDel = Del->next;
if(PrevDel != 0 && Count != 1)
PrevDel->next = AfterDel;
if(AfterDel != 0 && Count != 1)
AfterDel->prev = PrevDel;
if(n == 1)
Head = AfterDel;
if(n == Count)
Tail = PrevDel;
delete Del;
Count--;
}
template <typename T>
void List<T>::Print(int pos)
{
// Позиция от 1 до Count?
if(pos < 1 || pos > Count)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
Elem<T> * temp;
// Определяем с какой стороны
// быстрее двигаться
if(pos <= Count / 2)
{
// Отсчет с головы
temp = Head;
int i = 1;
while(i < pos)
{
// Двигаемся до нужного элемента
temp = temp->next;
i++;
}
}
else
{
// Отсчет с хвоста
temp = Tail;
int i = 1;
while(i <= Count - pos)
{
// Двигаемся до нужного элемента
temp = temp->prev;
i++;
}
}
// Вывод элемента
cout << pos << " element: ";
cout << temp->data << endl;
}
template <typename T>
void List<T>::Print()
{
if(Count != 0)
{
Elem<T> * temp = Head;
while(temp != 0)
{
cout << temp->data<< ' ';
temp = temp->next;
}
}
}
template <typename T>
void List<T>::DelAll()
{
while(Count != 0)
Del(1);
}
template <typename T>
void List<T>::Insert()
{
// если параметр отсутствует или равен 0, то запрашиваем его
int pos = 0;
if(pos == 0)
{
cout << "Input position: ";
cin >> pos;
}
// Позиция от 1 до Count?
if(pos < 1 || pos > Count + 1)
{
// Неверная позиция
cout << "Incorrect position !!!\n";
return;
}
// Если вставка в конец списка
if(pos == Count + 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в конец списка
AddTail(data);
return;
}
else if(pos == 1)
{
// Вставляемые данные
int data;
cout << "Input new number: ";
cin >> data;
// Добавление в начало списка
AddHead(data);
return;
}
// Счетчик
int i = 1;
// Отсчитываем от головы n - 1 элементов
Elem<T>* Ins = Head;
while(i < pos)
{
// Доходим до элемента,
// перед которым вставляемся
Ins = Ins->next;
i++;
}
// Доходим до элемента,
// который предшествует
Elem<T>* PrevIns = Ins->prev;
// Создаем новый элемент
Elem<T>* temp = new Elem<T>;
// Вводим данные
cout << "Input new number: ";
cin >> temp->data;
// настройка связей
if(PrevIns != 0 && Count != 1)
PrevIns->next = temp;
temp->next = Ins;
temp->prev = PrevIns;
Ins->prev = temp;
Count++;
}
template <typename T>
int List<T>::GetCount()
{
return Count;
}
template <typename T>
List<T>& List<T>::operator = (const List<T> & L)
{
if(this == &L)
return *this;
this->~List();
Elem<T> * temp = L.Head;
while(temp != 0)
{
AddTail(temp->data);
temp = temp->next;
}
return *this;
}
template <typename T>
List<T> List<T>::operator + (const List<T>& L)
{
List Result(*this);
Elem<T> * temp = L.Head;
while(temp != 0)
{
Result.AddTail(temp->data);
temp = temp->next;
}
return Result;
}
template <typename T>
bool List<T>::operator == (const List<T>& L)
{
if(Count != L.Count)
return false;
Elem<T> *t1, *t2;
t1 = Head;
t2 = L.Head;
while(t1 != 0)
{
if(t1->data != t2->data)
return false;
t1 = t1->next;
t2 = t2->next;
}
return true;
}
template <typename T>
bool List<T>::operator != (const List& L)
{
if(Count != L.Count)
return true;
Elem<T> *t1, *t2;
t1 = Head;
t2 = L.Head;
while(t1 != 0)
{
if(t1->data != t2->data)
return true;
t1 = t1->next;
t2 = t2->next;
}
return false;
}
template <typename T>
bool List<T>::operator >= (const List& L)
{
if(Count > L.Count)
return true;
if(*this == L)
return true;
return false;
}
template <typename T>
bool List<T>::operator <= (const List& L)
{
if(Count < L.Count)
return true;
if(*this == L)
return true;
return false;
}
template <typename T>
bool List<T>::operator > (const List& L)
{
if(Count > L.Count)
return true;
return false;
}
template <typename T>
bool List<T>::operator < (const List& L)
{
if(Count < L.Count)
return true;
return false;
}
template <typename T>
List<T> List<T>::operator - ()
{
List Result;
Elem<T> * temp = Head;
while(temp != 0)
{
Result.AddHead(temp->data);
temp = temp->next;
}
return Result;
}
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(0));
List <int> L;
// тут по усмотрению можно меню и т.д
return 0;
}
Код:
#include <iostream>
using namespace std;
/*
Создать структуру ВИДЕОМАГАЗИН со следующими полями:
Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска
Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление.
*/
struct film {
char name[100];
char producer[100];
char ganre[100];
int rate;
int price;
};
void main(){
film v1={"Lov", "Dov", "silent", 8, 10};
film v2={"Ars", "Dov", "action", 9, 11};
film v3={"Zve", "Dov","silent", 7, 10};
film v4={"Man","Ver", "doc", 6, 8};
film v5={"Ear", "Dov" "drama", 8, 11};
film v6={"Sha","Par" "thriller", 10, 15};
film v7={"Whi","Ill" "comedy", 7, 12};
film v8={"Mam","Sanin","drama", 10, 16};
film v9={"Dri", "Del", "comedy", 6, 7};
}
using namespace std;
/*
Создать структуру ВИДЕОМАГАЗИН со следующими полями:
Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска
Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление.
*/
struct film {
char name[100];
char producer[100];
char ganre[100];
int rate;
int price;
};
void main(){
film v1={"Lov", "Dov", "silent", 8, 10};
film v2={"Ars", "Dov", "action", 9, 11};
film v3={"Zve", "Dov","silent", 7, 10};
film v4={"Man","Ver", "doc", 6, 8};
film v5={"Ear", "Dov" "drama", 8, 11};
film v6={"Sha","Par" "thriller", 10, 15};
film v7={"Whi","Ill" "comedy", 7, 12};
film v8={"Mam","Sanin","drama", 10, 16};
film v9={"Dri", "Del", "comedy", 6, 7};
}
И способ добавления в структуру.
Код:
film v5={"Ear" "Dov"[COLOR="Red"],[/COLOR]"drama", 8, 11};
film v6={"Sha","Par" [COLOR="Red"],[/COLOR]"thriller", 10, 15};
film v7={"Whi","Ill" [COLOR="Red"],[/COLOR]"comedy", 7, 12};
film v6={"Sha","Par" [COLOR="Red"],[/COLOR]"thriller", 10, 15};
film v7={"Whi","Ill" [COLOR="Red"],[/COLOR]"comedy", 7, 12};
Ошибочки тут,запятые пропущены.
Цитата: 2504
Я тоже борюсь с этой задачей. Дело в том, что ее надо решить с помощью структур struct{}; Вот сама структура. А мне интересно, как осуществлять поиск в структуре!!. И list & map еще не проходили. Гении с++, подскажите.
...
И способ добавления в структуру.
...
И способ добавления в структуру.
Это ты шутишь так ? Для того чтоб такое решать гении не нужны.Или ты всерьез полагаешь,что это задача для гения ? Не хватало еще чтоб гении за такое брались.Делай массив структур.
Код:
// динам.массив ситруктур
film *a = new film[counter];
film *a = new film[counter];
Заполняй ,допустим из файла считывай данные или с клавиатуры
вводи.Об этом есть на форуме,поищи.
Пиши функции , хотя бы эти 3
Код:
void print(film* a,int counter);// печать
void search(film* a,int counter);// поиск
film *insert(film *,int& );// вставка
void search(film* a,int counter);// поиск
film *insert(film *,int& );// вставка
Ф-ия печати выглядит примерно так для структуры из 2 полей:
Код:
void print(film* a,int counter)
{
cout<<"Коллекция фильмов";
cout<<"название цена";
for(int i = 0;i<counter;++i){
cout<<a.name<<"\t"<<a.price<<endl;
}
}
{
cout<<"Коллекция фильмов";
cout<<"название цена";
for(int i = 0;i<counter;++i){
cout<<a.name<<"\t"<<a.price<<endl;
}
}
int counter - кол-во элементов в массиве
Ф-ия добавления так:
Код:
film *insert(film *m,int &counter)
{
++counter;
char str[40];
double price;
cout<<"Введите название фильма";
cin>>str;
cout<<"Введите цену";
cin>>price;
cout<<counter;
film *b= new film[counter+1];
for(int i = 0;i<counter;++i){
if(i<counter-1){
strcpy(b.name,m.name );
b.price = m.price;
}
if(i == counter-1){
strcpy(b.name,str );
b.price = price;
}
}
delete[] m;
return b;
}
{
++counter;
char str[40];
double price;
cout<<"Введите название фильма";
cin>>str;
cout<<"Введите цену";
cin>>price;
cout<<counter;
film *b= new film[counter+1];
for(int i = 0;i<counter;++i){
if(i<counter-1){
strcpy(b.name,m.name );
b.price = m.price;
}
if(i == counter-1){
strcpy(b.name,str );
b.price = price;
}
}
delete[] m;
return b;
}
Ф-ия поиска примерно так:
Код:
void search(film* a,int counter)
{
char str[40];
cout<<"Введите название фильма");
cin>>str;
int count = 0;
for(int i = 0;i<counter;++i){
if(strcmp(a.name, str)==0 ){
cout<<"Такой фильм есть!";
cout<<"название цена";
cout<<a.name<<"\t"<<a.price<<endl;
count++;
}
}
if(count == 0)
cout<<"Фильм с таким названием не найден";
}
{
char str[40];
cout<<"Введите название фильма");
cin>>str;
int count = 0;
for(int i = 0;i<counter;++i){
if(strcmp(a.name, str)==0 ){
cout<<"Такой фильм есть!";
cout<<"название цена";
cout<<a.name<<"\t"<<a.price<<endl;
count++;
}
}
if(count == 0)
cout<<"Фильм с таким названием не найден";
}
Добавь ф-ию меню и вперед.В конце не забываем освободить память,если написали new,пишем и delete .
Код:
// удаляем динамический массив
delete[] a;
delete[] a;
Я за вчера сам поковырялся, массив создал, функцию печати тоже, а с поиском не вышло. Спасибо за помощь.:D
Код:
/*
Создать структуру ВИДЕОМАГАЗИН со следующими полями:
Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска
Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление.
*/
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int i=0;
/**********************
Структура ВИДЕОМАГАЗИН
***********************/
struct film {
char name[10];
char producer[10];
char ganre[10];
int rate;
int price;
};
/**********************
Поиск по заданому критерию
***********************/
void search(film *ar, int count, int choice){
int f=-1;
//cout<<word<<endl;
switch (choice){
case 0:
char name[10];
cout<<"Enter Name :";
cin>>name;
for(i=0; i<count; i++){
if(strcmp(ar.name,name)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 1:
char prod[10];
cout<<"Enter Producer :";
cin>>prod;
for(i=0; i<count; i++){
if(strcmp(ar.producer,prod)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 2:
char ganre[10];
cout<<"Enter Ganre :";
cin>>ganre;
for(i=0; i<count; i++){
if(strcmp(ar.ganre,ganre)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 3:
int rate;
cout<<"Enter Rate :";
cin>>rate;
for(i=0; i<count; i++){
if(ar.rate==rate){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 4:
int price;
cout<<"Enter Price in $ :";
cin>>price;
for(i=0; i<count; i++){
if(ar.price==price){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
default:;
break;
}
if(0==f)cout<<"Not found"<<endl;
}
/*****************************
Поиск по популярности в жанре
****************************/
void pop_ganre(film *ar, int count){
char ch_ganre[10];
int tmp=0, tmp_i=0;
cout<<"Enter ganre"<<endl;
cin>>ch_ganre;
for(i=0; i<count; i++){
if(0==strcmp(ar.ganre,ch_ganre)){
if(ar.rate>tmp){
tmp=ar.rate;
tmp_i=i;
}
}
}
if(tmp_i>-1&&tmp_i<count){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar[tmp_i].name<<"\t"
<<ar[tmp_i].producer<<"\t\t"<<ar[tmp_i].ganre<<"\t"<<ar[tmp_i].rate<<"\t"<<ar[tmp_i].price<<endl<<endl;
for(i=tmp_i+1; i<count; i++){//если еще есть фильм
if(ar.rate==tmp){
if(0==strcmp(ar.ganre,ch_ganre)){
cout<<ar.name<<"\t"<<ar.producer<<"\t\t"<<ar.ganre<<"\t"
<<ar.rate<<"\t"<<ar.price<<endl<<endl;
}
}
}
}
else{
cout<<"Incorect choice!";
}
}
/*****************************
Печать всех записей
****************************/
void print(film *ar, int count){
cout<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<endl;
for(i=0; i<count; i++){
if(ar.price>0){
cout<<ar.name<<"\t"<<ar.producer<<"\t\t"<<ar.ganre
<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
}
}
}
/*****************************
Добавление
****************************/
void add(film *ar, int tmp_i, int count){
char add_param[10];
int end, add_iparam;
cout<<"How many film do you wont add?";
cin>>end;
for(i=tmp_i;i<tmp_i+end; i++){
cout<<"Enter name"<<endl;
cin>>add_param;
strcpy(ar.name,add_param);
cout<<"Enter producer"<<endl;
cin>>add_param;
strcpy(ar.producer,add_param);
cout<<"Enter ganre"<<endl;
cin>>add_param;
strcpy (ar.ganre, add_param);
cout<<"Enter rate"<<endl;
cin>>add_iparam;
ar.rate=add_iparam;
cout<<"Enter price"<<endl;
cin>>add_iparam;
ar.price=add_iparam;
}
print(ar, count );
}
/**********************
Основная функция
***********************/
void main(){
int count=15, choice, m_choice, tmp_i=0;
film *ar=new film [count];
strcpy (ar[0].name, "film1");
strcpy (ar[0].producer, "prod1");
strcpy (ar[0].ganre, "comedy");
ar[0].rate=10;
ar[0].price=15;
strcpy ( ar[1].name, "film2");
strcpy (ar[1].producer, "prod2");
strcpy (ar[1].ganre, "triller");
ar[1].rate=9;
ar[1].price=11;
strcpy ( ar[2].name, "film3");
strcpy (ar[2].producer, "prod1");
strcpy (ar[2].ganre, "action");
ar[2].rate=10;
ar[2].price=21;
strcpy ( ar[3].name, "film4");
strcpy (ar[3].producer, "prod3");
strcpy (ar[3].ganre, "comedy");
ar[3].rate=6;
ar[3].price=7;
strcpy ( ar[4].name, "film5");
strcpy (ar[4].producer, "prod2");
strcpy (ar[4].ganre, "action");
ar[4].rate=8;
ar[4].price=14;
strcpy ( ar[5].name, "film6");
strcpy (ar[5].producer, "prod3");
strcpy (ar[5].ganre, "triller");
ar[5].rate=9;
ar[5].price=5;
for(i=0;i<count; i++){
if(ar[tmp_i].price>0) //определение последней записи для функции добавления
tmp_i=i;
}
//cout<<tmp_i;
cout<<"Choice action :\n\t0 - rate in ganre.\n\t1 - index search.\n\t2 - Print all.\n\t3 - add film\n"<<endl;
cin>>m_choice;
switch(m_choice){//Меню выбора действий
case 0: pop_ganre(ar, count);
break;
case 1:cout<<"Enter search criterion :\n\t0 - name.\n\t1 - producer.\n\t2 - ganre.\n\t3 - rate\n\t4 - price"<<endl;
cin>>choice;
switch(choice){
case 0:search(ar, count, choice=0);
break;
case 1:search(ar, count, choice=1);
break;
case 2:search(ar, count, choice=2);
break;
case 3:search(ar, count, choice=3);
break;
case 4:search(ar, count, choice=4);
break;
default:cout<<"Incorect choice"<<endl;
break;
};
break;
case 2: print(ar, count);
break;
case 3: add(ar, tmp_i, count);
break;
default:cout<<"Incorect choice"<<endl;
break;
}
delete [] ar;
}
Создать структуру ВИДЕОМАГАЗИН со следующими полями:
Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска
Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление.
*/
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int i=0;
/**********************
Структура ВИДЕОМАГАЗИН
***********************/
struct film {
char name[10];
char producer[10];
char ganre[10];
int rate;
int price;
};
/**********************
Поиск по заданому критерию
***********************/
void search(film *ar, int count, int choice){
int f=-1;
//cout<<word<<endl;
switch (choice){
case 0:
char name[10];
cout<<"Enter Name :";
cin>>name;
for(i=0; i<count; i++){
if(strcmp(ar.name,name)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 1:
char prod[10];
cout<<"Enter Producer :";
cin>>prod;
for(i=0; i<count; i++){
if(strcmp(ar.producer,prod)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 2:
char ganre[10];
cout<<"Enter Ganre :";
cin>>ganre;
for(i=0; i<count; i++){
if(strcmp(ar.ganre,ganre)==0){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 3:
int rate;
cout<<"Enter Rate :";
cin>>rate;
for(i=0; i<count; i++){
if(ar.rate==rate){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
break;
case 4:
int price;
cout<<"Enter Price in $ :";
cin>>price;
for(i=0; i<count; i++){
if(ar.price==price){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar.name<<"\t"<<ar.producer<<"\t\t"
<<ar.ganre<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
f++;
//break;
}
};
default:;
break;
}
if(0==f)cout<<"Not found"<<endl;
}
/*****************************
Поиск по популярности в жанре
****************************/
void pop_ganre(film *ar, int count){
char ch_ganre[10];
int tmp=0, tmp_i=0;
cout<<"Enter ganre"<<endl;
cin>>ch_ganre;
for(i=0; i<count; i++){
if(0==strcmp(ar.ganre,ch_ganre)){
if(ar.rate>tmp){
tmp=ar.rate;
tmp_i=i;
}
}
}
if(tmp_i>-1&&tmp_i<count){
cout<<"Find!!\n"<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<ar[tmp_i].name<<"\t"
<<ar[tmp_i].producer<<"\t\t"<<ar[tmp_i].ganre<<"\t"<<ar[tmp_i].rate<<"\t"<<ar[tmp_i].price<<endl<<endl;
for(i=tmp_i+1; i<count; i++){//если еще есть фильм
if(ar.rate==tmp){
if(0==strcmp(ar.ganre,ch_ganre)){
cout<<ar.name<<"\t"<<ar.producer<<"\t\t"<<ar.ganre<<"\t"
<<ar.rate<<"\t"<<ar.price<<endl<<endl;
}
}
}
}
else{
cout<<"Incorect choice!";
}
}
/*****************************
Печать всех записей
****************************/
void print(film *ar, int count){
cout<<"Name\t"<<"Producer\t"<<"Ganre\t"<<"Rate\t"<<"Price\n"<<endl;
for(i=0; i<count; i++){
if(ar.price>0){
cout<<ar.name<<"\t"<<ar.producer<<"\t\t"<<ar.ganre
<<"\t"<<ar.rate<<"\t"<<ar.price<<endl<<endl;
}
}
}
/*****************************
Добавление
****************************/
void add(film *ar, int tmp_i, int count){
char add_param[10];
int end, add_iparam;
cout<<"How many film do you wont add?";
cin>>end;
for(i=tmp_i;i<tmp_i+end; i++){
cout<<"Enter name"<<endl;
cin>>add_param;
strcpy(ar.name,add_param);
cout<<"Enter producer"<<endl;
cin>>add_param;
strcpy(ar.producer,add_param);
cout<<"Enter ganre"<<endl;
cin>>add_param;
strcpy (ar.ganre, add_param);
cout<<"Enter rate"<<endl;
cin>>add_iparam;
ar.rate=add_iparam;
cout<<"Enter price"<<endl;
cin>>add_iparam;
ar.price=add_iparam;
}
print(ar, count );
}
/**********************
Основная функция
***********************/
void main(){
int count=15, choice, m_choice, tmp_i=0;
film *ar=new film [count];
strcpy (ar[0].name, "film1");
strcpy (ar[0].producer, "prod1");
strcpy (ar[0].ganre, "comedy");
ar[0].rate=10;
ar[0].price=15;
strcpy ( ar[1].name, "film2");
strcpy (ar[1].producer, "prod2");
strcpy (ar[1].ganre, "triller");
ar[1].rate=9;
ar[1].price=11;
strcpy ( ar[2].name, "film3");
strcpy (ar[2].producer, "prod1");
strcpy (ar[2].ganre, "action");
ar[2].rate=10;
ar[2].price=21;
strcpy ( ar[3].name, "film4");
strcpy (ar[3].producer, "prod3");
strcpy (ar[3].ganre, "comedy");
ar[3].rate=6;
ar[3].price=7;
strcpy ( ar[4].name, "film5");
strcpy (ar[4].producer, "prod2");
strcpy (ar[4].ganre, "action");
ar[4].rate=8;
ar[4].price=14;
strcpy ( ar[5].name, "film6");
strcpy (ar[5].producer, "prod3");
strcpy (ar[5].ganre, "triller");
ar[5].rate=9;
ar[5].price=5;
for(i=0;i<count; i++){
if(ar[tmp_i].price>0) //определение последней записи для функции добавления
tmp_i=i;
}
//cout<<tmp_i;
cout<<"Choice action :\n\t0 - rate in ganre.\n\t1 - index search.\n\t2 - Print all.\n\t3 - add film\n"<<endl;
cin>>m_choice;
switch(m_choice){//Меню выбора действий
case 0: pop_ganre(ar, count);
break;
case 1:cout<<"Enter search criterion :\n\t0 - name.\n\t1 - producer.\n\t2 - ganre.\n\t3 - rate\n\t4 - price"<<endl;
cin>>choice;
switch(choice){
case 0:search(ar, count, choice=0);
break;
case 1:search(ar, count, choice=1);
break;
case 2:search(ar, count, choice=2);
break;
case 3:search(ar, count, choice=3);
break;
case 4:search(ar, count, choice=4);
break;
default:cout<<"Incorect choice"<<endl;
break;
};
break;
case 2: print(ar, count);
break;
case 3: add(ar, tmp_i, count);
break;
default:cout<<"Incorect choice"<<endl;
break;
}
delete [] ar;
}
Код:
//LIST.H
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <assert.h>
#include <iostream>
typedef int DataT_ ;
class ListElement
{
public:
DataT_ data;
ListElement * prev;
ListElement * next;
};
class List : public ListElement
{
private:
ListElement * elm;
ListElement * end;
ListElement * beg;
ListElement * ptr;
public:
List ();
~List ();
bool _OK_ ();
bool _DUMP_ ();
bool add (DataT_ d);
bool wrt (DataT_ d);
bool ins (DataT_ d);
bool rmv ();
// Oo
DataT_ List :: read ()
{
assert (_OK_());
return ptr->data;
}
bool isfirst ()
{
assert (_OK_());
if (ptr->prev == beg)
return true;
else
return false;
}
bool isempty ()
{
assert (_OK_());
if (beg == end) return true;
else
return false;
}
bool next ()
{
assert (_OK_());
ptr = ptr -> next;
return true;
}
bool first ()
{
assert (_OK_());
ptr->prev = beg;
ptr->next = beg->next;
return true;
}
};
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <assert.h>
#include <iostream>
typedef int DataT_ ;
class ListElement
{
public:
DataT_ data;
ListElement * prev;
ListElement * next;
};
class List : public ListElement
{
private:
ListElement * elm;
ListElement * end;
ListElement * beg;
ListElement * ptr;
public:
List ();
~List ();
bool _OK_ ();
bool _DUMP_ ();
bool add (DataT_ d);
bool wrt (DataT_ d);
bool ins (DataT_ d);
bool rmv ();
// Oo
DataT_ List :: read ()
{
assert (_OK_());
return ptr->data;
}
bool isfirst ()
{
assert (_OK_());
if (ptr->prev == beg)
return true;
else
return false;
}
bool isempty ()
{
assert (_OK_());
if (beg == end) return true;
else
return false;
}
bool next ()
{
assert (_OK_());
ptr = ptr -> next;
return true;
}
bool first ()
{
assert (_OK_());
ptr->prev = beg;
ptr->next = beg->next;
return true;
}
};
Код:
#include "List.h"
List :: List () :
elm(new ListElement),
beg(elm),
end(beg),
ptr(elm)
{
elm -> data = 0;
elm -> next = NULL;
}
List :: ~List ()
{
delete elm;
delete beg;
delete end;
delete ptr;
}
bool List :: _OK_()
{
if (elm && beg && end)
return true;
else
return false;
}
bool List :: _DUMP_ ()
{
printf ("function _DUMP_ ():\n");
if (_OK_() == true)
{
printf ("elm = %d\n beg = %d\n end = %d\n ptr = %d\n", (int)elm, (int)beg, (int)end, (int)ptr);
return true;
}
else
{
printf ("wtf? O_o");
return false;
}
}
bool List :: add (DataT_ d)
{
assert (_OK_());
elm = new ListElement;
elm -> data = d;
elm -> next = 0;
elm -> prev = end;
end -> next = elm;
end = elm;
ptr = elm;
return elm -> data == d;
}
bool List :: wrt (DataT_ d)
{
assert (_OK_());
ptr -> data = d;
if (ptr -> data == d)
return true;
else
return false;
}
bool List :: ins (DataT_ d)
{
assert (_OK_());
elm = new ListElement;
elm -> data = d;
elm -> next = ptr -> next;
elm -> prev = ptr;
ptr -> next = elm;
if (ptr != end)
(elm->next)->prev = elm;
else
end = elm;
ptr = elm;
if (elm -> data == d)
return true;
else
return false;
}
bool List :: rmv ()
{
assert (_OK_());
if (ptr == beg)
{
beg = beg -> next;
beg -> prev = NULL;
}
else if (ptr == end)
{
end = end -> prev;
end -> next = NULL;
}
else
{
(ptr->prev)->next = ptr->next;
(ptr->next)->prev = ptr->prev;
}
if (_OK_())
{
ptr = (ptr -> prev);
return true;
}
else
return false;
}
int main ()
{
List test;
if (test.isempty()==true) printf ("sys:list is empty\n");
for (int i = 1; i < 5; i++)
test.add (i);
test.next();
test.rmv ();
system ("pause");
return 0;
}
List :: List () :
elm(new ListElement),
beg(elm),
end(beg),
ptr(elm)
{
elm -> data = 0;
elm -> next = NULL;
}
List :: ~List ()
{
delete elm;
delete beg;
delete end;
delete ptr;
}
bool List :: _OK_()
{
if (elm && beg && end)
return true;
else
return false;
}
bool List :: _DUMP_ ()
{
printf ("function _DUMP_ ():\n");
if (_OK_() == true)
{
printf ("elm = %d\n beg = %d\n end = %d\n ptr = %d\n", (int)elm, (int)beg, (int)end, (int)ptr);
return true;
}
else
{
printf ("wtf? O_o");
return false;
}
}
bool List :: add (DataT_ d)
{
assert (_OK_());
elm = new ListElement;
elm -> data = d;
elm -> next = 0;
elm -> prev = end;
end -> next = elm;
end = elm;
ptr = elm;
return elm -> data == d;
}
bool List :: wrt (DataT_ d)
{
assert (_OK_());
ptr -> data = d;
if (ptr -> data == d)
return true;
else
return false;
}
bool List :: ins (DataT_ d)
{
assert (_OK_());
elm = new ListElement;
elm -> data = d;
elm -> next = ptr -> next;
elm -> prev = ptr;
ptr -> next = elm;
if (ptr != end)
(elm->next)->prev = elm;
else
end = elm;
ptr = elm;
if (elm -> data == d)
return true;
else
return false;
}
bool List :: rmv ()
{
assert (_OK_());
if (ptr == beg)
{
beg = beg -> next;
beg -> prev = NULL;
}
else if (ptr == end)
{
end = end -> prev;
end -> next = NULL;
}
else
{
(ptr->prev)->next = ptr->next;
(ptr->next)->prev = ptr->prev;
}
if (_OK_())
{
ptr = (ptr -> prev);
return true;
}
else
return false;
}
int main ()
{
List test;
if (test.isempty()==true) printf ("sys:list is empty\n");
for (int i = 1; i < 5; i++)
test.add (i);
test.next();
test.rmv ();
system ("pause");
return 0;
}
Все компилируется, а выбрасывает с ошибкой.. =( просит либо дебаг либо отладку.. [COLOR="Red"]#[/COLOR] в чем дело, никак не могу понять =(
[COLOR="Red"]Подобные сокращения в Студентах запрещены,буду штрафовать.[/COLOR]модератор.
Есть следующий код, реализующий элементы двусвязного списка строк. Класс строк работает нормально, протестирован на всех возможных примерах. А вот с элементами списка проблема - не хотят инициализироваться через конструктор с параметрами.
[HTML]#include <iostream>
#include <string>
using namespace std;
#define maxl 255 //максимальная длина строки
char* glob_char;
class str //класс строки
{ //закрытая секция по умолчанию
int length; //длина строки
char *p; //указатель на массив символов для строки
public: //открытая секция класса
str();
str(const char *); //строка задается датой
str(int); //строка задается длиной
~str(); //деструктор очищает динамически выделенную память
str(const str &); //конструктор копий
void echo_data(); //функция выводит в стандартный поток длину и содержимое строки
str operator=(str); //перегруженный оператор присваивания
};
str::str()
{
cout << "Default str constructor without parameters" << endl;
length=maxl+1;
p=new char[length];
for (int j=0;j<length-1; ++j) p[j]='_';
p[length-1]='\0';
}
str::str(const char *t)
{
cout << "Constructor str with char* parameter" << endl;
int a=strlen(t);
if(a>maxl) {cout << "Error! Too long string" << endl; return;}
length=a+1;
p=new char[length];
for (int i=0;i<a; ++i) p=t;
p[length-1]='\0';
}
str::str(int i)
{
cout << "Constructor str with default int parameter" << endl;
if(i>maxl) {cout << "Error! Too long string" << endl; return;}
p=new char[i+1];
length=i+1;
for (int j=0;j<length-1; ++j) p[j]='a';
p[length-1]='\0';
}
str::str(const str &t)
{
cout << "Str copy constructor" << endl;
length=t.length;
p=new char [length];
for (int i=0;i<length; ++i) p=t.p;
}
str::~str()
{
cout << "Destructor str for " << endl;
echo_data();
delete [] p;
}
void str::echo_data()
{
cout << length-1 << "\t";
for (int i=0; i<length; ++i) cout << p;
cout << endl;
}
str str::operator =(str t)
{
cout << "Str operator =" << endl;
if(t.p[t.length-1]!='\0') {t.length++; t.p[length-1]='\0';}
delete [] p;
p=new char[t.length];
length=t.length;
for(int i=0;i<length-1;++i) p=t.p;
p[length-1]='\0';
return *this;
}
class delem //класс элемента двусвязного списка
{
private: //закрытая секция содержит данные - члены
str data; //строка данных списка
delem *next; //указатель на следующий элемент
delem *prev; //указатель на предыдущий элемент
public: //открытая секция содержит функции - члены доступа к данным - членам
delem(); //конструктор по умолчанию
delem(delem*, str); //конструктор с параметром
delem(const delem &); //конструктор копий
~delem(); //деструктор
delem operator=(delem); //перегруженный оператор присваивания, копирует данные и связи
};
delem::delem() //конструктор по умолчанию создает элемент список из 1 пустой строки
{
cout << "Delem default constructor" << endl;
data="\0";
next=NULL;
prev=NULL;
}
delem::delem(delem *t, str k="\0") //конструктор с параметром по умолчанию
{ //создает элемент списка после указанного
cout << "Delem constructor with default parameter" << endl;
prev=t;
next=t->next;
data=k; //и присваивает строке значение; если оно не заданное явно, то присваивается значение по умолчанию
}
delem::~delem()
{
cout << "Delem destructor" << endl;
}
delem::delem(const delem &t) //конструктор копий копирует строку элемента в новый элемент с нулевыми связями
{
cout << "Delem copy constructor" << endl;
next=NULL;
prev=NULL;
data=t.data;
}
delem delem::operator =(delem t)
{
next=t.next;
prev=t.prev;
data=t.data;
}
int main()
{
cout << "Hello" << endl;
//какая - нить хня
str one;
one.echo_data();
str two(5);
two.echo_data();
str three("three");
three.echo_data();
str four=one;
four.echo_data();
three=two;
three.echo_data();
two=three;
two.echo_data();
two="dfjhbdjfhvbjk";
two.echo_data();
cout << "Bye" << endl;
delem d1;
delem d2(d1);
delem d3(d2, "dfjdvlds");
return 0;
}
[/HTML]
Подскажите, в чем ошибка (как я понимаю, неправильно работает конструктор с параметром, но на сайте я примеров именно этого конструктора для двусвяного списка не нашла)? И как лучше реализовать собственно сам список (конкретно для строк)?