#问题求解与编程 实验一 C 数字图形

本博客探讨如何使用C语言根据输入的字符和高度生成以该字符为基础的‘8’形数字图形。题目要求输出图形,其中横线由一个字符构成,竖线宽度随高度增加而增加,并确保下圈内径接近上圈。文章分享了作者在理解题目和寻找解决方案过程中的思考,以及最终的AC代码和简洁的标程。
摘要由CSDN通过智能技术生成

数字图形

发布时间: 2018年3月20日 21:24   最后更新: 2018年3月20日 23:08   时间限制: 1000ms   内存限制: 128M

描述

很多人都喜欢“8”这个数字,这道题的要求就是输出以某个字母为基础像素点的图形“8”。

输入

输入有多组数据,每组数据中有一个字符c和一个整数n,字符表示基础像素点(均为大写字母),整数n(5<=n<=100)表示高度。

输出

横线总是一个字符粗,也就是说只有一行,中间字符长度为(n/2-1),如样例1,第一行中间为两个A,即7/2-1=2。
竖线随着总高度每增长6而增加1个字符宽。当总高度从5增加到6时,其竖线宽度从1增长到2。下圈高度不小于上圈高度,但应尽量接近上圈高度,且下圈的内径呈正方形。

样例输入1
A 7
样例输出1
  AA
AA  AA
AA  AA
  AA
AA  AA
AA  AA
  AA
样例输入2
B 8
样例输出2
  BBB
BB   BB
BB   BB
  BBB
BB   BB
BB   BB
BB   BB
  BBB
提示

每行最后一个字母后无空格。

————————————————————————————————————————————————————

以上为题目原答案,说实话,看到这个题的时候还是有点懵逼的,想到可能要重复循环输出字母+空格+字母。但又苦于自己太笨,规律找不好,没有很好的做完。

以下为AC代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
    int i,j,k;
    char a;
    int n;
    while(scanf("%c%d",&a,&n)!=EOF)
    {
        getchar();//接收回车
        int a1=n/6+1;//竖线字符宽的增加
        int u1=(n-3)/2;//
        int d1=n-3-(n-3)/2;//内径
        //printf("fkdjkla\n"); 测试
        for(i=1;i<=a1;i++)
        {
            printf(" ");
        }
        for(i=1;i<=d1;i++)
        {
            printf("%c",a);
        }
        printf("\n");//从此往上为第一行
        for(j=1;j<=u1;j++)
        {
           for(i=1;i<=a1;i++)
           {
             printf("%c",a);
           }
           for(i=1;i<=d1;i++)
           printf(" ");
           for(i=1;i<=a1;i++)
           {
             printf("%c",a);
           }

            printf("\n");
        }
        //printf("\n");
        for(i=1;i<=a1;i++)
        {
            printf(" ");
        }
        for(i=1;i<=d1;i++)
        {
            printf("%c",a);
        }
        printf("\n");
          for(j=1;j<=d1;j++)
        {
           for(i=1;i<=a1;i++)
           {
             printf("%c",a);
           }
           for(i=1;i<=d1;i++)
           printf(" ");
           for(i=1;i<=a1;i++)
           {
             printf("%c",a);
           }
           printf("\n");

        }
        for(i=1;i<=a1;i++)
        {
            printf(" ");
        }
        for(i=1;i<=d1;i++)
        {
            printf("%c",a);
        }
        printf("\n");


    }
    return 0;
}

解决问题的关键在于内外径以及列宽,感觉这样一行一行的输出结果就可以了,但是看到标程才发现自己写的真的是又臭又长......以下为标程:

#include<cstdio>
#define pfn printf("\n")
char c[2];//开始就定义字母
int n;
void pr(int flag)//定义一个函数,可以重复使用封装
{
    for(int t=0;t<2;t++)
    {
        int i,j;
        for(i=0;i<n/6+1;i++)//n/6+1 为竖排字符宽度
            printf(" ");
        for(i=0;i<n/2-1;i++)//n/2-1 横排长度
            printf("%c",c[0]);
        pfn;
        for(i=(flag==0&&t==1?-1:0);i<(n%2?n/2-1:n/2-2);i++)//这一行是简化代码的关键 如果是偶数行高 那么讲
        {
            for(j=0;j<n/6+1;j++)
                printf("%c",c[0]);
            for(j=0;j<n/2-1;j++)
                printf(" ");
            for(j=0;j<n/6+1;j++)
                printf("%c",c[0]);//printf("%d",t);
            pfn;
        }
    }
}
int main()
{
    //freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    while(scanf("%s%d",c,&n)!=EOF)
    {
        pr(n%2);//判断奇数还是偶数
        int i,j;
        for(i=0;i<n/6+1;i++)//输出最后一行
            printf(" ");
        for(i=0;i<n/2-1;i++)
            printf("%c",c[0]);
        pfn;
    }
    return 0;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值