Вложенные циклы в C (нужен лучший заголовок) - PullRequest
2 голосов
/ 01 ноября 2011

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

Назначение для этой части проекта

Функция char_game позволяет пользователю попытаться угадать значение, переданное в качестве параметра. Подсказка (которая должна быть точно "буква?" Будет печататься каждый раз, когда пользователю предлагается ввести новое значение. Если пользователь вводит символ, который не является буквенным, функция отвечает, печатая строку "не буквенный". Если пользователь вводит символ, который является неправильным регистром (верхний регистр, когда ожидался нижний регистр или наоборот), функция отвечает, печатая строку «неправильный регистр» .Если пользователь угадывает слишком большое значение (позже в алфавит) программа отвечает "слишком высоко", и если пользователь угадывает значение, которое ниже, чем значение параметр, программа отвечает «слишком низкий». Если пользователь попытался угадать MAX_GUESSES раз, и еще не угадал значение, функция возвращает 0 вызывающему. Если пользователь угадает правильное значение, функция возвращает 1 звонящему. * / int char_game (char correct_char);

Дерево, которое я сделал для логики, здесь: Tree diagram of program logic

Функция, которую я создал до сих пор, выглядит следующим образом:

int char_game(char correct_char)
{
    char ch;
    int count;
    int return_num;
    for (count=0;count<=MAX_GUESSES;count++)
    {
        do
        {
            printf("letter?");
            scanf("%c", &ch);
        }
        while ((ch <= 'A' || ch >= 'z') || (ch > 'Z' && ch < 'a'));

        if ((ch < 'A') || (ch > 'Z' && ch < 'a') || (ch > 'z'))
        {
            printf("not alphabetic\n");
        }
        else
        {
            break;
        }

        if ((ch >= 'A' && ch <= 'Z') && (correct_char >= 'a' && correct_char <= 'z'))
        {
            printf("wrong case\n");
        }
        else if ((ch >= 'a' && ch <= 'z') && (correct_char >= 'A' && correct_char <= 'Z'))
        {
            printf("wrong case\n");
        }
        else
        {
            break;
        }

        if (correct_char > ch)
        {
            printf("too low\n");
        }
        else if (correct_char < ch)
        {
            printf("too high\n");
        }
        else
        {
            break;
        }

    }

    if (correct_char == ch)
    {
        return_num = 1;
    }
    else if (count == MAX_GUESSES);
    {
        return_num = 0;
    }
    else if (correct_char < ch)
    {
        printf("too high\n");
    }
    else
    {
        break;
    }
}

if (correct_char == ch)
{
    return_num = 1;
}
else if (count == MAX_GUESSES);
{
    return_num = 0;
}

return return_num;
}

Ответы [ 3 ]

2 голосов
/ 01 ноября 2011

У вас слишком много закрывающих фигурных скобок } где-то.В двух местах у вас есть неправильная точка с запятой в конце следующего:

else if (count == MAX_GUESSES);
                              ^
2 голосов
/ 02 ноября 2011

Поскольку вы указали, что у вас возникают проблемы при написании логики для реализации этого, я бы попробовал этот подход: подумайте о том, что ваша программа должна делать в соответствии с заданием, и попробуйте написать шаги простым языком.

Например:

  1. Получить письмо от пользователя.
  2. Правильно ли написано письмо?
    • верните 1, если это так.
  3. Не так ли дело?
    • напечатать какое-нибудь сообщение пользователю.
  4. Если мы дойдем до этого шага, мы знаем, что заглавные буквы такие же, но ответ неверный.Поэтому проверьте, не ниже ли это.
    • Напечатайте что-нибудь для этого сценария, если оно есть.
  5. На данный момент оно не ниже, поэтому единственная оставшаяся возможность выше.
    • Напечатайте что-нибудь для этого сценария.
  6. У нас есть еще догадки?
    • Если мы вернемся к шагу 1.
    • В противном случае перейдем к следующему шагу.
  7. Мы исчерпали все наши догадки и не сделалиправильно угадать.Так что верните 0.

После того, как вы выполнили все шаги и вам стало ясно, возьмите написанный псевдокод и вставьте его в свою функцию в качестве комментария.Попробуйте реализовать каждый из написанных вами шагов.

Если определенный шаг кажется сложным или сложным, запишите его как отдельную функцию и вызовите его.Например, вы можете написать Inputletter для обработки шага 1. В нем вы можете проверить, что пользователь ввел что-то разумное, например письмо, и он будет продолжать запрашивать пользователя, если это не так.Когда эта функция возвращает вас знать , пользователь ввел букву, а не что-то поддельное, например число или символ.

Наконец, C предоставляет некоторые удобные функции, которые вы можете использовать:

  • toupper
  • tolower
  • isalpha

Итак, ваш код:

while ((ch <= 'A' || ch >= 'z') || (ch > 'Z' && ch < 'a'));

if ((ch < 'A') || (ch > 'Z' && ch < 'a') || (ch > 'z'))

превращается в гораздо более читабельный:

while (!isalpha(ch));

if  (!isalpha(ch))
1 голос
/ 01 ноября 2011

Во-первых, разбейте его на функции (например, isWrongCase (char правильное, char фактическое). Это улучшит читабельность и поможет вам находить ошибки. Вам не нужно два оператора if для неправильного случая один. Помните, что вы можете иметь промежуточныйbool или int переменные:

bool firstPart = ...;
bool secondPart = ...;
if(firstPart || secondPart)

Это также может помочь вам организовать.

Вы неправильно используете операторы break. Вы не хотите выходить иззацикливайтесь в условиях else, но переходите к следующей проверке, так что вам на самом деле не нужен else.

Поскольку у вас есть цикл for, вы можете просто сделать возврат MAX_GUESSES после цикла for.Вам не нужно снова проверять количество догадок (count == MAX_GUESSES) в теле цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...