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