痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 7106|回復: 2

沈大胖的MCU入門學習之路---03.流程圖

[複製鏈接]
發表於 2014-7-25 20:41:32 | 顯示全部樓層 |閱讀模式
本帖最後由 fatzeros 於 2014-7-24 05:26 PM 編輯

前篇:
沈大胖的MCU入門學習之路---02.C語言學習環境建置篇

目前,大胖已經為大家介紹了,程式語言及環境的建置與簡易的除錯,
接下來,將為大家介紹在建置專案時,高效輔助的好工具:流程圖

啊!這個沒什麼好講的啦!
自己在紙上鬼畫符一下就行了啦!
還是在腦袋裡畫一下就ok啦!
免供這啦!

其實以上只是偷懶的理由啦,
畢竟有時鬼畫符到自己看不懂,更不用說別人看不看得懂了,
在腦袋裡畫一下,一下就忘啦!
所以,有心力的話,還是要將流程圖畫下來,以供日後參考還是後人景仰什麼的,還是最好的啦!

當專案初建立的時候,可以先畫出專案所要執行的項目清單,
在專案建立的中期,可以依流程圖檢視專案進行的進度及方向的正確性,
於專案的收尾時,可以依流程圖進行最後的驗證及除錯,
所以其實不論是大的還是小的專案或是製作項目,
如果能把流程圖仔細的畫出來,對於工作的執行可說是老虎插翅膀啊!
所以在寫作程式時,把流程圖畫出來,不但可以幫助我們判定程式方向的正確性,
也能依著流程圖建置出結構嚴謹及可讀性高的程式。

評分

1

查看全部評分

 樓主| 發表於 2014-7-25 20:41:33 | 顯示全部樓層
本帖最後由 fatzeros 於 2014-7-25 08:32 PM 編輯

接下來就要介紹畫流程圖的軟體啦,
可能大家都有聽過有點軟公司出品的VISIO,但是這個太貴,大胖吃不起,
所以,我要介紹給大家的是Dia這套開放軟體,又吃免錢的啦!
PIC-01.png

首先,必須,一定要到Dia的網站去下載他(這次比較遠,跑到德國去了):
Dia網站:http://dia-installer.de/
Dia下載頁面:http://dia-installer.de/download/index.html
有安裝版及免安裝版兩種,大家可以各憑喜好下載,
另外,他還有一支圖形安裝程式,建議大家也一起下載下來,
他會把其他的擴充圖形全部下載並安裝
PIC-02.png

在這邊,大胖儘量會以安裝版的來介紹,因為在安裝的過程中,
程式有時會有部份登錄檔的設定的,所以使用安裝版比較沒有其他怪怪的問題,
以下就是安裝流程啦,其實大部份都是next過就行了,
第一步要先注意一下,不要使用預設的Chinese安裝介面,這個是簡體,可能會出現亂碼,
PIC-03.png
PIC-04.png

要記得改成English再按ok安裝,程式安裝到完約80mb
PIC-05.png
PIC-06.png
PIC-07.png
PIC-08.png
PIC-09.png
PIC-10.png

最後,先不要執行程式
PIC-11.png

接下來要把其他擴充的圖形也裝起來,流程是差不多的
PIC-12.png
PIC-13.png
PIC-14.png
PIC-15.png
PIC-16.png
PIC-17.png
PIC-18.png
PIC-19.png
PIC-20.png

裝好了之後,我們把程式開起來,看一下主介面,
分為工具列區、圖形區及編輯區三大區塊
PIC-21.png

使用的方式就是先點選圖形區的圖形然後在編輯區裡拉出來就行了
PIC-22.png

但是要輸入中文的時候,你可以會覺得怎麼出不來,要在工具區的「輸入法」改成其他的輸入方式再試試就行了,
中文輸入是這套軟體這個版本比較嚴重的問題,有時還要重開程式才行
PIC-23.png

以上就是Dia這套軟體的使用說明,
網路上的教學資源也不少,請google一下就行了
https://www.google.com.tw/search ... _sm=93&ie=UTF-8

以下這兩個是動畫教學喔:http://203.68.253.130/~huang/video/Dia/Dia.html
                                    http://opensource.ntpc.edu.tw/dream_cd/03/dia/index.htm

