大整数计算器..
- 格式:doc
- 大小:124.00 KB
- 文档页数:28
请针对100以内正整数加法运算的计算器设计2条测试用例,要求采用通用用例写作格式标题:针对100以内正整数加法运算的计算器设计2条测试用例引言概述:计算器是我们日常生活中常用的工具之一,而针对100以内正整数加法运算的计算器则是一种常见的类型。
为了确保计算器的准确性和可靠性,设计测试用例是必不可少的环节。
本文将针对该类型的计算器设计两条测试用例,并按照通用用例写作格式进行阐述。
正文内容:1. 输入两个正整数进行加法运算1.1 输入两个小于100的正整数- 输入:num1 = 10, num2 = 20- 预期输出:30- 用例说明:测试计算器能够正确地计算两个小于100的正整数之和。
1.2 输入一个小于100的正整数和一个等于100的正整数- 输入:num1 = 80, num2 = 100- 预期输出:180- 用例说明:测试计算器能够正确地计算一个小于100的正整数和一个等于100的正整数之和。
2. 输入两个等于100的正整数进行加法运算2.1 输入两个等于100的正整数- 输入:num1 = 100, num2 = 100- 预期输出:200- 用例说明:测试计算器能够正确地计算两个等于100的正整数之和。
2.2 输入一个等于100的正整数和一个大于100的正整数- 输入:num1 = 100, num2 = 120- 预期输出:220- 用例说明:测试计算器能够正确地计算一个等于100的正整数和一个大于100的正整数之和。
3. 输入两个大于100的正整数进行加法运算3.1 输入两个大于100的正整数- 输入:num1 = 150, num2 = 200- 预期输出:350- 用例说明:测试计算器能够正确地计算两个大于100的正整数之和。
3.2 输入一个大于100的正整数和一个小于100的正整数- 输入:num1 = 150, num2 = 80- 预期输出:230- 用例说明:测试计算器能够正确地计算一个大于100的正整数和一个小于100的正整数之和。
计算器按键的使用说明.1、电源开关键:ON、OFF2、输入键:0—9、. +/—:正负转换键3、运算功能键:+ - * / (注意:加、减、乘、除键在计算时都可能代替等号键) √:开平方键,用来进行开平方运算。
先输入数字,再按下此键,不必按等号键即可得出结果。
4、等号键:=5、清除键:①C:清除键。
在数字输入期间,第一次按下此键将清除除存储器内容外的所有数值.如果是太阳能计算器,在计算器关闭状态下,按此键则开启电源,显示屏显示出“0”。
②AC或CA键:全部清除键,也叫总清除键,作用是将显示屏所显示的数字全部清除。
③→:右移键。
其功能是荧屏值向右位移,删除最右边的尾数。
④CE:部分清除键,也叫更正键。
其功能是清除当前输入的数字,而不是清除以前输入的数。
如刚输入的数字有误,立即按此键可清除,待输入正确的数字后,原运算继续进行。
如5+13,这时发现“13”输入错了,则按“CE”键就可以清除刚才的“13”,但还保留“5”这个数。
值得注意的是,在输入数字后,按“+”、“-”、“/”、“*”键的,再按“CE”键,数字不能清除。
⑤MC:累计清除键,也叫记忆式清除键。
其功能是清除储存数据,清除存储器内容,只清除存储器中的数字,内存数据清除,而不是清除显示器上的数字。
6、累计显示键:(1)M+:记忆加法键,也叫累加键。
是计算结果并加上已经储存的数;用作记忆功能,它可以连续追加,把目前显示的值放在存储器中(也就是将显示的数字与内存中已有的任何数字相加,结果存入存储器,但不显示这些数字的和)。
如去和小商贩买几种冰淇凌,买5筒五羊牌雪糕,每筒1.6元;买10筒绿色心情,每筒0.8元;买15筒蒙牛布丁,每筒0.4元。
共多少元?如先输入“5×1.6”→按“M+”键(把“5×1.6”的结果计算出来并储存起来)→然后输入“10×0.8”→按“M+”键(把“10×0.8”的结果计算出来并和前面储存的数相加)→接着输入“15×0.4”→按“M+”键(把“15×0.4”的结果计算出来并和前面储存的数相加)→最后按“MR”键(把储存的数全部取出来)→则出结果“22”(2)M-:记忆减法键,也叫累减键。
整数计算器已经调试.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。
就算是一坨屎,也有遇见屎壳郎的那天。
所以你大可不必为今天的自己有太多担忧。
/*****现在这个CPU处理的数据的顺序与常用的不太一致:运算操作符是最后输入功能:只可对整数进行:+ - * /已经在Q7.0中通过,尽管有些警告****/module myCPU(clk,reset_n,DataIn,DataOut);parameter ADD=4'd10,MIN=4'd11,MUL=4'd12,DIV=4'd13,EQUAL=4'd14,Eorr=4'd15;input clk,reset_n;input [3:0] DataIn; //数据输入,0~9为相应数值,A~F为操作指令output [31:0] DataOut; //供显示用reg [31:0] DataOut;reg [31:0] DataNew;reg [31:0] DataOld;reg enData; //选择运算结果或者当前输入做为显示输出always @(posedge clk)beginif(!reset_n)beginDataOld = 32'd0;DataOut = 32'd0;DataNew = 16'd0;endelsebegincase(DataIn)ADD:begin DataOld =DataOld+DataNew; enData=1'b0;endMIN:begin DataOld =DataOld-DataNew; enData=1'b0;endMUL:begin DataOld =DataOld*DataNew; enData=1'b0;endDIV:begin DataOld =DataOld/DataNew; enData=1'b0;endEQUAL: enData=1'b0; //只是显示结果Eorr: enData=1'bz; /*数据无效*/defaultbeginDataNew =10*DataNew+DataIn; enData=1'b1;endendcaseif(enData)beginDataOut=DataNew;endelsebegin DataOut=DataOld; DataNew = 16'd0; endendendendmodule。
大数计算器c语言实训报告一、实训目的本实训主要目的是通过编写大数计算器的程序,提高学生对于C语言中计算器程序的实现能力和大数计算的理解。
二、实训内容1.需求分析大数计算器是一种可以计算非常大的数字的计算器。
因为计算机对于整数数据的处理有固定长度限制,如果需要计算更大的数字,就需要使用特殊的算法。
由于人们生活和工作中经常碰到大数字的计算,因此大数计算器的开发具有非常大的应用价值。
2.程序设计在C语言中,可以使用数组存储大数,每一位数字使用数组的一个元素。
因为数组的长度也有限制,所以一般需要使用指针动态分配内存来存储大数。
C语言中提供了类似于Java中的BigInteger类的库,例如GMP库等。
使用这些库可以方便地进行大数计算。
本次实训要求学生编写一个自己的大数计算器程序,通过手动编写实现大数加、减和乘法运算。
3.测试编写完程序后,需要测试程序是否正确运行。
可以使用各种情况下的数据进行测试。
例如,测试小数点和整数的运算、测试负数的计算、测试多位和一位数字的计算、测试大数的计算等。
三、实训总结通过本次实训,我学习了C语言中大数计算的实现方法和相关的概念。
在实现大数计算器的过程中,我加深了对于C语言中数组和指针的理解和应用,同时也提高了编写C语言程序的能力。
在测试程序时,我发现了几个容易出错的地方,在修改后成功完成了大数计算器的编写。
通过本次实训,我掌握了C语言中大数计算的思路和方法,提高了编写C语言程序的能力。
我相信这些知识和经验在将来的工作和学习中都会派上用场。
硬盘分区整数G计算公式及计算器1)我们知道,1GB=1024MB、1TB=1024GB、1PB=1024TB、1EB=1024PB。
如果你想在Windows的“我的电脑”或“计算机”里看到整数G的硬盘分区,就要在分区时进行计算。
2)对于FAT32格式的硬盘分区,由于每1024个字节都会用4个字节来存储磁盘结构和数据存储位置等信息,但分区中的第一GB并不占用额外的存储容量,因此FAT32格式磁盘分区的整数G计算公式为(X-1)*4+1024*X=Y,其中X为你想得到的整数G数(单位为GB),Y为应分配的M数(单位为MB)。
为方便记忆,硬盘整数G计算公式也可写成(G-1)*4+1024*G=M。
3)比如,你想分个100G的整数G分区(FAT32格式),你要在分区软件(比如WinPM)里输入(100G-1)*4+1024*100G=102,796 M才能得到。
因为,Windows 认为100G不等于100,000M,也不等于102,400M,100G=102796 M。
硬盘分区整数G速查表4)对于NTFS格式的硬盘分区,原理比较复杂。
NTFS分区的最小容量不能精确到1MB,而是柱面大小。
硬盘一般有255个磁头,63个扇区,故每个柱面的大小为:512bit*255*63=8,225,280bit=7.84423828125MB。
5)如果要分个10GB的NTFS分区,理应为10*1024MB=10240MB,实际需要的柱面数为10240÷7.84423828125=1305.4。
因柱面只能算整数,即1306个柱面,这样实际分配的M数为1306*7.84423828125=10244.575MB,不管小数点后面几位都进1,也就是10245MB,这样才会被Windows系统认成是10GB。
计算器有关按键说明大全一、基本按键ON 开机OFF 关机AC 总清,清除所有存储和显示数值(又:CA, All ClearC 清除所有显示和当前运算、归零(又:CLR、Esc,英文名Clear注:以上又有组成组合键的情况为ON/OFF、ON/AC、ON/CCE 清除输入,清除当前输入数据中最后一个不正确的输入数据并显示“0”,可重新更正输入(英文名Clear Error或Clear Entry⌫清除光标前一字符(又:←、Backspace、BS、DEL(delete) INS 改写模式,从当前位置插入(英文名insertREPLAY 指令状态移动方向,上下查记录,左右移动当前表达式中光标(一般此键上有成十字排列的方向标识:▲▼◄►SHIFT 转换,上档选择(又: 2ndF、2nd、2nd(第二功能选择,Second Function)、ALT,按键设定为与其同色的功能ALPHA 阿尔法,字母,按键设定为与其同色的功能MODE 方式、模式,用于模式切换(不同的计算器有所不同,常用的见下表:对于数值计数法有:Norm(normal)标准计数法Fix(fixed)固定小数点Eng(engineering)工程计数法Sci(scientific)科学计数法Inv 反、倒置,用于使用其它有关按键的相反功能,多用于电子计算器。
如ln键变为e x键,sin键变为sin-1键,lsh键变为rsh键等EXP 以科学记数法输入数字,即表示以10为底的方幂(又:EE,英文名Exponent说明:科学记数法:将一个数字表示成a×10的n次幂的形式,其中1≤|a|<10,n表示整数,这种记数方法叫科学记数法。
如:5EXP2即5×102,就是500F-E 科学记数法开关,显示方式转换作用:十进制浮点(Floating Point)与科学记数法(Exponent)显示转换S⇔D 数值在标准形式(Standard)和小数形式(Decimal fraction)之间转换作用:分数与小数显示转换Ran# 随机数(又:RAND、RND、Rnd#,英文名Random, : 分隔符,用于输入方程式之间、坐标数据之间分隔用∠角,用于标识极坐标数据的角度数据或复数的虚数二、基础运算0、00、1、2、3、4、5、6、7、8、9 数字A、B、C、D、E、F 十六进制数字或存储单元. 十进制小数点+-×(*)÷(/)四则运算符注:-有的作为负号=等号⁄、±(-)+/-正负转换,负号(又:+−()括号,(称为始括号或左括号,)称为末括号或右括号注:=前的)键操作可省略a b c⁄、d/c 分数输入或将计算结果在小数值和分数值之间变换注:一般结果为小数,如果其绝对值大于或等于1,按一次d/c 以假分数形式显示,再按一次d/c则以带分数形式显示;如果其绝对值小于1,则两次均以真分数形式显示% 百分号,关于百分比的计算方法见下表注:以上实物计算器不按等号,不同的计算器定义不同,按其实际运算规则。
简单介绍简易计算器的使用方法简易计算器使用方法计算器是我们日常生活中常见的小工具之一,它能够方便快捷地完成各种数学运算。
在本文中,我们将简单介绍一下简易计算器的使用方法,帮助大家更好地利用这个小工具。
一、开机与关闭使用简易计算器之前,首先需要开机。
通常,在计算器上会有一个电源开关,打开开关后,计算器便会自动启动。
要关闭计算器,只需要将电源开关关闭即可。
二、数字输入在简易计算器上,数字输入是最基本的操作。
计算器通常会有一个数字键盘,上面标有0到9的数字。
通过按下相应的数字键,可以输入需要计算的数值。
输入多位数时,只需按照正确的顺序依次按下每个数字键。
三、基本运算简易计算器能够完成四则运算,包括加法、减法、乘法和除法。
使用计算器进行基本运算时,需要按下特定的运算符键。
1. 加法:简易计算器上通常会有一个“+”键,按下该键后,计算器会把当前输入的数值记为被加数,再输入另一个数值,按下“=”键,计算器就会显示它们的和。
2. 减法:类似地,简易计算器上通常会有一个“-”键,按下该键后,计算器会把当前输入的数值记为被减数,再输入一个数值,按下“=”键,计算器就会显示它们的差。
3. 乘法:简易计算器上通常会有一个“×”键,按下该键后,计算器会把当前输入的数值记为被乘数,再输入一个数值,按下“=”键,计算器就会显示它们的积。
4. 除法:类似地,简易计算器上通常会有一个“÷”键,按下该键后,计算器会把当前输入的数值记为被除数,再输入一个数值,按下“=”键,计算器就会显示它们的商。
四、小数与分数计算除了整数运算,简易计算器还可以进行小数和分数的计算。
对于小数的输入,直接使用数字键盘即可,对于分数的输入,则需要使用特定的输入方式。
通常,在计算器上会有一个“分数”键或“1/x”键,按下该键后,计算器会进入分数输入模式,在屏幕上显示分子和分母的输入框,通过按下数字键来输入相应的分子和分母。
输入完毕后,按下“=”键,计算器就会进行分数的计算。
实验五整数四则混合运算计算器一、实验目的掌握具有一定实用功能的汇编程序开发思路。
二、实验原理和内容1、在数据段上开辟:1个叫OP的字数组,长度为10个字;1个叫OPERATOR 的字节数组,长度为10个字节;以及1个RESULT字数组,长度1个字。
如下图:OP OPERATOR RESULT共10 共10个字个字节2、在数据段定义一个字符串缓冲区。
编写程序,输入字符串(该字符串有多个操作数和运算符,例如:12+34*56)到缓冲区中,然后从缓冲区把所有操作数转换为补码并分别保存到OP数组中,把所有运算符保存到OPERATOR中。
3、编写四则混合运算程序,结果以补码方式存放在RESULT上。
并在屏幕上输出结果。
三、实验器材:Windous 7系统下的Masm 2009汇编软件四、实验步骤:1、先画框图(如下)输入字符是“=”小于28H 大于39H 小于30H 输入结束是否是是是否否否是符号,执行相应处理是数值,执行相应处理输入是数值结果作为新的原值保存减30H与原值的10倍相加输入是符号是“(”是“)”否配对标志加1配对标志减1是是保存符号否输入结束配对标志为0出错,退出进行计算是否1212*34+563456*+数值存储符号存储(a)1212*(34+56-8)3456*(数值存储符号存储(b)8+-)1212*21-((34+56-8)+1)2134*(数值存储符号存储(c)56+-)81-(+)21优先级2优先级332优先级55132、 编写程序:;----------------------------------------------------------------------------- ;----------------------------数据定义----------------------------------------- DSEG SEGMENTSIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 NUMB DW 20H DUP (0) ;保存输入的数值 MARK DB 'A' ;保存输入的运算符 DB 10H DUP (0) ;ERROR DB ' YOUR INPUT ARE WRONG$' DSEG ENDS;----------------------------宏定义-----------------------------------------DISP MACRO M ;字符串输出LEA DX,M ;将M的偏移地址传送给DX寄存器MOV AH,9 ;其中09H是字符串输出INT 21H ;通过给AH寄存器赋值,再调用INT 21H指令,根据AH寄存器中的值执行相应的操作ENDMCHOICE MACRO ASC1,HAO1,HH ;宏定义,给运算符赋权值CMP AL,ASC1 ;比较键盘输入的运算符(运算符的ASC码存放在AL寄存器)与ASC1JNE OTHER&HAO1 ;若不等,则往下执行OTHER1,如此类推MOV CH,HH ;将运算符的权值(即优先级高低值)传送到CH 寄存器JMP OTHER7 ;执行后,返回ENDM;----------------------------------------------------------------------------CSEG SEGMENT;ASSUME CS:CSEG,DS:DSEGSTART: CALL CLEARMOV AX,DSEG ;MOV DS,AX ;LEA DI,NUMB ;将NUMB的偏移地址传送到DI,NUMB存储单元中存放输入的数值LEA SI,MARK ;将MARK的偏移地址传送到SI,MARK存储单元中存放输入的运算符MOV AX,0;数据寄存器清零MOV DX,0MOV BX,0MOV CX,0STA1 : CALL CR ;回车换行;--------------------------------初始化-------------------------------------INPUT:MOV AH,1 ;其中1H是键盘输入并回显,AL中有输入字符INT 21H ;通过给AH寄存器赋值,再调用INT 21H指令,根据AH寄存器中的值执行相应的操作;--------------------------------输入字符-----------------------------------CMP AL,'q'JE J_SHU;----------------------------若输入q,则返回dos状态--------------------------CMP AL,'=';JE PD ;判断配对标志位;--------------------是等号,进一步判断输入括号是否配对---------------------- CMP AL,28H ;JB BC ;JB为小于就跳转CMP AL,39H ;JA BC ;JA为大于就跳转;-------------------输入字符的ASC码小于28H或大于39H,则继续输入-------------- CMP AL,2FH ;判断是数字还是符号JBE JUD ;是符号转入响应操作;----------------------------------------------------------------------------INC WORD PTR SIGN1 ;将数字标志位加1SUB AL,30H ;将ASC码转16进制MOV AH,0 ;XCHG AX,[DI] ;互换两个操作数的存放位置,实现字交换MOV BX,10 ;MUL BX ;无符号数乘法指令XCHG AX,[DI] ;ADD [DI],AX ;JMP INPUT ;;-------------------------输入为数值时的操作----------------------------------PD: CMP WORD PTR SIGN2,0 ;判断配对标志位JE JUD ;跳到判断数值是否输入完毕JMP BC ;不配对则显示ERROR;----------------------------------------------------------------------------JUD: CMP WORD PTR SIGN1,0 ;判断数值是否输入完毕JE FUH1 ;跳到判断优先级ADD DI,2 ;DI向下移一个字MOV WORD PTR SIGN1,0;数值标志位清零;----------------------------------------------------------------------------FUH1: CALL ADV ANCE ;判定优先级CMP CH,5 ;判断输入的运算符中是否有左括号JNE PY ;不是,则判断输入的运算符中是否有右括号;----------------------------------------------------------------------------INC WORD PTR SIGN2 ;是左括号,括号标志位加1;----------------------------------------------------------------------------PY: CMP CH,1 ;判断输入的是否是右括号JNE AGAIN ;跳到判断运算存储区是否为空DEC WORD PTR SIGN2 ;是右括号,括号标志位减1;----------------------------------------------------------------------------AGAIN: CMP BYTE PTR[SI],'A';判断运算符存储区是否为空JE SA VE ;判断输入是否为=CMP CH,[SI] ;JA SA VE ;计算高优先级的SI指向运算符,每个运算符都有相应的权值CMP BYTE PTR[SI],'('JNE YIDO;寻找左括号DEC SI;是左括号,还是向上移,判断左括号前边是否还有运算符JMP INPUT;;----------------------------------------------------------------------------YIDO: DEC SI ;SI向上移MOV CL,[SI] ;将运算符传送给CLCALL MATCH ;判断是什么运算符并进行相应的计算JMP AGAIN ;判断运算符存储区是否为空;----------------------------------------------------------------------------SA VE: CMP CH,0 ;JE OVER ;=时,则输出结果CMP CH,1 ;JE INPUT ;“)”不保存,输入下一个数INC SI ;MOV [SI],AL ;INC SI ;CMP CH,5 ;JNE GO_ON ;MOV CH,2 ;改变(的权值GO_ON: MOV [SI],CH ;JMP INPUT ;;----------------------------------------------------------------------------BC: LEA DX,ERROR ;将ERROR的偏移地址给DXMOV AH,9 ;INT 21H ;CALL CRJMP J_SHU1 ;;----------------------------四则运算子程序---------------------------------- MATCH PROC ;子程序,进行相应的运算PUSH AX ;XOR AX,AX;异或XOR BX,BX;----------------------------乘法运算---------------------------------------CMP CL,2AH ;乘法运算JNE NEXT1SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXMOV [DI],AXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------除法运算--------------------------------------- NEXT1: CMP CL,2FH ;除法运算JNE NEXT2SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXMOV [DI],AXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------加法运算--------------------------------------- NEXT2: CMP CL,2BH ;加法运算JNE NEXT3SUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISH;---------------------------------------------------------------------------;----------------------------减法运算--------------------------------------- NEXT3: CMP CL,2DH ;减法运算JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH: POP AXRETMATCH ENDP;----------------------------------------------------------------------------;----------------------------定义优先级-------------------------------------- ADV ANCE PROCCHOICE 28H,1,5 ;( 28H为( 的ASCII码OTHER1: CHOICE 29H,2,1 ;)OTHER2: CHOICE 2AH,3,4 ;*OTHER3: CHOICE 2FH,4,4 ;/OTHER4: CHOICE 2BH,5,3 ;+OTHER5: CHOICE 2DH,6,3 ;-OTHER6: CHOICE 3DH,7,0 ;=OTHER7: RETADV ANCE ENDP;----------------------------------------------------------------------------;----------------------------***清屏***-------------------------------------- Clear PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,06HMOV AL,00HMOV CH,0MOV CL,0MOV BH,0FHMOV DH,18HMOV DL,4FHINT 10HMOV BH,0MOV DX,0MOV AH,02HINT 10HPOP DXPOP CXPOP BXPOP AXRETClear ENDP;----------------------------------------------------------------------------;----------------------------****回车换行****-------------------------------- CR PROCPUSH AXPUSH DXMOV AH,2MOV DL,13;回车INT 21HMOV AH,2MOV DL,10;换行INT 21HPOP DXPOP AXRETCR ENDP;----------------------------------------------------------------------------OVER:SUB DI,2CMP WORD PTR[DI],0JGE W1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21H;---------------------------------------------------------------------------- W1: MOV BX,10000MOV CX,5MOV SI,0;---------------------------------------------------------------------------- W2: MOV AX,[DI]MOV DX,0DIV BXMOV [DI],DXCMP AL,0JNE W3CMP SI,0JNE W3CMP CX,1JE W3JMP W4;---------------------------------------------------------------------------- W3: MOV DL,ALADD DL,30HMOV AH,2INT 21HMOV SI,1;---------------------------------------------------------------------------- W4: MOV AX,BXMOV DX,0MOV BX,10DIV BXMOV BX,AXLOOP W2;---------------------------------------------------------------------------- J_SHU1: MOV WORD PTR[DI],0CALL CRMOV NUMB,0MOV SIGN1,0LEA DI,NUMB ;LEA SI,MARKJMP STA1;----------------------------****返回DOS状态****-----------------------------J_SHU: MOV AH,4CH;返回DOS状态INT 21H;----------------------------------------------------------------------------CSEG ENDSEND START3、显示结果五、实验总结:在本次的课程设计中,我遇到了很多难题,在通过翻看书本和上网找资料后,我渐渐的接触到一点眉目,开始进行尝试的编程,在不断的尝试、失败和修改中,我慢慢的懂得汇编一个计算器的基本原理和所需要的一些细节问题。
齐鲁工业大学面向对象程序设计课程设计报告学号:************姓名:***班级:计科12-1班课程设计题目:有符号大整数计算器成绩:一:设计目的与要求对数值很大、精度很高的数进行高精度大整数计算是一类十分常见的问题。
但由于C++语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此类问题,为尝试解决这个问题,专门设计一个C++语言程序用于有符号大整数的计算。
二:设计内容分析1.功能分析:2.函数设计:A.运算辅助函数(1)检测用户输入运算符函数:Check_Oper()函数原型:char Check_Oper(string &str,string &num_1,string &num_2);功能:检测用户输入的运算符,并将char类型的运算符作为函数的返回值,若用户输入有误则提示用户。
(2)反转字符串函数:Reverse_String()函数原型:string Reverse_String(string &str);功能:传入string类型对象的引用,将其中保存的字符串全部反转后作为函数的返回值返回。
(3)字符串ASCII码减48位函数:SUB_ASC()函数原型:string SUB_ASC(string &str);功能:将string类型对象中字符串的所有元素的ASCII码减48。
(4)字符串ASCII码加48位函数:ADD_ASC()功能:将string类型对象中字符串的所有元素的ASCII码加48。
(5)获取最大数函数:GET_MAX()函数原型:string GET_MAX(string &num1,string &num2);功能:将两个以string类型存放的大整数传入函数,返回值最大的整数的string对象。
B.数据运算(1)加法运算:addition()函数原型:string addition(string &num1,string &num2);实现步骤:依次将两个字符串的每一位元素的ASCII码进行加法运算并存入结果中,对满十的结果进行进位,然后对该位进行对十取余存入当前元素中。
目录一.问题的概述、分析及研究意义;二.流程图三.算法设计四.调试过程五.源程序一.问题的概述、分析及研究意义;设计一个计算器实现两个任意长得整数的加、减、乘、除。
对数值很大,精度很高的数进行高精度大整数计算是一类十分常见的问题,但由于C语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此问题,为尝试解决这个问题,专门设计一个C语言程序用于大整数的计算。
为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。
利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。
为此需要两个结构数据类型:双向循环链表和长整数。
本程序实现计算任意长的整数的四则运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以回车结束,可以直接输入正数或负数,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。
二.流程图三.算法设计1.定义全局变量#define LEN sizeof(struct Node)#define MAX 1000#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef int Status;2,主要函数(1)主程序模块://int main()(2)双向循环链表处理模块://Status conversion(char str[],NodeList &oprh);//int cmplinklen(NodeList opr1,NodeList opr2);//Status Creat(NodeList &oprr,int len);//int compare(NodeList opr1,NodeList opr2);(3)长整数四则运算模块://Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr);//Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr);//Status imul(NodeList opr1,NodeList opr2,NodeList &oprr);//Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand);(4)界面模块://void title();//void welcome();3,编写函数(1)函数:Status conversion(char str[],NodeList &oprh) 功能:将字符串形式的操作数转换成所需的类型(2)函数:Status input(NodeList &opr1,NodeList &opr2,char str[])功能:输入需要的操作数(3)函数:Status output(NodeList oprr,char str[])功能:输出需要的操作数以及判断其正确性(4)函数:Status initbuf(char str[])功能:为数据对象或变量赋初值(5)函数:int cmplinklen(NodeList opr1,NodeList opr2) 功能:比较两个输入数的大小,长返回1,短返回-1,否则返回0(6)函数:int length(NodeList oprr)功能:求出链表长度(7)函数:Status Creat(NodeList &oprr,int len)功能:生成一个指定链表(8)函数:int compare(NodeList opr1,NodeList opr2) 功能:比较两个数的绝对值的大小(9)函数:Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr)功能:实现两个数相加(10)函数:Status sub_bas(NodeList opr1,NodeList opr2,NodeList &oprr)功能:实现两个数的相减(11)函数:Status imul(NodeList opr1,NodeList opr2,NodeList &oprr)功能:实现两个数的相乘(12)函数:Status idiv(NodeList opr1,NodeList opr2,NodeList &quti,NodeList &remand)功能:实现两个数的除法四.调试过程运行平台:Microsoft Visual C++ 6.0 1,欢迎界面2,选择操作3,加法运算4,减法运算5,乘法运算6,除法运算8,结束运行五.源程序#include<string.h>#include<stdlib.h>#include<stdio.h>#define LEN sizeof(struct Node)#define MAX 1000#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef int Status;//自定义一个变量typedef struct Node{int data;struct Node *prior,*next;}Node,*NodeList;//定义双向循环链表结构体//===============输入模块=============== //求指数函数值int axp(int a,int k){int r=1;if(k==0)return 1;for(;k>0;k--)r=r*a;return r;}//输入转换函数Status conversion(char str[],NodeList &oprh){//将字符串形式的操作数转换成所需的类型NodeList p;int i,k,buffer;k=buffer=0;oprh=(NodeList)malloc(LEN);oprh->next=oprh;oprh->prior=oprh;for(i=strlen(str)-1;i>=0;i--){//若输入的数不合法就返回重新输入if((i!=0 || (str[0]!='-' && str[0]!='+'))&&(str[i]>'9' || str[i]<'0')) return ERROR;if(str[0]=='0' && str[1]!='\0')return ERROR;if((str[0]=='-' || str[0]=='+') && str[1]=='0')return ERROR;if(str[i]!='-' && str[i]!='+'){buffer=buffer+(str[i]-'0')*axp(10,k);k++;if(k==4 || str[i-1]=='-' || str[i-1]=='+' || i==0){//将新建结点插入到头结点之后p=(NodeList)malloc(LEN);oprh->next->prior=p;p->prior=oprh;p->next=oprh->next;oprh->next=p;p->data=buffer;buffer=k=0;}}}if(str[0]=='-')oprh->data='-';elseoprh->data='+';return OK;}//输入函数Status input(NodeList &opr1,NodeList &opr2,char str[]){int flag=OK,i,n=0,l;char b[MAX];printf("\n请输入第一个操作数:\n");scanf("%s",b);getchar();l=strlen(b);for(i=0;i<l;i++)if(b[i]!=',')str[n++]=b[i];str[n]='\0';flag=conversion(str,opr1);while(!flag){printf("ERROR!Input again:\n");scanf("%s",str);getchar();flag=conversion(str,opr1);}printf("\n请输入第二个操作数:\n");scanf("%s",b);getchar();n=0;l=strlen(b);for(i=0;i<l;i++)if(b[i]!=',')str[n++]=b[i];str[n]='\0';flag=conversion(str,opr2);while(!flag){printf("ERROR!Input again:\n");scanf("%s",str);getchar();flag=conversion(str,opr2);}return OK;}//==================输出模块====================== //输出函数Status output(NodeList oprr,char str[]){Status initbuf(char str[]);NodeList p;int i,j,num[4];if(!oprr)return ERROR;p=oprr;i=j=0;initbuf(str);if(oprr->data=='-')str[i++]='-';p=p->next;if(p->next==oprr && p->data==0)//若要输出的数为0则执行str[i++]='0';elsewhile(p!=oprr){num[0]=p->data/1000;num[1]=(p->data-num[0]*1000)/100;num[2]=(p->data-num[0]*1000-num[1]*100)/10;num[3]=p->data-num[0]*1000-num[1]*100-num[2]*10;while(j<4){if(num[j]!=0 || (str[0]=='-' && str[1]!='\0')||(str[0]!='-' && str[0]!='\0'))//此判断语句是为了避免输出诸如:00123…的情况str[i++]=num[j]+'0';j++;}p=p->next;j=0;str[i++]=',';}if(str[--i]==',')str[i]='\0';printf("%s",str);printf("\n");return OK;}//================预处理及杂项操作模块====================//缓冲区部分初始化函数Status initbuf(char str[]){int i;for(i=0;i<=10;i++)str[i]='\0';return OK;}//比较链表长度函数int cmplinklen(NodeList opr1,NodeList opr2){//opr1链比opr2链长则返回1,短则返回-1,否则返回0NodeList p1,p2;p1=opr1->prior;p2=opr2->prior;while(p1->prior!=opr1 && p2->prior!=opr2){p1=p1->prior;p2=p2->prior;}if(p1->prior!=opr1)return 1;if(p2->prior!=opr2)return -1;return 0;}//求链表长度int length(NodeList oprr){int count=0;NodeList p=oprr->next;while(p!=oprr){count++;p=p->next;}return count;}//生成指定长度链表Status Creat(NodeList &oprr,int len){NodeList p;oprr=(NodeList)malloc(LEN);p=oprr;while(len>0){p->next=(NodeList)malloc(LEN);p->next->data='?';p->next->prior=p;p=p->next;len--;}p->next=oprr;oprr->prior=p;return OK;}//比较opr1、opr2绝对值的大小int compare(NodeList opr1,NodeList opr2){NodeList p1,p2;p1=opr1->next;p2=opr2->next;if(cmplinklen(opr1,opr2)==1)//opr1比较长return 1;else if(cmplinklen(opr1,opr2)==-1)//opr2比较长return -1;else{while(p1->data==p2->data && p1->next!=opr1)//注意p1->next!=opr1这条件{p1=p1->next;p2=p2->next;}if(p1->data>p2->data)return 1;else if(p1->data<p2->data)return -1;elsereturn 0;}}//=====================加减法模块==========================//加法基本操作Status add_bas(NodeList opr1,NodeList opr2,NodeList &oprr){//本算法实现A,B相加的操作。