c语言初阶有关打印图形的三题

文章介绍了如何使用C语言通过循环结构打印菱形和X形状图案,强调了动态调整循环条件以适应不同大小图形的需求,并展示了如何处理多组输入,控制直角三角形的打印。
摘要由CSDN通过智能技术生成

一.打印菱形

目标效果:

观察图像,将图像拆分为上下两半,分别用循环实现各自的打印

再观察一行中的元素,分为空格和*字符

实际代码的编写中,只要打印*左边的空格即可


#include <stdio.h>
#include <string.h>
void print_space(int i )
{
	int j = 0;
	for (j = 0; j < i; j++)
	{
		printf(" ");
	}
}

int main()
{
	char arr[] = "*************";  初始化最中间的字符,将其放入数组
	int len = strlen(arr);
	int i = 0;

//打印上半部分
	for (i = 6; i >= 0; i--)
	{
		print_space(i);       //打印空格
		printf("%s\n", arr + 2*i);   //利用指针偏移找到数组中相对应的字符串
	}
	

//打印下半部分
    for (i = 1; i < 7; i++)
	{
		print_space(i);
		printf("%s\n", arr + 2*i);
	}
	return 0;
}

这么写其实有点把循环给限制死了,如果菱形不是这么大,就要将循环中的条件全部换了。

最好是将要打印的行数也作为循环条件,这样可以适用于多种大小的菱形的打印。


#include <stdio.h>

int main()
{
	int line = 0;
	int i = 0;
	scanf("%d", &line);//7
	//打印上半部分
	for (i = 0; i < line; i++)
	{
		//打印一行
		//打印空格
		int j = 0;
		for (j = 0; j < line - 1 - i; j++)
		{
			printf(" ");
		}
		//打印*
		for (j = 0; j < 2 * i + 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}


	//打印下半部分
	for (i = 0; i < line - 1; i++)
	{
		//打印一行
		int j = 0;
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

二.打印x形状图案

要求:多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

目标效果

#include <stdio.h>


int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        int j = 0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                if(i == j)           //打印左斜杠      
                    printf("*");
                else if(i+j == n-1)//因为行和列是从0开始的
                    printf("*");        //打印右斜杠
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

涉及多组输入,将scanf函数放入while的判断条件中

其中EOF意为 End Of FIle  在编译器中其实是一个宏定义常量

实际值为  -1

且输入 ctrl z 可以达到EOF的效果。也就是说,只有手动输入ctrl z 这个while循环才会结束

而scanf函数的返回值其实是它读取到的数据的个数。这里输入了一个数n,那它就返回 1

注意,是输入的数据的个数,而不是这个数据本身有多大。

这里使用了嵌套循环,外层循环实现行数的控制,内层循环实现每一行的打印的控制

难点在于内层循环中的代码实现。因为内层循环是遍历了一整行的所有数,观察图像中,每一行有两个*,其余都是空格。这时就可以用if语句来分别实现各自的打印。

三.带空格打印直角三角形

要求:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。

目标效果:

#include <stdio.h>
int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        //行数控制
        for(i=0; i<n; i++)
        {
            //空格
            int j = 0;
            for(j=0; j<n-1-i; j++)
            {
                printf("  ");
            }
            //*
            for(j=0; j<=i; j++)
            {
                printf("* ");    
            }
            printf("\n");
        }
        
    }
    return 0;
}

这题比较简单,只要观察行号和列号以及要打印的内容的数量,找到它们之间的关系,构造出循环即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值