Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: С++ 3.1 ShakerSort  (Прочитано 6609 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mana
Гость
« : 16-05-2006 14:46 » 

эмм... тут в общем проблема в том что C пишет: Function IfMoreThenSwap should have a prototype, но эта ф-ция вроде как прописана в TYPE.h , а всеравно не работает (Т.Е без этой ф-ции прога просто не сортирует) и файл вроде как подключен...
Код:
# include <stdio.h>
# include <conio.h>
# include <iostream.h>
# include <TYPE.h>


template <class T>
void far ShakerSort(T * huge item,long count )
{long lft =1,//левая граница отсортированного массива + 1
rgt =count-1,//правая граница отсортированного массива
k ;//отслеживает индекс на котором закончились обмены
//при проходе по массиву
do
{for(long j=rgt;j>=lft;j--) //проход массива справа налево
{IfMoreThenSwap(item[j-1],item[j]);//обмен
k=j; //запомнить индекс последнего обмена
}
lft=k+1; //установка границы отсортированной части 0..lft
//переворот шейкера
for(j=lft;j<=rgt;j++) //проход массива слева направо
{IfMoreThenSwap(item[j-1],item[j]); //обмен
k=j;//запомнить индекс последнего обмена
}
rgt=k-1;// установка границы отсортированной части rgt..count-1
//переворот шейкера
}
while (rgt>=lft);
}



template<class Key,class Data>
struct Record{
Key key;
Data data;
int operator>(Record & b ) {return key>b.key;}
int operator<(Record & b ) {return key<b.key;}
int operator<=(Record & b ) {return key<=b.key;}
int operator==(Record & b ) {return key==b.key;}
void operator=(Key n) {key=n;};
}


template <class Key,class Data>
void PrnKey ( Record<class Key,class Data> t){
cout<<t.key<<" ";
}



void main (void) {
clrscr();
long n,i,begin,end;
Record<unsigned,int> mass[]={{2,5},{2,1},{6},{2,6}};
n=sizeof(mass)/sizeof(mass[0]);
cout<<"Neotsortirovannij:"<<endl;
for(i=0;i<n;i++) PrnKey (mass[i]);
ShakerSort(mass,n);
cout<<"otsortir:"<<endl;
for(i=0;i<n;i++) PrnKey (mass[i]);
getch();
}


ФАЙЛ TYPE.H
Код:
//Структуры для хранения данных и ключей в массиве
# ifndef _DATA // защита от повторного включения этого файла
# define _DATA // в другой
# include <iostream.h>
# ifdef _NUMBER //ключ - число (типа int, long, float и т.д.)
//шаблоны позволяют использовать один и тот же код
//для различных типов данных и ключей
template <class Key,class Data>
struct Record
{Key key;
Data data;
//перегрузка операций > и < для сравнения ключей структур
int operator > ( Record & b ) {return key > b.key;}
int operator < ( Record & b ) {return key < b.key;}
int operator <= ( Record & b ) {return key <= b.key;}
int operator == ( Record & b ) {return key == b.key;}
// перегрузка операции = для ключа
void operator = (Key n){key=n};
//печать ключа
void PrnKey (){ cout << key<<' ';}
};
//обмен
template <class Key,class Data>
inline void swap(Record<Key,Data> & a,Record<Key,Data> & b )
{Record<Key,Data> t;
t=a;a=b;b=t;
}
//обмен, если 1-ый ключ > 2-го
template <class Key,class Data>
inline void IfMoreThenSwap(Record<Key,Data> & a,Record<Key,Data> & b )
{if (a > b ) { Record<Key,Data> t; t=a;a=b;b=t;}
}
// сравнение ключей
template <class Key,class Data>
inline int compare (Record<Key,Data> & a,Record<Key,Data> & b )
{return a>b?1:a==b?0:-1;
}
# elif defined _STR_N //ключ - строка длиной LEN_STR
# include <string.h>
//в программе перед # include <type.h> определять const LEN_STR = число;
typedef char Key[LEN_STR+1]; //+1 для хранения признака конца строки - '\0'
template <class Data> struct Record
{Key key;
Data data;
//перегрузка операций > и < для сравнения ключей структур
int operator > ( Record & b )
{return _fstrcmp(key,b.key)>0;
}
int operator < ( Record & b )
{return _fstrcmp(key,b.key)<0;
}
int operator <= ( Record & b )
{return _fstrcmp(key,b.key)<=0;
}
int operator == ( Record & b )
{return _fstrcmp(key,b.key) == 0;
}
void operator = ( char *s); //запись ключа в структуру типа Record
void PrnKey() { char *w=key; cout << w <<' ';}
}
template <class Data>
int compare ( Record<Data> & a, Record<Data> & b )
{return _fstrcmp(a.key,b.key);}
template <class Data>
void Record<Data> :: operator = ( char *s)
{
int j=0;
for(;j<LEN_STR && *s !='\0';j++) key[j] =*s++;
key[j]='\0';
}
# elif defined _CHAR_PTR //ключ - строка Си
# include <string.h>
// т.к. С++ не допускает перегрузки операций для встроенных типов
// создадим обертку для char * в виде структуры
typedef struct Key { char * key_ptr;};
template <class Data> struct Record
{Key key; //ключ
Data data; //данные
//перегрузка операций > и < для сравнения ключей структур
int operator > ( Record & b )
{return _fstrcmp(key.key_ptr,b.key.key_ptr)>0;
}
int operator < ( Record & b )
{return _fstrcmp(key.key_ptr,b.key.key_ptr)<0;
}
//запись ключа в структуру типа Record
void operator = (char *s) { key.key_ptr =s;}
void PrnKey() { cout << key.key_ptr <<' ';}
}//struc Record
template <class T>
inline int compare (Record<T> & a,Record<T> & b )
{return _fstrcmp(a.key.key_ptr,b.key.key_ptr;)
}
# endif //типа ключа
//функции обмена для строк
//если ключ - строка длиной LEN_STR или указатель на char
# if defined _STR_N || defined _CHAR_PTR
//обмен
template <class Data>
inline void swap(Record<Data> & a,Record<Data> & b )
{Record<Data> t;
t=a;a=b;b=t;
}
//обмен, если 1-ый ключ > 2-го
template <class Data>
inline void IfMoreThenSwap(Record<Data> & a,Record<Data> & b )
{if (a > b ) { Record<Data> t; t=a;a=b;b=t;}
}
# endif // строк
# endif //защиты от повторного использовани файла
и еще как это для типа char написать т.е. где там тип поменять?) (обьясните пожалуйста тупой дуре) Должен же быть выход!!!
поможите кто чем может

