C语言刷题----循环输出图形

从12月开始,阿崽就没更新啦,阿崽刷了一波题

接下来的一段时间,准备更新我的刷题的文,有的题有不同思路,欢迎各位宝子和我一起交流

牛客网-----循环输出图形

  • BC98 线段图案
  • BC99 正方形图案
  • BC100 直角三角形图案
  • BC101 翻转直角三角形图案
  • BC102 带空格直角三角形图案
  • BC103 金字塔图案
  • BC104 翻转金字塔图案
  • BC105 菱形图案
  • BC106 K形图案
  • BC107 箭形图案
  • BC108 反斜线形图案
  • BC109 正斜线形图案
  • BC110 X形图案
  • BC111 空心正方形图案
  • BC112 空心三角形图案
  • BC113 数字三角形

BC98 线段图案

 

分析:1.多组输入应该使用循环(即while(scanf("%d",x)!=EOF)2.输入的数字和*相对应

代码实现

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
        for (int i = 0; i < a; i++) {
            printf("*");
        }
        printf("\n");
    }
​
    return 0;
}

BC99 正方形

 

分析:1.和BC98一样需要我们循环输入,还是使用while(scanf("%d",x)!=EOF);

2.该图像涉及行和列,所以二重循环可以解决,变量i控制行的变化,变量j控制列的变化,由于每一行结束要换行,所以我们在列的值达到我们输入的值后,输入printf("\n");

代码实现

#include <stdio.h>
int main()
{
    int x;
    while (scanf("%d", &x)!=EOF)    //连续输入
    {
        for (int i = 1; i <= x; i++)   //控制行数
        {
            for (int j = 1; j <= x; j++)  //控制列数
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

BC100 直角三角形图案

 

分析:

1.和BC99一样都涉及到行和列的变化,所以仍是使用双重循环,变量i控制行,变量j控制列。2.当i==1是只有一列,i==2时有两列,所以for循环中控制语句有j<=i,列数的变化要小于行的变化

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) { 
       for(int i=1;i<=a;i++){
           for(int j=1;j<=i;j++){
               printf("* ");
           }
           printf("\n");
       }
    }
    return 0;
}

BC101 翻转直角三角形图案

 

思路一:从行的角度

分析:1.和BC99一样涉及到行和列的变化,仍是使用双重循环

2.换一种思路:我们把第一行看做是第五行,也就是第五行有五列,第一行有一列,所以i从输入的值开始减到1,而列j仍然是从1开始,只要j小于等于i就行,比如i==5,j从1到5;i==4,j从1到4;

代码实现

#include<stdio.h>
int main() {
    int a;
    scanf_s("%d", &a);
    for (int i = a; i > 0; i--) {
        for (int j = 1; j <= i; j++) {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

思路二:从列的角度

分析:1.和BC99一样涉及到行和列的变化,仍是使用双重循环

2.与BC100不一样的:第一行的时候有5列,最后一行只有一列,所以j的一层for循环只需从(输入的值)变到1即可,并且j的值要>=i的值,而i还是从1开始到输入的值

代码实现

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) { 
        for(int i=1;i<=a;i++){
            for(int j=a;j>=i;j--){
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

BC102 带空格直角三角形图案

分析:仍是使用双重循环(以四行四列为例)

当i==1时 前三列是空格,第四列是*

当i==2时,前两列是空格,第三列往后是*

当i==3时,前一列是空格,第二列往后是*

。。。

所以是一个三角(全是空格),一个三角(带*)

于是一个for循环用来打印空格三角,另外一个打印带*

第一列有三个空格(输入的值是4,所以空格变化范围是从1到4-1)后面的*就是从1开始,小于等于输入的值即可

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
        for (int i = 1; i <= a; i++) {
            for (int j = a - 1; j >= i; j--) {
                printf("  ");
            }
            for (int h = 1; h <= i; h++) {
                printf("* ");
            }
            printf("\n");
        }
​
    }
    return 0;
}

BC103 金字塔图案

 

分析:以输入4为例

 

当你把这两个完全不同的图案放到一起的时候,可能还有点错觉,只需要第二个图的代码在输出*后面加个空格就是第一个图

代码实现:

#include <stdio.h>
​
int main() {
    int a;
    while(scanf("%d",&a)!=EOF){
        for (int i = 1; i <= a; i++) {
            for (int j = a; j > i; j--) {
                printf(" ");
            }
            for(int h=1;h<=i;h++){
                printf("* ");
            }
            printf("\n");
        }
       
    }
    return 0;
}

BC104翻转金字塔图案

 

                             

分析:只需要第二个图中*后面加个空格即可

思路一:从行出发

i==1,j==5;空格:0个

i==2,j==4;空格:1个

i==3,j==3;空格:2个

i==4;j==2;空格:3个

i==5,j==1;空格:4个

代码实现

#include<stdio.h>
int main() {
    int a;
    scanf("%d", &a);
    for (int i = 1; i <= a; i++) {
        for (int h = 1; h <= i-1; h++) {
            printf(" ");
        }
        for (int j = a; j >=i; j--) {
            printf("* ");
        }
        
        printf("\n");
    }
}

思路二:从列出发

分析:把第一行看成第五行

即i==5;j==5;空格数为0

i.....

i==1;j==5;空格数为4

代码实现:

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
        for (int i = a; i >0; i--) {
            for (int j = a - 1; j >=i; j--) {
                printf(" ");
            }
            for (int h = 1; h <= i; h++) {
                printf("* ");
            }
            printf("\n");
        }
​
    }
    return 0;
}

BC105 菱形图案

 

分析:图形由两部分组成:上半部分是金字塔图案,下半部分是翻转金字塔图案

即就是BC103和BC104的结合,唯独有一点不同就是下半部分要比输入的值少一层

代码实现

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
        for (int i = 1; i <= a+1; i++) {
            for (int j = a+1; j > i; j--) {
                printf(" ");
            }
            for (int h = 1; h <= i; h++) {
                printf("* ");
            }
            printf("\n");
        }
        for (int i = 1; i <= a; i++) {
            for (int j = 1; j <=i; j++) {
                printf(" ");
            }
            for (int h = a; h >= i; h--) {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

同理,这里的代码也可以用上面提到的两种思路来实现

BC106 K形图案

 

分析:该图形由两部分组成,一个是直角三角形图案另外一个是翻转直角三角形,但是:上半部分要比输入的值多一层,下半部分没有第一层;

代码实现

#include <stdio.h>
​
int main() {
    int a;
    while(scanf("%d", &a)!=EOF){
    for (int i = a + 1; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            printf("* ");
             
        }
        printf("\n");
       
    }
    for (int i = 2; i <= a + 1; i++) {
        for (int j = 1; j <= i; j++) {
                printf("* ");
         
        }
        printf("\n");
    }}
    return 0;
}

当然也可以使用我们上面说的行和列两种不同的思路来实现

BC107 箭形图案

 

分析:当我们把这个图案加一个空格后就变成了

 

这样我们就有了这个题的思路了

将图案分成两部分,一个是我们旋转我们的直角三角形图案

另外一个是我们旋转我们的翻转直角三角形图案

代码实现

#include<stdio.h>
int main()
{
    int num;
    int i,j,k;
    while(scanf("%d",&num)!=EOF)
        //将火箭图案从中间分开 上部分一个大循环 下部分一个循环
    {
        for(i=0;i<=num;i++)//上部分循环从此开始  此处确定了上部分循环的行数
        {
            for(j=0;j<num-i;j++)//此处为先开始打印空格
            {
                printf("  ");
            }
            for(k=0;k<=i;k++)//此处打印图案*
            {
                printf("*");
            }
            printf("\n");//至此一次大循环完成 打印了一行的图形 在此换行
        }
        for(i=0;i<num;i++)
        {
            for(j=0;j<=i;j++)
            {
                printf("  ");
            }
            for(k=0;k<num-i;k++)
            {
                printf("*");
            }
            printf("\n");
        }
    }
    return 0;
}
​

BC108 反斜线形图案

 

分析:

 

以4行4列为例:我们发现*所在的行和列都相等;

由此得出本题

代码实现:

#include<stdio.h>
int main() {
    int a;
    while(scanf("%d", &a)!=EOF){
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <=i; j++) {
            if (i == j) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
    }
    return 0;
}

BC109 正斜线形图案

 

分析:

 

由图得出:带*的行和列加起来都是4(输入的值)+1

代码实现

#include<stdio.h>
int main()
{
    int ch = 0;
    while(scanf("%d", &ch)!=EOF){
    for (int i = 1; i <= ch; i++) {
        for (int j = 1; j <=ch; j++) {
            if (i + j == ch+1) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
            printf("\n");
    }
    }
    return 0;
}

BC110 x形图案

 

分析:

 

该图由反斜线形和正斜线形图案构成

条件为行数等于列数,或者行数加列数=输入数+1;

代码实现

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) { 
        for(int i=1;i<=a;i++){
            for(int j=a;j>=1;j--){
                if((i+j==a+1)||(i==j)){
                    printf("*");
                }else{
                    printf(" ");
                }
            }
            printf("\n");
        }
       
    }
    return 0;
}

BC111 空心正方形图案

 

分析:

 

以4*4为例 ,先看第一行和最后一行是全输出,中间两行第一列和最后一列需要输出 *,由此得出代码

代码实现

#include <stdio.h>
int main()
{
  int n = 0;
  while(scanf("%d", &n) != EOF)
  {
      for(int i=0; i<n; i++)  
      {
         for(int j=0; j<n; j++)
         {
            if(i==0||i==n-1||j==0||j==n-1)
                 printf("* ");
             else
                 printf("  ");
         }
         printf("\n"); 
      }
  }
}
​
​

BC112 空心三角形图案

分析

以4*4为例,先看前三行:第一列是全打印,后面两列 *所在位置的行和列是相等的,然后再看第四行是全输出,由此得出代码

#include <stdio.h>
​
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
        for (int i = 1; i <= a; i++) {
            for (int j = 1; j <= a; j++) {
                if (j == 1 || i == j) {
                    printf("* ");
                }
                else if (i == a) {
                    printf("* ");
                }
                else {
                    printf("  ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

BC113 数字三角形

分析:以4*4为例

i==1,j==1,数字:1

i==2,j==2,数字:1,2

。。。。

所以类似于九九乘法表,列数小于等于行数

然后打印列数即可

代码实现

#include<stdio.h>
int main() {
    int a;
    scanf_s("%d", &a);
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d ", j);
        }
        printf("\n");
    }
}

今天阿崽就写到这吧,以上几道题都是找规律的题,善于画图和观察就能解出来,方法还有很多,大家可以思考。剩余了一个圣诞树,我们下期再更。

  • 16
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值