本人没有学过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;
}
}
}
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;
}
}
}
//返回字符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;
}
//将计算字符串表达式
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;
}
}
}
//计算串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;
}