Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Застрял на функциях, отстал от всех.

23K
09 февраля 2007 года
Gudzon1605
3 / / 09.02.2007
Создать структуру ВИДЕОМАГАЗИН со следующими полями:

Название фильма
Цена диска

Реализовать следующие возможности:
Поиск по названию
Показ всех записей и добавление
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Так конкретно что не получается ? Не знаешь как структуру создать или ф-ии не можешь написать? Поля структуры откуда - из файла
читаются или вводить надо?
Создать так можно:
 
Код:
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;

И пишешь ф-ии поиска ,печати и добавления.Все:) Конкретней спрашивай.
8.0K
09 февраля 2007 года
dox
28 / / 07.06.2006
Привет. только надо делать так:

cout<<"Enter film name "<<endl;
cin>>a->name;
cout<<"Price"<<endl;
cin>>a->price;
.....


т.к. обьъекты структур в дин. памяти и доступ к их полям получаем через указатель.
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: dox
Привет. только надо делать так:

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] являются верными.

242
09 февраля 2007 года
Оlga
2.2K / / 04.02.2006
а почему при объявлении массива на структуры фильм, используется идентификатор магазин?
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Да,сори,сейчас исправлю.Там надо не magazine,a film.
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: OlgaKr
а почему при объявлении массива на структуры фильм, используется идентификатор магазин?


Да, действительно странно. Я имел ввиду следущее:

Код:
struct film {
    string name;
    double price;
};

...

film* magazine = new film[counter];
...
cin >> magazine.name;
cin >> magazine.price;
...
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Lerkin-тут я протупил,не заметил.У тебя все правильно.Я понял
что у аффтара проблема с ф-иями,не может, наверно ,увеличить массив при добавлении и или сравнивает не правильно.
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Тогда не будем изобретать велосипед. Используем STL:
Код:
struct film {
    string name;
    double price;
};

vector<film> magazine;

...

film data;
cin >> data.name;
cin >> data.price;

// добавим новый фильм
magazine.push_back(data);
...

// очистим магазин
magazine.clear();
...
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Да,а можно map попробовать и со структурой не морочиться:)
Имя фильма - уникальный ключ,цена - значение.Не попадут фильмы
дубликаты.Как то так:
Код:
#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;
}
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Для данной задачи лучше тогда так:
 
Код:
...
using namespace std;

typedef pair<string, double> film;
typedef list<film> magazine;
...
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Так с list тоже можно , но мне кажется тут от задачи зависит.Если главное вставка и удаление в любой позиции - тогда list,если же главное быстрый поиск то лучше map.В map ведь сразу пары всавляются.Кстати у меня в предыдущем
посту лучше поиск делать так:
 
Код:
map<string,double>::iterator iter;
                                         ...
                                      iter = film.find(name);
            cout<<'\t'<<iter->first<<endl;
            cout<<'\t'<<iter->second<<endl;
                                          ...

Но в любом случае STL:)
242
09 февраля 2007 года
Оlga
2.2K / / 04.02.2006
для полноты коллекции решений, можно также написать работу со списками, а то вдруг автору СТЛ пользоваться нельзя :)
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
OlgaKr , Вы имеете в виду создать свой класс List и его использовать?
2Lerkin, а вообще то тут втавок много , так что пожалуй ты прав -list .Но автору скорее всего структура нужна и только.
242
09 февраля 2007 года
Оlga
2.2K / / 04.02.2006
я имею ввиду работу с связаннами списками, можно оформить в виде класса, только автор новичек, не уверенна что ему это нужно.
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
OlgaKr,Если для коллекции надо могу написать( заодно и поупражняюсь):) Выложу,потом проверите.
9
09 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Ну, для коллекции :) Ужасно примитивный односвязный список. Только для базовых (встроенных) типов.
Код:
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;
}


Можно доработать до серьёзного контейнера, ввести итераторы и т.д.
320
09 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Вот для коллекции шаблонный двусвязный список.Есть ф-ии печати,всавки в начало,в конец,удаление
и операторы =,+,==,!=,<=,>=,>,<.Но для 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;
}
14K
27 марта 2007 года
2504
33 / / 27.03.2007
Я тоже борюсь с этой задачей. Дело в том, что ее надо решить с помощью структур struct{}; Вот сама структура. А мне интересно, как осуществлять поиск в структуре!!. И list & map еще не проходили. Гении с++, подскажите.
Код:
#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};

    }


И способ добавления в структуру.
320
28 марта 2007 года
m_Valery
1.0K / / 08.01.2007
 
Код:
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};

Ошибочки тут,запятые пропущены.
Цитата: 2504
Я тоже борюсь с этой задачей. Дело в том, что ее надо решить с помощью структур struct{}; Вот сама структура. А мне интересно, как осуществлять поиск в структуре!!. И list & map еще не проходили. Гении с++, подскажите.
...
И способ добавления в структуру.


Это ты шутишь так ? Для того чтоб такое решать гении не нужны.Или ты всерьез полагаешь,что это задача для гения ? Не хватало еще чтоб гении за такое брались.Делай массив структур.

 
Код:
// динам.массив ситруктур
     film *a = new film[counter];

Заполняй ,допустим из файла считывай данные или с клавиатуры
вводи.Об этом есть на форуме,поищи.
Пиши функции , хотя бы эти 3
 
Код:
void print(film* a,int counter);// печать
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;
    }
}

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;
}

Ф-ия поиска примерно так:
Код:
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<<"Фильм с таким названием не найден";
     
}

Добавь ф-ию меню и вперед.В конце не забываем освободить память,если написали new,пишем и delete .
 
Код:
// удаляем динамический массив
    delete[] a;
14K
28 марта 2007 года
2504
33 / / 27.03.2007
За гениев, это комплимент был.:) И прикол в том, что шарящие люди в этом будут ковырятся. Но не то чувство юмора.:rolleyes:

Я за вчера сам поковырялся, массив создал, функцию печати тоже, а с поиском не вышло. Спасибо за помощь.:D
14K
03 апреля 2007 года
2504
33 / / 27.03.2007
Вот что надо было. Я понимаю, что не фонтан:) . Но я только учусь:rolleyes:
Код:
/*
 Создать структуру ВИДЕОМАГАЗИН со следующими полями:

Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска

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

*/

#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;
}
34K
19 декабря 2007 года
WiRe32
3 / / 19.12.2007
Столкнулся с проблемой, как раз на списке..

Код:
//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 "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;
}


Все компилируется, а выбрасывает с ошибкой.. =( просит либо дебаг либо отладку.. [COLOR="Red"]#[/COLOR] в чем дело, никак не могу понять =(
[COLOR="Red"]Подобные сокращения в Студентах запрещены,буду штрафовать.[/COLOR]модератор.
38K
24 апреля 2008 года
sorrelcat
6 / / 17.04.2008
Уважаемые и многоуважаемые!
Есть следующий код, реализующий элементы двусвязного списка строк. Класс строк работает нормально, протестирован на всех возможных примерах. А вот с элементами списка проблема - не хотят инициализироваться через конструктор с параметрами.
[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]
Подскажите, в чем ошибка (как я понимаю, неправильно работает конструктор с параметром, но на сайте я примеров именно этого конструктора для двусвяного списка не нашла)? И как лучше реализовать собственно сам список (конкретно для строк)?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог