这是我写的(函数 方便调用 如果测试结果是human 就返回1 否则为0)
[mw_shl_code=c,true]short humanTest()
{
srand((unsigned)time(NULL));
printf("为了确认您不是机器人,请如实回答以下问题:\n");
int a,b,input,i;
for(i=1;i<=5;++i)
{
a=rand()%20;
b=rand()%20;
printf("%d+%d等于几?\n",a,b);
scanf("%d",&input);
if(a+b==input)
{
MessageBeep(48);
printf("欢迎你人类\n");
return 1;
}
if(i<5)
printf("答案错误! 你还有%d次机会.\n",5-i);
}
return 0;
}[/mw_shl_code]
另外说说几点问题
1.f: goto标签后无需分号
2.srand那一句应该是srand((unsigned)time(NULL));
因为srand函数接受一个unsigned int,并非int
而time函数接受一个time_t* 是指针,所以应该使用NULL 表示空指针
3.应该尽量避免goto 因为它会让程序变得混乱不堪 难以维护
/*以下来自维基百科
GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的“面条代码”。随着结构化编程在二十世纪六十年代到七十年代变得越来越流行,许多计算机科学家得出结论,即程序应当总是使用被称为“结构化”控制流程的命令,如循环以及if-then-else语句来替代GOTO。甚至在今天,许多程序风格编码标准禁止使用GOTO语句。为GOTO语句辩护的人认为,加以限制地使用GOTO语句不会导致低质量的代码,并且声称在许多编程语言中,一些任务如果不使用一条或多条GOTO语句是无法被直接实现的。如有限状态自动机的实现、跳出嵌套循环以及异常处理。 这些批评在一些编程语言的设计上起到了效果。虽然Ada语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评,这条语句仍旧被包含进去,主要是用来支持自动生成那些goto语句必不可少的代码。[4]但是,作为goto语句目的地的标签必须使用双尖括号括起来(如:<<Start_Again>>),而这个语法在其他语言中都不被使用。这使得检查程序中goto目的地的存在变得容易。goto语句本身使用简单的形式goto Start_Again;. */
|