2017-03-24 4 views
2

Zähle die Anzahl der Vokale in einem Wort Bitte schreibe ein Programm um zu zählen wie viele Vokale ('a', 'e', ​​'i', 'o', 'u') in einer Liste von Eingabewörtern. Ihr Programm liest die Wörter nacheinander und gibt die Anzahl der Vokale aus, die in jedem Wort vorkommen. Jedes Wort besteht nur aus Alphabeten in gemischten Fällen. Das Programm wiederholt diesen Vorgang bis zum Wort "exit" (Groß-/Kleinschreibung wird nicht beachtet). Beenden Sie in diesem Fall das Programm nach dem Ausdruck der Anzahl der Vokale in "exit". Nach der Beendigung ignoriert das Programm eventuell noch vorhandene Eingaben.Anzahl der Vokale in der Eingabe der gegebenen Wörter

Eingabe: Mehrere Wörter über mehrere Zeilen hinweg. Jedes Wort darf nicht länger als 50 Zeichen sein. Die Wörter sind durch Leerzeichen voneinander getrennt.

Ausgabe: Die Anzahl der Vokale in jedem Eingabewort, getrennt durch Newline. Das ist eine Nummer in einer Zeile.

Sample run #1: 

I 
1 
went 
1 
apple 
2 
school 
2 
by 
0 
BUS 
1 
Exit 
2 

Sample run #2: 

I go to school 
1 
1 
1 
2 
by QQ email 
0 
0 
3 
Ai yAh Oooops 
2 
1 
4 
um 
1 
eXiT ignore these please 
2 

Ich schreibe einen Code für dieses Programm und versuchte diesen Code. Es scheint die korrekte Ausgabe zu geben, gibt aber immer noch keine volle Anerkennung auf meinem Schulcode-Checker. Was scheint das Problem zu sein?

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int isVowel(char c); 
int isExit(char* c); 

int main(void) 
{ 
    char s1[51]; 
    int N, i, v = 0; 
    int noExit = 1; 

    while (noExit) 
    { 
     fgets(s1, 51, stdin); 
     N = strlen(s1); 

     for (i = 0; i < N; i++) 
     { 
      if (isExit(&s1[i])) 
      { 
       printf("2\n"); 
       noExit = 0; 
       break; 
      } 
      else 
      { 
       if (isVowel(s1[i])) 
       { 
        v++; 
       } 
       else if (s1[i] == ' ' || s1[i] == '\n') 
       { 
        printf("%d\n", v); 
        v = 0; 
       } 
      } 
     } 
    } 
    return 0; 
} 

int isVowel(char c) 
{ 
    c = toupper(c); 
    if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'a' 
      || c == 'e' || c == 'i' || c == 'o' || c == 'u') 
     return 1; 
    else 
     return 0; 
} 

int isExit(char* c) 
{ 
    if ((toupper(c[0]) == 'E') && (toupper(c[1]) == 'X') 
      && (toupper(c[2]) == 'I') && (toupper(c[3]) == 'T')) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 
+1

Jedes * Wort * kann bis zu 50 Zeichen lang sein. Zeilen können länger sein und der gebuchte Code behandelt längere Zeilen nicht korrekt. –

+0

Sie haben 'c = toupper (c);' geschrieben, aber Sie überprüfen immer noch Kleinbuchstaben ... – LPs

+0

Außerdem kann 'isExit' das Array außerhalb der Grenzen adressieren, zum Beispiel wenn' c = & s1 [49] ' – LPs

Antwort

2

Es gibt mehrere Probleme, die eine niedrigere Punktzahl erklären könnte:

  • Sie beschränken Sie sich auf Linien von 50 Zeichen. Die Schultestläufe können längere Zeilen enthalten, die Sie möglicherweise falsch handhaben. Laut Spezifikation sind die Wörter auf 50 Zeichen begrenzt, die Zeilen können jedoch länger sein. Sie sollten scanf() verwenden, um jeweils ein Wort zu lesen.
  • Sie verlassen das Programm immer, um die Sequenz 10 zu sehen, auch in der Mitte eines Wortes, das ist zu stark und nicht erforderlich: die Anforderungen wie Sie angegeben haben Das Programm wiederholt diesen Vorgang bis das Wort (case-) unempfindlich). Beenden Sie in diesem Fall das Programm, nachdem Sie die Anzahl der Vokale in gedruckt haben.
  • Sie verwenden toupper(c), wobei c den Typ char hat. Dies hat ein potentielles undefiniertes Verhalten, wenn c negativ ist.
  • Sie Großbuchstaben das Zeichen in isVowel(), aber vergleichen Sie es immer noch mit den Kleinbuchstaben Vokale.
  • c ist eine schlechte Wahl des Namens für eine char *, besser verwenden s oder str.

Hier ist eine einfachere Version:

#include <ctype.h> 
#include <stdio.h> 

int isVowel(char c); 
int isExit(const char *c); 

int main(void) { 
    char s1[51]; 
    int i, v; 

    while (scanf("%50s", s1) == 1) { 
     for (i = v = 0; s1[i] != '\0'; i++) { 
      if (isVowel(s1[i])) { 
       v++; 
      } 
     } 
     printf("%d\n", v); 
     if (isExit(s1)) 
      break; 
    } 
    return 0; 
} 

int isVowel(char c) { 
    c = toupper((unsigned char)c); 
    return (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'); 
} 

int isExit(const char *s) { 
    return (toupper((unsigned char)s[0]) == 'E' 
     && toupper((unsigned char)s[1]) == 'X' 
     && toupper((unsigned char)s[2]) == 'I' 
     && toupper((unsigned char)s[3]) == 'T' 
     && s[4] == '\0'); 
} 
+0

Punkt 3 ist das erwartete Verhalten: _Das Programm wiederholt diesen Prozess, bis das Wort "exit" (Groß-/Kleinschreibung wird nicht beachtet) ._ Und auch Punkt 2 kann Verhalten erwartet werden. – LPs

+1

@LPs: Die Anforderungen sind eigentlich präzise: 'exit' soll ein Wort sein und muss wie die anderen Wörter behandelt werden. Antwort aktualisiert Vielen Dank. – chqrlie

+0

Ja, das Programm mit der Sequenz 'exit' zu beenden ist erforderlich, und die Anzahl der Vokale für die Ausgabe muss ebenfalls –

Verwandte Themen