willbend Skrevet 20. november 2005 Del Skrevet 20. november 2005 (endret) Jeg har laget denne koden: #include <iostream> using namespace std; void finn(char *tekst, char *ord, int &antall); int main() { char tekst[100]="Once upon a time in Mexico..."; char ord[100]="in"; int tall=0; finn(tekst, ord, tall); cout<< tekst << endl << "Ordet " << ord << ", finnes " << tall << " ganger."; } void finn(char *tekst, char *ord, int &antall) { int lengde_tekst=strlen(tekst); int lengde_ord=strlen(ord); int i; int x; for(i=0;i < lengde_tekst;i++) { for(x=0;x < lengde_ord;x++) { if(tekst[i]==ord[x] && tekst[i+1]==ord[x+1]) { antall++; } } } } Men den kan bare finne et ord på to bokstaver, hva må jeg gjøre for å få en mere dynamisk søkefunksjon slik at jeg kan søke etter et ord uansett lengde? EDIT: Etter jeg hadde tenkt meg litt om fant jeg ut at jeg kunne ha brukt switch, men går det an å få samme effekt uten å bruke switch? Endret 20. november 2005 av willbend Lenke til kommentar
JBlack Skrevet 21. november 2005 Del Skrevet 21. november 2005 Har ikke tid til noe langt svar, men hva er det du ønsker å oppnå? 1. Skrive en søkerutine selv, for å trene på programmering? 2. Skrive en mest mulig optimal søkerutine? 3. Du trenger en søkealgoritme? Om det er nummer 3, så finnes det en ferdig metode i standard template library. (Bruk google.) Lenke til kommentar
Giddion Skrevet 21. november 2005 Del Skrevet 21. november 2005 har ikke tid til å skrive i c kode så jeg skriver i psudo kode 1. finn lengden på stringen som skal søkes etter (string1) 2 finn lengden på stringe som skal søkes i (string2) 3 søk etter etter string1[0] i string2 4 hvis man finner første byte fra string1 i string2 gjenta steg 3 med string[2] osv. 5 hvis indexen i string1 < lengden av string1 da finner string1 i stirng 2 Lenke til kommentar
Peter Skrevet 21. november 2005 Del Skrevet 21. november 2005 (endret) Utestet, som vanlig, men tror den skulle være inne på noe ihvertfall void finn(char *tekst, char *ord, int &antall) { int lengde_tekst=strlen(tekst); int lengde_ord=strlen(ord); bool match; for(int i=0;i<lengde_tekst-lengde_ord+1;i++) // Det må være igjen nok bokstaver til at "ord" kan forekomme { match = true; for(int x=0;x<lengde_ord;x++) { if(tekst[i+x] != ord[x]) { match = false; break; } } if(match) antall++; } } Endret 21. november 2005 av Nazgul Lenke til kommentar
willbend Skrevet 21. november 2005 Forfatter Del Skrevet 21. november 2005 Har ikke tid til noe langt svar, men hva er det du ønsker å oppnå?1. Skrive en søkerutine selv, for å trene på programmering? 2. Skrive en mest mulig optimal søkerutine? 3. Du trenger en søkealgoritme? Om det er nummer 3, så finnes det en ferdig metode i standard template library. (Bruk google.) 5184781[/snapback] Det var vel mest for å trene pluss at jeg var nysgjerrig. Lenke til kommentar
baltie Skrevet 21. november 2005 Del Skrevet 21. november 2005 Det var vel mest for å trene pluss at jeg var nysgjerrig. 5185921[/snapback] Hvis det var mest treningen så er Nazgul sin metode intuitiv og grei nok (selv om jeg er usikker på hvorfor du legger på 1 i for-løkketesten, Nazgul), men den er naiv. Hvis du er nysjerrig på en litt smartere søkealgoritme kan du google litt etter Boyer-Moore, for eksempel. Eller et generelt søk etter "string matching", finnes mange kjappe algoritmer og noen er mer spesialiserte. Lykke til! Lenke til kommentar
Peter Skrevet 21. november 2005 Del Skrevet 21. november 2005 LItt usikker selv også men tanken var dersom strengen som skal søkes i er "abc", og du søker etter "abc", så vil strlen(s1)-strlen(s2)=0, og da vil ikke loopen kjøre. Sikkert feil, bare slang ut noe uten å teste. Lenke til kommentar
JBlack Skrevet 22. november 2005 Del Skrevet 22. november 2005 (endret) Her er en enkel og fungerende (trur eg) #include <iostream> int search_linear(char *string,char *search){ for (int i=0;string[i]!=0;i++){ int match=1; for (int j=0;search[j]!=0;j++) if (string[i+j]!=search[j]){ match=0; break; } if (match==1) return i; } } int main(){ char *string="Dette er en test"; char *search="er"; std::cout << "search_linear: " << search_linear(string,search) << std::endl; return 0; } edit: Den vil antagelig kræsje dersom den får delvis match helt i slutten Endret 22. november 2005 av JBlack Lenke til kommentar
baltie Skrevet 22. november 2005 Del Skrevet 22. november 2005 edit: Den vil antagelig kræsje dersom den får delvis match helt i slutten 5189691[/snapback] Vel, ikke sikkert den vil kræsje, men du vil komme til å lese forbi teksten som er allokert, og du kan få en exception (i debug-modus, i alle fall i VC7.1, får du garantert exception, mener jeg). Du er i alle fall ikke garantert å få det resultatet du forventer. Nazgul sin kode mener jeg fungerer bra for et enkelt strengsøk (når jeg bare fikk vridd hodet rundt +1 i for-løkka ). Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå