• 5

請教C語言的邏輯

第二題:

var i,j,s="",n=10;
for(i=n;i--; )for(j=n;j--; )s+=(!i||n-1==i?"*":!j||n-1==j||j==i?"*":"o")+(j?"":"\n");
trace(s);
stop();
別當基本教義派.
如果*後的空白不印的話...

for (i = 0; i < num / 2; i++) {
       for (j = 0; j < num / 2 - i; j++) printf(" ");
       for (j = 0; j < 2 * i + 1; j++) printf("*");
       printf("\n");
}
很妙的是,
很多早期的 BASIC 入門書都會談到這題,
但是是因為很少使用 cmd 模式,
所以不太講解這種題目了嗎?
這種題目學級數歸納還不錯,太鑽的就跟程式設計就沒什麼關係。
我程式用 perl

第一題:
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";

肯定有更好的寫法, 但我目前的功力就到這了... 嘗試的把畫面數學化, 出題的就是想考你這個

可以去看看 寫程式到底需不需要懂數學 共勉之
晝短苦夜長何不秉燭遊
C語言早就忘記了,現在都用VB,但是邏輯好像跟語言沒有問題
我的邏輯如下:
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 時,填上符號,其餘留空

結束!!


那我也提供一下
剛接觸程式語言都會接觸的題目


    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *



JAVA程式碼:

//Math.abs 絕對值函數
for(int i = 1 ; i<=9 ; i++){
for(int j = 1 ; j<=Math.abs(5-i);j++)
System.out.print(” ”);
for(int k = 2 ; k <=(5 - Math.abs(5-i))*2; k++)
System.out.print(”*”);
System.out.println();
}


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




供樓主參考看看..
懶得開 vc .. 用 vbs 寫了一下
邏輯都一樣




反正就是
如果輸入要產生 nLevel 列
第 i 行的

空白是 nLevel-i 個,
星星是 (i-1)*2+1 個
貢獻一個 python 版

width = input("請輸入一個奇數: ")
half = (width-1)/2
for line in range(0, half+1):
print ' '*(half-line) + '*'*(line*2+1)
  • 5
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?