C小型复数计算器Word格式文档下载.docx
《C小型复数计算器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C小型复数计算器Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
doublemod(void);
//求复数的模
intoperator>
(CComplex&
intoperator<
intoperator!
=(CComplex&
intoperator==(CComplex&
};
structUser//用户结构体类型定义
charszName[20];
//用户名
intnTime;
//使用次数
intnTest;
//测试次数
doublealAve;
//平均成绩
intnAdd;
//加法次数
intnSub;
//减法次数
intnMul;
//乘法次数
doubledlScore[3];
//3次测试得分
}user;
//定义全局变量
CComplexCComplex:
:
operator++()//重载运算符"
++"
,实部与虚部均加1
Real++;
Image++;
return*this;
operator--()//重载运算符"
--"
,实部与虚部均减1
Real--;
Image--;
doubleCComplex:
mod()//求复数的模的平方,返回实部^2+虚部^2
returnReal*Real+Image*Image;
intCComplex:
operator>
com)//重载运算符"
"
,比较模的大小
if(mod()>
com.mod())
return1;
else
return0;
operator<
com)
if(mod()<
//若大,则返回1
operator!
//重载运算符"
!
="
,分别判断复数的实部和虚部
if(*this==com)
istream&
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<
len;
k++)//判断接受的字符串是否合法
if((s[k]<
'
0'
||s[k]>
'
9'
)&
&
(s[k]!
='
+'
&
s[k]!
-'
i'
))
error"
endl;
returnis;
//错误,输出出错信息并返回
for(k=0;
)//顺序识别字符串中各字符
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++;
//给符号标志赋值
)//当前字符为正号
sign=1;
)//当前字符为'
I'
if(k!
=len-1)//判断字符'
是否为字符串中作后一个字符
error\n"
//如果不是,说明复数数据格式错误
com.Image=sign*n;
//是最后一个字符,复数对象已接受完,用sign*n为虚部赋值
break;
while(s[k]>
s[k]<
)
//当前字符在0~9之间,将数字字符转换成数字数值
n=n*10+s[k]-'
if(s[len-1]!
n!
=0)
//如果最后一个字符不是'
,表示复数对象内只有实部,没有虚部
com.Real=n*sign;
ostream&
com)//重载输入
if(fabs(com.Image)<
EPS)//如果虚部为0
os<
com.Real;
//只输出实部
elseif((fabs(com.Real)<
EPS))//如果实部为0
com.Image<
i"
//只输出虚部
elseif(com.Image>
0)
com.Real<
+"
//虚部为正
returnos;
operator+(CComplex&
com)//加法重载
CComplexsum;
sum.Real=Real+com.Real;
//实部相加
sum.Image=Image+com.Image;
//虚部相加
returnsum;
operator*(CComplex&
com)//乘法重载
CComplexmulti;
multi.Real=Real*com.Real-Image*com.Image;
//乘积实部
multi.Image=Real*com.Image+Image*com.Real;
//乘积虚部
returnmulti;
operator-(CComplex&
com)//减法重载
CComplexsub;
sub.Real=Real-com.Real;
sub.Image=Image-com.Image;
returnsub;
operator+=(CComplex&
com)//重载加法赋值
Real=Real+com.Real;
Image=Image+com.Image;
operator-=(CComplex&
com)//重载减法赋值
Real=Real-com.Real;
Image=Image-com.Image;
operator*=(CComplex&
com)//重载乘法赋值
doublenReal=Real*com.Real-Image*com.Image;
doublenImage=Real*com.Image+Image*com.Real;
Real=nReal;
Image=nImage;
operator==(CComplex&
com)//重载等于
if(Real==com.Real&
Image==com.Image)
voidTest(void)//测试函数
user.nTest++;
共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;
a<
加上"
b<
等于"
case1:
answer=a-b;
减去"
case2:
answer=c*d;
c<
乘以"
d<
cin>
temp;
//输入用户计算值
if(answer==temp)//比较用户计算值
score+=10;
此题做错了\n"
正确答案为:
answer<
你的最后得分是:
score<
if(user.nTest<
=3)
user.alAve=0;
user.dlScore[user.nTest-1]=score;
user.nTest;
user.alAve+=user.dlScore[i];
user.alAve=user.alAve/user.nTest;
user.dlScore[0]=user.dlScore[1];
user.dlScore[1]=user.dlScore[2];
user.dlScore[2]=score;
for(i=0,user.alAve=0;
3;
user.alAve=user.alAve/3;
请按任意键继续\n"
cout.flush();
cin.get();
voidAdd()//复数加法运算函数
user.nAdd++;
CComplexnum1,num2,sum,Zero(0,0);
加法计算\n"
最少输入两个复数,并且以0结束\n"
第一个复数:
num1;
第二个复数:
num2;
sum=num1+num2;
第三个复数:
inti=4;
while(!
(num1==Zero))
sum=sum+num1;
第"
个复数:
i++;
加法结果是:
sum<
voidSub()//复数减法预算函数
user.nSub++;
CComplexnum1,num2,sub,Zero(0,0);
最少输入两个复数,并且以0结束\n"
第1个复数:
第2个复数:
sub=num1-num2;
第3个复数:
sub=sub-num1;
减法结果是:
sub<
voidMul()//复数乘积函数
user.nMul++;
CComplexnum1,num2,mul,Zero(0,0);
乘法计算\n"
最少输入两个复数,并且以零结束\n"
mul=num1*num2;
mul*=num1;
乘法结果是:
mul<
voidAdd1()
user.nAdd++;
CComplexnum1;
++num1;
自加的结果为"
num1<
按任意键结束\n"
voidSub1()//复数自加运算函数
--num1;
自减的结果为"
voidcompare()//两复数比较函数
CComplexnum1,num2;
输入两个复数\n"
输入第二个复数\n"
if(num1==num2)
这两个复数相等\n"
elseif(num1>
num2)
的模大于"
num2<
的模\n"
elseif(num1<
这两个复数的模相等\n"
按任意键继续\n"
voiduserprint()//输出用户信息函数
user.szName<
使用的次数为:
user.nTime<
其中:
\t加法的次数:
user.nAdd<
\t减法的次数:
user.nSub<
\t乘法的次数:
user.nMul<
\t测试次数:
user.nTest<
\t平均成绩:
user.alAve<
voidLogin()//当前用户信息函数
请输入您的姓名:
cin.getline(szName,20);
ifstreaminfile;
Useruser1;
infile.open("
user.dat"
ios:
binary|ios:
in);
if(!
infile)
没有原始记录文件,您是第一个用户!
strcpy(user.szName,szName);
return;
infile.read((char*)&
user1,sizeof(User));
infile.eof())
if(strcmp(user1.szName,szName)==0)
user=user1;
user.nTime++;
欢迎您再次使用复数计算器!
userprint();
infile.close();
infile.read((char*)&
voidSaveFile()//用户资料保存函数
fstreamfile;
file.open("
in|ios:
out);
file)
文件打开错误,不能进行更新!
file.seekp(0,ios:
beg);
file.eof())
file.read((char*)&
if(strcmp(user1.szName,user.szName)==0)
file.seekp(-(sizeof(User)),ios:
cur);
file.write((char*)&
user,sizeof(User));
file.close();
fstreamoutfile;
outfile.open("
app);
outfile.write((char*)&
outfile.close();
usingnamespaceNameCComplex;
intmain(void)//主函数开始
srand(time(NULL));
//初始化随机数“种子”语句
Login();
//当前用户信息函数
charstrChoise[20];
//定义字符串名
do
system("
cls"
);
\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的按键(1-7)\n\n\n"
\t=========================MENU===========================\n"
\t1:
多复数加法,以0结束\n"
\t2:
多复数减法,以0结束\n"
\t3:
测试100以内的复数加减乘法运算,1次测试10道题\n"
\t4:
多复数乘法,以0结束\n"
\t5:
复数自加\n:
\t6:
复数自减\n:
\t7:
复数比较\n:
\t0:
退出程序\n\n:
\t请您选择:
strChoise;
if(strcmp(strChoise,"
1"
)==0)//用户选1则调用Add()函数
Add();
elseif(strcmp(strChoise,"
2"
)==0)//用户选2则调用Sub()函数
Sub();
3"
)==0)//用户选3则调用Test()函数
Test();
4"
)==0)//用户选4则调用Add()函数
Mul();
5"
)==0)//用户选5调用Add1()函数
Add1();
6"
)==0)//用户选6则调用Sub1()函数
Sub1();
7"
)==0)//用户选7则调用Compare()函数
compare();
0"
)==0)//用户选0则结束调用函数
\n\n\t欢迎下次继续使用复数计算器!
\n\n"
\n\t输入错误,请按任意键继续!
while((strcmp(strChoise,"
)));
SaveFile();
//调用用户资料保存函