适有同学问起一些C语言题目,本想上网搜索了事,但网上的方法都是分为上下部分用两个嵌套for循环输出。我想有没有合起来输出的呢,这样符合简洁又美观的要求呢?答案是有的。题目:输出行列都相等的菱形,如5行5列:行列 123451 *2 ***3 *****4 ***5 *
工具/原料
方法/步骤
1分析:当行数等于总行数的一半时,'*'是递增的,递增为2。当行数大于总行数的一半时,'*'是递减的,递增为2。设有一个行列为n的菱形,我们用变量i作为行数,以0开始,im时,k递减。因为k相对于m行对称,所以:当i>m时,i每增加i-m时的k值就和第m-i行的k值相等,即第i-m行和第m-(i-m)相对称。所以得出结果:当i<=m时,k=2i+1当i>m时,k=2(m-(i-m))+1,(m=(n-1)/2)。即k=2n-2i-1由于我们只需要输出'*'左边的空格即可,所以每行'*'左边的空格的个数为:(n-每行的k)/2。每行循环输出空格,再循环输出每行的'*',再输出回车,结束一行。这样我们就可以开始编程了。
2#includeint main(){ int i,j,k,n;//定义四个变量:i是行,j每行*号前的空格数,k每行的*号数 printf('please input odd n:'); scanf('%d',&n); //输入奇数n for (i=0;i=2*i+1) //判断k值 k=2*i+1; else k=2*n-2*i-1; for(j=(n-k)/2;j>0;j--) //循环输出空格 printf(' '); for(;k>0;k--) //循环输出*号 printf('*'); printf('\n'); //输出回车结束一行}
3本来呢题目就到止结束了,但上面的程序还不够完美比如说,别人输入n值为偶数怎么办?输入非数值呢?我们加一点东西进去:#includeint main(){ int i,j,k,n=0; //这里给n赋初值,即使输入非数值,n也可有确切的值。 do{ //增加一个大循环,可以令n可以输入多次以观察不同的结果。 printf('please input odd n, 0 to exit:');//当输入0的时候,退出大循环,结束程序。 scanf('%d',&n); if (!(n%2)) //增加对输入偶数的判断。{printf('you input a even, please input again.\n');continue;} for (i=0;i=2*i+1) k=2*i+1; else k=2*n-2*i-1; j=(n-k)/2; for(;j>0;j--) printf(' '); for(;k>0;k--) printf('*'); printf('\n'); } }while(n); return 0;}
注意事项