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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-8-22 16:53:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用C语言随机数来制作验证码程序,可以将这段代码假如各位童鞋的程序哦{:soso__14193165834053582185_1:}
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include<time.h>
  4. #include <stdlib.h>
  5. int main()
  6. {
  7.         int a,b,c;
  8.        
  9.         printf("为了确认您不是机器人,请如实回答以下问题:\n");
  10.         f:;
  11.         srand((int)time(0));
  12.         a=rand()%50+1;
  13.         b=rand()%50+1;
  14.         c=a+b;
  15.         printf("%d+%d等于几?\n",a,b);
  16.         scanf("%d",&a);
  17.         if(a!=c)
  18.         {
  19.                 printf("答案错误!请重新计算\n");
  20.                 MessageBeep(MB_ICONSTOP);
  21.                 goto f;
  22.         }
  23.         MessageBeep(48);
  24.         printf("欢迎你人类\n");
  25.         system("pause");
  26.         system("cls");
  27.         Sleep(5000);       
  28.         return 0;
  29. }
复制代码
沙发
发表于 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 21:39:59 | 只看该作者
virfyf 发表于 2012-8-22 20:57
当一个大型程序中充斥着goto时,你的程序就会变成这个
所以 养成良好的变成习惯是非常重要的

这难道就是传说中的go to .....
5#
发表于 2012-8-22 22:38:57 | 只看该作者
6#
 楼主| 发表于 2012-8-23 08:45:48 | 只看该作者
virfyf 发表于 2012-8-22 20:54
这是我写的(函数 方便调用 如果测试结果是human 就返回1 否则为0)
[mw_shl_code=c,true]short humanTest() ...

呃,我当然知道f后面无需分号,但是,平时用惯了。
7#
发表于 2012-8-24 09:13:07 | 只看该作者
不知道这面条好不好吃
8#
发表于 2013-7-22 21:53:00 | 只看该作者
Me   s   sa  ge  Bee  p(MB_I C ON  STOP)
                goto f;
        
        MessageBeep(48)[/code]这个句子干嘛用呢。。
9#
 楼主| 发表于 2013-7-22 21:55:45 | 只看该作者
超神级 发表于 2013-7-22 21:53
Me   s   sa  ge  Bee  p(MB_I C ON  STOP)
                goto f;
        

发出错误与正确提示音
10#
发表于 2013-7-22 22:04:54 | 只看该作者
凡夫俗子 发表于 2013-7-22 21:55
发出错误与正确提示音

哦哦。发出声音的明白了
11#
 楼主| 发表于 2013-7-22 22:09:20 | 只看该作者
超神级 发表于 2013-7-22 22:04
哦哦。发出声音的明白了

12#
发表于 2013-7-22 22:59:21 | 只看该作者
不知道很多人对goto很鸡血是被什么训练出来的
当年Dijkstra是说不要用goto,但人家说的主要是BASIC,当年BASIC全是goto,可读性非常差
身为数学家看不过去,写了篇文章论证在高级语言里goto break 和continue都不必要
但是在C中,除了goto并无方法从多重嵌套的结构中跳出(return除外),这也是K&R中提到的goto合理用法之一
另外linux kernel 代码风格中也说,合理使用其实可以当作是你替编译器做优化了⋯⋯

总而言之goto在C中有它适用的地方,goto不该被妖魔化。
虽然上面那段代码不是典型的适用goto的语境,但是其实用goto完全不影响可读性的
13#
 楼主| 发表于 2013-7-23 07:53:08 | 只看该作者
rosynirvana 发表于 2013-7-22 22:59
不知道很多人对goto很鸡血是被什么训练出来的
当年Dijkstra是说不要用goto,但人家说的主要是BASIC,当年B ...

好吧、我放弃GOTO了。。。确实有好长一段时间没有用了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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