블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2025.1
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

사칙연산 문제 생성

C# / 2020. 11. 7. 23:50
		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;
		}
Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함