1. Chương trình sử dụng thư viện System.Text.RegularExpressions để hỗ trợ cho quá trình phân tích đọc các file txt.
#Phương thức lấy về danh sách các object trong đoạn text
private List<string> GetItemFromRegexPattern(string input, string regexPattern) {
MatchCollection matchedObjectList = null; List<string> lstItem = new List<string>();
matchedObjectList = Regex.Matches(input,regexPattern);
if (matchedObjectList != null && matchedObjectList.Count > 0) {
foreach (Match match in matchedObjectList) {
foreach (Capture capture in match.Captures) { lstItem.Add(capture.Value); } } } return lstItem; }
#Phương thức lấy số objects trong đoạn text.
private int GetQuantityItemFromRegexPattern(string input, string regexPattern) {
MatchCollection matchedObjectList = null;
{
return matchedObjectList.Count; }
return 0; }
2. Đọc các giá trị của giả thiết
private List<Dientro> GetFirstDefaultValue(ref List<Dientro> lstDientro, string
giathiet) {
List<string> tempIList = GetItemFromRegexPattern(giathiet, iPattern); List<string> tempUList = GetItemFromRegexPattern(giathiet, uPattern); List<string> tempRList = GetItemFromRegexPattern(giathiet, rPattern); for (int i = 1; i <= lstDientro.Count; i++)
{ //I
string temp = "I" + i + "="; foreach (string item in tempIList) {
string tempI = item.Replace(temp, "");
if (COElectric_Utilities.CheckIsNumberValue(tempI)) {
lstDientro[i-1].I = float.Parse(tempI); }
} //U
temp = "U" + i + "=";
foreach (string item in tempUList) {
string tempU = item.Replace(temp, "");
if (COElectric_Utilities.CheckIsNumberValue(tempU)) {
lstDientro[i-1].U = float.Parse(tempU); }
} //R
temp = "R" + i + "=";
foreach (string item in tempRList) {
string tempR = item.Replace(temp, "");
if (COElectric_Utilities.CheckIsNumberValue(tempR)) {
lstDientro[i-1].R = float.Parse(tempR); }
} }
return lstDientro; }
3. Gọi suy diễn
private List<Dientro> DeduceFromFirstDefaultValue(ref List<Dientro> lstDientro) {
foreach (Dientro d in lstDientro) {
d.Deduce(); }
return lstDientro; }
4. Các tính toán trong suy diễn
//Doc gia thiet
string giathiet = txtDebai.Text.Trim();
lstDientro = GetFirstDefaultValue(ref lstDientro, giathiet); //Suy dien tu gia thiet
lstDientro = DeduceFromFirstDefaultValue(ref lstDientro);
//Doc so do mach dien
string soDoMachDien = txtMachDien.Text.Trim();//O1*(O2*O3)
List<string> lstSoDoMachDien = new List<string>(); while (soDoMachDien.IndexOf("(")>0)
{
int startIndex = soDoMachDien.IndexOf("(");
int endIndex = soDoMachDien.IndexOf(")", startIndex + 1); string result = soDoMachDien.Substring(startIndex, endIndex - startIndex + 1);
lstSoDoMachDien.Add(result);
soDoMachDien = soDoMachDien.Replace(result, ""); }
lstSoDoMachDien.Add(soDoMachDien); //Xu ly ket qua
Dientro dienTrotd = new Dientro(); dienTrotd.Name = "Điện trở tương đương"; foreach (string soDo in lstSoDoMachDien) {
string toantu = soDo; //remove dau ngoac
toantu = toantu.Replace("(", ""); toantu = toantu.Replace(")", "");
//Kiem tra xem co dien tro nao trong so do mach dien
foreach (var d in lstDientro) { if(soDo.Contains(d.Name)) { toantu = toantu.Replace(d.Name, ""); } }
if (toantu.Trim() == "*") //noi tiep
{
List<string> tempListDt = GetItemFromRegexPattern(soDo, objectPattern);
Dientro[] arrTemp = new Dientro[tempListDt.Count]; for (int i = 0; i < arrTemp.Length; i++)
{
arrTemp[i] = GetItemFromList(lstDientro, tempListDt[0]); }
//Tinh dien tro tuong duong
dienTrotd.I = EvalMapleStatement(arrTemp[0].I
foreach (var dt in arrTemp) {
dienTrotd.U = EvalMapleStatement(dt.U); dienTrotd.R = EvalMapleStatement(dt.R); }
}
else if (toantu == "||") //song song
List<string> tempListDt = GetItemFromRegexPattern(soDo, objectPattern);
Dientro[] arrTemp = new Dientro[tempListDt.Count]; for (int i = 0; i < arrTemp.Length; i++)
{
arrTemp[i] = GetItemFromList(lstDientro, tempListDt[0]); }
//Tinh dien tro tuong duong
dienTrotd.U = EvalMapleStatement(arrTemp[0].U
foreach (var dt in arrTemp) {
dienTrotd.I = EvalMapleStatement(dt.I); }
dienTrotd.R = EvalMapleStatement(arrTemp[0].R * arrTemp[1].R) / (arrTemp[0].R + arrTemp[1].R));
} else {
MessageBox.Show("Lỗi khi đọc sơ đồ mạch điện!", "Lỗi",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
5. Đối tượng Điện trở trong C#
public class Dientro {
private string name; private float u; private float i; private float r; private float p; public float P { get { return p; } set { p = value; } } public float U { get { return u; } set { u = value; } } public float I { get { return i; } set { i = value; } } public float R { get { return r; } set { r = value; } } public Dientro() { U = -1; I = -1; R = -1; P = -1; }
public string Name {
set { name = value; } }
}
6. Hàm gọi hỗ trợ tính toán Maple
public string EvalMapleStatement() {
try
{
kv = MapleEngine.StartMaple(2, argv, ref cb, IntPtr.Zero, IntPtr.Zero, err); } catch (DllNotFoundException e) { throw e; } catch (EntryPointNotFoundException e) { throw e; } if (kv.ToInt64() == 0) {
throw new System.InvalidProgramException("Fatal error, could not start maple: " + System.Text.Encoding.ASCII.GetString(err,0,Array.IndexOf(err,(byte)0))); }
IntPtr val = MapleEngine.EvalMapleStatement(kv, Encoding.ASCII.GetBytes(expr + ";"));
return result; }