2016-12-21 5 views
-1

Мне нужно написать программу, которая учитывает все гласные в тексте & выдает процент каждого гласного для всего текста. По какой-то причине нам не разрешено использовать массивы, но вместо этого нужно делать это с помощью getchar().Подсчет гласных в тексте без массивов (C)

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

int main() { 

    int current; 
    int cntAll = 0; 
    int cntA = 0, cntE = 0, cntI = 0, cntO = 0, cntU = 0; 
    int pA = 0, pE = 0, pI = 0, pO = 0, pU = 0; 

    printf("Enter Text: ");   

    while ((current = getchar()) != EOF){ 
     if (isspace(current)) continue;      // check for whitespace, if whitespace continue 
     else { 
      switch (current) {        // check for vowel & increase vowelcount 
      case 'a': 
       cntA += 1; 
      case 'A': 
       cntA += 1; 
      case 'e': 
       cntE += 1; 
      case 'E': 
       cntE += 1; 
      case 'i': 
       cntI += 1; 
      case 'I': 
       cntI += 1; 
      case 'o': 
       cntO += 1; 
      case 'O': 
       cntO += 1; 
      case 'u': 
       cntU += 1; 
      case 'U': 
       cntU += 1; 
      } 
     } 

      cntAll++; 
    } 

    pA = (cntA/cntAll) * 100; 
    pE = (cntE/cntAll) * 100; 
    pI = (cntI/cntAll) * 100; 
    pO = (cntO/cntAll) * 100; 
    pU = (cntU/cntAll) * 100; 

    printf("\nLetters: %d\nPercentage A: %d\nPercentage E: %d\nPercentage I: %d\nPercentage O: %d\nPercentage U: %d\n",cntAll,pA,pE,pI,pO,pU); 
    system("PAUSE"); 
    return 0; 
} 

Увеличение значения cntAll работает без проблем, но по какой-либо причине оно не учитывает отдельные гласные. Поблагодарили бы за помощь!

Отредактировано:

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

int main() { 

    int current; 
    int cntAll = 0; 
    int cntA = 0, cntE = 0, cntI = 0, cntO = 0, cntU = 0; 
    double pA = 0, pE = 0, pI = 0, pO = 0, pU = 0; 

    printf("Enter Text: ");   

    while ((current = getchar()) != EOF){ 
     if (isspace(current)) continue;      
     else { 
      switch (current) {        
      case 'a':case 'A': 
       cntA += 1; 
       break; 
      case 'e':case 'E': 
       cntE += 1; 
       break; 
      case 'i':case 'I': 
       cntI += 1; 
       break; 
      case 'o':case 'O': 
       cntO += 1; 
       break; 
      case 'u':case 'U': 
       cntU += 1; 
       break; 
      } 
     } 

      cntAll++; 
    } 

    pA = 100.0 * cntA/cntAll; 
    pE = 100.0 * cntE/cntAll; 
    pI = 100.0 * cntI/cntAll; 
    pO = 100.0 * cntO/cntAll; 
    pU = 100.0 * cntU/cntAll; 

    printf("\nLetters: %d\nPercentage A: %.2lf\nPercentage E: %.2lf\nPercentage I: %.2lf\nPercentage O: %.2lf\nPercentage U: %.2lf\n",cntAll,pA,pE,pI,pO,pU); 
    system("PAUSE"); 
    return 0; 
} 

веселит

+5

вы забыли «перерыв» между случаями. – Art

+4

Все ваши переменные являются ints, поэтому деление будет целочисленным. Проценты, вероятно, лучше всего делать как float (которые вы можете форматировать как ints с 'printf'). – Joe

+2

Кажется, домашнее задание – csblo

ответ

3

Вам необходимо вставить break заявления между делами.

В противном случае программа выполнит все утверждения ниже того, что было введено первым. На самом деле это хорошая особенность. Это позволяет одновременно рассматривать несколько ярлыков. Сведя вместе вы получите:

switch (current){ 
case 'a': case 'A': 
    cntA += 1; 
    break; // Don't follow through to the other cases. 
case 'b': case 'B': /*etc*/ 

После этого, обратите внимание, что (cntA/cntAll) * 100; будет оценивать выражение в скобках в целочисленной арифметике, который будет обрезать его до 0 в большинстве случаев. Исправление писать как

100 * cntA/cntAll;

Это еще укоротить до целого числа. Если это не терпимо, подумайте об использовании выражения с плавающей запятой 100.0 * cntA/cntAll и измените свои форматиры printf соответственно. В любом случае использование плавающей запятой, вероятно, лучше, поскольку оно устраняет потенциал переполнения при оценке 100 * cntA.

+0

Ну, вроде, подпрыгнул пистолет. @Bathsheba Отредактировал сообщение, не задумываясь о нем? Он по-прежнему выводит только 0,00 – brlz

+0

. Форматы символов 'printf' неверны: первый - это' int'. – Bathsheba

+0

Спасибо большое за помощь;) – brlz

1

case этикетки проваливается через на следующий ниже, без break.

Так что, если вы читаете 'a' тогда всех случаев в вашем switch будет выполнен.

Вам нужно что-то вроде

switch (current) {        // check for vowel & increase vowelcount 
case 'a': 
    cntA += 1; 
    break; // <-- Note break here 
... 
+0

Ну, угадайте, что я вроде немой, совсем забыл. благодаря – brlz

1

Первое, что я замечаю, что вам не хватает break на каждом коммутаторе случае. Это приведет к неправильному поведению. Вторая вещь:

pA = (cntA/cntAll) * 100; 

рассчитает cntS/cntAll первый, который <0. Это значение будет интерпретироваться как целое, так что вы всегда 0*100 которое 0. Вы можете переписать его как

pA = (cntA * 100)/cntAll; 

В этом случае вам не придется бросить плавать, чтобы получить правильный результат. Обратите внимание, что для больших cntA вы можете переполняться.

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