HỒ CHÍ MINH UEHTRƯỜNG CÔNG NGHỆ VÀ THIẾT KẾĐỒ ÁN MÔN HỌCĐỀ TÀIỨNG DỤNG CẤU TRÚC DICTIONARY ĐỂ TẠO MỘT BỘ TỪ ĐIỂN ANH - VIỆTHọc Phần: Cấu Trúc Dữ Liệu & Giải ThuậtDanh Sách Nhóm: 1.. LỜI
CẤU TRÚC TỪ ĐIỂN
Các khái niệm liên quan
Dictionary trong C# là một Collections lưu trữ dữ liệu dưới dạng cặp Key - Value Key đại diện cho một khoá giống như chỉ số phần tử của mảng và Value chính là giá trị tương ứng của khoá đó Ta sẽ dử dụng Key để truy cập đến Value tương ứng.
Dưới đây là một số thuộc tính và phương thức thông dụng trong Dictionary:
Count: Trả về một số nguyên là số phần tử hiện có trong Dictionary Keys: Trả về một danh sách chứa các Key trong Dictionary.
Values: Trả về một danh sách chứa các Value trong Dictionary.
Add(TKey Key, TValue Value): Thêm một cặp Key - Value vào Dictionary.
Clear(): Xoá tất cả các phần tử trong Dictionary.
ContainsKey(TKey Key): Kiểm tra đối tượng Key có tồn tại trong Dictionary hay không.
ContainsValue(TValue Value): Kiểm tra đối tượng Value có tồn tại trong Dictionary hay không.
Remove (TKey Key): Xoá đối tượng có Key xuất hiện đầu tiên trong Dictionary.
Do Dictionary là một Generic Collections nên để sử dụng ta cần thêm thư viện System.Collections.Generic bằng câu lệnh: using System.Collections.Generic;
Cấu trúc và cài đặt Từ điển
Cấu trúc: Dictionary trong C# là một Collections lưu trữ dữ liệu dưới dạng cặp Key - Value Key đại diện cho một khoá giống như chỉ số phần tử của mảng và Value chính là giá trị tương ứng của khoá đó Các key phải là duy nhất và không được để trống Value có thể trùng lặp và có thể là giá trị null Các Value có thể được truy cập thông qua key của nó.
Cài đặt : public class : DictionaryBase
{ public void Add( Words, Meaning)
{ base.InnerHashtable.Add(Words, Meaning);
Các thuật toán trên Từ điển
a) Thuật toán 1: public bool Contains(string Words)
{ return base.InnerHashtable.Contains(Words);
- Là thuật toán kiểm tra xem từ nhập vào có tồn tại trong từ điển không b) Thuật toán 2: public string Print(string Words)
(if base.InnerHashtable.Contains(Words))
{ return ((WordsDict.Words)base.InnerHashtable[Words]).ToString();
{ return"Không có từ này";
- Là thuật toán kiểm tra xem từ nhập vào có trong từ điển không, nếu có thì in ra dữ liệu theo hàm ở trong class WordsDict
PHÂN TÍCH VÀ THIẾT KẾ LỚP
Phân tích bài toán Ứng dụng cấu trúc Dictionary để tạo ra 1 từ điển Anh-Việt
Ban đầu nhóm hình dung ra trong từ điển Anh-Việt mà nhóm muốn xây dựng có những chức năng gì Sau khi thảo luận thì nhóm em thống nhất từ điển ấy sẽ có bốn chức năng: a) Tra nghĩa từ vựng (Search) b) Tra từ đồng nghĩa của từ vựng (Syn) c) Tra từ trái nghĩa của từ vựng (Ant) d) Tạo ra một danh sách những từ mà người dùng lưu lại (MyDict)
Hình 1 - Các chức năng trong từ điển
2.1.2 Các tài nguyên cần thiết:
Từ điều trên, nhóm đưa ra ý tưởng rằng sẽ cần một List và ba Dictionary để lưu trữ: a) List để lưu từ vựng cho comboBox b) Một Dictionary để lưu nghĩa của từ vựng c) Một Dictionary để lưu từ đồng nghĩa của từ vựng d) Dictionary để lưu từ trái nghĩa của từ vựng
2.1.3 Nhập liệu: Để có dữ liệu đưa vào List và các Dictionary, nhóm đã tạo ra một từ điển ở Notepad với cú pháp như sau:
Từ_vựng-từ_loại-phát_âm-nghĩa=Các_từ_đồng_nghĩa#Các_từ_trái_nghĩa
Sau đó nhóm sử dụng các câu lệnh trong C# để có thể đưa các từ vựng vào List và cácDictionary theo đúng ý tưởng và cuối cùng là trình bày giao diện trên Winform.
Sơ đồ lớp
Nhóm đã chia chương trình thành 3 lớp, đó là “WordsDict”,”Setup” “AllDict” Trong lớp
“WordsDict”, nhóm tiếp tục chia thành ba lớp nhỏ là “Words”, “WordsSyn” và
“WordsAnt” Lớp “Setup” cũng tương tự vầy, chia thành 3 lớp nhỏ là “Dict”, “DictSyn” và “DictAnt” Tuy nhiên, các class nhỏ ấy có sơ đồ khối tương tự nhau nên em chỉ đưa ra
1 class nhỏ, cụ thể như sau:
Hình 3 - Lớp WordDict Lớp nhỏ trong lớp “WordsDict”:
Hình 5 - Lớp Setup Lớp nhỏ trong lớp “Setup”:
Cài đặt lớp
2.3.1 Lớp “WordsDict”: internal class WordsDict
{ public string Word { get set; ; } public string Meaning { get set; ; } publicWords(string word, string mean)
{ return$"{Word}" + Environment.NewLine + $"{Meaning}"; }
{ public string Word { get set; ; } public string WordSyn { get set; ; } publicWordsSyn(string word, string wordsyn)
{ return$"{Word}" + Environment.NewLine + $"{WordSyn}"; }
{ public string Word { get set; ; } public string WordAnt { get set; ; } publicWordsAnt(string word, string wordant)
{ return$"{Word}" + Environment.NewLine + $"{WordAnt}"; }
2.3.2 Lớp “Setup”: internal class Setup
{ public void Add(string Words, WordsDict.Words Meaning) { base.InnerHashtable.Add(Words, Meaning);
} public bool Contains(string Words)
{ return base.InnerHashtable.Contains(Words);
} public string Item(string Words)
(if base.InnerHashtable.Contains(Words))
{ return ((WordsDict.Words)base.InnerHashtable[Words]).ToString(); } else
{ return"Không có từ này";
{ public void Add(string Words, WordsDict.WordsSyn Syn)
{ base.InnerHashtable.Add(Words, Syn);
} public bool Contains(string Words)
{ return base.InnerHashtable.Contains(Words);
} public string Item(string Words)
(if base.InnerHashtable.Contains(Words))
{ return ((WordsDict.WordsSyn)base.InnerHashtable[Words]).ToString(); } else
{ return"Không có đồng nghĩa từ này";
{ public void Add(string Words, WordsDict.WordsAnt Ant)
{ base.InnerHashtable.Add(Words, Ant);
} public bool Contains(string Words)
{ return base.InnerHashtable.Contains(Words);
} public string Item(string Words)
(if base.InnerHashtable.Contains(Words))
{ return ((WordsDict.WordsAnt)base.InnerHashtable[Words]).ToString(); } else
{ return"Không có trái nghĩa từ này";
* Trước hết phải có thư viện: using System.IO; internal class AllDict
{ public List mylist = new List(); public List listdict = new List(); public void LoadDataFromFile(string filePath)
{ string[] lines = File.ReadAllLines(filePath); n = 0;int foreach string ( line lines)in
(parts[0].Trim().ToUpper() == a.ToUpper())if { n++;
{ listdict.Add(parts[0].Trim().ToUpper()); } n = 0;
MessageBox.Show("Lỗi: " + ex.Message); }
} public Setup.Dict dict = new Setup.Dict(); public void LoadDataFromFileMean(string filePath) { try
{ string[] lines = File.ReadAllLines(filePath); foreach string ( word listdict)in
List listmean = new List(); StringBuilder meaningsBuilder = new StringBuilder(); foreach string ( line lines)in
{ string[] parts = line.Split('='); string[] parts1 = line.Split('#');
(part1[0].Trim().ToUpper() == word)if { string temp = string.Empty; for int ( i = 1; i < part1.Length; i++) { temp += "-" + part1[i].Trim();
(part1[0].Trim().ToUpper() == word)if
{ string temp = string.Empty; for int ( i = 1; i < part1.Length; i++)
(part1[0].Trim().ToUpper() == word)if
{ string temp = string.Empty; for int ( i = 1; i < part1.Length; i++)
} foreach string ( mean listmean)in
{ dict.Add(word, new Words(word, meaningsBuilder.ToString())); }
MessageBox.Show("Lỗi: " + ex.Message);
} public Setup.DictSyn dictsyn = new Setup.DictSyn(); public void LoadDataFromFileSyn(string filePath)
{ string[] lines = File.ReadAllLines(filePath); foreach string ( word listdict)in
List listsyn = new List();
StringBuilder synsBuilder = new StringBuilder(); foreach string ( line lines)in
(part1[0].Trim().ToUpper() == word)if
{ string temp = string.Empty; temp = + part1[1] + "." "=" + part1[1]; listsyn.Add(temp);
(part1[0].Trim().ToUpper() == word)if
{ string temp = string.Empty; temp = + part1[1] + "." "=" + parts[1]; listsyn.Add(temp);
} foreach string ( mean listsyn)in
{ dictsyn.Add(word, new WordsSyn(word, synsBuilder.ToString())); }
Console.WriteLine("Lỗi: " + ex.Message);
} public Setup.DictAnt dictant = new Setup.DictAnt(); public void LoadDataFromFileAnt(string filePath)
{ string[] lines = File.ReadAllLines(filePath); foreach string ( word listdict)in
List listant = new List();
StringBuilder antsBuilder = new StringBuilder(); foreach string ( line lines)in
(part1[0].Trim().ToUpper() == word)if
{ string temp = string.Empty; temp = + part1[1] + "." "#" + parts[1]; listant.Add(temp);
} foreach string ( mean listant)in
{ dictant.Add(word, new WordsAnt(word, antsBuilder.ToString())); }
MessageBox.Show("Lỗi: " + ex.Message);
} public string SearchWord(string userInput)
{ string inputKey = userInput.Trim().ToUpper();
{ return"Không có từ này";
} public string SearchWordSyn(string userInput)
{ string inputKey = userInput.Trim().ToUpper();
{ return"Không có đồng nghĩa từ này";
} public string SearchWordAnt(string userInput)
{ string inputKey = userInput.Trim().ToUpper();
{ return"Không có trái nghĩa từ này";
2.3.3 Cài đặt ở Form.cs: public partial class Form1 : Form
InitializeComponent(); allDict = new AllDict(); allDict.dict.Clear(); allDict.dictsyn.Clear(); allDict.dictant.Clear(); allDict.LoadDataFromFile(@"D:\Bài tập để nộp\dictfinal.txt"); allDict.LoadDataFromFileMean(@"D:\Bài tập để nộp\dictfinal.txt"); allDict.LoadDataFromFileSyn(@"D:\Bài tập để nộp\dictfinal.txt"); allDict.LoadDataFromFileAnt(@"D:\Bài tập để nộp\dictfinal.txt"); comboBox1.Items.Clear();
List words = new List(); words.Add("- Chào mừng đến với nhóm 3"); foreach string in ( a allDict.listdict)
} private void Search_Click(object sender, EventArgs e)
{ richTextBox1.Text = string.Empty; richTextBox1.Text = allDict.SearchWord(comboBox1.Text); } private void Meaning_Click(object sender, EventArgs e) { richTextBox1.Text = string.Empty; richTextBox1.Text = allDict.SearchWord(comboBox1.Text); } private void Syn_Click(object sender, EventArgs e)
{ richTextBox1.Text = string.Empty; richTextBox1.Text = allDict.SearchWordSyn(comboBox1.Text); } private void Ant_Click(object sender, EventArgs e)
{ richTextBox1.Text = string.Empty; richTextBox1.Text = allDict.SearchWordAnt(comboBox1.Text); } private void Add_Click(object sender, EventArgs e)
(richTextBox1.Text != if string.Empty)
{ string word = richTextBox1.Text; string worddict = comboBox1.Text; bool exists = allDict.mylist.Contains(word); bool existsdict = allDict.dict.Contains(worddict);
{ allDict.mylist.Add(richTextBox1.Text);
MessageBox.Show("Đã thêm từ vào danh sách!");
MessageBox.Show("Từ này đã tồn tại trong danh sách hoặc không có nghĩa!"); }
} private void MyDict_Click(object sender, EventArgs e)
{ richTextBox1.Text = string.Empty; foreach (var pair allDict.mylist)in
{ richTextBox1.Text += pair + Environment.NewLine;
THIẾT KẾ GIAO DIỆN
Giao diện menu chính
Chi tiết chức năng
ComboBox “-Chào mừng đến với nhóm 3”: nơi nhập từ vựng mà người dùng muốn tra cứu.
Button “Search”: khi click vào button này thì sẽ hiển thị nghĩa của từ vựng mà người dùng muốn tra cứu ở RichTextBox đang trống phía dưới.
Button “Syn”: khi click vào button này thì sẽ hiển thị những từ đồng nghĩa với từ vựng mà người dùng muốn tra cứu ở RichTextBox đang trống phía dưới.
Button “Ant”: khi click vào button này thì sẽ hiển thị những từ trái nghĩa với từ vựng mà người dùng muốn tra cứu ở RichTextBox đang trống phía dưới.
Button “Meaning”: tương tự với “Search” nhưng mục đích là để tiện hơn khi chuyển qua lại giữa “Syn”, “Ant” và “Meaning”.
Button “Add”: khi click sẽ thêm phần hiển thị ở RichTextBox vào danh sách những từ mà người dùng muốn lưu lại.
Button “MyDict”: khi click vào button này thì sẽ hiển thị những từ mà người dùng đã nhấn “Add”.
RichTextBox: nơi hiển thị những thông tin khi click các button.
THẢO LUẬN & ĐÁNH GIÁ
Các kết quả nhận được
4.1.1 Giao diện khi khởi động chương trình
Hình 7 - Giao diện khi khởi động chương trình
4.1.2 Tra nghĩa của từ vựng
Nhập từ vựng vào comboBox rồi ấn button “Search” hoặc “Meaning”.
Hình 8 - Tra nghĩa của từ vựng
4.1.3 Tra từ đồng nghĩa của từ vựng
Nhập từ vựng vào comboBox rồi ấn button “Syn”.
Hình 9 - Tra từ đồng nghĩa của từ vựng
4.1.4 Tra từ trái nghĩa của từ vựng
Nhập từ vựng vào comboBox rồi ấn button “Ant”.
Hình 10 - Tra từ trái nghĩa của từ vựng
4.1.5 Thêm dữ liệu về từ vựng vào danh sách từ điển của bản thân
Phải có dữ liệu của từ vựng muốn thêm ở RichTextBox và sau đó ấn button “Add”.
Hình 11 - Thêm từ vựng vào danh sách cá nhân
Hình 12 - Trường hợp từ vựng đã được thêm trước đó
4.1.6 Xem danh sách từ điển của bản thân
Nhấn vào button “MyDict” để xem danh sách cá nhân.
Hình 13 - Xem danh sách cá nhân
Một số tồn tại
a) Khi phóng to, thu nhỏ màn hình Form thì các control bên trong không thay đổi size (kích thước các control không phù hợp khi Form thay đổi). b) Khi nhấn vào các button thì chưa nổi bật (nghĩa là khi ấn 1 button nào đó thì nên có một dấu hiệu để cho người sử dụng biết rằng mình đang sử dụng chức năng của button đó). c) Vốn từ vựng còn khá khiêm tốn do không có nhiều thời gian nhập liệu d) Chưa có những ví dụ về cách sử dụng của từ vựng. e) Chưa có khả năng phát âm từ vựng.
Hướng phát triển
a) Tìm hiểu sâu về cách neo control, các Event để làm thay đổi size của control khi Form thay đổi để khắc phục tồn tại thứ nhất. b) Tìm hiểu cách thay đổi màu button khi click button ấy. c) Cần thêm thời gian để sưu tầm và chắt lọc nhiều từ vựng hơn. d) Có thể sẽ tạo ra thêm một từ điển chứa từ vựng ở trong từ điển ban đầu để làm nguồn Hoặc thêm ví dụ vào ngay dòng từ vựng của từ điển ban đầu. e) Cần thời gian lưu trữ lại các phát âm của từng từ vựng và chèn vào chúng.