第一題:
1. 星號是 1 3 5 .. 11 所以得出變數$i每次加 2
2. 星號前的空白是 5 4 3 2 1 遞減, 得出算式 (最大值-1)/2
$number = 11;
for($i=1 ; $i<=$number ; $i+=2)
{
print ' ' x (($number-$i)/2) ## 印出星號前的空白
print '*' x $i ##印出星號
print "\n"; ##換行
}
第二題:
1. 第一行與最後一行都是印出輸入數值的*號, 我選擇額外處理 (01 12)
2. 2~9行每行前後都有一個 * 再另行處理 (05 09)
3. 接下來就簡單了, 把外面那一層皮撥掉, 很簡單的規律就出來了. 印出$i-1個空白(06), 接著一個星號(07), 然後再加上 ($number - 2 - $i) 個空白(08)
01 $number = 10;
02 print '*' x $number . "\n";
03 for($i=1 ; $i<=($number-2) ; $i++)
04 {
05 print '*';
06 print ' ' x ($i-1);
07 print '*';
08 print ' ' x ($number - 2 - $i);
09 print '*';
10 print "\n";
11 }
12 print '*' x $number . "\n";
肯定有更好的寫法, 但我目前的功力就到這了... 嘗試的把畫面數學化, 出題的就是想考你這個
可以去看看 寫程式到底需不需要懂數學 共勉之
晝短苦夜長何不秉燭遊
我的邏輯如下:
1.判斷是否輸入奇數,很簡單,不用再示範了吧!
2.計算總共有幾列?1-->1列 3-->2列 ..... n(奇數)--> (n+1)/2列
3.每一列共有幾個字元?更簡單,就是n個
4.每一列哪幾個字元位置留空?哪幾個填上符號?
用文字不好說明,用VB輔助說明
for i = 1 to (n+1)/2
for j = 1 to n
if (n+1)/2 - (i-1) <= j <= (n+1)/2 + (i-1) then 符號 else 空白
next j
next i
以n=11為例,共有(n+1)/2=6列,每一列有11個字元(j = 1 to 11)
i=1 第1列,(n+1)/2 - (i-1)=6,(n+1)/2 + (i-1)=6,所以當 6 <= j <= 6 時,填上符號,其餘留空
i=2 第2列,(n+1)/2 - (i-1)=5,(n+1)/2 + (i-1)=7,所以當 5 <= j <= 7 時,填上符號,其餘留空
...
...
...
i=6 第6列,(n+1)/2 - (i-1)=1,(n+1)/2 + (i-1)=11,所以當 1 <= j <= 11 時,填上符號,其餘留空
結束!!
daniel35 wrote:
我要寫一個程式,輸入...(恕刪)
真的把它當成畫圖如何

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main( )
{
int nInput=0;
do
{
printf("請輸入一個奇數: ");
scanf("%d",&nInput);
} while (!(nInput%2)); //簡易檢查是否是奇數
char *szOutStream = new char[nInput]; //產生長度為輸入數值的buffer
//變數解說
//nPt為要畫的 ' ' 數量(單側)
//nStar為中間要畫的 * 數量
memset(szOutStream,' ',sizeof(char)*nInput); //將buffer 一次全部填入' '
for (int nPt=(nInput-1)/2;nPt>=0;nPt--) //計算出單側需要畫的' '數量 每次遞減1
{
int nStar = nInput-(nPt*2); //計算出中間需要畫的 * 數量
memset(szOutStream+nPt,'*',sizeof(char)*nStar); // 跳過nPt之後 填入 該顯示的* 長度為nStar
printf("%s\n",szOutStream);//輸出
}
delete szOutStream; //有生就有死... 有new 就有delete
system("PAUSE");
return 0;
}
/////////////////////////////////////////////////////////////
這類型的題目並不是單純考驗你的邏輯能力 也不是單純考驗你的數學能力
題目的圖形都有一定的規則
第一是考驗你的觀察力 & 輯分析 要你在圖形中找出規律
第二是考驗你對 for/while loop的使用熟練度 當你找出規律之後 就是要用迴圈的方式將圖形print出來
越複雜的圖形需要越複雜的loop
像我的解法是使用stream來處理將他當成真的畫圖方式 .. 先刷上底色 ' ' 再畫上要的 '*'
想像力是很重要的....
ps .你可以把memset當成是一個會在buffer指定的位子填入指定長度字元的for loop
內文搜尋

X