实验报告_大数计算器
计算器 实验报告

计算器实验报告计算器实验报告引言:计算器是一种广泛应用于日常生活和工作中的电子设备。
它的出现极大地方便了人们的计算工作,提高了计算的准确性和效率。
本实验旨在深入了解计算器的原理和工作方式,并通过实际操作,探索计算器的功能和使用方法。
一、计算器的原理和结构计算器是一种基于数字电路和逻辑电路的电子设备。
它主要由处理器、显示屏、键盘和电源等组成。
处理器是计算器的核心部件,负责执行各种计算操作。
显示屏用于显示计算结果和输入的数据。
键盘则用于输入数字和操作符。
电源为计算器提供电能。
二、计算器的基本功能1. 四则运算:计算器可以进行加、减、乘、除等基本的四则运算。
用户只需按下相应的数字和操作符键,计算器即可自动完成计算,并在显示屏上显示结果。
2. 百分数计算:计算器还可以进行百分数的计算。
用户只需输入百分数和相应的操作符,计算器将自动将百分数转换为小数,并进行计算。
3. 平方根和乘方计算:计算器还具备开平方根和乘方的功能。
用户只需按下相应的键,输入要计算的数字,计算器将自动进行计算,并在显示屏上显示结果。
4. 括号和优先级计算:计算器支持括号和优先级计算。
用户可以使用括号来改变计算的顺序,并通过设置优先级来控制计算的顺序。
三、计算器的使用方法1. 数字输入:用户可以通过按下相应的数字键来输入数字。
计算器一般有0到9的数字键,用户可以按下多次来输入多位数。
2. 操作符输入:计算器一般有加、减、乘、除等操作符键。
用户可以按下相应的操作符键来输入操作符。
3. 清除和删除:计算器一般有清除和删除键。
用户可以使用清除键来清除计算器的显示屏和内存中的数据。
删除键则用于删除输入的数字和操作符。
4. 计算结果:用户可以按下等号键来计算结果。
计算器将根据输入的数字和操作符进行计算,并在显示屏上显示结果。
四、实验过程和结果在实验中,我们使用了一款普通的计算器进行操作。
首先,我们按下数字键输入了一组数字,然后按下操作符键进行四则运算。
简单计算器实验报告

简单计算器实验报告简单计算器实验报告引言:在现代社会,计算器已经成为人们生活中不可或缺的工具之一。
无论是在学校、办公室还是家庭,计算器都扮演着重要的角色。
本实验旨在设计和构建一个简单的计算器,并通过实验验证其功能和准确性。
实验步骤:1. 设计计算器的外观和功能:我们首先对计算器进行了外观设计,选择了简洁、易于使用的界面。
然后确定了计算器的基本功能,包括加法、减法、乘法和除法。
2. 选择合适的硬件和软件:为了构建计算器,我们选择了合适的硬件和软件。
硬件方面,我们选用了一块Arduino开发板、液晶显示屏和按键。
软件方面,我们使用了Arduino编程语言。
3. 连接硬件和编写代码:我们将液晶显示屏和按键与Arduino开发板连接起来,并编写了相应的代码。
代码中包括了计算器的逻辑运算和界面显示。
4. 测试计算器的功能和准确性:在完成硬件连接和代码编写后,我们对计算器进行了测试。
我们输入了一系列的算术表达式,包括简单的加减乘除运算,以及复杂的多步运算。
通过与手动计算的结果进行对比,我们验证了计算器的功能和准确性。
实验结果:经过多次测试,我们的计算器表现出了良好的功能和准确性。
无论是简单的加法还是复杂的多步运算,计算器都能够正确地给出结果。
液晶显示屏清晰地显示了算术表达式和计算结果,而按键的响应速度也非常迅速。
讨论:虽然我们的计算器在功能和准确性方面表现出色,但仍有一些改进的空间。
首先,我们可以增加更多的功能,如开方、求余等。
其次,我们可以改进界面设计,使其更加美观和易于使用。
此外,我们还可以考虑加入更强大的处理器和更大的内存,以提高计算器的性能。
结论:通过本次实验,我们成功设计和构建了一个简单的计算器,并验证了其功能和准确性。
计算器在各种算术运算中表现出色,并且具有清晰的界面和快速的响应速度。
然而,我们也意识到计算器仍有改进的空间,包括增加更多功能和改进界面设计。
总的来说,本次实验为我们深入了解计算器的原理和构造提供了宝贵的经验。
大学计实验报告算机

