C语言输出任意边长的菱形

 更新时间:2021年12月30日 11:52:21   作者:命中不缺狗——  
大家好,本篇文章主要讲的是C语言输出任意边长的菱形,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

        经过一段时间的学习后,想必大家都已经开始摩拳擦掌,迫不及待地想用C语言写一些程序了。

        那么今天,我们就来学习C语言中常见的例子——输出任意边长的菱形

        适用范围:学习并掌握了C语言循环以及之前的内容

        

        上面图片中用黄色a标示出来的便是菱形的边长,图片中为3,当然,也可以理解为(星号的行数+1)/2

        那么,废话不多说,上教程

     1.简单理解星号输出原理,将输出星号代码分为上方和下方两部分

        首先,我们可以观察到如果边长为a的话,那么最长的一行的长度就为2*a-1,同时,每列星号都是对齐的,这说明我们如果想要输出星号,是有规律可循的,没星号的地方我们可以用空格来代替,这样一想,发现,我们好像可以使用x轴区间来控制空格和星号的输出

        例如,第三行,如果我们设第一个星号的x坐标为1的话,并在此基础上输出5个星号,那我们只需要写一串代码去控制在x属于[1,5]的区间上输出星号就行了

        同样,对于图片中第一行来说,我们只需要写一串代码来控制在x属于(2,4)的区间上输出一个星号就行了,如下

for(int j=1;j<2*3-1;j++)    //3为图片中菱形的边长
{
    if(j>2&&j<4)
        printf("*");
    else
        printf(" ");
}

        现在,由于行数不同,每行输出的星号数也就不同,那么,我们就可以找出输出星号数和行数的的关系

        但是,我们又可以看出,最长的一行星号上面的星号输出方式为由少到多,而最长一行下面的星号输出方式为由多到少,那么,对于上面和下面,我们要找的星号数与行数的关系也是不同的

     2.上方输出星号代码

        那么,接下来,我们先讨论最长一行星号的上方(包括最长一行星号),输出星号数与行数的关系

        首先,我们要遍历最长一行上方的所有行(包括最长一行),这时,就要用到for循环,这里的a表示最长的一行的行数,同时也是菱形的边长