http://ossacc.moe.edu.tw/modules/ck2_software/view.php?sw_sn=6
http://winapphelp.winnexus.com/2011/11/dia-20111121-dia-0.html
http://tsjh301.blogspot.tw/2011/12/dia.html

如果你有裝了擴充的圖形的話,還可以使用Dia來畫電路圖
http://ccckmit.wikidot.com/ee:dia
要記得從圖形區把圖形改成電路
PIC-24.png
PIC-25.png

接下來,要介紹一下,畫流程圖在輔助建置程式專案時的重要性。
 樓主| 發表於 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)

一開始,我們知道,我要寫一個計算球在盒子裡跑並計算軌跡的程式,
所以程式的部份可能會有「輸入參數」及「球跑算軌跡」這兩塊,
依這兩塊畫出的流程圖
PIC-26.png

接下來,我們就可以依照流程圖寫出大致的原始碼
  1. /*-----------------------------------------------
  2.   名稱:demo2
  3.   編寫:沈大胖
  4.   日期:2014/07/18
  5.   修改:
  6.   題目:模擬一個球在一個盒子裡碰撞的情形。我們假設
  7.                   有一個球在一個寬度為x高度為y的盒子內移動。
  8.                 這個球有一個初始位置,表示為(x1,y1)。這個
  9.                 球的移動方向為(dx1,dy1),且移動方向均為45度
  10.                 角,因此所有的dx和dy均為1或-1。球的移動速度
  11.                 是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
  12.                 為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
  13.                 移動到(2,5)。

  14.                 球撞到盒子邊角時會反彈,由於球始絡以45度角
  15.                 移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
  16.                 ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
  17.                 會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
  18.                 (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
  19.                 球撞到到角落,它會以相反的方向彈回來。

  20.                 輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
  21.                 需要模擬的秒數。輸出是最後這兩個球的位置。

  22.   內容:
  23.   參閱:
  24. -----------------------------------------------*/

  25. #include <stdio.h>                //導入標準I/O函數
  26. #include <stdlib.h>

  27. void main(void)
  28. {
  29.         int x=5 , y=8 ;     //定盒子的寬為5及高為8
  30.         int x1=3 , y1=4 ;   //定球的初始位置為(3,4)
  31.         int dx1=-1 , dy1=1 ;//定球的移動方向為(-1,1)
  32.         int t=10 ;          //定模擬的時間為10秒

  33.         int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1) ;
  34.        //球移動子函數宣告
  35.         int BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1) ;
  36.         //球移動方向子函數宣告

  37.         for(t = 0 ; t <= 10 ; t++)      //設定模擬時間迴圈
  38.         {
  39.                 printf("in loop x1,y1 = (%d,%d) \t and t = %d\n" , x1 , y1 , t) ;
  40.                 //印出迴圈內球的位置及模擬時間
  41.                 printf("dx1,dy1 = (%d,%d) \n" , dx1 , dy1) ;      //印出球的方向

  42.                 BallDirection(x , y , &x1 , &y1 , &dx1 , &dy1) ;    //呼叫球移動方向子函數
  43.         }

  44.         printf("\n程式結束") ;
  45. }

  46. int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1)
  47. {       //計算球移動方式
  48.         *x1 = *x1 + *dx1 ;
  49.         *y1 = *y1 + *dy1 ;
  50. }

  51. BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1)
  52. {       //計算球動的方向及位置
  53.                 if(*x1 == 0)
  54.                 {
  55.                         *dx1 = 1 ;
  56.                         RunBall(x1 , y1 , dx1 , dy1) ;
  57.                 }

  58.                 else if(*x1 == x)
  59.                 {
  60.                         *dx1 = -1 ;
  61.                         RunBall(x1 , y1 , dx1 , dy1) ;
  62.                 }

  63.                 else if(*y1 == 0)
  64.                 {
  65.                         *dy1 = 1 ;
  66.                         RunBall(x1 , y1 , dx1 , dy1) ;
  67.                 }

  68.                 else if(*y1 == y)
  69.                 {
  70.                         *dy1 = -1 ;
  71.                         RunBall(x1 , y1 , dx1 , dy1) ;
  72.                 }

  73.                 else
  74.                         {RunBall(x1 , y1 , dx1 , dy1) ;}
  75. }
複製代碼
這個時候,我們的流程圖就會變成以下這樣
PIC-27.png

