Sie haben drei große Probleme in Ihrem Code:
- 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.
- 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.)
- 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);
}
}
}
Schreiben Sie ein Programm, das die Häufigkeit von Buchstaben Vorkommen in Text berechnet. –
ich weiß nicht warum | if (input [n] == letter) {mal ++;} | funktioniert nicht –