1. 程式人生 > >山東科技大學OJ Print Graphics Problem (II)

山東科技大學OJ Print Graphics Problem (II)

 

對於這種輸出菱形樣式的圖形我在這裡為大家總結了一點簡單方法,這需要一點點抽象思維,但也不是很難的哦,大家不要害怕,請聽小鑫娓娓道來。

首先我們要了解編譯器輸出格式以及C語言程式碼的整體趨向性,編譯器輸出格式是以行輸出標準的,C語言程式碼一般是以正向發展為主要趨勢的,讓我們看樣例輸出格式,一個空心的菱形,在我們之前所接觸的輸出圖形樣式都是實菱形為主,這種空心圖形沒有過多接觸,但也不是沒有辦法的,掌握每一行的輸出技巧,暴力解法是可以解出來的,但是程式碼量過於龐大,小鑫比較懶不想寫這麼多程式碼,於是我就想出來一種新方法:將輸出圖形二維化,想象成二維笛卡爾座標系,但也不是一般的笛卡爾座標系,這個座標的縱座標是向下指的。下面我用一個圖來解釋一下吧:

圍成菱形的四條線大家應該很容易就猜出來就是| X |   +   |  Y  |  =  N(N為輸入的數)

 

二話不說先上程式碼:

#include<stdio.h>
#include<stdlib.h>
int print_graphic(int n)
{
    int b,i,j,k;
    int x,y;
    if(n%2==0)
    {
        for(y = -n+1 ; y <=0 ;y++)
        {
            for(x= -n+1 ; x <n; x++)
            {
                if(abs(y)+abs(x) < n)
                    printf("+");
                else if(-x + y > -n)
                    printf(" ");
            }
            printf("\n");
        }
    }
    else
    {
        for(y = 1 ; y <=n ;y++)
        {
            for(x= -n+1; x <n; x++)
            {
                if(abs(y)+abs(x) <= n)
                    printf("+");
                else if(x + y < n)
                    printf(" ");
            }
            printf("\n");
        }
    }
}

int main()
{
    int num,z=0;
    while(scanf("%d", &num)!=EOF&&num)
    {
        z++;
        if(z>=2) printf("\n");
        print_graphic(num);

    }

    return 0;
}

我用一個輸出圖形的函式來實行這個操作,實際上不用也可以,直接就把 if(n%2==0)和else 那兩段程式碼拖到主函式裡面就可以啦。函式的運用主要是培養模組化的思維,不如一開始就用這種方式來寫程式碼,為以後鋪路。