Ahoj, potřebuju pomoct s úkolem z programování. V Céčku dělám jen pár měsíců a tohle je nad moje síly..
Úkolem je naprogramovat funkci, která bude porovnávat jméno souboru se zadanou maskou.
Funkce má následující rozhraní (je nutné přesně dodržet): int fileMatch ( const char * mask, const char * file )
Význam parametrů je následující:
MASK udává masku jména souborů. Může obsahovat libovolné ASCII znaky, je ukončená binární nulou (ASCIIZ řetězec). Maska vyjadřuje tvar jména souboru. Hvězdička v masce je zástupný znak, kterému vyhoví libovolný počet libovolných znaků jména souboru. Ostatní znaky v masce představují "obyčejné" znaky, které mají být obsažené ve jménu souboru.
FILE udává jméno souboru v ASCIIZ notaci.
Funkce vrací návratovou hodnotu nula, pokud parametr jméno souboru nevyhoví zadané masce. Pokud jméno vyhovuje, funkce vrací hodnotu 1.
Funkce nesmí nic vypisovat na výstup ani nic číst ze vstupu.
Ví někdo jak na to??
Fórum › C / C++
Pomoc s úkolem v C
Ve zkratce co me napadlo v rychlosti na příkladu: maska - ex*r.* na soubor explorer.exe.
Masku si rozdelime na bloky pevne daneho textu mezi hvezdickama. U nasi masky dostaneme ex a r. a ted postupne budeme vyhledavat tyto bloky v nazvu souboru timto stylem:
1, hledame blok ex v explorer.exe
- nalezen => explorer.exe => do dalsiho kola predame zbytek retezce za prvnim blokem
2, hledame blok r. v plorer.exe
- nalezen => plorer.exe => do dalsiho kola predame zbytek retezce za druhym blokem
3, vsechny bloky nalezeny => nazev odpovida masce
Pokud se stane, ze na nejaky blok nenarazime, tak nazev masce neodpovida.
Snad to dava smysl a snad by to melo fungovat na 99% pripadech :D
2 KIIV: Mas nejake hezci reseni? Tak ze zvedavosti se ptam.
To dannyk : oni maj velice velice podrobnou napovedu.. sem jel podle ni a jediny co tam nezminujou je, ze musis hlidat '\n'
proste musi udelat kdyz se rovnaji dva znaky a neni to '\0' tak rekurze s maska +1 a file + 1
kdyz se nerovnaji a v masce je * tak se zkousej 3 cesty: rekurze kde maska + 1 a file nebo rekurze kde je maska a file+1 nebo se posune oboje file+1 maska+1
jediny co se pak nesmi zapomenout ze kdyz narazim na konec file a zaroven je maska * tak se posouvam o jedno v masce ale file necham porad na stejnem miste
Mohl bys mi aspoň nějak napovědět? Triviální to pro mě fakt není. Nečekám že napíšu na forum a za pár minut za mě někdo udělá úkol, ale pachtím se s tím už delší dobu a dá se říct že je to pro mě životně důležitý úkol.
tak ja napovim tim ze ti hodim tu rekurzi ale jen bez '*'
int fileMatch ( const char * mask, const char * file ) {
if ( *mask == *file ) {
if ( *mask == '\0' ) {
return 1;
} else {
return fileMatch( mask+1,file+1);
}
} else {
/* cast pro hvezdicku v masce */
}
return 0;
}
todle funguje jen pro stejnej soubor a masku (nebere v potaz *)
a uvnitr toho else musis nejprve:
otestovat zda je na pozici *mask hvezdicka...
pokud je:
otestovat zda uz *file neni konec retezce... pokud je tak rekurze kdy se posuneme jen o jednu v masce ale file zustane na miste
(u prosteho srovnani se posouvalo v rekurzi u obou..)
a jinak otestovat ty tri moznosti.. (proste prostridas file+1 a mask+1 s verzeme bez +1.. verze kdy se nepricte ani k jednomu neni dobrej napad)
To Thill :
od toho se to tam dela na 3 dalsi rekurze...
maska zustane na ty hvezdicce a file se posune o jedna.. a to se muze udelat i vickrat.. tj * je vice znaku
2 KIIV: Aha, to jsem nevedel. Podle tech znaku sem to principialne uvazoval podobne, ale nevyuzival jsem u toho tu rekurzi. Tema blokama mi to prijde mozna jednodussi a prehlednejsi. Ale kazdopadne nemam domyslene, jestli to neni chybove.
To Thill : pochybuju ze bys ty penize pak poslal.. kolik bys tak byl ochoten dat? jestli ses z prahy tak bys to stihl na pankrac :DDD
To dannyk : nerekurzivne by se to dalo asi zase delat pomoci DFS .. zasobnik a fici se... resp ono to co sem pouzil je rekurzivni backtracking a to je vesmes DFS algoritmus.. samo se da udelat rekurzivne nebo nerekurzivne...
pak meli v zadani jeste jakousi levinsteinovu vzdalenost..
no nebudu dal napinat, vypada to takhle:
int fileMatch ( const char * mask, const char * file ) {
if ( *mask == *file ) {
if ( *mask == '\0' ) {
return 1;
} else {
return fileMatch( mask+1,file+1);
}
} else {
if ( *mask == '*' ) {
if ( *file == '\0' ) {
return fileMatch(mask+1,file);
} else {
return fileMatch(mask+1,file+1) || fileMatch(mask,file+1) || fileMatch(mask+1,file);
}
}
}
return 0;
}
2 KIIV: Aha, no jestli se nekdy budu nudit, tak si to vyzkousim :) Dik za info
co todle:
int fileMatch ( const char * mask, const char * file ) {
while ( *mask == *file ) {
if ( *mask != 0 ) {
mask++;
file++;
} else {
return 1;
}
}
if ( *mask == '*' ) {
if ( *file == '\0' ) {
return fileMatch(mask+1,file);
} else {
return fileMatch(mask+1,file+1) || fileMatch(mask,file+1) || fileMatch(mask+1,file);
}
}
return 0;
}
sem se zbavil zbytecny rekurze pri srovnavani stejnych retezcu
Nevim jaka data to pouziva, cely program vypada takhle:
int fileMatch ( const char * mask, const char * file )
{
/* doplnit implementaci */
}
#ifndef __PROGTEST__
int main ( int argc, char * argv [] )
{
int x;
x = fileMatch ( "pokus", "pokus" );
/* x = 1 */
x = fileMatch ( "pokus", "pokusy" );
/* x = 0 */
x = fileMatch ( "pokus*", "pokusny" );
/* x = 1 */
x = fileMatch ( "*pokus*", "Toto je pokusny text." );
/* x = 1 */
x = fileMatch ( "*prog*Prog*", "Neni nad programovani na Progtestu." );
/* x = 1 */
x = fileMatch ( "*prog*Prog*", "Opravdovi programatori programuji programy tak, ze na Progtestu odevzdaji program na prvni pokus." );
/* x = 1 */
x = fileMatch ( "Prog*test", "Progtest" );
/* x = 1 */
x = fileMatch ( "Prog*test", "Progtrest" );
/* x = 0 */
x = fileMatch ( "Prog[test]", "Prog[test]" );
/* x = 1 */
x = fileMatch ( "**********", "" );
/* x = 1 */
return ( 0 );
}
#endif /* __PROGTEST__ */
KIIV napsal:
to bude mimo.. protoze to same u kamose proslo naprosto bez problemu..
Na toto by som si dával pozor, odovzdávať na vlas rovnaké programy [ak ich nejaký testovač náhodou porovnáva] je veľká odvaha, ktorá sa odmeňuje v lepšom prípade ničím, v horšom disciplinárkou.
To Nosko : navlas stejne nejsou.. tendle je trochu prehazenej.. ale fachat by mel tez stejne
krom toho me to je uplne jedno :D ja uz dlouho nestuduju a kdyz sem studoval tak sem malo kdy potreboval s necim pomoci..
EDIT: a jeste do pranice - pokud nezvlada toto, mel by zauvazovat o zmene skoly.. todle je kravina na 5 minut.. jestli nezvlada ani to tak se pri slozitejsich vecech podela :D
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomoc, pomoc s úkolem (matice v Delphi) — založil maxikp
Pomoc s úkolem — založil Stols
Pomoc s úkolem — založil Malirka
Pomoc s úkolem — založil Honza
Pomoc s úkolem v C++ — založil zaltex
Moderátoři diskuze