简单实现C++复数计算器

本文实例为大家分享了简单实现C++复数计算器的具体代码,供大家参考,具体内容如下

1.有关计算器的功能 

A,实现多个复数(包括实数)的加减乘除,大小比较, 

B.实现十进制实数的进制转换,可以转换任意进制 

2.有关设计的原理

A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较

对于输入输出,(>>和<<),加减乘除运算进行重载。

输入的重载,实现a+bi形式的复数的输入。

输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的)。

加减乘除的重载,实现有关复数的运算。

B.进制转换的部分,采用进制转换的方法,实现10进制的任意进制转换。辗转相除,记录每次的余数,存储在数组中来记录转换得到的数字 

3.有关设计的特点

A.采用函数对所实现功能进行封装。

B.采用运算符的重载,使复数运算更加方便

C.考虑所有的输入输出情况,对选择的操作,输入复数的类型等进行判断与相应的处理

D.程序在完成以后,接受大家建议,规范代码格式,自己在制作过程有所收获也有所学习。

下面是有关代码的实现:

#include <iostream>

#include <algorithm>

#include <cmath>

#include <cstdlib>

#include <cstring>

#include <fstream>

#include <ctime>

#define EPS 1e-5 //定义精度常数

using namespace std; //使用标准空间命名std

namespace NameCCom //定义命名空间NameCCom

{

class CCom //定义一个CCom类

{

public:

double Real,Image;//实部和虚部

CCom(double real=0,double image=0) //构造函数

{

Real=real;

Image=image;

}

friend istream & operator>>(istream &is,CCom &com); //重载输入

friend ostream & operator<<(ostream &os,CCom &com); //重载输出

CCom operator+(CCom &com); //加法重载

CCom operator-(CCom &com); //减法重载

CCom operator*(CCom &com); //乘法重载

CCom operator/(CCom &com); //除法重载

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

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

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

CCom operator/=(CCom &com); //除法赋值重载

};

struct User //定义用户结构体类型

{

char szName[20]; //用户名

}user; //定义全局变量

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

{

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

return 1; //若大,则返回1

else

return 0; //否则,则返回0

}

int CCom::operator<(CCom &com) //重载运算符"<",比较模的大小

{

if(mod()<com.mod())

return 1; //若小,则返回1

else

return 0; //否则,则返回0

}

int CCom::operator!=(CCom &com) //重载运算符"!=",分别判断复数的实部和虚部

{

if(*this==com)

return 0; //若相等,则返回0

else

return 1; //否则,则返回1

}

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

{

cout<<"请输入复数:";

char s[80];

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

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

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

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; //sign是符号位,且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;

}

return is;

}

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

{

if(fabs(com.Image)<EPS) // 如果虚部为0

os<<com.Real; //只输出实部

else if((fabs(com.Real)<EPS)) //如果实部为0

os<<com.Image<<"i"; //只输出虚部

else if(com.Image>0)

os<<com.Real<<"+"<<com.Image<<"i";

else

os<<com.Real<<com.Image<<"i"; //虚部为正

return os;

}

CCom CCom::operator+(CCom &com) //加法重载

{

CCom sum;

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

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

return sum;

}

CCom CCom::operator-(CCom &com) //减法重载

{

CCom sub;

sub.Real=Real-com.Real; //实部相减

sub.Image=Image-com.Image; //虚部相减

return sub;

}

CCom CCom::operator*(CCom &com) //乘法重载

{

CCom multi;

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

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

return multi;

}

CCom CCom::operator/(CCom &com) //除法重载

{

CCom div;

div.Real=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image); //实部除积

div.Image=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image); //虚部除积

return div;

}

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

{

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

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

return *this;

}

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

{

Real=Real-com.Real; //实部相减

Image=Image-com.Image; //虚部相减

return *this;

}

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

{

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

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

Real=nReal;

Image=nImage;

return *this;

}

CCom CCom::operator/=(CCom &com) //重载除法赋值

{

double nReal=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image); //实部除积

double nImage=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image); //虚部除积

Real=nReal;

Image=nImage;

return *this;

}

int CCom::operator==(CCom &com) //重载等于

{

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

return 1;

else

return 0;

}

void Add() //复数加法运算函数

