2016-10-04 3 views
0
int main (void) 
{ 
    char input[99999]; 

    int times=0; 
    int words=0,a=0; 

    while ((input[a]=getchar()) != EOF) // get input 
     { 
     a++; 
     } 
    for (int n=0;n<=a;n++) 
    { 
     if(input[n]<='z' && input[n]>='a'){words++;}  
    } 
    float freq=times/words; 

    for(char letter ='a'; letter<='z'; letter++) 
    { 
     for (int n=0;n<=a;n++) 
     { 
      if(input[n]==letter){times++;} 
     } 
     printf("%c %.4f\n", letter, freq); 
    } 
} 

und ich habe Ergebnisse:Wie überprüft man, wie oft 'a' angezeigt wird?

asdf a 
a 0.0000 
b 0.0000 
c 0.0000 
d 0.0000 
e 0.0000 
f 0.0000 
g 0.0000 
h 0.0000 
i 0.0000 
j 0.0000 
k 0.0000 
l 0.0000 
m 0.0000 
n 0.0000 
o 0.0000 
p 0.0000 
q 0.0000 
r 0.0000 
s 0.0000 
t 0.0000 
u 0.0000 
v 0.0000 
w 0.0000 
x 0.0000 
y 0.0000 
z 0.0000 
+0

Schreiben Sie ein Programm, das die Häufigkeit von Buchstaben Vorkommen in Text berechnet. –

+0

ich weiß nicht warum | if (input [n] == letter) {mal ++;} | funktioniert nicht –

Antwort

1

Sie haben drei große Probleme in Ihrem Code:

  1. Sie Berechnung freq an der falschen Stelle. Sie nehmen times/words, wenn times noch 0 ist. (Sie haben nichts seit der Initialisierung zugewiesen.) Dies muss stattdessen am Ende der for Schleife gehen.
  2. Sie setzen times nicht auf 0 bei jeder Iteration der for-Schleife, also ist es kumulativ. (Wenn Sie 3 a s und 4 b s, wird times 7 sein nach der b Iteration.)
  3. Sie Integer-Division, aber Sie müssen zuerst die Zähler mit einem Schwimmer konvertieren: (float)times/words.

Ich habe einige andere Bereinigungen, wie words-letters und a zu length umbenennen, da diese besser Reflexionen zu sein schien, was diese Variablen tun. Nachfolgend finden Sie eine komplette Arbeitsversion:

#include <stdio.h> 

int main (void) 
{ 
    char input[99999]; 

    int letters = 0, length = 0; 

    while ((input[length++] = getchar()) != EOF); 

    for (int n = 0; n < length; n++) 
    { 
     if (input[n] >= 'a' && input[n] <= 'z') 
     { 
      letters++; 
     }  
    } 

    for(char letter = 'a'; letter <= 'z'; letter++) 
    { 
     int times = 0; 
     for (int n = 0; n < length; n++) 
     { 
      if (input[n] == letter) 
      { 
       times++; 
      } 
     } 

     float freq = (float)times/letters; 
     printf("%c %.4f\n", letter, freq); 
    } 
} 

Beispiel ausgegeben, wenn die Zeichenfolge „Hallo“, um das Programm geleitet wird:

a 0.0000 
b 0.0000 
c 0.0000 
d 0.0000 
e 0.2000 
f 0.0000 
g 0.0000 
h 0.2000 
i 0.0000 
j 0.0000 
k 0.0000 
l 0.4000 
m 0.0000 
n 0.0000 
o 0.2000 
p 0.0000 
q 0.0000 
r 0.0000 
s 0.0000 
t 0.0000 
u 0.0000 
v 0.0000 
w 0.0000 
x 0.0000 
y 0.0000 
z 0.0000 

UPDATE

Beachten Sie, dass Ihre Lösung ziemlich ineffizient ist. Sie müssen jedes Zeichen der Eingabe 26 Mal (einmal für jeden Buchstaben) lesen.

Sie könnten stattdessen ein Array von 26 Zählern verwenden und sie alle in einem Durchgang über den Eingang aktualisieren. Hier ist eine Möglichkeit für diese Lösung:

umfassen

umfassen

int main (void) 
{ 
    char input[99999]; 
    int counts[26] = { 0 }; 
    int length = 0, total = 0; 

    while ((input[length++] = getchar()) != EOF); 

    for (int i = 0; i < length; i++) { 
     char c = tolower(input[i]); 
     if (c >= 'a' && c <= 'z') { 
      counts[c - 'a'] += 1; 
      total += 1; 
     } 
    } 

    for (int i = 0; i < 26; i++) { 
     if (counts[i] > 0) { 
      printf("%c %.4f\n", 'a' + i, (float)counts[i]/total); 
     } 
    } 
} 
+0

wt wenn zählen sowohl 'A' und 'a' für einmal 'a'? kann diese Methode noch verwenden? –

+0

zählt dann [input [i] - 'A']? –

+0

@BEIXIN Genau. Entweder zuerst in Kleinbuchstaben umwandeln oder prüfen, in welchem ​​Bereich es liegt und die richtige Menge subtrahieren. – smarx

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    char input[99999]; 
    int a=0; 
    float words=0.0,times=0; 

    while ((input[a]=getchar()) != EOF) // get input 
     { 
     a++; 
     } 
    for (int n=0;n<=a;n++) 
    { 
     if(input[n]<='z' && input[n]>='a'){words++;}  
    } 
    float freq=0; 

    for(char letter ='a'; letter<='z'; letter++) 
    { 
     for (int n=0;n<=a;n++) 
     { 
      if(input[n]==letter){times++;} 
     } 
     freq=times/words; 
     if(freq!=0){printf("%c %.4f\n", letter, freq); } 
     times=0; 
    } 

} 
Verwandte Themen