C语言打印菱形实例详解

 更新时间:2020年12月22日 10:46:15   作者:marwi_study  
这篇文章主要给大家介绍了关于C语言如何打印菱形的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

打印菱形这道题对于初学编程者来说简直是噩梦,曾经我就是栽在这上面的,后来编程编多了之后对打印菱形也觉得不再那么难了,去年在公众号写了一篇推送是关于打印菱形的,觉得对一些师弟师妹还是有所帮助的,今天就把这道题分享出来。

以下是我遇到的各种各样的菱形:

普通菱形,输入n,输出n行n列的菱形

难度系数:♥

n行空心菱形,输入n,输出n行空心菱形

难度系数:♥♥

n行挖空菱形,输入n,输出n行n列空格菱形

难度系数:♥♥♥

n行数字菱形,输入n,输入n行数字从外到内递增的数字菱形

难度系数:♥♥♥♥

有边框空心菱形,输入n,输出n行带有边框的空心菱形

难度系数:♥♥♥♥♥

首先我们要明确这是一个随着n的大小改变的菱形,所以我们肯定要用到循环,并且循环的次数与n有关。如果题目要求是输出n行,那我们的循环就是0(n-1)或者1n;如果要求是输出(2n+1)行,那我们的循环就0-2n或者1~(2n+1)即可。(后面以输出n行为例分析)

第一个是普通的实心菱形,循环n行大家都懂,问题就在列要怎样循环。难道是看出来的吗?不错,我就是通过看得出来的循环次数。具体怎么看呢?

根据图直接看有点难度,所以我们根据各行数据来看


我们需要将整个菱形分成四块来考虑,从上到下空格的个数先从n/2递减到0后递增到n/2,而行循环因子i又从0递增到n,故自然可联想到用i与n/2来表示空格个数。因为空格个数是非负数,所以我们引进绝对值|n/2-i|表示空格个数。打完空格之后,我们就要正式用 ' * '打印菱形了。通过观察我们发现 * 号的个数为奇数,并且变化规律跟空格正好相反,所以号个数即是-2*(空格个数)+1+C(常数)=-2*(空格个数)+C(常数),通过观察我们发现这个常数C正好是n/2。于是第一种菱形就可以顺利完成了!

第二个是空心菱形,与实心菱形相似,可看成在实心菱形上再打了一个空格菱形。由于每行的号数不多,并且可以看到号正好位于空格菱形的外围,所以我们可以将打印号放在打印空格菱形前后顺便打印,即在打印空格菱形之前打号,打印完空格菱形之后再打印号。同样,我们将相关数据列出来然后观察规律。号前空格与实习菱形一致,而我们发现n-2|n/2-i|-2的值除了首尾两行外,其他都与空格菱形的空格个数一致,而首尾两行是-1表示在该处不需打空格反而需要退一个格,但由于我们当前位置为号,而退格后依旧要打号,所以我们可以直接判断是否为第一行或最后一行,是则少打印一个号即可。

第三个是挖空菱形,该菱形是上述两个的合体,我们可以看成把一个实心菱形的各个字符替换成另一种字符,再插入一个空心菱形。所以我们把该菱形分成输出空心菱形前后号和输出空心菱形两部分。通过数据对比,我们不难发现,输出空心菱形前后号的数据与实心菱形输出号前空格个数一致,然后就是输出一个空心菱形,最后要记得在输出空心菱形之后输出空心菱形之后的号,根据对称可知,空心菱形后号个数与空心菱形前号一致。

第四个是数字菱形,该菱形的特点是数字从外到内逐层递增。我们发现该菱形中轴线数字的变化规律是先从1递增到(n+1)/2,然后再递减到1,并且每一行的数字也是从1递增到中轴线,再递减到1,因此我们要找到中轴线所在的位置(方便判断循环因子是否到达中轴线)。通过列数据我们发现中轴线所在位置(j从0开始循环)为n/2-|n/2-i|,所以在每一行中我们的数字加到“j==n/2-|n/2-i|”处时应该转成递减,所以我们引进要填充的数字k,在每一行开始时k为1,在j从0到n/2-|n/2-i|-1中,k逐次递增,在j从n/2-|n/2-i|到n-2*|n/2-i|-1中k递减。然后将打印星号改为打印数字即可。

第五个是边框空心菱形。从名字可知,该菱形由边框和空心菱形组成,我们可以将边框和空心菱形分开来考虑。第一行和最后一行为边框,可直接用从0到n-1打印号实现。左右边框在每一行的开头和结尾打印号即可实现。中间即是空心菱形的领域,基本上跟打印空心菱形一样,只是要注意被边框覆盖的地方空格和号要省略。

