C课程设计复数计算器.docx

上传人:b****3 文档编号:10245434 上传时间:2023-05-24 格式:DOCX 页数:23 大小:19.71KB
下载 相关 举报
C课程设计复数计算器.docx_第1页
第1页 / 共23页
C课程设计复数计算器.docx_第2页
第2页 / 共23页
C课程设计复数计算器.docx_第3页
第3页 / 共23页
C课程设计复数计算器.docx_第4页
第4页 / 共23页
C课程设计复数计算器.docx_第5页
第5页 / 共23页
C课程设计复数计算器.docx_第6页
第6页 / 共23页
C课程设计复数计算器.docx_第7页
第7页 / 共23页
C课程设计复数计算器.docx_第8页
第8页 / 共23页
C课程设计复数计算器.docx_第9页
第9页 / 共23页
C课程设计复数计算器.docx_第10页
第10页 / 共23页
C课程设计复数计算器.docx_第11页
第11页 / 共23页
C课程设计复数计算器.docx_第12页
第12页 / 共23页
C课程设计复数计算器.docx_第13页
第13页 / 共23页
C课程设计复数计算器.docx_第14页
第14页 / 共23页
C课程设计复数计算器.docx_第15页
第15页 / 共23页
C课程设计复数计算器.docx_第16页
第16页 / 共23页
C课程设计复数计算器.docx_第17页
第17页 / 共23页
C课程设计复数计算器.docx_第18页
第18页 / 共23页
C课程设计复数计算器.docx_第19页
第19页 / 共23页
C课程设计复数计算器.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C课程设计复数计算器.docx

《C课程设计复数计算器.docx》由会员分享,可在线阅读,更多相关《C课程设计复数计算器.docx(23页珍藏版)》请在冰点文库上搜索。

C课程设计复数计算器.docx

C课程设计复数计算器

C++课程设计实验报告

姓名学号班级

合作者学号班级

任课教师时间

教师指定题目复数计算器评定难易级别A级

实验报告成绩

复数计算器

程序功能设计

1.

2.程序功能的总体结构

复数计算器的程序总体功能可设计成如图1所示,可以看出,复数计算器的各种功能都用菜单选项列出,用户可以根据需要选择相应的菜单项,从而执行不同的子程序以完成相应的功能。

2.课程设计要求

(1)

(2)一开始运行程序,要有详细的菜单选项界面,用户不选择退出就可以反复运算。

(3)

(4)可以进行多个操作数的复数运算,输入0+0*i时为止。

(5)

(6)编写可以对输入的复数求模的成员函数。

(7)

(8)编写具有测试功能的函数,即计算机能够自动出题,并要求用户计算,同时计算机判断用户计算的对错并打分,要求十题为一个单元,每题一个运算符,运算符包括+,-,*三种,参与加减运算实部虚部为一位数。

(9)

(10)重载输入输出运算符,对复数的输入既可采用实部虚部分开提示输入,也可直接输入诸如a+i*b或a+ib这种形式,对复数的输出要考虑实部虚部的正负号,通过判断给出的输出结果。

开始

输出菜单及提示信息

输入选择

是否做加法

N

是否做减法

N

Y

是否进行测试

N

加法子程序Add()

Y

......……

减法子程序

Y

测试子程序

是否退出

N

Y

结束

3.

4.程序设计思想

1)类的封装

程序中将复数形式的数据定义成一个复数类CComplex,重载了加法及减法等运算符,使函数的加减等运算像一般数据一样方便.每个运算符重载都用一个函数去实现。

参考类的定义如下:

