C语言练级之路num4(有关各种菱形的打印)(用的都是基础的算法),会了这些图形的打印,从此再无你不会用的循环,给你理解的透透的

简介: 1.第一题(边框菱形的打印)2.第二题边框 菱形的进阶3.第三题(数字菱形的打印)4.第四题:(空心菱形)5.第五题(实心菱形):6.第六题:(外带一个杨氏三角的再一次打印)

1.第一题(边框菱形的打印)

原来只要你懂了,就会觉得是如此的简单:(昨天那个拉拉算法,今天这个更加简单易懂)

代码如下:注释看一下就知道这步的意思(但是一定要自己在纸上画一个图,这样便与我们更好的理解什么是这个图形的规律了)(有了规律,你就可以很好的利用这个规律,把你的想法实现了)


#include<stdio.h>
int main()
{
  int i, j ,n;
  scanf("%d",&n);
  for (i = 0; i < n; i++)
  {
    printf("*");
  }
  printf("\n");
  for (i = 1; i <= (n-1)/2; i++)//这个是为了控制行数而已(假如以9为例:所以此时就是除掉首行这里就只要打印4行)
  {
    for (j = 1; j <= (n + 1) / 2 - i; j++)//此时是先打印*号,后打印空格,然后再*号
    {
      printf("*");//先*号
    }
    for (j = 1; j <= 2 * i-1; j++)
    {
      printf(" ");//后空格
    }
    for (j = 1; j <= (n + 1) / 2 - i; j++)
    {
      printf("*");//再*号
    }
    printf("\n");
  }
  //上半部分好了,现在就轮到下半部分了
  for (i = 1; i < (n - 1) / 2; i++)//少一行的意思就是了(控制行数)1到3(3行)
  {
    for (j = 1; j <= i+1 ; j++)
    {
      printf("*");
    }
    for (j = 1; j <= (n - (2 * i + 2)); j++)
    {
      printf(" ");
    }
    for (j = 1; j <= i + 1; j++)//这个就是相当于(打印空心菱形的时候的那步打印一个单独的*号的那步)这下就只是多打几个*号的意思而已
    {
      printf("*");
    }
    printf("\n");
  }
  for (i = 0; i < n; i++)
  {
    printf("*");
  }
  return 0;
}

80.png


2.第二题边框 菱形的进阶

(这个就是一步一步来,但是如果你们很好的使用循环和理解这个图形的规律,你的代码中的算法可以变的更加的简单和高级,这个就是高级算法了,只是我还不会)


#include<stdio.h>
int main()
{
  int i, j, n;
  scanf("%d", &n);
  for (i = 0; i < n; i++)
  {
    printf("*");
  }
  printf("\n");
  for (i = 1; i < (n - 1) / 2; i++)//还是一个道理行数,但是因为第一行没有规律,所以此时的这个位置,是从第二行开始的(所以整体要少一行)
  {
    printf("*");//头上位置的那个*号,单独打印就行
    for (j = 0; j < (n - 2 * i - 1) / 2 - 1; j++)//并且*号完,就轮到空格了(空格规律一个一个的减(奇数减))
    {
      printf(" ");
    }
    printf("*");
    for (j = 0; j <2*i-1 ; j++)
    {
      printf(" ");
    }
    printf("*");
    for (j = 0; j < (n - 2 * i - 1) / 2 - 1; j++)//这边的这个和上面的那个为什么一定都要写n-2*i呢,原因就是只有i*2这样才可以保证这个值每一次都是偶数,也就是我要的数,可以很好的防止奇数的出现,所以i一定要乘2
    {
      printf(" ");
    }
    printf("*");
    printf("\n");
  }
  //上半部分搞定(这下就轮到下半部分了)(但是要注意的是,刚刚上面没有解决的那个为题)(就是最中间哪行此时还没有打印)
  for (i = 0; i < (n + 1) / 2 - 1; i++)//这下这个就是表示5行了(上面那个是4行,所以这边要有5行)
  {
    if (i < 2)
    {
      for (j = 0; j <= i; j++)
      {
        printf("*");//这个就是最终间哪行的最左边的那个*号的意思
      }
      for (j = 0; j < n - 2 * i - 2; j++)
      {
        printf(" ");//最终间哪行的空格开始(如果n=11,此时空格数就是9个)
      }
      for (j = 0; j <= i; j++)
      {
        printf("*");//这个就是最终间哪行的最右边的那个*号的意思
      }
      printf("\n");
    }
    if (i >= 2)
    {
      printf("*");
      for (j = 0; j < i - 1; j++)
      {
        printf(" ");
      }
      printf("*");
      for (j = 0; j < (n - 2 * i)-2; j++)
      {
        printf(" ");
      }
      printf("*");
      for (j = 0; j < i - 1; j++)
      {
        printf(" ");
      }
      printf("*");
      printf("\n");
    }
  }
  for (i = 0; i < n; i++)
  {
    printf("*");
  }
  printf("\n");
  return 0;
}

