加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

嵌入式操作系統(tǒng)-魔幻盒子:使用shell腳本編寫程序,用ASCII碼字符設(shè)計(jì)一個(gè)長(zhǎng)寬可變的四邊形

08/16 09:20
1457
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

題目:魔幻盒子

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)要求

  1. 基本要求
  1. 四邊形的繪圖(40點(diǎn)*30點(diǎn))
  2. 邊的ASCII字符可以在按下某按鍵的情況下可以修改(如從“-”-> “*”)
  3. 四邊形的四個(gè)角要求用不同的ASCII字符
  4. 四邊形的大小可變
  5. 四邊形中間輸出自己的姓名與學(xué)號(hào)
  6. 在按下某按鍵的情況下四邊形的顏色可變

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)見諒。

  • 有需要資料的可了解一下.docx

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
SME2470-021 1 Honeywell Microelectronics & Precision Sensors Photo Transistor Detector, Surface Mount, 3.81 X 2.54 X 2.10 MM, CERAMIC PACKAGE-SME2470
$7.64 查看
SY89831UMG 1 Microchip Technology Inc 89831 SERIES, LOW SKEW CLOCK DRIVER, 4 TRUE OUTPUT(S), 0 INVERTED OUTPUT(S), QCC16
$8.59 查看
CPC1510GSTR 1 IXYS Corporation Transistor Output SSR, 1-Channel, 3750V Isolation, SURFACE MOUNT PACKAGE-6
$2.3 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