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

Pomoc s úkolem v C – C / C++ – Fórum – Programujte.comPomoc s úkolem v C – C / C++ – Fórum – Programujte.com

 

Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #1
-
0
-

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??

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #2
-
0
-

je to vcelku trivialni... sem to mel za 5 minut (a to sem to nedelal do skoly ale protoze nejakej tvuj spoluzak se s tim placal tejden)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dannyk0
Věrný člen
6. 12. 2009   #3
-
0
-

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.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #4
-
0
-

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

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #6
-
0
-

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 *)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #7
-
0
-

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)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #8
-
0
-

K tomuhle bodu bych to ještě bral, ale co když hvězdička bude zastupovat více znaků?

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #9
-
0
-

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








Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
mephi0
Expert
6. 12. 2009   #10
-
0
-

[OT]To su tie ulohy všade rovnake alebo sme spolužiaci ? :D[/OT]

Nahlásit jako SPAM
IP: 147.32.90.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #11
-
0
-

To mephi : urcite jste spoluzaci

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dannyk0
Věrný člen
6. 12. 2009   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #13
-
0
-

Zbývá posledních pár hodin a já s tim furt nehnul.. Co chceš za funkční kód??

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #14
-
0
-

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..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #15
-
0
-

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;
}


Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dannyk0
Věrný člen
6. 12. 2009   #16
-
0
-

2 KIIV: Aha, no jestli se nekdy budu nudit, tak si to vyzkousim :) Dik za info

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #17
-
0
-

Dik za snahu, ale stejně sem s tím pohořel. Je to moc náročný na paměť.

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #18
-
0
-

To Thill : nesmysl.. narocny to muze byt nekde kolem 100MB stringu..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #19
-
0
-

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

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #20
-
0
-

Pořád to samý, překročena maximalní doba běhu

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #21
-
0
-

to bude mimo.. protoze to same u kamose proslo naprosto bez problemu..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #22
-
0
-

Nechápu to, všechny testy 100%, pak test náhodnými daty: překročena maximální doba běhu.. WTF?

Nahlásit jako SPAM
IP: 90.179.208.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2009   #23
-
0
-

bez tech dat a celyho programu se da jen tezko rict co to dela..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Thill
~ Anonymní uživatel
8 příspěvků
6. 12. 2009   #24
-
0
-

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__ */

Nahlásit jako SPAM
IP: 90.179.208.–
Nosko0
Stálý člen
7. 12. 2009   #25
-
0
-

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.

Nahlásit jako SPAM
IP: 84.16.37.–
KIIV
~ Moderátor
+43
God of flame
7. 12. 2009   #26
-
0
-

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

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
7. 12. 2009   #27
-
0
-

mimochodem sem to debugoval ve snu a mohla byt v teto verzi chyba pokud by bylo v masce i v souboru * ... resp urcite je

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 106 hostů

Podobná vlákna

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

 

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