void DEBUG_rnd_4_CAL()//사칙연산 문제 생성
{
Random rnd = new Random();
string[] op= { "+", "-", "/", "*" };
string s;
int n=50,m;
while (n > 0)
{
s = "";
m= rnd.Next(3)+3;
s = C.Ftoa2(rnd.Next(100) / (rnd.Next(10) + 1.0f) - rnd.Next(50));
while (m > 0)
{
s= s + " " + op[rnd.Next(op.Length)] +" "+ C.Ftoa2(rnd.Next(100) / (rnd.Next(10) + 1.0f) - rnd.Next(50));
m--;
}
Console.WriteLine(s+",");
n--;
}
}
void DEBUG_test_Str_cal_with_brace()
{
string[] a = {
"1 + 2 * (3 + 4)",
"1 + 2 * 3",
"111+1*2",
//"48/2*(9+3)",
"(2 + 3) * 4",
"2 + (3 * 4)",
"(6 / 2) * 3",
"6 / (2 * 3)",
"2 + 3 * 4",
"6 / 2 * 3",
"5 + 10 + 10",
"7 / 3 - 9",
//"7 / 3 - 9",
"(123*456)+789 /123*1245",
//------------------------
"-5.14 * -7.5 * 56 + -29.4 / -24",
"-23.5 + -2 * -6.43 * -23.2",
"-38.29 + -3.56 / -4.5 * -37.33 + -8 + -34",
"-32.78 * 22 - 18 / -20.75 - -22.33",
"-29.67 + 54 + -31.17 + 20.33 * -35.67 - 15",
"18.25 + -38.8 - -2.22 * -5.71 / 2.67 + -20",
"-7.33 + -11.5 + -8.8 / -3.33 + -4.8 + -40.25",
"-27 - -13.1 - -20.67 - -2.25 - 19",
"-27.33 * -9.5 + -21.14 * -36.13",
"-8.67 + -38.13 * -13.29 + -18.1 + 4.75 / -5.89",
"-6.25 * 17 * 17.67 / -20.88 / -5.1 / -21",
"-9.57 * -11.75 - -11.5 + -7.6",
"3.4 * 0.57 * -40.5 - 4.14 - -24.25 * -6.75",
"3.5 - -10.67 * -22.5 + -14 / -32.2",
"-20.5 * -7 * -45 + -9.33",
"-15.67 / -33 + -5.3 / -12",
"45 / -4 + -6.75 - 8.83",
"-25.67 / -11 - 4.11 / 41",
"-6.63 + 0.71 - -28.67 / -17 - 1.5 * -7.75",
"4.33 * -14.25 * -5.43 * -8.7 + -28",
"-36.33 * -25.57 / -38.6 - -5.17 - 0.33 / 7.14",
"-44.75 * -32.22 / -42.4 + -13 - -29.14 / -4.7",
"-19.9 / -39.9 + -14.5 / -30.29 - 2 + 21",
"-36.11 - -34.67 + 28 * -6.5",
"-31.44 - 11 + -6.67 / 30.5",
"-1 - -12 * -2.17 / 3 * -15.78",
"-27.75 / -18.63 - -9.25 - -34 * -5 + -6.4",
"5.5 + -36.4 + -0.83 * -7.33 - -33 * -42.89",
"50 / 3.4 - -27.88 * -17.5 / -18",
"35 - -32.22 / -28.5 + 2.5",
"-3.33 + -29.33 * -1 * -23.4 + -42.25",
"-37 * -0.14 / -31.4 / -5 + -25.6 / -19.33",
"-16.6 + -29.33 - -19 + -19.83",
"-29.5 - -19.22 * 6.5 * 5 + -7.38 / -22",
"26.5 + -26.67 - 45.5 - 63 / -16.57",
"3 + 4.56 / -22.75 / -40.33 / 1.4",
"6 / 13 * -14 / 5.75 - -13.89",
"1.5 + 1.75 / -34.56 * 2.9 - 1.44",
"22.5 - -0.1 * -1.6 + -14.43 + 9.14",
"-24.17 - -12 / -8.56 / -38.25 + -37.63 / -21.4",
"-33.5 / -12.89 / -16 + -6.75 * -11.2 + -6.25",
"15.75 + -3.75 - 65 - -39.14",
"-38.88 / -17.78 - 2 * -0.75 - -41",
"10 - 3.17 - -18.78 + 12 - -9",
"-26.57 + -11.88 / -26 * -20.43 + -42.8 - 12",
"29 * 2 * -15.5 + 4.17 * -36.4",
"3.4 * -14.71 + -0.5 / -8 - -0.6 / 7",
"-38.8 - -1.8 + -20.75 * -5.75 * 2.67",
"61 - -11.5 * -14.25 * -35",
"-20 * 0.2 + -19 + -23 / -6.25 * -14",
//--------------------------------
"-5.14 * (-7.5 * 56 + -29.4) / -24",
"-23.5 + (-2 * -6.43) * -23.2",
"(-38.29 + -3.56 / -4.5) * -37.33 + -8 + -34",
"-32.78 * 22 - 18 / (-20.75 - -22.33)",
"-29.67 + (54 + -31.17 + 20.33) * -35.67 - 15",
"(18.25 + -38.8 - -2.22 * -5.71 / 2.67 + -20)",
"(-7.33 + -11.5) + -8.8 / -3.33 + -4.8 + -40.25",
"(-27 - -13.1 - -20.67) - -2.25 - 19",
"-27.33 * (-9.5 + -21.14) * -36.13",
"-8.67 + -38.13 * -13.29 + (-18.1 + 4.75 / -5.89)",
"-6.25 * 17 * (17.67 / -20.88 / -5.1) / -21",
"-9.57 * (-11.75 - -11.5) + -7.6",
//--------------------------------
"-5.14 * (-7.5 * (56 + -29.4)) / -24",
"(-23.5 + (-2 * -6.43)) * -23.2",
"((-38.29 + -3.56) / -4.5) * -37.33 + -8 + -34",
"-32.78 * ((22 - 18) / (-20.75 - -22.33))",
"((-29.67 + (54 + -31.17 + 20.33)) * -35.67) - 15",
"(18.25 + (-38.8 - (-2.22 * (-5.71 / (2.67 + -20)))))",
"(-7.33 + -11.5) + (-8.8 / -3.33) + (-4.8 + -40.25)",
"((-27 - -13.1 - -20.67) - -2.25 - 19)",
"(-27.33 * (-9.5 + -21.14) * -36.13)",
"-8.67 + -38.13 * (-13.29 + (-18.1 + 4.75 / -5.89))",
"((-6.25 * 17 )* (17.67 / -20.88 / -5.1)) / -21",
"-9.57 * ((-11.75 - -11.5) + -7.6)"
};
double[] r =
{
1 + 2 * (3 + 4),
1 + 2 * 3,
111+1*2,
//48/2.0D*(9+3),//나눗셈은 실수로 지정해주어야한다. double은 D
(2 + 3) * 4,
2 + (3 * 4),
(6 / 2.0D) * 3,
6.0D / (2 * 3),
2 + 3 * 4,
6 / 2.0D * 3,
5 + 10 + 10,
7.0D / 3D - 9.0D,
//7 / 3 - 9,//정수를 넣어주면, 정수형으로 계산된다.
(123*456)+789 /123.0D*1245,
//------------------------
-5.14D * -7.5D * 56D + -29.4D / -24D,
-23.5D + -2 * -6.43D * -23.2,
-38.29D + -3.56D / -4.5D * -37.33 + -8 + -34,
-32.78D * 22 - 18D / -20.75D - -22.33,
-29.67D + 54 + -31.17D + 20.33 * -35.67D - 15,
18.25D + -38.8 - -2.22 * -5.71 / 2.67D + -20,
-7.33D + -11.5 + -8.8 / -3.33 + -4.8 + -40.25,
-27D - -13.1 - -20.67 - -2.25 - 19,
-27.33D * -9.5 + -21.14 * -36.13,
-8.67D + -38.13 * -13.29 + -18.1 + 4.75D / -5.89D,
-6.25D * 17 * 17.67D / -20.88D / -5.1D / -21D,
-9.57D * -11.75 - -11.5 + -7.6D,
3.4D * 0.57 * -40.5 - 4.14 - -24.25 * -6.75D,
3.5D - -10.67 * -22.5 + -14 / -32.2D,
-20.5D * -7 * -45 + -9.33,
-15.67D / -33 + -5.3 / -12D,
45 / -4D + -6.75 - 8.83,
-25.67 / -11D - 4.11 / 41,
-6.63 + 0.71 - -28.67 / -17D - 1.5 * -7.75,
4.33 * -14.25 * -5.43 * -8.7 + -28,
-36.33 * -25.57 / -38.6 - -5.17 - 0.33 / 7.14,
-44.75 * -32.22 / -42.4 + -13 - -29.14 / -4.7,
-19.9 / -39.9 + -14.5 / -30.29 - 2 + 21,
-36.11 - -34.67 + 28 * -6.5,
-31.44 - 11 + -6.67 / 30.5,
-1 - -12 * -2.17 / 3 * -15.78,
-27.75 / -18.63 - -9.25 - -34 * -5 + -6.4,
5.5 + -36.4 + -0.83 * -7.33 - -33 * -42.89,
50 / 3.4 - -27.88 * -17.5 / -18,
35 - -32.22 / -28.5 + 2.5,
-3.33 + -29.33 * -1 * -23.4 + -42.25,
-37 * -0.14 / -31.4 / -5 + -25.6 / -19.33,
-16.6 + -29.33 - -19 + -19.83,
-29.5 - -19.22 * 6.5 * 5 + -7.38 / -22,
26.5 + -26.67 - 45.5 - 63 / -16.57,
3 + 4.56 / -22.75 / -40.33 / 1.4,
6 / 13D * -14 / 5.75D - -13.89,
1.5D + 1.75D / -34.56D * 2.9 - 1.44D,
22.5 - -0.1 * -1.6 + -14.43 + 9.14,
-24.17 - -12 / -8.56D / -38.25D + -37.63 / -21.4D,
-33.5 / -12.89D / -16D + -6.75 * -11.2 + -6.25,
15.75 + -3.75 - 65 - -39.14,
-38.88 / -17.78D - 2 * -0.75 - -41,
10 - 3.17 - -18.78 + 12 - -9,
-26.57 + -11.88 / -26D * -20.43 + -42.8 - 12,
29 * 2 * -15.5 + 4.17 * -36.4,
3.4 * -14.71 + -0.5 / -8D - -0.6 / 7D,
-38.8 - -1.8 + -20.75 * -5.75 * 2.67,
61 - -11.5 * -14.25 * -35,
-20 * 0.2 + -19 + -23 / -6.25D * -14,
//--------------------------------
-5.14D * (-7.5D * 56D + -29.4D) / -24D,
-23.5D + (-2 * -6.43) * -23.2,
(-38.29D + -3.56 / -4.5D) * -37.33 + -8 + -34,
-32.78D * 22 - 18 / (-20.75D - -22.33),
-29.67D + (54 + -31.17 + 20.33) * -35.67 - 15,
(18.25D + -38.8 - -2.22 * -5.71 / 2.67D + -20),
(-7.33D + -11.5) + -8.8 / -3.33D + -4.8 + -40.25,
(-27D - -13.1 - -20.67) - -2.25 - 19,
-27.33D * (-9.5 + -21.14) * -36.13,
-8.67D + -38.13 * -13.29 + (-18.1 + 4.75 / -5.89D),
-6.25D * 17 * (17.67 / -20.88D / -5.1D) / -21D,
-9.57D * (-11.75 - -11.5) + -7.6,
//--------------------------------
-5.14D * (-7.5D * (56D + -29.4D)) / -24D,
(-23.5D + (-2 * -6.43)) * -23.2,
((-38.29D + -3.56) / -4.5D) * -37.33 + -8 + -34,
-32.78D * ((22 - 18) / (-20.75D - -22.33)),
((-29.67D + (54 + -31.17 + 20.33)) * -35.67) - 15,
(18.25D + (-38.8 - (-2.22 * (-5.71 / (2.67D + -20))))),
(-7.33D + -11.5) + (-8.8 / -3.33D) + (-4.8 + -40.25),
((-27D - -13.1 - -20.67) - -2.25 - 19),
(-27.33D * (-9.5 + -21.14) * -36.13),
-8.67D + -38.13 * (-13.29 + (-18.1 + 4.75 / -5.89D)),
((-6.25D * 17 )* (17.67 / -20.88D / -5.1D)) / -21D,
-9.57D * ((-11.75 - -11.5) + -7.6)
};
double d;
int i,err_cnt=0, ok_cnt=0;
//DEBUG_rnd_4_CAL();//사칙연산 문제 생성
for (i = 0; i < a.Length; i++)
{
Console.WriteLine(a[i]);
d = Str_cal_with_brace(a[i]);
float f1, f2;
f1 = ((float)d);
f2 = ((float)r[i]);
if (d != r[i])
//if (((float)d) != ((float)r[i]))
//if (f1 != f2)
{
//err
err_cnt++;
Console.WriteLine(a[i]);
Console.WriteLine("ERR : " + a[i]+"="+C.Ftoa(r[i])+","+C.Ftoa(d));
double d2 = 7 / 3.0f - 9;//-6.6666669845581055
}
else
{
Console.WriteLine("OK : " + a[i] + "=" + C.Ftoa(r[i]) + "," + C.Ftoa(d));
ok_cnt++;
}
}
Console.WriteLine("Total_cnt=" + a.Length.ToString());
Console.WriteLine("ok_cnt="+ ok_cnt.ToString());
Console.WriteLine("err_cnt=" + err_cnt.ToString());
}
int Find_and_Cal(double[]v,char[]op,int cnt,int i)//다음 숫자와 연산자 찾아서 계산
{
string msg = "";
int find = -1, next;
DEBUG_view_double_char(v, op, cnt);
//다음 숫자와 연산자 찾기
for (next = i + 1; next < cnt; next++)
{
//마지막 숫자는 연산자가 없다. 삭제된것이 아니면 ok
if (op[next] !='D')//D=Delete
{
//find
find = next;
if (op[i] == '*')
{
v[i] = v[i] * v[next];
}
else if (op[i] == '/')
{
v[i] = v[i] / v[next];
}
else if (op[i] == '%')
{
v[i] = v[i] % v[next];
}
else if (op[i] == '+')
{
v[i] = v[i] + v[next];
}
else if (op[i] == '-')
{
v[i] = v[i] - v[next];
}
else
{
msg = "ERR : 알 수 없는 연산자";
}
//next 삭제
op[i] = op[next];//다음연산자로 변경
v[next] = 0;
op[next] = 'D';//D=Delete
DEBUG_view_double_char(v, op, cnt);
i--;//다시한번 진행
break;
}
else
{
//비어있는 슬롯.skip
}
}
DEBUG_view_double_char(v, op, cnt);
/*if(find==-1)
{
msg = "다음숫자를 못찾았습니다. or 계산 완료";
}
else { }*/
return find;
}
bool HasCal(string s)//계산 수식이 있나?
{
bool ret = false;
if (s != "")
{
ret = (s.IndexOf('+') >= 0) || (s.IndexOf('-') >= 0) ||
(s.IndexOf('*') >= 0) || (s.IndexOf('/') >= 0) ||
(s.IndexOf('%') >= 0);
}
else { }
return ret;
}
double Str_cal_with_brace(string s)//괄호없는 문자열 사칙연산 문자열 수식 계산. s="1+2*3+4"
{
double ret = 0;
if (s != "")
{
//수식이 있나?
if (HasCal(s))
{
//수식(+-*/%) 있음
bool bStart = true;
int cnt = 0, i = 0, j, n = s.Length / 2 + 1, next, brace_cnt;
double[] v = new double[n];
char[] op = new char[n];
string buf = "", msg = "", buf2 = "";
v[0] = 0;
s = s.Replace(" ", "");
s = s.Replace("\t", "");
s = s.Replace("\r", "");
s = s.Replace("\n", "");
while (i < s.Length)
{
if (s[i] == '(')
{
//괄호 처리. (앞에는 연산자
i = C.Brace_cpy(s, i , out buf2);//'('을 발견하면 짝이 맞는 ')'이전까지만 복사한다.
v[cnt] = Str_cal_with_brace(buf2);
//다음 연산자 찾기
//공백제거
//i = C.Skip_space(s, i);
if (i >= s.Length)
{
//마지막
op[cnt] = ' ';
}
else
{
if ("+-/%*".IndexOf(s[i]) >= 0)
{
//연산자
op[cnt] = s[i];
i++;
}
else
{
//err
msg = "ERR : +-/%* 연산자가 나올 차례입니다.";
op[cnt] = '*';//곱셈연산자로 지정
}
bStart = true;
}
cnt++;//부호는 아직...
DEBUG_view_double_char(v, op, cnt);
buf = "";
}
else
{
//괄호 없음
//"3-1"은? 첫번째 연산자, 부호 없음
//"3--1"은? 첫번째 연산자, 부호 -
//"-3-1"은? 첫번째 부호
//"3-+1"은?
if (bStart)//수식의 시작(부호만 올 수 있다 연산자가 앞에 올 수 없다
{
//부호 또는 숫자
buf = buf + s[i];
i++;
bStart = false;
}
else
{
//연산자인가?
//첫번째가 연산자(op)이고, 2번째 이후는 부호
j = "+-/%*".IndexOf(s[i]);
if ((j >= 0) &&
(i != 0))//부호
{
//연산자
//연산자.지금까지 저장한 값을 push
v[cnt] = C.Atod(buf);
op[cnt] = s[i];
cnt++;
DEBUG_view_double_char(v, op, cnt);
buf = "";
bStart = true;
}
else
{
//숫자
buf = buf + s[i];
bStart = false;
}
i++;
}
//DEBUG_puts("buf=" + buf);
}
}
//마지막 숫자 넣기
if (buf != "")
{
//push
v[cnt] = C.Atod(buf);
op[cnt] = ' ';//마지막은 연산자가 없다
cnt++;
}
else { }
DEBUG_view_double_char(v, op, cnt);
//곱셈,나눗셈,나머지 부터 계산
for (i = 0; i < cnt; i++)
{
if ((op[i] == '*') || (op[i] == '/') || (op[i] == '%'))
{
Find_and_Cal(v, op, cnt, i);//다음 숫자와 연산자 찾아서 계산
i = -1;//다시 계산
}
else { }
}
DEBUG_view_double_char(v, op, cnt);
//덧셈, 뺄셈 계산
for (i = 0; i < cnt; i++)
{
if ((op[i] == '+') || (op[i] == '-'))
{
Find_and_Cal(v, op, cnt, i);//다음 숫자와 연산자 찾아서 계산
i = -1;//다시 계산
}
else { }
}
DEBUG_view_double_char(v, op, cnt);
ret = v[0];
}
else
{
//수식없음
}
}
else { }
return ret;
}