Gå til innhold

Telle antall forekomster av et tegn i en tekst


Anbefalte innlegg

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
Videoannonse
Annonse

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

#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

#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 av aC
Lenke til kommentar
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
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

din... din... din snylter.. :p 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 :p og nå.. ingen newlines

 

EDIT: så snylter jeg litt på deg også

Endret av aC
Lenke til kommentar
din... din... din snylter.. :p 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 :p 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 av Raring
Lenke til kommentar

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 av aC
Lenke til kommentar

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

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
  • 1 måned senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...