2014-10-27 2 views
0
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 

    printf("Enter a string\n"); 
    gets(string); 

    while (string[c] != '\0') 
    { 

     if (string[c] >= 'a' && string[c] <= 'z') 
     count[string[c]-'a']++; 

     else if (string[c] >= 'A' && string[c] <= 'Z') 
     count[string[c]-'A']++; 
     c++; 

    } 

    for (c = 0 ; c < 26 ; c++) 
    { 
     if(count[c] != 0) 
    printf("%c %d\n", c+'a', count[c]); 
    } 

    return 0; 
} 

Так что мне удалось заставить код работать, чтобы подсчитать частоты букв как число. Но мое задание говорит мне представлять его как процент от всей строки.Как изменить частоту писем в процентах?

Так, например, ввод aaab дал бы мне 0,7500, b - 0,2500.

Как мне изменить этот код, чтобы представить его как процент, а не число?

Кроме того, если бы я должен был делать это, когда пользователь вводит строки до EOF, просто удаляю оператор печати «Ввод строки» и изменяем while (string [c]! = '\ 0') до (string [c]! = EOF)?

+0

Деление отдельных счетов на сумму всех сумм? Или по длине строки? Однако обязательно используйте арифметику с плавающей запятой. –

+0

'count [c] * 100.0/strlen (string)' –

+0

@MOehm Я имел в виду что-то вроде MarkStechell в качестве ответа. Исправлены мои предыдущие комментарии – ha9u63ar

ответ

0

Просто добавьте накопительную переменную, каждый раз, когда она читает символ, она увеличивается на единицу (при условии, что вы хотите подсчитать частоту среди допустимых символов a-z и A-Z). В итоге разделите счет на такую ​​переменную.

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

int main() 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 
    int accum = 0; 

    printf("Enter a string\n"); 
    gets(string); 

    while (string[c] != '\0') 
    { 

     if (string[c] >= 'a' && string[c] <= 'z'){ 
     count[string[c]-'a']++; 
     accum++; 
     } 

     else if (string[c] >= 'A' && string[c] <= 'Z'){ 
      count[string[c]-'A']++; 
      accum++; 
     } 
     c++; 
    } 

    for (c = 0 ; c < 26 ; c++) 
    { 
     if(count[c] != 0) 
      printf("%c %f\n", c+'a', ((double)count[c])/accum); 
    } 

    return 0; 
} 
+0

Да! Забыл изменить это :(!! – vicsana1

+0

это не будет правильно вычислять var: accum. Поскольку строка может содержать печатные символы, отличные от az и AZ, например, ',', '.', '?' И т. Д. И т. Д. . – user3629249

0

в вашей 2-й цикл, используйте

100.0 * count[c]/strlen(string) 

, чтобы получить лучший процент

0

внутри для цикла, соиЬ/строка Len логика будет давать значение отношения.

for (c = 0 ; c < 26 ; c++) 
    { 
     if(count[c] != 0){ 
    float val = count[c] ; 
    val = (val/strlen (string)) * 100.0; 

      printf("%c %d %%:%f\n", c+'a', count[c], val); 

    } 
    } 
+0

thank u @ user3121023 –

Смежные вопросы