• 5

請教C語言的邏輯

我要寫一個程式,輸入一個奇數,會列印出像下面的圖案 (以輸入11為例,o代表空白)

ooooo*ooooo
oooo***oooo
ooo*****ooo
oo*******oo
o*********o
***********

而以下是程式碼:
#include<stdio.h>
#include<stdlib.h>

int main( ){
int n, i, j,spnum;
printf("請輸入一個奇數: "),
scanf("%d",&n);
for(i = 1 ; i <= n ; i += 2)
{
spnum = (n-i)/2;
for( j = 0 ; j < n-spnum ; j++)<br>{
if (j < spnum)<br>printf(" ");
else
printf("*");
}
printf("\n");
}
system("PAUSE");
return 0;
}

看過之後大約了解設計的邏輯,但是我對這一類畫圖的程式很沒轍,我想詢問程式設計的前輩,像這一類的問題,應該如何切入比較好分析設計的邏輯?
2009-04-09 20:12 發佈
文章關鍵字 C語言 邏輯
我把一行拆成三個迴圈去執行。
#include<stdio.h>
#include<stdlib.h>

int main( )
{
int n, i, j;
printf("請輸入一個奇數: "),
scanf("%d",&n);

for(i=1; i<=n; i+=2)
{
for(j=(n-i)/2; j>=1; j--)printf(".");
for(j=i; j>=1; j--)printf("*");
for(j=(n-i)/2; j>=1; j--)printf(".");
printf("\n");
}
system("PAUSE");
return 0;
}


而且輸入偶數也不會怎樣。
這個真的是程式語言常考的題目
我在高中時期的VB競賽也是碰到這一題
當時的我是寫不出來的
(雖然當時是被班上硬推出來的替死鬼)
到了大學是沒有實際做過
不過我曾經有在腦中演練一遍
我當時的想法是
將這個三角形拆成兩半
ooooo*ooooo
oooo***oooo
ooo*****ooo
oo*******oo
o*********o
***********
像是這樣子的兩半
這樣子就好處理了
因為藍色那一半的最上面一行只有一個星號其他都是空白
而空白的數量剛好是數值-1的一半
而且只要每行遞減就能完成藍色那一半的輸出
接下來紅色那一半更簡單
同樣使用藍色那半部的方法
但是在第一行是沒有星號的
所以要改用另一個迴圈去表達
不過就在如何將兩半部的輸出結合在一起
就無法解決,就這樣子無疾而終

這是我對於這題的解析
雖然沒有結果
但是也簡化一些過程
給你參考
類似的題目還有:

輸入>5的正整數n,輸出以下圖型:

**********
**ooooooo*
*o*oooooo*
*oo*ooooo*
*ooo*oooo*
*oooo*ooo*
*ooooo*oo*
*oooooo*o*
*ooooooo**
**********

都很頭痛,不知道要怎麼突破這種畫圖的問題 ..
呆.宇 wrote:
我把一行拆成三個迴圈...(恕刪)


您的解題方式又更加簡單明瞭,感謝您.

能夠提點我這類問題要如何下手嗎?
daniel35 wrote:
類似的題目還有:輸入...(恕刪)

這題看不懂~你沒說這圖是輸入多少數值阿

daniel35 wrote:
您的解題方式又更...(恕刪)

土法煉鋼而已,找出他的規律性,看他有幾個圖形就拆幾個迴圈,
相同但沒有連續的就拆開。
(其實我也不知道該怎麼解釋,想到就寫XD)
我剛剛去查你以前的文章,你去年十月也有問過類似的問題.....

怎麼,時間點剛這麼剛好在期中考前阿?!

這一定有什麼誤會XDDDD
呆.宇 wrote:
我剛剛去查你以前的文...(恕刪)


暈.

當然不是呀.

我已經畢業很久了.

就是一直搞不懂才會去年問 今年還在問.
daniel35 wrote:
暈.當然不是呀.我已...(恕刪)


好啦,當我沒說XD

話說回來,這題目如果拿來當我們上學期的期中期末考題,不知道會怎樣?!

總覺得班上不死一堆人才怪XD
呆.宇 wrote:
這題看不懂~你沒說這...(恕刪)


我已經做了修改,紅色部分是要輸出的,'o'一樣是空白
  • 5
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?