实验报告_大数计算器

合集下载

计算器 实验报告

计算器 实验报告

计算器实验报告计算器实验报告引言:计算器是一种广泛应用于日常生活和工作中的电子设备。

它的出现极大地方便了人们的计算工作,提高了计算的准确性和效率。

本实验旨在深入了解计算器的原理和工作方式,并通过实际操作,探索计算器的功能和使用方法。

一、计算器的原理和结构计算器是一种基于数字电路和逻辑电路的电子设备。

它主要由处理器、显示屏、键盘和电源等组成。

处理器是计算器的核心部件,负责执行各种计算操作。

显示屏用于显示计算结果和输入的数据。

键盘则用于输入数字和操作符。

电源为计算器提供电能。

二、计算器的基本功能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语言实训报告一、实训目的本实训主要目的是通过编写大数计算器的程序,提高学生对于C语言中计算器程序的实现能力和大数计算的理解。

二、实训内容1.需求分析大数计算器是一种可以计算非常大的数字的计算器。

因为计算机对于整数数据的处理有固定长度限制,如果需要计算更大的数字,就需要使用特殊的算法。

由于人们生活和工作中经常碰到大数字的计算,因此大数计算器的开发具有非常大的应用价值。

2.程序设计在C语言中,可以使用数组存储大数,每一位数字使用数组的一个元素。

因为数组的长度也有限制,所以一般需要使用指针动态分配内存来存储大数。

C语言中提供了类似于Java中的BigInteger类的库,例如GMP库等。

使用这些库可以方便地进行大数计算。

本次实训要求学生编写一个自己的大数计算器程序,通过手动编写实现大数加、减和乘法运算。

3.测试编写完程序后,需要测试程序是否正确运行。

可以使用各种情况下的数据进行测试。

例如,测试小数点和整数的运算、测试负数的计算、测试多位和一位数字的计算、测试大数的计算等。

三、实训总结通过本次实训,我学习了C语言中大数计算的实现方法和相关的概念。

在实现大数计算器的过程中,我加深了对于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编程语言设计和实现一个简单的计算器,通过实践来加深对Java语言和面向对象编程的理解。

一、需求分析在设计计算器之前,我们首先需要明确计算器的功能需求。

一个基本的计算器应该包括加、减、乘、除四种基本运算,同时还应该具备清零、取反、百分比等附加功能。

在本实验中,我们将实现这些基本功能,并尝试添加一些额外的功能,如开根号、求平方等。

二、设计思路1. 用户界面设计我们可以使用Java的图形用户界面(GUI)库来设计计算器的界面。

可以使用按钮来表示数字和运算符,使用文本框来显示计算结果。

2. 数据结构设计为了实现计算器的功能,我们需要设计一个合适的数据结构来存储用户输入的数字和运算符。

可以使用栈(Stack)数据结构来实现这个功能。

当用户按下数字按钮时,将数字入栈;当用户按下运算符按钮时,将运算符入栈。

当用户按下等号按钮时,从栈中取出数字和运算符进行计算,并将结果显示在文本框中。

3. 运算逻辑设计计算器的运算逻辑可以使用逆波兰表达式来实现。

逆波兰表达式是一种不需要括号的数学表达式表示方法,通过后缀表达式的形式来表示运算符的优先级。

在计算器中,我们可以使用栈来实现逆波兰表达式的计算。

三、实验步骤1. 创建一个Java项目,并导入GUI库。

2. 设计计算器的用户界面,包括按钮和文本框。

3. 实现按钮的点击事件,根据用户输入的数字和运算符来更新栈的状态。

4. 实现等号按钮的点击事件,从栈中取出数字和运算符进行计算,并将结果显示在文本框中。

5. 实现清零、取反、百分比等附加功能的按钮点击事件。

6. 运行程序,测试计算器的各项功能是否正常。

四、实验结果与分析经过测试,我们的计算器能够正常地进行加、减、乘、除等基本运算,并且附加功能也能正常使用。

通过这个实验,我们不仅学习了Java语言的基本语法和面向对象编程的思想,还加深了对数据结构和逆波兰表达式的理解。

计算器设计实验报告

计算器设计实验报告

计算器设计实验报告《计算器设计实验报告》摘要:本实验旨在设计一个简单的计算器,并测试其功能和准确性。

实验过程中,我们使用了基本的电子元件和逻辑门电路来实现计算器的各种功能。

经过测试,我们发现设计的计算器能够准确地进行加减乘除等运算,并且在使用过程中表现稳定可靠。

通过本实验,我们对计算器的设计和原理有了更深入的了解,并且掌握了一定的电子电路设计和测试技能。

引言:计算器是现代生活中不可或缺的工具,它能够帮助人们进行各种数学运算,提高工作和学习效率。

在本实验中,我们将设计一个简单的计算器,并测试其功能和准确性。

通过这个实验,我们可以更深入地了解计算器的原理和设计,为今后的电子电路设计和实验打下基础。

材料和方法:1. 电子元件:逻辑门、电阻、电容、LED等2. 电路板和连接线3. 电源和示波器4. 计算器设计图纸和电路原理图实验步骤:1. 根据设计图纸和电路原理图,连接各种电子元件,组装成一个计算器电路。

2. 使用电源给电路供电,并使用示波器测试电路的输出波形和稳定性。

3. 进行加减乘除等运算测试,记录计算器的准确性和稳定性。

4. 对计算器进行长时间稳定性测试,观察其在长时间使用中的表现。

实验结果:经过测试,我们发现设计的计算器能够准确地进行加减乘除等运算,并且在使用过程中表现稳定可靠。

电路的输出波形清晰,没有明显的波动和噪声。

在长时间稳定性测试中,计算器表现良好,没有出现明显的故障和失效现象。

讨论:通过本实验,我们对计算器的设计和原理有了更深入的了解,并且掌握了一定的电子电路设计和测试技能。

在今后的学习和工作中,我们可以根据这些知识和技能,设计和制作更复杂和功能更强大的计算器和其他电子设备。

结论:本实验设计了一个简单的计算器,并测试了其功能和准确性。

经过测试,我们发现设计的计算器能够准确地进行加减乘除等运算,并且在使用过程中表现稳定可靠。

通过这个实验,我们对计算器的设计和原理有了更深入的了解,并且掌握了一定的电子电路设计和测试技能。

实验报告计算器

实验报告计算器

实验报告||实验名称计算器课程名称面向对象程序设计(JAVA)||一、实验目的综合应用所学的知识分析问题、解决问题,提高实际编程能力及程序调试能力。

二、实验内容及要求用图形界面GUI编程,编写一个能够实现加减乘除的简单的计算器,要求使用监听类,还要能够连续加减,有清除功能,能够准确的计算出正确结果。

三、实验仪器与设备计算机,JDK,我用的是eclipse。

四、问题分析与系统设计问题分析:首先需要把图形界面设计出来,给组件注册监听器,转换事件信息,实现对数据的加、减、乘、除等计算器的基本的功能设计思想与设计结果:在主类Caculater中使用监听内部类 MyMonitor 对各个组件进行监听,在MyMonitor中对按键信息进行分类处理(数字,算术符号,功能键)。

数据成员主要有各个按钮以及计算器的各个状态(如初始状态等)。

成员函数有:1、对退格键的处理:backSpace() 2、对算是符号的处理:operater() 3、将数字字符串转换成数字:getDate()五、实验结果相反数、平方根等功能,能够将图形界面设计出来给注册监听器,实现界面与基本实现了简单的的加、减、乘、除以及倒数和取内部代码结合。

六、总结与体会1·我以前不清楚界面与内部代码是怎么连接的,现在知道了。

还学会简单的GUI编程,能够实现对界面进行布局2·跟c++有很大的不同,java多了许多的包,类呀,这样是编译快捷而且安全正确,学会使用了内部类,懂得了事件的响应以及如何处理事件。

3·锻炼了编程的逻辑思维,能够对数据进行逻辑的处理以及对整个程序的逻辑部署4·还知道了要想吧java学好是很难的,里面有许许多多的包,类。

要想好好运用java 就必须运用好java类包,java的简单编程只是基础,掌握系统提供的package和class 才是成为java厉害者的必经之路。

附件:源程序清单import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Panel;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.List;public class Caculator extends Frame {List<String> list = new ArrayList<String>();public static int step = 0; // 处理刚开始第一次计算的时候dataResult为零的问题private String command[] = { "BackSpace", "CE", "C" };private String normal[] = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" };private String special[] = { "", "MC", "MR", "MS", "M+" };private boolean firstInput = true;private boolean legal = true;private double dataResult = 0;private String s = null;private TextField tf = new TextField();private Button bn[] = new Button[normal.length]; private Button bc[] = new Button[command.length]; private Button bs[] = new Button[special.length]; private Mymonitor mn = new Mymonitor();public static void main(String[] args) {CouterClient cc = new CouterClient();unchFrame();}public void launchFrame() {this.setLocation(200, 250);this.setBackground(Color.blue);this.setTitle("计算器");this.setSize(300, 400);this.setResizable(false);this.setLayout(new BorderLayout(2, 2));this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}});Panel pn = new Panel(new GridLayout(4, 5, 2, 2));for (int i = 0; i < normal.length; i++) {bn[i] = new Button(normal[i]);bn[i].addActionListener(mn);pn.add(bn[i]);}Panel pc = new Panel(new GridLayout(1, 3, 2, 2));for (int i = 0; i < command.length; i++) {bc[i] = new Button(command[i]);bc[i].addActionListener(mn);pc.add(bc[i]);}Panel ps = new Panel(new GridLayout(5, 1, 2, 2));for (int i = 0; i < special.length; i++) {bs[i] = new Button(special[i]);bs[i].addActionListener(mn);ps.add(bs[i]);}Panel p = new Panel(new BorderLayout(2, 2));p.add(BorderLayout.NORTH, pc);p.add(BorderLayout.CENTER, pn);tf.setEditable(false);tf.setBackground(Color.white);this.add(BorderLayout.CENTER, p);this.add(BorderLayout.WEST, ps);this.add(BorderLayout.NORTH, tf);tf.setText("0");this.setVisible(true);this.pack();}private class Mymonitor implements ActionListener {public void actionPerformed(ActionEvent e) {s = e.getActionCommand();if (s.equals(command[2])) { // 按下了 C 键时归零计算器回到最初的状态tf.setText("0");firstInput = true;legal = true;dataResult = 0;step = 0;} else if (s.equals(command[1])) { // 按下 CE 键时,显示零tf.setText("0");firstInput = true;} else if (s.equals(command[0])) { // 按下退格键时backSpace();} else if ("0123456789.".indexOf(s) >= 0) {if (firstInput) {tf.setText(s);}if (firstInput && s.equals(".")) {tf.setText("0.");firstInput = false;} else if (!firstInput) {if (s.equals(".")) {if (tf.getText().indexOf(".") <= 0) {tf.setText(tf.getText() + s);} else {String str = (tf.getText() + s).substring(0, tf.getText().length());tf.setText(str);}} else {tf.setText(tf.getText() + s);}} else if (firstInput && !s.equals(".")) {firstInput = false;}} else {operator(s);}}}public void operator(String key) {if (key != "=")list.add(key);if (key.equals("+")) {this.dataResult += getData();} else if (key.equals("-")) {if (step == 0) {this.dataResult = getData();step++;} else {this.dataResult -= getData();}} else if (key.equals("*")) {if (step == 0) {this.dataResult = getData();step++;} else {this.dataResult *= getData();}} else if (key.equals("/")) {if (step == 0) {this.dataResult = getData();step++;} else {if (getData() == 0) {tf.setText("除数不能是0!请按C键重新开始输入");this.legal = false;} else {this.dataResult /= getData();}}} else if (key.equals("+/-")) {this.dataResult = -1 * getData();} else if (key.equals("sqrt")) {if ((this.dataResult = getData()) > 0) {this.dataResult = Math.sqrt(this.dataResult);} else {tf.setText("负数没有平方根");}} else if (key.equals("1/x")) {this.dataResult = getData();if (this.dataResult == 0) {tf.setText("0没有倒数");} else {this.dataResult = 1 / this.dataResult;}} else if (key.equals("=") && this.legal) {this.operator(list.get(list.size() - 1));this.firstInput = true;step = 0;}if (legal) {long l = (long) this.dataResult;double d;d = this.dataResult - l;if (d == 0) {tf.setText("" + l);} else {tf.setText("" + this.dataResult);}this.firstInput = true;if (key == "=")this.dataResult = 0;}}public void backSpace() {if (firstInput) {tf.setText("0");firstInput = true;} else {if (tf.getText().length() >= 1) {String temp = tf.getText().substring(0,tf.getText().length() - 1);tf.setText(temp);if (tf.getText().length() == 0) {tf.setText("0");this.firstInput = true;}}}}public double getData() {double result = 0;try {result = Double.valueOf(tf.getText()).doubleValue();} catch (NumberFormatException e) {tf.setText("0");firstInput = true;legal = true;dataResult = 0;}return result;}}。

计算器设计实验报告

计算器设计实验报告

计算器设计实验报告计算器设计实验报告第一部分:引言计算器是一种广泛应用于日常生活和工作中的电子设备。

它能够进行基本的数学运算,如加减乘除,以及更复杂的科学计算,如对数、三角函数等。

本实验旨在设计一个简单的计算器,以了解计算器的工作原理,并通过实践来提高我们的电子设计和编程能力。

第二部分:设计思路在设计计算器之前,我们首先需要确定所需的功能和要使用的技术。

基于我们的目标是设计一个简单的计算器,我们决定使用数字显示屏、按键和微控制器来实现。

数字显示屏是用于显示计算结果和用户输入的设备,我们选择了七段数码管作为显示器。

按键则用于接收用户输入的数字和操作符。

微控制器是计算器的核心部件,它负责接收按键输入,进行计算,并将结果显示在数码管上。

第三部分:实验步骤1. 硬件设计我们首先设计了数字显示屏的电路。

通过连接七段数码管和相应的电阻,我们能够控制数码管的亮灭,从而显示不同的数字和符号。

接下来,我们设计了按键的电路。

每个按键都与微控制器的引脚相连,当按键被按下时,引脚会接收到一个电平信号,微控制器通过检测引脚状态来确定用户的输入。

2. 软件编程在硬件设计完成后,我们开始编写微控制器的程序。

程序的主要任务是接收按键输入,并根据用户的操作进行相应的计算。

首先,我们设置了一个变量来存储用户的输入,然后通过检测按键状态来更新这个变量。

当用户按下数字键时,程序将数字添加到变量中;当用户按下操作符键时,程序将根据当前的操作符和变量进行相应的计算。

最后,程序将计算结果显示在数码管上。

我们使用了一个函数来将计算结果转换为七段数码管的控制信号,并通过相应的引脚将信号发送到数码管。

第四部分:实验结果经过一段时间的设计和调试,我们成功地完成了计算器的制作。

它能够准确地接收用户的输入,并进行相应的计算。

计算结果也能够正确地显示在数码管上。

我们进行了一系列测试来验证计算器的功能和性能。

测试包括基本的加减乘除运算,以及一些复杂的科学计算,如对数和三角函数。

计算器_实验报告

计算器_实验报告

一、实验目的1. 熟悉计算器的基本原理和设计方法。

2. 掌握计算器程序的设计与实现。

3. 提高编程能力和软件工程实践能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 计算器界面设计2. 计算器功能实现3. 计算器测试与优化四、实验步骤1. 计算器界面设计(1)创建一个Java项目,命名为“Calculator”。

(2)在项目中创建一个名为“CalculatorFrame”的类,继承自JFrame。

(3)在“CalculatorFrame”类中,创建一个JPanel作为计算器的面板,命名为“calculatorPanel”。

(4)在calculatorPanel中,添加一个JTextField作为显示输入和计算结果的文本框,命名为“resultField”。

(5)添加一个JButton数组,作为计算器的按钮,包括数字按钮、运算符按钮和功能按钮。

(6)为每个按钮设置事件监听器,实现按钮点击事件。

2. 计算器功能实现(1)在“CalculatorFrame”类中,定义一个私有成员变量,用于存储当前输入的字符串。

(2)为每个按钮的事件监听器添加逻辑,实现以下功能:- 数字按钮:将按钮对应的数字字符串添加到当前输入字符串中。

- 运算符按钮:将当前输入字符串、运算符和下一个输入字符串组合成一个表达式,并计算结果。

- 功能按钮:实现计算器的其他功能,如清除、求倒数、开平方等。

(3)计算结果存储在resultField中。

3. 计算器测试与优化(1)对计算器进行测试,确保所有功能正常运行。

(2)优化计算器的性能,提高计算速度。

(3)美化计算器界面,提高用户体验。

五、实验结果与分析1. 实验结果成功设计并实现了一个具有基本功能的计算器,界面简洁、操作方便。

2. 实验分析(1)通过学习计算器的基本原理和设计方法,掌握了计算器程序的设计与实现。

计算器实验报告

计算器实验报告

计算器实验报告计算器实验报告引言:计算器是一种现代化的数学工具,它的出现极大地方便了人们的生活和工作。

本实验旨在通过对计算器的研究和实践,了解其原理和功能,并对其性能进行评估。

一、计算器的原理和功能计算器是一种能够进行数学运算的电子设备。

它基于数字电路和微处理器技术,通过输入数据和运算符号,能够进行加减乘除等基本运算,同时还具备一些高级功能,如开方、取余、百分比等。

二、计算器的基本操作1. 开机与关机:按下计算器上的电源按钮,即可启动计算器。

在使用结束后,长按电源按钮即可关闭计算器。

2. 数字输入:计算器通常配备有0-9的数字键,通过按下相应的数字键,可以输入需要计算的数字。

3. 运算符输入:计算器上通常还有加减乘除等运算符号键,通过按下相应的运算符键,可以选择所需的运算方式。

4. 结果显示:计算器的显示屏会实时显示输入的数字和运算结果。

三、计算器的性能评估1. 精确度:计算器的精确度是评估其性能的重要指标之一。

通过进行一系列精确度测试,比较计算器的计算结果与实际值的差异程度,可以评估其精确度水平。

2. 反应速度:计算器的反应速度是指在输入数据后,计算器进行计算并显示结果的时间。

通过对不同计算器的反应速度进行对比,可以评估其性能优劣。

3. 功能完整性:计算器的功能完整性是指计算器是否具备基本的数学运算功能,并能够满足用户的需求。

通过测试计算器的各项功能,如开方、取余、百分比等,可以评估其功能完整性。

4. 电池寿命:对于便携计算器而言,电池寿命是一个重要的考量因素。

通过测试计算器在不同使用情况下的电池寿命,可以评估其续航能力。

结论:通过本次实验,我们对计算器的原理和功能有了更深入的了解。

计算器作为一种重要的数学工具,不仅能够进行基本的数学运算,还具备多种高级功能。

通过评估计算器的性能指标,我们可以选择适合自己需求的计算器。

计算器的发展将进一步推动数学学科的发展,为人们的生活和工作提供更多便利。

参考文献:无。

科学计算器实验报告

科学计算器实验报告

实验三科学计算器附加代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace计算器{publicpartialclass FrmMain : Form{bool error = false;public FrmMain(){InitializeComponent();}privatevoid FrmMain_KeyPress(object sender, KeyPressEventArgs e) {switch (e.KeyChar){case'0':button0.PerformClick();break;case'1':button1.PerformClick();break;case'2':button2.PerformClick();break;case'3':button3.PerformClick();break;case'4':button4.PerformClick();break;case'5':button5.PerformClick();break;case'6':button6.PerformClick();break;case'7':button7.PerformClick();break;case'8':button8.PerformClick();break;case'9':button9.PerformClick();break;case'+':buttonPlus.PerformClick(); break;case'-':buttonMinus.PerformClick(); break;case'*':buttonMultiply.PerformClick(); break;case'/':buttonDivide.PerformClick(); break;case'.':buttonDot.PerformClick(); break;case'(':buttonLeft.PerformClick(); break;case')':buttonRight.PerformClick(); break;case'\b':buttonDelete.PerformClick(); break;case'\n':buttonEqual.PerformClick(); break;}}privatevoid button_Click(object sender, EventArgs e) {switch (((Button)sender).Text){case"←":if(textBoxExpression.Text.Length > 0)textBoxExpression.Text = textBoxExpression.Text.Substring(0, textBoxExpression.Text.Length - 1);break;case"CE":error = false;textBoxExpression.Text = "";break;case"C":textBoxExpression.Text = "";break;case"=":DoFormula();break;default:textBoxExpression.Text += ((Button)sender).Text;break;}}protectedvoid DoFormula(){if (error == true){MessageBox.Show("请先点击CE按钮清除上一次运算的错误!", "运算错误", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}Formula fm = new Formula(textBoxExpression.Text);try{fm.Calculate();}catch (Exception ex){textBoxExpression.Text = "ERROR";error = true;MessageBox.Show(ex.Message, "运算错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return;}textBoxExpression.Text = fm.result.ToString();}}class Formula{protectedstring expression = "";protecteddouble _result = 0;protectedbool calculated = false;Stack<double> numbers = new Stack<double>();Stack<char> operators = new Stack<char>();///<summary>///通过字符串初始化一个算式///</summary>///<param name="initialString"></param>public Formula(string initialString){expression = initialString;}///<summary>///运算表达式并生成结果///</summary>publicvoid Calculate(){//清空堆栈numbers.Clear();operators.Clear();//扫描表达式,并解决乘除法int index = 0;double tmpNum = 0;bool isNum = false;for (index = 0; index < expression.Length; index++){if (isNum == false){//检测是否内嵌表达式if (expression[index] == '('){//扫描内嵌表达式的结尾int i = index;for (; i < expression.Length; i++){if (expression[i] == ')')break;}//新建子表达式并计算Formula innerFormula = new Formula(expression.Substring(index+1, i - index - 1));//除去两个括号innerFormula.Calculate();double innerResult = innerFormula.result;//替换原表达式中的字符串string ToReplace = expression.Substring(index, i - index + 1);expression = expression.Replace(ToReplace,innerResult.ToString());index--;continue;}//扫描数字tmpNum = ReadTheFirstNum(expression.Substring(index));index += tmpNum.ToString().Length-1;//索引后移至数字后一位numbers.Push(tmpNum);isNum = true;continue;}if (IsOperator(expression[index]) == true){//检测表达式是否正确if (IsOperator(expression[index - 1]) == true){thrownew InvalidExpressionException("无效的表达式:表达式中有连续两个运算符");}//检测第一位是否是运算符if (index == 0){thrownew InvalidExpressionException("无效的表达式:表达式开头不是数字");}//检测是否是乘除法if (expression[index] == '*' || expression[index] == '/'){//检测是否内嵌表达式if (expression[index+1] == '('){//扫描内嵌表达式的结尾int i = index+1;for (; i < expression.Length; i++){if (expression[i] == ')')break;}//新建子表达式并计算Formula innerFormula = new Formula(expression.Substring(index + 2, i - index - 2));//除去两个括号innerFormula.Calculate();double innerResult = innerFormula.result;//替换原表达式中的字符串string ToReplace = expression.Substring(index + 1, i - index);expression = expression.Replace(ToReplace,innerResult.ToString());}//取出下一个操作数double nextNum = ReadTheFirstNum(expression.Substring(index + 1));//取出栈顶操作数tmpNum = numbers.Pop();//执行运算if (expression[index] == '*')tmpNum *= nextNum;else{if (nextNum == 0)thrownew InvalidExpressionException("无效的表达式:表达式中存在除零运算");tmpNum /= nextNum;}//压回操作数堆栈numbers.Push(tmpNum);//索引后移index += nextNum.ToString().Length;isNum = true;//由于乘除法结束后会压入一个操作数,实际上等同于扫描了一个数字continue;}else{//检测到加减法//压入操作符operators.Push(expression[index]);}isNum = false;continue;}else{//检测到非法字符thrownew InvalidExpressionException();}}Stack<double> tmpn = new Stack<double>();Stack<char> tmpo = new Stack<char>();//转化为队列进行正序计算while (numbers.Count != 0){tmpn.Push(numbers.Pop()); }while (operators.Count != 0){tmpo.Push(operators.Pop()); }while (tmpn.Count != 0 && tmpo.Count != 0) {char operate;double num1;double num2;try{operate = tmpo.Pop(); num1 = tmpn.Pop();num2 = tmpn.Pop();}catch (Exception){thrownew InvalidExpressionException();}if (operate == '+'){num1 = num1 + num2;tmpn.Push(num1);}else{num1 = num1 - num2;tmpn.Push(num1);}}//检测是否还有未处理完的操作数或者运算符if (tmpn.Count != 1 || tmpo.Count != 0){thrownew InvalidExpressionException();}//存储表达式运算结果_result = tmpn.Pop();//声明计算完成calculated = true;}///<summary>///表达式的运算结果///</summary>publicdouble result{get{if (calculated == false)thrownew ExpressionNotCalculatedException();return _result;}}///<summary>///扫描第一个数字并返回///</summary>///<param name="s">待扫描字符串</param>///<returns></returns>protecteddouble ReadTheFirstNum(string s){if (s.Length == 0)thrownew InvalidExpressionException();if (IsNum(s[0]) == false)thrownew InvalidExpressionException();double result = 0;int i = 0;for (; i < s.Length; i++){if(IsNum(s[i]) == false)break;}result = double.Parse(s.Substring(0, i)); return result;}///<summary>///扫描一个子算式///</summary>///<param name="s"></param>///<returns></returns>protectedstring ReadAFormula(string s){if (s.Length == 0)thrownew InvalidExpressionException();if (IsNum(s[0]) == false)thrownew InvalidExpressionException();int i = 0;bool found = false;for (; i < s.Length; i++){if (s[i] == ')'){found = true;break;}}if (found == false)thrownew InvalidExpressionException("发现未封闭的表达式!"); return s.Substring(0, i + 1);}///<summary>///判断给定的字符是否是数字///</summary>///<param name="c">需判断的字符</param>///<returns></returns>protectedbool IsNum(char c){if (c >= '0'&& c <= '9' || c == '.')returntrue;elsereturnfalse;}///<summary>///判断给定的字符是否是操作符///</summary>///<param name="c">需判断的字符</param>///<returns></returns>protectedbool IsOperator(char c){switch (c){case'+':returntrue;case'-':returntrue;case'*':returntrue;case'/':default:returnfalse;}}}///<summary>///算数表达式未计算///</summary>[Serializable]publicclass ExpressionNotCalculatedException : ApplicationException{public ExpressionNotCalculatedException(): base("尝试在算数表达式未计算前就获取表达式结果"){}public ExpressionNotCalculatedException(string Message): base(Message){}public ExpressionNotCalculatedException(string Message, Exception inner) : base(Message, inner){}}///<summary>///无效的表达式///</summary>[Serializable]publicclass InvalidExpressionException : ApplicationException{public InvalidExpressionException(): base("无效的表达式"){}public InvalidExpressionException(string Message): base(Message){public InvalidExpressionException(string Message, Exception inner) : base(Message, inner){}}}程序运行结果图:。

计算器的使用实训报告

计算器的使用实训报告

一、实训目的随着科技的不断发展,计算器作为一种便捷的计算工具,在我们的日常生活和学习中扮演着重要的角色。

本次实训旨在让学生熟练掌握计算器的使用方法,提高计算效率,同时培养学生严谨、细致的学习态度。

二、实训内容1. 计算器的基本操作(1)开机与关机(2)数字输入与符号输入(3)运算符的使用(4)计算结果的显示与存储2. 高级功能(1)百分比计算(2)三角函数计算(3)指数与对数计算(4)科学计算器中的统计与概率计算3. 计算器的维护与保养三、实训过程1. 讲解与演示教师首先对计算器的基本操作进行讲解,并现场演示如何进行开机、关机、数字输入、符号输入等操作。

接着,教师介绍计算器的高级功能,如百分比计算、三角函数计算、指数与对数计算等,并现场演示其操作方法。

2. 学生实践在教师讲解和演示的基础上,学生开始进行实践操作。

教师巡回指导,解答学生在操作过程中遇到的问题。

3. 小组讨论学生分组讨论,交流各自在操作过程中遇到的问题及解决方法,共同提高计算器的使用技能。

4. 实训总结实训结束后,学生撰写实训报告,总结自己在实训过程中的收获与不足。

四、实训结果通过本次实训,学生掌握了计算器的基本操作和高级功能,提高了计算效率。

以下是部分学生的实训心得:1. 张三:通过本次实训,我学会了如何使用计算器进行百分比计算、三角函数计算等,这对我的学习有很大的帮助。

2. 李四:在实训过程中,我发现自己在操作过程中存在一些错误,通过教师的指导,我改正了这些错误,提高了计算准确性。

3. 王五:实训让我认识到,熟练掌握计算器的使用方法对提高学习效率具有重要意义。

在今后的学习中,我将更加注重计算器的使用。

五、实训总结1. 计算器作为一种便捷的计算工具,在我们的日常生活和学习中具有重要作用。

通过本次实训,学生掌握了计算器的基本操作和高级功能,提高了计算效率。

2. 教师在实训过程中应注重培养学生的实践操作能力,提高学生的计算准确性。

3. 学生在实训过程中要注重总结经验,不断提高自己的计算技能。

大一计算机实验报告

大一计算机实验报告

大一计算机实验报告实验名称,基于Python的简单计算器设计与实现。

实验目的,通过本次实验,掌握Python语言的基本语法和逻辑结构,了解简单的用户交互与数据处理,培养编程思维和解决问题的能力。

实验内容,设计一个简单的计算器程序,能够实现基本的加减乘除运算,具有用户友好的交互界面。

实验过程与结果:首先,我们需要明确计算器的基本功能和界面设计。

在Python中,我们可以使用tkinter库来实现图形用户界面。

通过tkinter库,我们可以轻松地创建按钮、标签和输入框,实现用户与程序的交互。

其次,我们需要考虑计算器的逻辑实现。

我们可以使用Python的基本数学运算符来实现加减乘除功能,同时需要考虑用户输入的合法性和错误处理。

接下来,我们开始编写代码。

首先,我们创建一个窗口,并在窗口中添加按钮和输入框,设计好用户界面。

然后,我们编写计算器的逻辑实现部分,包括用户输入的获取和处理,运算结果的显示等。

最后,我们进行测试。

我们输入不同的数值和运算符,测试计算器的功能是否正常,同时也需要测试一些边界情况和异常输入,确保程序的稳定性和健壮性。

通过以上步骤,我们成功实现了一个简单的计算器程序。

用户可以通过界面输入数字和运算符,程序能够正确地进行运算,并将结果显示在界面上。

实验总结与心得:通过本次实验,我深刻地理解了Python语言的基本语法和逻辑结构,掌握了tkinter库的基本使用方法,提高了编程能力和解决问题的能力。

同时,我也意识到编程的重要性和乐趣,希望在以后的学习和工作中能够更加深入地探索编程的世界。

在实验中遇到的困难和问题,我通过查阅资料和向同学请教,最终都得到了解决。

我相信,在未来的学习和工作中,只要保持耐心和勇气,就能够克服各种困难,不断提升自己的能力。

总之,本次实验让我收获颇丰,对计算机编程有了更深入的了解,也对自己未来的学习和职业规划有了更清晰的认识。

我会继续努力学习,不断提升自己,成为一名优秀的计算机专业人才。

大学大学计算机实验报告实验报告

大学大学计算机实验报告实验报告

大学计算机实验报告实验一:计算器设计实验目的本实验的主要目的是让学生能够够了解计算器的基本原理和结构,学会利用各种键盘实现各类功能,并且能够熟练掌握计算器的基本操作和输入语法。

同时,在本实验过程中,学生还可以通过实践发现计算机中各种错误信息,加深对计算机错误处理的认识与理解。

实验内容本实验主要涉及以下内容:1.计算器的结构和原理。

2.利用各键盘实现计算器的各种功能。

3.计算器的基本操作和输入语法。

4.计算机错误的处理与研究。

实验步骤1.分析计算器的结构和原理,写出计算器的结构图和研究计算器基本原理。

2.编写程序,实现计算器的基本功能,包括加、减、乘、除、取模、求幂等。

3.研究计算器的基本操作,包括输入数字、符号、运算结果、清除结果、重置操作等。

4.记录计算过程、错误信息等,深化对计算机错误的认识与理解。

实验数据分析在本次实验过程中,我们实现了计算器的基本功能,并且也对计算器的基本操作有了更深入的了解。

在输入数字和符号时,我们需要按照一定的语法和操作,输入符号和数字的结构相对比较简单,重要的是输入语法,比如加号+,减号-,乘号*,除号/等等。

在进行计算器功能操作的过程中,我们还需要对计算过程进行记录,以便在出现错误时及时进行处理和分析,比如出现除数为零的情况,计算过程出现错误的信息等等。

实验总结通过本次实验,我们深入了解了计算器的基本结构和原理,掌握了计算器的基本操作和输入语法,加深了对计算机错误处理的认识与理解。

在今后的学习和实践中,我们将进一步完善和扩展计算器的功能,并且不断探索计算器在计算机应用中的广泛应用价值。

计算器设计实验报告

计算器设计实验报告

一、实验目的1. 熟悉数字电路的基本原理和设计方法。

2. 培养学生的动手能力和创新意识。

3. 设计并实现一个功能齐全的计算器。

二、实验原理计算器是一种常见的电子设备,其核心部件为运算单元。

本实验通过设计并实现一个计算器,使学生掌握以下原理:1. 按键扫描电路:用于读取按键信息。

2. 数据存储电路:用于存储输入的数值和运算符。

3. 运算电路:根据输入的运算符进行相应的运算。

4. 显示电路:用于显示运算结果。

三、实验仪器与材料1. 数字电路实验箱2. 计算器原理图3. 连接导线4. 按键5. LED显示器6. 电阻、电容等元件四、实验步骤1. 按键扫描电路设计(1)设计按键扫描电路原理图,包括按键、电阻、二极管等元件。

(2)根据原理图,搭建实验电路,并进行调试。

2. 数据存储电路设计(1)设计数据存储电路原理图,包括寄存器、计数器等元件。

(2)根据原理图,搭建实验电路,并进行调试。

3. 运算电路设计(1)设计运算电路原理图,包括加法器、减法器、乘法器、除法器等元件。

(2)根据原理图,搭建实验电路,并进行调试。

4. 显示电路设计(1)设计显示电路原理图,包括LED显示器、译码器等元件。

(2)根据原理图,搭建实验电路,并进行调试。

5. 整体电路设计(1)根据以上四个部分的设计,设计整体电路原理图。

(2)根据原理图,搭建实验电路,并进行调试。

五、实验结果与分析1. 按键扫描电路按键扫描电路能够正确读取按键信息,实现按键功能。

2. 数据存储电路数据存储电路能够存储输入的数值和运算符,为后续运算提供数据支持。

3. 运算电路运算电路能够根据输入的运算符进行相应的运算,实现加、减、乘、除等基本运算。

4. 显示电路显示电路能够将运算结果正确显示在LED显示器上。

5. 整体电路整体电路能够实现计算器的功能,满足实验要求。

六、实验总结1. 通过本次实验,掌握了数字电路的基本原理和设计方法。

2. 提高了动手能力和创新意识,培养了团队协作精神。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 为多次运算 第一个运算数 第二个运算数 用作存储历史记录 计算方式,标记运算
相关文档
最新文档