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++.Obrazek
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:4145
Autor: Martin Mizera
Hlasů: 5
Hodnocení(jako ve škole): 4
-
Nový Komentář