melz Skrevet 15. september 2008 Del Skrevet 15. september 2008 Hei Har en oppgave som jeg sliter litt med her. Den går på at jeg skal lage en rekursiv funksjon som sjekker hvor mange ganger et tegn forekommer i en tekst. Teksten er representert i en tegntabell (C-strenger). Hvis noen har tips til hvordan jeg løser denne så mottas det med takk. Mvh Gerhard Lenke til kommentar
Giddion Skrevet 15. september 2008 Del Skrevet 15. september 2008 1. Hvorfor må du bruke rekursiv funksjoner? 2. Hvordan skal du bruke rekursiv funksjoner? 3. Er det en skoleoppgave eller noe? 4. Hvorfor ikke bare lage en loop som kjører gjennom linjen mens du sammenligner tegn for tegn? Jeg liker å vise folk veien aka. lære folk å lage bål, derfor lager jeg ikke koden for deg. Lykke til Mvh Lars Lenke til kommentar
melz Skrevet 16. september 2008 Forfatter Del Skrevet 16. september 2008 1. Hvorfor må du bruke rekursiv funksjoner?2. Hvordan skal du bruke rekursiv funksjoner? 3. Er det en skoleoppgave eller noe? 4. Hvorfor ikke bare lage en loop som kjører gjennom linjen mens du sammenligner tegn for tegn? Jeg liker å vise folk veien aka. lære folk å lage bål, derfor lager jeg ikke koden for deg. Lykke til Mvh Lars Ja, det er en skoleoppgave. Oppgave-teksten tilsier at jeg skal bruke rekursjon. Er helt enig i at det kan være enklere å lage en loop som du sier, men oppgaven skal løses med rekursjon:-( Takk for svar i hvert fall! Lenke til kommentar
亚历山大 Skrevet 16. september 2008 Del Skrevet 16. september 2008 int found=0; char text[10]="+++++++14" for(int pos=0;pos <= sizeof(text);pos++) if(strcmp(pos,"+")) Found++; Noe lignende av dette skal funke (dunno om det funker, skreiv det iaf. rett inn i hurtisvar boksen så. Bruker å bli litt kødd med strcmp hos meg iaf. på dette). Lenke til kommentar
OldMan Skrevet 16. september 2008 Del Skrevet 16. september 2008 (endret) for(int pos=0; pos < strlen(text); pos++) if (text[pos] == '+') found++; Endret 16. september 2008 av OldMan Lenke til kommentar
Raring Skrevet 17. september 2008 Del Skrevet 17. september 2008 #include <iostream> int check(char text[], char find, int size, int pos = 0, int found = 0) { if(text[pos] == find) found++; if(pos + 1 < size) check(text, find, size, pos + 1, found); else if (pos + 1 == size) return found; } int main () { char tekst[100]="klghjkfhghvkdtfkjghdfsdjhfhtfgljhgkdhfjl111111114"; char lookingfor = 'k'; int foundings = check(tekst, lookingfor, sizeof(tekst)); std::cout << "I found " << foundings << " " << lookingfor << "'s in the string \"" << tekst << "\""; return 0; } Én måte å gjøre det på, kan sikkert gjøres bedre, f.eks. med mindre variabler i funksjonen. Lenke til kommentar
aC Skrevet 17. september 2008 Del Skrevet 17. september 2008 (endret) #include <stdio.h> int r(char*t,int p,int l){static int f;if (t[p]=='+')f++;return((p==l)?f:r(t,++p,l));} int main(){char t[10]="+++++++14";printf("%d chars found \n",r(&t[0], 0, sizeof(t)));} EDIT: Mer kompakt.. noen bedre? 216 tegn (inkl newlines) EDIT: 193 tegn Endret 17. september 2008 av aC Lenke til kommentar
Giddion Skrevet 17. september 2008 Del Skrevet 17. september 2008 EDIT: Mer kompakt.. noen bedre? 216 tegn (inkl newlines)EDIT: 193 tegn jeg snylter på deg og ligger 6 tegn under deg (ser bort fra newline) #include <stdio.h> int r(char *t,int p,int l) { static int f; if (t[p] == '+') f++; return ( (p==l) ? f : r(t,++p,l)); } int main(){ char t[] = "+++++++14"; //-2 printf ("%d chars found \n",r(t, 0, sizeof(t))); //-4 } Lenke til kommentar
rvenes Skrevet 17. september 2008 Del Skrevet 17. september 2008 1. Hvorfor må du bruke rekursiv funksjoner?2. Hvordan skal du bruke rekursiv funksjoner? 3. Er det en skoleoppgave eller noe? 4. Hvorfor ikke bare lage en loop som kjører gjennom linjen mens du sammenligner tegn for tegn? Jeg liker å vise folk veien aka. lære folk å lage bål, derfor lager jeg ikke koden for deg. Lykke til Mvh Lars Nei, du liker bare å være vansklig. Det er det som er grunnen. Lenke til kommentar
aC Skrevet 17. september 2008 Del Skrevet 17. september 2008 (endret) din... din... din snylter.. ok, ser at det kanskje var litt lurere en å sende med første addressen til array'et.. vel her int r(char*t,int p,int l){static int f;if(t[p]=='+')f++;return((p==l)?f:r(t,++p, int main(){char t[]="+++++++14";printf("%d\n",r(t,0,sizeof(t)));} 152 tegn og nå.. ingen newlines EDIT: så snylter jeg litt på deg også Endret 17. september 2008 av aC Lenke til kommentar
Raring Skrevet 17. september 2008 Del Skrevet 17. september 2008 (endret) din... din... din snylter.. ok, ser at det kanskje var litt lurere en å sende med første addressen til array'et.. vel her int r(char*t,int p,int l){static int f;if(t[p]=='+')f++;return((p==l)?f:r(t,++p, int main(){char t[]="+++++++14";printf("%d\n",r(t,0,sizeof(t)));} 152 tegn og nå.. ingen newlines EDIT: så snylter jeg litt på deg også Kanskje ikke så rart... Du mangler flere parenteser/semikolon etc. etter return for at koden skal kunne kompilere. Du må også inkludere <stdio.h> så vidt jeg vet. Altså ender vi opp på: #include <stdio.h>int r(char*t,int p,int l) { static int f; if(t[p]=='+') f++; return ((p==l)?f:r(t,++p,l)); } int main() { char t[]="+++++++14"; printf("%d\n",r(t,0,sizeof(t))); } Hvilket gjør at du ender på 170. <pirkemodus> Du gir heller ikke like fyldig svar som aC og vinner dermed enda 13 tegn (" chars found ") </pirkemodus> Endret 17. september 2008 av Raring Lenke til kommentar
aC Skrevet 17. september 2008 Del Skrevet 17. september 2008 (endret) hmm det ble noe feil i pastingen istad og man trenger ikke ha #include <stdio.h> for å kompilere (det gir warning da) int r(char*t,int p,int l){ static int f;if(t[p]=='+') f++;return((p==l)?f:r(t,++p,l));} int main(){char t[]="+++++++14"; printf("%d\n",r(t,0,sizeof(t)));} Men ja denne posten var kanskje ikke helt informativ for trådstarter.. Så skal slutte å paste dårlig kode Endret 17. september 2008 av aC Lenke til kommentar
teflonpanne Skrevet 17. september 2008 Del Skrevet 17. september 2008 Har tenkt på å ha en lignende sizecompo lenge, ble minnet på det igjen når jeg så dere holdt på. Hvem er med på en konkurranse hvor man skal lage en brainfuck-interpreter (eller har noen andre noen bedre forslag?) i ansi C (89-versjonen) og kildekoden skal være minst mulig (i bytes/tegn)? Hvis folk blir med så lager jeg bare en ny tråd for det.. Lenke til kommentar
Dj_Offset Skrevet 18. september 2008 Del Skrevet 18. september 2008 Jeg tar meg friheten til å skrelle ned noen flere bytes. int r(char*t,int p,int l){static int f;if(t[p]=='+')f++;return(p==l?f:r(t,++p,l));}int main(){char* t="+++++++14";printf("%d\n",r(t,0,strlen(t)));} Lenke til kommentar
zotbar1234 Skrevet 18. september 2008 Del Skrevet 18. september 2008 hmm det ble noe feil i pastingen istadog man trenger ikke ha #include <stdio.h> for å kompilere (det gir warning da) variable-argument funksjonene *må* ha deklarasjonen synlig før bruken. Dette er et krav. Lenke til kommentar
Dj_Offset Skrevet 19. september 2008 Del Skrevet 19. september 2008 Skreller av noen bytes til ved å ikke bruke printf som er varargs funksjon. int r(char*t,int p,int l){static int f;if(t[p]=='+')f++;return(p==l?f:r(t,++p,l));}int main(){char* t="+++++++14";puts(itoa(r(t,0,strlen(t))));} Strengt talt forventer denne en itoa() funksjon som ofte finnes, men ikke er noen standard... Lenke til kommentar
Roptaty Skrevet 20. september 2008 Del Skrevet 20. september 2008 #include <stdio.h> int c(char* p){return((*p)?((*p=='+')?1:0)+c(p+1):0);}int main(){char* t="+++++++14";printf("%i\n",c(t));return 0;} Lenke til kommentar
Harkonnen Skrevet 23. september 2008 Del Skrevet 23. september 2008 Dette er ganske tullete. Å skrive en slik rekursiv funksjon i et imperativt språk som C er bare tåpelig. Lenke til kommentar
Emancipate Skrevet 30. oktober 2008 Del Skrevet 30. oktober 2008 #include <stdio.h> int r(char *t) { return (*t == '+') + (*t++ != 0 ? r(t) : 0); } int main() { char t[] = "+++++++14"; printf("%d\n", r(t)); } 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å