简单计算器课程设计报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2
掌握从上至下的分析过程;合理完成功能的分解;分析获得实现功能所需的各种数据结构;功能模块的整合;使用面相过程开发语言建立各种数据结构,各种结构体;掌握面相过程开发语言的特点,建立各种函数实现各个功能;调用各个功能模块,完成系统的整体功能;调试、测试各个功能模块,并完成系统的测试;分析画出各个功能的流程等。
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;//回到该操作数的个位
for(k=i;k<=j;k++)
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;
i j
X<=z
(2)if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{
nibo[++t1]=zhan2[t2];//将zhan2中的*或/或#或^放到表达式中
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='^'||a[i]=='#')//逻辑运算中的或运算
{
while(zhan2[t2]=='^'||zhan2[t2]=='#')
nibo[++t1]='0'+shu->data[shu->top].d2;
nibo[t1+1]='\0';
}
else if(a[i]=='(')
{
zhan2[++t2]=a[i];
i++;
}
else if(a[i]==')')
{
j=t2;
while(zhan2[j]!='(')
{
nibo[++t1]=zhan2[j];
{
nibo[++t1]=zhan2[t2];//将括号输出给表达式
nibo[t1+1]='\0';//下移一位
t2--;//指向zhan2的下一位
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')//对乘法和除法的定义
{
while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#')
int top;
}zhan1;
zhan1 *shu;//定义指针变量shu
shu=(zhan1 *)malloc(sizeof(zhan1));//给shu分配了zhan1大小的,类型为和zhan1相同的数组
shu->top=0;//shu指向top=0的位置
while(a[i]!='\0')//外循环是用while语句
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈; 若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出; 若为其它,比较stackOperator栈顶元素与当前元素的优先级:
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);//pow(x,y)表示计算x的y次方,这里指计算0.1的l次方
l=l+1;
x=x+n*(a[k]-'0');//一个带小数的操作数读取完成
}
i j
.
k
n
x=k+n
(3)逆波兰算法流程
1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
1.3
用不同的数组存储操作数和操作符号,然后要定义运算的优先级,因为我准备通过输入运算表达式来直接求出运算结果,所以要使用到括号。通过上网查阅资料,我决定采用逆波兰表达式,它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下: 如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。由于我对栈的应用不是很熟练,因此这里改用数组和指针。但基本思路是类似的。
{
char x,a[50];
double jieguo;
int i=0;
a[0]='$';
printf("#表示开方,^表示乘方(支持负数)\n");
printf("请输入表达式,退出请输入q:\n\n");
scanf("%c",&x);
if(x=='q') break;//输入q表示退出
while(x!='\n')//碰到'\0'结束部分程序的运算
t2--;
}
j=1;t3=0;
while(j<=t1)
{
if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')
{
for(i=1;i<=shu->top;i++)
{
if((int)(nibo[j]-'0')==shu->data[i].d2)
{
m=i;
break;
}
}
{
if(a[i]>='0'&&a[i]<='9')//内循环使用if-else语句,一个操作数的表示
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')//除非下个相邻的位置里没有合法的数则表示一个操作数读取完成
{j++;}
j--;//回到该操作数的个位
for(k=i;k<=j;k++)
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
while(t2>0)//继续取出zhan2里边的符号
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]值赋给nibo[++t1]
nibo[t1+1]='\0';//碰到'\0'结束ቤተ መጻሕፍቲ ባይዱ分程序的运算
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;
if(a[j]=='.')//如果操作数为小数
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);//pow(x,y)表示计算x的y次方,这里指计算0.1的l次方
zhan3[++t3]=shu->data[m].d1;
}
else if(nibo[j]=='+')//对加法的定义
{
zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];
t3--;
}
else if(nibo[j]=='-')//对减法法的定义
{
zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='-')//对减法的定义
{
if(a[i-1]=='$')
{
a[0]='0';
i=0;
}
else if(a[i-1]=='(')
{
a[i-1]='0';
a[i-2]='(';
i=i-2;
t2--;
}
else
{
while(t2>0&&zhan2[t2]!='(')//t2>0说明zhan2里还有括号
七
全部代码及注释
#include<stdio.h>
#include<math.h>
#include<malloc.h>//动态存储分配函数头文件,当对内存区进行操作时,调用相关函数.
double jisuan(char a[])
{
int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;//定义整型变量i,j,k,m,n,cnt,t1,t2,t3
二
2.1
2.2主要功能表
序号
文件名
主要功能
备注
1
+
加法
两个操作数
2
-
减法
两个操作数
3
*
乘法
两个操作数
4
/
除法
两个操作数
5
#
开方
一个操作数
6
^
乘方
两个操作数
7
Enter
等于
8
q
退出
三
主要部分的详细流程图
(1)if(a[i]>='0'&&a[i]<='9')//内循环使用if-else语句,一个操作数的表示
{
zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);
t3--;
}
else if(nibo[j]=='#')//对开方的定义
{
zhan3[t3]=sqrt(zhan3[t3]);
}
j++;
}
return zhan3[t3];//返回值
}
void main()
{
for(;;)
如果 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级,然后当前元素入栈; 如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为'\0'。
四
4.1
1、编译时提示错误:
原因为分号是在中文输入法状态下输入,将其改为英文输入状态下了分号即可。
l=l+1;
x=x+n*(a[k]-'0');//一个带小数的操作数读取完成
}
i=j+1;//开始下一个操作数的读取
}
else i=j;
shu->data[++shu->top].d1=x;//先取shu->top值,++,(shu->top先加1在使用。
shu->data[shu->top].d2=++cnt;
t3--;
}
else if(nibo[j]=='*')//对乘法的定义
{
zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];
t3--;
}
else if(nibo[j]=='/')//对除法的定义
{
zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];
t3--;
}
else if(nibo[j]=='^')//对乘方的定义
C语言集中上机报告
院系:通信与信息工程学院
班级:电子信息工程0120905班
姓名:
指导教师:张林
2012年05月20日
1.1
为综合应用C语言程序设计理论知识、进一步提高我们综合解决问题、协调工作的能力和良好的软件开发习惯,学校为我们特意安排此次课程设计。希望通过该实习能够进一步激发我们的学习热情,培养我们初步编程的能力,为后续的学习和发展奠定基础。
六
通过这次课程设计,我明白了很多。
首先基本功要过硬。不能马虎经常犯犯小错误。提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。
其次要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自己的头脑来完成它了。
2.编译时提示错误
原因为头文件里忘了写#include<malloc.h>,导致出现 Undeclaredidentifier,在头文件里加上即可改正。
4.
※(普通加减乘除四则运算)
※(小数的开方运算)
※(负数的乘方运算)
※(带括号的运算)
※(负数的开方运算)
※(很大的数也可以运算)
五
本课程设计我只完成了一些基本的功能,还有很多功能没有实现:如不能进行三角函数运算,不能进行ln,阶乘运算等。还有因为我自己没有设计出计算器界面,所以使用户感觉不是那么方便,因此该设计还有待进一步完善。我觉得要设计出好用的计算器界面,可以利用VC++6.0里边的MFC AppWizard(exe)进行设计,我已经初步设计出计算器界面,但和程序的结合方面还有问题,但我有时间会继续完成的。
除此之外要善于思考。程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足并使其更加人性化。
这次课程设计让我学到了很多,不仅是巩固了先前学的C程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。希望今后类似这样课程设计、类似这样的锻炼机会能更多些!
nibo[t1+1]='\0';
j--;
}
t2=j-1;
i++;
}
else if(a[i]=='+')//对加法的定义
{
while(t2>0&&zhan2[t2]!='(')//定义当加号和括号同时出现时
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]赋给nibo[++t1]
nibo[t1+1]='\0';
char nibo[50],zhan2[50];//定义字符型数组
double x,n,l,z=0,zhan3[50];//定义双精度变量x,n,l,z,zhan3[50]
typedef struct//结构体定义
{
double d1;
int d2;
}dd;
typedef struct
{
dd data[50];
掌握从上至下的分析过程;合理完成功能的分解;分析获得实现功能所需的各种数据结构;功能模块的整合;使用面相过程开发语言建立各种数据结构,各种结构体;掌握面相过程开发语言的特点,建立各种函数实现各个功能;调用各个功能模块,完成系统的整体功能;调试、测试各个功能模块,并完成系统的测试;分析画出各个功能的流程等。
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;//回到该操作数的个位
for(k=i;k<=j;k++)
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;
i j
X<=z
(2)if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{
nibo[++t1]=zhan2[t2];//将zhan2中的*或/或#或^放到表达式中
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='^'||a[i]=='#')//逻辑运算中的或运算
{
while(zhan2[t2]=='^'||zhan2[t2]=='#')
nibo[++t1]='0'+shu->data[shu->top].d2;
nibo[t1+1]='\0';
}
else if(a[i]=='(')
{
zhan2[++t2]=a[i];
i++;
}
else if(a[i]==')')
{
j=t2;
while(zhan2[j]!='(')
{
nibo[++t1]=zhan2[j];
{
nibo[++t1]=zhan2[t2];//将括号输出给表达式
nibo[t1+1]='\0';//下移一位
t2--;//指向zhan2的下一位
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')//对乘法和除法的定义
{
while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#')
int top;
}zhan1;
zhan1 *shu;//定义指针变量shu
shu=(zhan1 *)malloc(sizeof(zhan1));//给shu分配了zhan1大小的,类型为和zhan1相同的数组
shu->top=0;//shu指向top=0的位置
while(a[i]!='\0')//外循环是用while语句
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈; 若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出; 若为其它,比较stackOperator栈顶元素与当前元素的优先级:
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);//pow(x,y)表示计算x的y次方,这里指计算0.1的l次方
l=l+1;
x=x+n*(a[k]-'0');//一个带小数的操作数读取完成
}
i j
.
k
n
x=k+n
(3)逆波兰算法流程
1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
1.3
用不同的数组存储操作数和操作符号,然后要定义运算的优先级,因为我准备通过输入运算表达式来直接求出运算结果,所以要使用到括号。通过上网查阅资料,我决定采用逆波兰表达式,它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下: 如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。由于我对栈的应用不是很熟练,因此这里改用数组和指针。但基本思路是类似的。
{
char x,a[50];
double jieguo;
int i=0;
a[0]='$';
printf("#表示开方,^表示乘方(支持负数)\n");
printf("请输入表达式,退出请输入q:\n\n");
scanf("%c",&x);
if(x=='q') break;//输入q表示退出
while(x!='\n')//碰到'\0'结束部分程序的运算
t2--;
}
j=1;t3=0;
while(j<=t1)
{
if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')
{
for(i=1;i<=shu->top;i++)
{
if((int)(nibo[j]-'0')==shu->data[i].d2)
{
m=i;
break;
}
}
{
if(a[i]>='0'&&a[i]<='9')//内循环使用if-else语句,一个操作数的表示
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')//除非下个相邻的位置里没有合法的数则表示一个操作数读取完成
{j++;}
j--;//回到该操作数的个位
for(k=i;k<=j;k++)
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
while(t2>0)//继续取出zhan2里边的符号
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]值赋给nibo[++t1]
nibo[t1+1]='\0';//碰到'\0'结束ቤተ መጻሕፍቲ ባይዱ分程序的运算
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;
if(a[j]=='.')//如果操作数为小数
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);//pow(x,y)表示计算x的y次方,这里指计算0.1的l次方
zhan3[++t3]=shu->data[m].d1;
}
else if(nibo[j]=='+')//对加法的定义
{
zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];
t3--;
}
else if(nibo[j]=='-')//对减法法的定义
{
zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='-')//对减法的定义
{
if(a[i-1]=='$')
{
a[0]='0';
i=0;
}
else if(a[i-1]=='(')
{
a[i-1]='0';
a[i-2]='(';
i=i-2;
t2--;
}
else
{
while(t2>0&&zhan2[t2]!='(')//t2>0说明zhan2里还有括号
七
全部代码及注释
#include<stdio.h>
#include<math.h>
#include<malloc.h>//动态存储分配函数头文件,当对内存区进行操作时,调用相关函数.
double jisuan(char a[])
{
int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;//定义整型变量i,j,k,m,n,cnt,t1,t2,t3
二
2.1
2.2主要功能表
序号
文件名
主要功能
备注
1
+
加法
两个操作数
2
-
减法
两个操作数
3
*
乘法
两个操作数
4
/
除法
两个操作数
5
#
开方
一个操作数
6
^
乘方
两个操作数
7
Enter
等于
8
q
退出
三
主要部分的详细流程图
(1)if(a[i]>='0'&&a[i]<='9')//内循环使用if-else语句,一个操作数的表示
{
zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);
t3--;
}
else if(nibo[j]=='#')//对开方的定义
{
zhan3[t3]=sqrt(zhan3[t3]);
}
j++;
}
return zhan3[t3];//返回值
}
void main()
{
for(;;)
如果 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级,然后当前元素入栈; 如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为'\0'。
四
4.1
1、编译时提示错误:
原因为分号是在中文输入法状态下输入,将其改为英文输入状态下了分号即可。
l=l+1;
x=x+n*(a[k]-'0');//一个带小数的操作数读取完成
}
i=j+1;//开始下一个操作数的读取
}
else i=j;
shu->data[++shu->top].d1=x;//先取shu->top值,++,(shu->top先加1在使用。
shu->data[shu->top].d2=++cnt;
t3--;
}
else if(nibo[j]=='*')//对乘法的定义
{
zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];
t3--;
}
else if(nibo[j]=='/')//对除法的定义
{
zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];
t3--;
}
else if(nibo[j]=='^')//对乘方的定义
C语言集中上机报告
院系:通信与信息工程学院
班级:电子信息工程0120905班
姓名:
指导教师:张林
2012年05月20日
1.1
为综合应用C语言程序设计理论知识、进一步提高我们综合解决问题、协调工作的能力和良好的软件开发习惯,学校为我们特意安排此次课程设计。希望通过该实习能够进一步激发我们的学习热情,培养我们初步编程的能力,为后续的学习和发展奠定基础。
六
通过这次课程设计,我明白了很多。
首先基本功要过硬。不能马虎经常犯犯小错误。提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。
其次要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自己的头脑来完成它了。
2.编译时提示错误
原因为头文件里忘了写#include<malloc.h>,导致出现 Undeclaredidentifier,在头文件里加上即可改正。
4.
※(普通加减乘除四则运算)
※(小数的开方运算)
※(负数的乘方运算)
※(带括号的运算)
※(负数的开方运算)
※(很大的数也可以运算)
五
本课程设计我只完成了一些基本的功能,还有很多功能没有实现:如不能进行三角函数运算,不能进行ln,阶乘运算等。还有因为我自己没有设计出计算器界面,所以使用户感觉不是那么方便,因此该设计还有待进一步完善。我觉得要设计出好用的计算器界面,可以利用VC++6.0里边的MFC AppWizard(exe)进行设计,我已经初步设计出计算器界面,但和程序的结合方面还有问题,但我有时间会继续完成的。
除此之外要善于思考。程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足并使其更加人性化。
这次课程设计让我学到了很多,不仅是巩固了先前学的C程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。希望今后类似这样课程设计、类似这样的锻炼机会能更多些!
nibo[t1+1]='\0';
j--;
}
t2=j-1;
i++;
}
else if(a[i]=='+')//对加法的定义
{
while(t2>0&&zhan2[t2]!='(')//定义当加号和括号同时出现时
{
nibo[++t1]=zhan2[t2];//将zhan2[t2]赋给nibo[++t1]
nibo[t1+1]='\0';
char nibo[50],zhan2[50];//定义字符型数组
double x,n,l,z=0,zhan3[50];//定义双精度变量x,n,l,z,zhan3[50]
typedef struct//结构体定义
{
double d1;
int d2;
}dd;
typedef struct
{
dd data[50];