C中的嵌套循环(需要更好的标题)

时间:2011-11-01 06:32:02

标签: c loops

我正在完成一个C级项目,明天晚上11点到期,最后一部分给我一些问题。我在白板上设置了一棵树,这样我就可以拥有正确的逻辑,但实际上实现它比我最初设想的要困难得多。

项目这部分的分配是

  

char_game函数允许用户尝试猜测作为参数传递的值。每次要求用户输入新值时,都会打印提示符(应该是“letter?”)。如果用户键入的字符不是字母,则该功能通过打印“非字母”行来响应。用户键入一个错误的字符(预期小写的大写字母或反之亦然),该函数通过打印“错误的大小写”行来响应。如果用户猜到一个太高的值(稍后在字母)   程序响应“太高”,如果   用户猜测一个低于该值的值   参数,程序响应“太低”。   如果用户试图猜测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 个答案:

答案 0 :(得分:2)

你在某处有一个太多的结束花括号}。在两个地方,您在下面的末尾有一个错位的分号:

else if (count == MAX_GUESSES);
                              ^

答案 1 :(得分:2)

既然你表示你在编写实现这个的逻辑时遇到了麻烦,我会尝试这种方法:根据作业考虑你的程序需要做什么,并尝试用简单的英语写下这些步骤。

例如:

  1. 收到用户的来信。
  2. 这封信是否正确?
    • 如果是,则返回1.
  3. 这个案子错了吗?
    • 向用户打印一些消息。
  4. 如果我们进入这一步,我们知道大写是相同的,但答案是不正确的。所以检查它是否更低。
    • 如果是这样,请为此方案打印。
  5. 此时它并不低,所以剩下的唯一可能性就是更高。
    • 为此方案打印一些内容。
  6. 我们还有更多的猜测吗?
    • 如果我们跳回到第1步。
    • 否则继续下一步。
  7. 我们已经用尽所有猜测,但我们没有正确猜测。所以返回0。
  8. 一旦你完成了这些步骤,你就会清楚地记下伪代码并将其粘贴到你的函数中作为注释。尝试实现您编写的每个步骤。

    如果特定步骤显得复杂或涉及,请将其作为单独的函数写入并调用它。例如,您可以编写Inputletter来处理步骤1.在其中,您可以检查用户是否输入了像字母一样合理的内容,如果不是,则会一直提示用户。当该函数返回 know 时,用户输入了一封信,而不是像数字或符号那样伪造的东西。

    最后,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))
    

答案 2 :(得分:1)

首先,将其分解为函数(例如isWrongCase(char correct,char actual)。这将提高可读性并帮助您查找错误。对于错误的案例1,您不需要两个if语句。记住您可以拥有中间函数。 boolint个变量:

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

这也可以帮助您整理。

你没有正确使用break语句。你不想在其他条件下突破循环,但继续下一次检查。所以你实际上并不需要别的。

由于你有for循环,你可以在for循环后执行MAX_GUESSES返回。您不必再次检查循环体中的猜测次数(count == MAX_GUESSES)