C小型复数计算器.docx

上传人:b****3 文档编号:4611915 上传时间:2022-12-07 格式:DOCX 页数:18 大小:18.66KB
下载 相关 举报
C小型复数计算器.docx_第1页
第1页 / 共18页
C小型复数计算器.docx_第2页
第2页 / 共18页
C小型复数计算器.docx_第3页
第3页 / 共18页
C小型复数计算器.docx_第4页
第4页 / 共18页
C小型复数计算器.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C小型复数计算器.docx

《C小型复数计算器.docx》由会员分享,可在线阅读,更多相关《C小型复数计算器.docx(18页珍藏版)》请在冰豆网上搜索。

C小型复数计算器.docx

C小型复数计算器

#include

#include

#include

#include

#include

#include

#defineEPS1e-5//定义精度常数

usingnamespacestd;//使用标准空间命名std

namespaceNameCComplex//定义命名空间NameCComplex

{

classCComplex////定义一个CComplex类

{

private:

doubleReal,Image;

public:

CComplex(doublereal=0,doubleimage=0)//构造函数

{

Real=real;

Image=image;

}

friendistream&operator>>(istream&is,CComplex&com);//重载输入

friendostream&operator<<(ostream&os,CComplex&com);//重载输出

CComplexoperator+(CComplex&com);//加法重载

CComplexoperator-(CComplex&com);//减法重载

CComplexoperator*(CComplex&com);//乘法重载

CComplexoperator+=(CComplex&com);//加法赋值重载

CComplexoperator-=(CComplex&com);//减法赋值重载

CComplexoperator*=(CComplex&com);//乘法赋值重载

CComplexoperator++();//自加

CComplexoperator--();//自减

doublemod(void);//求复数的模

intoperator>(CComplex&com);

intoperator<(CComplex&com);

intoperator!

=(CComplex&com);

intoperator==(CComplex&com);

};

structUser//用户结构体类型定义

{

charszName[20];//用户名

intnTime;//使用次数

intnTest;//测试次数

doublealAve;//平均成绩

intnAdd;//加法次数

intnSub;//减法次数

intnMul;//乘法次数

doubledlScore[3];//3次测试得分

}user;//定义全局变量

CComplexCComplex:

:

operator++()//重载运算符"++",实部与虚部均加1

{

Real++;

Image++;

return*this;

}

CComplexCComplex:

:

operator--()//重载运算符"--",实部与虚部均减1

{

Real--;

Image--;

return*this;

}

doubleCComplex:

:

mod()//求复数的模的平方,返回实部^2+虚部^2

{

returnReal*Real+Image*Image;

}

intCComplex:

:

operator>(CComplex&com)//重载运算符">",比较模的大小

{

if(mod()>com.mod())

return1;

else

return0;

}

intCComplex:

:

operator<(CComplex&com)

{

if(mod()

return1;//若大,则返回1

else

return0;

}

intCComplex:

:

operator!

=(CComplex&com)

//重载运算符"!

=",分别判断复数的实部和虚部

{

if(*this==com)

return0;

else

return1;

}

istream&operator>>(istream&is,CComplex&com)//重载输入,可以输入a+bi的形式

{

cout<<"请输入复数:

";

chars[80];

is>>s;//用字符串的形式接受复数

intlen=strlen(s);//求出字符串的长度

intn=0,sign=1;

//n为当前从字符串中提取出来的数字,初始化为0;sign是难道符号,初始化为正

com.Image=com.Real=0;

for(intk=0;k

{

if((s[k]<'0'||s[k]>'9')&&(s[k]!

='+'&&s[k]!

='-'&&s[k]!

='i'))

{

cout<<"error"<

returnis;//错误,输出出错信息并返回

}

}

for(k=0;k

{

if(n!

=0&&(s[k]=='-'||s[k]=='+'))//当前字符是否是符号位

{

com.Real=sign*n;

//是符号位,且n!

=0,即n已被赋值,表明当前读取的是虚部的符号

n=0;//将原n*sign值赋给实部,将n清零,准备接受虚部的值

}

if(s[k]=='-')//当前字符为负号

{

sign=-1;k++;//给符号标志赋值

}

if(s[k]=='+')//当前字符为正号

{

sign=1;k++;//给符号标志赋值

}

if(s[k]=='i')//当前字符为'I'

{

if(k!

=len-1)//判断字符'I'是否为字符串中作后一个字符

cout<<"error\n";//如果不是,说明复数数据格式错误

else

com.Image=sign*n;

//是最后一个字符,复数对象已接受完,用sign*n为虚部赋值

break;

}

while(s[k]>='0'&&s[k]<='9')

//当前字符在0~9之间,将数字字符转换成数字数值

{

n=n*10+s[k]-'0';

k++;

}

}

if(s[len-1]!

='i'&&n!

=0)

//如果最后一个字符不是'I',表示复数对象内只有实部,没有虚部

{

com.Real=n*sign;

}

returnis;

}

ostream&operator<<(ostream&os,CComplex&com)//重载输入

{

if(fabs(com.Image)

os<

elseif((fabs(com.Real)

os<

elseif(com.Image>0)

os<

else

os<

returnos;

}

CComplexCComplex:

:

operator+(CComplex&com)//加法重载

{

CComplexsum;

sum.Real=Real+com.Real;//实部相加

sum.Image=Image+com.Image;//虚部相加

returnsum;

}

CComplexCComplex:

:

operator*(CComplex&com)//乘法重载

{

CComplexmulti;

multi.Real=Real*com.Real-Image*com.Image;//乘积实部

multi.Image=Real*com.Image+Image*com.Real;//乘积虚部

returnmulti;

}

CComplexCComplex:

:

operator-(CComplex&com)//减法重载

{

CComplexsub;

sub.Real=Real-com.Real;

sub.Image=Image-com.Image;

returnsub;

}

CComplexCComplex:

:

operator+=(CComplex&com)//重载加法赋值

{

Real=Real+com.Real;

Image=Image+com.Image;

return*this;

}

CComplexCComplex:

:

operator-=(CComplex&com)//重载减法赋值

{

Real=Real-com.Real;

Image=Image-com.Image;

return*this;

}

CComplexCComplex:

:

operator*=(CComplex&com)//重载乘法赋值

{

doublenReal=Real*com.Real-Image*com.Image;

doublenImage=Real*com.Image+Image*com.Real;

Real=nReal;

Image=nImage;

return*this;

}

intCComplex:

:

operator==(CComplex&com)//重载等于

{

if(Real==com.Real&&Image==com.Image)

return1;

else

return0;

}

voidTest(void)//测试函数

{

user.nTest++;

cout<<"共10道题,做100以内的加减运算,满分100分:

\n";

doublereal1,real2,image1,image2,real3,real4,image3,image4;

CComplexanswer,temp;

intscore=0;

charop;

for(inti=0;i<=9;i++)

{

/////为复数产生随机值

real1=rand()%200-100;

image1=rand()%200-100;

real2=rand()%200-100;

image2=rand()%200-100;

CComplexa(real1,image1),b(real2,image2);

real3=rand()%20-10;

image3=rand()%20-10;

real4=rand()%20-10;

image4=rand()%20-10;

CComplexc(real3,image3),d(real4,image4);

op=rand()%3;//产生随机加减乘法运算的三个值

switch(op)

{

case0:

answer=a+b;

cout<

break;

case1:

answer=a-b;

cout<

break;

case2:

answer=c*d;

cout<

break;

}

cin>>temp;//输入用户计算值

if(answer==temp)//比较用户计算值

{

score+=10;

}

else

{

cout<<"此题做错了\n";

cout<<"正确答案为:

"<

}

}

cout<<"你的最后得分是:

"<

if(user.nTest<=3)

{

user.alAve=0;

user.dlScore[user.nTest-1]=score;

for(inti=0;i

user.alAve+=user.dlScore[i];

user.alAve=user.alAve/user.nTest;

}

else

{

user.dlScore[0]=user.dlScore[1];

user.dlScore[1]=user.dlScore[2];

user.dlScore[2]=score;

for(i=0,user.alAve=0;i<3;i++)

user.alAve+=user.dlScore[i];

user.alAve=user.alAve/3;

}

cout<<"请按任意键继续\n";

cout.flush();

cin.get();

cin.get();

}

voidAdd()//复数加法运算函数

{

user.nAdd++;

CComplexnum1,num2,sum,Zero(0,0);

cout<<"加法计算\n"<<"最少输入两个复数,并且以0结束\n";

cout<<"第一个复数:

";

cin>>num1;

cout<<"第二个复数:

";

cin>>num2;

sum=num1+num2;

cout<<"第三个复数:

";

cin>>num1;

inti=4;

while(!

(num1==Zero))

{

sum=sum+num1;

cout<<"第"<

";

cin>>num1;

i++;

}

cout<<"加法结果是:

"<

cout<<"请按任意键继续\n";

cout.flush();

cin.get();

cin.get();

}

voidSub()//复数减法预算函数

{

user.nSub++;

CComplexnum1,num2,sub,Zero(0,0);

cout<<"最少输入两个复数,并且以0结束\n";

cout<<"第1个复数:

";

cin>>num1;

cout<<"第2个复数:

";

cin>>num2;

sub=num1-num2;

cout<<"第3个复数:

";

cin>>num1;

inti=4;

while(!

(num1==Zero))

{

sub=sub-num1;

cout<<"第"<

";

cin>>num1;

i++;

}

cout<<"减法结果是:

"<

cout<<"请按任意键继续\n";

cout.flush();

cin.get();

cin.get();

}

voidMul()//复数乘积函数

{

user.nMul++;

CComplexnum1,num2,mul,Zero(0,0);

cout<<"乘法计算\n"<<"最少输入两个复数,并且以零结束\n";

cout<<"第一个复数:

";

cin>>num1;

cout<<"第二个复数:

";

cin>>num2;

mul=num1*num2;

cout<<"第三个复数:

";

cin>>num1;

inti=4;

while(!

(num1==Zero))

{

mul*=num1;

cout<<"第"<

";

cin>>num1;

i++;

}

cout<<"乘法结果是:

"<

cout<<"请按任意键继续\n";

cout.flush();

cin.get();

cin.get();

}

voidAdd1()

{

user.nAdd++;

CComplexnum1;

cin>>num1;

++num1;

cout<<"自加的结果为"<

cout<<"按任意键结束\n";

cout.flush();

cin.get();

cin.get();

}

voidSub1()//复数自加运算函数

{

user.nSub++;

CComplexnum1;

cin>>num1;

--num1;

cout<<"自减的结果为"<

cout<<"按任意键结束\n";

cout.flush();

cin.get();

cin.get();

}

voidcompare()//两复数比较函数

{

CComplexnum1,num2;

cout<<"输入两个复数\n";

cout<<"第一个复数:

";

cin>>num1;

cout<<"输入第二个复数\n";

cin>>num2;

if(num1==num2)

cout<<"这两个复数相等\n";

elseif(num1>num2)

cout<

elseif(num1

cout<

else

cout<<"这两个复数的模相等\n";

cout<<"按任意键继续\n";

cin.get();

cin.get();

}

voiduserprint()//输出用户信息函数

{

cout<

"<

cout<<"其中:

\t加法的次数:

"<

"<

"<

cout<<"\t测试次数:

"<

"<

}

voidLogin()//当前用户信息函数

{

charszName[20];

cout<<"请输入您的姓名:

";

cin.getline(szName,20);

ifstreaminfile;

Useruser1;

infile.open("user.dat",ios:

:

binary|ios:

:

in);

if(!

infile)

{

cout<<"没有原始记录文件,您是第一个用户!

\n";

strcpy(user.szName,szName);

user.nTest++;

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));

}

cout<<"欢迎您再次使用复数计算器!

";

strcpy(user.szName,szName);

user.nTime++;

infile.close();

return;

}

voidSaveFile()//用户资料保存函数

{

userprint();

fstreamfile;

Useruser1;

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();

fstreamoutfile;

outfile.open("user.dat",ios:

:

binary|ios:

:

app);

outfile.write((char*)&user,sizeof(User));

outfile.close();

return;

}

}

usingnamespaceNameCComplex;

intmain(void)//主函数开始

{

srand(time(NULL));//初始化随机数“种子”语句

Login();//当前用户信息函数

charstrChoise[20];//定义字符串名

do

{

system("cls");

cout<<"\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的按键(1-7)\n\n\n";

cout<<"\t=========================MENU===========================\n";

cout<<"\t1:

多复数加法,以0结束\n";

cout<<"\t2:

多复数减法,以0结束\n";

cout<<"\t3:

测试100以内的复数加减乘法运算,1次测试10道题\n";

cout<<"\t4:

多复数乘法,以0结束\n";

cout<<"\t5:

复数自加\n:

";

cout<<"\t6:

复数自减\n:

";

cout<<"\t7:

复数比较\n:

";

cout<<"\t0:

退出程序\n\n:

";

cout<<"\t请您选择:

";

cin>>strChoise;

if(strcmp(strChoise,"1")==0)//用户选1则调用Add()函数

Add();

elseif(strcmp(strChoise,"2")==0)//用户选2则调用Sub()函数

Sub();

elseif(strcmp(strChoise,"3")==0)//用户选3则调用Test()函数

Test();

elseif(strcmp(strChoise,"4")==0)//用户选4则调用Add()函数

Mul();

elseif(strcmp(strChoise,"5")==0)//用户选5调用Add1()函数

Add1();

elseif(strcmp(strChoise,"6")==0)//用户选6则调用Sub1()函数

Sub1();

elseif(strcmp(strChoise,"7")==0)//用户选7则调用Compare()函数

compare();

elseif(strcmp(strChoise,"0")==0)//用户选0则结束调用函数

{

cout<<"\n\n\t欢迎下次继续使用复数计算器!

\n\n";

break;

}

else

{

cout<<"\n\t输入错误,请按任意键继续!

\n";

cin.get();

cin.get();

}

}

while((strcmp(strChoise,"0")));

SaveFile();//调用用户资料保存函

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1