关于打印图形一类的题目

一、对于只有一半的图形而言
Problem F: Print Graphics Problerm (I)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 3123 Solved: 2067
[Submit][Status][Web Board]
Description

向标准输出上打印一些用ASCII字符组成的图形。

Input
输入为一个整数n,其中n大于0小于100。

Output

输出一个n层等腰三角形,格式见sample。

Sample Input
5
这里写图片描述

  1. 对于本题的一般做法是先找出 总行数 行数 空格 + 这四者之间的关系。
    关系如下图
    这里写图片描述
    2.发现总框架是一行一行的来,所以说行数是最外层循环控制换行,并且这里的行数一般是从1开始的。
    3.一般当空格或者+变化趋势与行数的变化趋势不同的时候,比如这里是空格,这样控制空格的变量一般必须要有总行数与单个行的联系来不断凑出这个数字,有时候这个数字还要扩大来不断的凑。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int i,j;
    int n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        for(j=0;j<n-i;j++)\\这里是总行数与单个行数来凑数字
        {
            printf(" ");
        }
        for(j=0;j<2*i-1;j++)
        {
            printf("+");
        }
        printf("\n");
    }
    return 0;
}



这个题还有另外一种做法,即为坐标法
这里写图片描述

**注意坐标法排列的顺序是从上到下从左向右 **

#include <stdio.h>
#include <stdlib.h>//这个为abs的头文件

int main()
{
    int n;
    int x,y;
    scanf("%d",&n);
    for(y=n-1;y>=0;y--)\\这里要注意x与y到底谁为大循环**这里y必须从正数开始,不可从负数开始到0,如果从负数开始的话,图形将倒过来**
    {
        for(x=-(n-1);x<=(n-1);x++)
        {
            if(abs(y)+abs(x)>=n&&x>0)\\这里要注意结束条件,因为没有空格所以要break;
                break;
            else
            {
                if(abs(y)+abs(x)<=(n-1))
                    printf("+");
                else
                    printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

二、对于上下对称等图形来说

Problem G: Print Graphics Problerm (II)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 6783 Solved: 2841
[Submit][Status][Web Board]
Description

向标准输出上打印一些用ASCII字符组成的图形。
Input

输入为多个整数n,其中n大于0小于100,当n为0时结束输入。

Output

若n为偶数,则输出一个正向的n层等腰三角形;n为奇数,则输出一个倒向的n层等腰三角形。三角形由“+”组成。任意两个图形之间有一个空行分隔,格式见sample。
Sample Input
5
4
0
这里写图片描述

1、方法一

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j,n;
    while(scanf("%d",&n)&&n!=0)
    {
        if(n%2!=0)
        {
            for(i=1; i<=n; i++)
            {
                for(j=0; j<i-1; j++)
                    printf(" ");
                for(j=0; j<2*n-(2*i-1); j++)
                {
                    if(j==2*n-(2*i-1)-1)
                        printf("+\n");
                    else
                        printf("+");
                }
            }
            printf("\n");
        }
        else
        {
            for(i=1;i<=n;i++)
            {
                for(j=0;j<n-i;j++)
                    printf(" ");
                for(j=1;j<=2*i-1;j++)
                {
                    if(j==2*i-1)
                        printf("+\n");
                    else
                        printf("+");
                }
            }
            printf("\n");
        }
    }
    return 0;
}


2、方法二

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,j;
    int isfirst=1;
    while(scanf("%d",&n)&&n!=0)
    {
        if(isfirst==0)**\\这个题来说有点特别,因为上下两半图形中间有一个空行,这个空行不太好控制,所以这里用了isfirst来控制**
            printf("\n");
        if(n%2!=0)
        {
            for(i=0; i>=-(n-1); i--)
            {
                for(j=-(n-1); j<=(n-1); j++)
                {
                    if(j>0&&abs(i)+abs(j)>=n)
                        break;
                    else
                    {
                        if(abs(i)+abs(j)<=(n-1))
                            printf("+");
                        else
                            printf(" ");
                    }
                }
                printf("\n");
            }
        }
        else
        {
            for(i=n-1; i>=0; i--)
            {
                for(j=-(n-1); j<=(n-1); j++)
                {
                    if(abs(i)+abs(j)>=n&&j>0)
                        break;
                    else
                    {
                        if(abs(i)+abs(j)<n)
                            printf("+");
                        else
                            printf(" ");
                    }
                }
                printf("\n");
            }
        }
        isfirst=0;
    }
    return 0;
}

三、编写函数的形式来打印图形

Problem H: Print Graphics Problerm (III) (Append Code)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 4973 Solved: 2700
[Submit][Status][Web Board]
Description

向标准输出上打印一些用ASCII字符组成的图形。


编写一个函数用于输出ASCII图形。

用C语言实现:append.c中函数原型为

int print_graphic(int n, char c);

用C++实现:append.cc中函数原型为

int printGraphic(int n, char c);

功能:输出n层有字符c组成的图形。

函数的调用格式见“Append Code”。

Input

输入为一个整数n和一个字符c,其中n大于0小于100。

Output

输出一个n层等腰三角形,由字符c组成,格式见sample。

Sample Input
5 *

int main()
{
    char c;
    int num;
    scanf("%d %c", &num, &c);
    print_graphic(num, c);
    return 0;
}

这里写图片描述

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int print_graphic(int n, char c)
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=0; j<n-i; j++)
            printf(" ");
        for(j=1; j<=2*i-1; j++)
        {
            if(j==2*i-1)
                printf("%c\n",c);
            else
                printf("%c",c);
        }
    }
    return 0;
}

int main()
{
    char c;
    int num;
    scanf("%d %c", &num, &c);
    print_graphic(num, c);
    return 0;
}

四、打印字母菱形

1、
Problem F: Print Graphics Problerm (V)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 2074 Solved: 1173
[Submit][Status][Web Board]
Description

向标准输出上打印一些用ASCII字符组成的图形。

Input

输入为多个奇数n,其中n大于0小于100,至文件尾结束。

Output

输出为多个n层的空心菱形,任意两个图形之间有一个空行分隔,格式见sample。

Sample Input
3
7
这里写图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,j;
    while(~scanf("%d",&n))\\这里表示!=EOF的另外一种做法
    {
        for(i=-(n-1)/2; i<=(n-1)/2; i++)
        {
            for(j=-(n-1)/2; j<=(n-1)/2; j++)
            {
                if(j>0&&abs(i)+j>(n-1)/2)
                    break;
                else
                {
                    if(abs(i)+abs(j)==(n-1)/2)
                        printf("*");
                    else
                        printf(" ");
                }

            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}


2、
Problem G: 打印字母菱形图案
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 3151 Solved: 2155
[Submit][Status][Web Board]
Description

输出N(N为奇数)行由字母组成的菱形,第1行为字母A,第2行为BCD,第三行为CDEFG,以此类推。菱形上下对称。

Input

一个奇数N。其中N大于0小于18。

Output

N行字母组成的菱形图案。
Sample Input
7
这里写图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=-(n-1)/2;i<=(n-1)/2;i++)
    {
        char c='A'+(n-1)/2-abs(i);\\注意这里ABC等的控制
        for(j=-(n-1)/2;j<=(n-1)/2;j++)
        {
            if(j>0&&abs(i)+abs(j)>(n-1)/2)
                break;
            else
            {
                if(abs(i)+abs(j)>(n-1)/2)
                    printf(" ");
                else
                {
                    putchar(c);
                    c++;
                }
            }
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值