使用shell編寫(xiě)的魔幻盒子_第1頁(yè)
使用shell編寫(xiě)的魔幻盒子_第2頁(yè)
使用shell編寫(xiě)的魔幻盒子_第3頁(yè)
使用shell編寫(xiě)的魔幻盒子_第4頁(yè)
使用shell編寫(xiě)的魔幻盒子_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 嵌入式操作系統(tǒng)實(shí)訓(xùn)報(bào)告學(xué) 號(hào): 0952100111 姓 名: 陳勝 題 目: 魔幻盒子 指導(dǎo)老師: 韓桂民 2011年12月 28 日1、任務(wù)題目:魔幻盒子題目解釋:使用SHELL編程寫(xiě)一個(gè)能用ASCII碼字符組成的長(zhǎng)寬可變的四邊形2、性能、指標(biāo)、要求:2.1、基本要求1)四邊形繪圖(40點(diǎn)*30點(diǎn));2)邊的ASCII字符可以在按下某個(gè)按鍵的情況下可以修改;3)四邊形的四個(gè)角要求用不同的ASCII字符;4)四邊形的大小可變;5)四邊形的中間輸出自己的姓名與學(xué)號(hào);2.2、發(fā)揮部分老師要求:在按下某按鍵時(shí)能實(shí)現(xiàn)四邊形的立體化自我發(fā)揮:1)姓名學(xué)號(hào)的顏色會(huì)隨著時(shí)間的變化不斷變化 2)可以將方形

2、變成圓形3、方案設(shè)計(jì)3.1、方案論證 3.1.1關(guān)于畫(huà)平面四邊形:方案一:由老師所給的“shell高級(jí)編程”文本中學(xué)習(xí)到的畫(huà)盒子的方法,通過(guò)獲得要畫(huà)四邊形的左上角坐標(biāo)和要畫(huà)四邊形的長(zhǎng)和寬來(lái)達(dá)到在終端上畫(huà)四邊形的目的。方案二:改編方案一的程序,將左上角的坐標(biāo)固定,只需要長(zhǎng)和寬就能在終端上畫(huà)出四邊形。方案三:自己通過(guò)實(shí)踐想到的一個(gè)方法,獲取當(dāng)前終端大小,然后求出當(dāng)前終端的中點(diǎn)位置,給出長(zhǎng)和寬,以終端中點(diǎn)為中心畫(huà)出一個(gè)四邊形。最終我決定使用方案三,前兩種方案都可以畫(huà)出盒子,但是在實(shí)現(xiàn)立體的時(shí)候容易超出終端,而第三種可以比較容易的定義一個(gè)條件來(lái)限制超出。3.1.2關(guān)于畫(huà)立體的斜邊:方案一:直接使用最笨

3、的方法,在要畫(huà)斜邊的角的位置,然后行減一、列加一,達(dá)到畫(huà)出一條斜線的目的。方案二:使用勾股定理算出邊的比例,然后通過(guò)比例確定坐標(biāo)來(lái)畫(huà)出斜邊上的點(diǎn)。這樣就可以畫(huà)出不同斜率的線。而且可以自由設(shè)置斜邊的長(zhǎng)度。我選擇的是方案二,方案一雖然很簡(jiǎn)單,而且易懂,但是是投機(jī)取巧的,而且斜邊的大小和斜邊的斜率不可調(diào)。這樣對(duì)之后如果想進(jìn)行圖像變換也不容易,所以最終選擇使用方案二3.2、工作原理 3.2.1 相關(guān)知識(shí)3.2.1.1本次實(shí)訓(xùn)所使用的平臺(tái):Linux操作系統(tǒng)Linux簡(jiǎn)介:Linux是一種自由和開(kāi)放源碼的類Unix操作系統(tǒng)。目前存在著許多不同的Linux,但它們都使用了Linux內(nèi)核。Linux可安裝在

