IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Использование шаблонов, c++
klem4
сообщение 21.02.2006 20:04
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Есть хедер 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 //защиты от повторного использовани 



Вот то что написано в методичке (как надо работать с этим хэдером)

Цитата
Первые два этапа выполняются на небольшом массиве, задаваемом программно в наиболее общем случае так :
Record <тип ключа, тип данных> ИмяМ%u


Сообщение отредактировано: volvo - 3.11.2006 12:08


Прикрепленные файлы
Прикрепленный файл  NEWLABA.rar ( 22.03 килобайт ) Кол-во скачиваний: 187


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 12.03.2006 22:19
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Решил немного разобраться с этими шаблонами, как там и что. Написал упрощенную версию того что мне нужно, только вот в MinGW это компилируется и отрабатывает без ошибок (видимых по карйней мере), а вот TC++ это компилить не хочет, у меня указывает на ф-ю Sort и говорит что Undefined structure 'array<type>'. Как заставить это пахать на TC++ ? И у кого есть возможность,. попробуйте пожалуйста запустить это на билдере и/или VC++.

# include <iostream.h>

template <class type>
	struct array{
		type Data; // naii cia?aiea yeaiaioa ianneaa

		int operator > (array & b) {return  Data > b.Data;}
		int operator < (array & b) {return  Data < b.Data;}
		int operator >= (array & b) {return Data >= b.Data;}
		int operator <= (array & b) {return Data <= b.Data;}

		void PrintData() {cout << Data << '\n';};
	};

template <class type>
	void Print(type arr[], int n){
		for (int i = 0; i < n; i++) arr[i].PrintData();
	}

template <class type>
	void Swap(type *a, type *b){
		type T;
		T = *a;
		*a = *b;
		*b = T;
	};


template <class type>
	void Sort(array<type> arr[], int n){
		bool flag;
		do{
			flag = true;
			for (int i = 0; i < n - 1; i++)
				if (!(arr[i] >= arr[i+1])){
					Swap(&arr[i], &arr[i+1]);
					flag = false;
				}
		} while (!flag);
	};



int main(void){

array <int> a[] = {{3}, {2}, {13}, {-12}, {0}, {0}, {1}};
//array <char*> c[] = {{"bca"}, {"bac"},{"cba"},{"cab"},{"acb"},{"abc"}};

	int N = sizeof(a) / sizeof(a[0]);
	Sort(a, N);
	Print(a, N);

	return 0;
}


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
klem4   Использование шаблонов   21.02.2006 20:04
volvo   klem, у тебя в хидере ошибка :) вот так пиши в CP...   21.02.2006 20:15
klem4   :shok: как же тяжело когда не знаешь язык ... А t...   21.02.2006 20:27
klem4   Помогите пожалуйста написать шаблон для вывода мас...   23.02.2006 16:30
volvo   Формальный параметр? (Кстати, этот оператор надо...   23.02.2006 16:58
klem4   Спасибо, TC ++ пишет illegal structure operation ....   23.02.2006 17:05
klem4   В общем для массивов int и unsigned int все прошло...   5.03.2006 18:57
klem4   Тек-с ... вроде вопрос снят, методом научного тыка...   5.03.2006 19:08
volvo   Исправляй вот тут (TYPE.H): # elif defined _CHAR_P...   5.03.2006 19:08
klem4   Решил немного разобраться с этими шаблонами, как т...   12.03.2006 22:19
volvo   ТС спокойно отрабатывает (c int-ом, для char * нуж...   12.03.2006 22:36
klem4   Ээ, если я ничего не пропустил, покажи .. вроде ...   12.03.2006 22:45
volvo   вроде строки нормально сравнивает .. abc acb cab c...   12.03.2006 22:50
klem4   Ну да, я посмотрел что у гения препода в файле, та...   13.03.2006 9:52
volvo   Смотри: # include <iostream.h> # include ...   13.03.2006 10:08
klem4   Спасибо !   13.03.2006 10:12


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 30.07.2025 23:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"