classCComplex{

private:

doubleReal,Image;

public:

CComplex(doublereal=0,doubleimage=0)–i.I等形式。

重载输入运算符应该能识别这样形式多样的复数。

所以在重载输入函数时要综合考虑上述各种输入形式。

可行的处理方式是:

在重载输入函数中,设计用

(3)设计的任务要求2

在程序中设计一个复数运算的测试函数Test(),其功能是让计算机随机出10道运算题,用户给出答案,同时计算机实时判断对错并可以打分。

这个函数的关键是让计算机随机产生复数对象和运算符,计算机内部有一个随机数发生器,可以产生一个固定顺序的整型随机数序列,调用语句为“inta=rand();”这时,a就是该随机数发生器产生的随机数。

由于产生的随机书数在整数范围内,为测试方便,按程序设计要求,产生的随机复数对象实部和虚部在100以内,运算符只有加减两种。

因此,需要对产生的随机数进行进一步的处理,用随机数模除以除以100,产生出100以内的随机整数;同样,用随机数模除以3,可以产生出0、1、3三个随机数据,定义0为加法,1为减法,2为乘法,这样就可以产生出随机的复数对象的加减乘运算了。

可以参见图2测试子程序Test()结构框图。

设置循环次数为10

用两个随机数

初始复数对象3

产生8个100以内的随机数

随机数

最后两个随机数

初始复数对象4

前两个随机数

初始复数对象1

用户输入结果

两对象相乘

后两个随机数

初始复数对象2

结果是否正确

产生2以内的随机数op

N

Y

总分加10

Op为0

两对象相减

两对象相加

用户输入结果

用户输入结果

结果是否正确

结果是否正确

NN

输出出错信息

输出出错信息

输出出错信息

YY

总分加10

总分加10

输出总分

结束

(4)设计的任务要求3

在程序中重载了>>运算符,其功能是让用户能够直接输入a+bi,a+b*i两种形式的复数,其结构框图如图3所示。

以字符串的形式接受复数对象

求字符串长度

初试化当前数值n=0,字符变量sign=1

字符串是否存在非法字符

Y

输出错误信息,函数返回

是否判别完字符串中所有字符

N

Y

最后一个字符不是‘i’且n!

=0

当前字符为+、-号,同时n!

=0

N

复数对象只有实部,前面取出的数值赋给实部

N

前面取出的数值赋给实部,n=0

N

结束

当前字符是否是‘+’

N

Sign=1,k++

当前字符是否是‘-’

N

Sign=-1,k++

当前字符是否是为‘i’

‘i’是否是最后一个字符

N

YY

N

输出错误信息,函数返回

当前字符是否是数字字符

N

N

将字符转变为数值

N

Y

5.

6.程序界面

开始界面

运行结果界面

4.程序源代码及详细注解:

#include<>

#include<>

#include<>

#include<>

#defineZ1e-6

classCComplex{

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);//除法重载

intoperator==(CComplex&com);

intoperator!

=(CComplex&com);

intoperator>(CComplex&com);

intoperator<(CComplex&com);

floatModule(void);//复数求模

};

CComplexCComplex:

:

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

{

CComplext;//定义类对象

=Real+;//实部相加

=Image+;//虚部相加

returnt;

}

CComplexCComplex:

:

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

{

CComplext;//定义类对象

=;//实部相减

=;//虚部相减

returnt;

}

CComplexCComplex:

:

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

{

CComplext;//定义类对象

=Real*//乘法实部

=Real*+Image*;//乘法虚部

returnt;

}

CComplexCComplex:

:

operator/(CComplex&com)//除法重载

