题目:魔幻盒子

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

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

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

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

嵌入式操作系统--魔幻盒子相关推荐

  1. shell魔幻盒子_嵌入式操作系统实训报告——魔幻盒子

    附录1:程序清单 #!/bin/bash #---------- 初始化参数定义----------# HLine=20 ## 横线长度 SLine=10 ## 竖线长度 draw_colour=34 ...

  2. 嵌入式操作系统和普通操作系统的区别_嵌入式ARM和单片机的区别何在

    1.软件方面 这应该是最大的区别了.引入了操作系统.为什么引入操作系统?有什么好处嘛? 1)方便.主要体现在后期的开发,即在操作系统上直接开发应用程序.不像单片机一样一切都要重新写.前期的操作系统移植 ...

  3. 本科生学习fpga,dsp,嵌入式操作系统哪个好

    本科生的话,建议做软件方向的嵌入式系统,即利用现有的芯片和操作系统(开源的非开源的都可以)进行开发.嵌入式没有竞争相对小的方向,不管你搞什么,今天无限风光,明天就有可能寄人篱下.希望楼主在选择之前首先 ...

  4. 实验6Linux系统开发环境,哈工大嵌入式操作系统课件—6 Linux开发环境1-linux基.ppt...

    <哈工大嵌入式操作系统课件-6 Linux开发环境1-linux基.ppt>由会员分享,可在线阅读,更多相关<哈工大嵌入式操作系统课件-6 Linux开发环境1-linux基.ppt ...

  5. 优先级调度算法实现_一篇讲透嵌入式操作系统任务调度

    进互联网公司操作系统和网络库是基础技能,面试过不去的看,这里基于嵌入式操作系统分几章来总结一下任务调度.内存分配和网络协议栈的基础原理和代码实现. 处理器上电时会产生一个复位中断,接下来会执行复位中断 ...

  6. 国产嵌入式操作系统发展思考

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 作者 | 何小庆 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 嵌入 ...

  7. 嵌入式操作系统 NuttX 5.0 发布

    Nuttx 是一个实时嵌入式操作系统(RTOS),它有一个小巧是在微控制器的环境中使用.这是完全可扩展,从小型(8位)至中型嵌入式(32位)系统.它的目的还 在于要完全符合标准,完全实时,并完全开放. ...

  8. [渝粤教育] 中国地质大学 嵌入式操作系统 复习题 (2)

    <嵌入式操作系统>模拟题 一.单选题 1./babys目录属于project群组(group)并设置了1770的访问权限.而project群组的成员如下: #group dog cat f ...

  9. linux 磁盘科隆,上海第二工业大学嵌入式操作系统B复习(无答案版)

    嵌入式操作系统B复习 答疑时间6月18日9:00-14:00,15#518 填空题20分,选择题20分,判断题10分,简答题20分,实验题30分. 一.填空题 1.ARM中断处理有哪两种中断模式.快速 ...

最新文章

  1. 滑动轮播图实现最后一张图片无缝衔接第一张图片
  2. git 提交 merge请求 WIP
  3. 操作系统:基本分页存储管理方式
  4. Python报错:IndentationError: expected an indented block
  5. CodeForces - 1459D Glass Half Spilled(dp)
  6. 你真的不了解这个地球
  7. 7-35 情人节 (15 分)
  8. JS调用模式以及bind()方法
  9. Windows 2000命令行如何查看进程PID和杀进程
  10. 力扣-674 最长连续递增序列
  11. 【matlab算法原理详解】车牌识别算法
  12. 计算机数学基础⑤(Graphs)
  13. 从word2vec到node2vec
  14. C++课堂笔记0716
  15. java jen部署_CSS布局:Jen Simmons的网格,区域和@Supports
  16. 微信红包.....真的是抢的越晚越好吗
  17. 烂泥:IE10浏览器兼容模式
  18. [开箱评测]KZ ZSN 圈铁入耳式耳机
  19. Python 短信通知系统开发实战
  20. ​力扣解法汇总792. 匹配子序列的单词数

热门文章

  1. 华北科技学院转专业计算机,2021年华北科技学院大一新生转专业及入学考试相关规定...
  2. 每日分享(微信社区小程序/h5/圈子论坛贴吧交友/博客/社交)
  3. U盘病毒mydocuments.exe查杀办法总结
  4. PythonChallenge过关斩将录-0~10关
  5. MySQL日记——索引优化
  6. 第三章 外科手术队伍
  7. sqqyw(淡然点图标系统)漏洞复现和74cms漏洞复现
  8. JVM是如何执行方法调用的?
  9. 国内能否炒伦敦金,2023国际十大正规伦敦金交易平台排名
  10. vscode中,中文标题符号带红色框是什么插件,或者什么原因导致的。