Mistrovství v c++ příklad – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Mistrovství v c++ příklad – C / C++ – Fórum – Programujte.comMistrovství v c++ příklad – C / C++ – Fórum – Programujte.com

 

Mirek Braho0
Stálý člen
19. 6. 2007   #1
-
0
-

Ahoj lidi, jdu vás opět požádat o pomoc. Zadání je následující:

Napište šablonu funkce maxn() která přijímá jako paramtery pole položek typu T a celé číslo, jako jeho velikost. Funkce navrací jeho největší prvek. Program by měl také zahrnovat specializaci, která přijímá pole ukazatelů na char jako paramter a počet ukazatelů jako druhý parametr a navrací adresu největšího řetězce. Jestliže existuje více řetězců, kteří mají stejnou nejdelší délku, funkce navrací adresu prvního takového řetězce v pořadí. Otestujte specializaci pomocí pole o 5ti takových řetězcích.



Tu první část sem zvládnul, a ted mi jde o tu specializaci na řetězce. Udělal jsem to nějak takhle:

/* Kapitola 8 - Příběhy ve funkcích - příklad 6. */


#include <iostream>

using namespace std;

template<typename typ>
typ maxn(typ a[], int b);

int main()
{
int y[6]={ 2, 5, 8, 10, 99, 15 };
double z[4]={22.5, 12.2, 26.7, 29.8};

char ch1[]="To je ale";
char ch2[]="Podelanej";
char ch3[]="Program s tema sablonama";
char ch4[]="Ale zatim";
char ch5[]="To jde";

char * ch[5]={ ch1, ch2, ch3, ch4, ch5 };

cout<<maxn(y,6);
cout<<endl<<maxn(z,4);
cout<<endl<<maxn(ch, 5);


cout <<"\n\nAhoj!\n";
cout<<endl;
system("PAUSE");
return 0;
}

template<typename typ>
typ maxn(typ a[], int b)
{
typ temp=0;
for(int x=0; x<b; x++)
{
if(a[x]>temp)
{ temp=a[x]; }
}
return temp;
}

Ale to mi vrátí jen ten první řetězec. A ten nejdelší není. Prosím kdybyste mi někdo poupravil ten kód, nebo napsal rovnou novej a trochu to vysvětlil. Díky.

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
19. 6. 2007   #2
-
0
-

To vollf82: Jen ti napovím - u řetězců délku řeš pomocí strlen().

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
19. 6. 2007   #3
-
0
-

Částečná specializace se provádí tak, že napíšeš klíčové slovo template, vynecháš agrumet šablony napíšeš název,který musí být shoný s názvem bázove funkce, a do špičatých závorek napíšeš typ, který chceš použít, dále uvedeš seznam parametrů(opět stejný, jinak z toho bude přetěžování). V tomto případě je jasné, že chceš vytvořit funkci, která přejímá pole ukazetelu typu char(resp. char*) a to se předává funkci jako ukazatel na ukazatel. Toť vše. Mno, nepsal jsem to úplně přesně, ono totiž nastane problém, když typ v bázové funkci bude const T,pak je třeba správně uvést i specializaci, ale to je na jiné povídání a nechcu tě zbytečně mást.



#include <iostream>
#include <vector>
using namespace std;

template
<typename T>
T fce(T *pole, int len)
{ T max = pole[0];
for(int i = 0; i < len; ++i)
if(max < pole[i]) max = pole[i];
return max;
}

template
<>
char* fce<char*>(char** pole, int len)
{
int n = 0;
for(int i = 0; i < len; ++i)
if(strlen(pole[n]) < strlen(pole[i])) n = i;
return pole[n];
}


int main()
{
char *pole[] = { "Ahoj","nejdelsi", "slovo"};
int nums[] = {0,5,0,16,11,12};
cout << fce(pole, sizeof(pole)/sizeof(pole[0])) << endl;
cout << fce(nums,sizeof(nums)/sizeof(nums[0]) ) << endl;
return 0;
}

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
20. 6. 2007   #4
-
0
-

Díky moc ... už vim proč sem se v tom tak matlal. Mě vůbec nenapadlo že tou specializací myslej ...... tu specializaci, čili další šablonu pro přesně danej typ tak jak to napsal Jura :)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
20. 6. 2007   #5
-
0
-

Ku*va, zase jsem se přepsal, samozřejmě že se nejedná o částečnou specializaci, ale o úplnou. Takže pokud jsem někoho zmátl, tak se omlouvám.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 64 hostů

Podobná vlákna

Příklad z Mistrovství — založil Arach

Mistrovstvi V C++ — založil defer

Mistrovstvi C++ — založil Petr Pilař

Mistrovstvi C++ 8.4 — založil Onsi

Mistrovství v C++ - cvičenia — založil Enuyvatar

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý