Техника сортировки для Literature

Рубрика: C++, Дата: 11 April, 2013, Автор:

Используйте технику, кратко описанную для Literature из параграфа 13.4 для сортировки строк в обратном лексикографическом порядке, убедитесь что указанная техника работает как на системах, где char является знаковым типом, так и на системах с без знаковым char. Напишите вариант программы для сортировки без учета регистра символов.

Опять морочная задачка ничо не понятно, за час ее не сделать. Мне токо час разбираться с самим кодом Literature. Ну да ничо тяжело в учебе легко в бою как говорят.

Давайте для начала разберем саму эту технику. У нас допустим есть шаблон функции, в котором имеется два параметра. Первый параметр применяется для указания типов параметров функции, а второй применяется для указания типов самих функций которые необходимо вызвать.

Ну от приведу маленький примерчик допустим у нас есть функция для сравнения элементов:

template<class T, class C>
int funk(T& s1, T& s2)
{
  if(C::eq(s1[0],s2[0])==1)
    return 1;

  return 0;
}

От такая от функция. Как мы видим второй параметр С используется для указания имени класса и вызова статического члена класса eq(), которому передается два параметра типа char видимо.

Теперь рассмотрим саму функцию eq():

class pervui
{
public:
  static bool eq(char a, char b){return a==b}; 
}

Таких функций мы можем создать несколько и передавать в качестве второго параметра шаблона название класса. Например создадим еще одну функцию.

class vtora9
{
public:
  static bool eq(char a, char b){return a>b}; 
}

а теперь сделаем вызов класса:

main.cpp:

int main()
{
  funk<string,vtora9>(s1,s2);

  return 0;
}

Примерно так, я код на работоспособность не проверял, это я так вам по быстрому пытаюсь сам принцип объяснить. При таком вызове вместо C станет вторая и вызовется функци eq из класса vtora9. Принцип я думаю понятен.

Теперь, что касается самой задачи от сам код решения задачи.

//texnika Literature dl9 cortirovki ctrok v obratnom lekcograficheckom por9dke
#include <iostream>
using std::cout;	
using std::endl;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;
#include <cstring>
using std::strtok;
using std::strcpy;
using std::strlen;

template<class T, class C>
int crav(const T& s1, const T& s2)//-1 men6we, 0 ravno, 1 bol6we.
{
	string a1=s1;
	string a2=s2;
	for(int i=0;i<a1.size();i++)
	{
		if(C::eq(a1[i],a2[i])==0)
		{
			continue;
		}
		else if(C::eq(a1[i],a2[i])==1)
		{
			//cout <<"mu tyt bol6we"<<a1[i]<<' '<<a2[i]<<endl; exit(1);
			return 1;
		}
		else if(C::eq(a1[i],a2[i])==-1)
		{
			//cout <<"mu tyt men6we"<<endl; exit(1);
			return -1;
		}
	}
	
	return 0;
};

template<typename T>
class Literatur
{
public:
	static int eq(T s1, T s2)//ture ecli ravno, false ecli net
	{	
		if(s1>s2)
			return 1;
		else if(s1<s2)
			return -1;
		else if(s1==s2)
			return 0;
	}
};

char* sort(const char* s)
{
	//cout <<s<<endl;
	char* str=new char[strlen(s)+1];
	strcpy(str,s);
	char* ress[100]={0};
	//razbivaem na lekcemu
	char* leksema=strtok(str," ");
	int count=0;
	while(leksema!=NULL)
	{
		//cout <<leksema<<endl;
		ress[count]=new char[strlen(leksema)+1];
		strcpy(ress[count++],leksema);
		
		leksema=strtok(NULL," ");
	}
	
	//vuvod massiva
	for(int i=0;i<count;i++)
	{
		for(int j=i+1;j<count;j++)
		{
			if(crav<string, Literatur<char> > (ress[i],ress[j])==-1)
			{
				char* temp=new char[strlen(ress[i])+1];
				strcpy(temp,ress[i]);
				ress[i]=new char[strlen(ress[j])+1];
				strcpy(ress[i],ress[j]);
				ress[j]=new char[strlen(temp+1)];
				strcpy(ress[j],temp);
			}
		}
	}
	cout <<endl;
	string result;
	//vuvod macciva
	for(int i=0;i<count;i++)
	{
		//cout <<ress[i]<<endl;
		result+=ress[i];
		if(i!=count-1)
			result+=" ";
	}
	//cout <<result<<endl;
	return (char*)result.data();
}

int main()
{
	char str[]="hellow world gacpada aficeru kykyriky barada";
	string s1="Hellow";
	string s2="Hellow";
	cout <<crav<string, Literatur<char> >(s1,s2)<<endl; 
	cout <<str<<endl;
	cout <<sort(str)<<endl;
	cout <<str<<endl;
	
	return 0;
}

Здесь все ясно я просто создал функцию sort() и в ней использую шаблон функции crav<string, Literatur<char> >() и все, это я его использую для сравнения, это так чтобы вы поняли.

[youtube]http://www.youtube.com/watch?v=b0xq5RKdxJ4[/youtube]

rss