课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接
【项目3-OOP版电子词典】(本程序需要的相关文件,请到http://pan.baidu.com/s/1qW59HTi下载。)
做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文、中文释义与词性间用’\t’隔开。
编程序,由用户输入英文词,显示词性和中文释义。
【项目3拓展1(选做)】使这个词典,读入一篇文章,输出对其中的所词的解释。例如,对aboutcpp.txt,输出如下左图结果所示(也可以看到其中待改进的地方)。
【项目3拓展2(选做)】试用wxwidgets做一个窗口版的电子词典,如下右图所示:
本文是拓展2的参考解答:
一个程序中,最基本的是其业务。先定义词(Word)类和字典(Dictionary)类如下:
dict.h
#ifndef DICT_H_INCLUDED #define DICT_H_INCLUDED using namespace std; //定义词条类 class Word { public: void set(string e, string c, string wc); int compare(string); //英语部分与给定字符串比较,等于返回,大于返回,小于返回-1 string getChinese(); string getWord_class(); private: string english; string chinese; string word_class; }; //定义字典类 class Dictionary { public: Dictionary(); string searchWord(string k); private: int BinSeareh(int low, int high, string k); int wordsNum; Word words[8000]; //用于保存词库 }; #endif // DICT_H_INCLUDED
#include <fstream> #include <cstdlib> #include "dict.h" using namespace std; void Word::set(string e, string c, string wc) { english=e; chinese=c; word_class=wc; } int Word::compare(string k) { return english.compare(k); } string Word::getChinese() { return chinese; } string Word::getWord_class() { return word_class; } Dictionary::Dictionary() { string e,c,wc; wordsNum=0; //将文件中的数据读入到对象数组中 ifstream infile("dictionary.txt",ios::in); //以输入的方式打开文件 if(!infile) //测试是否成功打开 { //cout<<"dictionary open error!"<<endl; exit(1); } while (!infile.eof()) { infile>>e>>c>>wc; words[wordsNum].set(e, c, wc); ++wordsNum; } infile.close(); } int Dictionary::BinSeareh(int low, int high, string key) { int mid; while(low<=high) { mid=(low + high) / 2; if(words[mid].compare(key)==0) { return mid; //查找成功返回 } if(words[mid].compare(key)>0) high=mid-1; //继续在w[low..mid-1]中查找 else low=mid+1; //继续在w[mid+1..high]中查找 } return -1; //当low>high时表示查找区间为空,查找失败 } string Dictionary::searchWord(string key) { int low=0,high=wordsNum-1; //置当前查找区间上、下界的初值 int index=BinSeareh(low, high, key); if(index>=0) return words[index].getWord_class()+words[index].getChinese(); else return "查无此词"; }
可以按wxWidgets教程(见http://blog.csdn.net/sxhelijian/article/details/26158709),通过代码制作界面,简单的办法是用wxSmith。作为专业学生,应该学会代码,以掌握类库工作的原理,但要快速开发,wxSmith也提倡使用。
在code::Blocks中,点菜单wxSmith-->Add wxFrame,制作好的界面如下。本文中,对应的资源文件名是dictFrame.wxs:
在生成如上界面的同时,产生两个文件:dictFrame.h和dictFrame.cpp。.wxs文件资源文件的目标也就是生成这两个文件,这是应用程序中的代码部分。
下面列出的是这两个文件中的内容,大部分由框架提供,需要自加的部分,给出了注释。
dictFrame.h
#ifndef DICTFRAME_H #define DICTFRAME_H //(*Headers(dictFrame) #include <wx/stattext.h> #include <wx/textctrl.h> #include <wx/panel.h> #include <wx/button.h> #include <wx/frame.h> //*) #include "dict.h" //自己加,要用到字典类 class dictFrame: public wxFrame { public: dictFrame(wxWindow* parent,wxWindowID id=wxID_ANY,const wxPoint& pos=wxDefaultPosition,const wxSize& size=wxDefaultSize); virtual ~dictFrame(); //(*Declarations(dictFrame) wxStaticText* StaticText2; wxButton* Button1; wxPanel* Panel1; wxStaticText* StaticText1; wxTextCtrl* TextCtrl2; wxTextCtrl* TextCtrl1; //*) protected: //(*Identifiers(dictFrame) static const long ID_TEXTCTRL1; static const long ID_BUTTON1; static const long ID_STATICTEXT1; static const long ID_TEXTCTRL2; static const long ID_STATICTEXT2; static const long ID_PANEL1; //*) private: Dictionary dict; //自己加:将字典类对象作为Frame类的成员 //(*Handlers(dictFrame) void OnButton1Click(wxCommandEvent& event); void OnClose(wxCloseEvent& event); //*) DECLARE_EVENT_TABLE() }; #endif
#include "dictFrame.h" #include "dict.h" //(*InternalHeaders(dictFrame) #include <wx/intl.h> #include <wx/string.h> //*) //(*IdInit(dictFrame) const long dictFrame::ID_TEXTCTRL1 = wxNewId(); const long dictFrame::ID_BUTTON1 = wxNewId(); const long dictFrame::ID_STATICTEXT1 = wxNewId(); const long dictFrame::ID_TEXTCTRL2 = wxNewId(); const long dictFrame::ID_STATICTEXT2 = wxNewId(); const long dictFrame::ID_PANEL1 = wxNewId(); //*) BEGIN_EVENT_TABLE(dictFrame,wxFrame) //(*EventTable(dictFrame) //*) END_EVENT_TABLE() dictFrame::dictFrame(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size):dict() //加上对子对象dict的初始化,读入字典 { //(*Initialize(dictFrame) Create(parent, id, _("我的字典"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id")); SetClientSize(wxSize(354,111)); Move(wxDefaultPosition); Panel1 = new wxPanel(this, ID_PANEL1, wxPoint(64,56), wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1")); TextCtrl1 = new wxTextCtrl(Panel1, ID_TEXTCTRL1, wxEmptyString, wxPoint(64,32), wxSize(192,22), 0, wxDefaultValidator, _T("ID_TEXTCTRL1")); Button1 = new wxButton(Panel1, ID_BUTTON1, _("查字典"), wxPoint(264,32), wxSize(51,24), 0, wxDefaultValidator, _T("ID_BUTTON1")); StaticText1 = new wxStaticText(Panel1, ID_STATICTEXT1, _("释义"), wxPoint(32,72), wxDefaultSize, 0, _T("ID_STATICTEXT1")); TextCtrl2 = new wxTextCtrl(Panel1, ID_TEXTCTRL2, wxEmptyString, wxPoint(64,64), wxSize(192,22), 0, wxDefaultValidator, _T("ID_TEXTCTRL2")); TextCtrl2->Disable(); StaticText2 = new wxStaticText(Panel1, ID_STATICTEXT2, _("英文"), wxPoint(32,40), wxDefaultSize, 0, _T("ID_STATICTEXT2")); Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&dictFrame::OnButton1Click); //*) TextCtrl1->SetFocus (); //自己加:希望输入英文的文本框获得“焦点” } dictFrame::~dictFrame() { //(*Destroy(dictFrame) //*) } void dictFrame::OnButton1Click(wxCommandEvent& event) { //函数由增加事件处理生成,但函数体要自己实现 string s=string(TextCtrl1->GetLineText(0)); //获得文本框中文字 wxString ws = dict.searchWord(s); //查字典 TextCtrl2->SetLabelText(ws); //在另一个文本框中显示查询结果 }
每一个wxWidgets程序都要写下面的代码。按套路来就行:
MyApp.h
#include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); };
#include "MyApp.h" #include "dictFrame.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { dictFrame *mydict = new dictFrame(NULL); mydict->Show(true); return true; }
本文程序的运行截图:
关于wxWidgets的入门知识及学习方法指导,见:http://blog.csdn.net/sxhelijian/article/details/26158709
如果在编译和连接中遇到问题,见:http://blog.csdn.net/sxhelijian/article/details/26164181
关于wxSmith,见http://blog.csdn.net/sxhelijian/article/details/26165237
程序运行不出现窗口直接结束,最大的可能是:字典文件不能读入。注意这个应用需要用到字典文件dictionary.txt,从 下载,并将这个文件复制到项目所在文件夹中。
================= 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |