Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонная ф-ия в нешаблонном классе? Как сделать? 
:(
    Опции темы
Doc_d0s
Дата 6.11.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Вот код:
Код

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

void ErrorMessage(int i);  // Вывод сообщений на экран
int Menu(char *s);    // функция меню

// Структура данных
//class List;
class Data
{
     friend class List;
     char name[21];
     char dir[21];
     char country[21];
     int bud;
     float doh;
  public:
     Data *next, *prev;
     Data()
     {    // конструктор
         strcpy(name,"No_title");
         strcpy(dir,"No_title");
         strcpy(country,"No_title");
         bud=0;
         doh=0.00;
         next=prev=NULL;
     }
    void TableView();

    void Setname(char *s)   // Установка имени в класс
    {
       strncpy(name, s, 20);   //копирует из строки
       name[20]='\0';
    }
    void Setcountry(char *s)  // Установка страны в класс
    {
        strncpy(country, s, 20);
        country[20]='\0';
    }
    void Setdir(char *s)   // Установка режиссера в класс
    {
         strncpy(dir, s, 20);
         dir[20]='\0';
    }

    void Setbud(int n)  // Установка вюджета в класс
    {
        if(n>=0 && n<=32000)
            bud=n;
        else ErrorMessage(1);
    }
    void Setdoh(float i)    //Установка дохода в класс
    {
        if(i>=0)
            doh=i;
        else
            ErrorMessage(1);
    }
    char *Getname()
    {
        return name;
    } // считать имя
    char *Getcountry()
    {
        return country;
    } // считать страну
    char *Getdir()
    {
        return dir;
    }   // считать режиссера
    int Getbud()
    {
        return bud;
    } // считать бюджет
    float Getdoh()
    {
        return doh;
    }      // считать доход
};

// Класс, реализующий работу с двунаправленным списко
//template <class X>
class List{
Data *cur;
Data *AddItem();
Data *AddItem(Data *n);
Data *ShowCurItem();
Data *EditCurItem();
Data *RemoveCurItem();
void loadlist(ifstream &in);
void RemoveList();
Data *GoBegin();
Data *GoEnd();
Data *GoNext()
{
    if(cur->next)
        return cur=cur->next;
    else
    {
        ErrorMessage(2); return cur;
    }
}
Data *GoPrev()
{
    if(cur->prev)
        return cur=cur->prev;
    else
    {
        ErrorMessage(3); return cur;
    }
}

public:
    List()
        {
            cur=NULL;
        }
/*    Data *Search(int f, int val);
    Data *Search(int f, char * val);
    Data *Search(int f, float val);*/
    //template <typename>
    Data *Search(int f,class X);
    void SearchMenu();
    void InsertData();  // вставка элемента
    void ShowList();    // просмотр всего списка
    void Delete();      // удаление
    void LoadList();    // загрузить список
    void SaveList();  // сохранение файла в виде отчета
};

void List::SearchMenu()     //функция выводящая меню
{
     char str[21], title[15];     //2 массива с элементами типа char
     int contin, k;           // 2 переменные типа int
     int ch;
     float kk;
     Data *tmp, *old_cur=cur;

     if (!cur)
     {                     //если стек пуст
    ErrorMessage(5);
    return;
     }
    clrscr();
     printf (" Поиск\n -----------------");
     ShowCurItem();
     printf ( "\n\n Выберите поле, по которому будет производится поиск: ");
     do {
    scanf("%d", &ch);
   //    while (getchar()!= '\n');

    if (ch < 1 || ch > 5)
        printf(" Введите число от 1 до 5: ");
        clrscr();
     } while (ch < 1 || ch > 5);
     switch (ch)
     {
    case 1:
        strncpy(title, "Название", 15);   //указатель на 1 элемент массива title
    case 2:                                   //strncpy копирует значение из второго элемента в первый
        if (ch == 2)
            strncpy(title, "Режиссер", 15);
    case 3:
        if (ch == 3)
            strncpy(title, "Страна", 15);
        printf( "Введите значение поля '%s': ",title);
            scanf("%s",str);
        GoBegin();
        while (cur)
        {
           tmp = Search<char*>(ch, str);    //промежуточная переменная для хранения адреса
           if (tmp)
           {
            old_cur = tmp;
            ShowCurItem();
            printf( "\n 1 - продолжить поиск; 0 - стоп: ");
                scanf ("%d", &contin);
            if (!contin)
                return;
            else
            {
                if (cur->next)
                    cur = cur->next;
                else
                    return;
            }
           }
           else
           {
              printf("\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n");
              getch();
           }
         }
         cur = old_cur;
         break;
    case 4:   printf( "Введите значение поля 'Бюджет': ");
          scanf("%d ", &k);
          GoBegin();
          while (cur)
          {
               tmp = Search(ch, k);
               if (tmp)
               {
                old_cur = tmp;
                ShowCurItem();
                printf("\n 1 - продолжить поиск; 0 - стоп: ");
                       scanf("%d",&contin);
                if (!contin)
                    return;
                else
                {
                    if (cur->next)
                    cur = cur->next;
                    else return;
                }
                }
                else
                {
                   printf("\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n");
                   getch();
                }
         }
         cur = old_cur;
         break;
     case 5:    printf("Введите значение поля 'Доход': ");
              scanf ("%f",&kk);
           GoBegin();
          while (cur)
          {
               tmp = Search<float>(ch, kk);
               if (tmp)
               { old_cur = tmp;
                ShowCurItem();
                printf( "\n 1 - продолжить поиск; 0 - стоп: ");
                    scanf("%d",&contin);
                if (!contin)
                return;
                else
                {
                if (cur->next)
                    cur = cur->next;
                else
                    return;
                }
                }
                else
                {
                   printf( "\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n");
                   getch(); }
                 }
                 cur = old_cur;
                 break;
     default:
            printf( "\nНеверный пункт меню!\n Нажмите любую клавишу для продолжения...\n");
    }
}             template

template<class X> Data *List::Search(int f, X val)    //val значение к
{                                    //f  значение ch
 if (f== 4 && cur != NULL)
    {
         while (cur)
         {
          if (cur->bud == val)
               return cur;
          cur = cur->next;
         }
         return NULL;
    }
 if ((f > 1 && f < 3) && cur != NULL)
 {
     char * key;
     while (cur)
     {
      switch (f)
      { case 1: key = cur->name; break;
        case 2: key = cur->dir; break;
        case 3: key = cur->country; break;
      }
      if (!strcmp(key,val))
       return cur;
      cur = cur->next;
 }
 return NULL;
 }
 return NULL;
}

Data* List::GoBegin()
{
 if (!cur)
    return NULL;
 while (cur->prev)
    cur = cur->prev;
 return cur;
}

Data* List::GoEnd()
{
 if (!cur)
    return NULL;
 while (cur->next)
    cur = cur->next;
 return cur;
}

void List::LoadList()
{
 int i;
  char fname[30]; //char *fname=new char[30]
    printf("Введите имя файла: ");
        scanf("%s", fname);
 //while (getchar() != '\n');

 ifstream in(fname);
 if(!in) {
    ErrorMessage(6); return;
  }
  if (cur)
 switch(Menu(" 1) Дописать информацию в базу| 2) При чтении информации с диска, старую базу удалять| 3) Отмена"))
 {
  case 1: while(cur->next)
        cur=cur->next;
      loadlist(in);
          printf("\nБаза загружена");
          break;
  case 2: RemoveList();
      loadlist(in);
          printf("\nБаза загружена");
          break;
 }
 else
   loadlist(in);
in.close();    //закрывает файл
in.clear(0);
printf("\nНажмите любую клавишу...");
getch();
}

void List::loadlist(ifstream &in)
{
 Data *temp;
 char s[256];
 int i;
 float f;

while (!in.eof())     //возвращает 1 если конец файла
{
  temp=new Data;    //создаем объект класса- элемент списка
 if(!temp)        //если не  создался
    {
        ErrorMessage(4); exit(1);
    }
  in>>s;                  //заполняем поля элемента списка
  temp->Setname(s);
  in>>s;
  temp->Setdir(s);
  in>>s;
  temp->Setcountry(s);
  in>>s;
  temp->Setbud(atoi(s)); //строка в число int
  in>>s;
  temp->Setdoh(atof(s));
  if (!in.eof())
    AddItem(temp);
  else
    delete temp;
 }
}

void List::SaveList()
{
  char fname[30];
  Data *temp=cur;
  printf( "Введите имя файла: ");

  scanf("%s", fname);
  ofstream out(fname);    //вывод в файл
  if(!out) {                           //если некуда выводить
    ErrorMessage(6);
    return;
  }

if(!cur) {
    ErrorMessage(5);
    return;
     }               //если список пустой

while(temp->prev)
    temp=temp->prev;   //устанавливаем указатель на начало

do{
out<<temp->Getname()<<endl;
out<<temp->Getdir()<<endl;
out<<temp->Getcountry()<<endl;
out<<temp->Getbud()<<endl;
out<<temp->Getdoh()<<endl;

temp=temp->next;
} while(temp);
out.close();

printf("\nБаза данных успешно сохранена в файл!\n");
printf("Нажмите любую клавишу...");
getch();
}

void List::RemoveList()
{
Data *temp;
if(!cur) {
     ErrorMessage(5);
     return;
      }

while(cur->prev)
     cur=cur->prev;
do
{
 temp=cur;
 cur=cur->next;
 delete temp;
}while(cur);
}

Data *List::RemoveCurItem()
{
Data *temp=cur;
 if(temp==NULL)
  {
  ErrorMessage(5);
   return cur;
   }


 if(cur->next&&cur->prev)  // удаляем элемент в середине
 {
  cur->next->prev=cur->prev;
  cur->prev->next=cur->next;
  cur=cur->next;
  delete temp;
  return cur;
 }
 if(cur->next&&!cur->prev) // удалаяем первый элемент
 {
   cur->next->prev=NULL;
   cur=cur->next;
   delete temp;
   return cur;
 }
 if(!cur->next&&cur->prev) // удалаяем последний элемент
 {
   cur->prev->next=NULL;
   cur=cur->prev;
   delete temp;
   return cur;
 }
 if(!cur->next&&!cur->prev) // удаляем единственный элемент
 {
   cur=NULL;
   delete temp;
   return cur;
 }
return cur;
}

void List::Delete()
{
 int i;
 if(!cur)
  {
   ErrorMessage(5);
    return;
   }
 do{
  clrscr();
  if(cur)
   ShowCurItem();
   else
    {
     ErrorMessage(5);
      return;
     }
  i=Menu(" 1) Удалить текущий элемент| 2) Удалить весь список| 0) Выход в главное меню");
  switch(i)
    {
    case 1: RemoveCurItem(); break;
    case 2: RemoveList();
    case 0: return;
    }

 } while(i);

}

void List::ShowList()
{
 int i;
 do
 {
 if(cur) {clrscr();
  ShowCurItem(); }
    else
     {ErrorMessage(5); return ; }
 i=Menu(" 1) Просмотр следующего элемента| 2) Просмотр предыдущего элемента |\
 3) Просмотр первого элемента | 4) Просмотр последнего элемента |\
 5) Удалить текущий элемент | 6) Редактирование текущего элемента | 0) Выход в главное меню");
 switch(i)
 {
  case 1: GoNext(); break;
  case 2: GoPrev(); break;
  case 3: GoBegin(); break;
  case 4: GoEnd(); break;
  case 5: RemoveCurItem(); break;
  case 6: EditCurItem(); break;
 }
 }while(i);
}

Data *List::EditCurItem()
{
 char buf[20];
 float z;
 int i;
 int menu;
 do {
 clrscr();
 ShowCurItem();
 printf( "\n 0) Выход в главное меню");
 printf( "\n\n Ваш выбор: ");
 scanf("%d",&menu);

 while (getchar() != '\n');
 switch (menu)
 {
 case 1:
  printf("\n Название: ");
     scanf("%s", buf);
 cur->Setname(buf);
 break;
 case 2:
  printf("\n Режиссер: ");
    scanf("%s",buf);
 cur->Setdir(buf);
 break;
 case 3:
 printf("\n Страна: ");
    scanf("%s",buf);
 cur->Setcountry(buf);
 break;
 case 4:

 do{
 printf("\n Бюджет: ");
    scanf("%d",&i);
 cur->Setbud(i);
 }while(i<0||i>32000);
 break;
 case 5:
  do{
 printf("\n Доход: ");
    scanf("%f",&z);
 cur->Setdoh(z);
 }while(z<0);
 break;
 }
 } while (menu);     //пока menu  не ноль
 return cur;
}

Data *List::ShowCurItem()
{
 printf("\n Текущий элемент:\n ----------------");
 printf("\n 1) Название: %s" ,cur->Getname());
 printf("\n 2) Режиссер: %s ",cur->Getdir());
 printf("\n 3) Страна: %s ",cur->Getcountry());
 printf("\n 4) Бюджет: %d ",cur->Getbud());
 printf("\n 5) Доход: %f",cur->Getdoh());
 return cur;
}

Data *List::AddItem(Data *n)
{
if (cur==NULL) // вставка элемента в пустой список
   {
    cur=n;
    return n;
   }
   n->prev=NULL;
   n->next=cur;
   cur->prev=n;
   cur=n;
   return cur;
/* // ---- Вставк элемента после текущего ---------
   if (cur->next==NULL) // вставка в конец списка
 {
   n->prev=cur;
   cur->next=n;
   cur=n;
   return n;
 }
  // вставка в середину списка после текущего
  cur->next->prev=n;
  n->next=cur->next;
  n->prev=cur;
  cur->next=n;
  return cur=n;*/
}

Data *List::AddItem()
{
Data *temp=new Data(); // создание объекта Data
    if(temp==NULL)
     {
     ErrorMessage(4);
      return cur;
      }

 return AddItem(temp);
}

void List::InsertData()
{
 int i;
 clrscr();
 if(!AddItem()) return;
 ShowCurItem();
 do{
 printf("\n\nРедактировать - 1, вернуться в меню - 0.");
 printf("\nВаш выбор: ");
 scanf("%d",&i);
 }while(i!=0&&i!=1);
 if(i)
     EditCurItem();
}

void main()
{
List list;
int i;
do{
clrscr();
printf("Главное меню\n");
i=Menu(" 1) Вставка | 2) Просмотр | 3) Удаление |\
 4) Поиск | 5) Сохранить в файл | 6) Загрузить из файла | 0) Выход");

switch(i)
{
 case 1: list.InsertData(); break;
 case 2: list.ShowList(); break;
 case 3: list.Delete(); break;
 case 4: list.SearchMenu(); break;
 case 5: list.SaveList(); break;
 case 6: list.LoadList(); break;
}
} while(i);
}

void ErrorMessage(int i)
{
 printf("\a");
 switch(i)
 {
  case 1: printf("\nВведенная величина не соответсвует заданному диапозону!\n");
          break;
  case 2: printf( "\nСледующего элемента не существует! \n");
          break;
  case 3: printf( "\nПредыдущего элемента не существует! \n");
          break;
  case 4: printf("\nВ системе не хватает памяти! \n");
          break;
  case 5: printf("\nСписок пуст! \n");
          break;
  case 6: printf("\nОшибка открытия файла! \n");
          break;

 }
 printf("Нажмите любую клавишу...\n");
 getch();
}

int Menu(char *s)
{
int i, count;
count=0;
printf("\n\n");
for(i=0;i<strlen(s);i++)
   if(s[i]=='|') count++;
   count++;

for(i=0;i<strlen(s);i++)
   if(s[i]!='|') cout<<s[i];
   else cout<<'\n';
do
{
printf("\n\n Ваш выбор: ");
cin>>i;
}while(i>(count-1)||i<0);

return i;
}


--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
np9mi7
  Дата 6.11.2005, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Код

#include <string>
class Some
{
template <typename T> std::string Method () const
{
return std::string ("Если бы ты читал Страуструпа, то тогда бы таких вопросов не задавал!");
}
};



--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Doc_d0s
Дата 6.11.2005, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



понять не могу, он обращается к ф-ии по первому экзумпляру?
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
Void
Дата 6.11.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Doc_d0s @ 6.11.2005, 22:47)
понять не могу, он обращается к ф-ии по первому экзумпляру?

Понять не могу, что ты имел в виду.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
np9mi7
  Дата 6.11.2005, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
понять не могу, он обращается к ф-ии по первому экзумпляру?
, товарищ, прочитайте Страуструпа - главу про шаблоны, и тогда Вы будите в состоянии ответить на все вопросы сами. Неужели это так сложно, когда говорят где про это написано!? + Вы почерпнете много полезных знаний!

Это сообщение отредактировал(а) np9mi7 - 6.11.2005, 22:38


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.