{

CCom num1,num2,sum,Zero(0,0);

cout<<"加法计算\n"<<"最少输入两个复数,并且以0结束\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";

cin.get();

cin.get();

}

void Sub() //复数减法运算函数

{

CCom num1,num2,sub,Zero(0,0);

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

cout<<"第1个复数:";

cin>>num1;

cout<<"第2个复数:";

cin>>num2;

sub=num1-num2;

cout<<"第3个复数:";

cin>>num1;

int i=4;

while(!(num1==Zero))

{

sub=sub-num1;

cout<<"第"<<i<<"个复数:";

cin>>num1;

i++;

}

cout<<"减法结果是:"<<sub<<endl;

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

cin.get();

cin.get();

}

void Mul() //复数乘法运算函数

{

CCom num1,num2,mul,Zero(0,0);

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

cout<<"第一个复数:";

cin>>num1;

cout<<"第二个复数:";

cin>>num2;

mul=num1*num2;

cout<<"第三个复数:";

cin>>num1;

int i=4;

while(!(num1==Zero))

{

mul*=num1;

cout<<"第"<<i<<"个复数:";

cin>>num1;

i++;

}

cout<<"乘法结果是:"<<mul<<endl;

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

cin.get();

cin.get();

}

void Div() //复数除法运算函数

{

CCom num1,num2,div,Zero(0,0);

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

cout<<"第一个复数:";

cin>>num1;

cout<<"第二个复数:";

cin>>num2;

div=num1/num2;

cout<<"第三个复数:";

cin>>num1;

int i=4;

while(!(num1==Zero))

{

div/=num1;

cout<<"第"<<i<<"个复数:";

cin>>num1;

i++;

}

cout<<"除法结果是:"<<div<<endl;

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

cin.get();

cin.get();

}

void Compare() //两复数比较函数

{

CCom num1,num2;

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

cout<<"第一个复数:";

cin>>num1;

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

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 Jinzhi() //实现进制转换

{

long n;

int p,c,m=0,s[100];

cout<<"输入要转换的数字:\n";

cin>>n;

cout<<"输入要转换的进制:\n";

cin>>p;

cout<<"("<<n<<")10="<<"(";

while (n!=0)//数制转换,结果存入数组s[m]

{

c=n%p;

n=n/p;

m++;s[m]=c; //将余数按顺序存入数组s[m]中

}

for(int k=m;k>=1;k--)//输出转换后的序列

{

if(s[k]>=10) //若为十六进制等则输出相对应的字母

cout<<(char)(s[k]+55);

else //否则直接输出数字

cout<<s[k];

}

cout<<")"<<p<<endl;

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

cin.get();

cin.get();

}

void outpt()

{

char szName[20];

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

cin>>szName;

system("cls");

do

{

system("cls");

cout<<"\t这是一个计算器,可实现以下功能,请按对应的按键(0-6)\n\n\n";

cout<<"\t*----------Hpioneer小计算器菜单---------*\n";

cout<<"\t| 1:多个复数加法,以0结束 |\n";

cout<<"\t| 2:多个复数减法,以0结束 |\n";

cout<<"\t| 3:多个复数乘法,以0结束 |\n";

cout<<"\t| 4:多个复数除法,以0结束 |\n";

cout<<"\t| 5:复数比较 |\n";

cout<<"\t| 6:进制转换 |\n";

cout<<"\t| 0:退出程序 |\n";

cout<<"\t| 请您选择: |\n";

cout<<"\t*---------------------------------------*\n";

}

}

using namespace NameCCom;

int main(void) //主函数开始,void可以不写

{

int h;

output();

cin>>h;//每步操作

if(h==1) //用户选1则调用Add()函数

Add();

else if(h==2) //用户选2则调用Sub()函数

Sub();

else if(h==3) //用户选3则调用Mul()函数

Mul();

else if(h==4) //用户选4则调用Di

v()函数

Div();

else if(h==5) //用户选6则调用Compare()函数

Compare();

else if(h==6) //用户选7则调用函数Jinzhi()函数

Jinzhi();

else if(h==0)

cout<<"非常感谢您的使用\n";

else

break;

}

return 0;

}

以上是 简单实现C++复数计算器 的全部内容, 来源链接: utcz.com/z/354135.html

回到顶部