将打印空格和打印号分开考虑,通过数字之间的关系特点,运用循环完成菱形的打印。

由于菱形是对称的,所以绝对值是最好的数据描述工具,要巧妙地运用绝对值,将对称部分的循环用同一个带有绝对值的表达式表示出来。

值得注意的是n/2为整数除,所以不会得到小数,也不是四舍五入。

中轴线所在位置(j从0开始循环)为n/2-|n/2-i|。

//挖空菱形
 for(i=0;i<n;i++){
  for(j=0;j<abs(n/2-i);j++)
   printf("*");
  printf("*");
  for(j=0;j<n-2*abs(n/2-i)-2;j++)
   printf(" ");
  if(j!=0)
   printf("*");
  for(j=0;j<abs(n/2-i);j++)
   printf("*");
  printf("\n");
 }
 printf("\n");
 //边框菱形
 for(i=0;i<n;i++){
  if(i==0||i==n-1){
   for(j=0;j<n;j++)
    printf("*");
   printf("\n");
  }
  else{
   printf("*");
   for(j=0;j<abs(n/2-i)-1;j++)
    printf(" ");
   if(j!=0)
    printf("*");
   for(j=0;j<n-2*abs(n/2-i)-1;j++)
    printf(" ");
   if(j!=0)
    printf("*");
   for(j=0;j<abs(n/2-i)-1;j++)
    printf(" ");
   if(j!=0)
    printf("*");
   printf("\n");
  }
 }
 //数字菱形
 for(i=0;i<n;i++){
  int k=1;
  for(j=0;j<abs(n/2-i);j++)
   printf(" ");
  for(j=0;j<n-2*abs(n/2-i);j++){
   printf("%d",k);
   if(j<n/2-abs(n/2-i))
    k++;
   else
    k--;
  }
  printf("\n");
 }
 //实心菱形
 for(i=0;i<n;i++){
  for(j=0;j<abs(n/2-i);j++)
   printf(" ");
  for(j=0;j<n-2*abs(n/2-i);j++)
   printf("*");
  printf("\n");
 }
 printf("\n");
 //空心菱形
 for(i=0;i<n;i++){
  for(j=0;j<abs(n/2-i);j++)
   printf(" ");
  printf("*");
  for(j=0;j<n-2*abs(n/2-i)-2;j++)
   printf(" ");
  if(j!=0)
   printf("*");
  printf("\n");
 }

总结

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

相关文章

  • C语言利用链表与文件实现登录注册功能

    C语言利用链表与文件实现登录注册功能

    这篇文章主要介绍了C语言利用链表与文件实现登录注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 浮点数在计算机中存储方式是怎样的

    浮点数在计算机中存储方式是怎样的

    这篇文章介绍了浮点数在计算机中是如何存储的,讲解的比较详细,有需要的朋友可以参考一下。
    2016-06-06
  • C++使用gtest框架编写单元测试的教程详解

    C++使用gtest框架编写单元测试的教程详解

    gtest 是 Google 开发的一个用于 C++ 的测试框架,广泛应用于编写和运行单元测试,并且支持任何类型的测试,而不仅仅是单元测试,本文本文给大家介绍了C++使用gtest框架编写单元测试的教程,需要的朋友可以参考下
    2024-08-08
  • C++之string类对象的容量操作详解

    C++之string类对象的容量操作详解

    通过在网站上的资料搜集,得到了很多关于string类对象的容量操作,通过对这些资料的整理和加入一些自己的代码,希望能够给你带来帮助
    2021-08-08
  • C++ Boost ProgramOptions超详细讲解

    C++ Boost ProgramOptions超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C与汇编混合编程的实现示例

    C与汇编混合编程的实现示例

    本文主要介绍了C与汇编混合编程的实现示例,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • C++中I/O模型之select模型实例

    C++中I/O模型之select模型实例

    这篇文章主要介绍了C++中I/O模型的select模型,实例讲述了I/O模型的用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++实现String与UF8互转

    C++实现String与UF8互转

    这篇文章介绍了C++实现String与UF8互转的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C语言编程时常犯十八个错误小结

    C语言编程时常犯十八个错误小结

    C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误
    2013-07-07
  • C++强制转换与智能指针示例详解

    C++强制转换与智能指针示例详解

    这篇文章主要介绍了C++强制转换与智能指针示例,智能指针(Smart Pointer)是一种抽象的数据类型。在程序设计中,它通常是经由类模板来实现,借由模板来达成泛型,借由类别的析构函数来达成自动释放指针所指向的存储器或对象
    2022-11-11

最新评论