for(int i=1;i<=a;i++)

        接下来,我们要找到行数与输出星号数的关系 

        经过观察,我们发现,如果a为边长,i表示行数,那么则在(a-i,2*a-(a-i))区间上要输出星号

     看到这里的友友们可以停下来思考一下,思考通了在接着看 

        好的,那么接下来,我们要遍历列,单单遍历行是不够的,不能控制星号以及空格的输出,所以,我们就需要遍历列

        如下,我们用到了输出星号的区间,如果列数在区间(a-i,2*a-(a-i))内,就输出星号,不在区间内,就输出空格,这样,就可以控制输出星号以及行数的关系了。

        当然,也别忘了,每输出一行星号就要换行,所以要写printf("\n"),但要写在遍历列for循环的外面,遍历行for循环的里面

        这就是上方输出星号的全部了,看到这儿,是不是想尝试自己编写下方星号的输出了呢,如果想的话,那就大胆的去尝试一下(* ̄︶ ̄)

    for (int i = 1; i <= a; i++)	//遍历菱形最长一行上方(包括最长的一行)所有行
	{
		printf(" ");	//每行前面加空格,整齐好看
		for (int j = 1; j<=2*a-1; j++)	
        //遍历菱形最长一行上方(包括最长的一行)每行的所有列
		{
			if (j > a - i&& j <2 * a - (a - i))
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}

     3.下方输出星号代码

        好的,那么下面,我们讨论最长一行星号的下方(不包括最长一行星号),输出星号数与行数的关系

        先写下方的遍历行,我们是从最长的一行的下一行开始输出,最长的一行的行数为a,那么,我们要定义行的初始值为a+1,行的最大值为2*a-1

        就像上方输出星号一样,接着要找输出星号的区间,经过观察,可以发现,列数在区间(i-a,2*a-(i-a))内,就输出星号,不在区间内,就输出空格,这样,就可以控制输出星号以及行数的关系了。

        接下来,要遍历列,代码如下

for(int i=a+1;i<=2*a-1;i++)

        当然,也别忘了,每输出一行星号就要换行,所以要写printf("\n"),但要写在遍历列for循环的外面,遍历行for循环的里面

        这就是下方输出星号的全部了(* ̄︶ ̄)

    for (int i =  a + 1; i <= 2*a-1 ; i++)	//遍历菱形最长一行上方(包括最长的一行)所有行
	{
		printf(" ");	//每行前面加空格,整齐好看
		for (int j = 1; j <= 2 * a - 1; j++)
		//遍历菱形最长一行下方(不包括最长的一行)每行的所有列
		{
			if (j > i - a && j < 2*a - (i - a))
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}

全部代码如下

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int a;	//菱形的边长
	//注意,由于屏幕的大小限制,过大的边长(比如100)会导致无法输出正常的菱形,望理解
	printf("输入菱形的边长:\n");
	scanf_s("%d", &a);
	for (int i = 1; i <= a; i++)	//遍历菱形最长一行上方(包括最长的一行)所有行
	{
		printf(" ");	//每行前面加空格,整齐好看
		for (int j = 1; j<=2*a-1; j++)
        //遍历菱形最长一行上方(包括最长的一行)每行的所有列	
		{
			if (j > a - i&& j <2 * a - (a - i))
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}
	for (int i =  a + 1; i < 2*a + 1; i++)	//遍历菱形最长一行上方(包括最长的一行)所有行
	{
		printf(" ");	//每行前面加空格,不和边框拥挤,可去掉
		for (int j = 1; j <= 2 * a - 1; j++)
        //遍历菱形最长一行下方(不包括最长的一行)每行的所有列
		{
			if (j > i - a && j < 2*a - (i - a))
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}
	system("pause");
	return 0;
}

到此这篇关于C语言输出任意边长的菱形的文章就介绍到这了,更多相关C语言菱形内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++知识点之inline函数、回调函数和普通函数

    C++知识点之inline函数、回调函数和普通函数

    这篇文章主要给大家介绍了关于C++知识点之inline函数、回调函数和普通函数的相关使用方法,以及回调函数和普通函数的区别小结,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • windows下vscode环境c++利用matplotlibcpp绘图

    windows下vscode环境c++利用matplotlibcpp绘图

    本文主要介绍了windows下vscode环境c++利用matplotlibcpp绘图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 基于Qt+opencv开发的视频播放器示例详解

    基于Qt+opencv开发的视频播放器示例详解

    这篇文章主要为大家介绍了基于Qt+opencv开发的视频播放器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 基于Qt编写全能播放组件的示例代码

    基于Qt编写全能播放组件的示例代码

    这篇文章主要为大家详细介绍了如何基于Qt编写全能播放组件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • C语言以数据块的形式读写文件实例代码

    C语言以数据块的形式读写文件实例代码

    本文主要介绍C语言中以数据块的形式读写文件,这里提供了实例代码举例说明,有需要的小伙伴可以参考下
    2016-07-07
  • C++ primer类的基础精讲

    C++ primer类的基础精讲

    C++类,是指系统在第一次在程序中遇到一个类时为这个类建立它的所有类变量的拷贝 - 这个类的所有实例共享它的类变量
    2022-07-07
  • C语言扫雷详细代码分步实现流程

    C语言扫雷详细代码分步实现流程

    扫雷是电脑上很经典的游戏,特意去网上玩了一会,几次调试之后,发现这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼,与实际游戏差别较大,不能使用光标,下面来详解每一步分析
    2022-02-02
  • C语言数据结构与算法之排序总结(一)

    C语言数据结构与算法之排序总结(一)

    这篇文章主要介绍了数据结构与算法中的插入类和交换类的各种排序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • C++实现简易通讯录功能

    C++实现简易通讯录功能

    这篇文章主要为大家详细介绍了C++实现简易通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++ 控制台弹出文件管理对话框案例

    C++ 控制台弹出文件管理对话框案例

    这篇文章主要介绍了C++ 控制台弹出文件管理对话框案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论