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.总结:

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


相关文章
|
1月前
|
C语言
【C语言】循环语句
C语言中循环语句的相关知识点
24 2
【C语言】循环语句
|
11天前
|
C语言
C语言的循环语句
C语言的循环语句
23 6
|
1月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
35 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
5天前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
1月前
|
算法 测试技术 Python
python中算法无限循环(Infinite Loops)
【7月更文挑战第18天】
43 4
|
2月前
|
C语言
C语言循环与分支
C语言循环与分支
30 5
|
2月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
1月前
|
Linux C语言
【编程小实验】C语言实现:无限循环写入文本文件,支持Ctrl+C中断与数据追加(附完整源码)
在Linux中,文件I/O(输入/输出)是程序与文件进行交互的基本方式,包括读取文件内容和向文件写入数据。这通常通过标准的C库函数来实现,下面是一些基本的文件读写操作和代码示例。
|
2月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
29 0
|
2月前
|
存储 算法 搜索推荐
【数据结构和算法】--- 基于c语言排序算法的实现(2)
【数据结构和算法】--- 基于c语言排序算法的实现(2)
22 0