2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論