准备了一个月的考试终于结束了。总结一下这一个月学到的理论知识,规划一下1月的计划。昨天敲了一天的代码。复数计算器是我敲的第一个比较大的程序,涉及到的主要知识点是运算符的重载和文件操作。纯代码后面再做详细的介绍。
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<ctime>
#define EPS 1e-5
using namespace std;
namespace NameCComplex //空间域防止混淆
{
class CComplex
{
private:
double Real,Image;
public:
CComplex(double real=0,double image=0)
{
Real=real;Image=image;
}
friend istream &operator >>(istream & is,CComplex& com);
friend ostream &operator <<(ostream & os,CComplex &com);//运算符的重载
CComplex operator +(CComplex &com);
CComplex operator -(CComplex &com);
CComplex operator *(CComplex &com);
CComplex operator +=(CComplex &com);
CComplex operator -=(CComplex &com);
CComplex operator *=(CComplex &com);
CComplex operator ++();
CComplex operator --();
double mod(void);
int operator >(CComplex &com);//类型转换字符
int operator <(CComplex &com);
int operator !=(CComplex &com);
int operator ==(CComplex &com);
};
struct User
{
char szname[20];
int ntime;
int ntest;
double dlave;
int nadd;
int nsub;
int nmul;
double dlsocre[3];
} user;
CComplex CComplex::operator ++()
{
Real++;
Image++;
return *this;
}
CComplex CComplex::operator --()
{
Real --;
Image--;
return *this;
}
double CComplex::mod()
{
return Real*Real+Image*Image;
}
int CComplex::operator >(CComplex &com)
{
if(mod()>com.mod())
return 1;
else return 0;
}
int CComplex::operator <(CComplex &com)
{
if(mod()<com.mod())
return 1;
else return 0;
}
int CComplex::operator !=(CComplex &com)
{
if(*this==com)
return 0;
else
return 1;
}
istream &operator >>(istream&is,CComplex &com)
{
cout<<"输入复数:";
char s[80];
is>>s;
int len=strlen(s);
int n=0,sign=1;
com.Image=com.Real=0;
for(int k=0;k<len;k++)
{
if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i'))
{
cout<<"error"<<endl;
return is;
}
}
for(int k=0;k<len;)
{
if(n!=0&&(s[k]=='-'||s[k]=='+'))
{
com.Real=sign*n;
n=0;
}
if(s[k]=='-')
{
sign=-1;k++;
}
if(s[k]=='+')
{
sign=1;k++;
}
if(s[k]=='i')
{
if(k!=len-1)
cout<<"error\n";
else
com.Image=sign*n;
break;
}
while(s[k]>='0'&&s[k]<='9')
{
n=n*10+s[k]-'0';
k++;
}
}
if(s[len-1]!='i'&&n!=0)
com.Real=n*sign;
return is;
}
ostream&operator<<(ostream &os,CComplex &com)
{
if(fabs(com.Image)<EPS)
os<<com.Real;
else if((fabs(com.Real)<EPS))
os<<com.Image<<"i";
else if(com.Image>0)
os<<com.Real<<"+"<<com.Image<<"i";
else
os<<com.Real<<com.Image<<"i";
return os;
}
CComplex CComplex::operator +(CComplex&com)
{
CComplex sum;
sum.Real=Real+com.Real;
sum.Image=Image+com.Image;
return sum;
}
CComplex CComplex::operator *(CComplex &com)
{
CComplex multi;
multi.Real=Real*com.Real-Image*com.Image;
multi.Image=Real*com.Image+Image*com.Real;
return multi;
}
CComplex CComplex::operator -(CComplex &com)
{
CComplex sub;
sub.Real=Real-com.Real;
sub.Image=Image-com.Image;
return sub;
}
CComplex CComplex::operator +=(CComplex &com)
{
Real=Real+com.Real;
Image=Image+com.Image;
return *this;
}
CComplex CComplex::operator -=(CComplex &com)
{
Real=Real-com.Real;
Image=Image-com.Image;
return *this;
}
CComplex CComplex::operator *=(CComplex &com)
{
double nReal=Real*com.Real-Image*com.Image;
double nImage=Real*com.Image+Image*com.Real;
Real=nReal;
Image=nImage;
return *this;
}
int CComplex::operator ==(CComplex&com)
{
if(Real==com.Real&&Image==com.Image)
return 1;
else
return 0;
}
void test(void)
{
user.ntest++;
cout<<"共10道题,作10以内的加减运算,满分100分:\n";
double real1,real2,image1,image2,real3,real4,image3,image4;
CComplex answer,temp;
int score=0;
char op;
for(int i=0;i<=9;i++)
{
real1=rand()%200-100;
image1=rand()%200-100;
real2=rand()%200-100;
image2=rand()%200-100;
CComplex a(real1,image1),b(real2,image2);
real3=rand()%20-10;
image3=rand()%20-10;
real4=rand()%20-10;
image4=rand()%20-10;
CComplex c(real3,image3),d(real4,image4);
op=rand()%3;
switch(op)
{
case 0:
answer=a+b;
cout<<a<<"加上"<<b<<"等于";
break;
case 1:
answer=a-b;
cout<<a<<"减去"<<b<<"等于";
break;
case 2:
answer=c*d;
cout<<c<<"乘以"<<d<<"等于";
break;
}
cin>>temp;
if(answer==temp)
{
score+=10;
}
else
{
cout<<"此题做错了\n";
cout<<"正确答案为:"<<answer<<endl;
}
}
cout<<"你的最后得分是:"<<score<<endl;
if(user.ntest<=3)
{
user.dlave=0;
user.dlsocre[user.ntest-1]=score;
for(int i=0;i<user.ntest;i++)
user.dlave+=user.dlsocre[i];
user.dlave=user.dlave/user.ntest;
}
else
{
user.dlsocre[0]=user.dlsocre[1];
user.dlsocre[1]=user.dlsocre[2];
user.dlsocre[2]=score;
user.dlave=0;
for(int i=0;i<3;i++)
user.dlave+=user.dlsocre[i];
user.dlave=user.dlave/3;
}
cout<<"按任意键继续\n";
cout.flush();
cin.get();
cin.get();
}
void add()
{
user.nadd++;
CComplex num1,num2,sum,zero(0,0);
cout<<"加法计算\n"<<"最少输入两个复数,并且以零结束\n";
cout<<"第一个复数";
cin>>num1;
cout<<"第二个复数";
cin>>num2;
sum=num1+num2;
cout<<"第三个复数";
cin>>num1;
int i=4;
while(!(num1==zero))
{
sum=sum+num1;
cout<<"第"<<i<<"个复数";
cin>>num1;
i++;
}
cout<<"加法计算的结果是"<<sum<<endl;
cout<<"按任意键继续\n";
cout.flush();
cin.get();
cin.get();
}
void sub()
{
user.nsub++;
CComplex num1,num2,sub,zero(0,0);
cout<<"减法计算\n"<<"最少输入两个复数,并且以零结束\n";
cout<<"第一个复数";
cin>>num1;
cout<<"第二个复数";
cin>>num2;
sub=num1-num2;
cout<<"第三个复数";
cin>>num1;
int i=4;
while(!(num1==zero))
{
sub=sub-num1;
cout<<"第"<<i<<"个复数";
cin>>num1;
i++;
}
cout<<"减法运算的结果是"<<sub<<endl;
cout<<"按任意键继续\n";
//cout.flush();
cin.get();
cin.get();
}
void mul()
{
user.nmul++;
CComplex num1,num2,mul,zero(0,0);
cout<<"乘法计算\n"<<"最少输入两个复数,并且以零结束\n";
cout<<"第一个复数";
cin>>num1;
cout<<"第二个复数";
cin>>num2;
mul=num1*num2;
cout<<"第三个复数";
cin>>num1;
int i=4;
while(!(num1==zero))
{
num1*=num1;
cout<<"第"<<i<<"个数";
cin>>num1;
i++;
}
cout<<"乘法运算的结果是"<<mul<<endl;
cout<<"按任意键继续\n";
//cout.flush();
cin.get();
cin.get();
}
void add1()
{
user.nadd++;
CComplex num1;
cin>>num1;
num1+=num1;
cout<<"自加结果为"<<num1<<endl;
cout<<"按任意键继续\n";
cout.flush();
cin.get();
cin.get();
}
void sub1()
{
user.nsub++;
CComplex num1;
cin>>num1;
num1-=num1;
cout<<"自减结果为"<<num1<<endl;
cout<<"按任意键继续\n";
cout.flush();
cin.get();
cin.get();
}
void compare()
{
CComplex num1,num2;
cout<<"输入两个复数\n";
cout<<"第一个复数:";
cin>>num1;
cout<<"第二个复数";
cin>>num2;
if(num1==num2)
cout<<"这两个复数相等\n";
else if(num1>num2)
cout<<num1<<"的模大于"<<num2<<"的模\n";
else if(num1<num2)
cout<<num2<<"的模大于"<<num1<<"的模\n";
else
cout<<"这两个复数的模相等\n";
cout<<"按任意键继续\n";
cin.get();
cin.get();
}
void userprint()
{
cout<<user.szname<<"使用的次数为"<<user.ntime<<endl;
cout<<"其中:\t加法次数:"<<user.nadd<<"\t减去次数:"<<user.nsub<<"/t乘法次数"<<user.nmul<<endl;
cout<<"\t测试次数:"<<user.ntest<<"\t平均成绩"<<user.dlave<<endl;
}
void login()
{
char szname[20];
cout<<"请输入您的姓名:";
cin.getline(szname,20);
ifstream infile;
User user1;
infile.open("user.dat",ios::binary|ios::in);
if(! infile)
{
cout<<"没有原始记录文件,您是第一位用户!\n";
strcpy(user.szname,szname);
user.ntime++;
return;
}
infile.read((char*)&user1,sizeof(User));
while(!infile.eof())
{
if(strcmp(user1.szname,szname)==0)
{
user=user1;
user.ntime++;
cout<<"欢迎您再次使用复数计算器";
userprint();
cin.get();
infile.close();
return;
}
infile.read((char *)&user1,sizeof(User));
}
strcpy(user.szname,szname);
user.ntime++;
infile.close();
return;
}
void savefile()
{
userprint();
fstream file;
User user1;
file.open("user.dat",ios::binary|ios::in|ios::out);
if(!file)
{
cout<<"文件打开错误,不能将记录更新\n";
return ;
}
file.seekp(0,ios::beg);
while(!file.eof())
{
file.read((char*)&user1,sizeof(User));
if(strcmp(user1.szname,user.szname)==0)
{
file.seekp(-(sizeof(User)),ios::cur);
file.write((char*)&user,sizeof(User));
file.close();
return;
}
}
file.close();
fstream outfile;
outfile.open("user.dat",ios::binary|ios::app);
outfile.write((char*)&user,sizeof(User));
outfile.close();
return;
}
}
using namespace NameCComplex;
int main(void)
{
srand(time(NULL));
login();
char strChoice[20];
do
{
system("cls");
cout<<"\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的键(1~7)进入\n\n\n";
cout<<"\t==============MENU==============\n";
cin>>strChoice;
if(strcmp(strChoice,"1")==0)
add();
else if(strcmp(strChoice,"2")==0)
sub();
else if(strcmp(strChoice,"3")==0)
test();
else if(strcmp(strChoice,"4")==0)
mul();
else if(strcmp(strChoice,"5")==0)
add1();
else if(strcmp(strChoice,"6")==0)
sub1();
else if(strcmp(strChoice,"7")==0)
compare();
else if(strcmp(strChoice,"0")==0)
{
cout<<"\n\n\t欢迎下次继续使用计算器!\n\n";
break;
}
else
{
cout<<"\n\t输入错误,请按任意键后重新输入!\n";
cin.get();
cin.get();
}
}
while((strcmp(strChoice,"0")));
savefile();
return 0;
}