课程设计实践报告
设计题目:简易计算器
姓 名: 冯康杰
专业班级: 材料114
学 号: 18
指导老师: 曹岳辉
上课地点: 414机房
上课时间: 6.18~6.27
目录
设计要求: 1
设计思想... 1
程序代码... 1
调试过程... 10
运行结果... 11
心得体会... 16
设计要求:
用visual C++程序设计一个简易的计算器,具有多种功能。例如加减乘除、阶乘、温度转换等。
设计思想
为了方便起见,我主要是以类和对象来进行设计,将各个功能化成各个小类,然后综合的用main主函数来运行以保证程序的稳定可靠性
程序代码
#include<iostream>
#include<cmath>
#include<iomanip>
#include<stdlib.h>
using namespace std;
class show
{
public:
void showtime()
{
cout<<"*****************************欢迎使用**********************************"<<endl;
cout<<"1.加减乘除运算"<<setw(30)<<"2.复数乘法运算"<<endl;
cout<<"3.素数判断"<<setw(44)<<"4.最小公倍数,最大公约数"<<endl;
cout<<"5.一元二次方程求解"<<setw(20)<<"6.求阶乘"<<endl;
cout<<"7.排列组合求解"<<setw(26)<<"8.温度转换"<<endl;
cout<<endl<<"************版权所有*盗版不究**本代码最终解释权归fengkj所有************"<<endl;
}
};
class jiajian
{
int i;
double a,b,s;
public:
void print()
{cout<<"1.加法运算"<<"\t2.减法运算"<<"\t3.乘法运算"<<"\t4.除法运算"<<endl;
cout<<"请输入代号:"<<endl;
here:cin>>i;
cout<<"请输入两个数a,b"<<endl;
cout<<"a=";cin>>a;cout<<"b=";cin>>b;
switch(i)
{
case 1:s=a+b;cout<<a<<'+'<<b<<"="<<s;
break;
case 2:s=a-b;cout<<a<<'-'<<b<<"="<<s;
break;
case 3:s;s=a*b;cout<<a<<'*'<<b<<"="<<s;
break;
case 4:if(b==0)cout<<"数据错误!";else{s=a/b;cout<<a<<'/'<<b<<"="<<s;}
break;
default:cout<<"代号数据错误,请重输";goto here;
}
}
};
class fushu
{
float a,b,c,d,j,k;
public:
void getin()
{
cout<<"请输入两个复数:"<<endl;
cout<<"x=_+_i";cin>>a>>b;cout<<"y=_+_i";cin>>c>>d;
}
void multi()
{j=a*c-b*d;k=b*c+a*d;}
void print()
{if(k>0)cout<<"x+y="<<j<<'+'<<k<<'i'<<endl;else if(k<0)cout<<"x+y="<<j<<'-'<<-k<<'i'<<endl;else cout<<"x+y="<<j<<endl;}
};
class sushu
{
public:
long t;
void get(){cout<<"请输入一个待验证的数x:";cin>>t;}
int prime(long x)
{
long i;
for(i=2;i<x/2;i++)
if(x%i==0)return 2;
return 3;
}
void print(){long x;x=t;if(prime(x)==2)cout<<t<<"不是素数";else cout<<t<<"是素数";}
};
class gongbeishu
{
long x,y,max,min;
public:
void get()
{cout<<"请输入两个正整数x,y:"<<endl;
cout<<"x=";cin>>x;cout<<"y=";cin>>y;
}
void jisuan()
{long m,n,r,t;
m=x;n=y;
t=m*n;
if(m<n){r=m;m=m;n=r;}
while((r=m%n)!=0)
{
m=n;
n=r;
}
max=n;min=t/n;
}
void print(){cout<<x<<"和"<<y<<"的最大公约数是:"<<max<<','<<"最小公倍数是:"<<min<<endl;}
};
class qiujie
{
float a,b,c,x1,x2,t,s;
public:
void get()
{cout<<"请输入方程的系数a,b,c:"<<endl;
cout<<"a=";cin>>a;cout<<"b=";cin>>b;cout<<"常数c=";cin>>c;}
void jisuan()
{float i;i=b*b-4*a*c;t=0;s=0;
if(i>=0){x1=(-b+sqrt(i))/(2*a);x2=(-b-sqrt(i))/(2*a);}else{x1=-b/(2*a);x2=-b/(2*a);s=sqrt(-i)/(2*a);t=-sqrt(-i)/(2*a);}
}
void print()
{cout<<"方程的解为:"<<endl;
cout<<"x1="<<x1<<'+'<<t<<'i'<<"\tx2="<<x2<<'+'<<s<<'i';
}
};
class jiecheng
{
int n,s;
public:
void get()
{cout<<"请输入待阶乘的数:n=";cin>>n;}
void jisuan()
{int i;
s=1;
for(i=1;i<n;i++)s*=i;
}
void print()
{cout<<"阶乘结果为:"<<"n!="<<s;}
};
class pailie
{
int n,r;
public:
void get()
{
ak: cout<<"请输入排列组合数:C(n,r)、P(n,r):"<<endl;
cout<<"n=";cin>>n;cout<<"r=";cin>>r;
if(n<r){cout<<"数据错误,请重新输入!";goto ak;}
}
int jiecheng(int x)
{int i,s=1;for(i=1;i<=x;i++)s*=i;return s;}
void print()
{cout<<"排列数P="<<jiecheng(n)/jiecheng(n-r)<<','<<"组合数C="<<jiecheng(n)/(jiecheng(r)*jiecheng(n-r));}
};
class wendu
{int i;
float n,s;
public:
void get()
{cout<<"请选择温度转换方向:0.摄氏转华氏 1.华氏转摄氏:";
cin>>i;
cout<<"请输入温度:";cin>>n;
}
void zhuanhuan()
{s=0;if(!i)s=32+n*1.8;else s=(n-32)/1.8;}
void print()
{if(!i)cout<<"摄氏温度为:"<<n<<"'C"<<','<<"华氏温度为:"<<s<<"'F";else cout<<"华氏温度为:"<<n<<"'F"<<','<<"摄氏温度为:"<<s<<"'C";}
};
void main()
{int i,pp=1,ss=1;
while(pp)
{system("cls");
show v;
v.showtime();
qq: cout<<"请输入您要进行运算的编码:";
cin>>i;
switch(i)
{
case 1:g1: jiajian aa;aa.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g1;else break;
case 2:g2: fushu bb;bb.getin();bb.multi();bb.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g2;else break;
case 3:g3: sushu cc;cc.get();cc.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g3;else break;
case 4:g4: gongbeishu dd;dd.get();dd.jisuan();dd.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g4;else break;
case 5:g5: qiujie ee;ee.get();ee.jisuan();ee.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g5;else break;
case 6:g6: jiecheng ff;ff.get();ff.jisuan();ff.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g6;else break;
case 7:g7: pailie gg;gg.get();gg.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g7;else break;
case 8:g8: wendu hh;hh.get();hh.zhuanhuan();hh.print();cout<<"重新计算请按1,否则请按0";cin>>ss;if(ss)goto g8;else break;
default:cout<<"数据错误!请输入1~8之间的一个整数";goto qq;
}
cout<<"返回主菜单请按1,退出程序请按0";
cin>>pp;
}
}
调试过程
由于学的知识不是很多,也不是很熟练,在最开始的时候老是范一些小错误,而且很多语法错误,比如忘了写分号啊,把分号写成逗号啦。而且忘了写全{}就会出现很多个错误,在一个庞大的程序里面找这些错误再一一改正,很可能还是不能运行,但是多加一个}就很可能全部错误都搞定!调试的时候很多地方都是牵一发而动全身,特别是修改的时候,修改一个变量就得把其他部分的都改掉,不然就会一直出现错误。还经常忘了定义变量就用,不过看英文提示面前能看懂,也能找到相应的错误。
在把语法小错误解决之后就剩下运行了,但是运行的情况不容乐观,很多地方呢不是我想要的结果。例如在加减乘除那里,由于当时变量粗心的定义为long,得出的数总是为整数,后来改正为float后问题就解决了,还有就是开始界面里的序列号对不齐,后来尝试着用setw()来解决,尝试多次后得以解决。在老师的建议之下通过包含stdlib.h头文件和调用system("cls")函数成功的做到进行一次计算之后清理屏幕的效果。
运行结果
通过输入编码来选择计算类型。例如输入1.
方法同上继续进行输入代码的操作。
重新计算输入1,否则输入0.
这里我输入0然后。
输入1
回到主菜单,并清理屏幕。
其他函数基本同上,在演示一个,例如4.最小公倍数最大公约数。
心得体会
本次程序设计所用时间较长,工作量很饱满,而且所用的知识很多,但是我们平常在课堂上所学的知识很有限,这就需要我大量的自学书本和课外的其他书籍上的知识。为了让程序容易使人看懂,我用到的知识点不是非常多,大都是一些基本知识,我能熟练地运用这些知识编程也算一个很大的成功了。毕竟很多知识没有学,能用基本知识就尽量用的基本知识。C++设计实践是对之前学过的知识的加深和巩固,之前学得较浅,实践的机会不多,这次实践让我对C++程序有了更加深入的了解,心理也由原来的不喜欢到喜欢,感觉很有意思也很有用,可也设计一些有用的或者是自己喜欢的程序。最令我收益的是写程序的过程和调试修改的过程,因为之前我们就学了几章,没有把知识学习全面,因此编写起来是有难度的,在预先想好程序结构后,就开是卡看书,一个函数一个函数来编写,不懂的地方就上网搜或是请教一下同学和老师,当终于把程序写出来的时候,内心里又有一种说不出来的激动,我感觉这很符合大学的教育观念,是对个人自主学习能力的一个锻炼。在接下来就是调试,虽然出了很多的错误,虽然自己也被搞的焦头烂额,但我还是很兴奋,我感觉自己就像是个侦探,一点点找线索,找到问题,再解决,每次成功都带给自己一次激动。现在程序终于能较好的运行出来了,当然,还存在一些瑕疵,但通过这近两周的实践学习,我收获的不仅仅是这一个程序,我的自学能力,以及寻找问题解决问题的能力也得到了很好的锻炼。