实验一南昌航空大学两个多位十进制数相减实验
- 格式:doc
- 大小:78.00 KB
- 文档页数:4
南昌航空大学实验报告课程名称:数据结构指导老师准考证号:036811100078姓名:周文飞指导老师:廖丽实验报告内容和步骤一、实验目的:通过实践加深对数据结构的基本概念、基本理论的理解,培养学生灵活使用所学知识解决实际问题的能力,同时提高程序设计实际操作能力。
二、实验内容:实现任意大的数字(包括任意整数和任意小数)的加法,减法和乘法运算。
三、实验要求:1、本程序的数据来自文件,第一个操作数存储在“a*.txt”文件中,第二个操作数存储在“b*.txt”文件中(a*与b*分别表示两组对应的数据),这两组文件中分别存储对应的任意大数,以供程序2、本程序主要实现3个功能:任意大数的加法运算,任意大数的减法运算和任意大数的乘法运算。
大数的范围包括:任意长度的整数和任意长度的小数。
四、实验过程1.BigNumber.java[c-sharp]view plaincopyprint?1. /*自定义大数类,用数组实现任意超大整数的加减乘运算*/2. i mport java.util.Random;3. p ublic class BigNumber {4. private int[] num;5. // 无参构造函数6. public BigNumber() {7. }8. // 有参构造函数9. public BigNumber(int i) {10. num = new int[i];11. Random random = new Random();12. int j;13. for (j = 0; j < i; j++)14. num[j] = random.nextInt(10);15. // 当生成的数首位是0的话,让重新生成16. while (num[i - 1] == 0) {17. num[i - 1] = random.nextInt(10);18. }19. }20. // 加法21. public static BigNumber add(BigNumber bigA, BigNumber bigB) {22. int alen = bigA.num.length;23. int blen = bigB.num.length;24. int clen = Math.max(alen, blen);25. BigNumber result = new BigNumber();26. result.num = new int[clen];27. if (alen >= blen) {28. for (int i = 0; i < blen; i++)29. result.num[i] = bigA.num[i] + bigB.num[i];30. for (int j = blen; j < alen; j++)31. result.num[j] = bigA.num[j];32. } else {33. for (int i = 0; i < alen; i++)34. result.num[i] = bigA.num[i] + bigB.num[i];35. for (int j = alen; j < blen; j++)36. result.num[j] = bigB.num[j];37. }38. for (int k = 0; k < clen - 1; k++) {39. if (result.num[k] >= 10) {40. result.num[k] -= 10;41. result.num[k + 1]++;42. }43. }44. return result;45. }46. // 减法47. public static BigNumber subtract(BigNumber bigA, BigNumber bigB) {48. int alen = bigA.num.length;49. int blen = bigB.num.length;50. int clen = Math.max(alen, blen);51. BigNumber result = new BigNumber();52. result.num = new int[clen];53. if (alen > blen) {54. for (int i = 0; i < blen; i++)55. result.num[i] = bigA.num[i] - bigB.num[i];56. for (int j = blen; j < alen; j++)57. result.num[j] = bigA.num[j];58. } else if (alen < blen) {59. for (int i = 0; i < alen; i++)60. result.num[i] = bigB.num[i] - bigA.num[i];62. result.num[j] = bigB.num[j];63. } else {64. if (isBigger(bigA, bigB)) {65. for (int i = 0; i < clen; i++) {66. result.num[i] = bigA.num[i] - bigB.num[i];67. }68. } else {69. for (int i = 0; i < clen; i++) {70. result.num[i] = bigB.num[i] - bigA.num[i];71. }72. }73. }74. for (int k = 0; k < clen - 1; k++) {75. if (result.num[k] < 0) {76. result.num[k] += 10;77. result.num[k + 1]--;78. }79. }80. return result;81. }82. // 乘法83. public static BigNumber multiply(BigNumber bigA, BigNumber bigB) {84. int alen = bigA.num.length;85. int blen = bigB.num.length;86. int clen = alen + blen;87. int t;88. BigNumber result = new BigNumber();89. result.num = new int[clen];90. for (int i = 0; i < alen; i++) {91. BigNumber temp = new BigNumber();92. temp.num = new int[clen];93. for (int j = 0; j < blen; j++) {94. temp.num[i + j] = bigA.num[i] * bigB.num[j];95. }97. if (temp.num[k] >= 10) {98. t = temp.num[k];99. temp.num[k] = t % 10;100. temp.num[k + 1] += t / 10;101. }102. }103. result = add(result, temp);104. }105. return result;106. }107. // 判断两个位数相同的BigNumber那个大,前面的大于或者等于返回true,后面的大返回false108. public static boolean isBigger(BigNumber bigA, BigNumber bigB) { 109. boolean flag = true;110. for (int i = bigA.num.length - 1; i >= 0; i--) {111. if (bigA.num[i] < bigB.num[i]) {112. flag = false;113. break;114. }else if(bigA.num[i] > bigB.num[i]){115. break;116. }else117. continue;118. }119.120. return flag;121. }122. // 打印123. public void print() {124. if (num[num.length - 1] != 0)125. System.out.print(num[num.length - 1]);126. for (int i = num.length - 2; i >= 0; i--)127. System.out.print(num[i]);128. System.out.println();129. }130. public static void main(String[] args) { 131. // TODO Auto-generated method stub 132. BigNumber a = new BigNumber(1000); 133. System.out.println("第一个数是:"); 134. a.print();135. BigNumber b = new BigNumber(900); 136. System.out.println("第二个数是:"); 137. b.print();138. System.out.println("它们的和为:"); 139. add(a, b).print();140. System.out.println("它们的差为:"); 141. subtract(a, b).print();142. System.out.println("它们的乘积为:"); 143. multiply(a, b).print();144. }145. }。
十进制的加法和减法在数学中,十进制是最常见和熟悉的一种计数系统。
它基于数字0到9,并使用权位表示不同的数值。
在日常生活和商业运作中,我们经常需要进行十进制的加法和减法运算,下面将详细介绍这两种运算方法。
一、十进制的加法运算十进制的加法运算是指将两个或多个十进制数相加,得出它们的和。
在进行十进制的加法运算时,需要按照权位对齐,从个位开始逐位相加,并考虑进位。
例如,我们要计算325 + 47。
首先,我们从个位开始相加,5 + 7 = 12。
个位上的结果是2,我们将2写在个位上,并将进位1记在十位上。
然后,继续计算十位上的数值,2 + 4 + 1(进位)= 7。
十位上的结果是7,我们将7写在十位上,并将进位0记在百位上。
最后,计算百位上的数值,3 + 0 = 3。
百位上的结果是3,我们将3写在百位上。
因此,325 + 47 = 372。
以上是十进制加法运算的基本步骤,无论多少位的数相加,都可以按照这个方法进行计算。
二、十进制的减法运算十进制的减法运算是指将一个十进制数减去另一个十进制数,得出它们的差值。
同样,进行十进制的减法运算时,也需要按照权位对齐,并考虑借位。
例如,我们要计算789 - 246。
首先,我们从个位开始相减,9 - 6 = 3。
个位上的结果是3。
然后,继续计算十位上的数值,8 - 4 = 4。
十位上的结果是4。
最后,计算百位上的数值,7 - 2 = 5。
百位上的结果是5。
因此,789 - 246 = 543。
同样,无论多少位的数相减,都可以按照这个方法进行计算。
总结:通过以上的介绍,我们了解了十进制的加法和减法运算。
在进行这两种运算时,需要按照权位对齐,并考虑进位或借位。
值得注意的是,在使用计算器或计算机进行十进制运算时,我们只需输入相应的数值和运算符即可,无需手动对齐和计算进位或借位。
但是,了解十进制的加法和减法运算的基本原理,对我们理解数学运算的本质和提高计算能力是非常有益的。
通过不断练习和应用,我们可以更加熟练地进行十进制运算,提高计算的准确性和效率。
微机原理与接口技术实验报告实验环境: Windows XP SP3实验软件:masm, link, debug, edit。
Test 1: debug命令及汇编指令和寻址的应用。
NO.1设堆栈指针SP=2000H, AX=3000H, BX=5000H;请编一程序段将AX和BX的内容进行交换。
要求:用3种方法实现。
方法一CODE SEGMENT ASSUME CS:CODE START: MOV AX,3000HMOV BX,5000H MOV CX,AX MOV AX,BX MOV BX,CX CODE ENDS END START 方法二CODE SEGMENTASSUME CS:CODESTART: MOVAX,3000HMOV BX,5000HXCHG AX,BXCODE ENDSEND START方法三CODE SEGMENTASSUME CS:CODESTART: MOVAX,3000HMOV BX,5000HPUSH AXPUSH BXPOP AXPOP BXCODE ENDSEND STARTNO.2分别执行以下指令, 比较寄存器寻址,寄存器间接寻址和相对寄存器寻址间的区别。
MOV AX,BX 寄存器寻址, 将BX内容送AXMOV AX,[BX] 寄存器间接寻址, 将DS:BX内存单元内容送AXMOV AX,10[BX] 寄存器相对寻址, 将DS:BX+10内存单元内容送AXNO.3已知有如下程序段:MOV AX, 1234HMOV CL, 4在以上程序段的基础上, 分别执行以下指令:ROL AX, CL AX=4123HROR AX, CL AX=3412HSHL AX, CL AX=4120HSHR AX, CL AX=0412HSAR AX, CL AX=0041HRCL AX, CL AX=0410HRCR AX, CL AX=0041HNO.4设有以下部分程序段:TABLE DW 10H,20H,30H,40H,50HENTRY DW 3┇LEA BX,TABLEADD BX,ENTRYMOV AX,[BX]┇要求: (1)将以上程序段补充成为一个完整的汇编程序。
实验二多位十进制数加法实验
一、实验目的
1.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
2.掌握数据传送和算术运算指令的用法。
3.熟悉和掌握用DEBUG调试程序的方法。
二、实验内容
将两个多位十制数4678和2556相加,要求加数和被加数均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回DATAl处,并显示结果。
操作步骤:
打开MASM文件夹,检查我们要用到的四个文件EDIT ,MASM.EXE,LINK.EXE,DEBUG 。
1.进入EDIT编辑环境建立和修改汇编源程序文件(文件名要以.ASM结尾)
2.用MASM命令汇编源文件以产生相应的目标文件(OBJ文件)
3.用LINK命令连接目标文件以产生可执行文件(EXE文件)
4.用DEBUG调试,记录调试过程,
5. 运行可执行程序。
相关中断调用表
三、实验报告要求
1.整理运行正确的源程序,加上注释。
2.写出程序运行结果。
3.总结应用DEBUG调试程序的方法。
4.回答思考题。
实验一多字节数求和运算,字节拆分运算一.实验目的1.熟悉emu8086调试程序的使用。
2.编写两个4字节数的加法、减法运算程序,并运用emu8086进行调试。
3. 编写字节拆分运算程序,并运用emu8086进行调试二.实验目的1.学习数据传送和算术运算指令2.熟悉在PC机上调试程序的方法三.emu8086调试程序的使用1.启动emu8086a.在WINDOWS下双击emu8086图标,启动界面如图1所示,用户可以选择新建文本、程序实例、启动指南、近期文档。
2.新建文件单击图1中的“New”选项,软件会弹出如图2所示的选择界面。
选择empty workspace的选项,打开一个完全空的文档。
3. 编辑程序如图3所示为编辑程序界面。
该编辑界面集文档编辑、指令编译、程序加载、系统工具、在线帮助为一体。
编写完程序后,用户只需单击工具栏上的“emulate”按钮即可仿真运行程序。
4.仿真运行当用户将程序加载到仿真器后,会同时打开仿真器界面和源程序界面,用户在仿真器界面中也可以同时看到源代码和编译后的机器码。
点击的任意一条源程序指令,则对应的机器代码显示为被选显示状态,与此同时,上面的代码指针也会相应变化。
用户也可以通过这种操作了解,数据段和堆栈段中各变量或数据在存储器中的情况。
用户可以利用工具栏中的“single step”按钮进行单步跟踪调试,以便仔细观察各寄存器、存储器、变量、标记位等情况,这对于程序初始调试时十分有用;当程序调试完毕,或需要连续运行观察时,则可以使用“run”按钮;当希望返回上一步操作时,则可以使用“step back”按钮;若单击“reload”按钮,则仿真器会重新加载程序,并将指令指针指向程序的第一条指令;您也可以利用“load”按钮,从您保存的文件夹中加载其它程序。
用户除使用上述工具栏中的按钮进行仿真调试外,还可以利用其菜单中的其它功能进行更高级的调试和设置。
四.多字节加法要求:在当前的数据段内(段基址寄存器DS)的偏移地址为1000H处定义4各字节的被加数78H、56H、34H、12H(即被加数为12345678H);在偏移地址2000H处定义4字节加数12H、34H、56H、78H(即加数为78563412H)程序流程:程序清单:MOV SI,1000H ;置被加数指针MOV DI,2000H ;置加数指针MOV CX,4 ;数据个数CLC ;清进位标志AGAIN: MOV AL,[SI] ;取被加数ADC AL,[DI] ;加加数MOV [SI],AL ;和送回至加数INC SI ;修改数据指针INC DILOOP AGAIN ;记数—1=0?五. 拆分字符拆字10051H程序:MOV AX,1000HMOV DS,AX ;数据段基址DS=1000HMOV SI,50H ;需拆字的指针SI=50HMOV AL,[SI] ;取字节给ALAND AL,0FH ;屏蔽高4位MOV [SI+1],AL ;得到的数据存入10051MOV AL,[SI] ;再取出需拆字的字节MOV CL,4SHR AL,CL ;逻辑右移4次,高4位补0MOV [SI+2],AL ;存入10052单元五.实验内容(实验程序及结果写在练习本上)。
南昌航空大学实验报告2011年11月15日课程名称: 面向对象程序设计B 实验名称:运算符重载班级:102022 姓名:林书晨指导老师评定:签名:一.实验目的1.理解运算符重载(非成员形式和成员形式)2.学习重载几类运算符(++,=,!=,+,-,==等)二.实验内容应用VC++6.0的构件一个复数类Complex,试对下列几个运算符进行重载:++,=,!=,+,-,==,其中要求要有成员重载形式和友元重载形式,而且,++运算符要求实现先加和后加两种形式。
该类定义原型说明:Class complex{Public:Complex(double r=0,double i=0);Complex &operator+(complex &c);Complex operator -(complex &c);Complex operator *(complex &c);Friend Complex operator /(complex &c1,complex &c2);Friend int operator ==(complex &c1,complex &c2);Friend int operator !=(complex &c1,complex &c2);//Friend Complex operator ++(complex &c);Complex operator ++();V oid disp();Private:Double real;Double imag;};四.概要设计class complex{public:double real;double imag;complex(double x,double y) //构造函数;{real=x;imag=y;}friend complex operator -(complex a,complex b); //用友元函数对-号重载;friend int operator==(complex a,complex b);friend int operator!=(complex a,complex b);complex operator++(); //用成员函数对前加++重载;complex operator++(int); //用成员函数对后加++重载;complex operator=(complex a) //用成员函数对=重载;{real=a.real;imag=a.imag;return *this;}四.详细设计# include<iostream.h>class complex{public:double real;double imag;complex(double x,double y) //构造函数;{real=x;imag=y;}friend complex operator -(complex a,complex b); //用友元函数对-号重载;friend int operator==(complex a,complex b);friend int operator!=(complex a,complex b);complex operator++(); //用成员函数对前加++重载;complex operator++(int); //用成员函数对后加++重载;complex operator=(complex a) //用成员函数对=重载;{real=a.real;imag=a.imag;return *this;}void show() //成员函数用于输出;{cout<<"real :"<<real<<endl;cout<<"imag :"<<imag<<endl;}};complex operator+(complex a,complex b) //++的友元重载函数进行定义;{complex temp(0.0,0.0);temp.real=a.real+b.real;temp.imag=a.imag+b.imag;return temp;}complex operator-(complex a,complex b){complex temp(0.0,0.0);temp.real=a.real-b.real;temp.imag=a.imag-b.imag;return temp;}int operator==(complex a, complex b){if(a.real==b.real&&a.imag==b.imag)return 1;return 0;}int operator!=(complex a ,complex b){if(a.imag!=b.imag||a.real!=b.real)return 1;return 0;}complex complex::operator ++() //对符号++成员重载函数进行类外定义;{real=real+real;imag=imag+imag;return *this; //返回当前对象;}complex complex::operator ++(int){++real;++imag;return *this; //返回当前对象;}void main() //主函数;{complex com1(1.1,2.2),com2(3.3,4.4),total(1.1,2.2),ca(0.0,0.0),fuzhi(0.0,0.0);if(com1==total)cout<<"you yuan xiang deng"<<endl;if(com1!=com2)cout<<"you yuan bu xiang deng "<<endl;total=com1+com2;ca=com2-com1;cout<<"lei wai jia hao : "<<endl;total.show();cout<<"you yuan jian hao : "<<endl;ca.show();fuzhi=com1;cout<<"fu zhi real:"<<endl;fuzhi.show(); //调用成员函数;com1++;++com2;cout<<"qian zhui"<<endl;com1.show(); //调用成员函数;cout<<"hou zhui :"<<endl;com2.show(); //调用成员函数;return ;}五.程序调试六.实验总结在实验中其实程序的写入并不难,只是我们应该注意一些具体的细节,比如函数的初始化,函数的具体方法等等。
十进制数的加法与减法在我们日常生活中,十进制数是我们最常用的数制。
无论是购物、计算时间还是进行金融交易,我们都需要使用十进制数进行计算。
而在进行十进制数的加法和减法运算时,我们需要掌握一些基本的方法和技巧。
一、十进制数的加法十进制数的加法是我们最常见的运算之一。
下面,我将介绍一些常用的加法方法。
1. 垂直加法法则垂直加法法则是我们最常用的加法方法。
它的基本原理是将两个数的相同位数的数字对齐,然后从右向左逐位相加。
如果某一位的和大于等于10,就需要进位到更高位。
例如,计算1234 + 5678:```1234+ 5678------```首先,从右向左逐位相加:4 + 8 = 12,需要进位;3 + 7 + 进位 = 11,同样需要进位;2 + 6 + 进位 = 9;1 + 5 + 进位 = 7。
最终的结果是6912。
2. 补数法补数法是一种简化计算的方法。
它的基本原理是将一个数的补数与另一个数相加,然后再减去被加数的补数。
例如,计算47 + 58:首先,找到47的补数,即53。
然后,将53与58相加,得到111。
最后,减去47的补数53,得到58。
所以,47 + 58 = 111 - 53 = 58。
二、十进制数的减法十进制数的减法是加法的逆运算。
下面,我将介绍一些常用的减法方法。
1. 借位减法法则借位减法法则是我们最常用的减法方法。
它的基本原理是将两个数的相同位数的数字对齐,然后从右向左逐位相减。
如果被减数小于减数,就需要向高位借位。
例如,计算9876 - 5432:```9876- 5432------```首先,从右向左逐位相减:6 - 2 = 4;7 - 3 = 4;8 - 4 = 4;9 - 5 = 4。
最终的结果是4444。
2. 补数法补数法也可以用于减法运算。
它的基本原理是将一个数的补数与另一个数相加,然后再减去被减数的补数。
例如,计算98 - 57:首先,找到98的补数,即2。
然后,将2与57相加,得到59。
设计名称:设计一个一位十进制加减法器 设计内容:1、0-9十个字符和“+”“-”分别对应一个按键,用于数据输入。
2、用一个开关控制加减法器的开关状态。
3、要求在数码显示管上显示结果。
设计目的与要求:1、学习数字逻辑等电路设计方法,熟知加减法器、编码器、译码显示的工作原理及特点;2、培养勤奋认真、分析故障和解决问题的能力。
设计环境或器材、原理与说明:环境:利用多功能虚拟软件Multism8进行电路的制作、调试,并生成文件。
器材:74LS283或者4008, 4个异或门(一片74LS86)(减法);74LS08,3输入或门(加法)设计原理:图1分析:如图1所示,第一步置入两个四位二进制数(要求置入的数小于1010),如(1001)2和(0111)2,同时在两个七段译码显示器上显示出对应的十进制数9和7;第二步通过开关选择运算方式加或者减;第三步,若选择加运算方式,所置数送入加法运算电路进行运算,同理若选择减运算方式,则所置数送入减法运算电路运算;第四步,前面所得结果通过另外两个七段译码器显示。
设计过程(步骤)或程序代码: 实验电路:1:减法电路的实现:(1):原理:如图1所示(如下),该电路功能为计算A-B 。
若n 位二进制原码为N 原,则与它相对应的补码为N 补=2n -N 原,补码与反码的关系式为N 补=N 反+1,A-B=A+B补-2n=A+B反+1-2n(2):因为B○+1= B非,B○+0=B,所以通过异或门74LS86对输入的数B求其反码,并将进位输入端接逻辑1以实现加1,由此求得B的补码。
加法器相加的结果为:A+B反+1,(3):由于2n=24=(10000)2,相加结果与相2n减只能由加法器进位输出信号完成。
当进位输出信号为1时,它与2n的差为0;当进位输出信号为0时,它与2n差值为1,同时还要发出借位信号。
因为设计要求被减数大于或等于减数,所以所得的差值就是A-B差的原码,借位信号为0。
南昌航空大学实验报告课程名称:面向对象程序设计B实验名称:类与结构姓名:_________ 同组人:指导老师评定:签名:1.实验目的·学习完整的C++程序开发过程(编辑,编译,连接,调试,运行及查看结果)理解简单的C++程序结构·通过实验理解类与结构的区别,掌握类的定义,了解用户自定义数据类型2.实验内容应用VC++6.0的编辑环境构造一个类Date,该类主要实现日期的基本操作,例如初始化(非构造函数)、求当前日期为星期几、当前年份是否为闰年、该日为该年第几天、输出等,具体说明如下:该类拥有三个私有(或保护)成员变量year、month、day,分别代表日期中的年、月、日,成员函数有初始化函数、判断该年份是否为闰年函数、求当前日期为星期几函数、该日为该年第几天,结果输出函数等。
3.概要设计void init(int m int n int p )初始化函数int leapyear()判别闰年函数int week( )判别星期函数int Day()判别该日为此年第几天4.详细设计void init(int m,int n,int p)(初始化日期){year=m;month=n;day=p;}void leapyear()(判别闰年){if((year%4==0)&&(year%100!=0)||(year%400==0)) cout<<year<<"is leapyear"<<endl;elsecout<<year<<"isn't leapyear"<<endl;}int week()(求当前星期几){if(month==1||month==2){year -=1;month +=12;}return(day+1+2*month+3*(month+1)/5+year+(year/4)-year/100+year/400)%7;}void Day()(算当前天数){int t;if((year%4==0)&&(year%100!=0)||(year%400==0))t=28;elset=29;switch(month){case 1:cout<<"today is toyear's number"<<day;break;case 2:cout<<"today is toyear's number"<<day+31;break;case 3:cout<<"today is toyear's number"<<day+t+31;break;case 4:cout<<"today is toyear's number"<<day+t+31+31;break;case 5:cout<<"today is toyear's number"<<day+t+31+31+30;break;case 6:cout<<"today is toyear's number"<<day+t+31+31+30+31;break;case 7:cout<<"today is toyear's number"<<day+t+31+31+30+31+30;break;case 8:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31;break;case 9:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31;break;case 10:cout<<"today is toyear'snumber"<<day+t+31+31+30+31+30+31+31+30;break;case 11:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31+30+31;break;case 12:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31+30+31+30;break;}}5.程序调试6.实验总结通过此程序设计学会了类的使用而且对类中成分有了进一步的了解7.附录#include<iostream.h>class Date{private:int year,month,day;public:void init(int m,int n,int p)(初始化日期){year=m;month=n;day=p;}void leapyear()(判别闰年){if((year%4==0)&&(year%100!=0)||(year%400==0)) cout<<year<<"is leapyear"<<endl;elsecout<<year<<"isn't leapyear"<<endl;}int week()(求星期几){if(month==1||month==2){year -=1;month +=12;}return(day+1+2*month+3*(month+1)/5+year+(year/4)-year/100+year/400)%7;}void Day()(求该天为该年的第几天){int t;if((year%4==0)&&(year%100!=0)||(year%400==0))t=28;elset=29;switch(month){case 1:cout<<"today is toyear's number"<<day;break;case 2:cout<<"today is toyear's number"<<day+31;break;case 3:cout<<"today is toyear's number"<<day+t+31;break;case 4:cout<<"today is toyear's number"<<day+t+31+31;break;case 5:cout<<"today is toyear's number"<<day+t+31+31+30;break;case 6:cout<<"today is toyear's number"<<day+t+31+31+30+31;break;case 7:cout<<"today is toyear's number"<<day+t+31+31+30+31+30;break;case 8:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31;break;case 9:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31;break;case 10:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31+30;break;case 11:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31+30+31;break;case 12:cout<<"today is toyear's number"<<day+t+31+31+30+31+30+31+31+30+31+30;break;}}};void main(){int x,y,z;Date date;cout<<"please scanf the date"<<endl;cin>>x>>y>>z;(输入日期)date.init(x,y,z);date.leapyear();cout<<date.week()<<endl;date.Day();}。
十进制加减法数字电路课程设计报告Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998设计名称:设计一个一位十进制加减法器设计内容:1、0-9十个字符和“+”“-”分别对应一个按键,用于数据输入。
2、用一个开关控制加减法器的开关状态。
3、要求在数码显示管上显示结果。
设计目的与要求:1、学习数字逻辑等电路设计方法,熟知加减法器、编码器、译码显示的工作原理及特点;2、培养勤奋认真、分析故障和解决问题的能力。
设计环境或器材、原理与说明:环境:利用多功能虚拟软件Multism8进行电路的制作、调试,并生成文件。
器材:74LS283或者4008, 4个异或门(一片74LS86)(减法);74LS08,3输入或门(加法) 设计原理:图1分析:如图1所示,第一步置入两个四位二进制数(要求置入的数小于1010),如(1001)2和(0111)2,同时在两个七段译码显示器上显示出对应的十进制数9和7;第二步通过开关选择运算方式加或者减;第三步,若选择加运算方式,所置数送入加法运算电路进行运算,同理若选择减运算方式,则所置数送入减法运算电路运算;第四步,前面所得结果通过另外两个七段译码器显示。
设计过程(步骤)或程序代码:实验电路:1:减法电路的实现:(1):原理:如图1所示(如下),该电路功能为计算A-B。
若n位二进制原码为N原,则与它相对应的补码为N补=2n-N原,补码与反码的关系式为N 补=N反+1,A-B=A+B补-2n=A+B反+1-2n(2):因为B○+1= B非,B○+0=B,所以通过异或门74LS86对输入的数B求其反码,并将进位输入端接逻辑1以实现加1,由此求得B的补码。
加法器相加的结果为:A+B反+1,(3):由于2n=24=(10000)2,相加结果与相2n减只能由加法器进位输出信号完成。
当进位输出信号为1时,它与2n的差为0;当进位输出信号为0时,它与2n差值为1,同时还要发出借位信号。
1 / 1
微机原理实验
南昌航空大学实验报告
学生姓名: 学 号: 专业班级: 电子信息工程
实验类型:验证 □综合 □设计 □创新 实验日期: 实验成绩:
一、实验项目名称
实验一、多位十进制数相减实验
二、实验目的
(1)学习数据传送和算术运算指令的用法。
(2)熟悉在PC机上建立、汇编、连接、调试和运行汇编语言的过程。
三、实验要求
将两个多位十进制数相减,要求被减数、减数均以ASCII码形式按顺序存放在以DATA
1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
实验程序框图如下图所示:
四、实验程序
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,38H ;第一个数据(作为被减数)
DATA2 DB 36H,35H,30H,38H,32H ;第二个数据(作为减数)
MES1 DB '-','$'
MES2 DB '=','$'
DATA ENDS
STACK SEGMENT ;堆栈段
STA DB 20 DUP(?) ;定义由20个字节组成的数据缓冲区
(数组),每个字节的初值不确定
TOP EQU LENGTH STA 返回利用DUP定义的数组元素的个数到TOP,
TOP=20;
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA;
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
段使用设定语句,确定段寄存
与段的对应关系:从现在开
CS寄存器对应CODE段,
段使用设定语句是伪指令,它不能设置段寄存器
的值,只能通过指令语句给DS, ES, SS赋值,
CS由系统自动赋值。
堆栈指针寄存器赋值
1 / 1
MOV SP,AX
MOV SI,OFFSET DATA1 被减数送SI
MOV BX,05 位数5送BX中,作为显示子程序的循环控制
变量
CALL DISPL ;调用显示子程序,显示被减数
MOV AH,09H
LEA DX,MES1
INT 21H
MOV SI,OFFSET DATA2 减数送SI
MOV BX,05
CALL DISPL 调用显示子程序,显示减数
MOV AH,09H
LEA DX,MES2
INT 21H
MOV SI,OFFSET DATA1 被减数送SI
MOV DI,OFFSET DATA2 减数送DI
CALL SUBA ;调用减法子程序 ,进行减法运算
MOV SI,OFFSET DATA1 运算结果送SI
MOV BX,05 ;
CALL DISPL 调用显示子程序,显示运算结果
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
INT 21H
MOV AX,4C00H
INT 21H
DISPL PROC NEAR ;显示子程序(显示5个字符:BX=5)
DSI: MOV AH,02 AH=02H,显示一个字符到屏幕
MOV DL,[SI+BX-1] ;显示字符串中一字符
INT 21H
DEC BX ;修改偏移量
JNZ DSI BX不等于0,继续显示
RET
DISPL ENDP
SUBA PROC NEAR
MOV DX,SI 把被减数数据地址送到DX
MOV BP,DI 把减数数据地址送到BP
MOV BX,05
SU1: SUB BYTE PTR[SI+BX-1],30H
DOS功能调用:AH=09H,显示字符串到
屏幕,DX::要显示的内容。显示“-”号
DOS功能调用:AH=09H,显示字符串到
屏幕,DX::要显示的内容。显示“=”号
DOS功能调用:AH=02H,显示一个字符到屏幕
,DX::要显示的内容:CR(回车)的ASCII码0D
DOS功能调用:AH=02H,显示一个字符到屏幕
,DX::要显示的内容:LF(换行)的ASCII码0A。
DOS功能调用:AH=4CH,退出程序
保护数据地址
将ASCII 码表示的数字转化为
十六进制表示的数字
1 / 1
SUB BYTE PTR[DI+BX-1],30H
DEC BX 将5位数据进行转换
JNZ SU1 ;
MOV SI,DX
MOV DI,BP
MOV CX,05 ;置循环初始值,包括进位,共
5位
CLC ;清进位位
SU2: MOV AL,[SI] 被减数送SI
MOV BL,[DI] 减数送 DI
SBB AL,BL ;带进位相减
AAS ;非组合BCD码的减法调整
MOV [SI],AL ;结果送被减数区
INC SI 指向下一位
INC DI ;指向下一位
LOOP SU2 ;CX=0? 循环
MOV SI,DX
MOV DI,BP
ADD BYTE PTR [DI+BX-1],30H
DEC BX
JNZ SU3
RET
SUBA ENDP
CODE ENDS
END START
五、实验步骤
1、先进入DOS系统,按照路径进入EDIT编写上述程序1.ASM,并保存;
2、用MASM编译1.ASM产生1.OBJ,在用LINK链接1.OBJ,最后用DEBUG调
试1.EXE;
3、运行程序,看结果是否正确。
4、实验结果如下图:
恢复数据地址
恢复数据地址
1 / 1
六、实验小结
1、进入DOS系统时一定要注意DOS系统的基本命令。
2、通过上机实验,进一步了解数据的传送过程。
3、要多加练习,熟悉在建立、汇编、连接、调试和运行汇编语言的过程。
4、实验过程中可能会遇到程序出错,我们要细心寻找错误并逐一改正。
5、最终的结果显示,我们的程序是正确的。