4、各種計(jì)算機(jī)硬件設(shè)備中,從手機(jī)、平板電腦、路由器和視頻游戲控制臺(tái),到臺(tái)式計(jì)算機(jī)、大型機(jī)和超級(jí)計(jì)算機(jī)。Linux是一個(gè)領(lǐng)先的操作系統(tǒng),世界上運(yùn)算最快的10臺(tái)超級(jí)計(jì)算機(jī)運(yùn)行的都是Linux操作系統(tǒng)。嚴(yán)格來(lái)講,Linux這個(gè)詞本身只表示Linux內(nèi)核,但實(shí)際上人們已經(jīng)習(xí)慣了用Linux來(lái)形容整個(gè)基于Linux內(nèi)核,并且使用GNU 工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)。Linux得名于計(jì)算機(jī)業(yè)余愛(ài)好者Linus Torvalds。3.2.1.2本次實(shí)訓(xùn)使用的編程語(yǔ)言:ShellShell是系統(tǒng)的用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種接口。它接收用戶輸入的命令并把它送入內(nèi)核去執(zhí)行。 實(shí)際上Shell是一個(gè)

5、命令解釋器,它解釋由用戶輸入的命令并且把它們送到內(nèi)核。不僅如此,Shell有自己的編程語(yǔ)言用于對(duì)命令的編輯,它允許用戶編寫(xiě)由shell命令組成的程序。Shell編程語(yǔ)言具有普通編程語(yǔ)言的很多特點(diǎn),比如它也有循環(huán)結(jié)構(gòu)和分支控制結(jié)構(gòu)等,用這種編程語(yǔ)言編寫(xiě)的Shell程序與其他應(yīng)用程序具有同樣的效果。3.2.1.3 AWKAWK是一種優(yōu)良的文本處理工具。它不僅是 Linux 中也是任何環(huán)境中現(xiàn)有的功能最強(qiáng)大的數(shù)據(jù)處理引擎之一。這種編程及數(shù)據(jù)操作語(yǔ)言(其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個(gè)字母)的最大功能取決于一

6、個(gè)人所擁有的知識(shí)。 AWK 提供了極其強(qiáng)大的功能:可以進(jìn)行樣式裝入、流控制、數(shù)學(xué)運(yùn)算符、進(jìn)程控制語(yǔ)句甚至于內(nèi)置的變量和函數(shù)。它具備了一個(gè)完整的語(yǔ)言所應(yīng)具有的幾乎所有精美特性。實(shí)際上 AWK 的確擁有自己的語(yǔ)言: AWK 程序設(shè)計(jì)語(yǔ)言, 三位創(chuàng)建者已將它正式定義為“樣式掃描和處理語(yǔ)言”。它允許您創(chuàng)建簡(jiǎn)短的程序,這些程序讀取輸入文件、為數(shù)據(jù)排序、處理數(shù)據(jù)、對(duì)輸入執(zhí)行計(jì)算以及生成報(bào)表,還有無(wú)數(shù)其他的功能。程序中比較用的比較多的語(yǔ)句echo:shell中的輸出,與C中的printf很類似。本程序中用到的echo指令有很多種。-e:?jiǎn)⒂梅葱本€控制字符的轉(zhuǎn)換(具體看下面)-n:取消行末換行關(guān)于 echo

7、命令所支持的反斜線控制字符如下:a:ALERT / BELL (從系統(tǒng)喇叭送出鈴聲) b:BACKSPACE ,也就是向左刪除鍵 c:取消行末之換行符號(hào) E:ESCAPE,跳脫鍵 f:FORMFEED,換頁(yè)字符 n:NEWLINE,換行字符 r:RETURN,回車鍵 t:TAB,表格跳位鍵 v:VERTICAL TAB,垂直表格跳位鍵 n:ASCII 八進(jìn)位編碼(以 x 開(kāi)首為十六進(jìn)制) :反斜線本身echo e “Ea;bH”c的意思是在終端的第a行c列的位置輸出cecho e “Eam”的意思是前景色,其中a=30時(shí)為黑色,31時(shí)為紅色,32綠色,。40為黑色背景,31是紅色背景,。0為變

