C - запутанный вывод

Я пытаюсь создать программу, которая вычисляет значение слова, суммируя значения его букв.

Это буквы и их соответствующее значение:

  • 1 Точка: A, E, I, L, N, O, R, S, T, U
  • 2 Очки: D, G
  • 3 очка: B, C, M, P
  • 4 Точки: F, H, V, W, Y
  • 5 Баллы: K
  • 8 баллов: J, X
  • 10 баллов: Q, Z

Здесь программа:

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

int main(void)
{
 char ch; int sum=0;

 printf("Enter a word: ");

 while ((ch=getchar())!='\n') {
 toupper(ch);
 if (ch== 'A' || ch== 'E' || ch== 'I' || ch== 'L' || ch== 'N' || ch== 'O' || ch== 'R' || ch== 'S' || ch== 'T' || ch== 'U')
 sum+=1;

 else if (ch== 'D' || ch== 'G')
 sum+=2;

 else if (ch=='B' || ch== 'C' || ch== 'M' || ch== 'P')
 sum+=3;

 else if (ch=='F' || ch== 'H' || ch== 'V' || ch== 'W' || ch== 'Y')
 sum+=4;

 else if (ch=='K')
 sum+=5;

 else if (ch=='J' || ch== 'X')
 sum+=8;

 else if (ch=='Q' || ch== 'Z')
 sum+=10;
 }
 printf("\nScrabble value: %d",sum);

 return 0;
}
</ctype.h></stdio.h>

Когда я запускаю программу, он печатает "Scrabble value: 0". Похоже, программа полностью пропускает цикл while, возможно, я не использую getchar правильно, но я не могу понять, что случилось.

5 ответов

Он должен быть ch = toupper(ch);

toupper не изменяет его аргумент.

И, в то время как не в коей мере не связаны с вопросом, я бы рекомендовал использовать switch для кода, как это.


Ваша проблема в toupper(). Функция не изменяет ваш символ напрямую, он возвращает измененный символ.

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

int main(void)
{
 char ch; int sum = 0;

 printf("Enter a word: ");

 while ((ch = getchar()) != '\n') {
 ch = toupper(ch);
 if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'L' || ch == 'N' || ch == 'O' || ch == 'R' || ch == 'S' || ch == 'T' || ch == 'U')
 sum += 1;
 else if (ch == 'D' || ch == 'G')
 sum += 2;
 else if (ch == 'B' || ch == 'C' || ch == 'M' || ch == 'P')
 sum += 3;
 else if (ch == 'F' || ch == 'H' || ch == 'V' || ch == 'W' || ch == 'Y')
 sum += 4;
 else if (ch == 'K')
 sum += 5;
 else if (ch == 'J' || ch == 'X')
 sum += 8;
 else if (ch == 'Q' || ch == 'Z')
 sum += 10;
 }
 printf("\nScrabble value: %d", sum);
 return 0;
}
</ctype.h></stdio.h>


Предложения не могут быть "свободными" в программе, должны быть связаны с другими, в общем случае с знаком назначения (=). Измените ch = toupper(ch) на ch = toupper(ch)


Если вы не сохраните преобразованный символ в переменную, он останется в том случае, когда он был введен. "toupper" - это функция, и для повторного использования возвращаемого значения вы должны хранить копию.


toupper(ch); вычисляет прописную букву ch, но ничего не делает с ней. Ваш код отлично работает с вводом UPPERCASE. При вводе нижнего регистра вам просто нужно изменить

toupper(ch);

в

ch = toupper(ch);

licensed under cc by-sa 3.0 with attribution.