Gå til innhold

Telle antall forekomster av et tegn i en tekst


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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

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

Skrevet

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

Skrevet

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

Skrevet (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 av aC
Skrevet
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
}

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

Skrevet (endret)

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
Skrevet (endret)
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
Skrevet (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 av aC
Skrevet

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

Skrevet

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)));}

Skrevet
hmm det ble noe feil i pastingen istad

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

Skrevet

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

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