Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Dobrý den, mám problém s vytvoření funkce na porovnání polí.
Máme 2 pole např. pole1 a pole2, uživatel do nich načte libovolnou hodnotu. V jednom je tedy např. pole1=1234abcd a pole2=987abcd. Program by měl v závěru vypsat, že nejdelší "podpole" náležící oběma polím je abcd a má délku 4 znaky. Na toto jsem přišla, ale problém nastane, když uživatel zadá pole1=ab1234abc pole2=789abcd. Mělo by se objevit 3 (shodné "podpole" je totiž ab ale i abc, jenže abc>ab). Bohužel nevím jak toto zapsat, stačilo by mi, kdyby mi alespoň poradil někdo, jak zapsat tu funkci, kde se pole porovnávají, nemusí mi nikdo psát celý program, s tím si poradím, děkuji mnohokrát. (povolené knihovny jsou jen stdlib.h a stdio.h)
Offline
Předpokládám, že tohle je nějaký školní úkol nebo část projektu, takže věřím, že slovní postrčení bude stačit ;-) (případně pak zas napiš co nechápeš, u čeho ses zasekla...)
Jedno pole budeš porovnávat k druhému třeba tak, že budeš cyklem postupně brát znak po znaky z jednoho pole a hledat jeho případnou existenci v poli druhém, když ho najdeš zkusíš porovnat jestli se rovnají i znaky následující => takhle budeš pokračovat dokud ke shodě nedojde (konec podřetězce) a uložíš si délku podřetězce a jeho obsah někam do pomocné proměnné.
Pomocnou proměnou přepíšeš vždycky, když najdeš delší společný podřetězec.
Tato metoda hledání podřetězce lze dále optimalizovat na větší efektivnost. Tohle bude samo o sobě přinejmenším funkční. Věřím, že když pochopíš jak na to, najdeš prostor pro nějaké to případné vylepšení/zrychlení sama ;-)
- i když najdeš určitou shodu např. s písmenem 'a' na začátku, nezapomeň pak projít i zbytek pole pro případnou další shodu abys objevila právě i ten 2., tebou uváděný, příklad "ab1234abc".
- v Céčku pozor na to kam v poli přistupuješ - při překladu tě na přístup dat mimo pole nic neupozorní
- nevím jestli máte nějak omezenou délku vstupních dat, ale jinak bys ses měla zaměřit i na případné ošetření paměti...
Offline
↑ cStP:
Tak bohužel jsem to nevyřešila, vypíše to délku jen některých řetězců, tady je moje funkce:
int nejvetsi(char *ret1, char *ret2){
int i1,i2;
i1=0;
while(*(ret1+i1)){
i2=0;
while(*(ret2+i2)){
if(*(ret1+i1) == *(ret2+i2)){
break;
}
i2++;
}
if(*(ret1+i1)!=*(ret2+i2)){
return i1;
}
i1++;
}
return i1;
}
Offline
tak jsem se na to podíval a napsal tohle, myslím, mělo by to fungovat... mrkni se na to a kdyžtak napiš čemu nerozumíš ;-)
- výsledný podřetězec neukládám jako samostatný nový řetězec, ale pamatuju si index do pole a délku řetězce, takže ho získám zpětným přečtením z pole 'text2'
nevím jak to tady zvládá pěkné zobrazování syntaxe a zdrojového kódu tak jsem si dovolil to hodit na
PasteBin.
Další detaily jako co dělat, když narazíš na 2 stejně dlouhé podřetězce už si musíš upravit podle zadání - tato varianta ukládá ten první nalezený.
Offline
Stránky: 1