使用shell编写的魔幻盒子_第1页
使用shell编写的魔幻盒子_第2页
使用shell编写的魔幻盒子_第3页
使用shell编写的魔幻盒子_第4页
使用shell编写的魔幻盒子_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式操作系统实训报告学 号: 0952100111 姓 名: 陈胜 题 目: 魔幻盒子 指导老师: 韩桂民 2011年12月 28 日1、任务题目:魔幻盒子题目解释:使用SHELL编程写一个能用ASCII码字符组成的长宽可变的四边形2、性能、指标、要求:2.1、基本要求1)四边形绘图(40点*30点);2)边的ASCII字符可以在按下某个按键的情况下可以修改;3)四边形的四个角要求用不同的ASCII字符;4)四边形的大小可变;5)四边形的中间输出自己的姓名与学号;2.2、发挥部分老师要求:在按下某按键时能实现四边形的立体化自我发挥:1)姓名学号的颜色会随着时间的变化不断变化 2)可以将方形变成圆形3、方案设计3.1、方案论证 3.1.1关于画平面四边形:方案一:由老师所给的“shell高级编程”文本中学习到的画盒子的方法,通过获得要画四边形的左上角坐标和要画四边形的长和宽来达到在终端上画四边形的目的。方案二:改编方案一的程序,将左上角的坐标固定,只需要长和宽就能在终端上画出四边形。方案三:自己通过实践想到的一个方法,获取当前终端大小,然后求出当前终端的中点位置,给出长和宽,以终端中点为中心画出一个四边形。最终我决定使用方案三,前两种方案都可以画出盒子,但是在实现立体的时候容易超出终端,而第三种可以比较容易的定义一个条件来限制超出。3.1.2关于画立体的斜边:方案一:直接使用最笨的方法,在要画斜边的角的位置,然后行减一、列加一,达到画出一条斜线的目的。方案二:使用勾股定理算出边的比例,然后通过比例确定坐标来画出斜边上的点。这样就可以画出不同斜率的线。而且可以自由设置斜边的长度。我选择的是方案二,方案一虽然很简单,而且易懂,但是是投机取巧的,而且斜边的大小和斜边的斜率不可调。这样对之后如果想进行图像变换也不容易,所以最终选择使用方案二3.2、工作原理 3.2.1 相关知识3.2.1.1本次实训所使用的平台:Linux操作系统Linux简介:Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。3.2.1.2本次实训使用的编程语言:ShellShell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。3.2.1.3 AWKAWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。 AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。3.2.2程序中比较用的比较多的语句echo:shell中的输出,与C中的printf很类似。本程序中用到的echo指令有很多种。-e:启用反斜线控制字符的转换(具体看下面)-n:取消行末换行关于 echo 命令所支持的反斜线控制字符如下:a:ALERT / BELL (从系统喇叭送出铃声) b:BACKSPACE ,也就是向左删除键 c:取消行末之换行符号 E:ESCAPE,跳脱键 f:FORMFEED,换页字符 n:NEWLINE,换行字符 r:RETURN,回车键 t:TAB,表格跳位键 v:VERTICAL TAB,垂直表格跳位键 n:ASCII 八进位编码(以 x 开首为十六进制) :反斜线本身echo e “Ea;bH”c的意思是在终端的第a行c列的位置输出cecho e “Eam”的意思是前景色,其中a=30时为黑色,31时为红色,32绿色,。40为黑色背景,31是红色背景,。0为变回最初颜色echo e “033?25l”是隐藏光标 echo e “033?25h”显示光标read:读取的命令-s:不在终端上打印输出的内容-n加数字:代表键盘输入到多少位时自动读取,不用按回车-t:带上时间参数可以控制读取的时间,当达到指定的时间时自动停止读取 A=$(echo $a | awk printf(“%d”,$1) 将a代入awk中运算,讲运算结果以整形输出到A。tput lines:获取当前终端的行数。tput cols:获取当前终端的列数。tput cup x y:将光标移动到x行y列处stty igncr:忽略回车符stty -igncr:解除忽略回车符clear:清楚当前终端的内容exit:退出4、软件设计主循环代码:#mainecho -e 033?25lW=30H=20Z=|Y=|S=-X=-C=0colour1=0draw_zhujiemianstty igncrwhile truedoecho -e E3$colour1mdraw_dot $MROW-1 $MCOL-5 chenshengdraw_dot $MROW $MCOL-5 0952100111echo -e E0mwhile read -n1 -t 2 adoif $a = 1 thencleardraw_box $W $H $Z $Y $S $X $Cecho -e E3$colour1mdraw_dot $MROW-1 $MCOL-5 chenshengdraw_dot $MROW $MCOL-5 0952100111echo -e E0mstty -igncrtput cup $ROW-3 0read -p High: hread -p Wide: wH=$hW=$wstty igncrdraw_zhujiemianfiif $a = 2 thencolour_jiemianwhile read -n1 -s bdoif $b = 0 thencolour_jiemianfiif $b = 1 then colour_jiemian fiif $b = 2 then colour_jiemian fiif $b = 3 then colour_jiemian fiif $b = 4 thendraw_zhujiemian break fidonefiif $a = 3 thencleardraw_box $W $H $Z $Y $S $X $Cecho -e E3$colour1m draw_dot $MROW-1 $MCOL-5 chensheng draw_dot $MROW $MCOL-5 0952100111 echo -e E0mtput cup $ROW-6 0stty -igncrread -p Up: Uread -p Down: Dread -p Left: Lread -p Right: Rstty igncrS=$UX=$DZ=$LY=$Rdraw_zhujiemianfiif $a = 4 thencleardraw_box $W $H $Z $Y $S $X $Cecho -e E3$colour1m draw_dot $MROW-1 $MCOL-5 chensheng draw_dot $MROW $MCOL-5 0952100111 echo -e E0ma=1 b=1 x=10 A=$(echo $a $b $x | awk printf(%dn,$1/sqrt($1*$1+$2*$2)*$3)LRs=$Rs-$ALCz=$Cz+$ALCy=$Cy+$Aecho -e E3$Cmpd=1for(c=$LCz; pd=$W*2; c+)dodraw_dot $LRs $c $Slet pd=pd+1donepd=1for(r=$LRs; pd=$H; r+)dodraw_dot $r $LCy $Ylet pd=pd+1donepd=1y1=$Czy2=$Cyx1=$Rxx2=$Rsa=1b=1x=10A=$(echo $a $b $x | awk printf(%dn,$1/sqrt($1*$1+$2*$2)*$3)for(i=0;i=$A;i+)do B=$(echo $i $a $b | awk printf(%dn,$1*$2/$3) echo -e E$x2-$B;$y1+$iHaecho -e E$x2-$B;$y2+$iHbecho -e E$x1-$B;$y2+$iHddonetput cup $ROW-2 1stty -igncrecho -e E0mread -s -p Press ENTER to return!draw_zhujiemianstty igncrecho -e E0mfiif $a = 5 thencleardraw_boll $H/2echo -e E3$colour1m draw_dot $MROW-1 $MCOL-5 chensheng draw_dot $MROW $MCOL-5 0952100111 echo -e E0mstty -igncrread -sstty igncrdraw_zhujiemianfiif $a = 0 thenstty -igncrclearecho -e 033?25hexit 0fidonelet colour1=colour1+1if $colour1 = 6 thencolour1=0fidone主循环流程图:图1:主流程图开始变量初始化画盒子画名字、学号等待按键2秒名字颜色变量+1,假如颜色变量等于6,颜色变量归0无按键有按键按1输入要修改的长、宽大小画盒子等待按键根据按键修改颜色参数按2输入各边的ASCII字符按3根据输入修改边变量画出立体的五条边按4等待回车键按5退出画出圆形等待回车键画盒子的程序流程:用了两个for循环来画出四条边,流程图如下:具体程序:echo You Terminal is too small! stty -igncr exit 1fi if $1 -lt 10 | $2 -lt 3 then clear echo box is too small stty -igncr exit 2 fi MROW=$ROW/2 MCOL=$COL/2 Rs=$MROW-$2/2 Cz=$MCOL-$1/2 Rx=$Rs+$2-1 Cy=$Cz+$1-1 pd=1 echo -ne E3$7m for(r=$Rs;pd=$2;r+) do draw_dot $r $Cz $3 draw_dot $r $Cy $4 let pd=pd+1donepd=1for(c=$Cz;pd=$1;c+)dodraw_dot $Rs $c $5 draw_dot $Rx $c $6 let pd=pd+1done在立体盒子的时候,用了勾股定理来求出三角形的三条边。其中计算勾股定理的时候用了awk,利用awk进行浮点运算。具体算法程序如下:a=1 b=1 x=10A=$(echo $a $b $x | awk printf(%dn,$1/sqrt($1*$1+$2*$2)*$3)B=$(echo $i $a $b | awk printf(%dn,$1*$2/$3)在画圆的程序中,利用了圆上的每个点到圆心的距离相等的定理,同样利用awk来计算其他两边的大小从而画出一个圆。前期制作的时候,在主界面如果按下回车会出现错误,经过一番研究,从网上找到了屏蔽回车键的代码,stty igncr,这样就解决了这个问题。在主界面,光标老是会一直在闪,我就用了之前百度的echo的用法里面的一种,用echo e “033?25l”和echo e “033?25h”l来开启和关闭光标的闪烁。5、制作与调试过程5.1、摸索实训刚开始,毫无头绪,shell本来以前就没接触过,上课也就稍微带了下,没有深入看过,于是开始认真看老师发下来的shell高级编程,通过上面的画盒子例程终于弄懂了一点原理,于是就开始做了。一开始照着例程写完,运行,没效果。经过一番分析,判定是终端过小,程序中有一判断当前终端能否画下一个盒子,终端过小就会退出。调好终端,运行程序,成功画出了盒子,但是这个盒子是静态的,不能满足实训的可修改的要求,于是我分析了下完成这个程序需要的知识,然后一边开始认真的看老师发的shell高级编程,一边百度需要的功能要如何实现。5.2、略懂通过几天的研究,对于画盒子的程序基本都已经看懂了。实际上就是利用for循环进行循环的行自加和列自加来达到在指定的行上画出两行,在指定的列上画出两列,拼在一起就是一个方形了。而按下键盘控制方形大小,方形颜色,方形的边,其实就是利用read来循环读取键盘输入就可以完成了。对于立体部分,其实我们只要在画出五条边,期中斜边最难了,要进行浮点运算,通过百度得知要使用awk来计算,研究了一个晚上awk,终于懂了点,可以进行计算了。然后通过计算得出三角形的各边长度,进行画点就可以得到斜边了。5.3、实践有了一定的知识基础,可以认真从新开始本次实训了。现在重新看实训的要求,发现有了新的见解。于是我再次分析了下!提出了三种方案,再一番分析,最终决定用方案三。因为有了充分的学习和一些基础知识,很快就完成了程序。程序完成,开始调试。调试的时候我发现程序还是有漏洞的,就是边不能用*画出来。用了很多种方法都无法解决这个问题,虽然现在解决不了,但是我相信通过今后的学习一定能找到解决的办法。还有就是一开始的时候我用read nx的写法来读取x个字符自动跳转,可是当我按下回车键就会出现异常字符,经过一番分析,发现可以用stty igncr来屏蔽回车键来消除这个BUG。还有就是光标老是会一闪一闪的,我就使用了echo e “033?25l”来取消光标闪烁。最后的调试我只是优化了一下程序让程序运行的更完美。6、实训心得体会本次实训算是我们学校第一次嵌入式操作系统实训,以前的学长学姐们都没做过这个实训,没办法得到可参考的程序。课堂上对于SHELL编程的介绍又不多,这次实训我们这种刚接触SHELL编程的菜鸟来说还是有一点难度的。但是没有难点是无法克服的,老师提供了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论