回 帖 发 新 帖 刷新版面

主题:第一界编程比赛_题目

为响应号召,我就出个简单的吧!
用*号组合成一个三角形!行数由键盘输入(范围为:1~20,输入超过范围,则提示出错)。如:
输入一个数4,则:
输出以下组合:
     *
    ***
   *****
  *******
共四行

如输入的是6,则:
       *
      ***
     *****
    *******
   *********
  ***********
共六行
如输入的是0,则输出
out of range(1~20),please retype:
比赛已完毕!!结论已出来:
http://www.programfan.com/club/showbbs.asp?id=113572

回复列表 (共39个回复)

21 楼

冠军是谁     下次该谁出题目呀   楼主给个答案

22 楼

经过一个下午的编译,运行.终于得出结果了!!!
首先感谢大家对该活动的支持!
此次共有7位朋友给出了程序!
他们是:黄金风格,wanyunzhou,shaneqi,Knocker,eastcowboy,中国台湾,cccP.
其中Wanyunzhou,Shaneqi,cccP,写的是C++,而我又没有相应的编译器.
所以只能看着程序研究一阵,然后得出结论:程序应该没错!!
另外那四个C程序我都编译运行过了,下面发表一下我的看法:
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).说实话,还好他出了这么一个小失误!不然我,不然我真的不知道该在他和黄金风格之中挑谁来在下一界出题!!!

下一界黄金风格来出题.请黄金风格尽快公布出题时间!!

23 楼

谢谢楼主  给我的建议  下次会注意的  再接再厉  大家共同努力把程序比赛办的红红火火

24 楼

5楼的代码简单
但运行不简单

25 楼

呵呵,为什么递归的开销比较大呢?答案就是调用函数的次数较多。
所以我认为还是少调用一点函数比较好,尤其是printf这种已经不算小的函数。(printf的参数是可变长的,这个会有额外的开销。每次printf("*")其实还做了很多没必要的工作。)

大家知道读写文件的时候要建立缓冲,其实这个道理也差不多。输出的东西一多,效率上的差距就出来了。

恩,楼主费心了……

26 楼

献丑了,初学

#include <stdio.h>
#include <ctype.h>
#define MAX 20
#define MIN 1

void fun(int i, int n);
int getnum(int lim);

main()
{
    int i;
    while((i = getnum(MAX)) != -1)
        if(i)
            fun(i, i);
}

int getnum(int lim)
{
    char c[MAX];
    int i, j;
    for(i = 0 ; isspace(c[i] = getchar()); )
        ;
    if( !isdigit(c[i]))
        if(c[i] == EOF)
            return -1;
        else{
            printf("please enter a number!\n");
            return 0;
        }
    for( ; --lim && isdigit(c[++i] = getchar()); )
        ;
    c[i] = '\0';
    if( (j = atoi(c)) <= MAX && j >= MIN)
        return j;
    else{
        printf("out of range: %d - %d\n",MIN,MAX);
        return 0;
    }
}

void fun(int i, int n)
{
    int j;
    for( j = i - 1; j > 0 ; j--)
        putchar(' ');
    for( ; j < 2 * (n - i) + 1 ; j++)
        putchar('*');
    putchar('\n');
    if(--i)
        fun(i,n);
}

27 楼

呵呵,我来晚了,而且我还有个问题啊,我运行5楼的程序有问题
把5楼的程序link成55.exe,然后运行55 5,想得到一个5行的结果,可是结果只有2个*,为什么??我错了还是5楼程序有问题啊?

28 楼

我是新手,因此程序有点复杂,但绝对是自己想出来的
main()
  {
  int row;
  printf("Please enter the row number:");
  scanf("%d",&row);
  if(row==0||row>20)
    printf("out of range,please retype!\n");
  else
    prt(row);
  }

int prt(int row)
  {
  int i,j,k;
  for(i=1;i<=row;i++)
    {
    for(j=1;j<=(row-i);j++)
      printf(" ");
      for(k=1;k<=(2*i-1);k++)
    {
    printf("*");
    }
    printf("\n");
    }
  }

29 楼

一个完整的可以和用户互动的可以被评为最笨拙奖:

/*Odd Asterisks*/


#include<stdio.h>
#include<conio.h>


int main(void){

    int i,j,k,n,flag=1; /*flag是控制循环的变量*/
    char ch;

    while(flag){

        printf("\nContinue? (Y/N)\n");
        ch=getch();

        if(ch=='N'||ch=='n'){                /*输入'n' 或者 'N'则退出循环*/
            printf("\nBye!\n");
            getch();
            flag=0;
        }

        else if(ch=='Y'||ch=='y'){    /*输入'y'或者'Y'则重复进行下面的操作*/
            printf("\nInput the number of lines: \n");
            scanf("%d",&n);

            if(n>20){               /*判断n是否大于20,大于20则提示重新输入*/
                printf("\nError input. Please make sure the number you entered");
                printf(" is no bigger than 20. Press any key to enter again.\n");
                getch();
            }

            else{

                for(i=0;i<n;i++){         /*控制行的输出*/

                    for(j=n;j>i;j--)      /*控制星号前空格的输出*/
                        printf(" ");
                    for(j=0;j<=i;j++)    /*控制一左边一半星号的输出*/
                        printf("*");
                    for(k=0;k<i;k++)     /*控制一右边一半星号的输出*/
                        printf("*");

                    printf("\n");
                }
            }
        }
        else{             /*输入'n'、'N'、'y'、'Y'之外的键则提示重新输入*/
            printf("\nError input! Press any key to input again, please.\n");
            getch();
        }
    }

    return 0;
}

30 楼

比knocker的长许多...

#define q(a)t(t(t(t(a))))
#define t(a)a##a##a
#define T(a)#a+sizeof(#a)
#define r(a)T(a)
#define s(a)r(a)
#define d(a)s(a)
#define e(a)d(a)
                        f(x
                    ,n){printf
                ("%*s\n",--x+n,e
            (q(*))-n),x&&f(x,n+2);}
        main(x,n){main((x-1||(x=scanf
    ("%d",&n),n>0&&n<21&&f(n,2)||printf(
"out of range(1~20),please retype:\n")),x));}

我来回复

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