Finch: Пожайлуйста обноси код тэгами [ code ] [ /code ]. Намного приятнее читать.
« Последнее редактирование: 25-08-2008 10:05 от Sel » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 16-05-2006 15:33 » 

Код:
# include <TYPE.h>
При подключении своих собственных файлов нужно ставить кавычки , а не скобки.
Код:
# include "TYPE.h"
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mana
Гость
« Ответ #2 : 16-05-2006 15:53 » 

а с кавычками тоже не работает
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 16-05-2006 16:55 » new

У тебя получается наложенный шаблон. Честно говоря, я такое применение первый раз вижу Жаль.
Тут похимичил,
Код:
# include <stdio.h>
# include <conio.h>
# include <iostream.h>
# include "TYPE.h"


template <class T>
void  ShakerSort(T * item,long count )
{long lft =1,//левая граница отсортированного массива + 1
rgt =count-1,//правая граница отсортированного массива
k ;//отслеживает индекс на котором закончились обмены
//при проходе по массиву
do
{for(long j=rgt;j>=lft;j--) //проход массива справа налево
{if (item[j-1] > item[j]) { T t; t=item[j-1];item[j-1]=item[j];item[j]=t;}//обмен
k=j; //запомнить индекс последнего обмена
}
lft=k+1; //установка границы отсортированной части 0..lft
//переворот шейкера
for(j=lft;j<=rgt;j++) //проход массива слева направо
{if (item[j-1] > item[j]) { T t; t=item[j-1];item[j-1]=item[j];item[j]=t;} //обмен
k=j;//запомнить индекс последнего обмена
}
rgt=k-1;// установка границы отсортированной части rgt..count-1
//переворот шейкера
}
while (rgt>=lft);
}



template<class Key,class Data>
struct Record{
Key key;
Data data;
int operator>(Record & b ) {return key>b.key;}
int operator<(Record & b ) {return key<b.key;}
int operator<=(Record & b ) {return key<=b.key;}
int operator==(Record & b ) {return key==b.key;}
void operator=(Key n) {key=n;};
};


template <class Key,class Data>
void PrnKey ( Record<Key,Data> t){
cout<<t.key<<" ";
}



void main (void) {
//clrscr();
long n,i;
Record<unsigned,int> mass[]={{2,5},{2,1},{6},{2,6}};
n=sizeof(mass)/sizeof(mass[0]);
cout<<"Neotsortirovannij:"<<endl;
for(i=0;i<n;i++) PrnKey (mass[i]);
ShakerSort(mass,n);
cout<<"otsortir:"<<endl;
for(i=0;i<n;i++) PrnKey (mass[i]);
getch();
}
Вроде этот код работает. Я исключил двойной шаблон. У меня в VC++6.0 нормально компилится.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines