本人没有学过C#,但有一段C#程序需要测试,修改和优化.这里面有很多错误和需要完善的地方. 不知道哪位高手,可以先帮我描述一下这个程序里面主要有些什么功能,每个功能是做什么用的,然后指出里面的错误并修改错误. 最好能把它改成OO design的形式.  我会十分的感谢.using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace prognamespace {
  public class Prog {    private string[] ds;
    private int k;
    private string[] os;
    private int l;
    private string ps = "=+-*/";    public Prog() {
      ds = new string[99];
      k = -1;
      os = new string[99];
      l = -1;
    }    private int io(string s, char c) {
      for (int i = 0, n = s.Length; i < n; i++) {
        if (c.Equals(s[i])) {
          return i;
        }
      }
      return -1;
    }    public string M(string[] ars) {
      string r = "init"; ;
      int i;
      for (i = 0; i < ars.Length && ars[i] != null; i++) {
        if (ars[i].Length == 1) {
          char arg = ars[i][0];
          int j = io(ps, arg);
          if (j >= 0) {
            if (l >= 0 &&
                j <= io(ps, os[l][0])) {
              string so = os[l--];
              A(so);
            }
            l = l + 1;
            if (l < 99) {
              os[l] = ars[i];
            }
            else {
              return "";
            }
          }
          else {
            k = k + 1;
            if (k < 99) {
              ds[k] = ars[i];
            }
            else {
              return "";
            }
          }
        }
        else { 
          k = k + 1;
          if (k < 99) {
            ds[k] = ars[i];
          }
          else {
            return "";
          }
        }
      }
      for (i = l; i >= 0; i--) {
        r = A(os[i]);
        if (r.Equals("")) {
          break;
        }
      }
      if (!r.Equals("")) {
        r = ds[0];
      }
      return r;
    }    private string A(string p) {
      string r;
      int i = io(ps, p[0]);
      string x, y;
      switch (i) {
        case 1:
          if (k >= 0) {
            x = ds[k];
            k--;
            if (k >= 0) {
              y = ds[k];
              r = (Double.Parse(x) + Double.Parse(y)).ToString("g");
              ds[k] = r;
            }
            else {
              r = "";
            }
          }
          else {
            r = "";
          }
          break;
        case 2:
          if (k >= 0) {
            x = ds[k];
            k--;
            if (k >= 0) {
              y = ds[k];
              r = (Double.Parse(y) - Double.Parse(x)).ToString("g");
              ds[k] = r;
            }
            else {
              r = "";
            }
          }
          else {
            r = "";
          }
          break;
        case 3:
          if (k >= 0) {
            x = ds[k];
            k--;
            if (k >= 0) {
              y = ds[k];
              r = (Double.Parse(x) * Double.Parse(y)).ToString("g");
              ds[k] = r;
            }
            else {
              r = "";
            }
          }
          else {
            r = "";
          }
          break;
        case 4:
          if (k >= 0) {
            x = ds[k];
            k--;
            if (k >= 0) {
              y = ds[k];
              r = (Double.Parse(y) / Double.Parse(x)).ToString("g");
              ds[k] = r;
            }
            else {
              r = "";
            }
          }
          else {
            r = "";
          }
          break;
        case 0:
          if (k >= 0) {
            x = ds[k];
            k--;
            if (k >= 0) {
              y = ds[k];
              double diff = Double.Parse(x) - Double.Parse(y);
              if (diff < 0.0) {
                diff = -diff;
              }
              if (diff > Double.Epsilon) {
                r = "false";
              }
              else {
                r = "true";
              }
              ds[k] = r;
            }
            else {
              r = "";
            }
          }
          else {
            r = "";
          }
          break;
        default:
          r = "";
          break;
      }
      return r;
    }
  }
}

解决方案 »

  1.   

    另外这段代码和是不是C#写的没有太大关系,我相信lz如果有点编程基础的话应该能搞懂。
      

  2.   


          //返回字符C在字符串S中的位置,如果没有在S中,则返回-1
          private int io(string s, char c) { 
          for (int i = 0, n = s.Length; i < n; i++) { 
            if (c.Equals(s[i])) { 
              return i; 
            } 
          } 
          return -1; 
        } 
      

  3.   


          //将计算字符串表达式
          private string A(string p) { 
          string r; 
          int i = io(ps, p[0]);  //private string ps = "=+-*/"; 
          string x, y; 
          switch (i) { 
            case 1:   //p[0] = "+" ,字符串p以"+"开头
              if (k >= 0) { 
                x = ds[k];  //将ds末位和倒数第2位相加,结果放在倒数第2位里
                k--; 
                if (k >= 0) { 
                  y = ds[k]; 
                  r = (Double.Parse(x) + Double.Parse(y)).ToString("g");  //结果转换位10进制 
                  ds[k] = r; 
                } 
                else { 
                  r = ""; 
                } 
              } 
              else { 
                r = ""; 
              } 
              break; 
            case 2: //p[0] = "-" ,字符串p以"-"开头
              if (k >= 0) { 
                x = ds[k]; //将ds的倒数第2位减去末位,结果放在倒数第2位里
                k--; 
                if (k >= 0) { 
                  y = ds[k]; 
                  r = (Double.Parse(y) - Double.Parse(x)).ToString("g"); 
                  ds[k] = r; 
                } 
                else { 
                  r = ""; 
                } 
              } 
              else { 
                r = ""; 
              } 
              break; 
            case 3: //p[0] = "*" ,字符串p以"*"开头
              if (k >= 0) { 
                x = ds[k]; //将ds的倒数第2位乘末位,结果放在倒数第2位里
                k--; 
                if (k >= 0) { 
                  y = ds[k]; 
                  r = (Double.Parse(x) * Double.Parse(y)).ToString("g"); 
                  ds[k] = r; 
                } 
                else { 
                  r = ""; 
                } 
              } 
              else { 
                r = ""; 
              } 
              break; 
            case 4: //p[0] = "/" ,字符串p以"/"开头
              if (k >= 0) { 
                x = ds[k]; //将ds的倒数第2位除末位,结果放在倒数第2位里
                k--; 
                if (k >= 0) { 
                  y = ds[k]; 
                  r = (Double.Parse(y) / Double.Parse(x)).ToString("g"); 
                  ds[k] = r; 
                } 
                else { 
                  r = ""; 
                } 
              } 
              else { 
                r = ""; 
              } 
              break; 
            case 0: //p[0] = "=" ,字符串p以"="开头
              if (k >= 0) { 
                x = ds[k]; //这里应该是
                k--; 
                if (k >= 0) { 
                  y = ds[k]; 
                  double diff = Double.Parse(x) - Double.Parse(y); //取末两位的差的绝对值
                  if (diff < 0.0) { 
                    diff = -diff; 
                  } 
                  if (diff > Double.Epsilon) { 
                    r = "false";  //绝对值不为0
                  } 
                  else { 
                    r = "true";  //绝对值为0
                  } 
                  ds[k] = r; 
                } 
                else { 
                  r = ""; 
                } 
              } 
              else { 
                r = ""; 
              } 
              break; 
            default: 
              r = ""; 
              break; 
          } 
          return r; 
        } 
      } 
    }
          
      

  4.   


          //计算串ars的表达式函数,这里好像没有判断+-*/的优先级别,只是从右到左的判断。
          public string M(string[] ars) { 
          string r = "init";  //初始化串r的值为"init"
          int i; 
          for (i = 0; i < ars.Length && ars[i] != null; i++) { 
            if (ars[i].Length == 1) { 
              char arg = ars[i][0];    //这里觉得有点奇怪ars不会出错?
              int j = io(ps, arg); 
              if (j >= 0) {   //ars的i位为操作符号:+-*/=
                if (l >= 0 &&   //出现表达式的条件(这里的条件时操作符的位置不时末位成立)
                    j <= io(ps, os[l][0])) {  //这里觉得有点奇怪os不会出错?
                  string so = os[l--]; 
                  A(so);  //出现操作符时,计算值到r中
                } 
                l = l + 1; 
                if (l < 99) { 
                  os[l] = ars[i];  //存储表达式
                } 
                else { 
                  return ""; 
                } 
              } 
              else {  //如果ars[i]位非操作符号,则将ars[i]放入ds中,k+1 
                      //k最初是为-1的,所以这里k为ds中末位的下标
                k = k + 1; 
                if (k < 99) { 
                  ds[k] = ars[i]; 
                } 
                else { 
                  return ""; 
                } 
              } 
            } 
            else { 
              k = k + 1; 
              if (k < 99) { 
                ds[k] = ars[i];   //将ars[i]存在ds串中,
              } 
              else { 
                return ""; 
              } 
            } 
          } 
          for (i = l; i >= 0; i--) { //计算出表达式的结果输出r
            r = A(os[i]); 
            if (r.Equals("")) { 
              break; 
            } 
          } 
          if (!r.Equals("")) { 
            r = ds[0]; 
          } 
          return r; 
        } 
          
      

  5.   

    实在是太感谢了!! 实际上这是一个有bug的计算器,就象你说的一样这里没有判断+-*/的优先级别,只是从右到左的判断,所以在进行加减乘除的混合运算时会给出错误的答案,   不知道你能不能修复这个bug?让它能够进行正确的计算.