{

CComplext;//定义类对象

=(Real*+Image*/*+*;//除法实部

=(Image**/*+*;//除法虚部

returnt;

}

/*intCComplex:

:

operator!

=(CComplex&com)//重载“!

=”运算符,分别判断复数的实部与虚部

{

if(*this==com)

return0;

else

return1;

}*/

intCComplex:

:

operator>(CComplex&com)//重载“>”运算符,比较复数的模

{

if(Module()>())

return1;//大于,则返回1

else

return0;

}

intCComplex:

:

operator<(CComplex&com)//重载“<”运算符,比较复数的模

{

if(Module()<())

return1;//小于,则返回1

else

return0;

}

floatCComplex:

:

Module()

{

floatt;

t=sqrt(Real*Real+Image*Image);

returnt;

//();

//();

}

intCComplex:

:

operator==(CComplex&com)//重载“==”运算符,分别判断两个复数对象的实部与虚部

{

if(Real==&&Image==

return1;//实部与虚部分别相等返回1

elsereturn0;

}

voidAdd(){

CComplexa1,a2,sum,f(0,0);

cout<<"加法计算"<

cout<<"第一个复数"<

cin>>a1;

cout<<"第二个复数"<

cin>>a2;

sum=a1+a2;

cout<<"第三个复数"<

cin>>a1;

inti=4;

while(!

(a1==f)){

sum=sum+a1;

cout<<"第"<

cin>>a1;

i++;

}

cout<<"结果"<

cout<<"按任意键继续"<

//();

();

}

voidSub(){

CComplexa1,a2,sub,f(0,0);

cout<<"减法计算"<

cout<<"第一个复数"<

cin>>a1;

cout<<"第二个复数"<

cin>>a2;

sub=a1-a2;

cout<<"第三个复数"<

cin>>a1;

inti=4;

while(!

(a1==f)){

sub=sub-a1;

cout<<"第"<

cin>>a1;

i++;

}

cout<<"结果:

"<

cout<<"按任意键继续"<

//();

();

}

voidMul(){

CComplexa1,a2,mul,f(0,0);

cout<<"乘法计算"<

cout<<"第一个复数"<

cin>>a1;

cout<<"第二个复数"<

cin>>a2;

mul=a1*a2;

cout<<"第三个复数"<

cin>>a1;

inti=4;

while(!

(a1==f)){

mul=mul*a1;

cout<<"第"<

cin>>a1;

i++;

}

cout<<"结果:

"<

cout<<"按任意键继续"<

//();

();

}

voidDiv(){

CComplexa1,a2,div,f(0,0);

cout<<"除法计算"<

cout<<"第一个复数"<

cin>>a1;

cout<<"第二个复数"<

cin>>a2;

div=a1/a2;

cout<<"第三个复数"<

cin>>a1;

inti=4;

while(!

(a1==f)){

div=div/a1;

cout<<"第"<

cin>>a1;

i++;

}

cout<<"结果:

"<

cout<<"按任意键继续"<

//();

();

}

voidCompare(void)

{

cout<<"复数模比较"<

CComplexa1,a2;

cout<<"输入两个复数:

"<

cout<<"第一个复数:

";

cin>>a1;

cout<<"第二个复数";

cin>>a2;

if(a1==a2)

cout<<"这两个复数相等"<

elseif(a1>a2)

cout<

elseif(a1

cout<

cout<<"按任意键继续"<

();

}

istream&operator>>(istream&is,CComplex&com){//重载输入,可以输入a+bi,也可以输入a+b*i

chars[100];

is>>s;//字符串s用于接收复数

intlen=strlen(s);

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

==0;

if(len==4)

{

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]=='+'))//判断是否为符号位

{

=sign*n;//是符号,且n!

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

n=0;//将sign*n的值赋给实部,然后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

=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,表示复数只有实部,没有虚部

=n*sign;

returnis;

}

else

{

for(intk=0;k

{

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

='+'&&s[k]!

='-'&&s[k]!

='i'&&s[k]!

='*'))

//若字符串不是1~9的数字或“+”、“-”、“=”、“*”则错误,输出Error

{

cout<<"Error"<

returnis;

}

}

for(k=0;k

{

if(n!

=0&&(s[k]=='-'||s[k]=='+'))//判断是否为符号位

{

=sign*n;

n=0;

}

if(s[k]=='-')

{

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

}

if(s[k]=='+')

{

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

}

if(s[k]=='*')//若当前字符为*

{

k++;

=sign*n;

}

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

{

if(k!

=len-1)//判断i是否为最后一个字符

cout<<"error\n";//若不是,则复数输入格式错误

//else

//=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,表示复数只有实部,没有虚部

=n*sign;

returnis;

}

}

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

{

if(fabs

os<<;//只输出实部;

elseif((fabs

os<<<<"i";//只输出虚部

elseif>0)

os<<<<"+"<<<<"i";//虚部为正,用“+”连接实部与虚部

else

os<<<<<<"i";//虚部为负,虚部的符号连接实部与虚部

returnos;

}

voidTest(void)

{

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

CComplexanswer,f5;

intscore=0;

charop;

for(inti=1;i<=10;i++){

real1=rand()%200-100;//产生随机的两位数,可正可负

image1=rand()%200-100;

real2=rand()%200-100;

image2=rand()%200-100;

CComplexf1(real1,image1),f2(real2,image2);

//用随机产生的两位数初始化类对象

real3=rand()%20-10;

//产生随机的一位数

image3=rand()%20-10;

real4=rand()%20-10;

image4=rand()%20-10;

CComplexf3(real3,image3),f4(real4,image4);

//用随机产生的一位数初始化类对象

op=rand()%3;//随即产生3种运算符

cout<<"第"<

";

switch(op){

case0:

answer=f1+f2;

cout<

break;

case1:

answer=f1-f2;

cout<

break;

case2:

//乘法用实部、虚部都是一位的对象

answer=f1*f2;

cout<

break;

}

cin>>f5;

if(answer==f5){//判断结果是否正确

cout<<"此题做对了"<<'\n';

cout<<"加十分:

"<<'\n';

score+=10;}//正确,加十分

else

{

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

cout<<"不得分:

"<<'\n';//错误,不得分

}

}

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

"<

}

voidmain(void)//输出程序主菜单,并接收用户选择

{

charinput;

CComplexa,b,c,d,e,f,g;

system("cls");

cout<<"\t这是一个复数计算器程序,拥有以下功能,请按照菜单选择进入功能。

"<

cout<<"=================================MENU======================================"<

cout<<"1:

复数求模"<

cout<<"2:

多复数连加运算"<

cout<<"3:

多复数连减运算"<

cout<<"4:

多复数连乘运算"<

cout<<"5:

多复数连除运算"<

cout<<"6:

进入复数计算测试(一次十题)"<

cout<<"7:

复数比较:

"<

cout<<"8:

退出"<

cout<<"请选择"<

do

{

cin>>input;//接受用户选择

cout<<"";

cout<<"==============================================================================="<

switch(input)//用switch-case实现功能的多项选择

{

case'1':

{

cout<<"复数求模"<

cout<<"请输入一个复数:

";

cin>>a;

cout<<()<

break;

}

case'2':

{

Add();

break;

}

case'3':

{

Sub();

break;

}

case'4':

{

Mul();

break;

}

case'5':

{

Div();

break;

}

case'6':

Test();

break;

case'7':

Compare();

break;

case'8':

exit(-1);

break;

default:

{

cout<<"Badinput"<<"输入错误,请按任意键后重新输入"<

break;

}

}

}while(input!

=8);//若不输入8,则可以不退出一直使用复数计算器

}

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

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2