//項目の比較 private Boolean Comparison(InSet inSet1, InSet inSet2) { int count = 0; if (inSet1.count - inSet2.count != 1 && inSet2.count - inSet1.count != 1) { return(false); } for (int i = 0; i < input_count; i++) { //異なったら if (inSet1.pin[i] != inSet2.pin[i]) { count++; if (count > 1) { return(false); } } } //異なるのが1か所だったらTrue if (count == 1) { return(true); } else { return(false); } }
private void UpdateInputCount() { bool success = false; //成功判定 try { int input = int.Parse(Input_text.Text); if (input >= 2) { success = true; input_count = input; } else { OutputDebug("入力端子数は、2以上の整数値で入力してください。"); } Input_text.Text = input_count.ToString(); } catch (FormatException) { OutputDebug("入力端子数は、半角数字で入力してください。"); } if (success) { OutputDebug("入力端子準備中…"); InItInputPanel(); InitPatternTable(); current_set = new InSet(input_count); UpdateSetText(); OutputDebug("入力端子準備完了-加法標準形か真理値表を入力して、算出ボタンをクリックしてください。"); OutputDebug("入力パネルから加法標準形の式を入力できます。"); OutputDebug("真理値表の出力値をクリックすることで、出力値を切り替えられます。"); } }
//重複要素の削除 public List <InSet> DeleteSame() { List <InSet> new_List = new List <InSet>(); foreach (InSet inSet in List_calc) { InSet same = new_List.Find(x => x.pin.SequenceEqual(inSet.pin)); if (same == null) { new_List.Add(inSet); } } return(new_List); }
//既にあるかの確認 public Boolean CanUse(InSet inSet) { inSet.CalcValue(); //同値の項を検索 InSet same = List_true_set.Find(x => x.pin.SequenceEqual(inSet.pin)); //無ければ追加 if (same == null) { return(true); } else { return(false); } }
//加算 private void Add_Button_Click(object sender, RoutedEventArgs e) { if (CanUse(current_set)) { if (List_true_set.Count > 0) { Form_text.Text = Form_text.Text + " +"; } Form_text.Text = Form_text.Text + set_text.Text; List_true_set.Add(current_set); current_set = new InSet(input_count); } else { OutputDebug("その項目はすでに追加されています。"); } }
//項目の合成 private InSet Merge(InSet inSet1, InSet inSet2) { InSet after = new InSet(input_count); for (int i = 0; i < input_count; i++) { //異なったら if (inSet1.pin[i] != inSet2.pin[i]) { after.pin[i] = -1; } //同じだったら else { after.pin[i] = inSet1.pin[i]; } } return(after); }
//クワインマキラスキー計算 public void Calc() { Boolean keep = true; //計算継続の確認 List <InSet> List_culc_next = new List <InSet>(); //計算結果格納用リスト OutputDebug("計算中です。。。"); //パターンを導出 List_calc.Clear(); foreach (Pattern pattern in List_pattern) { if (pattern.OUT == 1) { InSet inSet = new InSet(input_count); for (int i = 0; i < input_count; i++) { inSet.pin[i] = pattern.Get_IN(i); } inSet.CalcValue(); List_value.Add(inSet.value); List_calc.Add(inSet); } } List_value = List_value.Distinct().ToList(); while (keep) { keep = false; List_culc_next = new List <InSet>(); for (int i = 0; i < List_calc.Count; i++) { for (int j = i + 1; j < List_calc.Count; j++) { //比較して合成可能だったら if (Comparison(List_calc[i], List_calc[j])) { //合成結果を格納用リストに格納 InSet merge = Merge(List_calc[i], List_calc[j]); merge.List_value = List_calc[i].List_value; merge.List_value.AddRange(List_calc[j].List_value); merge.List_value = merge.List_value.Distinct().ToList(); merge.CalcValue(); List_culc_next.Add(merge); List_calc[i].used = true; List_calc[j].used = true; keep = true; } } } //どれとも合成されなかった要素の継承 for (int i = 0; i < List_calc.Count; i++) { if (List_calc[i].used == false) { List_culc_next.Add(List_calc[i]); } } List_calc = List_culc_next; List_calc = DeleteSame(); string str = ""; foreach (InSet inSet in List_calc) { str += inSet.ToString() + " | "; } OutputDebug(str); } //不要項の整理 CleanSet(); DisplayAns(); OutputDebug("計算完了"); }