эмм... тут в общем проблема в том что 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 ]. Намного приятнее читать.