我正在完成一个C级项目,明天晚上11点到期,最后一部分给我一些问题。我在白板上设置了一棵树,这样我就可以拥有正确的逻辑,但实际上实现它比我最初设想的要困难得多。
项目这部分的分配是
char_game函数允许用户尝试猜测作为参数传递的值。每次要求用户输入新值时,都会打印提示符(应该是“letter?”)。如果用户键入的字符不是字母,则该功能通过打印“非字母”行来响应。用户键入一个错误的字符(预期小写的大写字母或反之亦然),该函数通过打印“错误的大小写”行来响应。如果用户猜到一个太高的值(稍后在字母) 程序响应“太高”,如果 用户猜测一个低于该值的值 参数,程序响应“太低”。 如果用户试图猜测MAX_GUESSES次,那么 还没有猜到价值,功能 向调用者返回0。 如果用户猜出正确的值,则为该函数 将1返回给调用者。 * / int char_game(char correct_char);
我为逻辑制作的树在这里:
到目前为止我创建的函数如下:
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;
}
答案 0 :(得分:2)
你在某处有一个太多的结束花括号}
。在两个地方,您在下面的末尾有一个错位的分号:
else if (count == MAX_GUESSES);
^
答案 1 :(得分:2)
既然你表示你在编写实现这个的逻辑时遇到了麻烦,我会尝试这种方法:根据作业考虑你的程序需要做什么,并尝试用简单的英语写下这些步骤。
例如:
一旦你完成了这些步骤,你就会清楚地记下伪代码并将其粘贴到你的函数中作为注释。尝试实现您编写的每个步骤。
如果特定步骤显得复杂或涉及,请将其作为单独的函数写入并调用它。例如,您可以编写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语句。记住您可以拥有中间函数。 bool
或int
个变量:
bool firstPart = ...;
bool secondPart = ...;
if(firstPart || secondPart)
这也可以帮助您整理。
你没有正确使用break语句。你不想在其他条件下突破循环,但继续下一次检查。所以你实际上并不需要别的。
由于你有for循环,你可以在for循环后执行MAX_GUESSES
返回。您不必再次检查循环体中的猜测次数(count == MAX_GUESSES)
。