public int num_of_char;//ترتيبه static public nodes create_new_node(nodes n1, nodes n2, int periority, int last_num_of_char) { nodes new_node = new nodes(); new_node.str = n1.str + n2.str; new_node.left = n1.str; new_node.right = n2.str; new_node.count = n1.count + n2.count; new_node.periroity = periority; new_node.check = 0; new_node.num_of_char = last_num_of_char; return(new_node); }
private void btn_decode_Click(object sender, EventArgs e) { decode_txt.Text = ""; get_code(); string input_code; int tr; string[] arr1 = { "0", "01", "001", "0001", "00001", "000001", "0000001" }; //char left side string[] arr2 = { "1", "11", "101", "1001", "10001", "100001", "1000001" }; //char right side string[] arr3 = { "0", "00", "000", "0000", "00000", "000000" }; // new of left side string[] arr4 = { "0", "10", "100", "1000", "10000", "100000" }; //new of right side List <nodes> new_node = new List <nodes>(); nodes node_temp = new nodes(); nodes node_swap = new nodes(); char input_char; bool check_new_char = false; int index; int temp; int temp_index = 0; int temp_level; #region First_code //Fetch the First Character get_code(); tr = listBox2.FindString(input); listBox1.SelectedIndex = tr; input_code = listBox1.SelectedItem.ToString(); decode_txt.Text += input_code; node_temp.str = Convert.ToChar(input_code); node_temp.count = 1; node_temp.pos = "right"; node_temp.code = "1"; node_temp.level = 0; // fetch code from initial table index = listBox1.FindString(input_code); listBox2.SelectedIndex = index; prev_symbole_code = listBox2.SelectedItem.ToString(); // Update Initial table for symbole listBox2.Items[index] = node_temp.code; // fetch previous new code index = listBox1.FindString("new"); listBox2.SelectedIndex = index; prev_new_code = listBox2.SelectedItem.ToString(); //output Code in output table /*list_symbole_result.Items.Add("new"); * list_code_result.Items.Add(prev_new_code); * list_symbole_result.Items.Add(input[0].ToString()); * list_code_result.Items.Add(prev_symbole_code);*/ // Update Initial table for new listBox2.Items[index] = "0"; //new_node.Add(node_temp); new_node.Add(new nodes() { str = node_temp.str, pos = node_temp.pos, code = node_temp.code, count = node_temp.count, level = node_temp.level }); //End #endregion cc++; // for new code select for (int i = 1; i < cv; i++) // -1 { check_new_char = true; // Take Character from input get_code(); tr = listBox2.FindString(input); listBox1.SelectedIndex = tr; input_code = listBox1.SelectedItem.ToString(); decode_txt.Text += input_code.ToString(); // Check if it is new char or old for (int j = 0; j < new_node.Count; j++) { // is existing char if (new_node[j].str == Convert.ToChar(input_code)) { new_node[j].count++; // Output Symbole Code // fetch code from initial table index = listBox1.FindString(input_code); listBox2.SelectedIndex = index; prev_symbole_code = listBox2.SelectedItem.ToString(); check_new_char = false; break; } } // Is new char if (check_new_char == true) { node_temp.str = Convert.ToChar(input_code); node_temp.count = 1; node_temp.pos = "left";//**** if (new_pos == "left") { nodes obj = new_node[new_node.Count - 1]; // last node node_temp.level = obj.level + 1; // insert new level for new char temp = obj.level + 1; node_temp.code = arr1[node_temp.level]; //new_node.Add(node_temp); new_node.Add(new nodes() { str = node_temp.str, pos = node_temp.pos, code = node_temp.code, count = node_temp.count, level = node_temp.level }); //rich_output_txt.Text += new_node[new_node.Count - 1].str; // show save char // fetch code from initial table index = listBox1.FindString(input_code); listBox2.SelectedIndex = index; prev_symbole_code = listBox2.SelectedItem.ToString(); // fetch previous new code index = listBox1.FindString("new"); listBox2.SelectedIndex = index; prev_new_code = listBox2.SelectedItem.ToString(); //output Code in output table /*list_symbole_result.Items.Add("new"); * list_code_result.Items.Add(prev_new_code); * list_symbole_result.Items.Add(input.Substring(i, 1)); * list_code_result.Items.Add(prev_symbole_code);*/ //Check for Conditions (Update tree) // only condition of checking the left and right tree counts //break; } } #region Update_Tree // pos, level, count if (new_node.Count >= 2 && new_node[new_node.Count - 1].count > new_node[new_node.Count - 2].count) { temp_level = new_node[new_node.Count - 2].level; int d = new_node.Count - 2; // to obtain who object will swap with current "Far object" for (int n = 0; n < new_node.Count - 1; n++) { if (new_node[new_node.Count - 1].count > new_node[n].count) { //MessageBox.Show("Here!!"); temp_level = new_node[n].level; d = n; break; } } //rich_output_txt.Text += "ok"; node_swap.str = new_node[new_node.Count - 1].str; //c node_swap.count = new_node[new_node.Count - 1].count; //2 new_node[new_node.Count - 1].str = new_node[d].str; //d new_node[new_node.Count - 1].count = new_node[d].count; //1 new_node[d].str = node_swap.str; //c new_node[d].count = node_swap.count; //2 MessageBox.Show(new_node[new_node.Count - 1].str.ToString() + " " + new_node[new_node.Count - 1].code + " " + new_node[new_node.Count - 1].count); //c MessageBox.Show(new_node[d].str.ToString() + " " + new_node[d].code + " " + new_node[d].count); //d // Condition of that if right tree not >= left tree if (new_node[0].pos == "right") { int count_sum = 0; for (int m = 1; m < new_node.Count; m++) { count_sum += new_node[m].count; } if (new_node[0].count < count_sum) { new_node[0].pos = "left"; new_node[0].code = arr1[0]; MessageBox.Show(new_node[0].str.ToString() + " " + new_node[0].code); for (int v = 1; v < new_node.Count; v++) { new_node[v].pos = "right"; new_node[v].code = arr2[v]; MessageBox.Show(new_node[v].str.ToString() + " " + new_node[v].code); } } } } // Update Initial table for symbole or all symbols for (int h = 0; h < new_node.Count; h++) { // fetch code from initial table index = listBox1.FindString(new_node[h].str.ToString()); listBox2.SelectedIndex = index; // Update Initial table for symbole listBox2.Items[index] = new_node[h].code; } #endregion int mm; // Update Initial table for new if (new_node[0].pos == "right") { mm = new_node[new_node.Count - 1].level; listBox2.Items[0] = arr3[mm]; prev_new_code = arr3[mm]; temp_index++; } else { mm = new_node[new_node.Count - 1].level; listBox2.Items[0] = arr4[mm]; prev_new_code = arr4[mm]; temp_index++; } cc++; } }
private void btn_submit_Click(object sender, EventArgs e) { if (txt_input.Text != "") { txt_input.ReadOnly = true; txt_symbole.ReadOnly = true; txt_code.ReadOnly = true; btn_submit.Visible = false; input = txt_input.Text; string[] arr1 = { "0", "01", "001", "0001", "00001", "000001", "0000001" }; //char left side string[] arr2 = { "1", "11", "101", "1001", "10001", "100001", "1000001" }; //char right side string[] arr3 = { "0", "00", "000", "0000", "00000", "000000" }; // new of left side string[] arr4 = { "0", "10", "100", "1000", "10000", "100000" }; //new of right side List <nodes> new_node = new List <nodes>(); //nodes[] node_temp = new nodes[input.Length]; nodes node_temp = new nodes(); nodes node_swap = new nodes(); char input_char; bool check_new_char = false; int index; int temp; int temp_index = 0; int temp_level; #region First_char //Fetch the First Character node_temp.str = input[0];//Convert.ToChar(input.Substring(1, 1)) node_temp.count = 1; node_temp.pos = "right"; node_temp.code = "1"; node_temp.level = 0; // fetch code from initial table index = list_symbole.FindString(input[0].ToString()); list_code.SelectedIndex = index; prev_symbole_code = list_code.SelectedItem.ToString(); // Update Initial table for symbole list_code.Items[index] = node_temp.code; // fetch previous new code index = list_symbole.FindString("new"); list_code.SelectedIndex = index; prev_new_code = list_code.SelectedItem.ToString(); //output Code in output table list_symbole_result.Items.Add("new"); list_code_result.Items.Add(prev_new_code); list_symbole_result.Items.Add(input[0].ToString()); list_code_result.Items.Add(prev_symbole_code); // Update Initial table for new list_code.Items[index] = "0"; //new_node.Add(node_temp); new_node.Add(new nodes() { str = node_temp.str, pos = node_temp.pos, code = node_temp.code, count = node_temp.count, level = node_temp.level }); //End #endregion //MessageBox.Show(input[0].ToString()); list_output.Items.Add(input[0] + " New"); for (int i = 1; i < input.Length; i++) // -1 { check_new_char = true; // Take Character from input input_char = Convert.ToChar(input.Substring(i, 1)); //rich_output_txt.Text += input_char; // Check if it is new char or old //foreach (nodes item in new_node)//.Where(x => x.str == input_char).Take(1).ToList() for (int j = 0; j < new_node.Count; j++) { // is existing char if (new_node[j].str == input_char) { list_output.Items.Add(input_char + " Exist"); new_node[j].count++; // Output Symbole Code // fetch code from initial table index = list_symbole.FindString(input.Substring(i, 1)); list_code.SelectedIndex = index; prev_symbole_code = list_code.SelectedItem.ToString(); list_symbole_result.Items.Add(input.Substring(i, 1)); list_code_result.Items.Add(prev_symbole_code); #region try //Check for Conditions (Update tree) // all condition must detect /*#region Update_Tree * // pos, level, count * * if (new_node.Count>=2 && new_node[new_node.Count - 1].count > new_node[new_node.Count - 2].count) * { * temp_level = new_node[new_node.Count - 2].level; * int d = new_node.Count - 2; * // to obtain who object will swap with current "Far object" * for (int n = 0; n < new_node.Count -1; n++) * { * if (new_node[new_node.Count - 1].count > new_node[n].count) * { * //MessageBox.Show("Here!!"); * temp_level = new_node[n].level; * d = n; * break; * } * } * * //rich_output_txt.Text += "ok"; * node_swap.str = new_node[new_node.Count - 1].str;//c * node_swap.count = new_node[new_node.Count - 1].count;//2 * new_node[new_node.Count - 1].str = new_node[d].str;//d * new_node[new_node.Count - 1].count = new_node[d].count;//1 * new_node[d].str = node_swap.str;//c * new_node[d].count = node_swap.count;//2 * * MessageBox.Show(new_node[new_node.Count - 1].str.ToString() + " " + new_node[new_node.Count - 1].code + " " + new_node[new_node.Count - 1].count);//c * MessageBox.Show(new_node[d].str.ToString() + " " + new_node[d].code + " " + new_node[d].count);//d * * // Condition of that if right tree not >= left tree * if (new_node[0].pos == "right") * { * int count_sum = 0; * for (int m = 1; m < new_node.Count; m++) * { * count_sum += new_node[m].count; * } * * if (new_node[0].count < count_sum) * { * new_node[0].pos = "left"; * new_node[0].code = arr1[0]; * MessageBox.Show(new_node[0].str.ToString() + " " + new_node[0].code); * for (int v = 1; v < new_node.Count; v++) * { * new_node[v].pos = "right"; * new_node[v].code = arr2[v]; * MessageBox.Show(new_node[v].str.ToString() + " " + new_node[v].code); * } * } * } * * } * * * * * // Update Initial table for symbole or all symbols * * for (int h = 0; h < new_node.Count; h++) * { * // fetch code from initial table * index = list_symbole.FindString(new_node[h].str.ToString()); * list_code.SelectedIndex = index; * * // Update Initial table for symbole * list_code.Items[index] = new_node[h].code; * } #endregion*/ #endregion check_new_char = false; break; } } // Is new char if (check_new_char == true) { list_output.Items.Add(input_char + " New"); node_temp.str = input_char; node_temp.count = 1; node_temp.pos = "left";//**** if (new_pos == "left") { nodes obj = new_node[new_node.Count - 1]; // last node node_temp.level = obj.level + 1; // insert new level for new char temp = obj.level + 1; node_temp.code = arr1[node_temp.level]; //new_node.Add(node_temp); new_node.Add(new nodes() { str = node_temp.str, pos = node_temp.pos, code = node_temp.code, count = node_temp.count, level = node_temp.level }); //rich_output_txt.Text += new_node[new_node.Count - 1].str; // show save char // fetch code from initial table index = list_symbole.FindString(input.Substring(i, 1)); list_code.SelectedIndex = index; prev_symbole_code = list_code.SelectedItem.ToString(); // fetch previous new code index = list_symbole.FindString("new"); list_code.SelectedIndex = index; prev_new_code = list_code.SelectedItem.ToString(); //output Code in output table list_symbole_result.Items.Add("new"); list_code_result.Items.Add(prev_new_code); list_symbole_result.Items.Add(input.Substring(i, 1)); list_code_result.Items.Add(prev_symbole_code); //Check for Conditions (Update tree) // only condition of checking the left and right tree counts //break; } /*else // new on right * { * nodes obj = new_node[new_node.Count - 1]; // last node * node_temp.level = obj.level + 1; // insert new level for new char * temp = obj.level + 1; * node_temp.code = arr2[node_temp.level]; * * //new_node.Add(node_temp); * new_node.Add(new nodes() { str = node_temp.str, pos = node_temp.pos, code = node_temp.code, count = node_temp.count, level = node_temp.level }); * * // fetch code from initial table * index = list_symbole.FindString(input.Substring(i, 1)); * list_code.SelectedIndex = index; * prev_symbole_code = list_code.SelectedItem.ToString(); * * // fetch previous new code * index = list_symbole.FindString("new"); * list_code.SelectedIndex = index; * prev_new_code = list_code.SelectedItem.ToString(); * * //output Code in output table * list_symbole_result.Items.Add("new"); * list_code_result.Items.Add(prev_new_code); * list_symbole_result.Items.Add(input.Substring(i, 1)); * list_code_result.Items.Add(prev_symbole_code); * * //Check for Conditions (Update tree) * * * // Update Initial table for symbole * //list_code.Items[index] = node_temp.code; * * // Update Initial table for new * //list_code.Items[index] = arr4[temp]; * * //break; * }*/ } #region Update_Tree // pos, level, count if (new_node.Count >= 2 && new_node[new_node.Count - 1].count > new_node[new_node.Count - 2].count) { temp_level = new_node[new_node.Count - 2].level; int d = new_node.Count - 2; // to obtain who object will swap with current "Far object" for (int n = 0; n < new_node.Count - 1; n++) { if (new_node[new_node.Count - 1].count > new_node[n].count) { //MessageBox.Show("Here!!"); temp_level = new_node[n].level; d = n; break; } } //rich_output_txt.Text += "ok"; node_swap.str = new_node[new_node.Count - 1].str; //c node_swap.count = new_node[new_node.Count - 1].count; //2 new_node[new_node.Count - 1].str = new_node[d].str; //d new_node[new_node.Count - 1].count = new_node[d].count; //1 new_node[d].str = node_swap.str; //c new_node[d].count = node_swap.count; //2 MessageBox.Show(new_node[new_node.Count - 1].str.ToString() + " " + new_node[new_node.Count - 1].code + " " + new_node[new_node.Count - 1].count); //c MessageBox.Show(new_node[d].str.ToString() + " " + new_node[d].code + " " + new_node[d].count); //d // Condition of that if right tree not >= left tree if (new_node[0].pos == "right") { int count_sum = 0; for (int m = 1; m < new_node.Count; m++) { count_sum += new_node[m].count; } if (new_node[0].count < count_sum) { new_node[0].pos = "left"; new_node[0].code = arr1[0]; MessageBox.Show(new_node[0].str.ToString() + " " + new_node[0].code); for (int v = 1; v < new_node.Count; v++) { new_node[v].pos = "right"; new_node[v].code = arr2[v]; MessageBox.Show(new_node[v].str.ToString() + " " + new_node[v].code); } } } } // Update Initial table for symbole or all symbols for (int h = 0; h < new_node.Count; h++) { // fetch code from initial table index = list_symbole.FindString(new_node[h].str.ToString()); list_code.SelectedIndex = index; // Update Initial table for symbole list_code.Items[index] = new_node[h].code; } #endregion int mm; // Update Initial table for new if (new_node[0].pos == "right") { mm = new_node[new_node.Count - 1].level; list_code.Items[0] = arr3[mm]; prev_new_code = arr3[mm]; temp_index++; } else { mm = new_node[new_node.Count - 1].level; list_code.Items[0] = arr4[mm]; prev_new_code = arr4[mm]; temp_index++; } }//end for loop //rich_output_txt.Text = ""; for (int i = 0; i < new_node.Count; i++) { rich_output_txt.Text += new_node[i].str + "\t"; } }// end if ///////////// for decoding ///////////////// cv = list_code_result.Items.Count; }
private void btn_encode_Click(object sender, EventArgs e) { string sentence = txt_encode.Text; string sentence_distinct = new String(sentence.Distinct().ToArray()); int nodes_num = sentence_distinct.Length - 1; int last_num_of_char = 0; //convert sentence into nodes for (int i = 0; i < sentence_distinct.Length; i++) { nodes node = new nodes(); node.periroity = 0; node.str = sentence_distinct.Substring(i, 1); node.left = null; node.right = null; int cc = sentence.Count(f => f == Convert.ToChar(sentence_distinct.Substring(i, 1))); node.count = cc; node.check = 0; node.num_of_char = i + 1; last_num_of_char = i + 1; nodes_list.Add(node); } //sort list nodes_list = nodes_list.OrderBy(x => x.count).ToList(); //create new nodes #region create new nodes for (int i = 0; i < sentence_distinct.Length - 1; i++) { //select first 2 elements that not checked List <nodes> new_node = new List <nodes>(); //new_node = nodes_list.Where(x=> x.check==0).Take(2).ToList(); nodes node1 = new nodes(); nodes node2 = new nodes(); nodes new_node_genrated = new nodes(); foreach (var item in nodes_list.Where(x => x.check == 0).Take(1).ToList()) { node1.str = item.str; node1.left = item.left; node1.right = item.right; node1.count = item.count; node1.periroity = item.periroity; node1.check = 1; item.check = 1; node1.num_of_char = item.num_of_char; } foreach (var item in nodes_list.Where(x => x.check == 0).Take(1).ToList()) { node2.str = item.str; node2.left = item.left; node2.right = item.right; node2.count = item.count; node2.periroity = item.periroity; node2.check = 1; item.check = 1; node2.num_of_char = item.num_of_char; } if (node1.num_of_char < node2.num_of_char) { MessageBox.Show(node1.num_of_char.ToString() + "<" + node2.num_of_char.ToString() + " case1"); new_node_genrated = nodes.create_new_node(node1, node2, i + 1, node2.num_of_char); } else { MessageBox.Show(node1.num_of_char.ToString() + ">" + node2.num_of_char.ToString() + " case2"); new_node_genrated = nodes.create_new_node(node2, node1, i + 1, node1.num_of_char); } nodes_list.Add(new_node_genrated); //sort array nodes_list = nodes_list.OrderBy(x => x.count).ToList(); screen_text.Text += "##############################New Level#############################" + "\n"; foreach (var item in nodes_list) { screen_text.Text += (item.str + " LEFT: " + item.left + " RIGHT: " + item.right + " COUNT: " + item.count + " PERIORITY: " + item.periroity + " CHECK: " + item.check + " Num OF CHAR: " + item.num_of_char + "\n"); screen_text.Text += ("__________________________________________________________________" + "\n"); } } #endregion //extract the code List <nodes> primary_nodes = new List <nodes>(); primary_nodes = nodes_list.Where(x => x.periroity == 0).ToList(); for (int i = 0; i < sentence_distinct.Length; i++) { string code = ""; string str = primary_nodes.First().str; //string str="a"; List <nodes> searched_for_str = nodes_list.Where(x => x.str.Contains(str)).ToList(); searched_for_str.OrderBy(x => x.periroity); foreach (var item in searched_for_str) { if (str == item.left) { code += "0"; str = item.str; } if (str == item.right) { code += "1"; str = item.str; } } screen_text.Text += ("Code of " + primary_nodes.First().str + " is= " + Reverse(code) + "\n"); primary_nodes.RemoveAt(0); } }