下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
2.下载的文档,不会出现我们的网址水印。
3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
文档包含非法信息?点此举报后获取现金奖励!
下载文档到电脑,查找使用更方便
18
积分
还剩页未读,继续阅读
关 键 词:语言
计算器
设计
实验
报告
资源描述:
C语言计算器设计实验报告
班级:11661 姓名: 学号:38号
一、实验目的:利用C语言编写一个简单的计算器,并能正确运行+,-,*,/四则运算。
二、实验内容:
1、 编写前分析;
(1)、根据实验目的,要求键盘录入表达式,并运行后输出结果;由于键盘录入的表达式含数字和运算符,所以要选择用字符串数据类型输入。
(2)、由于输入的是字符串,而只有数值类型的数据才能参与运算,所以得把字符(串)类型的数据转换为数值类型的数据。
(3)、四则运算时,括号优先级高于乘除,乘除优先级高于加减,程序必须能正确判断其优先级才能得出正确的结果。
(4)、为了保证运行结果的精确度需正确选择所用变量的数据类型。
2、利用所学知识进一步分析以上内容;
(1)、利用gets函数输入表达式,例如:gets(calc);
(2)、C语言中将字符类型数据转化成数值类型数据方法很多,该程序利用函数库stdlib.h中的atof函数来实现这一目的。同时注意主函数前加上预处理指令:#include。
(3)、为了能正确判断优先级,该程序利用函数间的多层嵌套,循环调用来实现;从优先级最高的括号开始判断,若有括号,再判断括号内部,若无括号判断是否为乘除,最后判断加减;括号内内容法方类似。具体判断方法在后面将以实例详细介绍。
(4)、为了保证输出数据的精确度,该程序中函数f1()-f4()返回值均用double类型;用g格式符输出最终结果让输出结果简明而又能保证其精确度。
3、开始编程:
首先编写必要的预处理指令,声明必要的函数,定义必要的变量。
#include(输入,输出函数需要该指令);
#include(atof函数需要该指令);
全局声明:
Double f1(); (用于存放最终输出结果);
Char calc[n]; (用于存放输入的表达式);
Int n; (用于标注clac中的各个元素);
编写主函数:
int main(void)
{
printf("请输入表达式:\n");
gets(calc);(输入表达式)
printf("原式=%g\n",f1());(程序将调用f1(),并输出f1()的结果)
return(0);
}
由于四则运算先算出优先级最高的结果,并对同一优先级采用从左到右的顺序计算,所以最终的运算是对表达式进行加减运算。所以函数f1()必须对加减进行处理。所以编写如下:
double f1()
{
表达式可能存在多个同级运算所以要利用循环语句。
double t;
t=f2();(f2()用于临时表示乘除运算部分的结果)
while((calc[n]==+)||(calc[n]==-))
{
switch(calc[n])
{
case +:n++,t=t+f2();break;
case -:n++,t=t-f2();break;
}
}
return(t);
}
编写f2()用于计算乘除运算,同理要使用循环:
double f2()
{
double t;
t=f3();(用于临时表示括号内部的计算结果)
while((calc[n]==*)||(calc[n]==/))
{
switch(calc[n])
{
case *:n++,t=t*f3();break;
case /:n++,t=t/f3();break;
}
}
return(t);
}
编写f3():
double f3()
{
char a[64];(用于转存变量calc)
用于判断是否是字符‘(’,若是则调用函数f1()并读取下一个字符。
int i=0;
double t;
if(calc[n]==()
{
n++,t=f1(),n++;
}
else if(f4())
{
while(f4())(判断是否满足f4(),若满足则依次将字符转存于函数a中)
{
a[i++]=calc[n++];
}
t=atof(a);(将字符串转换为浮点数)
}
return(t);
}
编写函数f4():
ouble f4()
{
if((calc[n]>=0&&calc[n]<=9)||(calc[n]==.))
return(1);
}
4、运用举例:
下面以表达式:41+2*(5-3)为例详细分析程序的运行过程:
输入字符串41+2*(5-3)-输出时遇到函数f1()-调用函数f1()-调用函数f2()-调用函数f3()-判断第一个字符不为’(‘,再判断第一个字符是否满足函数f4(),满足条件并判断第二个字符(满足),再判断第三个字符(不满足);将‘41’赋值个变量a,再将变量a转换成double类型赋值个变量t,将函数值41返回给该函数。-将41返回调用处即f2()中的“t=f3()”,这时f2()返回值为41再返回f1()中的“t=2()”处。-判断下一个字符‘+’(满足条件)执行到语句:case +:n++,t=t+f2();-再次调用函数f2().f3().f4().最终将‘2’返回到t=f3();处。-判断下一字符是否为*或/,满足执行到:case *:n++,t=t*f3();-再次调用f3(),执行到:n++,t=f1(),n++;---------,以下调用方法类似,不再一一列出.
5、程序分析:
(1)、从函数f4()可知,输入函数calc的第一个字符必须为’.’或’0’~’9’这十个字符,否则程序终止运行,并输出错误结果。
(2)、从函数f3()可知,字符’(‘后面应紧跟数字,小数点或字符’(‘,否则出现(1)中同样的错误。例如:2+5*(-5+8)不能算出正确值。
(3)、该函数没有对字符’)’进行判断,一切为不满足函数f4()和’+’、’-‘、’*’、’/’的字符程序都将首先算出字符’(‘到该字符之间的表达式的结果;例如:2*(6+4相当于
2*(6+4)。6*(21-9m相当于6*(21-9)。
(4)、只要输入规范的数学表达式,程序都会输出正确的结果。
三、实验总结:
通过该实验我们熟悉的掌握了函数:if,while,switch等函数的格式及功能。熟悉了函数间的调用过程及相关注意事项。
四、附录 源代码
#include#includedouble f1(),f2(),f3(),f4();
char calc[64];
int n;
double f1()
{
double t;
t=f2();
while((calc[n]==+)||(calc[n]==-))
{
switch(calc[n])
{
case +:n++,t=t+f2();break;
case -:n++,t=t-f2();break;
}
}
return(t);
}
double f2()
{
double t;
t=f3();
while((calc[n]==*)||(calc[n]==/))
{
switch(calc[n])
{
case *:n++,t=t*f3();break;
case /:n++,t=t/f3();break;
}
}
return(t);
}
double f3()
{
char a[64];
int i=0;
double t;
if(calc[n]==()
{
n++,t=f1(),n++;
}
else if(f4())
{
while(f4())
{
a[i++]=calc[n++];
}
num[i]=\0;
t=atof(a);
}
return(t);
}
double f4()
{
if((calc[n]>=0&&calc[n]<=9)||(calc[n]==.))
return(1);
else
return(0);
}
int main(void)
{
printf("请输入表达式:\n");
gets(calc);
printf("原式=%g\n",f1());
return(0);
}
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:C语言计算器设计实验报告.doc
链接地址:https://www.renrendoc.com/p-57465200.html