81.png

说实话我自己都嫌弃这个代码太长(虽然让我自己改进一下能变短一写,但是整体的算法肯定也是不会有太大的升级),所以我相信看到这个博客的人有高级算法把这个图形打印出来

3.第三题(数字菱形的打印)

#include<stdio.h>
int main()
{
  int i, j, m, n, k;
  scanf("%d",&n);
  for (i = 1; i <= n; i++)//n行的意思
  {
    for (j = 0; j <n-i ; j++)
    {
      printf(" ");
    }
    for (m = 1; m <= i; m++)
    {
      printf("%d",m);
    }
    //这边假设一下可不可以用m(不行我们就用另一个变量(关键就是在于第一行打印还是不打印的那个条件怎么判断好一点))
    for (k = m - 2; k > 0; k--)//注意因为上面条件已经早都不满足for循环了,所以最后一步的m++最后在for循环停止之后还是会加到m中去,所以此时的m多增加了1,所以要减2,减1已经不行了(多了一步m++)(先使用后加加)
    {
      printf("%d", k);
    }
    printf("\n");
  }
  //这个就是数字菱形的上半部分,现在轮到下半部分了
  for (i = 1; i < n; i++)
  {
    for (j = 0; j <i ; j++)
    {
      printf(" ");
    }
    //此时要注意我的i是从1开始的了,不再是从0开始的
    for (m = 1; m <=n-i; m++)
    {
      printf("%d",m);
    }
    for (k = m-2; k >0 ; k--)
    {
      printf("%d",k);
    }
    //对比自己的算法和别人的算法(好像我的算法更牛逼)
//    for (k = 1; k <= n - i; k++)
//    
//      printf("%d",k);
//    
//    for (m = n - i - 1; m >= 1; m--)
//    
//      printf("%d",m);
    printf("\n");
  }
  return 0;
}

82.png


