|
樓主 |
發表於 2014-7-25 20:41:34
|
顯示全部樓層
本帖最後由 fatzeros 於 2014-7-25 11:35 PM 編輯
接下來,大胖會跟大家說明下,為什麼畫要畫流程圖
首先,我會依上一篇所舉的例子來作為流程圖的範例:
/*-----------------------------------------------
名稱:demo2
編寫:沈大胖
日期:2014/07/18
修改:
題目: 模擬一個球在一個盒子裡碰撞的情形。我們假設
有一個球在一個寬度為x高度為y的盒子內移動。
這個球有一個初始位置,表示為(x1,y1)。這個
球的移動方向為(dx1,dy1),且移動方向均為45度
角,因此所有的dx和dy均為1或-1。球的移動速度
是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
移動到(2,5)。
球撞到盒子邊角時會反彈,由於球始絡以45度角
移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
(3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
球撞到到角落,它會以相反的方向彈回來。
輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
需要模擬的秒數。輸出是最後這兩個球的位置。
內容:
參閱:
-----------------------------------------------*/
題目的意思是說模擬一個球在一個寬為5(x)高為8(y)的盒子裡移動,
球的初始位置是(3,4)(x1,y1),球移動的方向為(-1,1)(dx1,dy1),
模擬移動的時間為10(t)秒,假設球移動的方向均為45度,每一秒鐘在座標上移動一個單位長,
球撞到盒子的邊角時會反彈,求算出球移動10秒的路徑為何?
就大胖在紙上鬼畫符後的結果,球移動的路徑應為:
(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、(3,6)、(4,5)、(5,4)、(4,3)、(3,2)
一開始,我們知道,我要寫一個計算球在盒子裡跑並計算軌跡的程式,
所以程式的部份可能會有「輸入參數」及「球跑算軌跡」這兩塊,
依這兩塊畫出的流程圖
接下來,我們就可以依照流程圖寫出大致的原始碼- /*-----------------------------------------------
- 名稱:demo2
- 編寫:沈大胖
- 日期:2014/07/18
- 修改:
- 題目:模擬一個球在一個盒子裡碰撞的情形。我們假設
- 有一個球在一個寬度為x高度為y的盒子內移動。
- 這個球有一個初始位置,表示為(x1,y1)。這個
- 球的移動方向為(dx1,dy1),且移動方向均為45度
- 角,因此所有的dx和dy均為1或-1。球的移動速度
- 是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
- 為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
- 移動到(2,5)。
- 球撞到盒子邊角時會反彈,由於球始絡以45度角
- 移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
- ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
- 會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
- (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
- 球撞到到角落,它會以相反的方向彈回來。
- 輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
- 需要模擬的秒數。輸出是最後這兩個球的位置。
- 內容:
- 參閱:
- -----------------------------------------------*/
- #include <stdio.h> //導入標準I/O函數
- #include <stdlib.h>
- void main(void)
- {
- int x=5 , y=8 ; //定盒子的寬為5及高為8
- int x1=3 , y1=4 ; //定球的初始位置為(3,4)
- int dx1=-1 , dy1=1 ;//定球的移動方向為(-1,1)
- int t=10 ; //定模擬的時間為10秒
- int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1) ;
- //球移動子函數宣告
- int BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1) ;
- //球移動方向子函數宣告
- for(t = 0 ; t <= 10 ; t++) //設定模擬時間迴圈
- {
- printf("in loop x1,y1 = (%d,%d) \t and t = %d\n" , x1 , y1 , t) ;
- //印出迴圈內球的位置及模擬時間
- printf("dx1,dy1 = (%d,%d) \n" , dx1 , dy1) ; //印出球的方向
- BallDirection(x , y , &x1 , &y1 , &dx1 , &dy1) ; //呼叫球移動方向子函數
- }
- printf("\n程式結束") ;
- }
- int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1)
- { //計算球移動方式
- *x1 = *x1 + *dx1 ;
- *y1 = *y1 + *dy1 ;
- }
- BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1)
- { //計算球動的方向及位置
- if(*x1 == 0)
- {
- *dx1 = 1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*x1 == x)
- {
- *dx1 = -1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*y1 == 0)
- {
- *dy1 = 1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*y1 == y)
- {
- *dy1 = -1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else
- {RunBall(x1 , y1 , dx1 , dy1) ;}
- }
複製代碼 這個時候,我們的流程圖就會變成以下這樣
看起來,程式和流程圖好像都完成了,
程式執行正確,也都有照著流程圖走,
耶!好啦,大功告成了!
其實並沒有,這個時候的程式及流程圖其實都不夠嚴謹,
少了很重要的判定部分,
判定輸入是否正確,
判定球是不是有跑,
判定方向是否正確,
這些都是很重要的一環,
那麼,接下來大胖就把判定的部份加上去,
這支程式的流程圖就變成了以下這個樣子
然後,大胖就可以依據這次畫出的流程圖再行修改程式,
這樣就可以寫出一支漂亮一點的程式啦!- /*-----------------------------------------------
- 名稱:demo2
- 編寫:沈大胖
- 日期:2014/07/18
- 修改:
- 題目:模擬一個球在一個盒子裡碰撞的情形。我們假設
- 有一個球在一個寬度為x高度為y的盒子內移動。
- 這個球有一個初始位置,表示為(x1,y1)。這個
- 球的移動方向為(dx1,dy1),且移動方向均為45度
- 角,因此所有的dx和dy均為1或-1。球的移動速度
- 是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
- 為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
- 移動到(2,5)。
- 球撞到盒子邊角時會反彈,由於球始絡以45度角
- 移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
- ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
- 會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
- (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
- 球撞到到角落,它會以相反的方向彈回來。
- 輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
- 需要模擬的秒數。輸出是最後這兩個球的位置。
- 內容:
- 參閱:
- -----------------------------------------------*/
- #include <stdio.h> //導入標準I/O函數
- #include <stdlib.h>
- int Input(int *x , int *y ,
- int *x1 , int *y1 ,
- int *dx1 , int *dy1 ,
- int *t)
- {//程式輸入函數
- printf("請輸入以下各參數:\n") ;
- printf("請輸入盒子的寬度為:x\n") ;
- scanf("%d" , x) ;
- printf("請輸入盒子的高度為:y\n") ;
- scanf("%d" , y) ;
- printf("請輸入A球的初始位置為:x1,y1\n") ;
- scanf("%d,%d" , x1 , y1) ;
- printf("請輸入A球的移動方向為:dx1,dy1\n") ;
- scanf("%d,%d" , dx1 , dy1) ;
- printf("請輸入球移動的模擬時間為:t\n") ;
- scanf("%d" , t) ;
- }
- void Print(int *x , int *y ,
- int *x1 , int *y1 ,
- int *dx1 , int *dy1 ,
- int *t)
- {//輸入判定及列印函數
- if((*x <= 0) || (*y <= 0))
- {
- printf("你所輸入的盒子大小不正確,請重新執行並輸入") ;
- exit(EXIT_SUCCESS) ;
- }
- else if((*x1 > *x) || (*y1 > *y))
- {
- printf("你所輸入的A球位置不正確,請重新執行並輸入") ;
- exit(EXIT_SUCCESS) ;
- }
- else if((*dx1 > 1) || (*dx1 < -1) || (*dy1 > 1) || (*dy1 < -1) || (*dx1 == 0) || (*dy1 == 0))
- {
- printf("你所輸入的移動方向不正確,請重新執行並輸入") ;
- exit(EXIT_SUCCESS) ;
- }
-
- else if(t <= 0)
- {
- printf("你所輸入的時間不正確,請重新執行並輸入") ;
- exit(EXIT_SUCCESS) ;
- }
-
- else
- {
- printf("你所輸入的各項參數為:\n") ;
- printf("盒子的寬度x及高度y為:%d,%d\n" , *x , *y) ;
- printf("A球的初始位置為:(%d,%d)\n" , *x1 , *y1) ;
- printf("A球的移動方向為:(%d,%d)\n" , *dx1 , *dy1) ;
- printf("模擬時間為:%d秒\n" , *t) ;
- }
- }
- void main(void)
- {
- int x , y ; //定盒子的寬為5及高為8
- int x1 , y1 ; //定球的初始位置為(3,4)
- int dx1 , dy1 ; //定球的移動方向為(-1,1)
- int t , i ; //定模擬的時間為10秒
- int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1) ; //球移動子函數宣告
- int BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1) ; //球移動方向子函數宣告
- Input(&x , &y , &x1 , &y1 , &dx1 , &dy1 , &t) ;
- Print(&x , &y , &x1 , &y1 , &dx1 , &dy1 , &t) ;
- for(i = 0 ; i <= t ; i++) //設定模擬時間迴圈
- {
- printf("in loop x1,y1 = (%d,%d) \t and t = %d\n" , x1 , y1 , i) ; //印出迴圈內球的位置及模擬時間
- printf("dx1,dy1 = (%d,%d) \n" , dx1 , dy1) ; //印出球的方向
- BallDirection(x , y , &x1 , &y1 , &dx1 , &dy1) ; //呼叫球移動方向子函數
- }
- printf("\n程式結束") ;
- }
- int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1)
- { //計算球移動方式,方法為x1 + dx1 , y1 + dy1
- *x1 = *x1 + *dx1 ;
- *y1 = *y1 + *dy1 ;
- }
- BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1)
- { //計算球動的方向及位置
- if(*x1 == 0)
- {//若x1移動至盒子的左邊界時,dx1會變更為1
- *dx1 = 1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*x1 == x)
- {//若x1移動至盒子的右邊界時,dx1會變更為-1
- *dx1 = -1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*y1 == 0)
- {//若y1移動至盒子的下邊界時,dy1會變更為1
- *dy1 = 1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else if(*y1 == y)
- {//若y1移動至盒子的上邊界時,dy1會變更為-1
- *dy1 = -1 ;
- RunBall(x1 , y1 , dx1 , dy1) ;
- }
- else //若球還在盒子內移動時,RunBall()
- {RunBall(x1 , y1 , dx1 , dy1) ;}
- }
複製代碼 從以上的實作來看,流程圖在對我們進行程式寫作及除錯時,幫助真的很大,
請大家有能力還是要畫出流程圖來輔助程式寫作或是工作執行,也可以讓我們得知實作時的方向!
以上,如有觀念錯誤,還是大錯特錯的地方,
還望請各位老師用力指正,謝謝謝謝!
放上中國娃娃的歌:大錯特錯不要來,汙辱我的………
https://www.youtube.com/watch?v=NLHrOvlkuDg
附上這次的專案檔:
demo2.zip
(63.92 KB, 下載次數: 18)
|
評分
-
3
查看全部評分
-
|