String einlesen und auf "g" kontrollieren (C)

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Pechvogel
Beiträge: 4
Registriert: Mo Nov 17, 2014 12:48 pm

String einlesen und auf "g" kontrollieren (C)

Beitrag von Pechvogel » Mo Nov 17, 2014 12:59 pm

Hallo miteinander!

Mein Programm ist eigentlich so gut wie fertig, aber hat einen Fehler, bzw. erfüllt einen Punkt nicht und ich komme einfach nicht drauf, wie ich das beheben kann.

Die Aufgabenstellung besagt, man solle einen String einlesen, und diesen auf den Buchstaben "g" (103) kontrollieren.
Stehen 2 oder mehr gs zusammen, sind sie "glücklich",
steht jedoch irgendwo ein g alleine im String, unabhängig davon ob bereits woanders welche zusammenstehen,
soll "unglücklich" ausgegeben werden (oder wenn eben gar kein g im String ist).

Mein Code erfüllt die Punkte, dass er glücklich ausgibt, wenn mehrere gs beisammen stehen, und unglücklich wenn eines allein steht oder gar keines im String ist.
Allerdings...
Wenn erst ein paar gs beisammen stehen und dann eines einzeln auftritt, gibt es fälschlicherweise "glücklich" aus, da es in die "else if" springt.
Wie kann ich das verhindern? Ich steh einfach komplett auf dem Schlauch!
Eigentlich soll es ja unglücklich ausgeben, da eines alleine herumsteht!

Code: Alles auswählen

#include <stdio.h>

int g_happy(void) {
  int c;
  int happiness[100];
  int i=0, j=0;
  for(i=0; i<100; i++){
      happiness[i]=0;
  }

  while ((c = getchar()) != '\n') {
    happiness[j]=c;
    j++;
  }


  for(i=1; i<100; i++){
    if(happiness[i]==103 && !(happiness[i+1]==103 || happiness[i-1]==103)){
        printf("G is alone!");
        return 0;
    }
    else if(happiness[i]==103 && (happiness[i+1]==103 || happiness[i-1]==103)){
        printf("Happy!");
        return 1;
    }
    else if(happiness[i]!=103) {
        continue;
    }
    else{
        printf("No G at all!");
        return 0;
    }
}
  return 0;
}


int main() {

  if (g_happy())
    printf(" g is :-)\n");
  else
    printf(" g is :-(\n");

  return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: String einlesen und auf "g" kontrollieren (C)

Beitrag von cloidnerux » Mo Nov 17, 2014 1:31 pm

Hi und Willkommen im Forum :D
Wie kann ich das verhindern? Ich steh einfach komplett auf dem Schlauch!
Eigentlich soll es ja unglücklich ausgeben, da eines alleine herumsteht!
Das Problem ist, dass du die Ausführung beendest, wenn du zwei zusammenhängende "g"s Findest, das ist aber falsch.

Deine Bedingung ist ja, dass ein Text solange "unglücklich" ist, wie nicht alle "g"s in Paaren/Gruppen Auftreten.

Das bedeutet, dass du erst dan "glücklich" ausgeben kannst, wenn du mindestens ein "g"-Pärchen gefunden hast und kein vereinzelten.
Daher als Pseudocode:

Code: Alles auswählen

#define UNHAPPY 0
#define HAPPY 1

int state = UNHAPPY
for(inti = 1; i < STRING_LENGTH; i++)
{
    if(text[i] == 103 && !(text[i+1] == 103 || text[i-1] == 103))   //Ein einzelnes g gefunden, der Text kann nicht mehr "happy" sein
        return UNHAPPY
    else if(text[i] == 103 && (text[i+1] == 103 || text[i-1] == 103))   //Es wurde mindestens ein g-pärchen gefunden
        state = HAPPY
}
return state;   //Sollte kein g-pärchen gefunden worden sein, wird hier UNHAPPY zurück gegeben.    
}
Ich hoffe ich konnte Helfen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Pechvogel
Beiträge: 4
Registriert: Mo Nov 17, 2014 12:48 pm

Re: String einlesen und auf "g" kontrollieren (C)

Beitrag von Pechvogel » Mo Nov 17, 2014 2:07 pm

Hallo!^^

Nun fällt es mir wie Schuppen von den Augen.
Habe ganz vergessen, dass "return" direkt die Schleife beendet.
So ist das manchmal, wenn man sich zu viel Kopf macht.
Mit deiner Version hat es nach ein wenig Getüftel dann endlich geklappt!

Danke dir!

Antworten