主题:第一界编程比赛_题目
bluelight
[专家分:280] 发布于 2005-10-18 13:27:00
为响应号召,我就出个简单的吧!
用*号组合成一个三角形!行数由键盘输入(范围为:1~20,输入超过范围,则提示出错)。如:
输入一个数4,则:
输出以下组合:
*
***
*****
*******
共四行
如输入的是6,则:
*
***
*****
*******
*********
***********
共六行
如输入的是0,则输出
out of range(1~20),please retype:
比赛已完毕!!结论已出来:
http://www.programfan.com/club/showbbs.asp?id=113572
回复列表 (共39个回复)
21 楼
中国台湾 [专家分:2140] 发布于 2005-10-17 17:36:00
冠军是谁 下次该谁出题目呀 楼主给个答案
22 楼
bluelight [专家分:280] 发布于 2005-10-17 18:07:00
经过一个下午的编译,运行.终于得出结果了!!!
首先感谢大家对该活动的支持!
此次共有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 楼
中国台湾 [专家分:2140] 发布于 2005-10-17 18:22:00
谢谢楼主 给我的建议 下次会注意的 再接再厉 大家共同努力把程序比赛办的红红火火
24 楼
晴空万里 [专家分:20] 发布于 2005-10-17 18:43:00
5楼的代码简单
但运行不简单
25 楼
eastcowboy [专家分:25370] 发布于 2005-10-17 19:04:00
呵呵,为什么递归的开销比较大呢?答案就是调用函数的次数较多。
所以我认为还是少调用一点函数比较好,尤其是printf这种已经不算小的函数。(printf的参数是可变长的,这个会有额外的开销。每次printf("*")其实还做了很多没必要的工作。)
大家知道读写文件的时候要建立缓冲,其实这个道理也差不多。输出的东西一多,效率上的差距就出来了。
恩,楼主费心了……
26 楼
PgiLvSny [专家分:240] 发布于 2005-10-17 19:45:00
献丑了,初学
#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 楼
PgiLvSny [专家分:240] 发布于 2005-10-17 20:20:00
呵呵,我来晚了,而且我还有个问题啊,我运行5楼的程序有问题
把5楼的程序link成55.exe,然后运行55 5,想得到一个5行的结果,可是结果只有2个*,为什么??我错了还是5楼程序有问题啊?
28 楼
tanran [专家分:40] 发布于 2005-10-17 21:08:00
我是新手,因此程序有点复杂,但绝对是自己想出来的
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 楼
探路者二号 [专家分:1170] 发布于 2005-10-17 22:19:00
一个完整的可以和用户互动的可以被评为最笨拙奖:
/*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 楼
iAkiak [专家分:8460] 发布于 2005-10-17 23:16:00
比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));}
我来回复