c语言简单编程打印菱形和空心菱形

1、使用*打印菱形,输入任意数字n,打印对应菱形

#include <stdio.h>
int main(int argc, char *argv[])
{
   int i,j,k,n;
   scanf("%d",&n);
   //打印上半菱形
   for(i=1;i<=n;i++)
   {
       for(k=1;k<(n+1-i);k++)//判断每一行需要打印的空格数
       {
           printf(" ");
       }
       for(j=1;j<=(2*i-1);j++)//对应每一行打印的*个数
       {
           printf("*");
       }
       printf("\n");
   }
   //打印下半菱形
   for(i=1;i<=(n-1);i++)
   {
       for(k=1;k<=i;k++)//空格
       {
           printf(" ");
       }
       for(j=2*(n-1);j>(2*i-1);j--)//*
       {
           printf("*");
       }
       printf("\n");
   }
   return 0;
} 

 输入5之后我们会得到如下结果:

输入5我们得到的是一个第五行为菱形对称轴的菱形。

代码解析:此代码的思路是将空格和*号分开打印,菱形上半部分和下半部分分开打印。首先是*的打印,由结果我们可以知道*的个数与行数之间的关系,第一行一个*,第二行3*,第三行5*,所以行数i与*个数的关系就为2xi-1(x表示乘号);接下来就是每行打印的空格数,由图可知第一行4个空格,第二行3个空格,第三行2个空格,以此类推;接下来就是如何打印,打印的话我们需要使用三个for循环,一个for循环控制打印的行数,另外两个分别用于控制打印空格和*的个数,再根据第一个for循环i的变化可以得到打印空格的for循环表达式k=1;k<(n+1-i);k++,这样上半部分就解决了。

下半部分空格的打印跟行数的关系是第几行就打印几个空格,故直接用k=1;k<=i;k++,打印的*则是跟上半部分相反,根据输入的n和控制打印的for循环的i来确定表达式j=2*(n-1);j>(2*i-1);j--,这样就可以打印出一个由*组成的菱形。

2、第二种比较简便的办法是使用取绝对值函数,不分上下部分,整体打印。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i,j,n;
    scanf("%d",&n);
    for(i=-(n-1);i<=(n-1);i++)
    {
        for(j=0;j<abs(i);j++)
        {
            printf(" ");
        }
        for(j=0;j<(2*n-(2*abs(i)+1));j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;

解析:该方法是以菱形中间一行为对称轴,上面取负下面取正,通过取绝对值函数abs()来取i的值,这样通过表达式j=0;j<abs(i);j++实现空格由多到少再到多,j=0;j<(2*n-(2*abs(i)+1));j++实现*由少到多再到少的打印。

3、空心菱形打印:

使用一个二维数组来存储这个空心菱形,从键盘输入n来确定要打印的菱形行数

#include <stdio.h>
int main(int argc, char *argv[])

    char a[100][100];
    int n,i,j;
    scanf("%d",&n);
    int num=(2*n-1)/2;//找到菱形第一个*在数组中的位置
    //将数组全部赋值为空格
    for(i=0;i<2*n-1;i++)
    {
        for(j=0;j<2*n-1;j++)
        {
            a[i][j]=' ';
        }
    }
    for(i=0;i<n;i++)
    {
        a[i][num-i]='*';
        a[i][num+i]='*';
    }
    int k=0;
    for(j=i;j<2*n-1;j++)
    {
        a[j][k+1]='*';
        a[j][2*num-k-1]='*';
        k++;
    }
    for(i=0;i<2*n-1;i++)
    {
        for(j=0;j<2*n-1;j++)
        {
            printf("%c",a[i][j]);
        }
        puts("");
    }
    return 0;

输入一个5,结果如下:

第五行5为中心的一行,根据我们的例子n=5,打印菱形我们需,9*9个元素,首先根据n将所有元素赋值为空格,之后再将*放入数组;对于*的存入我也是分为了上半部分跟下半部分,跟1一样的思想, a[i][num-i]='*';是以中间为对称,左边的*在素组中的位置,a[i][num+i]='*';是右边*在数组中的位置,行标由i控制,列标由num=+-i控制。下半部分跟上半部分规律类似。

4、使用方程的形式控制打印

#include <stdio.h>
int main(int argc, char *argv[])

    int x,y,n;
    scanf("%d",&n);
    n-=1;
    for(x=0;x<=2*n;x++)
    {
        for(y=0;y<=2*n;y++)
        {
            if(y==x+n||y==x-n||y==n-x||y==3*n-x)
                printf("*");
            else
                printf(" ");
        }
        puts("");
    }
    return 0;

 

解析:把菱形放到一个坐标轴上,菱形的四条边分别看作四条直线,求出坐标系下四条直线的表达式,满足表达式的地方就打印*,不满足的就打印空格。具体理解如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值