這個題目在bbs上看來的,
目前看了這麼多畫*的問題,
覺得這題算是最有創意的題目,
遇到這麼有心的老師,真的該好好珍惜。
問題如下:

設計一個函數 printDigit(int x, int n);
呼叫時,會在  n*n 的矩陣裡,顯示出 x 之數字
x = 0-9

意思就是要你在 n*n 矩陣裡畫出數字就是了。
事實上這題設計的時候至少要加一個限制:n的範圍,
x的確給了0-9,如果n=3的話,我就不信可以畫出什麼數字出來。

在解這題前,如果你對於一般畫*問題都不熟的話,請先看以下二篇:
http://edisonshih.pixnet.net/blog/post/32290479
http://edisonshih.pixnet.net/blog/post/32419157

解題的整個過程,不論是用什麼解法,
事實上的確必須先把數字 0 - 9 先畫出來,
所選出的 x 就必須依據設定之 n 值去畫。
於是 "至少" 就要解十個 function;
為什麼特別說是 "至少"?事實上,
如果真的要畫得漂亮的話,
每個數字都要去有二種畫法:n 是奇數,n是偶數,
這樣就要解二十個 function 了。

我在分析時,是假設n=5,然後去畫出 0-9 的數字,
接下來呼叫 printDigit 時,會先去呼叫 int check(int n);
如果 n<5,return 0, 接著就不畫;
如果 n>=5, return 1, 接著再依 x 值呼叫 draw0(x), draw1(x).. , draw9(x),
所以光是真正在畫圖上面, 我就寫了10個 function。
有件事一定要說,0-9是我自己畫的,畫出來的樣版圖如下。

DrawStar_0-9 

如果您手邊可以拿到更好的樣版,
可以參考那樣版自己畫,或是自己再畫個更漂亮的 0-9 後再做分析。
而我自己也懶得寫20個 function, 於是不管 n 是奇數還是偶數,
都是套用同一樣版。如果您覺得我畫出來的數字實在有夠醜,
那建議您,重新設計您數字的樣版吧...

程式碼如下所示:


// ================================================
// filename : DrawStar_Finial.cpp
// complier : vc2008
// author   : Edison.Shih.
// date     : 2010.11.09
//
//           ***  all rights reverse ***
// ================================================

#include <stdio.h>
int check(int n);
void draw0(int x, int n);
void draw1(int x);
void draw2(int x);
void draw3(int x);
void draw4(int x);
void draw5(int x);
void draw6(int x);
void draw7(int x);
void draw8(int x);
void draw9(int x);
void printDigit(int x, int n);
// ====================================
// check
int check(int n)
{
      if(n<5) {
            printf("error\n");
            return 0; // error
      }
      else return 1; // can do.
}


// ====================================
// draw0
void draw0(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  printf("%c", (i==1||i==n||j==1||j==n)?'*':' ');
            }
            printf("\n");
      }
}
// ====================================
// draw1
void draw1(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  printf("%c", (j==n)?'*':' ');
            }
            printf("\n");
      }
}
// ====================================
// draw2
void draw2(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(i==1 || i==n) printf("*");
                  else if(i==((n+1)/2)) printf("*");
                  else if(i<((n+1)/2) && j==n) printf("*");
                  else if(i>((n+1)/2) && j==1) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// draw3
void draw3(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(i==1 || i==n) printf("*");
                  else if(i==((n+1)/2)) printf("*");
                  else if(j==n) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// draw4
void draw4(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(j==n) printf("*");
                  else if(i<(n+1)/2 && j==1) printf("*");
                  else if(i==(n+1)/2) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// draw5
void draw5(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(i==1 || i==n) printf("*");
                  else if(i==((n+1)/2)) printf("*");
                  else if(i>((n+1)/2) && j==n) printf("*");
                  else if(i<((n+1)/2) && j==1) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// draw6
void draw6(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(j==1) printf("*");
                  else if(i==(n+1)/2||i==n) printf("*");
                  else if(i>(n+1)/2 && (j==1 || j==n)) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// draw7
void draw7(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(j==n || i==1) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}

// ====================================
// draw8
void draw8(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(i==1 || i==n) printf("*");
                  else if(i==(n+1)/2) printf("*");
                  else if(j==1 || j==n) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}

// ====================================
// draw9
void draw9(int n)
{
      int i, j;
      for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                  if(i==1) printf("*");
                  else if(i==(n+1)/2) printf("*");
                  else if(i<(n+1)/2 && j==1) printf("*");
                  else if(j==n) printf("*");
                  else printf(" ");
            }
            printf("\n");
      }
}
// ====================================
// printDigit
void printDigit(int x, int n)
{
      if(!check(n)) return;
      switch(x){
            case 0:
                  draw0(n);
                  break;
            case 1:
                  draw1(n);
                  break;
            case 2:
                  draw2(n);
                  break;
            case 3:
                  draw3(n);
                  break;
            case 4:
                  draw4(n);
                  break;
            case 5:
                  draw5(n);
                  break;
            case 6:
                  draw6(n);
                  break;
            case 7:
                  draw7(n);
                  break;
            case 8:
                  draw8(n);
                  break;
            case 9:
                  draw9(n);
                  break;
            default:
                  NULL;
      }
}
// ====================================
// main function
int main()
{
      const int n=7;
      for(int i=0; i<=9; i++) {
            printf("%d\n", i);
            printDigit(i, n);
            printf("\n");;
      }
}
// #end
// ====================================

為怕空白會被網頁吃掉
最後附上 n = 7 時的二張圖參考..

DrawStar_Final01 DrawStar_Final02

當然這是蠻笨的方法,事實上 Win32 API 裡面,
你可以設定字型、文字大小後,draw 在 desktop 上面,
最後再 getpixel 方式去取得每個 pixnel ,
就可以得到對應的陣列應該長得怎樣了,
只是這個方法,暫時還不適合初學者使用就是了。

以上,感謝各位收聽。

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(0) 人氣()