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

所属分类: 软件编程 / C 语言 阅读数: 93
收藏 0 赞 0 分享

本文实例为大家分享了简单实现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++程序设计有所帮助。

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多