计算机组成原理实验Word格式文档下载.docx
《计算机组成原理实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验Word格式文档下载.docx(45页珍藏版)》请在冰豆网上搜索。
,当次数大于3时,"
您三次口令错误,确定后退出!
"
,登陆成功后,即可按照自己想要的事件进行按钮触发事件操作,激活菜单栏,并且把图形界面设置为可见setVisible()以便下面功能的使用,然后隐藏登陆界面,退出。
图4.1输入口令错误
2:
输入正确的口令后,程序显示登陆成功,选择主窗体中“机器数的真值还原”时进入下图所示的窗体。
在上面的窗体中按“输入”按扭时~将输入焦点设置为最上面的一个文本框上。
输入一个数的机器数:
如:
1101011;
后按“原—〉真值”、“反—〉真值”、“补—〉真值”或“移—〉真值”按钮中的任一个后将在第二个文本框中显示对应的真值。
选择“返回”按钮时回到主窗体。
如图5、5.1所示:
图5
图5.1点击按钮完成定点整数的真值还原
选择主窗体中“机器数的真值还原(定点整数)”时进入上图所示的窗体。
开始时,与主窗口设计一样按照指导书给出的模板,用Button定义按钮,用Label定义标签,以下设计雷同处不再赘述。
首先button1对应输入,每当按到此按钮式,跳到输入窗口,并清空其中内容:
elseif(e.getSource()==button1)
text1.setText("
);
其后,button2原码到真值转换较易,定义输入机器数首位布尔量booleanboo=s.startsWith("
0"
0);
为0加个“+”后面不变,为1就添个“-”同样不变;
button3前面同上判断符号位,后面的定义为一维数组,通过循环选择嵌套,按位取反,最后两者合并显示出来;
button4在反码的基础上,只要将其值末位加1即可:
j=s1.lastIndexOf("
1"
)+1;
button5移码在机器数首位字符的布尔判断下1时,加个“+”后面不变text2.setText("
+"
+s1);
直接输出,为0时较为复杂,其中较为关键的语句:
s1=s.substring(1,j);
通过截取传送达到移码还原的目的;
最后的button6直接返回主类。
在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。
输入一个机器数(如10001000)后,按“原->
真值”、“反->
真值”、“补->
真值”或“移->
真值”按扭中的任一个后,将在第二文本框中显示对应操作的结果。
选择“返回”按扭时将关闭此窗体。
3:
选择主窗体中的“定点整数单符号位补码加减运算”时进入如下图所示的窗体,操作时首先选择“输入”按钮输入参与运算的数据,然后再选操作按钮。
当单击“加法”、“减法”第三、四个文本框显示对应的结果。
定点整数的单符号位补码加减运算如图6、6.1、6.2所示:
图6
图6-1输入数据
图6-2点击按钮完成定点整数的单符号位补码加减运算
接下来是定点整数单符号位补码加减法的实现,输入按钮,删除所有数据并将光标移到第一个输入窗口里面,开始输入,注意是补码输入,实现定点整数加减法时,定义了一个carry[]数组记录每位的进位,carry[]最后一位初值为‘0’,carry[]长度比输入大1位,用多重选择语句嵌套使用,罗列两数第i位及上位进位的状况,输出结果记录在out[i]中,第i位进位记录在carry[i]中,当最高数值位进位与符号位进位不同时表溢出。
值得一提的是,加一个负数和减一正数时,都转化为加一个数的补码,由之前的算法保证,进行运算,其他保持不变。
值得注意的是,输入第二个数时,要注意字符串长度与第一个字符串长度保持一致,否则将产生中断提醒请输入数值位长度相等的数字:
if(i1.length!
=i2.length)data1.setText("
请输入数值位长度相等的数字!
接下来的返回键与之前界面功能相同,回到主界面。
输入按钮,删除所有数据并将光标移到第一个输入窗口里面,开始输入,在补码输入,实现定点整数加减法时,定义carry[]数组记录每位的进位,carry[]最后一位初值为‘0’,carry[]长度比输入大1位,用多重选择语句嵌套使用,罗列两数第i位及上位进位的状况,输出结果记录在out[i]中,第i位进位记录在carry[i]中,当最高数值位进位与符号位进位不同时表溢出。
若是加一个负数和减一正数时,都将负数化成一个正数的补码进行运算,其他不变。
4:
选择主窗体中的“定点整数原码乘法”时进入如下图所示的窗体,操作时首先选择“输入”按钮输入参与运算的数据,然后再选操作按钮。
当单击“乘法”时第三个文本框显示对应的结果。
定点整数的原码乘法运算如图7、7.1、7.2所示:
图7
图7-1输入数据
图7-2定点整数的原码乘法运算
设置输出数组out[]与进位标志数组carry[],carry[]最后一位初值为‘0’,carry[]长度比输入大1位。
对输入的两个字符串仿照并行乘法器的工作原理,将乘法转化为加法。
使用循环语句,按位相乘,再做原码加法。
由于是带一位符号位的原码乘法,要得到运算结果的符号位,就要对in1[0]和in2[0]进行判断:
if((in1[0]=='
0'
&
&
in2[0]=='
)||(in1[0]=='
1'
))signal="
;
if((in1[0]=='
)||(in1[0]=='
-"
;
返回按钮。
5:
择主窗体中的“浮点数的加减运算”时进入下图所示的窗体:
先选择“输入”按钮输入参与运算的数据,再选操作按钮。
当单击“加法”和“减法”时下列文本框显示对应的结果:
加法的阶码和尾数、减法的阶码和尾数。
浮点数的加减运算如图8、8.1、8.2所示:
图8
图8-1输入数据
图8-2浮点数的加减运算
数据输入分为阶码和尾数,将两个数的阶码和尾数对应的变形补码表示出来,比较价码大小并完成对阶即小阶向大阶看齐,若对阶时发生溢出则发出提醒:
JOptionPane.showMessageDialog(this,"
对阶时溢出!
错误"
JOptionPane.ERROR_MESSAGE);
然后求阶差,n=toSubstract(sj1,sj2);
如果n<
0,则第一个数尾数右移,反之第二个数尾数右移:
for(inti=n;
i<
0;
i++){st1=st1.substring(0,1)+st1.substring(0,st1.length()-1);
},统一阶码后,采用规格化进行尾数求和,对尾数进行舍入处理,判断尾数最末尾
情况,用Replace语句实现粗略舍入处理。
最后进行变形补码还原。
4小结
通过这次的计算机组成原理的课程设计,使我对计算机的认识有了更进一步的加深和认知。
在接触计算机组成原理的同时,我更加体会到计算科学与技术是一门多有意思的学科,在本学期学习计算机组成原理之后,又开了课程设计,使我又重新温习了这学期学的知识,真正做到了温故,在课程设计的时候,在实验室进行网上信息的查阅和参考,对相似的例子比较和借鉴,是我又学习到新的知识,两者结合起来,真正做到了“温故知新”。
当然,在这个过程中,也有许多问题与困难出现。
有的经过自己的思考或与他人合作能得以解决,有的也的确费了一些周折。
但无论如何,这次对于课题的能够实现机器数的真值还原(定点整数)、定点整数的单符号位补码加减运算、定点整数乘法运算和浮点数的加减运算的设计总体来说还是比较满意的。
不仅用到了课堂上所学到的知识,还加入了自己的一些想法与观点,而且在对编程这一方面也有了很多新的感悟与提高。
不得不说是获益良多。
过了这经次的课程设计,我想,对于我日后的计算机的相关的学习肯定会有诸多助益与影响,为将来的学习生活打下了坚实的基础。
希望以后有更多的机会参加这样的活动。
参考文献
[1]白中英.计算机组成原理(第五版)[M].北京:
科学出版社,2015.
[2]陈磊、陈国君、李梅生、邹林达.java程序设计基础(第四版)[M].北京:
清华大学出版社,2015.
附录1源程序清单附录
口令程序:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
publicclassNewclassextendsFrameimplementsActionListener{
staticinti=0;
staticintm=1;
Labela1,a2,a22;
//输入语句
TextFieldtext1;
//文本框
Buttonbutton1,m1,m2,m3,m4,m5;
//按钮
Fontf;
Newclass(Strings){
super(s);
setLayout(null);
//默认布局样式
f=newFont("
楷体"
Font.BOLD,20);
//字体
m1=newButton("
机器数的真值还原(定点整数)"
m2=newButton("
定点整数单符号位补码加减运算"
m3=newButton("
定点整数的原码乘法"
m4=newButton("
浮点的加减运算"
m1.addActionListener(this);
//监测控件是否正常
m2.addActionListener(this);
m3.addActionListener(this);
m4.addActionListener(this);
m1.setBounds(10,30,160,25);
//在坐标系重的位置和按钮的宽度高度
m2.setBounds(175,30,190,25);
m3.setBounds(370,30,120,25);
m4.setBounds(495,30,95,25);
add(m1);
add(m2);
add(m3);
add(m4);
a1=newLabel("
计算机组成原理算法实现(五)"
Label.CENTER);
a2=newLabel("
输入口令:
a22=newLabel("
登陆成功"
a1.setBounds(150,100,300,40);
a1.setBackground(Color.WHITE);
a1.setFont(f);
a2.setBounds(150,200,90,25);
a2.setBackground(Color.white);
a22.setBounds(200,200,200,25);
a22.setForeground(Color.gray);
a22.setBackground(Color.pink);
a22.setVisible(false);
text1=newTextField(18);
text1.setEchoChar('
*'
text1.setBounds(240,200,200,25);
button1=newButton("
确认"
button1.setBounds(270,250,70,30);
button1.addActionListener(this);
add(a1);
add(a2);
add(a22);
add(text1);
add(button1);
setBackground(Color.white);
setBounds(100,100,640,400);
setVisible(true);
validate();
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
}
publicstaticvoidmain(Stringargs[]){
newNewclass("
计算机组成原理"
publicvoidactionPerformed(ActionEvente){
Strings=newString("
000"
if(e.getSource()==button1){
while(i==0&
m<
=3&
(!
(text1.getText().equals("
)))){
if(text1.getText().equals(s)){
i=1;
JOptionPane.showMessageDialog(this,"
"
正确"
JOptionPane.INFORMATION_MESSAGE);
text1.setEnabled(false);
text1.setVisible(false);
a22.setVisible(true);
a2.setVisible(false);
}else{
m++;
JOptionPane.showMessageDialog(this,"
JOptionPane.WARNING_MESSAGE);
text1.setText(null);
}
if(m>
3){
JOptionPane.showMessageDialog(this,"
JOptionPane.ERROR_MESSAGE);
}
if(i==1){
if(e.getSource()==m1){
Form2s1=newForm2();
s1.setVisible(true);
}elseif(e.getSource()==m2){
Form3f1=newForm3();
f1.setTitle("
定点整数单符号位补码加减"
f1.setVisible(true);
}elseif(e.getSource()==m3){
Form4f2=newForm4();
f2.setTitle("
定点整数补乘法"
f2.setVisible(true);
}elseif(e.getSource()==m4){
Form5f5=newForm5();
f5.setVisible(true);
机器数的真值还原(整数):
importjavax.swing.*;
//引用非本包的类
importjava.awt.event.*;
importjavax.swing.SwingUtilities;
importjava.awt.TextField;
classForm2extendsFrameimplementsMouseListener{//定义按钮及页面布局
Buttonbutton1;
Buttonbutton2;
Buttonbutton3;
Buttonbutton4;
Buttonbutton5;
Buttonbutton6;
Labellabel1;
Labellabel2;
Labellabel3;
//Labellabel4;
//Labellabel5;
//Labellabel6;
//Labellabel7;
TextFieldtext1;
TextFieldtext2;
//TextFieldtext3;
Strings,s1,temp;
intn1,i,j;
chara[];
publicForm2(){
setTitle("
form2"
button1=newButton("
输入"
button2=newButton("
原-->
真值"
button3=newButton("
反-->
button4=newButton("
补-->
button5=newButton("
移-->
button6=newButton("
返回"
label1=newLabel("
Fontf1=newFont("
Font.TRUETYPE_FONT,25);
label1.setFont(f1);
label2=newLabel("
请输入机器数:
label3=newLabel("
真值还原结果为:
text1=newTextField(8);
text2=newTextField(10);
text2.setEditable(false);
BoxbaseBox,box1,box2,box3,box4,box5;
box1=Box.createHorizontalBox();
//创建一个从左到右显示其组建的BOX
box1.add(label1);
box2=Box.createHorizontalBox();
box2.add(label2);
box2.add(Box.createHorizontalStrut(10));
//添加长度为10的支架
box2.add(text1);
box3=Box.createHorizontalBox();
box3.add(label3);
box3.add(Box.createHorizontalStrut(10));
box3.add(text2);
box4=Box.createHorizontalBox();
box5=Box.createHorizontalBox();
box5.add(button1);
box5.add(Box.createHorizontalStrut(20));
box5.add(button2);
box5.add(Box.createHorizontalStrut(10));
box5.add(button3);
box5.add(button4);
box5.add(button5);
box5.add(button6);
baseBox=Box.createVerticalBox();
baseBox.add(box1);
baseBox.add(Box.createVerticalStrut(10));
baseBox.add(box2);
baseBox.ad