7-36 复数四则运算 (15 分)

 |
总阅读量


  亲爱的您既然来看这道题的题解,那么您很有可能落入了一个题目的陷阱,在这里,我建议亲再仔仔细细的回去读一下题目呢,也好给自己留一个深刻的教训。

这是题链接

  • 注意到题面
    如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
    
    注意一个词,结果!也就是打印时,等号左边和右边不是一个规则:
  • 对于结果,实部或者虚部为0,则不输出;然而,对于算式也就是等式右边,实部或者虚部为0,则 还 是 需 要 进 行 输 出
  • 哈哈哈😆😆555😭😭~

    深刻的反思

    由于我过早的考虑代码复用,就把等式左右两边打印复数用了同一套规则,结果一时错,一时爽;一直错,一直爽…被折磨了两小时。
    一开始打印部分我是这样写的:
    void printExp(double a, double b, bool flag)
    {
      if(abs(a) < 0.05 && abs(b) < 0.05)
      {
          printf("0.0");
      }
      else
      {
          if(flag)
              printf("(");
          // 实部
          if(abs(a) >= 0.05)
          {
              printf("%.1lf", a);
          }
          // 虚部
          if(abs(b) >= 0.05)
          {
              // 虚部的 + 符号
              if(b > 0 && abs(a) >= 0.05)
                  printf("+");
              printf("%.1lfi", b);
          }
          if(flag)
              printf(")");
      }
    }
    void printExpTotal(double a1, double b1, double a2, double b2, char x)
    {
      printExp(a1, b1, 1);
      printf(" %c ", x);
      printExp(a2, b2, 1);
      printf(" = ");
    }
    
    后来我是这样写的:
    void printExp(double a, double b)
    {
      if(abs(a) < 0.05 && abs(b) < 0.05)
      {
          printf("0.0");
      }
      else
      {
          // 实部
          if(abs(a) >= 0.05)
          {
              printf("%.1lf", a);
          }
          // 虚部
          if(abs(b) >= 0.05)
          {
              // 虚部的 + 符号
              if(b > 0 && abs(a) >= 0.05)
                  printf("+");
              printf("%.1lfi", b);
          }
      }
    }
    void printExpTotal(double a1, double b1, double a2, double b2, char x)
    {
      printf("(%.1lf", a1);
      if(b1 >= 0)
          printf("+");
      printf("%.1lfi)", b1);
      printf(" %c ", x);
      printf("(%.1lf", a2);
      if(b2 >= 0)
          printf("+");
      printf("%.1lfi)", b2);
      printf(" = ");
    }
    
    果断捧回AC
    完整代码见我的Github
    过早优化是万恶之源,不看清、想清题目要求就想着优化则是万恶源之源

雪林于

抛砖引玉 亦或 他山之石,可以攻玉。