简单实现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++程序设计有所帮助。

(0)

相关推荐

  • C++有限状态机实现计算器小程序

    本文介绍利用有限状态机原理开发计算器小程序的过程. 实现的功能 支持整数.小数输入 支持+ - * / 四则运算 CE 清除当前操作数 C 清除所有.回到初始状态 回显操作数和结果 HSM状态图 计算器可以分为七种状态:Start.Operand_1.Negate_1.Operator.Operand_2.Negate_2.Error.其中Start.Operand_1.Operand_1状态又分了几种子状态. 下面简要的介绍下状态状态转换的过程: 启动软件,进入Start状态 当用户点击1-9

  • c++编写简单的计算器程序

    首先来看下本人的开发环境 系统:win7 电脑:dell 运行环境:vs2015 语言:c++ 简单计算器代码 //四则运算 #include "stdafx.h" #include<iostream> #include<stdio.h> using namespace std; void add() { printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >>

  • C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入两个整数和一个运算符,输出运算结果. Input 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. Output 输出对两个数运算后的结果. Example Input 30 50 * Example Output import j

  • C/C++实现日期计算器的示例代码

    问题介绍: 今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了. 代码实现: #include<iostream> #include<Windows.h> #include<assert.h> u

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

    本文实例为大家分享了简单实现C++复数计算器的具体代码,供大家参考,具体内容如下 1.有关计算器的功能  A,实现多个复数(包括实数)的加减乘除,大小比较,   B.实现十进制实数的进制转换,可以转换任意进制 2.有关设计的原理  A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较  对于输入输出,(>>和<<),加减乘除运算进行重载.  输入的重载,实现a+bi形式的复数的输入.  输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的).  加减乘除的重载

  • php编程实现简单的网页版计算器功能示例

    本文实例讲述了php编程实现简单的网页版计算器功能.分享给大家供大家参考,具体如下: 如何通过php代码来实现一个网页版的计算器的简单功能?下面就是通过php基础知识来做的网页版计算器,功能只有"加减剩除求余",其他的一些计算功能可扩展. 实现简单计算器的具体php代码如下(这是php文件jsq.php的全部代码): <html> <head> <title>这是一个网页版的简单计算器</title> <meta http-equi

  • JS实现简单的二元方程计算器功能示例

    本文实例讲述了JS实现简单的二元方程计算器功能.分享给大家供大家参考,具体如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>二元方程</TITLE> <META NAME="Author" CONTENT=""> <META NAME="

  • Java Swing实现简单的体重指数(BMI)计算器功能示例

    本文实例讲述了Java Swing实现简单的体重指数(BMI)计算器功能.分享给大家供大家参考,具体如下: BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个简单的BMI计算器.虽然现在网页上也有相应的网页应用,但是能够做出这个计算器来,还是有点成就感的,希望自己以后做出更多比这个好的应用. 最终运行效果: 功能:可以选择三个标准:中国.亚洲.WH

  • C++实现小型复数计算器

    小型复数计算器项目设计,供大家参考,具体内容如下 一.问题描述及功能要求 1.实现复数的设置和显示. 2.声明一个复数类Complex,重载运算符 "+". "-". "*". "/",使之能用于复数的加.减.乘.除,运算符重载函数作为Complex类的成员函数. 3.声明一个复数类Complex,重载运算符 "+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序

  • Swift实现复数计算器

    本文实例为大家分享了Swift实现复数计算器的具体代码,供大家参考,具体内容如下 Swift使用笛卡尔和极坐标进行转换的复数计算器 import Foundation struct Complex{     //实部real     public var real : Double = 0     //虚部img     public var img : Double = 0     public var polar :(mod:Double,arg:Double) = (0,0)     pu

  • 利用Python实现一个简单的Web汇率计算器

    目录 Dash是什么 网页搭建步骤 安装相关依赖(库) 导入相关包 构建app 构建结果输出函数 网页结构Layout搭建 callback回调参数设定 界面效果 前段时间刚接触到前端网页开发,但是对于刚入门的小白而言,像flask.Django等这类稍大型的框架确实不太适合,今天这个Dash是集众家之长于一体的轻量化Web开发库. Dash是什么 Dash 是一个用于构建基于 Web 的应用程序的 Python 库,无需 JavaScript . Dash 同时也是用于创建分析 Web 应用程

  • Java对象简单实用案例之计算器实现代码

    对 Java中的对象与属性,方法的使用,简单写了个案例 import java.util.Scanner; class Calculste { int a; //定义两个整数 int b; String option; //定义接收操作符的字符串 public void count(){ //对操作符进行判断 switch(option){ case "+": System.out.println("计算和:"+a+"+"+b+"=&q

  • C++实现的求解多元一次方程示例

    本文实例讲述了C++实现的求解多元一次方程.分享给大家供大家参考,具体如下: 注:这里计算的是n*n的等距矩阵,代码如下: #include<iostream> #include<math.h> #include<fstream> #include<stdlib.h> using namespace std; void print(double (*pArray)[4], int iWidth,int iHigh); void main(){ int n,m

  • 使用简单工厂模式来进行Python的设计模式编程

    计模式的目的是让代码易维护.易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的. 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式.这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例. 下面是一个简单的工厂实例: def create_animal(name): if name == 'dog': return Dog() elif name == 'cat': return Cat() animal = create_animal('dog

随机推荐