Программа на C — запутанный вывод

#c

#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;
}
  

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

Комментарии:

1. Очки — это те же очки, что и для каждой буквы в игре scrabble. Так ли это, что вы создаете какую-то программу в связи со scrabble?

2. Да, я читаю книгу, и создание этой программы было упражнением.

3. Спасибо, ребята! Я не ожидал ответов так быстро.

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

5. Обратите внимание, что getchar() возвращает int и может возвращать EOF , а не фактический символ. Ввод-вывод — сложная задача.

Ответ №1:

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

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

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

Ответ №2:

Ваша проблема в 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;
}
  

Ответ №3:

toupper(ch); вычисляет верхний регистр ch, но ничего с ним не делает. Ваш код отлично работает с вводом в верхнем РЕГИСТРЕ. При вводе в нижнем регистре вам просто нужно изменить

 toupper(ch);
  

Для

 ch = toupper(ch);
  

Ответ №4:

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

Ответ №5:

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