4.第四题:(空心菱形

#include<stdio.h>
int main()
{
  int i, j, n;
  scanf("%d",&n);
  for (i = 0; i < n; i++)
  {
    for (j = 1; j <= n - i - 1; j++)
    {
      printf(" ");
    }
    printf("*");
    if (i != 0)
    {
      for (j = 0; j < 2 * i - 1; j++)
      {
        printf(" ");
      }
      printf("*");
    }
    printf("\n");
  }
  //并且假如此时我的n是4,此时我下面就只要打印3行就够了,因为上面已经打印了4行,for (i =n-1 ; i >0; i++)所以此时我这样写的目的就是为了(得到1到n-1的数)且如果n是4,此时就刚好是得到3个数,也就是刚好循环3次,刚好就是打印3行
  for (i =n-1 ; i >0; i--)//这步就是我整个算法中最关键的一步(注意点就是我此时只是要求行数是困定的,别的都是不做要求的,所以此时只要我的行数是对的,i的值都是无所谓的)
  {
    for (j = 0; j <n-i ; j++)
    {
      printf(" ");
    }
    printf("*");
    if (i != 1)
    {
      for (j = 0; j < 2 * (i - 1) - 1; j++)
      {
        printf(" ");
      }
      printf("*");
    }
    printf("\n");
  }
  return 0;
}

83.png


5.第五题(实心菱形):

#include<stdio.h>
int main()
{
  int i, j, n;
  scanf("%d",&n);
  for (i = 0; i < n; i++)
  {
    for (j = 0; j <n-1-i ; j++)
    {
      printf(" ");
    }
    for (j = 0; j <2*i+1 ; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  for (i = 1; i < n; i++)//如果这边你刚刚为了可以直接简单的写成和上面一样也是n,那你的i此时就要从1开始,这样如果你的i从1开始那么你在下面打印的时候就要提别的小心加注意了
  {
    for (j = 0; j <i ; j++)
    {
      printf(" ");
    }
    for (j = 0; j < 2 * (n - i) - 1; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  return 0;
}

84.png

6.第六题:(外带一个杨氏三角的再一次打印)

上次那个有一点的问题(所以这边重新来一遍,并且刚好我再巩固一下)

#include<stdio.h>
int main()
{
  int i, j, n;
  int arr[30][30] = { 0 };
  scanf("%d",&n);
  for (i = 0; i < n; i++)//这个就是在控制行(n行)
  {
    //下面这个就是在控制列
    //并且杨辉三角是有一个定理的,就是第几行这行就有几个元素(所以下面这个for循环就是这样写就是很有道理的)
    for (j = 0; j < i; j++)//这个就是在控制每一行中每一个列的坐标而已(例:0,1 0,2 0,3 0,4 0,5 0,6)这个就是第一行的每一个列
    {
      if (j == 0 || j == i)
      {
        arr[i][j] = 1;
      }
      else
      {
        arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
      }
    }
    //printf("\n");//打印完一行切记不敢不会换行哦
  }
  //搞定完这么多花里胡哨的东西,现在就可以把我的杨辉三角打印出来看一下了(并且不敢不会打印,打印不就还是循环吗)
  for (i = 0; i < n; i++)
  {
    for (j = n; j > i+1; j--)//这步就是看在n=i+1这个条件成立的时候恰恰是我最后一行打印完的时候(所以只要控制有这么多行就行,别的打印几次并不重要)
    {
      printf("   ");//这个空格的数量就是通过这个i+1在控制
    }
    for (j = 0; j < i; j++)
    {
      printf("%-6d",arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}

85.png

这个就好看多了,啊哈哈哈

7.总结:

有的博主会把这些的打印分一个难易程度,而我觉得,只要你懂得了原理,其实无论打印什么图形都是一样的(主要就是图形规律和图形特点),其实这些都不难(只要你肯花时间,当你打印出来这些图形的那一刻,你会觉得“就这”),加油代码人!


相关文章
|
8天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
30 4
|
1月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
67 5
|
19天前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
2月前
|
安全 C语言
C语言循环的使用注意点
在C语言中,合理使用循环对于编写高效、安全的代码至关重要。以下是几点建议:确保循环条件正确以避免无限循环;每次迭代时正确更新循环变量;恰当使用`break`和`continue`控制执行流程;注意嵌套循环中的变量作用域;简化循环体内逻辑;根据需求选择合适的循环类型;注意数据类型以避免溢出;保持良好的缩进和注释习惯;减少重复计算以提升性能;确保循环终止条件明确。遵循这些建议,可以提高代码质量和可维护性。
211 88
|
9天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
50 8
|
9天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
37 7
|
26天前
|
C语言
【c语言】循环语句
循环结构是C语言中用于简化重复操作的重要工具,主要包括while循环、do-while循环和for循环。while循环是最基本的形式,通过不断检查条件来决定是否继续执行循环体。do-while循环则先执行循环体,再检查条件,至少执行一次。for循环逻辑更复杂,但使用频率最高,适合初始化、条件判断和更新变量的集中管理。此外,循环中还可以使用break和continue语句来控制循环的提前终止或跳过当前迭代。最后,循环可以嵌套使用,解决更复杂的问题,如查找特定范围内的素数。
34 6
ly~
|
1月前
|
存储 缓存 算法
如何使用 C 语言实现高效的图形渲染?
使用 C 语言实现高效图形渲染可从选择图形库、优化数据结构与算法及利用硬件加速等方面着手。推荐使用 OpenGL 或 SDL 进行图形绘制。OpenGL 功能强大,支持 2D 和 3D 图形,需熟悉其绘图流程;SDL 则提供简单易用的接口。优化方面,合理选择数据结构如数组、哈希表等,使用高效算法如 LOD 可提升渲染速度。利用 GPU 加速和多线程渲染亦能显著提高效率。此外,纹理映射和管理也是关键,适当加载和缓存纹理,减少不必要的绘制操作如视口裁剪和背面剔除,均可增强渲染性能。
ly~
54 5
|
1月前
|
Serverless C语言
C语言控制语句:分支、循环和转向
C语言控制语句:分支、循环和转向
|
1月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)