加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

嵌入式操作系统-魔幻盒子:使用shell脚本编写程序,用ASCII码字符设计一个长宽可变的四边形

08/16 09:20
413
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

题目:魔幻盒子

1  系统设计

1.1 设计要求

1.1.1 设计任务

以VM ware虚拟机软件和Red hat 9.0操作系统为平台,使用shell脚本编写程序,用ASCII码字符设计一个长、宽可变的四边形。要求使用linux shell编写程序脚本(Bash风格),并提供友好的的交互界面。

1.1.2 性能指标要求

  1. 基本要求
  1. 四边形的绘图(40点*30点)
  2. 边的ASCII字符可以在按下某按键的情况下可以修改(如从“-”-> “*”)
  3. 四边形的四个角要求用不同的ASCII字符
  4. 四边形的大小可变
  5. 四边形中间输出自己的姓名与学号
  6. 在按下某按键的情况下四边形的颜色可变

2、发挥部分

在按下某按键实现四边形的立体化。

1.2 设计思路及设计框图

1.2.1设计思路

一开始选这个题目时,可以说是完全不懂。但是,通过这学期所学的嵌入式Ubuntu应用编程实战这本书以及按照老师给的要求去查资料,开始慢慢的了解实训所需要做的大概是怎么一回事,在linux系统中,利用画图函数draw_char控制ASCII码字符画出一个长宽可变,边框符号可变,颜色可变和输出自己学号姓名的四边形,同时这个四边形实现立体化。

在画图开始时,先把之前所画的四边形清除,所以必须先进行清屏。接着按照要求要使所画的四边形的初始大小为40点*30点,所以给四边形的长和宽定义俩个初始量,分别为40和30,并且四边形的大小可变,就需要给四边形的长和宽俩个变量赋值,每画一个四边形就需要重新给长和宽赋值。然后改变四边形的边的ASCII字符,只需要给四条边定义四个不同的变量。而改变四边形的颜色,只需要调用哪个颜色的函数,然后通过输入选择数字来改变四边形的颜色。为控制不同的变化,则需要设定不同的case语句或if语句来进行相应的变化。要想实现四边形的立体化,需要在之前画好的四边形的基础上在画三条斜线,一条横线和一条竖线共五条线来实现四边形的立体化。

同时设置变量来实现四边形立体化后改变大小。

1.2.2总体设计框图

2  各个模块程序的设计

2.1 初始化定义

clear                                           #清屏

R=5                                             #定义起始横坐标

C=10                                            #定义起始纵坐标

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画图函数

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                        #启用转义序列,将光标移动到$1和$2所定位处,输出$3

}                                     #设置颜色的格式: e[背景色;前景色;高亮m

echo -ne "E[3${5}m"           #盒子的颜色不换行输出可带参数-e     打开反斜杠ESC转义-E     取消反斜杠ESC转义

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                  #判断是否实现立体化

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字符和名字学号

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"                                         #判断是否实现立体

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  调试过程

我在实训的过程中碰到许多问题,因为是刚学的嵌入式编程,对很多函数都不是很了解,出现了比较多的问题。比如经常会显示/bash错误。经过多次修改,知道了这个一般是我们在计算函数中,加了多余的空格或者其他的字符,或者是‘’符号中不小心添加了其他的字符,让计算函数出错。借鉴了以前学长的程序,在此基础的完成了基本功能和扩展功能。

4  功能测试

4.1 测试仪器与设备

PC机一台, VMwareWorkstion软件以及READHAT9.0操作系统。

4.2 性能指标测试

(1)实现了四边形40*30的绘图。

(2)边的ASCII字符可以随意改变。

(3)四边形的四个角分别用了不同的ASCII字符来表示

(4)四边形的长和宽可以任意改变大小

(5)四边形的中间输出了自己的学号和姓名。

(6)实现了四边形的立体化

(7)立体可以改变颜色

5  实训心得体会

本次做的嵌入式程序设计实训---魔幻盒子,是利用shell脚本基础功能实现的。经过了两周的嵌入式实训,让我对嵌入式Ubuntu应用编程实战这门课有了更深的认识,同时也是我学会了许多关于嵌入式shell语句的知识。这是第一次学习有关于嵌入式的课程,有很多不懂的地方,但通过各种渠道还是有了解到许多关于这方面的知识,做出来后也有一定的成就感。,

在做实训的过程中,我意识到了知识储备的重要性,只有对嵌入式知识有一定程度的了解,才能够探索更深层次的东西,并能够解决问题。经过嵌入式实训后,发现还有很多欠缺的知识,希望通过努力,让自己的知识储备能更厚实。

这次的嵌入式实训对我来说是一个全新的挑战,它是通过这学期所学的Liunx系统来设计和操作的,在写函数的时候,我遇到了很多问题,同时也了解了shell语句的严谨,稍微有点错误就会报错。以前一直觉得linux系统没什么作用,程序又难以理解,最重要的是不够人性化,不能使用鼠标进行操作。复制,移动等基本操作都要使用指令来完成,对我来说感到极其不适应。经过这次的实训,我对linux操作系统有了重新的认识,程序能直接在终端运行,无需通过第三方软件来实现,想要对系统进行修改也更方便容易。

这次的实训让自己再一次的感受到了自己在程序设计上的知识储备不足,在今后的学习中,我要更加注重理论知识的学习,希望能懂得更多的知识,并且要理解透彻,能够把知识为我所用。我会努力加油的!感谢老师和同学给予我的帮助!

附录

附录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

需要完整的资料可在资源里下载。

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
TJA1040T/CM,118 1 NXP Semiconductors TJA1040 - High-speed CAN transceiver with standby mode SOIC 8-Pin

ECAD模型

下载ECAD模型
$2.24 查看
TCMT4100T0 1 Vishay Intertechnologies Optocoupler - Transistor Output, TRANSISTOR OUTPUT OPTOCOUPLER

ECAD模型

下载ECAD模型
$2.16 查看
SN74LVC1G17DCKRG4 1 Texas Instruments Single 1.65-V to 5.5-V buffer with Schmitt-Trigger inputs 5-SC70 -40 to 125

ECAD模型

下载ECAD模型
$0.36 查看

相关推荐

电子产业图谱