回 帖 发 新 帖 刷新版面

主题:[原创]第一界编程比赛_结论

首先感谢大家对该活动的支持!
此次共有7位朋友在规定的时间内给出了程序!
他们是:黄金风格,wanyunzhou,shaneqi,Knocker,eastcowboy,中国台湾,cccP.
其中Wanyunzhou,Shaneqi,cccP,写的是C++,而我又没有相应的编译器.
所以只能看着程序研究一阵,然后得出结论:程序应该没错!!

另外那四个C程序我都编译运行过了,我用的P4 2.8G WindowsXP WIN-TC1.9.1
下面发表一下我的看法:
1:黄金风格,程序简洁明了,通俗易懂,功能完全符合要求.
  所以我决定下一界的就由他来出题.请黄金风格尽快公布出题时间!!

2:Knocker,他的程序是这次比赛中关注的焦点!我的看法是短小精悍,打印出来的话可以节省一点纸!!!
  为什么这么说呢?因为:
  1.编程风格很烂,难以理解,难以调试,难以排错,难以维护,不值得学习!!
  2.未对输入范围做检查.输入超出范围的数后,居然会输出乱码!!
  3.有人说运行速度高,我看未必!对该程序我不想做多的解释(因为它实在不值得我们去学习).只是告诉大家他用的不是循环,而是递归.就是用递归来代替循环.然而递归会做大量的进栈和出栈工作!所以运行速度反而会比用循环慢.
  4.生成的代码少吗?那也不是!!!我看过,黄金风格的执行代码是9796Byte,Knocker的执行代码是9732Byte,只少64个Byte,约少0.6%到0.7%.已经是微不足道的啦!Knocker未对输入范围做检查,如果我把黄金风格程序中的对输入范围做检查的部分去掉,那黄金风格的执行代码就是9674Byte,反而比Knocker的执行代码少!!!

3.eastcowboy,他的程序实现算法与黄金风格的差不多.差别在于用buf[2*20]转了一个弯!,从而每一行只用一个printf就可以了!!但我觉得这好象没必要(也许有好处只是我不知道!).

4.中国台湾,程序写的也很好,只是对输入范围做检查时用的if(n!=0),而不是if(n!=0&&n<=20).说实话,还好他出了这么一个小失误!不然我,不然我真的不知道该在他和黄金风格之中挑谁来在下一界出题!!!

以下几位超过规定的时间才给出了程序!!!我想应该是他们来晚了吧!!希望他们下次能早一点!!
5.PgiLvSny,如果不是他来晚了!!这次的冠军非他莫属!!
因为他用自己的getnum()来获取输入,解决了一个重要的问题,别的人都用的是Scanf(),这样一来如果我输入的不是数字而是英文字母的话会发生什么现象了!!有兴趣的可以自己试试。而他用自己的getnum()来获取输入,则避免了这种现象发生!!!
虽然他用getnum()来获取输入但没有解决另一个重要的问题,就是如果我输入65537的话程序会怎么样呢!会提示超出范围吗?不会!!有兴趣的可以自己试试。。用自己的getnum()来获取输入应该是可以避免这一点的!!!

6.tanran,作为一个新手,能写出有这样的程序,很好!!!!

7.探路者二号,程序风格很好,有注释!!!唯一一个有注释的程序!!!
  
8.iAkiak,程序风格有点儿艺术!希望只是在网上玩玩而已,动真格的时候可千万不能这样·

下一界黄金风格来出题.请黄金风格尽快公布出题时间!!
比赛题目及过程:
http://www.programfan.com/club/showbbs.asp?id=112966

因为论坛上的贴很多!!!而版主又没有将编程比赛的贴置顶!!!所以很难找!!
告诉大家一个小窍门!!就是在论坛搜索中(编程爱好者论坛那个页面) 输入关键字 "编程比赛"就能找到了!!!

谢谢大家支持!!!

回复列表 (共17个回复)

11 楼

我个人觉得这项有意义的活动叫做“编程大赛”名头是否太大了些?能否改成“有程大家编”这样显得轻松一些的名字?

12 楼

呵呵,都是小程序,不过通过这些可以学习到编程好的方法和习惯。
对思考问题的方式的培养与锻炼也有一定的好处^_^

13 楼

既然难度不大,似乎可以考虑改个名字……
楼主辛苦了!大家敬礼!

14 楼

我刚刚来,是个新手,不过我想老老实实的一道一道自己作作,不过第一题就遇到问题了,请大家帮帮忙。
我在这个程序用了do while循环,为了能使程序按照使用者的意图退出,但是程序道最后提示输入“是否要再次输入的时候”直接循环了,不给我输入字符的机会。我想请大家帮帮,最好能给我的程序提提意见,谢谢了!
附我得代码:(用win-tc编译)
#include<stdio.h>

main()
{
    int x=0,min=1,max=20;
    int i=0,j=0,k=0;
    char q=0;

    do
    {
        printf("Please enter the number of col(1~20):");
        scanf("%d",&x);
        printf("\n");
        if(x<min||x>max)
            printf("Out of range(1~20),please retype.\n");
        else
        {
            for(i=1;i<=x;i++)
            {
                for(j=1;j<=x-i;j++)
                printf(" ");
                for(k=1;k<i*2;k++)
                    printf("*");
                printf("\n");
            }
        }
        printf("Do you want to enter again(y)?\n");
        scanf("%c",&q);
        printf("\n");
    }while(q!='y'||q!='Y');
     getch();
}

15 楼

我支持Knocker,至少人家有新意~!

16 楼

#include "Stdio.h"
#include "Conio.h"

//我同学翻译了KNOCKER的...
main(o,n)
{
    if(o==1)scanf("%d",&n);
    printf("%*s\n",40-1+o/2,"****************************************"+40-o);
    if(++o<2*n)main(o+1,n);
        else main(1,n);
}

17 楼

我回复一下14楼,也不知道我分析得是否有道理。
我改了你编的程序,如下:

#include<stdio.h>
main(){
    int x,i,j,k;
    char q;
    do{
        printf("Please enter a number(1-20):");
        scanf("%d",&x);
        while(x<1||x>20){
            printf("Out of range(1-20),please retype.\n");
            printf("Please enter a number(1-20):");
            scanf("%d",&x);
        }
            for(i=1;i<=x;i++){
                for(j=1;j<=x-i;j++)
                printf(" ");
                for(k=1;k<i*2;k++)
                    printf("*");
                printf("\n");
            }
        printf("Do you want to enter again:(1/0)");  /*1表示再输入,0表示结束输入*/
        scanf("%d",&q);
    }
    while(q==1);
}

我用char q;scanf("%c",%q);试了很多次,不知道怎么,它总是不提示输入语句,而我采用数字1/0来控制再输入和结束输入,却行。
注:我用的是Visual C++ 6.0调试的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册