看起來,程式和流程圖好像都完成了,
程式執行正確,也都有照著流程圖走,
耶!好啦,大功告成了!
其實並沒有,這個時候的程式及流程圖其實都不夠嚴謹,
少了很重要的判定部分,
判定輸入是否正確,
判定球是不是有跑,
判定方向是否正確,
這些都是很重要的一環,
那麼,接下來大胖就把判定的部份加上去,
這支程式的流程圖就變成了以下這個樣子
PIC-28.png

然後,大胖就可以依據這次畫出的流程圖再行修改程式,
這樣就可以寫出一支漂亮一點的程式啦!
  1. /*-----------------------------------------------
  2.   名稱:demo2
  3.   編寫:沈大胖
  4.   日期:2014/07/18
  5.   修改:
  6.   題目:模擬一個球在一個盒子裡碰撞的情形。我們假設
  7.                   有一個球在一個寬度為x高度為y的盒子內移動。
  8.                 這個球有一個初始位置,表示為(x1,y1)。這個
  9.                 球的移動方向為(dx1,dy1),且移動方向均為45度
  10.                 角,因此所有的dx和dy均為1或-1。球的移動速度
  11.                 是一秒鐘在兩個座標移動一單位長。例如(x1,y1)
  12.                 為(3,4)且(dx1,dy1)為(-1,1),則一秒鐘後球將
  13.                 移動到(2,5)。

  14.                 球撞到盒子邊角時會反彈,由於球始絡以45度角
  15.                 移動,所以很容易計算路徑。假設(x1,y1)為(3,4)
  16.                 ,(dx1,dy1)為(-1,1),模擬十秒那麼球的位置將
  17.                 會是(3,4)、(2,5)、(1,6)、(0,7)、(1,8)、(2,7)、
  18.                 (3,6)、(4,5)、(5,4)、(4,3)、(3,2)…等。如果
  19.                 球撞到到角落,它會以相反的方向彈回來。

  20.                 輸入依序為x、y、x1、y1、dx1、dy1、t,而t是
  21.                 需要模擬的秒數。輸出是最後這兩個球的位置。

  22.   內容:
  23.   參閱:
  24. -----------------------------------------------*/

  25. #include <stdio.h>                //導入標準I/O函數
  26. #include <stdlib.h>

  27. int Input(int *x ,   int *y ,
  28.                   int *x1 ,  int *y1 ,
  29.                   int *dx1 , int *dy1 ,
  30.                   int *t)
  31. {//程式輸入函數
  32.         printf("請輸入以下各參數:\n") ;
  33.         printf("請輸入盒子的寬度為:x\n") ;
  34.         scanf("%d" , x) ;
  35.         printf("請輸入盒子的高度為:y\n") ;
  36.         scanf("%d" , y) ;
  37.         printf("請輸入A球的初始位置為:x1,y1\n") ;
  38.         scanf("%d,%d" , x1 , y1) ;
  39.         printf("請輸入A球的移動方向為:dx1,dy1\n") ;
  40.         scanf("%d,%d" , dx1 , dy1) ;
  41.         printf("請輸入球移動的模擬時間為:t\n") ;
  42.         scanf("%d" , t) ;
  43. }

  44. void Print(int *x ,   int *y ,
  45.                    int *x1 ,  int *y1 ,
  46.                    int *dx1 , int *dy1 ,
  47.                    int *t)
  48. {//輸入判定及列印函數
  49.         if((*x <= 0) || (*y <= 0))
  50.         {
  51.                 printf("你所輸入的盒子大小不正確,請重新執行並輸入") ;
  52.                 exit(EXIT_SUCCESS) ;
  53.         }

  54.         else if((*x1 > *x) || (*y1 > *y))
  55.         {
  56.                 printf("你所輸入的A球位置不正確,請重新執行並輸入") ;
  57.                 exit(EXIT_SUCCESS) ;
  58.         }

  59.         else if((*dx1 > 1) || (*dx1 < -1) || (*dy1 > 1) || (*dy1 < -1) || (*dx1 == 0) || (*dy1 == 0))
  60.         {
  61.                 printf("你所輸入的移動方向不正確,請重新執行並輸入") ;
  62.                 exit(EXIT_SUCCESS) ;
  63.         }
  64.        
  65.         else if(t <= 0)
  66.         {
  67.                 printf("你所輸入的時間不正確,請重新執行並輸入") ;
  68.                 exit(EXIT_SUCCESS) ;
  69.         }
  70.        
  71.         else
  72.         {
  73.             printf("你所輸入的各項參數為:\n") ;
  74.                 printf("盒子的寬度x及高度y為:%d,%d\n" , *x , *y) ;
  75.                 printf("A球的初始位置為:(%d,%d)\n" , *x1 , *y1) ;
  76.                 printf("A球的移動方向為:(%d,%d)\n" , *dx1 , *dy1) ;
  77.                 printf("模擬時間為:%d秒\n" , *t) ;
  78.         }
  79. }

  80. void main(void)
  81. {
  82.         int x , y ;     //定盒子的寬為5及高為8
  83.         int x1 , y1 ;   //定球的初始位置為(3,4)
  84.         int dx1 , dy1 ; //定球的移動方向為(-1,1)
  85.         int t , i ;     //定模擬的時間為10秒

  86.         int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1) ;        //球移動子函數宣告
  87.         int BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1) ;        //球移動方向子函數宣告

  88.         Input(&x , &y , &x1 , &y1 , &dx1 , &dy1 , &t) ;
  89.         Print(&x , &y , &x1 , &y1 , &dx1 , &dy1 , &t) ;

  90.         for(i = 0 ; i <= t ; i++)      //設定模擬時間迴圈
  91.         {
  92.                 printf("in loop x1,y1 = (%d,%d) \t and t = %d\n" , x1 , y1 , i) ;     //印出迴圈內球的位置及模擬時間
  93.                 printf("dx1,dy1 = (%d,%d) \n" , dx1 , dy1) ;        //印出球的方向

  94.                 BallDirection(x , y , &x1 , &y1 , &dx1 , &dy1) ;        //呼叫球移動方向子函數
  95.         }

  96.         printf("\n程式結束") ;
  97. }

  98. int RunBall(int *x1 , int *y1 , int *dx1 , int *dy1)
  99. {       //計算球移動方式,方法為x1 + dx1 , y1 + dy1
  100.         *x1 = *x1 + *dx1 ;
  101.         *y1 = *y1 + *dy1 ;
  102. }

  103. BallDirection(int x , int y , int *x1 , int *y1 , int *dx1 , int *dy1)
  104. {       //計算球動的方向及位置
  105.                 if(*x1 == 0)
  106.                 {//若x1移動至盒子的左邊界時,dx1會變更為1
  107.                         *dx1 = 1 ;
  108.                         RunBall(x1 , y1 , dx1 , dy1) ;
  109.                 }

  110.                 else if(*x1 == x)
  111.                 {//若x1移動至盒子的右邊界時,dx1會變更為-1
  112.                         *dx1 = -1 ;
  113.                         RunBall(x1 , y1 , dx1 , dy1) ;
  114.                 }

  115.                 else if(*y1 == 0)
  116.                 {//若y1移動至盒子的下邊界時,dy1會變更為1
  117.                         *dy1 = 1 ;
  118.                         RunBall(x1 , y1 , dx1 , dy1) ;
  119.                 }

  120.                 else if(*y1 == y)
  121.                 {//若y1移動至盒子的上邊界時,dy1會變更為-1
  122.                         *dy1 = -1 ;
  123.                         RunBall(x1 , y1 , dx1 , dy1) ;
  124.                 }

  125.                 else        //若球還在盒子內移動時,RunBall()
  126.                         {RunBall(x1 , y1 , dx1 , dy1) ;}
  127. }
複製代碼
從以上的實作來看,流程圖在對我們進行程式寫作及除錯時,幫助真的很大,
請大家有能力還是要畫出流程圖來輔助程式寫作或是工作執行,也可以讓我們得知實作時的方向!

以上,如有觀念錯誤,還是大錯特錯的地方,
還望請各位老師用力指正,謝謝謝謝!

放上中國娃娃的歌:大錯特錯不要來,汙辱我的………
https://www.youtube.com/watch?v=NLHrOvlkuDg

附上這次的專案檔: demo2.zip (63.92 KB, 下載次數: 18)

評分

3

查看全部評分

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-12-22 02:57 PM , Processed in 0.076975 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.