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

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


相关文章
|
3月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
97 1
|
3月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
84 4
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
52 19
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
80 18
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
59 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
57 13
|
1月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
53 6
|
1月前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
57 5
|
2月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
3月前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度

热门文章

最新文章