題目:魔幻盒子
1? 系統(tǒng)設(shè)計
1.1 設(shè)計要求
1.1.1 設(shè)計任務(wù)
以VM ware虛擬機(jī)軟件和Red hat 9.0操作系統(tǒng)為平臺,使用shell腳本編寫程序,用ASCII碼字符設(shè)計一個長、寬可變的四邊形。要求使用linux shell編寫程序腳本(Bash風(fēng)格),并提供友好的的交互界面。
1.1.2 性能指標(biāo)要求
- 基本要求
- 四邊形的繪圖(40點*30點)
- 邊的ASCII字符可以在按下某按鍵的情況下可以修改(如從“-”-> “*”)
- 四邊形的四個角要求用不同的ASCII字符
- 四邊形的大小可變
- 四邊形中間輸出自己的姓名與學(xué)號
- 在按下某按鍵的情況下四邊形的顏色可變
2、發(fā)揮部分
在按下某按鍵實現(xiàn)四邊形的立體化。
1.2 設(shè)計思路及設(shè)計框圖
1.2.1設(shè)計思路
一開始選這個題目時,可以說是完全不懂。但是,通過這學(xué)期所學(xué)的嵌入式Ubuntu應(yīng)用編程實戰(zhàn)這本書以及按照老師給的要求去查資料,開始慢慢的了解實訓(xùn)所需要做的大概是怎么一回事,在linux系統(tǒng)中,利用畫圖函數(shù)draw_char控制ASCII碼字符畫出一個長寬可變,邊框符號可變,顏色可變和輸出自己學(xué)號姓名的四邊形,同時這個四邊形實現(xiàn)立體化。
在畫圖開始時,先把之前所畫的四邊形清除,所以必須先進(jìn)行清屏。接著按照要求要使所畫的四邊形的初始大小為40點*30點,所以給四邊形的長和寬定義倆個初始量,分別為40和30,并且四邊形的大小可變,就需要給四邊形的長和寬倆個變量賦值,每畫一個四邊形就需要重新給長和寬賦值。然后改變四邊形的邊的ASCII字符,只需要給四條邊定義四個不同的變量。而改變四邊形的顏色,只需要調(diào)用哪個顏色的函數(shù),然后通過輸入選擇數(shù)字來改變四邊形的顏色。為控制不同的變化,則需要設(shè)定不同的case語句或if語句來進(jìn)行相應(yīng)的變化。要想實現(xiàn)四邊形的立體化,需要在之前畫好的四邊形的基礎(chǔ)上在畫三條斜線,一條橫線和一條豎線共五條線來實現(xiàn)四邊形的立體化。
同時設(shè)置變量來實現(xiàn)四邊形立體化后改變大小。
1.2.2總體設(shè)計框圖
2? 各個模塊程序的設(shè)計
2.1 初始化定義
clear?????????????????????????????????????????? #清屏
R=5????????????????????????????????????????? ???#定義起始橫坐標(biāo)
C=10????????????????????????????????????????? ??#定義起始縱坐標(biāo)
H=30????????????????????????????????????????? ??#定義初始四邊形的寬
W=40????????????????????????????????????????? ??#定義初始四邊形的長
col=0?????????????????????????????????????????? #定義初始四邊形的顏色
HORZ="-"???????????????????????????????????? ???#定義初始四邊形邊ASCII字符
VERT="|"
D=0
let W=$W+$W????????????????????????????????? ???#四邊形長寬比為1:1.9
draw_box $R $C $H $W $col $HORZ $VERT
2.2draw_box畫圖函數(shù)
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines`????????? ????????????????????#獲取終端的寬? 行列寬長
T_COLS=`tput cols`????????? ?????????????????????#獲取終端的長
plot_char(){
echo -e "E[${1};${2}H"$3???? ???????????????????#啟用轉(zhuǎn)義序列,將光標(biāo)移動到$1和$2所定位處,輸出$3
}???????????????????????????????????? #設(shè)置顏色的格式: e[背景色;前景色;高亮m
echo -ne "E[3${5}m"?????????? #盒子的顏色不換行輸出可帶參數(shù)-e???? 打開反斜杠ESC轉(zhuǎn)義-E???? 取消反斜杠ESC轉(zhuǎn)義
count=1???????????????????????? ????????????????????#畫第一條豎線
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
done
count=1???????????????????? ???????????#畫第二條豎線
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
done
count=1???????????????????????? ???????#畫第一條橫線
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
done
count=1?????????????????????? ?????????#畫第二條橫線
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
Done
2.3立體化程序
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines`
T_COLS=`tput cols`
plot_char(){
echo -e "E[${1};${2}H"$3
}
echo -ne "E[3${5}m"
count=1????????????????????????? ?????#畫第一條豎線
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
done
count=1???????????????????????????? ??#畫第二條豎線
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
done
count=1???????????????????????????? ??#畫第一條橫線
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
done
count=1???????????????????????????? ??#畫第二條橫線
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
done
while [[ "$D" -gt 0 ]]; do????????????????? #判斷是否實現(xiàn)立體化
count=1???????????????????????? ????????#畫第一條斜線
temp=$2
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1?????????????????????????? ??????#畫第二條斜線
temp=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1????????????????????????? ???????#畫第三條斜線
r=`expr $1 + $BOX_HEIGHT`
temp=`expr $2 + $BOX_WIDTH`
for (( r; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1??????????????????????? ?????????#畫橫線
r=`expr $1 - 4`
temp=`expr $2 + 4`
for (( temp; count<=$BOX_WIDTH; temp++)); do
plot_char $r $temp $HORZ
let count=count+1
done
count=1??????????????????????? ????????#畫豎線
r=`expr $1 - 4`
temp=`expr $2 + 4 + $BOX_WIDTH`
for (( r; count<=$BOX_HEIGHT; r++)); do
plot_char $r $temp $VERT
let count=count+1
done
plot_char `expr $1 - 4` `expr $2 + 4` E
plot_char `expr $1 - 4` `expr $2 + $BOX_WIDTH + 4` F
plot_char `expr $1 - 4 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH + 4` G
let D=D-1
done
echo -ne "E[0m"
P_ROWS=`expr $T_ROWS - 1`
echo -e "E[${P_ROWS};1H"
}
2.4四邊形四個角的ASCII字符和名字學(xué)號
plot_char $1 $2 A
plot_char $1 `expr $2 + $BOX_WIDTH` B
plot_char `expr $1 + $BOX_HEIGHT` $2 C
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` D
plot_char `expr $1 + $3 / 2 - 1` `expr $2 + $4 / 2 - 5` 1852200224
plot_char `expr $1 + $3 / 2 + 1` `expr $2 + $4 / 2 - 5` lanweihai
2.5輸出語句部分
while [[ $n -eq 1 ]]; do
echo "please input the number:"
echo "1. please input the HEIGHT and WIDTH:"???? ?????#改變四邊形的長和寬
echo "2. please input the HORZ and VERT:"????????? ???#改變四邊形邊的ASCII字符
echo "3. please input the color:"???????????????????? #改變四邊形的顏色
echo "d. D=1"???????????????????????????????? ????????#判斷是否實現(xiàn)立體
echo e. Exit???????????????????????????????? ?????????#退出
echo "please input the number: "
read NUM
case $NUM in
$n1)
echo "please input the HEIGHT and WIDTH:"
read HEIGHT WIDTH
H=$HEIGHT W=$WIDTH
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n2)
echo "please input the HORZ and VERT:"
read HORZ VERT
HORZ=$HORZ VERT=$VERT
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n3)
echo "please input the color:"
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
echo -ne "E[3${5}m"
read COLOR_NUM
col=$COLOR_NUM
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$d)
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
read COLOR_NUM
col=$COLOR_NUM
D=1 ;;
$e) exit;;
esac
clear
draw_box $R $C $H $W $col $HORZ $VERT
3? 調(diào)試過程
我在實訓(xùn)的過程中碰到許多問題,因為是剛學(xué)的嵌入式編程,對很多函數(shù)都不是很了解,出現(xiàn)了比較多的問題。比如經(jīng)常會顯示/bash錯誤。經(jīng)過多次修改,知道了這個一般是我們在計算函數(shù)中,加了多余的空格或者其他的字符,或者是‘’符號中不小心添加了其他的字符,讓計算函數(shù)出錯。借鑒了以前學(xué)長的程序,在此基礎(chǔ)的完成了基本功能和擴(kuò)展功能。
4? 功能測試
4.1 測試儀器與設(shè)備
PC機(jī)一臺, VMwareWorkstion軟件以及READHAT9.0操作系統(tǒng)。
4.2 性能指標(biāo)測試
(1)實現(xiàn)了四邊形40*30的繪圖。
(2)邊的ASCII字符可以隨意改變。
(3)四邊形的四個角分別用了不同的ASCII字符來表示
(4)四邊形的長和寬可以任意改變大小
(5)四邊形的中間輸出了自己的學(xué)號和姓名。
(6)實現(xiàn)了四邊形的立體化
(7)立體可以改變顏色
5? 實訓(xùn)心得體會
本次做的嵌入式程序設(shè)計實訓(xùn)---魔幻盒子,是利用shell腳本基礎(chǔ)功能實現(xiàn)的。經(jīng)過了兩周的嵌入式實訓(xùn),讓我對嵌入式Ubuntu應(yīng)用編程實戰(zhàn)這門課有了更深的認(rèn)識,同時也是我學(xué)會了許多關(guān)于嵌入式shell語句的知識。這是第一次學(xué)習(xí)有關(guān)于嵌入式的課程,有很多不懂的地方,但通過各種渠道還是有了解到許多關(guān)于這方面的知識,做出來后也有一定的成就感。,
在做實訓(xùn)的過程中,我意識到了知識儲備的重要性,只有對嵌入式知識有一定程度的了解,才能夠探索更深層次的東西,并能夠解決問題。經(jīng)過嵌入式實訓(xùn)后,發(fā)現(xiàn)還有很多欠缺的知識,希望通過努力,讓自己的知識儲備能更厚實。
這次的嵌入式實訓(xùn)對我來說是一個全新的挑戰(zhàn),它是通過這學(xué)期所學(xué)的Liunx系統(tǒng)來設(shè)計和操作的,在寫函數(shù)的時候,我遇到了很多問題,同時也了解了shell語句的嚴(yán)謹(jǐn),稍微有點錯誤就會報錯。以前一直覺得linux系統(tǒng)沒什么作用,程序又難以理解,最重要的是不夠人性化,不能使用鼠標(biāo)進(jìn)行操作。復(fù)制,移動等基本操作都要使用指令來完成,對我來說感到極其不適應(yīng)。經(jīng)過這次的實訓(xùn),我對linux操作系統(tǒng)有了重新的認(rèn)識,程序能直接在終端運(yùn)行,無需通過第三方軟件來實現(xiàn),想要對系統(tǒng)進(jìn)行修改也更方便容易。
這次的實訓(xùn)讓自己再一次的感受到了自己在程序設(shè)計上的知識儲備不足,在今后的學(xué)習(xí)中,我要更加注重理論知識的學(xué)習(xí),希望能懂得更多的知識,并且要理解透徹,能夠把知識為我所用。我會努力加油的!感謝老師和同學(xué)給予我的幫助!
附錄
附錄1:仿真波形圖
初始四邊形(40*30)
改變四邊形的大小(20*30)
改變四邊形的邊的ASCII字符
改變四邊形的顏色
四邊形立體化并改變顏色
附錄2:程序清單
#!/bin/bash
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines`
T_COLS=`tput cols`
plot_char(){
echo -e "E[${1};${2}H"$3
}
echo -ne "E[3${5}m"
count=1
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
Done
count=1
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
Done
count=1
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
Done
count=1
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
done
while [[ "$D" -gt 0 ]]; do
count=1
temp=$2
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
temp=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
r=`expr $1 + $BOX_HEIGHT`
temp=`expr $2 + $BOX_WIDTH`
for (( r; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
r=`expr $1 - 4`
temp=`expr $2 + 4`
for (( temp; count<=$BOX_WIDTH; temp++)); do
plot_char $r $temp $HORZ
let count=count+1
done
count=1
r=`expr $1 - 4`
temp=`expr $2 + 4 + $BOX_WIDTH`
for (( r; count<=$BOX_HEIGHT; r++)); do
plot_char $r $temp $VERT
let count=count+1
done
plot_char `expr $1 - 4` `expr $2 + 4` E
plot_char `expr $1 - 4` `expr $2 + $BOX_WIDTH + 4` F
plot_char `expr $1 - 4 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH + 4` G
let D=D-1
done
plot_char $1 $2 A
plot_char $1 `expr $2 + $BOX_WIDTH` B
plot_char `expr $1 + $BOX_HEIGHT` $2 C
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` D
plot_char `expr $1 + $3 / 2 - 1` `expr $2 + $4 / 2 - 5` 1852200224
plot_char `expr $1 + $3 / 2 + 1` `expr $2 + $4 / 2 - 5` lanweihai
echo -ne "E[0m"
P_ROWS=`expr $T_ROWS - 1`
echo -e "E[${P_ROWS};1H"
}
clear
R=5
C=10
H=30
W=40
col=0
HORZ="-"
VERT="|"
D=0
let W=$W+$W
draw_box $R $C $H $W $col $HORZ $VERT
n1=1
n2=2
n3=3?????????????????????????????? ???????????????????????????????????????????????????????????????????????????????d='d'
e='e'
n=1;
while [[ $n -eq 1 ]]; do
echo "please input the number:"
echo "1. please input the HEIGHT and WIDTH:"
echo "2. please input the HORZ and VERT:"
echo "3. please input the color:"
echo "d. D=1"
echo e. exit
echo "please input the number: "
read NUM
case $NUM in
$n1)
echo "please input the HEIGHT and WIDTH:"
read HEIGHT WIDTH
H=$HEIGHT W=$WIDTH
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n2)
echo "please input the HORZ and VERT:"
read HORZ VERT
HORZ=$HORZ VERT=$VERT
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n3)
echo "please input the color:"
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
echo -ne "E[3${5}m"
read COLOR_NUM
col=$COLOR_NUM
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$d)
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
read COLOR_NUM
col=$COLOR_NUM
D=1 ;;
$e) exit;;
esac
clear
draw_box $R $C $H $W $col $HORZ $VERT
done;
exit 0
需要完整的資料可在資源里下載。
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳點擊用微信打開即可,過程有點繁瑣請見諒。