版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> MFC表達(dá)式計算器課程設(shè)計報告</p><p> 題目:利用MFC框架編寫簡易表達(dá)式計算器</p><p><b> 【分析】</b></p><p><b> 一.設(shè)計過程</b></p><p> 1.Windows消息處理機(jī)制的理解 </p><
2、;p> 首先編寫程序需要對Windows程序的消息處理機(jī)制(Message Handle)有個比較清晰的了解。Windows的程序都是通過消息來傳送數(shù)據(jù),有不需要用戶參與的系統(tǒng)消息,比如異常處理等。還有用戶消息,比如鼠標(biāo)的單擊,雙擊,鍵盤的鍵入等。</p><p> 2.界面的設(shè)計1)界面的初步設(shè)計</p><p> 仿照Windows附件里面的計算器,在資源視圖中畫好界面,
3、如圖:</p><p> 2)修改每個static的屬性</p><p> 3)修改每個button的屬性</p><p><b> 結(jié)果如下圖:</b></p><p> 4)修改每個button的處理機(jī)制</p><p> 在類向?qū)lasswizard窗口中進(jìn)行,如下圖:</
4、p><p> 其他button按鈕的修改類似</p><p> 5)修改每個edit的類型和名稱</p><p> 在類向?qū)lasswizard窗口中進(jìn)行:</p><p> 單擊Add Variable按鈕,在如下窗口中進(jìn)行修改</p><p> 其他edit的修改類似</p><p>
5、;<b> 最終結(jié)果如下:</b></p><p> 注:主要使用到Layout菜單中的Align功能對各個按鈕進(jìn)行對齊,使界面更加整潔。拖出的控件有上面的一個Edit控件用于顯示數(shù)字,Button控件用于處理鼠標(biāo)的消息。</p><p><b> 6)系統(tǒng)菜單的添加</b></p><p> 在Menu的IDR_
6、MENU1中添加系統(tǒng)菜單:</p><p> 同理在“幫助”菜單中添加“關(guān)于”。</p><p><b> 設(shè)計步驟</b></p><p><b> 1. 添加頭文件</b></p><p> 將Calculate.cpp(見附錄)改為Calculate.h將其添加到計算器Dlg.cpp
7、: implementation file中,如下:#include "Calculate.h"。</p><p> 2.成員函數(shù)及其釋義:</p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p>
8、<p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CAboutDlg)</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAbout
9、Dlg, CDialog)</p><p> //{{AFX_MSG_MAP(CAboutDlg)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////
10、////////////////////</p><p> // CMyDlg dialog</p><p> CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CMyDlg::IDD, pParent)</p><p><b> {</b>&l
11、t;/p><p> //{{AFX_DATA_INIT(CMyDlg)</p><p> // NOTE: the ClassWizard will add member initialization here</p><p> //}}AFX_DATA_INIT</p><p> // Note that LoadIcon does n
12、ot require a subsequent DestroyIcon in Win32</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p><b> }</b></p><p> void CMyDlg::DoDataExchange(CDataExch
13、ange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CMyDlg)</p><p> DDX_Control(pDX, IDC_EDIT3, m_time);</p>
14、;<p> DDX_Control(pDX, IDC_EDIT2, m_result);</p><p> DDX_Control(pDX, IDC_EDIT1, m_input);</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEG
15、IN_MESSAGE_MAP(CMyDlg, CDialog)</p><p> //{{AFX_MSG_MAP(CMyDlg)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p> ON_WM_QUERYDRAGICON()</p><p>
16、 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)</p><p> ON_BN_CLICKED(IDC_BUTTON2, OnButton2)</p><p> ON_WM_TIMER()</p><p> ON_BN_CLICKED(IDC_BUTTON3, OnButton3)</p><p> ON_
17、COMMAND(ID_ABOUT, OnAbout)</p><p> ON_COMMAND(ID_QUIT, OnQuit)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> ///////////////////////////////////////////
18、/////////////////////////////////</p><p> // CMyDlg message handlers</p><p> 3.OnButton1()按鈕的處理函數(shù)</p><p> 雙擊“等于(=)”按鈕,添加如下代碼:</p><p> void CMyDlg::OnButton1() </
19、p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> CString str;</p><p><b> char *ch;</b></p><p
20、> m_input.GetWindowText(str);</p><p> ch = (LPSTR)(LPCTSTR)str;</p><p> char ch2[50];</p><p> strcpy(ch2,ch);</p><p> Cal a(ch2);</p><p><b>
21、 if(!a.OK)</b></p><p> {m_result.SetWindowText("表達(dá)式不合法!");// 表達(dá)式不合法,判別出來并給出相應(yīng)的錯誤提示</p><p><b> }</b></p><p><b> else</b></p><p&g
22、t; {if(a.Sign)</p><p> {m_result.SetWindowText("除數(shù)為零!");// 表達(dá)式不合法,可以判別出來并給出相應(yīng)的錯誤提示</p><p><b> }</b></p><p><b> else</b></p><p> {
23、str.Format("%lf",a.GetV());</p><p> m_result.SetWindowText(str);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
24、;/p><p> 以O(shè)nButton1()作為求值處理函數(shù),函數(shù)的功能是單擊等于(=)按鈕,運(yùn)算結(jié)果顯示在IDC_EDIT2中</p><p> 4.OnButton2()按鈕的處理函數(shù)</p><p> 雙擊“清除(C)”按鈕,添加如下代碼:</p><p> void CMyDlg::OnButton2() </p>&
25、lt;p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> m_result.SetWindowText("0");</p><p> m_input.SetWindowText("
26、;");</p><p> m_input.SetFocus();</p><p><b> } </b></p><p> // 函數(shù)的功能是把上次輸入的表達(dá)式清空</p><p> 5.OnButton3()按鈕的處理函數(shù)</p><p> 雙擊“全清(A)”按鈕,添加如下
27、代碼:</p><p> void CMyDlg::OnButton3() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> m_input.SetWindowText(&q
28、uot;");</p><p> m_input.SetFocus();</p><p><b> }</b></p><p> //函數(shù)的功能是把上次輸入的表達(dá)式和運(yùn)算結(jié)果都清除</p><p> 6.OnTimer(UINT nIDEvent) 處理函數(shù)</p><p>
29、CWnd::SetTimer(1,500,NULL);//設(shè)置時間每隔500ms更新一次。</p><p> void CMyDlg::OnTimer(UINT nIDEvent) </p><p><b> {</b></p><p> // TODO: Add your message handler code here and/or
30、 call default</p><p> CString ch[] = {"日","一","二","三","四","五","六"};</p><p> SYSTEMTIME st;</p><p> ::GetLoca
31、lTime(&st);</p><p> CString str_temp;</p><p> str_temp.Format("%u/%u/%u 星期"+ch[st.wDayOfWeek]+" %u:%u:%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
32、</p><p> m_time.SetWindowText(str_temp);</p><p> CDialog::OnTimer(nIDEvent);</p><p> }//函數(shù)的功能是把運(yùn)算結(jié)果顯示在IDC_EDIT3中</p><p> 7.OnAbout()處理函數(shù)</p><p> void
33、CMyDlg::OnAbout() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> CAboutDlg about;</p><p> about.DoModal();</p><
34、;p><b> }</b></p><p> //關(guān)于幫助和版權(quán)信息</p><p> 8.OnQuit()處理函數(shù)</p><p> void CMyDlg::OnQuit() </p><p><b> {</b></p><p> // TODO: A
35、dd your command handler code here</p><p><b> OnOK();</b></p><p><b> }</b></p><p><b> //退出主程序菜單</b></p><p><b> 9.全部代碼如下:<
36、;/b></p><p> // 計算器Dlg.cpp : implementation file</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "計算器.h"</p>
37、<p> #include "計算器Dlg.h"</p><p> #include "Calculate.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE<
38、/p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p&
39、gt; // CAboutDlg dialog used for App About</p><p> class CAboutDlg : public CDialog</p><p><b> {</b></p><p><b> public:</b></p><p> CAboutD
40、lg();</p><p> // Dialog Data</p><p> //{{AFX_DATA(CAboutDlg)</p><p> enum { IDD = IDD_ABOUTBOX };</p><p> //}}AFX_DATA</p><p> // ClassWizard generate
41、d virtual function overrides</p><p> //{{AFX_VIRTUAL(CAboutDlg)</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support</p><p
42、> //}}AFX_VIRTUAL</p><p> // Implementation</p><p> protected:</p><p> //{{AFX_MSG(CAboutDlg)</p><p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP()<
43、;/p><p><b> };</b></p><p> CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b> {</b></p><p> //{{AFX_DATA_INIT(CAboutDlg)</p>&l
44、t;p> //}}AFX_DATA_INIT</p><p><b> }</b></p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoD
45、ataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CAboutDlg)</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p>
46、<p> //{{AFX_MSG_MAP(CAboutDlg)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////<
47、/p><p> // CMyDlg dialog</p><p> CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CMyDlg::IDD, pParent)</p><p><b> {</b></p><p> //{
48、{AFX_DATA_INIT(CMyDlg)</p><p> // NOTE: the ClassWizard will add member initialization here</p><p> //}}AFX_DATA_INIT</p><p> // Note that LoadIcon does not require a subsequent
49、DestroyIcon in Win32</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p><b> }</b></p><p> void CMyDlg::DoDataExchange(CDataExchange* pDX)</p>&l
50、t;p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CMyDlg)</p><p> DDX_Control(pDX, IDC_EDIT3, m_time);</p><p> DDX_Contro
51、l(pDX, IDC_EDIT2, m_result);</p><p> DDX_Control(pDX, IDC_EDIT1, m_input);</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CMyDlg, C
52、Dialog)</p><p> //{{AFX_MSG_MAP(CMyDlg)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p> ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(IDC_BUTTO
53、N1, OnButton1)</p><p> ON_BN_CLICKED(IDC_BUTTON2, OnButton2)</p><p> ON_WM_TIMER()</p><p> ON_BN_CLICKED(IDC_BUTTON3, OnButton3)</p><p> ON_COMMAND(ID_ABOUT, OnAbou
54、t)</p><p> ON_COMMAND(ID_QUIT, OnQuit)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> ///////////////////////////////////////////////////////////////////
55、//////////</p><p> // CMyDlg message handlers</p><p> BOOL CMyDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p>
56、 // Add "About..." menu item to system menu.</p><p> // IDM_ABOUTBOX must be in the system command range.</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><
57、;p> ASSERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)</p><p><b> {</b></p><p> CString
58、 strAboutMenu;</p><p> strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMenu.IsEmpty())</p><p><b> {</b></p><p> pSysMenu->AppendMenu(MF_S
59、EPARATOR);</p><p> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }</b></p><p> // Set the icon
60、 for this dialog. The framework does this automatically</p><p> // when the application's main window is not a dialog</p><p> SetIcon(m_hIcon, TRUE);// Set big icon</p><p&g
61、t; SetIcon(m_hIcon, FALSE);</p><p> // Set small icon</p><p> m_Mu.LoadMenu(IDR_MENU2);</p><p> SetMenu(&m_Mu);</p><p> CWnd::SetTimer(1,500,NULL);</p>
62、<p> // TODO: Add extra initialization here</p><p> return TRUE; // return TRUE unless you set the focus to a control</p><p><b> }</b></p><p> void CMyDlg::On
63、SysCommand(UINT nID, LPARAM lParam)</p><p><b> {</b></p><p> if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b> {</b></p><p> CAboutDlg dlgA
64、bout;</p><p> dlgAbout.DoModal();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnSysComm
65、and(nID, lParam);</p><p><b> }</b></p><p><b> }</b></p><p> // If you add a minimize button to your dialog, you will need the code below</p><p&
66、gt; // to draw the icon. For MFC applications using the document/view model,</p><p> // this is automatically done for you by the framework.</p><p> void CMyDlg::OnPaint() </p><
67、p><b> {</b></p><p> if (IsIconic())</p><p><b> {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> SendMessage(WM_IC
68、ONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p><p> // Center icon in client rectangle</p><p> int cxIcon = GetSystemMetrics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_
69、CYICON);</p><p> CRect rect;</p><p> GetClientRect(&rect);</p><p> int x = (rect.Width() - cxIcon + 1) / 2;</p><p> int y = (rect.Height() - cyIcon + 1) / 2;<
70、;/p><p> // Draw the icon</p><p> dc.DrawIcon(x, y, m_hIcon);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>&l
71、t;/p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b></p><p> // The system calls this to obtain the cursor to display while the user
72、 drags</p><p> // the minimized window.</p><p> HCURSOR CMyDlg::OnQueryDragIcon()</p><p><b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p&g
73、t;<b> }</b></p><p> void CMyDlg::OnButton1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> CSt
74、ring str;</p><p><b> char *ch;</b></p><p> m_input.GetWindowText(str);</p><p> ch = (LPSTR)(LPCTSTR)str;</p><p> char ch2[50];</p><p> str
75、cpy(ch2,ch);</p><p> Cal a(ch2);</p><p><b> if(!a.OK)</b></p><p><b> {</b></p><p> m_result.SetWindowText("表達(dá)式不合法!");</p>&
76、lt;p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(a.Sign)</p><p><b> {</b></p><p> m_
77、result.SetWindowText("除數(shù)為零!");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> str.Format("%lf"
78、;,a.GetV());</p><p> m_result.SetWindowText(str);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void
79、CMyDlg::OnTimer(UINT nIDEvent) </p><p><b> {</b></p><p> // TODO: Add your message handler code here and/or call default</p><p> CString ch[] = {"日","一
80、","二","三","四","五","六"};</p><p> SYSTEMTIME st;</p><p> ::GetLocalTime(&st);</p><p> CString str_temp;</p><p&
81、gt; str_temp.Format("%u/%u/%u 星期"+ch[st.wDayOfWeek]+" %u:%u:%u\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);</p><p> m_time.SetWindowText(str_temp);</p><p&g
82、t; CDialog::OnTimer(nIDEvent);</p><p><b> }</b></p><p> void CMyDlg::OnButton2() </p><p><b> {</b></p><p> // TODO: Add your control notifi
83、cation handler code here</p><p> m_result.SetWindowText("0");</p><p> m_input.SetWindowText("");</p><p> m_input.SetFocus();</p><p><b> }
84、 </b></p><p> void CMyDlg::OnButton3() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> m_input.SetWindo
85、wText("");</p><p> m_input.SetFocus();</p><p><b> }</b></p><p> void CMyDlg::OnAbout() </p><p><b> {</b></p><p> //
86、TODO: Add your command handler code here</p><p> CAboutDlg about;</p><p> about.DoModal();</p><p><b> }</b></p><p> void CMyDlg::OnQuit() </p>&l
87、t;p><b> {</b></p><p> // TODO: Add your command handler code here</p><p><b> OnOK();</b></p><p><b> }</b></p><p><b> 三
88、.總結(jié):</b></p><p> 在設(shè)計當(dāng)中我認(rèn)識到開發(fā)一項好的軟件不是某一個人就能完成的任務(wù)。一個團(tuán)隊的小組,一個勤奮的小組非常重要,溝通是解決問題的就好辦法。俗話也說得好:“不怕虎一樣的敵人,就怕豬一樣的隊伍”。所以小組中的每個成員的能力與協(xié)作能力也是致關(guān)重要的。同時,不僅是團(tuán)隊內(nèi)部的交流,更多需要協(xié)調(diào)好團(tuán)隊之間的交流。</p><p> 其次呢,在設(shè)計過程中我了解了
89、,在開發(fā)一個項目時一定要先做好規(guī)劃,按照軟件的開發(fā)過程,詳細(xì)地寫好每一個必要的文檔。一般的規(guī)則是,寫文檔需要團(tuán)隊協(xié)作,這樣就允許開發(fā)人員和文檔編寫者利用彼此的長處,取長補(bǔ)短。例如,如果預(yù)期讀者是系統(tǒng)設(shè)計師,開發(fā)人員需要提供技術(shù)細(xì)節(jié),然后文檔編寫者按照正確語法組織和編輯內(nèi)容。軟件文檔的最主要目標(biāo)是傳達(dá)一個系統(tǒng)的技術(shù)要素和使用方法。第二個目標(biāo)是提供軟件開發(fā)過程中的需求,決策,行為,角色和責(zé)任的書面記錄。只有實現(xiàn)了這兩個目標(biāo),軟件文檔才真正提
90、供了有意義的信息。軟件的概念就是:程序+文檔,程序就是文檔,文檔集成在程序中。它要求在選擇開發(fā)環(huán)境時不僅要考慮環(huán)境對設(shè)計、開發(fā)的完美支持,而且要考慮對維護(hù)、文檔的支持;它要求軟件人員在設(shè)計、開發(fā)過程中要考慮維護(hù)問題、文檔問題;它要求程序與文檔存儲在同一位置、同一系統(tǒng)中;它要求使用相同工具進(jìn)行程序與文檔的書寫、檢索;它要求在編寫和維護(hù)程序的同時形成文檔,在書寫文檔時編寫、維護(hù)程序。程序與文檔合一的概念不僅存在于系統(tǒng)的設(shè)計、開發(fā)階段而且存在
91、于系統(tǒng)的維護(hù)階段,它貫穿軟件的生命周期。</p><p> 本次MFC簡易表達(dá)式計算器的制作,學(xué)習(xí)到了MFC基本的編程方法,增加了小組開發(fā)的團(tuán)結(jié)協(xié)作能力。對C++的OOP編程思想理解進(jìn)一步加深。但是程序仍然存在一定的問題,比如除數(shù)不能為0的Exception handle,符號鍵多次點擊結(jié)果混亂,輸入的字符除了數(shù)字還有其他不合法的字符(如字母、空格和其它標(biāo)點符號等)。由于時間倉促,如果有更多的時間,這些問題必定
92、會迎刃而解。通過這次課程設(shè)計,可以很好的加深對C++的理解,以后對Windows 應(yīng)用程序的開發(fā)勢必會輕車熟路。</p><p><b> 四、附錄</b></p><p> 1.Calculate.cpp源代碼</p><p> #ifndef CALCULATE_H</p><p> #define CALC
93、ULATE_H</p><p> #include<String.h></p><p><b> class Cal</b></p><p><b> {</b></p><p><b> public:</b></p><p>
94、struct Tree</p><p><b> {</b></p><p> char ch[50];</p><p> Tree* Lchild;</p><p> Tree* Rchild;</p><p><b> };</b></p><
95、;p><b> public:</b></p><p><b> int Sign;</b></p><p><b> bool OK;</b></p><p><b> public:</b></p><p> Cal(char* Ex)
96、;</p><p> bool Judge(char* Ex);</p><p> void GetTree(char* Ex, Tree* Node);</p><p> double GetResult(Tree* Node);</p><p> int GetFig(char ch);</p><p>
97、 void Getstring(char* Ex, int s, char* ch);</p><p> double GetValue(char* ch);</p><p> double GetV();</p><p> void Drop(Tree *Node);</p><p><b> ~Cal();</b&
98、gt;</p><p><b> private:</b></p><p> Tree *Node;</p><p> double Result;</p><p><b> };</b></p><p> Cal::Cal(char* str)</p>
99、<p><b> {</b></p><p><b> Sign = 0;</b></p><p> OK = true;</p><p> char Ex[50];</p><p> strcpy(Ex,str);</p><p> if(Judg
100、e(Ex))</p><p><b> {</b></p><p> Node = new Tree;</p><p> GetTree(Ex,Node);</p><p> Result = GetResult(Node);</p><p><b> }</b>&
101、lt;/p><p><b> else</b></p><p> OK = false;</p><p><b> }</b></p><p> Cal::~Cal()</p><p><b> {</b></p><p>
102、<b> if(OK)</b></p><p> Drop(Node);</p><p> #ifdef MYDEBUG</p><p> cout<<"end"<<endl;</p><p><b> #endif</b></p>
103、<p><b> }</b></p><p> void Cal::GetTree(char* Ex, Tree* Node)</p><p><b> {</b></p><p> int length = strlen(Ex);</p><p> int tag = len
104、gth;</p><p> char Bch[50];</p><p><b> int i;</b></p><p> #ifdef MYDEBUG</p><p> cout<<" Ex: "<<Ex<<endl;</p&
105、gt;<p><b> #endif</b></p><p> if(Ex[length-1]==')')</p><p><b> { </b></p><p> int acout = -1;</p><p> for(i=length-2;i>=
106、0;i--)</p><p><b> {</b></p><p> if(Ex[i]==')')</p><p><b> acout--;</b></p><p> if(Ex[i]=='(')</p><p><b>
107、 {</b></p><p><b> acout++;</b></p><p> if(acout==0)</p><p><b> {</b></p><p><b> tag = i;</b></p><p><b>
108、 break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(i < 0)</b></p><p&g
109、t;<b> {</b></p><p><b> Sign = 1;</b></p><p><b> return ;</b></p><p><b> }</b></p><p> if(tag==0)</p><p&g
110、t;<b> {</b></p><p> Ex[length-1]='\0';</p><p> Getstring(Ex,1,Bch);</p><p> GetTree(Bch,Node);</p><p><b> }</b></p><p>
111、; if(tag!=0)</p><p><b> {</b></p><p> int l_tag = tag;</p><p> int t = 0;</p><p> for(int j = tag - 1; j >= 0; j--)</p><p><b> {
112、 </b></p><p> if(Ex[j] == ')')</p><p><b> t--;</b></p><p> if(Ex[j] == '(')</p><p><b> t++;</b></p><p&g
113、t; if(Ex[j]=='+'||Ex[j]=='-'||Ex[j]=='*'||Ex[j]=='/'&&t==0)</p><p><b> {</b></p><p> l_tag = j;</p><p> if(Ex[j]=='+'
114、||Ex[j]=='-')</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(t==0)</b></p><
115、;p><b> {</b></p><p> Getstring(Ex,l_tag+1,Bch);</p><p> Tree *Rchild = new Tree;</p><p> Tree *Lchild = new Tree;</p><p> Node->Lchild = Lchild;&
116、lt;/p><p> Node->Rchild = Rchild;</p><p> GetTree(Bch,Node->Rchild);</p><p> *(Node->ch) = Ex[l_tag];</p><p> *(Node->ch+1) = '\0';</p><
117、p> Ex[l_tag] = '\0';</p><p> GetTree(Ex,Node->Lchild);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></
118、p><p> Sign = 1; </p><p><b> return ;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
119、<p><b> else</b></p><p><b> {</b></p><p> int t = 0;</p><p> for(i=length-1;i>=0;i--)</p><p><b> {</b></p><
120、p> if(Ex[i]==')')</p><p><b> t++;</b></p><p> if(Ex[i]=='(')</p><p><b> t--;</b></p><p> if(Ex[i]=='+'||Ex[i]==&
121、#39;-'||Ex[i]=='*'||Ex[i]=='/'&&t==0)</p><p> if(tag==length)</p><p><b> { </b></p><p><b> tag=i;</b></p><p>
122、 if(Ex[tag]=='+'||Ex[tag]=='-'&&t==0)</p><p><b> { </b></p><p> Tree *Rchild = new Tree;</p><p> Tree *Lchild = new Tree;</p><p>
123、; Node->Lchild = Lchild;</p><p> Node->Rchild = Rchild;</p><p> Getstring(Ex,tag+1,Bch);</p><p> strcpy(Node->Rchild->ch,Bch);</p><p> Node->Rchild-
124、>Lchild=NULL;</p><p> Node->Rchild->Rchild=NULL;</p><p> *(Node->ch) = Ex[tag];</p><p> *(Node->ch+1) = '\0';</p><p> Ex[tag]='\0';&l
125、t;/p><p> GetTree(Ex,Node->Lchild);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(tag!=length
126、&&(Ex[i]=='+'||Ex[i]=='-')&&t==0)</p><p><b> {</b></p><p><b> tag = i;</b></p><p> Tree *Rchild = new Tree;</p><
127、;p> Tree *Lchild = new Tree;</p><p> Node->Lchild = Lchild;</p><p> Node->Rchild = Rchild;</p><p> *(Node->ch)=Ex[tag];</p><p> *(Node->ch+1) = '
128、;\0';</p><p> Getstring(Ex,tag+1,Bch);</p><p> GetTree(Bch,Node->Rchild);</p><p> Ex[tag]='\0';</p><p> GetTree(Ex,Node->Lchild);</p><p
129、><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(i<0 &&tag!=length)</p><p><b> {</b></
130、p><p> Tree *Rchild = new Tree;</p><p> Tree *Lchild = new Tree;</p><p> Node->Lchild = Lchild;</p><p> Node->Rchild = Rchild; </p><p> Getstring(E
131、x,tag+1,Bch);</p><p> strcpy(Node->Rchild->ch,Bch);</p><p> Node->Rchild->Lchild=NULL;</p><p> Node->Rchild->Rchild=NULL;</p><p> *(Node->ch) =
132、 Ex[tag];</p><p> *(Node->ch+1) = '\0';</p><p> Ex[tag]='\0';</p><p> GetTree(Ex,Node->Lchild);</p><p><b> }</b></p><p&
133、gt; if(i<0 &&tag==length)</p><p><b> {</b></p><p> strcpy(Node->ch ,Ex);</p><p> Node->Lchild=NULL;</p><p> Node->Rchild=NULL;</
134、p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> double Cal::GetResult(Tree* Node)</p><p><b> {</b&
135、gt;</p><p> if(Node->Lchild!=NULL&&Node->Rchild!=NULL)</p><p><b> {</b></p><p> switch(*(Node->ch))</p><p><b> {</b></p&
136、gt;<p> case '+': return GetResult(Node->Lchild) + GetResult(Node->Rchild);</p><p> case '-': return GetResult(Node->Lchild) - GetResult(Node->Rchild);</p><p&g
137、t; case '*': return GetResult(Node->Lchild) * GetResult(Node->Rchild);</p><p><b> case '/':</b></p><p> if(GetResult(Node->Rchild) == 0)</p><p&
138、gt;<b> { </b></p><p><b> Sign = 1;</b></p><p> return -1;</p><p><b> }</b></p><p><b> else</b></p><p&g
139、t; return GetResult(Node->Lchild) / GetResult(Node->Rchild);</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p>
140、<b> {</b></p><p> double Value = GetValue(Node->ch);</p><p> // delete Node;</p><p> return Value;</p><p><b> }</b></p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc課程設(shè)計報告—模擬計算器
- c++_mfc計算器編程課程設(shè)計--mfc編程科學(xué)計算器
- 計算器課程設(shè)計報告
- 課程設(shè)計報告---計算器設(shè)計
- java計算器課程設(shè)計報告---模擬科學(xué)計算器
- java課程設(shè)計報告—計算器
- 簡單計算器課程設(shè)計報告
- 簡易計算器課程設(shè)計報告
- 硬件課程設(shè)計報告--計算器
- java計算器課程設(shè)計報告
- vb計算器課程設(shè)計報告
- 簡單計算器課程設(shè)計報告
- java課程設(shè)計報告--計算器設(shè)計
- 課程設(shè)計-計算器
- 計算器java課程設(shè)計--簡單計算器
- 自解析計算器課程設(shè)計報告
- 模擬科學(xué)計算器 課程設(shè)計報告
- 簡易計算器vb課程設(shè)計報告
- 簡易計算器vb課程設(shè)計報告報告
- c++課程設(shè)計--計算器設(shè)計報告
評論
0/150
提交評論