Generátor znaků

Kategorie >>Programování>> Generátor znaků


Nedávno jsem se zamyslel nad problémem jak bych nejrychleji napsal kombinaci všech znaků které si sám určím. Nu a rozhodl jsem se,že psát ručně to prostě nemá cenu. A proč ne?



Nu vemme si například tyto znaky:



a b c d e f 0 1 2 3 4 5 je jich dohromady 12. Chci vygenerovat slovo ktere je 8 znaků dlouhé. Tudíž počet kombinací je 12^8. Coz je 429981696 možností.



Tedy ručně bych musel napsat toto:



aaaaaaaa, aaaaaaab,aaaaaaac,aaaaaaad ........ .......a5555555


baaaaaaa, baaaaaab,baaaaaac,baaaaaad ........ .......b5555555


.... .... .... .... .... .... ...... ........ ....... ........


5aaaaaaa, 5aaaaaab,5aaaaaac,5aaaaaad ........ ....... 55555555



Což jak sami vidíte je docela pracná věc. Nu a tak jelikož ovládám trochu programovaní, alespoň na takové urovni, abych si napsal program, který mi sám vygeneruje tato slova, pustil jsem se do toho. Jako jazyk jsem zvolil C++.ObrazekObrázek V Jave by byl princip stejný, jen jinak provedeno.

Ukažme si jak jsem onen prográmek spáchal. Je zde hlavni část, která se jmenuje main.cpp, zde naleznete main funkci. Pojdme se podivat dovnitř tohoto souboru, kde to vsechno zacíná.

main.cpp




#include

#include

#include "Parser.h"

#include "generator.h"

#include

int main(int argc, char* argv[])

{

CCmdLine cmd;

PCSTR line = 0;

UINT start = 1,end = 12;

try

{

if( cmd.GetArgument( "-?", 0, 0 ) )

{

printf( "Ukazka:rn" );

printf( "-f vstupy.txt -start 5 -stop 8rn" );

printf("nactou se vstupni hodnoty ze vstup.txt a zacnou se generovat od 5 az po 8znakrn");

return 0;

}



if( cmd.GetArgument( "-f", 0, 0 ) )

{

line = cmd.GetArgument("-f", 0, 0);

}

else

throw CStringException("chybi:-f soubor");



if( !line )

throw CStringException("nepodarilo se nacist nazev souboru");



if( cmd.GetArgument( "-start", 0, 0 ) )

{

start = atoi(cmd.GetArgument("-start", 0, 0));

}

else

throw CStringException("chybi:-end cislo");



if( cmd.GetArgument( "-stop", 0, 0 ) )

{

end = atoi(cmd.GetArgument("-stop", 0, 0));

}

else

throw CStringException("chybi:-stop cislo");



if( start <=0 || start > end)

throw CStringException("Start musi byt vetsi nez stop");



CParser file(line);



PSTR t = (PSTR)file.GetStart();

char tmp[1024];

ZeroMemory(tmp, sizeof tmp);





int count = 0;

while( t < file.GetEnd() && count < sizeof(tmp) )

{

tmp[count++] = *t;

t+=2;

}



printf("Nacteno %d znakurn",count);



Generator gen(tmp, start, end);

gen.SetDefaultStartString();



const UINT modulo = 1000000;

PCSTR tr = 0;

UINT64 i = 0;

while( (tr = gen.GetIncString() ) )

{

i++;

if( !(i%modulo) )

printf( "Kombinaci:%I64d mil=>%srn",(UINT64)(i/modulo),tr );

}

}



catch(CStringException str)

{

str.Show();

}



printf("Konec generovani.");

getch();



return 0;

}

Pojdme se tedy podívat na jednotlivé části kódu


Nejprve připojíme potřebné hlavičky souborů.



#include

#include

#include "Parser.h"

#include "generator.h"

#include


Dále následuje incializace proměnných, které budeme v našem programu potřebovat.



CCmdLine cmd;

PCSTR line = 0;

UINT start = 1,end = 12;


Jelikož v programu se využívají jednoduché vyjímky, jejiž s jejichž implementací se seznámíme později v souboru StringException.h program pokračuje vstupem do bloku try



try
{

Dálší řadky nejsou nic jiného než pouhé zkontrolání, zda byl program spuštěn se správnými parametry a jejich hodnoty jsou validní(správné)



if( cmd.GetArgument( "-f", 0, 0 ) )

{

line = cmd.GetArgument("-f", 0, 0);

}

else

throw CStringException("chybi:-f soubor");



if( !line )

throw CStringException("nepodarilo se nacist nazev souboru");



if( cmd.GetArgument( "-start", 0, 0 ) )

{

start = atoi(cmd.GetArgument("-start", 0, 0));

}

else

throw CStringException("chybi:-end cislo");



if( cmd.GetArgument( "-stop", 0, 0 ) )

{

end = atoi(cmd.GetArgument("-stop", 0, 0));

}

else

throw CStringException("chybi:-stop cislo");



if( start <=0 || start > end)

throw CStringException("Start musi byt vetsi nez stop");

Pokud nebude program spustěn s parametry -f cestaKsouboru -start startovaciCislo -stop konecneCislo, tak se vyhodí vyjímka, která se zachytí na konci souboru, vypíše chybovou hlášku a program se po stisknuti klávesy ukončí


Přiklad správného spuštění programu z příkazové řádky: generator.exe -f pismena.txt -start 4 -stop 8


Program nam načte každé druhé písmeno ze souboru pismena.txt a začne generovat slova od dlouhé 4 znaky a skončí až dosáhne 8 znaků.


Pokracovaní priste






Vloženo: 30.11.2007 10:43
Přečteno:4035
Autor: Martin Mizera

Hlasů: 5 Hodnocení(jako ve škole): 4
 

Komentáře (0)

   -     Nový Komentář