课程设计模板Word文件下载.docx
《课程设计模板Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程设计模板Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
![课程设计模板Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/a10bbb66-6ab8-4d55-9e46-3ca2e3dbbbfe/a10bbb66-6ab8-4d55-9e46-3ca2e3dbbbfe1.gif)
包括主要功能模块的算法设计思路以及对应的工作流程图
4)调试分析过程描述:
包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、解决方法及其效果等,相应效果截图)
5)总结:
课程设计完成了哪些主要功能,是否有扩展功能?
还有哪些地方需要改进?
课程设计的学习与体会?
有哪些合理化建议?
6)附录:
主要原程序代码含必要的注释
3、答辩:
在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。
四、课程设计进程安排
序号
设计各阶段内容
地点
起止日期
1
下达任务书,说明设计要求,收集资料
实验3#517
9.15
2
总体方案设计、详细设计
10.2
3
编写程序调试分析
11.3
4
撰写报告并上交,答辩
12.25
五、应收集的资料及其主要参考文献
[1]谭浩强.C程序设计(第三版)[M]北京:
清华大学出版社,2005年9月
[2]谭浩强.C程序设计题解与上机指导(第三版)[M]北京:
清华大学出版社,2005年7月
发出任务日期:
2013年9月1日 指导教师签名:
计划完成日期:
2013年12月25日 基层教学单位责任人签名:
主管院长签章
目 录
1.设计目的与要求…………………………………………………页码
2.总体设计…………………………………………………………页码
3.详细设计…………………………………………………………页码
3.1功能模块设计………………………………………………页码
3.2数据结构设计………………………………………………页码
4.调试分析…………………………………………………………页码
5.附录………………………………………………………………页码
6.答辩记录(正文处留出适当空白)…………………………页码
1.目的与要求
目的:
设计一个简单计算器
1.能够实现实数的加减乘除,乘方运算
熟练运用循环、选择结构的能力
功能需求:
能够重复实现实数的加减乘除,乘方运算
2.总体设计
为实现实数的加减乘除乘方运算,先要对所要进行的运算符号进行选择,此时用switch语句来对输入的不同的运算符号进行选择,并且,在乘方运算中需要调用一个pow函数进行运算。
要让输入的值保留两位小数,需使输出的值的类型为%.2f。
为使程序能够实现重复运算,可以使用while语句,要使得输入0运算上0时结束程序,while语句的判断条件则为(a!
=0)。
3.详细设计
主函数:
voidmain()
{
charsrc[MAX_SIZE];
doubled;
OPERATEpostsrc[MAX_SIZE];
memset(src,0,MAX_SIZE);
printf("
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n"
);
■■\n"
■★☆简单计算器程序☆★设计团队:
****周颢、曹宣勇、庞轩****■\n"
■程序说明:
■\n"
■1.程序支持加减乘除四则运算、指数、对数、以及sin、cos、tan运算。
■2.计算结果精确到小数点后八位。
■3.定义常量pi=3.141592。
■\n"
■4.Sin、Cos、Tan运算结果以弧度制显示。
■5.支持混合运算,支持带括号的表达式。
■6.输入quit结束程序。
■\n"
请输入需要计算的表达式:
\n"
scanf("
%s"
src);
while(strcmp(src,"
quit"
))
{
_Proc(src);
SrcFunProc(src);
PostSrc(src,postsrc);
d=Calculate(postsrc,3.1415926);
printf("
计算结果是:
%f\n\n输入表达式进行下一次计算...\n"
d);
memset(src,0,MAX_SIZE);
}
}
函数功能简介:
作为整个计算器程序的操作接口,定义charsrc[MAX_SIZE]字符数组存储将要计算的数据并且判断计算需要完成的对应功能并传递给子函数。
子函数1:
voidSrcFunProc(char*src)
charBuffer[MAX_SIZE];
char*p=src,*q=Buffer;
while(*p!
='
\0'
)
switch(*p)
case'
e'
:
//Cforexp
*q++='
C'
;
p+=3;
break;
default:
*q++=*p++;
*q='
strcpy(src,Buffer);
定义各种运算的切换条件。
子函数2:
doubleCalculate(LPOPERATElpOperator,doublex)
doublestack[MAX_SIZE],y1,y2;
inttop=-1;
LPOPERATElpOptr=lpOperator;
stack[++top]=0;
while(lpOptr->
Operator!
#'
if(!
lpOptr->
Operator)
stack[++top]=(lpOptr++)->
Operand;
else
if('
x'
==lpOptr->
stack[++top]=x;
lpOptr++;
else
switch((lpOptr++)->
+'
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1+y2;
-'
stack[++top]=y2-y1;
*'
stack[++top]=y1*y2;
/'
stack[++top]=y2/y1;
^'
stack[++top]=pow(y2,y1);
A'
stack[++top]=sin(y1);
B'
stack[++top]=cos(y1);
stack[++top]=exp(y1);
D'
stack[++top]=log(y1);
E'
stack[++top]=log10(y1);
F'
stack[++top]=tan(y1);
returnstack[top];
定义各种计算的操作数的个数以及计算方式,对得到的相应的操作数进行判断并计算。
4.调试分析
问题一:
.
1.主要问题:
乘方运算中只能进行指数为自然数的运算,而不是实数。
2.出错原因:
仅仅考虑指数为自然数的情况,没有考虑到指数为实数的算
3.解决方法及其效果:
调用“pow”函数,实现实数之间的乘方运算。
调用函数还使得运算简便,减少代码。
问题二:
编程过程中忽视了除法运算中分母不能为零的情况。
解决方法:
使用“if”语句进行判断,判断条件为输入的c是否为0。
问题三:
使用switch语句时输出了不同的运算值
原因及其解决方法:
使用break语句跳出switch。
5.附录
#include<
stdio.h>
stdlib.h>
math.h>
string.h>
#defineMAX_SIZE256
enumBOOL{FALSE,TRUE};
typedefstructtagOPERATE{
doubleOperand;
charOperator;
}OPERATE,*LPOPERATE;
voidPostSrc(char*src,LPOPERATElpOperator);
intIsDigit(char);
intisp(charch);
inticp(charch);
intLocate(charch);
intgetOperand(char*s,int*len,double*oprd);
doubleCalculate(LPOPERATElpOperator,doublex);
voidSrcFunProc(char*src);
void_Proc(char*src);
staticcharOperator[]="
#(+-*/^"
staticintInPriority[]={0,1,3,3,5,5,7};
staticintOutPriority[]={0,10,2,2,4,4,6};
吴佳顺、吴佩颖、吴星宇、肖瑞群■\n"
■1.程序支持加减乘除四则运算、乘方■\n"
■2.计算结果精确到小数点后两位。
■3.支持混合运算,支持带括号的表达式。
■4.输入0结束程序。
\n"
123+-\n"
456*/\n"
789=^\n"
0.End\n"
0"
%.2f\n"
scanf("
intLocate(charch)
inti=0;
for(i=0;
Operator[i]!
i++)
if(Operator[i]==ch)
returni;
return-1;
intisp(charch)
<
=ch&
&
'
Z'
>
=ch)
return9;
returnInPriority[Locate(ch)];
inticp(charch)
return8;
returnOutPriority[Locate(ch)];
void_Proc(char*src)
while('
!
=*p)
==*p&
('
==*(p-1))
0'
p++;
voidPostSrc(char*src,LPOPERATElpOperator)
char*p=src,y;
charstack[MAX_SIZE];
intoffset=0;
stack[++top]='
if(IsDigit(*p))
getOperand(p,&
offset,&
Operand);
p+=offset;
lpOptr->
Operand=Operand;
Operator=0;
==*p)
(lpOptr++)->
Operator='
p'
Operand=3.14159266;
p+=2;
)'
for(y=stack[top--];
y!
y=stack[top--])
Operator=y;
isp(y)>
icp(*p);
stack[++top]=y;
stack[++top]=*p++;
while(top!
=-1)
Operator=stack[top--];
intIsDigit(charch)
if(('
9'
=ch)||'
.'
==ch)
returnTRUE;
returnFALSE;
intgetOperand(char*s,int*len,double*oprd){
char*p=s,ch=*s++;
doublez=0,x=0;
intbits=0;
intpoint=FALSE;
while(IsDigit(ch)==TRUE){
if(ch=='
){
if(point==TRUE)
point=TRUE;
else{
if(point==TRUE){
x*=10;
x+=ch-'
bits++;
z*=10;
z+=ch-'
ch=*s++;
while(bits-->
0)x/=10;
z+=x;
*oprd=z;
*len=s-p-1;
6.答辩记录
问题
回答