ep9_6.cpp
上传用户:wxcui2006
上传日期:2022-07-12
资源大小:1274k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. /*9.5  发挥你的想象力,重载复数的">>"运算符,对所有可能的错误都能要求重输。*/
  2. #include<iostream>
  3. using namespace std;
  4. class Complex{
  5. double Real,Image;
  6. public:
  7. Complex(double r=0.0, double i=0.0):Real(r),Image(i){};//定义构造函数
  8. //见【例5.7】,这里省略,以节约篇幅
  9. friend ostream&operator<<(ostream&s,const Complex&z);
  10. friend istream&operator>>(istream&s,Complex&a);
  11. };   //流类作为形式参数必须是引用
  12. ostream&operator<<(ostream&s,const Complex &z){
  13. return s<<'('<<z.Real<<','<<z.Image<<')';
  14. }
  15. istream&operator>>(istream&s,Complex &a){//格式为r;r,i;(r);(r,i);整个复数输完才可回车
  16. //容错强,如:sd(fr56cv,s79nml,45)i,78回车   可正确判读为(56,79)
  17. double re=0,im=0;
  18. char c=0;
  19. do{
  20. s>>c;
  21. }while(c!='('&&c!='.'&&!(c>='0'&&c<='9'));//读空括号或数字前的无用字符
  22. if(c=='('){
  23. do{
  24. s>>c;
  25. }while(c!='.'&&!(c>='0'&&c<='9'));//读空数字串前的无用字符
  26. s.putback(c);//返回一个字符到输入缓冲区
  27. s>>re;//实部
  28. do{
  29. s.get(c);//因为可能是回车
  30. }while(c!='n'&&c!=')'&&c!=',');//读空数字串后的无用字符
  31. if(c==','){
  32. do{//只读数字串
  33. s>>c;
  34. }while(c!='.'&&!(c>='0'&&c<='9'));
  35. s.putback(c);
  36. s>>im;//虚部
  37. do{
  38. s.get(c);//因为可能是回车
  39. }while(c!='n'&&c!=')');//读空数字串后的无用字符
  40. }
  41. else im=0;//无此步,第二次赋值出错
  42. if(c!=')')s.clear(ios::failbit);//漏了括号给一个操作失败标志
  43. }
  44. else{
  45. s.putback(c);//无括号,返回一个字符到输入缓冲区
  46. s>>re;//实部
  47. do{
  48. s.get(c);//因为可能是回车
  49. }while(c!='n'&&c!=',');//读空数字串后的无用字符
  50. if(c==','){
  51. do{//只读数字串
  52. s>>c;
  53. }while(c!='.'&&!(c>='0'&&c<='9'));
  54. s.putback(c);
  55. s>>im;//虚部
  56. do{
  57. s.get(c);//因为可能是回车
  58. }while(c!='n');//读空数字串后的无用字符
  59. }
  60. else im=0;//无此步,第二次赋值出错
  61. }
  62. if(s) a=Complex(re,im);
  63. return s;
  64. }
  65. int main(){
  66. Complex a,b,c,d;
  67. cout<<"输入一个实数"<<endl;
  68. cin>>a;
  69. cout<<"输入一个复数"<<endl;
  70. cin>>b;
  71. cout<<"输入一个用括号括起来的实数"<<endl;
  72. cin>>c;
  73. cout<<"输入一个用括号括起来复数"<<endl;
  74. cin>>d;
  75. cout<<"a="<<a<<'t'<<"b="<<b<<'t'<<"c="<<c<<'t'<<"d="<<d<<'n';
  76. return 0;
  77. }