2016-04-27 9 views
1

Ich versuche, die Zeichen, Wörter, Zeilen und Absätze in C von der Standardeingabe zu zählen.Zählen Zeichen, Wörter, Zeilen und Absätze in C

etwas funktioniert nicht und ich weiß nicht warum.

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    int pCount=0, parCount=0, cCount=0, lCount=0; 
    double prom=0; 
    char c; 
    int newln_cnt=0; 
    while ((c=getchar())!=EOF){ 
     cCount++; 
     switch (c) 
     { 
      case '\n': 
       newln_cnt++; 
       lCount++; 
       if (newln_cnt == 2) 
       { 
        parCount++; 
        newln_cnt = 0; 
       } 
       break; 
      case ' ': 
       pCount++; 
       break; 
     }    
    } 
    prom = (cCount/pCount); 
    printf("Total caracteres: %d \n", cCount); 
    printf("Cantidad palabras: %d \n", pCount); 
    printf("Cantidad líneas: %d \n", lCount); 
    printf("Cantidad párrafos: %d \n", parCount); 
    printf("Promedio longitud palabra: %f \n", prom); 
    return 0; 
} 

es funktioniert irgendwie mit den Zeichen (es zeigt eine weniger). aber der Rest ist alles schlecht.

Eingang:

Oid, mortales, el grito sagrado: 
"Libertad, libertad, libertad!" 

Oid el ruido de rotas cadenas, 
ved en trono a la noble igualdad. 

Ya su trono dignisimo abrieron 
las Provincias Unidas del Sud 

y los libres del mundo responden: 
"Al gran pueblo argentino, salud! 
Al gran pueblo argentino, salud!" 

Y los libres del mundo responden: 
"Al gran pueblo argentino, salud!" 

Sean eternos los laureles 
que supimos conseguir, 
que supimos conseguir. 

Coronados de gloria vivamos... 
o juremos con gloria morir!, 
o juremos con gloria morir!, 

o juremos con gloria morir! 

Erwartet Ouput:

Total caracteres: 558 
Cantidad palabras: 87 
Cantidad líneas: 25 
Cantidad párrafos: 8 
Promedio longitud palabra: 4.966 

mein ouput:

Total caracteres: 557 
Cantidad palabras: 69 
Cantidad líneas: 24 
Cantidad párrafos: 12 
Promedio longitud palabra: 8.000 

Das Programm die Anzahl der Zeichen zählt, Wörter, Zeilen und Absätze (zwei Co nsecutive '\ n'). und die durchschnittliche Wortlänge.

+1

'char c;' 'sollte int c sein;'. –

+2

Sie erhöhen niemals 'cCount'. 'pCount' ist eigentlich die Anzahl der Leerzeichen, die nicht ganz mit der Anzahl der Wörter übereinstimmt. Und stell dir vor, was passiert, wenn du 3 Zeilen ohne Leerzeichen eingibst, was wäre dann "pcount"? –

+0

Es gibt einige Fortschritte in Ihrer Frage, aber Ihr Eingabe-Beispiel ist viel zu lang für das Debuggen. –

Antwort

2

Jede Ihrer Zählbedingungen ist falsch.
fix wie folgt:

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

int main(void){ 
    int pCount=0, parCount=0, cCount=0, lCount=0;//word, paragraph, character, line 
    int abCount = 0;//alphabet 
    double prom=0; 
    int c;//It should be int. 
    char pprev = '\n', prev = '\n'; 

    while ((c=getchar())!=EOF){ 
     ++cCount; 
     if(isalpha(c)) 
      ++abCount; 
     if(isspace(c)){ 
      if(c == '\n'){ 
       ++lCount; 
      } 
     } else if(isspace(prev)){//isspace(prev) && !isspace(c) : edge of top of word 
      ++pCount; 
      if(pprev == '\n' && prev == '\n'){//edge of top of paragraph 
       ++parCount; 
      } 
     } 
     pprev = prev; 
     prev = c; 
    } 
    if(prev != '\n'){//If the file is not terminated by newline 
     ++lCount; 
    } 

    prom = (double)abCount/pCount;//(cCount - spcCount - punctCount)/pCount 
    printf("Total caracteres: %d \n", cCount); 
    printf("Cantidad palabras: %d \n", pCount); 
    printf("Cantidad lineas: %d \n", lCount); 
    printf("Cantidad parrafos: %d \n", parCount); 
    printf("Promedio longitud palabra: %.3f \n", prom); 
    return 0; 
} 
+0

Genau genommen sollte es eine Zählung des Wortes sein, um das Trennzeichen zu entfernen. – BLUEPIXY

-2

Es hat kompilieren nicht wegen der Art Konvertierungsfehler, aber Sie können Schwimmer für alles verwenden und es wird kompilieren:

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    double pCount=0, parCount=0, cCount=0, lCount=0; 
    double prom=0; 
    char c; 
    int newln_cnt=0; 
    while ((c=getchar())!=EOF){ 
     switch (c) 
     { 
      case '\n': 
       newln_cnt++; 
       lCount++; 
       if (newln_cnt == 2) 
       { 
        parCount++; 
        newln_cnt = 0; 
       } 
       break; 
      case ' ': 
       pCount++; 
       break; 
     }    
    } 
    prom = (cCount/pCount); 
    printf("Total caracteres: %f \n", cCount); 
    printf("Cantidad palabras: %f \n", pCount); 
    printf("Cantidad líneas: %f \n", lCount); 
    printf("Cantidad párrafos: %f \n", parCount); 
    printf("Promedio longitud palabra: %f \n", prom); 
    return 0; 
} 

Nun, da das Programm kompiliert, können Sie einstellen, was auch immer Typen sind für Sie am besten Programm haben Sie vielleicht sogar einen eigenen Typ.

Ein berühmtes Programm, das wie Ihr Programm funktioniert, ist wc - Wortzahl und ist Teil der Standard-Unix-Bibliotheken.

+2

Warum wäre die Verwendung von Gleitkommatypen hier besser als Ganzzahlen? – dreamlax

+0

@dreamlax _ "Promedio longitudinal palabra" _ bedeutet _everage_ –

+1

@ Programmer400 _ durchschnittliche Wortlänge_ –

0

Ich sehe mehrere Probleme im Code:

  1. Absätze zählen: Sie setzen nicht newln_cnt-0 wenn lesen Charakter verschieden von \n ist. Dies zählt einen Absatz jedes Mal, wenn zwei \n gelesen werden.

  2. Leerzeichen zählen: Sie betrachten nur ' ' Zeichen, können Sie andere Leerzeichen wie \ t ou nicht breakable Raum vermissen. in Betracht ziehen, isspace() Funktion zu verwenden.

  3. mittlere Leitungslänge: Sie teilen zwei ganze Zahlen mit einem Schwimmer zu bekommen, betrachten Casting:

    prom = (float)cCount/(flao)pCount; 
    

Mein Rat: mit einem kurzen Text starten (3 Worte pro Zeile, 5 Zeilen) und einem Debugger.

Verwandte Themen