這個題目在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是我自己畫的,畫出來的樣版圖如下。
如果您手邊可以拿到更好的樣版,
可以參考那樣版自己畫,或是自己再畫個更漂亮的 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 時的二張圖參考..
當然這是蠻笨的方法,事實上 Win32 API 裡面,
你可以設定字型、文字大小後,draw 在 desktop 上面,
最後再 getpixel 方式去取得每個 pixnel ,
就可以得到對應的陣列應該長得怎樣了,
只是這個方法,暫時還不適合初學者使用就是了。
以上,感謝各位收聽。
留言列表