课程设计说明书计算机组成原理算法实现(四)专业 计算机科学与技术学生姓名 王亚飞 班级 D 计算机132 学号1320704223 指导教师 花小朋 完成日期2016年1月22日1 课程设计目的本课程设计是在学完本课程教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的计算机组成原理课程基本知识,进一步领会计算机组成原理的一些算法,并进行具体实现,提高分析问题、解决问题的综合应用能力。
2 课程设计内容与要求2.1 题目计算机组成原理算法实现(四)2.2 功能能够实现机器数的真值还原(定点小数)、定点小数的单符号位补码加减运算、定点小数的补码乘法运算和浮点数的加减运算。
(1)系统进入(主)窗体的设计:菜单需要在输入口令正确后方可激活使用。
口令输入错误时要给出重新输入口令的提示。
(2)选择主窗体中“定点小数真值还原”时进入下图所示的窗体:在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。
输入一个定点小数形式的机器数(如:1.1001)后,按“原—〉真值”、“反—〉真值”、“补—〉真值”或“移—〉真值”按钮中的任一个后,将在第二个文本框中显示对应的真值。
选择“返回”按钮时回到主窗体。
(3)选择主窗体中的“定点小数单符号位补码加减运算”时进入如下图所示的窗体:操作时首先选择“输入”按钮输入参与运算的数据,然后再选操作按钮。
当单击“加法”、“减法”第三、四个文本框显示对应的结果。
选择“返回”按钮时回到主窗体。
(4)选择主窗体中的“定点小数原码乘法”时进入如下图所示的窗体:操作时首先选择“输入”按钮输入参与运算的数据,然后再选操作按钮。
当单击“乘法”时第三个文本框显示对应的结果。
选择“返回”按钮时回到主窗体。
(5)选择主窗体中的“浮点数的加减运算”时进入下图所示的窗体:先选择“输入”按钮输入参与运算的数据,再选操作按钮。
当单击“加法”和“减法”时下列文本框显示对应的结果:加法的阶码和尾数、减法的阶码和尾数。
选择“返回”按钮时回到主窗体。
(6)选择主窗体中的“帮助”进入下图所示的窗体:阅读完文字后,可使用“关闭”按钮返回主窗口。
3 功能模块详细设计3.1 功能介绍3.2实现方法(1)登录界面设计思路界面:整个布局使用了LinearLayout,设置 android:orientation="vertical"就可以让所有控件以水平方式来排列,LinearLayout作为容器来承载控件,布局中第一个控件是TextView,值为“计算机组成原理算法实现(4)”,第二个控件是EditText,EditText是文本输入框,最后一个控件是Button控件,用于确定来绑定事件。
功能:Buttton绑定了一个监听点击的一个事件,在这个方法体中,主要写了,获得EditText的字符串消息和Intnet跳转,Intent是Android中的一个类,用于控件不同地Activity跳转,从而实现可以在手机上看到不同的画面,这里的Intent 跳转到主界面,这也是程序的唯一入口地址。
当口令正确,就可以进入主界面,如果连续三次错误程序将被锁死,无法打开。
(2)主界面设计思路界面:在主界面中使用了NavigationView,NavigationView采用最Google最新的Material Design,它是一个很新并且重要的Material Design组件。
在Material Design中,Navigation drawer导航抽屉,被设计用于应用导航,提供了一种通用的导航方式,体现了设计的一致性。
而NavigationView的典型用途就是配合之前v4包的DrawerLayout,作为其中的Drawer部分,即导航菜单的本体部分。
NavigationView是一个导航菜单框架,使用menu资源填充数据,使我们可以更简单高效的实现导航菜单。
它提供了不错的默认样式、选中项高亮、分组单选、分组子标题、以及可选的Header。
功能:这里的导航菜单设置了四个ITEM,分别是“机器数的真值还原”,“定点小数符号位的补码加减运算”,“定点小数原码的乘法运算”和“浮点数的加减运算”,点击对应的ITEM分别会跳到相应的界面,从而实现了界面的跳转,具体的操作将会在别人Activity处理。
(3)机器数的真值还原设计思路界面:在这个UI中,设置了较多的控件,首先第一个是EditText,用于输入信息,第二个和第三个控件都是TextView,不同的是第一个只是用来提示用户下面是真值,所以这里的Text属性就被设置了“真值是”,第三个真正用来显示所求的结果的,然后依次放了几个Button,用来触发事件。
功能:第一个Button是原码求真值的,我们所输入的是定点小数所以是符合原码的不用再做处理,第二个Button是“反码-->真值”,当得到所输入的数据后,对这个定点小数小数点以后的数据进行取反,取反的数据再与符号位连接起来就得到“反码-->真值”的值了。
第三个Button是用来“补码-->真值”,因为补码是在反码基础上取反加1就好,所以可以复用求反码的方法,在此基础上加1,便取到补码到真值的值了。
第四个Button是“移码”复用第三个Button的方法,只要对符号位替换掉就好了。
(4)定点小数的单符号位的补码加减运算设计思路界面:UI布居中,有两个EditText,分别输入两个定点小数,两个TextView用来显示求和的结果,和相减的结果,四个Button按钮用来触发事件。
功能:点击“减法”会获得两个输入框中补码相加的结果,在TextView中显示,点击“加法”会对两个输入框的值进行相加,加的结果会显示在TextView中,以供用户观察。
点击“返回”会直接退出这个界面,回到主界面,点击“清除”会清除输入框中的值。
代码处理首先是取得两个ExitText中的值,程序得到的值会进行判断是正是负,如果是正的直接处理,如果是负的会把它写成加一个负数的形式,调用相加的方法,最后加上符号位,最后返回一个字符串。
(5)定点小数原码乘法运算设计思路界面:UI中有两个EditText,一个TextView以及三个Button。
功能:点击输入会获得第一个EditText的焦点,点击乘法会对两个输入框的值进行相乘,乘的结果会显示在TextView中,以供用户观察。
点击“返回”会直接退出这个界面,回到主界面。
定点小数原码乘法的原理是,符号位相同得正,不同为负,然后对后边字符串中的内容进行遍历,第一个数的最后一位依次与第二个数的个个位置的数相乘,保存在一个字符串数组中,最后对这个数组进行二进制加法运算,返回这个结果。
(6)浮点数的加减运算设计思路界面:UI布居中,有四个EditText,分别输入两个浮点小数,四个TextView用来显示求和的结果,和相减的结果,四个Button按钮用来触发事件。
功能:点击“输入”会获得第一个EditText的焦点,点击乘法会对四个输入框的值进行浮点数加减,乘的结果会显示在TextView中,以供用户观察。
点击“返回”会直接退出这个界面,回到主界面。
4 设计小结为期一周的课程设计就这样结束了。
在程序设计的时也遇到了很多的问题,刚刚看到这个题目时觉得挺简单,后来慢慢的发现并非如此。
当你真正要去做一个东西的时候,会面临比平常多的问题。
经过本次课程设计,发现做软件真的需要做很多工作,不仅仅是敲代码。
通过此次课程设计,使我更加扎实的掌握了有关Android方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
参考文献[1] 白中英. 计算机组成原理(第五版)[M]. 北京: 科学出版社, 2010.[2]耿祥义《Java2实用教程》[M].北京:清华大学出版社2006.08部分代码Util.javapackage com.wyf.king.myapplication;public class Util {/****** 求补码* @param str String** @return String*/public String getBuMa(String str){String buMa;if(NotRight(str)){return "数据不会法!!!";}else if(str.charAt(0)=='0'){System.out.println("我是正数");return str;}else {buMa=str.substring(0,2)+QuFan(str.substring(2,str.length()));System.out.println("前两个是"+str.substring(0, 2));System.out.println("我是负数");return buMa;}}/*** 对字符串取反* @param str String* @return String*/public String QuFan(String str){System.out.println("取反的字符串是"+str);str=str.replace("1","*");str=str.replace("0","1");str=str.replace("*","0");System.out.println("取反后是:"+str);return str;}public boolean NotRight(String str) {// Pattern pattern = pile("[0-1]"); // Matcher matcher = pattern.matcher(str);// if (matcher.find()) {// return true;// }return false;}/*** 定点小数加法运算* @param one String* @param two String* @return String*/public String DingJiaJian(String one,String two) {one=getBuMa(one);two=getBuMa(two);String result="";int len;String temp=null;if(one.length()<two.length()){temp=one;one=two;two=temp;}boolean jinwei[]=new boolean[one.length()];{len=two.length();result=one.substring(len);System.out.println("len是从这里开始的"+result);for(int i=len-1;i>=0;i--){if(one.charAt(i)=='.'){jinwei[i]=true;result="."+result;continue;}intsum=(int)(one.charAt(i)+two.charAt(i));System.out.println(sum);System.out.println("one的值是"+one.charAt(i)+"two的值是"+two.charAt(i)+"sum是"+sum);System.out.println('2');if(sum==98){jinwei[i]=true;if((i+1)<two.length()&&jinwei[i+1]) {temp="1"+result;result=temp;}else {temp="0"+result;result=temp;}}else if (sum==97){if((i+1)<two.length()&&jinwei[i+1]==true) {temp="0"+result;result=temp;jinwei[i]=true;}else {temp="1"+result;result=temp;jinwei[i]=false;}}else if (sum==96) {if(jinwei[i+1]){temp="1"+result;result=temp;}else {temp="0"+result;result=temp;}jinwei[i]=false;}else {}if(i==0){if(jinwei[0]&&jinwei[2]||!jinwei[0]&&!jinwei[2]){return result;}}}}return "内存溢出";}public String DingJianFa(String one,String two) {System.out.println("two is"+two);if(two.charAt(0)=='0'){two="1"+two.substring(1);}else {two="0"+two.substring(1);}return DingJiaJian(one, two);}/*** 原码乘法运算* @param one String* @param two String* @return String*/public String YuanCheng(String one,String two) {String result;String temp="";//保留正负号if(one.charAt(0)==two.charAt(0))result="0.";else {result="1.";}String a=result;result="0";one=one.substring(2);two=two.substring(2);char first[]=one.toCharArray();char second[]=two.toCharArray();int len1=first.length;int len2=second.length;char aa[]=new char[100];if(len1<len2){aa=first;first=second;second=aa;}String meiHang[]=new String[second.length*second.length];int len=first.length;for(int i=0;i<len;i++){for(int j=0;j<second.length;j++){if(first[i]=='1'&&second[i]=='1'){temp="1"+temp;}else{temp="0"+temp;}}for(int j=1;j<=i;j++)temp=temp+"0";meiHang[i]=temp;temp="";System.out.println("每行的数据:"+meiHang[i]);result=ErJiaFa(meiHang[i],result);}return a+result;}/******************二进制加法器************************/public String ErJiaFa(String one,String two){String result="";int len=0;String temp=null;if(one.length()<two.length()){temp=one;one=two;two=temp;}boolean jinwei[]=new boolean[one.length()+2];int len1=one.length();int len2=two.length();for (int i = 0; i < len1-len2; i++){two="0"+two;}for (int i = len1-1;i>=0; i--){char a=one.charAt(i);char b=two.charAt(i);if((a=='1'&&b=='1'&&(jinwei[i+1]==true))){result="1"+result;jinwei[i]=true;}elseif((a=='1'&&b=='1'&&jinwei[i+1]==false)){result="0"+result;jinwei[i]=true;}elseif((a=='0'&&b=='0'&&jinwei[i+1]==true)){result="1"+result;}elseif((a=='0'&&b=='0'&&jinwei[i+1]==false)){result="0"+result;}elseif(jinwei[i+1]==true&&(a=='1'&&b=='0'||a=='0'&&b==' 1')){result="0"+result;jinwei[i]=true;}elseif(jinwei[i+1]==false&&((a=='1'&&b=='0')||(a=='0'&&b =='1'))){result="1"+result;jinwei[i]=false;System.out.println("我错了"+result);}System.out.println("result"+result);}if (jinwei[0]){result="1"+result;}return result;}}FuDianShuUtil.javapackage com.wyf.king.myapplication;/*** Created by King on 2016/1/20.*/public class FuDianShuUtil {public String FuDianShuJia(String j1 ,String j2,String t1,String t2){String result1=null,result2=null;String s2_=t1;char b1_[]=new char[s2_.length()-1];s2_.getChars(0,2,b1_,0);s2_.getChars(3,s2_.length(),b1_,2);C.原_补(b1_);String s2=new String(b1_);String s4_=t2;char b2_[]=new char[s4_.length()-1];s4_.getChars(0,2,b2_,0);s4_.getChars(3,s4_.length(),b2_,2);C.原_补(b2_);String s4=new String(b2_);String s1=j1;char a1[]=s1.toCharArray();C.原_补(a1);String s3=j2;char a2[]=s3.toCharArray();C.原_补(a2);B.减(a1,a2,a1); //对阶C.原_补(a1);int p=C.二_十(new String(a1,2,3));char b1[]=new char[p+s2.length()];for(int i=0;i<p+s2.length();i++) b1[i]='0';char b2[]=new char[p+s4.length()];for(int i=0;i<p+s2.length();i++) b2[i]='0';if(a1[0]=='0'){s1.getChars(0, s1.length(), a1, 0);s2.getChars(0, s2.length(), b1, 0);s4.getChars(0, s4.length(), b2, p);}else{s3.getChars(0, s3.length(), a1, 0);s2.getChars(0, s2.length(), b1, p);s4.getChars(0, s4.length(), b2, 0);}B.加(b1, b2, b1); //尾数相加String s=new String(b1);if(s.startsWith("01")||s.startsWith("10")) //右规{for(int i=b1.length-1;i>=1;i--) b1[i]=b1[i-1];C.加一(a1);}else if(s.startsWith("00")) //左规{int t=s.indexOf("1")-2 ;for(int i=0;i<b1.length-t;i++) b1[i]=b1[i+t]; //左移for(int i=b1.length-t;i<b1.length;i++) b1[i]='0';String t_=Long.toBinaryString(t);char a1_[]=new char[5];for(int i=0;i<5;i++) a1_[i]='0';t_.getChars(0,t_.length(),a1_,a1.length-t_.length());B.减(a1, a1_, a1);}else if(s.startsWith("11")){int t=s.indexOf("0")-2 ;for(int i=0;i<b1.length-t;i++) b1[i]=b1[i+t];for(int i=b1.length-t;i<b1.length;i++) b1[i]='0';String t_=Long.toBinaryString(t);char a1_[]=new char[5];for(int i=0;i<5;i++) a1_[i]='0';t_.getChars(0,t_.length(),a1_,a1.length-t_.length());B.减(a1, a1_, a1);}if(b1[b1.length-p]=='1') //舍入{String code=new String(b1,0,b1.length-p);char c[]=code.toCharArray();C.加一(c);b1=c;String code_=new String(b1);if(code_.startsWith("01")||code_.startsWith("10")) //右规{for(int i=c.length-1;i>=1;i--) c[i]=c[i-1];C.加一(a1);}}if(a1[0]=='0'&&a1[1]=='1'||a1[0]=='1'&&a1[1]=='0'){return "结果溢出@结果溢出";}else{C.原_补(a1);if(a1[0]=='0') { a1[0]=' '; a1[1]=(char)('+');}else {a1[0]=' '; a1[0]=(char)('-');}String code1=new String(a1);// result1=code1;C.原_补(b1);if(b1[0]=='0') { b1[1]='0'; b1[0]=(char)('+');}else {b1[1]='0'; b1[0]=(char)('-');}StringBuffer code2_=new StringBuffer(new String(b1));code2_.insert(2,".");String code2=new String(code2_);// result=code2;return code1+"@"+code2;}}public String FuDianShuJian(String j1 ,String j2,String t1,String t2){String result=null;String s2_=t1;char b1_[]=new char[s2_.length()-1];s2_.getChars(0,2,b1_,0);s2_.getChars(3,s2_.length(),b1_,2);C.原_补(b1_);String s2=new String(b1_);String s4_=t2;char b2_[]=new char[s4_.length()-1];s4_.getChars(0,2,b2_,0);s4_.getChars(3,s4_.length(),b2_,2);C.原_补(b2_);String s4=new String(b2_);String s1=j1;char a1[]=s1.toCharArray();C.原_补(a1);String s3=j2;char a2[]=s3.toCharArray();C.原_补(a2);B.减(a1,a2,a1); //对阶C.原_补(a1);int p=C.二_十(new String(a1,2,3));char b1[]=new char[p+s2.length()];for(int i=0;i<p+s2.length();i++) b1[i]='0';char b2[]=new char[p+s4.length()];for(int i=0;i<p+s2.length();i++) b2[i]='0';if(a1[0]=='0'){s1.getChars(0, s1.length(), a1, 0);s2.getChars(0, s2.length(), b1, 0);s4.getChars(0, s4.length(), b2, p);}else{s3.getChars(0, s3.length(), a1, 0);s2.getChars(0, s2.length(), b1, p);s4.getChars(0, s4.length(), b2, 0);}B.减(b1, b2, b1); //尾数相String s=new String(b1);if(s.startsWith("01")||s.startsWith("10")) //右规{for(int i=b1.length-1;i>=1;i--) b1[i]=b1[i-1];C.加一(a1);}else if(s.startsWith("000")) //左规{int t=s.indexOf("1")-2 ;for(int i=0;i<b1.length-t;i++) b1[i]=b1[i+t]; //左移for(int i=b1.length-t;i<b1.length;i++) b1[i]='0';String t_=Long.toBinaryString(t);char a1_[]=new char[5];for(int i=0;i<5;i++) a1_[i]='0';t_.getChars(0,t_.length(),a1_,a1.length-t_.length());B.减(a1, a1_, a1);}else if(s.startsWith("111")){int t=s.indexOf("0")-2 ;for(int i=0;i<b1.length-t;i++) b1[i]=b1[i+t];for(int i=b1.length-t;i<b1.length;i++) b1[i]='0';String t_=Long.toBinaryString(t);char a1_[]=new char[5];for(int i=0;i<5;i++) a1_[i]='0';t_.getChars(0,t_.length(),a1_,a1.length-t_.length());B.减(a1, a1_, a1);}if(b1[b1.length-p]=='1') //舍入{String code=new String(b1,0,b1.length-p);char c[]=code.toCharArray();C.加一(c);b1=c;String code_=new String(b1);if(code_.startsWith("01")||code_.startsWith("10")) //右规{for(int i=c.length-1;i>=1;i--) c[i]=c[i-1];C.加一(a1);}}if(a1[0]=='0'&&a1[1]=='1'||a1[0]=='1'&&a1[1]=='0'){result= "结果溢出@结果溢出";}else{C.原_补(a1);if(a1[0]=='0') { a1[0]=' '; a1[1]=(char)('+');}else {a1[0]=' '; a1[0]=(char)('-');}String code1=new String(a1);// result1=code1;C.原_补(b1);if(b1[0]=='0') { b1[1]='0'; b1[0]=(char)('+');}else {b1[1]='0'; b1[0]=(char)('-');}StringBuffer code2_=new StringBuffer(new String(b1));code2_.insert(2,".");String code2=new String(code2_);// result2=code2;result= code1+"@"+code2;}return result;}}class C{static void 原_补(char a[]) //双符号位原-补{String s=new String(a);if(s.startsWith("1")){s.getChars(stIndexOf("1"), s.length(), a, stIndexOf("1"));s=s.substring(2,stIndexOf("1"));s=s.replaceAll("0", ";");s=s.replaceAll("1", "'");s=s.replaceAll(";", "1");s=s.replaceAll("'", "0");s.getChars(0,s.length(),a,2);}}static int 二_十(String s){int p=0,m=0;for(int i=s.length()-1;i>=0;i--){char c=s.charAt(i);int a=Integer.parseInt(""+c);p=p+(int)(a*Math.pow(2,m));m++;}return p;}static void 加一(char a[]){String s=new String(a);s.getChars(0,stIndexOf("0"),a,0);Stringss=s.substring(stIndexOf("0"),s.length());ss=ss.replaceAll("0", ";");ss=ss.replaceAll("1", "'");ss=ss.replaceAll(";", "1");ss=ss.replaceAll("'", "0");ss.getChars(0,ss.length(),a,stIndexOf("0"));}}class B{static void 加(char a1[],char a2[],char b[]){int temp=0;int n=a1.length-1;for(int i=n,j=n,m=n;i>=0;i--,j--,m--){if(a1[i]=='0'&&a2[j]=='0'&&temp==0){b[m]='0';temp=0;}elseif(a1[i]=='0'&&a2[j]=='1'&&temp==0||a1[i]=='1'&&a2[j ]=='0'&&temp==0||a1[i]=='0'&&a2[j]=='0'&&temp==1){b[m]='1';temp=0;}elseif(a1[i]=='1'&&a2[j]=='1'&&temp==0||a1[i]=='0'&&a2[j ]=='1'&&temp==1||a1[i]=='1'&&a2[j]=='0'&&temp==1){b[m]='0';temp=1;}elseif(a1[i]=='1'&&a2[j]=='1'&&temp==1){b[m]='1';temp=1;}}}static void 减(char a1[],char a2[],char b[]){String s=new String(a2);s.getChars(stIndexOf("1"), s.length(), a2, stIndexOf("1"));s=s.substring(0,stIndexOf("1"));s=s.replaceAll("0", ";");s=s.replaceAll("1", "'");s=s.replaceAll(";", "1");s=s.replaceAll("'", "0");s.getChars(0,s.length(),a2,0);B.加(a1,a2,b);}}。