大学计实验报告算机一、引言计算机实验是大学计算机专业主要的实践环节之一,旨在培养学生动手能力和解决实际问题的能力。
本实验报告将介绍我在大学计算机实验课程中进行的一项实验项目,以及实验过程中的设计思路、实验方法和实验结果等。
二、实验目的本次实验的目的是设计一个简单的计算器程序,实现基本的四则运算功能。
通过这个实验,我们将学习和掌握编程语言中的基本语法、算法设计和软件开发流程等知识。
三、实验环境和工具本次实验的环境是使用C++编程语言,在Windows操作系统下进行开发。
我们使用了Visual Studio代码编辑器和编译器。
四、实验内容我们的计算器程序需要满足以下要求:1.可以进行两个整数之间的加、减、乘、除运算;2.能够处理异常输入,例如除数为0;3.对用户的输入进行合法性检查,确保输入的是数字或者合法的运算符;4.提供友好的用户界面,即使是非技术人员也能够使用;5.可以进行多次计算,直到用户主动选择退出。
五、实验设计为了实现上述要求,我们按照以下步骤进行实验设计:1.设计程序的整体架构,确定分为输入、处理和输出三个模块;2.编写输入模块的代码,读取用户的输入并进行合法性检查;3.编写处理模块的代码,根据用户输入的运算符进行相应的运算;4.编写输出模块的代码,将计算结果显示在用户界面上;5.测试程序是否能够正确处理各种输入情况,并进行错误输入的异常处理。
六、实验步骤1.创建一个新的C++项目,并设置好相关的编译选项;2.编写程序的主要逻辑,包括输入、处理和输出模块;3.编写输入模块的代码,根据用户的输入进行合法性检查;4.编写处理模块的代码,根据运算符进行相应的运算;5.编写输出模块的代码,打印出计算结果;6.进行功能测试和异常输入测试,确保程序的正确性和鲁棒性;7.对程序进行性能测试,评估程序的性能。
七、实验结果经过多次测试和调试,我们的计算器程序能够正确处理各种输入情况,并能够返回正确的计算结果。
实验报告_大数计算器

