c++简单复数计算器
来源:互联网 发布:雅思知乎 编辑:程序博客网 时间:2024/05/18 00:55
1.有关计算器的功能
A,实现多个复数(包括实数)的加减乘除,大小比较,
B.实现十进制实数的进制转换,可以转换任意进制
2.有关设计的原理
A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较
对于输入输出,(>>和<<),加减乘除运算进行重载。
输入的重载,实现a+bi形式的复数的输入。
输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的)。
加减乘除的重载,实现有关复数的运算。
B.进制转换的部分,采用进制转换的方法,实现10进制的任意进制转换。辗转相除,记录每次的余数,存储在数组中来记录转换得到的数字
3.有关设计的特点
A.采用函数对所实现功能进行封装。
B.采用运算符的重载,使复数运算更加方便
C.考虑所有的输入输出情况,对选择的操作,输入复数的类型等进行判断与相应的处理
D.程序在完成以后,我发了自己的博客,之后在博客上接受大家建议,规范代码格式,自己在制作过程有所收获也有所学习。
1,登录界面:
2,实现界面:
#include <iostream>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>#include <fstream>#include <ctime>#define EPS 1e-5 //定义精度常数using namespace std; //使用标准空间命名stdnamespace 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();}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();}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();}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();}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();}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();}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() //主函数{ 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则调用Div()函数 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;}
0 0
- c++简单复数计算器
- 复数计算器
- 简单计算器实现(C++)
- c-简单的计算器
- 复数计算器支持加减乘除
- ANTLR实现简单计算器[C#]
- 《简单计算器实现(c#)》
- c 语言简单计算器源码
- 简单计算器(objective-c)
- c/c++实现简单计算器
- C语言之简单计算器
- 用C语言设计一个简单计算器
- 一个简单的计算器程序(C++)
- C写的简单文本计算器
- 一个简单的计算器(C语言)
- 一个简单计算器的c程序
- C语言实现一个简单的计算器
- c写的一个简单的计算器
- rest ( 大白话 )
- poj 1862 Stripies简单贪心
- Lowest Common Ancestor of a Binary Tree
- 《Windows via C/C++》 学习笔记
- Autocompletetextview with custom adapter and filter(Autocompletetextview 用户自定义下拉框样式)
- c++简单复数计算器
- 基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之三:hibernate4泛型dao的应用
- java异常处理二——try-catch-finally执行顺序
- junit测试管理类:junit test suite
- 268. Missing Number
- [leetcode] 【栈】 84. Largest Rectangle in Histogram
- AndroidManifest.xml文件解析
- 简单的css实现二级导航(无插件、几十行代码)
- IOS从网络下载图片