欢迎来到山村网

c语言如何输出菱形

2019-03-02 11:10:30浏览:230 来源:山村网   
核心摘要:适有同学问起一些C语言题目,本想上网搜索了事,但网上的方法都是分为上下部分用两个嵌套for循环输出。我想有没有合起来输出的呢

适有同学问起一些C语言题目,本想上网搜索了事,但网上的方法都是分为上下部分用两个嵌套for循环输出。我想有没有合起来输出的呢,这样符合简洁又美观的要求呢?答案是有的。

题目:输出行列都相等的菱形,如5行5列:

行列 12345

1 *

2 ***

3 *****

4 ***

5 *

    分析:

    当行数等于总行数的一半时,'*'是递增的,递增为2。

    当行数大于总行数的一半时,'*'是递减的,递增为2。

    设有一个行列为n的菱形,

    我们用变量i作为行数,以0开始,i<n。

    k作为n菱第i行要输出的'*'个数。

    则i<=n的中值(用m表示,m=(n-1)/2)时,k递增,i>m时,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。

    每行循环输出空格,再循环输出每行的'*',再输出回车,结束一行。

    这样我们就可以开始编程了。

    #include<stdio.h>

    int main()

    {

    int i,j,k,n;//定义四个变量:i是行,j每行*号前的空格数,k每行的*号数

    printf("please input odd n:");

    scanf("%d",&n); //输入奇数n

    for (i=0;i<n;i++) //循环所有行

    {

    if(n>=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"); //输出回车结束一行

    }

    本来呢题目就到止结束了,但上面的程序还不够完美

    比如说,别人输入n值为偶数怎么办?输入非数值呢?

    我们加一点东西进去:

    #include<stdio.h>

    int 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<n;i++)

    {

    if(n>=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;

    }

(责任编辑:豆豆)
下一篇:

VB.NET实现窗体图标最小化到状态栏

上一篇:

Delphi中DBEdit组件的主要属性与使用方法

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com