Matematické Fórum

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

#1 21. 11. 2011 14:10

Shalinka
Příspěvky: 71
Reputace:   
 

Funkce v C na porovnání polí

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

  • (téma jako vyřešené označil(a) Shalinka)

#2 21. 11. 2011 15:07

cStP
Příspěvky: 39
Reputace:   
Web
 

Re: Funkce v C na porovnání polí

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

 

#3 23. 11. 2011 11:58

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Funkce v C na porovnání polí

↑ 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

 

#4 23. 11. 2011 13:35

cStP
Příspěvky: 39
Reputace:   
Web
 

Re: Funkce v C na porovnání polí

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

 

#5 23. 11. 2011 17:32

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Funkce v C na porovnání polí

Jo, to už nějak ošetřím, jinak to vypadá jasně, opravdu moc děkuji :)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson