c语言版计算器实验报告

时间:2024.4.29

计算器实验报告

班级: 07计本(1)班

姓名: 王林

学号: 20706031047

指导老师: 韩静

一、 需求分析

(1) 制作一个计算器界面工程,有数字运算符等键,输入表达式后,按等号键输入结

束,并显示出正确的结果。

(2) 程序能根据运算符的高低进行运算

(3) 可以输入括号

二、 设计思路

(1) 用工程建立一个字符串的类结构,并用编辑框输入相应的数字和字符,并且

输入的字符用字符串逐个接受,当输入为’=’的时候,用‘#‘做最后一个输入。

(2) 开始对所输入的字符串进行运算和操作,显示在工程中的编辑框内。

(3) 如果结束则关闭,如果再次进行运算则进行清零。

三、 主程序段

char Precede(char a,char b) //判断优先级的函数 {

switch(a)

{

case'+':{if(b=='*'||b=='/'||b=='(') return('<');

else return('>');

}

case'-':{if(b=='*'||b=='/'||b=='(') return('<');

else return('>');

}

case'*':{if(b=='(') return('<');

else return('>');

}

case'/':{if(b=='(') return('<');

else return('>');

}

case'(':{if(b==')') return('=');

else if(b=='#') return('0');

else return('<');

}

case')':{if(b=='(') return('0');

else return('>');

}

case'#':{if(b==')') return('0');

else if(b=='#') return('=');

else return('<');

}

}

}

float Operate(float a,char theta,float b) //计算两个数的结果的函数 {

float z;

switch(theta){

case '+':z=a+b;break;

case '-':z=a-b;break;

case '*':z=a*b;break;

case '/':z=a/b;break;

}

return(z);

}

float Shuhe(SqStack1 &OP,int k,int j)

{

int i,e,n=k;

float sum=0,fe;

while(j!=0)

{

Pop1(OP,e);

fe=float(e);

for(i=1;i<=j;i++)

fe=fe/10;

sum=sum+fe;

j--;

}

while(k!=0)

{

Pop1(OP,e);

for(i=0;i<n-k;i++)

e=e*10;

sum=sum+e;

k--;

}

return(sum);

}

void CMyDlg::OnButton12()

{

UpdateData(TRUE);

m_ss=m_ss+'#';

SqStack OPTR;

SqStack1 OP; //输入的字符转化为数字的函数 //字符型栈的定义 //整型型栈的定义

SqStack2 OPND; //浮点型栈的定义 int i=0,flag=0,k=0,tag=0,j=0;

float sum,a,b;

char c,x,theta;

InitStack(OPTR); Push(OPTR,'#');

InitStack2(OPND);InitStack1(OP);

c=m_ss[i++];

while(c!='#'||GetTop(OPTR)!='#')

{

if(c=='.')

{

tag=1;c=m_ss[i++];

}

else if(c>='0'&&c<='9')

{

Push1(OP,int(c)-48);

c=m_ss[i++];

if(tag==0) k++;

else j++;

flag=1;

}

else

{

if(flag==1)

{

sum=Shuhe(OP,k,j);

Push2(OPND,sum);

OP.top=OP.base;

k=0;flag=0;j=0;tag=0;

}

switch(Precede(GetTop(OPTR),c))

{

case'<'://栈顶元素优先权低

{

Push(OPTR,c);c=m_ss[i++];

break;}

case'='://脱括号并接收下一个字符

{Pop(OPTR,x); c=m_ss[i++];

break;}

case'>'://退栈并将运算结果入栈

{Pop(OPTR,theta);

Pop2(OPND,b);Pop2(OPND,a);

Push2(OPND,Operate(a,theta,b));

break;}

}

}

}

sum=GetTop2(OPND);

m_ss.Format("%f",sum);

UpdateData(FALSE);

}

四、 调试分析

(1) 当输入“1+2-3=”时,显示结果为“0.000000”,结果正确,置清零。

(2) 当输入“2.96*1.85/6.741=”时,显示结果为“0.812342”, 结果正确,置清零。

(3) 当输入“2.69-19.145=”时,显示结果为“-16.455000”, 结果正确,置清零。

(4) 当输入“5-7*(5+1.8)=”时,显示结果为“-42.600002”, 结果正确,置清零。

(5) 当输入“2-/65=”时,显示结果为“1.969231”,结果错误,置清零。

(6) 当输入“-6+9=”时,显示结果为“-107374176.000000”, 结果错误,置清零。

(7) 当输入“0-6+9=”时,显示结果为“3.000000”, 结果正确,置清零。

(8) 当输入“(2+3)*5-8=”时,显示结果为“17.000000”, 结果正确,置清零。

(9) 当输入“6*(-3+1)=”时,显示结果为“12.000000”, 结果错误,置清零。

(10) 当输入“6*(0-3+1)=”时,显示结果为“-12.000000”, 结果正确,置清零。

(11) 当输入“6*(1-3)=”时,显示结果为“-12.000000”, 结果正确,结束。

调试说明以及分析:

1、当输入为正确的格式时,能算出正确的结果,其中包括:小数、整数以及个位以上的数字,且运算符包括:加、减、乘、除运算,还有就是可以加括号等。

2、当输入为错误的格式是,显示的是错误的结果,如(5)中的运算结果就是错误的。

3、若某个数字是负数,如果直接输入,结果是错误的,但如果变为零减去该数字的绝对值的话或者把两数的顺序更改一下,显示的是正确的结果,如

(6)、(7)、(9)、(10)、(11)做的结果。

4、有时候会出现一些不精确的显示结果,如(4)中显示多的是0.000002,这是由于在C语言的定义时,系统所产生的结果,与算法无关。

2008.12.25


第二篇:实验报告之计算器(单片机C语言)


计算器实验报

目录

实验目的... 3

实验器材... 4

实验任务... 5

实验步骤... 6

1、在protues中画好原理图... 6

2、在keil中编写程序... 6

3、仿真... 8

4、程序清单... 8

实验小结... 15

实验目的

*  学习运用4*4的矩阵键盘,学会使用单片机编程扫描法

*  学习使用1602液晶显示,对其初始化

*  学习综合使用液晶、键盘,学会综合编程

实验器材

上机仿真

* 计算机一台

* Keil软件

* Protues软件

实验任务

  运用at89s51和1602液晶与按键开关来制作简单的两位的加减乘除的简单计算器。

实验步骤

1、在protues中画好原理图

2、在keil中编写程序

编写过程

编译通过

3、仿真

4、程序清单

#include<reg51.h>                      //包含头文件

#define uc unsigned char                       //宏定义

sbit rs=P3^5;                                            //位申明

sbit rw=P3^6;

sbit e=P3^7;

void csh();                                           //函数申明

void jj();

uc keyscan();

void wirte_com(uc com);

void wirte_data(uc date);

void delay(unsigned int z);

uc code table[]="123+456-789*0=#/";      //定义表格

uc code table1[]="0123456789";

uc code table2[]="2 wei ji suan qi";

uc temp,bb,num,a,b,c,d,shi,ge,bai,qi;      //定义全局变量

unsigned int i;

void main()                                              //主函数

{

       csh();                                                //初始化

    while(1)                                            //大循环

           {       

                            for(i=0;i<16;i++)

                                   {

                                          wirte_data(table2[i]);

                                   }

                            wirte_com(0xc0);

                           num=99;

                         keyscan();

                            a=table[num]-48;

                         wirte_data(table[num]);

                            num=99;

                            keyscan();

                            wirte_data(table[num]);

                if(table[num]>=48&&table[num]<=57)

                   {

                                          d=table[num]-48;

                               a=a*10+d;

                                          num=99;

                                          keyscan();

                                          b=table[num];

                                       wirte_data(b);

      

                                   }

                         else

                                   {

                                          b=table[num];

                                   }

                            num=99;                                    

                            keyscan();

                            c=table[num]-48;

                         wirte_data(table[num]);

                            num=99;

                            keyscan();

                if(table[num]>=48&&table[num]<=57)

                   {

                                    wirte_data(table[num]);

                                          d=table[num]-48;

                               c=c*10+d;

      

                                   }

                switch(b)

                                   {

                                          case '+':i=a+c;break;

                                          case '-':jj();break;

                                          case '*':i=a*c;break;

                                          case '/':i=a/c;break;

                        default:break;                                    

                                   }

                         qi=i/1000;

                            bai=i%1000/100;

                         shi=i%100/10;

                            ge=i%10;

                            keyscan();

                while(num!=13) keyscan();

                wirte_data(table[13]);

                if(qi!=0)

                                   {

                              wirte_data(table1[qi]);

                                          wirte_data(table1[bai]);

                              wirte_data(table1[shi]);

                                          wirte_data(table1[ge]);

                                          while(num!=14) keyscan();

                                          wirte_com(0x01);

                                   }

                     else if(bai!=0)

                                   {

                                          wirte_data(table1[bai]);

                              wirte_data(table1[shi]);

                                          wirte_data(table1[ge]);

                                          while(num!=14) keyscan();

                                          wirte_com(0x01);

                                   }

                            else if(shi!=0)

                                   {

                              wirte_data(table1[shi]);

                                          wirte_data(table1[ge]);

                                          while(num!=14) keyscan();

                                          wirte_com(0x01);

                                   }

                            else

                                   {

                                          wirte_data(table1[ge]);

                                          while(num!=14) keyscan();

                                          wirte_com(0x01);

                                   }           

              }

}

void jj()

{

       if(a>c)

              i=a-c;

       else

              i=c-a;

}

void csh()                                        //初始化子函数

{

       P3=0xff;

    wirte_com(0x01);

    delay(10);

    wirte_com(0x38);

    delay(10);

    wirte_com(0x0f);

    delay(10);

    wirte_com(0x06);

    delay(10);

    wirte_com(0x80);

    delay(10);

      

}

void wirte_com(uc com)                //液晶写指令

{

       P2=com;

       rs=0;

       rw=0;

       e=0;

    delay(10);

    e=1;

}

void wirte_data(uc date)                             //液晶写数据

{

       P2=date;

       rs=1;

       rw=0;

       e=0;

       delay(100);

       e=1;

}

void delay(unsigned int z)                                 //延时子程序

{

       unsigned int x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

uc keyscan()                                                           //键盘扫描子程序 

{

    while(1)

              {

                     P1=0xfe;

            temp=P1;

                     temp=temp&0xf0;

                     if(temp!=0xf0)

                            {

                                   delay(10);

                    temp=P1;

                                   bb=P1;

                             temp=temp&0xf0;

                    if(temp!=0xf0)

                                          {

                                                 temp=P1;

                                                 switch(temp)

                                                      {

                                                               case 0xee:num=0;break;

                                                               case 0xde:num=1;break;

                                                               case 0xbe:num=2;break;

                                                               case 0x7e:num=3;break;

                                                               default:break;

                                                        }

                                                       

                                                        while(P1==bb);

                                                               delay(10);

                                                        while(P1==bb);

                                                       

                                       }

                   

                            }

            P1=0xfd;

            temp=P1;

                     bb=P1;

                     temp=temp&0xf0;

                     if(temp!=0xf0)

                            {

                                   delay(10);

                    temp=P1;

                             temp=temp&0xf0;

                    if(temp!=0xf0)

                                          {

                                                 temp=P1;

                                                 switch(temp)

                                                      {

                                                               case 0xed:num=4;break;

                                                               case 0xdd:num=5;break;

                                                               case 0xbd:num=6;break;

                                                               case 0x7d:num=7;break;

                                                               default:break;

                                                        }

                                                        while(P1==bb);

                                                               delay(10);

                                                        while(P1==bb);

                                       }

                   

                            }

            P1=0xfb;

            temp=P1;

                     bb=P1;

                     temp=temp&0xf0;

                     if(temp!=0xf0)

                            {

                                   delay(10);

                    temp=P1;

                             temp=temp&0xf0;

                    if(temp!=0xf0)

                                          {

                                                 temp=P1;

                                                 switch(temp)

                                                      {

                                                               case 0xeb:num=8;break;

                                                               case 0xdb:num=9;break;

                                                               case 0xbb:num=10;break;

                                                               case 0x7b:num=11;break;

                                                               default:break;

                                                        }

                                                        while(P1==bb);

                                                               delay(10);

                                                        while(P1==bb);

                                       }

                    

                            }

            P1=0xf7;

            temp=P1;

                     bb=P1;

                     temp=temp&0xf0;

                     if(temp!=0xf0)

                            {

                                   delay(10);

                    temp=P1;

                             temp=temp&0xf0;

                    if(temp!=0xf0)

                                          {

                                                 temp=P1;

                                                 switch(temp)

                                                      {

                                                               case 0xe7:num=12;break;

                                                               case 0xd7:num=13;break;

                                                               case 0xb7:num=14;break;

                                                               case 0x77:num=15;break;

                                                               default:break;

                                                        }

                                                        while(P1==bb);

                                                               delay(10);

                                                        while(P1==bb);

                                       }

                   

                            }

              if(num!=99) return(num);

           }

}

实验小结

通过本次实验我巩固了前面对键盘、液晶的使用,并且学会了如何把它们综合起来运用,更加熟悉了程序编写过程!

更多相关推荐:
计数器实验报告

实验4计数器及其应用一实验目的1学习用集成触发器构成计数器的方法2掌握中规模集成计数器的使用及功能测试方法二实验原理计数器是一个用以实现计数功能的时序部件它不仅可用来计脉冲数还常用作数字系统的定时分频和执行数字...

简单的计算器实验报告

HUNANUNIVERSITY程序设计训练简单的计算器报告学生姓名田博鑫学生学号专业班级指导老师20xx年6月16日至20xx年7月10日1吴蓉晖1程序设计目的和要求目的此次程序设计的目的主要是为了我们能更好的...

计算器实验报告 (1)

HTML网页实验报告院系计算机控制与工程学院班级计1241学号姓名完成日期1一实验名称设计一个网页计算器二需求分析计算器是日常生活中十分便捷有效的工具能实现加减乘除开方求倒数等简单运算的工具要实现计算功能可以用...

计算器实验报告

目录一系统开发的背景1二系统分析与设计1一二计算器的主要功能1系统模块结构设计1三系统的设计与实现2一二计算器的初始界面2一般计算3三解一元二次方程5四计算银行本利和5四系统测试7一二测试主函数MAIN7测试一...

C#计算器实验报告

C计算器实验报告班级学号20xx13432姓名蔡启林一实验目的和要求设计一个简单计算器具有一般计算功能能进行基本的加减乘除运算还具有求根号倒数等功能特点是能进行不同进制的运算和不同进制间的转换主要的工作主要是操...

计算器实验报告

计科系实验报告单

模拟计算器实验报告

课程设计报告课程设计题目:模拟机算器程序学生姓名:专业:网络工程班级:指导教师:20XX年11月27日东华理工大学课程设计评分表学生姓名:XXX班级:XXX学号:21课程设计题目:模拟机算器程序目录一.课程设计…

c#实验报告计算器设计

实验2计算器设计文档姓名梁姣学号07220xx1班级计本071日期20xx1009实验目的和要求1设计背景设计拥有简单的计算功能方便计算简单的计算题方便用户的使用2设计功能具有一般计算功能能进行基本的加减乘除运...

C++实现计算器实验报告

实验报告完成日期20xx年10月27日实验题目完整计算器需求分析请实现一个只包含加减乘除以及括号运算的简单计算器输入格式是正确的不需要判断注意式子中可能会出现负数以及多余的空格操作数也可能是多位数和小数概要设计...

基于MFC的科学计算器课程设计实验报告

浙江工商大学C课程设计报告课程设计实验报告题目学院专业班级课程名称学号学生姓名指导教师成绩二一三年一月1浙江工商大学C课程设计报告目录1概述11课程设计目的12课程设计内容13课程设计思想2系统需求分析21系统...

课程设计报告——计算器

北京化工大学20xx20xx课程设计报告计算机科学与技术计算器程序的设计与实现数据结构课程设计班级计科1001北京化工大学信息科学与技术学院计算机科学与技术专业北京化工大学20xx20xx课程设计报告计算机科学...

c++计算器实验报告

简单计算器学号20xx21176051姓名周吉祥实验目的模仿日常生活中所用的计算器自行设计一个简单的计算器程序实现简单的计算功能实验内容1体系设计程序是一个简单的计算器能正确输入数据能实现加减乘除等算术运算运算...

计算器实验报告(47篇)