c课程设计报告多功能计算器.docx
- 文档编号:16719424
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:33
- 大小:233.93KB
c课程设计报告多功能计算器.docx
《c课程设计报告多功能计算器.docx》由会员分享,可在线阅读,更多相关《c课程设计报告多功能计算器.docx(33页珍藏版)》请在冰点文库上搜索。
c课程设计报告多功能计算器
《高级语言程序设计》
课程设计报告
课题名称:
多功能计算器
电子信息学院
2015年07月14日
课程设计题目:
多功能计算器
1课程设计目的与要求
高级语言程序设计是本科工科类各专业的重要基础课,课程以影响深远的、传统的、面向过程的优秀编程语言C语言为基础,学习程序设计的基本概念和方法,通过本门课程学习,应使同学掌握高级语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。
课程设计是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。
经过该实践环节,培养学生的探索精神和创新能力。
通过答辩训练学生的综合表达能力。
参加本课程设计的学生,应当认真完成本课程设计的全部过程。
并以最终课程设计成果来证明其独立完成各种实际任务的能力。
从而反映出理解和运用本课程知识的水平和能力。
具体如下:
(1)数据组织方面尽量使用到:
数组、链表、结构体、文件;
(2)程序结构方面做到函数调用,尽量采用指针运算;
(3)代码编写规范,形成良好的编程习惯;
(4)程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。
(5)课设完成须进行答辩,提交课设报告电子稿、装订的打印稿。
课设报告内容包括以下几个方面:
●程序的总体设计和算法分析。
●程序流程图、函数说明
●源程序代码清单
●测试数据和测试过程记录
●遇到的问题及解决方法分析
●课程设计小结
2问题描述
多功能计算器以菜单方式工作,包含了整数和实数的加减乘除、分数的计算、复数的加减乘除以及一元多项式的加减等功能。
多功能计算器中的数据存放在文件中,提供文件的输入、输出等操作,这样可以很方便的读取文件,和保存信息,这样能让信息更好的被利用。
要实现以菜单方式工作的功能,则提供显示操作,将结构体中的数据依次读出。
其中,显示的是其他功能的选项,即整数的加减乘除、实数的加减乘除、分数的计算、复数的加减乘除和一元多项式的加减。
要实现整数的加减乘除就需要借用相应的计算,所以只需要设置好相关的加、减、乘、除的计算方式就可计算。
当然,也要设定输入的是整数。
要实现实数的加减乘除的方式大体和整数的加减乘除一样。
要实现分数计算的功能,就要先定义分数,分数的定义可以看成是两个数之比。
当然,分数可以是负数形式的,我们就可以把它看成是一个正数和一个负数的比值。
另外,分数的运算结果要是最简形式的。
关于复数的加减乘除,则是通过抽象数据类型定义和构造二元组进行的。
进而进行加减乘除的运算。
要进行一元多项式的加减,则运用链表声明语句,建立带表头结构的单链线性表进而运算。
3总体设计
3.1功能分析
系统要求实现计算器的最基本功能,包括数据的录入、处理、输出等。
对于多功能计算器而言,其数据的处理包括输入数据之间的运算关系,数据处理时的先后顺序以及数据结果的输出。
系统达到的功能如下:
1)以菜单方式工作
2)整数的加、减、乘、除
3)实数的加、减、乘、除
4)分数的计算。
将分数定义为两个整数之比,如:
1/2,3/4,24/48,64/2等;分数也可以是负数,如-1/2,15/-24;分数运算结果要是最简化的,如:
4/-8,应表示成等价的-1/2。
5)复数的加、减、乘、除
6)一元多项式加、减
3.2系统使用的主要函数
voidJJFYS()/*实数和整数加减乘除法运算的函数*/
voidFenS()/*分数运算的函数*/
voidFuS()/*复数运算的函数*/
voidYiD()/*一元多项式运算的函数*/
voidmatch(charexpected)/*检查字符匹配的函数*/
voidComplexNumberOutput(fushuc)/*输出运算结果*/
voidCreatePolyn(PolynListL,intn)/*指数系数一对一对输入*/
voidPolynTraverse(PolynListL,void(*vi)(ElemType,ElemType))//初始条件:
单链表L已存在
//操作结果:
依次对L的每个数据元素调用函数vi().一旦vi()失败,则操作失败
voidvisit(ElemTypec,ElemTypee)/*ListTraverse()调用的函数(类型要一致)*/
voidwrite()/*写入文件*/
voidread()/*从文件中读出运算结果*/
3.3系统使用的主要数据结构
利用类型定义符定义结构体:
typedefstructresult;
charmenu(void)
{charch;
return(ch);
}
chartoken[61];/*存放表达式字符串的数组*/
和
typedefstructfushu//抽象数据类型定义
{
floatreal;//数据对象
floatimage;
}fushu;
和
typedefstructPolynNode{
intcoef;//系数
intexpn;//指数
structPolynNode*next;
}PolynNode,*PolynList;
doubleresult;
FILE*data=fopen("61590_4.dat","at");
4详细设计
4.1程序总体结构图
图4-1主控模块
子模块:
图4-2整数的加减乘除模块
图4-3实数的加减乘除模块
图4-4分数的计算模块
图4-5复数的计算模块
图4-6一元多项式的加减模块
4.2程序流程图
主控模块流程图:
图4-7主控模块流程图
子模块流程图:
图4-8整数的加减乘除流程图
图4-11复数的加减乘除流程图
图4-12一元多项式的加减流程图
5功能测试
5.1.系统主界面
多功能计算器系统运行后的界面如图5-1所示。
图5-1系统主界面
5.2整数和实数的加减乘除界面
输入数字及运算符号,键入回车,系统进行运算,得到如图5-2的界面。
图5-2整数或实数的加减乘除的界面
5.3分数的计算的界面
先输入1,2,3,4选择菜单,再分别输入分子分母进行计算,输入0退出系统,得到如图5-3的运行结果。
图5-3分数的计算的界面
5.4复数的加减乘除的界面
先输入实部和虚部,再输入1,2,3,4选择功能,输入0,退出系统,得到如图5-4的界面。
图5-4复数的加减乘除的界面
5.5一元多项式的加减的界面
根据提示输入数据,得到如图5-5的界面。
图5-5一元多项式加减的界面
6程序设计调试情况分析
(1)缺少变量定义,定义位置不正确,过分重视分号的重要性
问题内容:
在for、if、while语句中画蛇添足加分号,有些变量未经定义就开始使用。
问题分析:
由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,平时看书不仔细、不太注意,把一些简单的基础知识搞混或忘记
解决方法:
但是在错误信息的提示下一般还是很容易找到。
不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。
为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了
7课程设计小结
C语言是一种通用性较强的语言,通过这次C语言的课程设计,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加重视实践操作,使自己更好地学习计算机的各类知识。
在实际设计的过程中,需要耐心和细心。
通过逐渐熟悉,对程序中出现问题能够较快地找到问题所在,并找到解决的方法。
在整个设计过程中,逐渐形成了一种谨慎的对待科学的态度
尽管我们已经学习了《C程序设计》,对老师所讲的知识也有了一些认识,但是正所谓“纸上谈兵终觉浅,觉知此事要躬行。
”理论知识学完之后,一定的实践还是很有必要的,所以在本学期课程设计是很及时、很必要的。
这样不仅能加深我们对程序设计的掌握,而且还及时、真正的做到了学以致用。
在本次课程设计中,我学到了主要是以下几点:
基本功要过硬,不能马虎经常犯犯小错误;提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了;要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。
开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。
这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。
有了明确的目的,就可以发挥自己的头脑来完成它了;要善于思考。
程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。
只有这样才能纠正程序的不足并使其更加人性化。
这次课程设计虽然经历了很多波折,也曾让自己苦恼好久,但是让我学到了很多,不仅是巩固了先前学的程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。
希望今后类似这样课程设计、类似这样的锻炼机会能更多些!
小组成员分工
组长:
何驰负责子程序编程模块,工作量50%
组员:
张红兵负责程序调试模块工作量25%
丁斌负责课程设计报告撰写模块工作量25%
参考文献
[1]吉顺如主编.《C程序设计教程与实验》清华大学出版社
[2]黄逵中主编.《C语言实例教程》中国电力出版社2004.9
[3]王为青张圣亮编著.《C语言实战105例》人民邮电出版社,2007
[4]王金鹏肖进杰编著《C语言设计进阶与实例解析》清华大学出版社2011.4
附录系统源程序
#include
#include
#include
#include
#defineTUB5
FILE*fp;
structresult
{
floatJJFYS;
intFenS;
floatFuS;
intYiD;
}s[TUB]={0,0,0,0,0};
typedefstructresult;
charmenu(void)
{
charch;
printf("------------------------------------------\n");
printf("\nManagementForCaculator'sResult\n");
printf("1JJFYSresult\n");
printf("2FenSresult\n");
printf("3FuSresult\n");
printf("4YiDresult\n");
printf("wWritetoaFile\n");
printf("rReadfromaFile\n");
printf("0Exit\n");
printf("PleaseInputyourchoice:
");
printf("-------------------------------------------\n");
scanf("%c",&ch);
return(ch);
}
voidJJFYS()
{
chartoken[61];/*存放表达式字符串的数组*/
intn=0;
voiderror(void)/*报告错误函数*/
{
printf("ERROR!
\n");
exit
(1);
}
voidmatch(charexpected)/*检查字符匹配的函数*/
{
if(token[n]==expected)
token[++n]=getchar();
elseerror();
}
doubleterm(void);/*计算乘除的函数*/
doublefactor(void);/*处理括号和数字的函数*/
doubleexp(void)/*计算加减的函数*/
{
doubletemp=term();
while((token[n]=='+')||(token[n]=='-'))
switch(token[n])
{
case'+':
match('+');
temp+=term();
break;
case'-':
match('-');
temp-=term();
break;
}
returntemp;
}
doubleterm(void)
{
doublediv;
doubletemp=factor();
while((token[n]=='*')||(token[n]=='/'))
switch(token[n])
{
case'*':
match('*');
temp*=factor();
break;
case'/':
match('/');
div=factor();
if(div==0)/*处理除数为零的情况*/
{
printf("Thedivisoriszero!
\n");
exit
(1);
}
temp/=div;
break;
}
returntemp;
}
doublefactor(void)
{
doubletemp;
charnumber[61];
inti=0;
if(token[n]=='(')
{
match('(');
temp=exp();
match(')');
}
elseif(isdigit(token[n])||token[n]=='.')
{
while(isdigit(token[n])||token[n]=='.')/*将字符串转换为浮点数*/
{
number[i++]=token[n++];
token[n]=getchar();
}
number[i]='\0';
temp=atof(number);
}
elseerror();
returntemp;
}
main()
{
doubleresult;
FILE*data=fopen("61590_4.dat","at");
if(data==NULL)
data=fopen("61590_4.dat","wt");
if(data==NULL)
return0;
token[n]=getchar();
result=exp();
if(token[n]=='\n')
{
token[n]='\0';
printf("%s=%g\n",token,result);fprintf(data,"%s=%g\n",token,result);
}
elseerror();
fclose(data);
return0;
getch();
}
}
voidFenS()
{
intfm,f;
inttf(inta,intb,intm,intn)
{
inti,s;
for(i=b>n?
b:
n;;i++)
{
if(i%b==0&&i%n==0)
break;
}
fm=i;
if(f)
s=(i/b*a+i/n*m);
else
s=(i/b*a-i/n*m);
returns;
}
inthj(intt,ints)
{
inti;
for(i=t
t:
s;i>=1;i--)
{
if(t%i==0&&s%i==0)
{
t/=i;
s/=i;
}
}
fm=s;
returnt;
}
main()
{
inta,b,m,n,t,s,fz,r,c,ff=0;
chark;
printf("------------------------------------------\n");
printf("[1]加法[2]减法\n");
printf("[3]乘法[4]除法\n");
printf("[0]退出\n");
printf("------------------------------------------\n");
do{
printf("请输入你选择的菜(0--4):
");
k1:
scanf("%d",&c);
if(c<0||c>4)
{printf("菜单中没有本选项,请重新输入!
");
fflush(stdin);
gotok1;
getchar();
}
printf("请输入第一个分数的分子和分母:
");
scanf("%d%d",&a,&b);
printf("请输入第二个分数的分子和分母:
");
scanf("%d%d",&m,&n);
switch(c)
{
case0:
return0;break;
case1:
f=1;t=tf(a,b,m,n);s=fm;k='+';break;
case2:
f=0;t=tf(a,b,m,n);s=fm;k='-';break;
case3:
t=a*m;s=b*n;k='*';break;
case4:
t=a*n;s=b*m;k='/';break;
}
fz=hj(t,s);
printf("%d/%d%c%d/%d=%d/%d\n",a,b,k,m,n,fz,fm);
}while
(1);
}
voidFuS()
{
typedefstructfushu//抽象数据类型义
{
floatreal;//数据对象
floatimage;
}fushu;
fushuComplexNumberInput(floata,floatb)//构造二元组
{
fushuc;
c.real=a;//实部
c.image=b;//虚部
return(c);
}
fushuComplexNumberAdd(fushuc1,fushuc2)//求和运算
{
fushusum;
sum.real=c1.real+c2.real;
sum.image=c1.image+c2.image;
return(sum);
}
fushuComplexNumberSub(fushuc1,fushuc2)//求差运算
{
fushusub;
sub.real=c1.real-c2.real;
sub.image=c1.image-c2.image;
return(sub);
}
fushuComplexNumberMul(fushuc1,fushuc2)//求积运算
{
fushuMul;Mul.real=c1.real*c2.real-c1.image*c2.image;Mul.image=c1.real*c2.image+c1.image*c2.real;
return(Mul);
}
fushuComplexNumberDiv(fushuc1,fushuc2)//求商运算
{
fushudiv;
floatd1,d2,d3,d4;
d1=c1.real*c2.real+c1.image*c2.image;
d2=c2.real*c2.real+c2.image*c2.image;
d3=c1.image*c2.real-c1.real*c2.image;
d4=c2.real*c2.real+c2.image*c2.image;
if(d2!
=0&&d4!
=0)
{
div.real=d1/d2;
div.image=d3/d4;
return(div);
}
else
{
div.real=0;
div.image=0;
return(div);
}
}
voidComplexNumberOutput(fushuc)//输出运算结果
{
if(c.real==0.0&&c.image==0.0)
printf("0\n");
if(c.real==0.0&&c.image!
=0.0)
printf("%fi\n",c.image);
if(c.real!
=0.0&&c.image==0.0)
printf("%f\n",c.real);
if(c.real!
=0.0&&c.image!
=0.0)
printf("%f+(%fi)\n",c.real,c.image);
}
voidmain()//主函数
{
intchoice;
intk;
floata1,a2,b1,b2;
structfushuc1,c2,sum,sub,mult,div;
printf("欢迎进行复数的基本代数运算\n");
printf("1:
复数加法运算\n");
printf("2:
复数减法运算\n");
printf("3:
复数乘法运算\n");
printf("4:
复数除法运算\n");
printf("0:
推出系统\n");
printf("请分别输入第一个复数的实部和虚部:
");
scanf("%f%f",&a1,&b1);
c1=ComplexNumberInput(a1,b1);
printf("第一个复数为:
");
ComplexNumberOutput(c1);
printf("请分别输入第二个复数的实部和虚部:
");
scanf("%f%f",&a2,&b2);
c2=ComplexNumberInput
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 多功能 计算器