搜索
查看: 5486|回复: 12
打印 上一主题 下一主题

[原创] C语言制作验证码程序

[复制链接]
楼主
发表于 2012-8-22 20:54:26 | 显示全部楼层
这是我写的(函数 方便调用 如果测试结果是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语句是无法被直接实现的。如有限状态自动机的实现、跳出嵌套循环以及异常处理
大概最著名的对于GOTO的批评是艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名称为《GOTO陈述有害论英语Go To Statement Considered Harmful)》的论文。[2]迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。另外一种观点出现在高德纳Structured Programming with go to Statements [3]中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。
这些批评在一些编程语言的设计上起到了效果。虽然Ada语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评,这条语句仍旧被包含进去,主要是用来支持自动生成那些goto语句必不可少的代码。[4]但是,作为goto语句目的地的标签必须使用双尖括号括起来(如:<<Start_Again>>),而这个语法在其他语言中都不被使用。这使得检查程序中goto目的地的存在变得容易。goto语句本身使用简单的形式goto Start_Again;.
*/

沙发
发表于 2012-8-22 20:57:00 | 显示全部楼层
当一个大型程序中充斥着goto时,你的程序就会变成这个
所以 养成良好的变成习惯是非常重要的
板凳
发表于 2012-8-22 22:38:57 | 显示全部楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表