8、回最初顏色echo e “033?25l”是隱藏光標(biāo) echo e “033?25h”顯示光標(biāo)read:讀取的命令-s:不在終端上打印輸出的內(nèi)容-n加數(shù)字:代表鍵盤(pán)輸入到多少位時(shí)自動(dòng)讀取,不用按回車-t:帶上時(shí)間參數(shù)可以控制讀取的時(shí)間,當(dāng)達(dá)到指定的時(shí)間時(shí)自動(dòng)停止讀取 A=$(echo $a | awk printf(“%d”,$1) 將a代入awk中運(yùn)算,講運(yùn)算結(jié)果以整形輸出到A。tput lines:獲取當(dāng)前終端的行數(shù)。tput cols:獲取當(dāng)前終端的列數(shù)。tput cup x y:將光標(biāo)移動(dòng)到x行y列處stty igncr:忽略回車符stty -igncr:解除忽略回車符clear:清楚

9、當(dāng)前終端的內(nèi)容exit:退出4、軟件設(shè)計(jì)主循環(huán)代碼:#mainecho -e "033?25l"W=30H=20Z="|"Y="|"S="-"X="-"C=0colour1=0draw_zhujiemianstty igncrwhile truedoecho -e "E3$colour1m"draw_dot $MROW-1 $MCOL-5 "chensheng"draw_dot $MROW $MCOL-5 "0952100111"ech

10、o -e "E0m"while read -n1 -t 2 adoif $a = 1 thencleardraw_box $W $H $Z $Y $S $X $Cecho -e "E3$colour1m"draw_dot $MROW-1 $MCOL-5 "chensheng"draw_dot $MROW $MCOL-5 "0952100111"echo -e "E0m"stty -igncrtput cup $ROW-3 0read -p "High:" hread -p &

11、quot;Wide:" wH=$hW=$wstty igncrdraw_zhujiemianfiif $a = 2 thencolour_jiemianwhile read -n1 -s bdoif $b = 0 thencolour_jiemianfiif $b = 1 then colour_jiemian fiif $b = 2 then colour_jiemian fiif $b = 3 then colour_jiemian fiif $b = 4 thendraw_zhujiemian break fidonefiif $a = 3 thencleardraw_box

12、$W $H $Z $Y $S $X $Cecho -e "E3$colour1m" draw_dot $MROW-1 $MCOL-5 "chensheng" draw_dot $MROW $MCOL-5 "0952100111" echo -e "E0m"tput cup $ROW-6 0stty -igncrread -p "Up:" Uread -p "Down:" Dread -p "Left:" Lread -p "Right:"

13、; Rstty igncrS=$UX=$DZ=$LY=$Rdraw_zhujiemianfiif $a = 4 thencleardraw_box $W $H $Z $Y $S $X $Cecho -e "E3$colour1m" draw_dot $MROW-1 $MCOL-5 "chensheng" draw_dot $MROW $MCOL-5 "0952100111" echo -e "E0m"a=1 b=1 x=10 A=$(echo $a $b $x | awk 'printf("%dn

14、",$1/sqrt($1*$1+$2*$2)*$3)')LRs=$Rs-$ALCz=$Cz+$ALCy=$Cy+$Aecho -e "E3$Cm"pd=1for(c=$LCz; pd<=$W*2; c+)dodraw_dot $LRs $c $Slet pd=pd+1donepd=1for(r=$LRs; pd<=$H; r+)dodraw_dot $r $LCy $Ylet pd=pd+1donepd=1y1=$Czy2=$Cyx1=$Rxx2=$Rsa=1b=1x=10A=$(echo $a $b $x | awk 'printf(

15、"%dn",$1/sqrt($1*$1+$2*$2)*$3)')for(i=0;i<=$A;i+)do B=$(echo $i $a $b | awk 'printf("%dn",$1*$2/$3)') echo -e "E$x2-$B;$y1+$iH""a"echo -e "E$x2-$B;$y2+$iH""b"echo -e "E$x1-$B;$y2+$iH""d"donetput cup $ROW-2

16、 1stty -igncrecho -e "E0m"read -s -p "Press ENTER to return!"draw_zhujiemianstty igncrecho -e "E0m"fiif $a = 5 thencleardraw_boll $H/2echo -e "E3$colour1m" draw_dot $MROW-1 $MCOL-5 "chensheng" draw_dot $MROW $MCOL-5 "0952100111" echo -e &qu

17、ot;E0m"stty -igncrread -sstty igncrdraw_zhujiemianfiif $a = 0 thenstty -igncrclearecho -e "033?25h"exit 0fidonelet colour1=colour1+1if $colour1 = 6 thencolour1=0fidone主循環(huán)流程圖:圖1:主流程圖開(kāi)始變量初始化畫(huà)盒子畫(huà)名字、學(xué)號(hào)等待按鍵2秒名字顏色變量+1,假如顏色變量等于6,顏色變量歸0無(wú)按鍵有按鍵按1輸入要修改的長(zhǎng)、寬大小畫(huà)盒子等待按鍵根據(jù)按鍵修改顏色參數(shù)按2輸入各邊的ASCII字符按3根據(jù)輸入修

18、改邊變量畫(huà)出立體的五條邊按4等待回車鍵按5退出畫(huà)出圓形等待回車鍵畫(huà)盒子的程序流程:用了兩個(gè)for循環(huán)來(lái)畫(huà)出四條邊,流程圖如下:具體程序:echo "You Terminal is too small!" stty -igncr exit 1fi if $1 -lt 10 | $2 -lt 3 then clear echo "box is too small" stty -igncr exit 2 fi MROW=$ROW/2 MCOL=$COL/2 Rs=$MROW-$2/2 Cz=$MCOL-$1/2 Rx=$Rs+$2-1 Cy=$Cz+$1-1

19、pd=1 echo -ne "E3$7m" for(r=$Rs;pd<=$2;r+) do draw_dot $r $Cz "$3" draw_dot $r $Cy "$4" let pd=pd+1donepd=1for(c=$Cz;pd<=$1;c+)dodraw_dot $Rs $c "$5" draw_dot $Rx $c "$6" let pd=pd+1done在立體盒子的時(shí)候,用了勾股定理來(lái)求出三角形的三條邊。其中計(jì)算勾股定理的時(shí)候用了awk,利用awk進(jìn)行浮點(diǎn)運(yùn)算。具體算

20、法程序如下:a=1 b=1 x=10A=$(echo $a $b $x | awk 'printf("%dn",$1/sqrt($1*$1+$2*$2)*$3)')B=$(echo $i $a $b | awk 'printf("%dn",$1*$2/$3)')在畫(huà)圓的程序中,利用了圓上的每個(gè)點(diǎn)到圓心的距離相等的定理,同樣利用awk來(lái)計(jì)算其他兩邊的大小從而畫(huà)出一個(gè)圓。前期制作的時(shí)候,在主界面如果按下回車會(huì)出現(xiàn)錯(cuò)誤,經(jīng)過(guò)一番研究,從網(wǎng)上找到了屏蔽回車鍵的代碼,stty igncr,這樣就解決了這個(gè)問(wèn)題。在主界面,光標(biāo)老是會(huì)一

21、直在閃,我就用了之前百度的echo的用法里面的一種,用echo e “033?25l”和echo e “033?25h”l來(lái)開(kāi)啟和關(guān)閉光標(biāo)的閃爍。5、制作與調(diào)試過(guò)程5.1、摸索實(shí)訓(xùn)剛開(kāi)始,毫無(wú)頭緒,shell本來(lái)以前就沒(méi)接觸過(guò),上課也就稍微帶了下,沒(méi)有深入看過(guò),于是開(kāi)始認(rèn)真看老師發(fā)下來(lái)的shell高級(jí)編程,通過(guò)上面的畫(huà)盒子例程終于弄懂了一點(diǎn)原理,于是就開(kāi)始做了。一開(kāi)始照著例程寫(xiě)完,運(yùn)行,沒(méi)效果。經(jīng)過(guò)一番分析,判定是終端過(guò)小,程序中有一判斷當(dāng)前終端能否畫(huà)下一個(gè)盒子,終端過(guò)小就會(huì)退出。調(diào)好終端,運(yùn)行程序,成功畫(huà)出了盒子,但是這個(gè)盒子是靜態(tài)的,不能滿足實(shí)訓(xùn)的可修改的要求,于是我分析了下完成這個(gè)程序需

22、要的知識(shí),然后一邊開(kāi)始認(rèn)真的看老師發(fā)的shell高級(jí)編程,一邊百度需要的功能要如何實(shí)現(xiàn)。5.2、略懂通過(guò)幾天的研究,對(duì)于畫(huà)盒子的程序基本都已經(jīng)看懂了。實(shí)際上就是利用for循環(huán)進(jìn)行循環(huán)的行自加和列自加來(lái)達(dá)到在指定的行上畫(huà)出兩行,在指定的列上畫(huà)出兩列,拼在一起就是一個(gè)方形了。而按下鍵盤(pán)控制方形大小,方形顏色,方形的邊,其實(shí)就是利用read來(lái)循環(huán)讀取鍵盤(pán)輸入就可以完成了。對(duì)于立體部分,其實(shí)我們只要在畫(huà)出五條邊,期中斜邊最難了,要進(jìn)行浮點(diǎn)運(yùn)算,通過(guò)百度得知要使用awk來(lái)計(jì)算,研究了一個(gè)晚上awk,終于懂了點(diǎn),可以進(jìn)行計(jì)算了。然后通過(guò)計(jì)算得出三角形的各邊長(zhǎng)度,進(jìn)行畫(huà)點(diǎn)就可以得到斜邊了。5.3、實(shí)踐有了一

23、定的知識(shí)基礎(chǔ),可以認(rèn)真從新開(kāi)始本次實(shí)訓(xùn)了?,F(xiàn)在重新看實(shí)訓(xùn)的要求,發(fā)現(xiàn)有了新的見(jiàn)解。于是我再次分析了下!提出了三種方案,再一番分析,最終決定用方案三。因?yàn)橛辛顺浞值膶W(xué)習(xí)和一些基礎(chǔ)知識(shí),很快就完成了程序。程序完成,開(kāi)始調(diào)試。調(diào)試的時(shí)候我發(fā)現(xiàn)程序還是有漏洞的,就是邊不能用*畫(huà)出來(lái)。用了很多種方法都無(wú)法解決這個(gè)問(wèn)題,雖然現(xiàn)在解決不了,但是我相信通過(guò)今后的學(xué)習(xí)一定能找到解決的辦法。還有就是一開(kāi)始的時(shí)候我用read nx的寫(xiě)法來(lái)讀取x個(gè)字符自動(dòng)跳轉(zhuǎn),可是當(dāng)我按下回車鍵就會(huì)出現(xiàn)異常字符,經(jīng)過(guò)一番分析,發(fā)現(xiàn)可以用stty igncr來(lái)屏蔽回車鍵來(lái)消除這個(gè)BUG。還有就是光標(biāo)老是會(huì)一閃一閃的,我就使用了echo e “033?25l”來(lái)取消光標(biāo)閃爍。最后的調(diào)試我只是優(yōu)化了一下程序讓程序運(yùn)行的更完美。6、實(shí)訓(xùn)心得體會(huì)本次實(shí)訓(xùn)算是我們學(xué)校第一次嵌入式操作系統(tǒng)實(shí)訓(xùn),以前的學(xué)長(zhǎng)學(xué)姐們都沒(méi)做過(guò)這個(gè)實(shí)訓(xùn),沒(méi)辦法得到可參考的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論