(2)基本数字按键
private void button1_Click(object sender, EventArgs e){ if (number == "") answers = ""; if (textBox1.Text == "0") number = "1"; //当屏幕显示不为 0 else number += "1"; n++; textBox1.Text = number; //在屏幕显示当前字符串 } 其余按键 2~9 和数字 1 的实现方法相同。
ln 、e^ x、x ^ 2、 ) 赋值操作( log 、
private void button24_Click(object sender, EventArgs e){ if (number != "") n_1 = number; if (number == "" && buff_answer != "") n_1 = buff_answer; sum_number += "√(" + n_1 + ")" + "="; textBox1.Text = "√(" + n_1 + ")"; textBox2.Text = sum_number; operate_way = 7; answers = calculate_all(operate_way); Print(answers); } 其他运算赋值方法相同。
6、心得体会与总结 第一次上手大数计算器时, 首先想到的是用 c 语言中的数组进行 数据的存储,将小数与整数进行分开进行存储然后在对其分开运算。 但是在进行编程的过程中出现了很多问题,如在进行进位退位,除法 运算的精度确定,对运算数的预处理过程比较复杂,对于程序的效率 会有一定的影响。之后我想到的是将运算数以字符串的形式进行储 存,调用系统原有的基本运算以及其他科学运算,但是发现系统的精 度远远没有达到预定需求,系统中的函数精度只有 16 位。 经过两次数据结构设计失败之后,我再网上进行查询资料,发现 在 c#中有单独的大数类,但是该大数类并不能处理小数,所以我想 到将小数进行存储后进行移位操作,再将数字进行运算处理。这样做 的好处是不用对数字进行复杂的预处理,同时精度可以有质的提升。 在解决基本的数据结构后,对于基本运算可以很好的完成,其他 运算可以调用基本运算完成, 从中我体会到对于程序的模块化编程十 分重要。要将整个程序的功能细化,不要将多个功能写在一个函数之 中,这样在程序调用时会十分简捷使整个程序层次清晰。 在编程的过程中应当养成良好的习惯,对于变量的声明,注释的 填写以及函数的命名, 这些对于以后维护和修改程序提供了很大的便 利。编程时也应当更有耐心,更注意细节,在功能实现的同时也应注 意到使用时用户的习惯,这样才是一个好的程序。
计算器设计实验报告

计算器设计实验报告指导老师:张永安组长:潘文帅成员:宋王庆郭肖男常跃计算器设计实验报告一、实验目的1、通过实验了解计算器的程序代码。
2、能看懂计算器的电路原理图。
3、锻炼学生的动手实践能力。
二、实验内容设计一个简易的计算器,完成0~9999整数的一次加减乘除运算,减法运算结果可以实现计算结果的负数显示,除法运算结果为0~999并保留两位小数。
三、实验设备四、实验说明1.计算器电板图2.计算器引脚原理图3.程序代码/*************************************************程序名称:计算器设计功能:完成0~9999整数的一次加减乘除运算,减法运算结果可以实现计算结果的负数显示,除法运算结果为0~999并保留两位小数,按键音,设有清零键,首位零不显示,其它的显示"E"**************************************************/#include<AT89X51.H>unsigned char code XIANSHI[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40}; unsigned char code XIANSHIXIAOSHUDIAN[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//带小数点//unsigned char code XIANSHIWRONG[]={0x00,0x00,0x00,0x00,0x79};//错误时的显示// unsigned char code SAOMIAO[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴极扫描码表格//unsigned char DANYUAN[8]={0,0,0,0,0,0,0,0};unsigned long CUNZHI;unsigned long SHU[2]={0,0};unsigned char k,key,m,n;/*************************************************SIGN 存运算符(+、-、*、/)FLAG 用第几个数组,(出现非运算符前为0,出现运算符后为1)WRONG 输入多于4个时错误标志位(0对、1错)COUNT 输入0~9数字的个数SIZE 减数大于被减数时为1SIGNCOUNT 输入运算符的个数XIAOSHU 存一位小数的值DIVKEY 运算除法时置为1**************************************************/unsigned char SIGN,FLAG,WRONG,COUNT,SIZE,SIGNCOUNT,XIAOSHU[2],DIVKEY;/*************************************************程序名称:显示程序入口参数:无功能:实现将CUNZHI中的值进行动态数码显示局部变量:i,j,q全局变量:CUNZHI,DANYUAN[0],DANYUAN[1],DANYUAN[2],DANYUAN[3] 所用端口功能:P1口送显示码P2口公共端扫描返回值:无**************************************************/void disp(void){ unsigned char i,j,p,q;/**************错误时的显示*************/if(WRONG==1){ for(i=0;i<5;i++){ P1=XIANSHIWRONG[i];P2=SAOMIAO[i];for(j=6;j>0;j--) //动态显示延时程序//for(q=248;q>0;q--);}}else{ if(DIVKEY==1){ DANYUAN[0]=XIAOSHU[1];DANYUAN[1]=XIAOSHU[0];DANYUAN[2]=CUNZHI%10;DANYUAN[3]=CUNZHI/10%10;DANYUAN[4]=CUNZHI/100%10;DANYUAN[5]=CUNZHI/1000%10;for(p=5;p>2;p--){ if(DANYUAN[p]==0)DANYUAN[p]=16;else break;}for(i=0;i<5;i++){ if(i==2) //倒数第三位为小数位//{ P1=XIANSHIXIAOSHUDIAN[DANYUAN[i]];}else{P1=XIANSHI[DANYUAN[i]];}P2=SAOMIAO[i];for(j=6;j>0;j--) //动态显示延时程序//for(q=248;q>0;q--);}}else{DANYUAN[0]=CUNZHI%10;DANYUAN[1]=CUNZHI/10%10;DANYUAN[2]=CUNZHI/100%10;DANYUAN[3]=CUNZHI/1000%10;/*******************首位为零不显示*************/for(p=3;p>0;p--) //首位为零不显示//{ if(DANYUAN[p]==0)DANYUAN[p]=16;else break;}/**************为负数时的显示*****************/if(SIZE==1) //为负数第五位数码管显示"-"//{ DANYUAN[4]=17;}else //第五位数码管不显示//{ DANYUAN[4]=16;}for(i=0;i<5;i++){ P1=XIANSHI[DANYUAN[i]];P2=SAOMIAO[i];for(j=6;j>0;j--) //动态显示延时程序//for(q=248;q>0;q--);}}}}/**************************************************程序名称:处理程序入口参数:key功能:实现加减乘除运算全局变量:key、CUNZHI、SHU[0]、SHU[1]、FLAG、SIGN返回值:无**************************************************/void CHULI(key){unsigned char i,j;/*****************声音“嘀”*****************/TR0=1;for(i=200;i>0;i--) //延时100ms//for(j=248;j>0;j--);TR0=0;/*****************************************/if(key==15) //按键为清除键//{ CUNZHI=0;SHU[0]=0;SHU[1]=0;COUNT=0;WRONG=0;SIZE=0;SIGNCOUNT=0;XIAOSHU[0]=0;XIAOSHU[1]=0;DIVKEY=0;}else if((key>=0)&&(key<=9)) //按键为数字键// { COUNT++; //按下的数字键的次数///*****************加权运算*****************/SHU[FLAG]=SHU[FLAG]*10+key; //加权运算//CUNZHI=SHU[FLAG];}else if((key>=10)&&(key<=13)) //按键为运算键//{ SIGNCOUNT++;SIGN=key;FLAG++;COUNT=0;}else if(key==14) //按键为等于键//{ switch(SIGN){ case 10:CUNZHI=SHU[0]+SHU[1];break;case 11:{ if(SHU[0]>SHU[1]){ CUNZHI=SHU[0]-SHU[1];}else{ SIZE=1;CUNZHI=SHU[1]-SHU[0];}}break;case 12:CUNZHI=SHU[0]*SHU[1];break;case 13:DIVKEY=1;CUNZHI=SHU[0]*100/SHU[1];XIAOSHU[1]=CUNZHI%10;XIAOSHU[0]=CUNZHI/10%10;CUNZHI/=100;if(CUNZHI>999){ WRONG=1;}break;}}if((COUNT==5)||(SIGNCOUNT>1)||(CUNZHI>9999)) //输入数字键大于5时将WRONG置1//{ WRONG=1;}}/**************************************************程序名称:键盘扫描入口参数:无功能:进行键盘扫描全局变量:k局部变量:i,j调用函数:CHULI(key)返回值:无**************************************************/void JIANPAN(void){ unsigned char i,j;P3=0xff;P3_4=0; //扫描P3.4这条线上的四个按键//k=P3;k=k&0x0f;if(k!=0x0f) //看P3.4这条线上是否真的有按键按下//{ for(i=20;i>0;i--) //延时一段时间//for(j=248;j>0;j--);k=P3; //再判断一次//k=k&0x0f;if(k!=0x0f){ switch(k) //通过可能发生的四种可能比较看是哪个按键按下//{ case 0x0e:key=0;break;case 0x0d:key=4;break;case 0x0b:key=8;break;case 0x07:key=12;break;}k=P3;k=k&0x0f;while(k!=0x0f){ k=P3;k=k&0x0f;}CHULI(key);}}P3=0xff;P3_5=0; //扫描P3.5这条线上的四个按键// k=P3;k=k&0x0f;if(k!=0x0f) //看P3.5这条线上是否有按键按下// { for(i=20;i>0;i--) //延时等待//for(j=248;j>0;j--);k=P3; //再看一次//k=k&0x0f;if(k!=0x0f){ switch(k) //通过比较看是P3.5这条线上的哪一个按键按下// { c ase 0x0e:key=1;break;case 0x0d:key=5;break;case 0x0b:key=9;break;case 0x07:key=13;break;}k=P3;k=k&0x0f;while(k!=0x0f){ k=P3;k=k&0x0f;}CHULI(key);}}P3=0xff; //扫描P3.6这条线上的四个按键是否按下//P3_6=0;k=P3;k=k&0x0f;if(k!=0x0f){ for(i=20;i>0;i--)for(j=248;j>0;j--);k=P3;k=k&0x0f;if(k!=0x0f){ switch(k){ case 0x0e:key=2;break;case 0x0d:key=6;break;case 0x0b:key=10;break;case 0x07:key=14;break;}k=P3;k=k&0x0f;while(k!=0x0f){ k=P3;k=k&0x0f;}CHULI(key);}}P3=0xff; //扫描P3.7这条线上的四个按键是否按下//P3_7=0;k=P3;k=k&0x0f;if(k!=0x0f){ for(i=20;i>0;i--)for(j=248;j>0;j--);k=P3;k=k&0x0f;if(k!=0x0f){ switch(k){ case 0x0e:key=3;break;case 0x0d:key=7;break;case 0x0b:key=11;break;case 0x07:key=15;break;}k=P3;k=k&0x0f;while(k!=0x0f){ k=P3;k=k&0x0f;}CHULI(key);}}}/**************************************************程序名称:主程序功能:实现计算器加减乘除运算并显示全局变量:CUNZHI、FLAG、SIGN调用函数:disp()、JIANPAN()返回值:无***************************************************/void main(void){ TMOD=0X02;ET0=1;EA=1;TR0=0;TH0=(256-200)%256;TL0=(256-200)/256;CUNZHI=0;FLAG=0;SIGN=0;WRONG=0;SIZE=0;XIAOSHU[0]=0;while(1){ d isp();JIANPAN();}}/**************************************************定时中断***************************************************/void t0(void) interrupt 1 using 1{ P0_0=~P0_0;}五、实验结果首先按复位键,输入想要计算的数,进行四则运算(+ - * /)操作完成0~9999整数的一次加减乘除运算,减法运算结果可以实现计算结果的负数显示,除法运算结果为0~999并保留两位小数,按键音,设有清零键,首位零不显示,其它的显示“E”运算错误或计算延迟则有警报声提示。
大数计算器c语言实训报告

大数计算器c语言实训报告一、实训目的本实训主要目的是通过编写大数计算器的程序,提高学生对于C语言中计算器程序的实现能力和大数计算的理解。
二、实训内容1.需求分析大数计算器是一种可以计算非常大的数字的计算器。
因为计算机对于整数数据的处理有固定长度限制,如果需要计算更大的数字,就需要使用特殊的算法。
由于人们生活和工作中经常碰到大数字的计算,因此大数计算器的开发具有非常大的应用价值。
2.程序设计在C语言中,可以使用数组存储大数,每一位数字使用数组的一个元素。
因为数组的长度也有限制,所以一般需要使用指针动态分配内存来存储大数。
C语言中提供了类似于Java中的BigInteger类的库,例如GMP库等。
使用这些库可以方便地进行大数计算。
本次实训要求学生编写一个自己的大数计算器程序,通过手动编写实现大数加、减和乘法运算。
3.测试编写完程序后,需要测试程序是否正确运行。
可以使用各种情况下的数据进行测试。
例如,测试小数点和整数的运算、测试负数的计算、测试多位和一位数字的计算、测试大数的计算等。
三、实训总结通过本次实训,我学习了C语言中大数计算的实现方法和相关的概念。
在实现大数计算器的过程中,我加深了对于C语言中数组和指针的理解和应用,同时也提高了编写C语言程序的能力。
在测试程序时,我发现了几个容易出错的地方,在修改后成功完成了大数计算器的编写。
通过本次实训,我掌握了C语言中大数计算的思路和方法,提高了编写C语言程序的能力。
我相信这些知识和经验在将来的工作和学习中都会派上用场。
c语言实验报告计算器

c语言实验报告计算器C 语言实验报告计算器一、实验目的本次 C 语言实验的主要目的是通过编写程序实现一个简单的计算器功能,加深对 C 语言基本语法、数据类型、控制结构和函数的理解和运用,提高编程能力和解决实际问题的能力。
二、实验要求1、实现基本的四则运算(加、减、乘、除)功能。
2、能够处理用户输入的合法表达式,并输出计算结果。
3、具备错误处理能力,如除数为 0 、输入不合法等情况。
三、实验环境本次实验使用的编程环境是 Visual Studio Code,编译器为 GCC。
四、算法设计与思路(一)整体思路首先,需要从用户那里获取输入的表达式。
然后,对表达式进行解析和计算。
在计算过程中,需要根据运算符的优先级进行相应的运算。
为了实现这个过程,可以使用栈来存储运算符和操作数。
(二)具体算法1、定义一个栈来存储运算符,另一个栈来存储操作数。
2、逐字符读取输入的表达式。
如果是数字字符,则将其转换为数字并压入操作数栈。
如果是运算符,则根据运算符的优先级进行处理。
如果当前运算符的优先级高于栈顶运算符的优先级,则将其压入运算符栈。
否则,从操作数栈中弹出两个操作数,从运算符栈中弹出一个运算符,进行相应的运算,并将结果压入操作数栈。
3、当表达式读取完毕后,依次从运算符栈和操作数栈中弹出元素进行计算,直到运算符栈为空,此时操作数栈中的唯一元素即为表达式的计算结果。
五、代码实现```cinclude <stdioh>include <stdlibh>include <ctypeh>//定义栈的最大容量define MAX_SIZE 100//定义操作符栈typedef struct {char itemsMAX_SIZE;int top;} OperatorStack;//定义操作数栈typedef struct {double itemsMAX_SIZE;int top;} OperandStack;//初始化操作符栈void initOperatorStack(OperatorStack stack) {stack>top =-1;}//初始化操作数栈void initOperandStack(OperandStack stack) {stack>top =-1;}//判断操作符栈是否为空int isOperatorStackEmpty(OperatorStack stack) {return stack>top ==-1;}//判断操作数栈是否为空int isOperandStackEmpty(OperandStack stack) {return stack>top ==-1;}//操作符入栈void pushOperator(OperatorStack stack, char op) {if (stack>top < MAX_SIZE 1) {stack>items++stack>top = op;} else {printf("Operator stack overflow!\n");exit(1);}}//操作数入栈void pushOperand(OperandStack stack, double num) {if (stack>top < MAX_SIZE 1) {stack>items++stack>top = num;} else {printf("Operand stack overflow!\n");exit(1);}}//操作符出栈char popOperator(OperatorStack stack) {if (!isOperatorStackEmpty(stack)){return stack>itemsstack>top;} else {printf("Operator stack underflow!\n");exit(1);}}//操作数出栈double popOperand(OperandStack stack) {if (!isOperandStackEmpty(stack)){return stack>itemsstack>top;} else {printf("Operand stack underflow!\n");exit(1);}}//获取操作符的优先级int getPriority(char op) {switch (op) {case '+':case '':return 1;case '':case '/':return 2;default:return -1;}}//计算表达式double calculate(char expression) {OperatorStack opStack;OperandStack numStack; initOperatorStack(&opStack);initOperandStack(&numStack);int i = 0;while (expressioni!='\0'){if (isdigit(expressioni)){double num = 0;while (isdigit(expressioni)){num = num 10 +(expressioni '0');i++;}if (expressioni ==''){double fraction = 01;i++;while (isdigit(expressioni)){num +=(expressioni '0') fraction; fraction /= 10;i++;}}pushOperand(&numStack, num);} else if (expressioni =='('){pushOperator(&opStack, expressioni);i++;} else if (expressioni ==')'){while (opStackitemsopStacktop!='('){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}popOperator(&opStack);i++;} else {while (!isOperatorStackEmpty(&opStack) &&getPriority(opStackitemsopStacktop) >= getPriority(expressioni)){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}pushOperator(&opStack, expressioni);i++;}}while (!isOperatorStackEmpty(&opStack)){double num2 = popOperand(&numStack);double num1 = popOperand(&numStack);char op = popOperator(&opStack);if (op =='+'){pushOperand(&numStack, num1 + num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op ==''){pushOperand(&numStack, num1 num2);} else if (op =='/'){if (num2 == 0) {printf("Division by zero!\n");exit(1);}pushOperand(&numStack, num1 / num2);}}return popOperand(&numStack);}int main(){char expression100;printf("Enter an expression: ");scanf("%s", expression);double result = calculate(expression);printf("Result: %f\n", result);return 0;}```六、实验结果与分析(一)测试用例及结果以下是一些测试用例及其对应的结果:1、输入:"2 + 3",输出:50000002、输入:"5 2",输出:30000003、输入:"3 4",输出:120000004、输入:"6 / 2",输出:30000005、输入:"2 + 3 4",输出:140000006、输入:"(2 + 3) 4",输出:200000007、输入:"5 / 0",输出:Division by zero!(二)结果分析从测试结果来看,程序能够正确计算基本的四则运算表达式,包括有括号的情况。
java实验报告计算器

java实验报告计算器Java实验报告:计算器引言:计算器是我们日常生活中常用的工具之一,它能够帮助我们进行各种数学运算,提高计算的效率。
本实验旨在使用Java编程语言设计和实现一个简单的计算器,通过实践来加深对Java语言和面向对象编程的理解。
一、需求分析在设计计算器之前,我们首先需要明确计算器的功能需求。
一个基本的计算器应该包括加、减、乘、除四种基本运算,同时还应该具备清零、取反、百分比等附加功能。
在本实验中,我们将实现这些基本功能,并尝试添加一些额外的功能,如开根号、求平方等。
二、设计思路1. 用户界面设计我们可以使用Java的图形用户界面(GUI)库来设计计算器的界面。
可以使用按钮来表示数字和运算符,使用文本框来显示计算结果。
2. 数据结构设计为了实现计算器的功能,我们需要设计一个合适的数据结构来存储用户输入的数字和运算符。
可以使用栈(Stack)数据结构来实现这个功能。
当用户按下数字按钮时,将数字入栈;当用户按下运算符按钮时,将运算符入栈。
当用户按下等号按钮时,从栈中取出数字和运算符进行计算,并将结果显示在文本框中。
3. 运算逻辑设计计算器的运算逻辑可以使用逆波兰表达式来实现。
逆波兰表达式是一种不需要括号的数学表达式表示方法,通过后缀表达式的形式来表示运算符的优先级。
在计算器中,我们可以使用栈来实现逆波兰表达式的计算。
三、实验步骤1. 创建一个Java项目,并导入GUI库。
2. 设计计算器的用户界面,包括按钮和文本框。
3. 实现按钮的点击事件,根据用户输入的数字和运算符来更新栈的状态。
4. 实现等号按钮的点击事件,从栈中取出数字和运算符进行计算,并将结果显示在文本框中。
5. 实现清零、取反、百分比等附加功能的按钮点击事件。
6. 运行程序,测试计算器的各项功能是否正常。
四、实验结果与分析经过测试,我们的计算器能够正常地进行加、减、乘、除等基本运算,并且附加功能也能正常使用。
通过这个实验,我们不仅学习了Java语言的基本语法和面向对象编程的思想,还加深了对数据结构和逆波兰表达式的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ n_1 = answers; n_2 = number; number = ""; textBox1.Text = "+"; sum_number += n_2 + "="; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = ""; n_2 = ""; } } } 其他运算赋值方法相同。
3、功能实现(见附录) 4、计算器演示 (1)基本四则运算
(2)三角函数运算
(3)其他运算
(4)纠错处理
5、性能分析 对于四则基本运算而言, 调用库函数可以极大减少编程量同时可 以高效的完成运算。 对于阶乘计算 1000!可以做到立刻出结果,但是当数量级继续 上升时,10000!程序需要计算 10s 才可以出结果,100000!程序会 卡死。 对于三角函数运算,在计算时对其使用泰勒展开,共展开了 50 项。在计算过程中会反复调用基本运算以及比较函数,同时因为设置 精度比较高,计算的过程耗费时间比较长。 开根号运算使用的是二分查找,对于大整数查找过程时间较长。 总体来说计算器对于万位以内的基本运算可以满足需求, 对于精 度设置比较高时,需要耗费一定时间进行计算,耗费时间在可忍耐范 围内。
(2)基本数字按键
private void button1_Click(object sender, EventArgs e){ if (number == "") answers = ""; if (textBox1.Text == "0") number = "1"; //当屏幕显示不为 0 else number += "1"; n++; textBox1.Text = number; //在屏幕显示当前字符串 } 其余按键 2~9 和数字 1 的实现方法相同。
计算机组成结构 实验报告
实验题目:大数计算器 报告人: 学号:
实验报告
实验题目:大数计算器 报告人: 学号: 实验要求: 通过编程完成大数计算器的各项功能。 实验目的: 通过编程设计合理的数据结构,存储、计算大数。并通过高效的 算法对各项运算进行实现。 实验环境: C# 实验过程记录: 1、界面设计 通过 c#的控件对计算器的界面进行设计。 包 括 基 本 数 字 按 键 1 ~ 9、PI、e ; 计 算 按 键
(3)计算按键
、 *、 / 、x i. 赋值操作( 、
y
、Mod、 )
private void button16_Click(object sender, EventArgs e){ //当前没有运算 y_s!=1 if ((buff_answer != "" || number != "" || answers != "")&&y_s!=1) { //第一次运算,首先给第一个运算数赋值 if (number != "" && n_1 == "" && buff_answer == "" && n_2 == "")
ln 、e^ x、x ^ 2、 ) 赋值操作( log 、
private void button24_Click(object sender, EventArgs e){ if (number != "") n_1 = number; if (number == "" && buff_answer != "") n_1 = buff_answer; sum_number += "√(" + n_1 + ")" + "="; textBox1.Text = "√(" + n_1 + ")"; textBox2.Text = sum_number; operate_way = 7; answers = calculate_all(operate_way); Print(answers); } 其他运算赋值方法相同。
、 、 *、 / 、log、ln、e ^ x、x 2、 sin 、 cos 、 tan 、x y、Mod、n!、 ;
、ans 以及历史查看按键。如下图: 基本功能按键 clear、C、
2、计算器简介 (1)数据结构设置 本计算器以 c#中 using System.Numerics 为基础,该库中含有对 大数运算的基本加、减、乘、除,四则运算,但是该库中运算只支持 整形不支持小数。 因此在该基础上对每个运算式中数字的小数点的位 数进行记录, 将小数点去除后按照大数加法运算, 再计算小数点位置, 点到相应的位置。 注意:
{ n_1 = number; textBox1.Text = "+"; number = ""; sum_number = n_1; sum_number += "+"; textBox2.Text = sum_number; operate_way = 1; y_s = 1; } //第一次运算,第一个运算数已有值对第二个运算数赋值 else if (n_1 != "" && number != "" && n_2 == "" && buff_answer == "") { n_2 = number; textBox1.Text = "+"; number = ""; sum_number += n_2 + "="; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = ""; n_2 = ""; } //连续输入第二次运算 buff_answer!="",两个运算数都为空, 输入值为空 else if (buff_answer != "" && number == "" && n_1 == "" && n_2 == "") { n_1 = answers; answers = ""; textBox1.Text = "+"; sum_number += n_1; sum_number += "+"; textBox2.Text = sum_number; operate_way = 1; y_s = 1; } // 连续输入第二次运算 buff_answer!="", 两个运算数都为 空,输入值不为空 else if (buff_answer != "" && number != "" && n_1 == "" && n_2 == "")
6、心得体会与总结 第一次上手大数计算器时, 首先想到的是用 c 语言中的数组进行 数据的存储,将小数与整数进行分开进行存储然后在对其分开运算。 但是在进行编程的过程中出现了很多问题,如在进行进位退位,除法 运算的精度确定,对运算数的预处理过程比较复杂,对于程序的效率 会有一定的影响。之后我想到的是将运算数以字符串的形式进行储 存,调用系统原有的基本运算以及其他科学运算,但是发现系统的精 度远远没有达到预定需求,系统中的函数精度只有 16 位。 经过两次数据结构设计失败之后,我再网上进行查询资料,发现 在 c#中有单独的大数类,但是该大数类并不能处理小数,所以我想 到将小数进行存储后进行移位操作,再将数字进行运算处理。这样做 的好处是不用对数字进行复杂的预处理,同时精度可以有质的提升。 在解决基本的数据结构后,对于基本运算可以很好的完成,其他 运算可以调用基本运算完成, 从中我体会到对于程序的模块化编程十 分重要。要将整个程序的功能细化,不要将多个功能写在一个函数之 中,这样在程序调用时会十分简捷使整个程序层次清晰。 在编程的过程中应当养成良好的习惯,对于变量的声明,注释的 填写以及函数的命名, 这些对于以后维护和修改程序提供了很大的便 利。编程时也应当更有耐心,更注意细节,在功能实现的同时也应注 意到使用时用户的习惯,这样才是一个好的程序。
sin 、 、
查找的方法进行计算,具体实现见功能实现部分。 (3)特殊功能 对于三角函数运算,特意添加度与弧度的选择按键,用户可以根 据需求计算不同单位下的三角函数值。 同时对于计算的过程可以通过历史按键进行查看。 通过 ans 按钮直接取出上次答案进行下次运算。 (4)纠错处理 第一点:除法操作时除 0,计算机弹窗显示错误,返回显 示”wrong”。 第二点:对于连续点击运算符或小数点,设置标志位使系统自动 识别当前是否有运算在进行操作, 若有则无法继续输入运算符或小数 点。 第三点:每次运算时,判断对应运算的参与运算数字是否合法。 (5)屏幕显示 整数部分全部显示,小数部分主屏幕显示 30 位,历史界面可显 示 800 位(精度可调) 。
附录: 功能实现(由于代码量较大,只给出核心代码部分) : (1)变量声明 ansrwes buff_answers number y_s n_1 n_2 sum_number operate_way 储存答案 缓冲答案 当前运算数字 计算次数,y_s=0 为初次运算;y_s=1 为多次运算 第一个运算数 第二个运算数 用作存储历史记录 计算方式,标记运算