李曉奇 丁健華 吳繼超等MFC計算器課程設(shè)計報告_第1頁
李曉奇 丁健華 吳繼超等MFC計算器課程設(shè)計報告_第2頁
李曉奇 丁健華 吳繼超等MFC計算器課程設(shè)計報告_第3頁
李曉奇 丁健華 吳繼超等MFC計算器課程設(shè)計報告_第4頁
李曉奇 丁健華 吳繼超等MFC計算器課程設(shè)計報告_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

MFC表達式計算器課程設(shè)計報告實驗名稱:MFC課程設(shè)計指導(dǎo)教師:劉曉軍專業(yè):機械工程學(xué)院班級:5班學(xué)生姓名及學(xué)號:丁健華(02011507)李曉奇(02011513)吳繼超(02011516)完成日期:2012年10月13日小組成員及分工:李曉奇(主要負(fù)責(zé)Calculate.cpp代碼的編寫)李曉奇(主要負(fù)責(zé)界面的設(shè)計和實現(xiàn)、輔助代碼的編寫)丁健華(主要負(fù)責(zé)功能的改進與創(chuàng)新、輔助代碼的編寫)丁健華(主要負(fù)責(zé)代碼的鏈接、輔助代碼的編寫)吳繼超(主要負(fù)責(zé)報告的書寫、輔助代碼的編寫)題目:利用MFC框架編寫簡易表達式計算器【分析】一.設(shè)計過程1.Windows消息處理機制的理解首先編寫程序需要對Windows程序的消息處理機制(MessageHandle)有個比較清晰的了解。Windows的程序都是通過消息來傳送數(shù)據(jù),有不需要用戶參與的系統(tǒng)消息,比如異常處理等。還有用戶消息,比如鼠標(biāo)的單擊,雙擊,鍵盤的鍵入等。2.界面的設(shè)計

1)界面的初步設(shè)計仿照Windows附件里面的計算器,在資源視圖中畫好界面,如圖:2)修改每個static的屬性IDCAPTIONIDD_STATIC4簡易表達式計算器IDC_STATIC1待求表達式IDC_STATIC2運算結(jié)果IDC_STATIC3系統(tǒng)當(dāng)前時間3)修改每個button的屬性IDC_BUTTON1等于(=)IDC_BUTTON2全清(C)IDC_BUTTON3清除(A)結(jié)果如下圖:

4)修改每個button的處理機制在類向?qū)lasswizard窗口中進行,如下圖:其他button按鈕的修改類似5)修改每個edit的類型和名稱在類向?qū)lasswizard窗口中進行:單擊AddVariable按鈕,在如下窗口中進行修改其他edit的修改類似最終結(jié)果如下:注:主要使用到Layout菜單中的Align功能對各個按鈕進行對齊,使界面更加整潔。拖出的控件有上面的一個Edit控件用于顯示數(shù)字,Button控件用于處理鼠標(biāo)的消息。6)系統(tǒng)菜單的添加在Menu的IDR_MENU1中添加系統(tǒng)菜單:同理在“幫助”菜單中添加“關(guān)于”。設(shè)計步驟1.添加頭文件將Calculate.cpp(見附錄)改為Calculate.h將其添加到計算器Dlg.cpp:implementationfile中,如下:#include"Calculate.h"。2.成員函數(shù)及其釋義:voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/) :CDialog(CMyDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMyDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCMyDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Control(pDX,IDC_EDIT3,m_time); DDX_Control(pDX,IDC_EDIT2,m_result); DDX_Control(pDX,IDC_EDIT1,m_input); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg,CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON3,OnButton3) ON_COMMAND(ID_ABOUT,OnAbout) ON_COMMAND(ID_QUIT,OnQuit) //}}AFX_MSG_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlers3.OnButton1()按鈕的處理函數(shù)雙擊“等于(=)”按鈕,添加如下代碼:voidCMyDlg::OnButton1(){ //TODO:AddyourcontrolnotificationhandlercodehereCStringstr; char*ch; m_input.GetWindowText(str); ch=(LPSTR)(LPCTSTR)str; charch2[50]; strcpy(ch2,ch); Cala(ch2); if(!a.OK) {m_result.SetWindowText("表達式不合法!");//表達式不合法,判別出來并給出相應(yīng)的錯誤提示 } else {if(a.Sign) {m_result.SetWindowText("除數(shù)為零!");//表達式不合法,可以判別出來并給出相應(yīng)的錯誤提示 } else {str.Format("%lf",a.GetV()); m_result.SetWindowText(str); } }}以O(shè)nButton1()作為求值處理函數(shù),函數(shù)的功能是單擊等于(=)按鈕,運算結(jié)果顯示在IDC_EDIT2中4.OnButton2()按鈕的處理函數(shù)雙擊“清除(C)”按鈕,添加如下代碼:voidCMyDlg::OnButton2(){ //TODO:Addyourcontrolnotificationhandlercodehere m_result.SetWindowText("0");m_input.SetWindowText("");m_input.SetFocus();}//函數(shù)的功能是把上次輸入的表達式清空5.OnButton3()按鈕的處理函數(shù)雙擊“全清(A)”按鈕,添加如下代碼:voidCMyDlg::OnButton3(){ //TODO:Addyourcontrolnotificationhandlercodeherem_input.SetWindowText("");m_input.SetFocus(); }//函數(shù)的功能是把上次輸入的表達式和運算結(jié)果都清除6.OnTimer(UINTnIDEvent)處理函數(shù)CWnd::SetTimer(1,500,NULL);//設(shè)置時間每隔500ms更新一次。voidCMyDlg::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringch[]={"日","一","二","三","四","五","六"};SYSTEMTIMEst;::GetLocalTime(&st); CStringstr_temp; 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); m_time.SetWindowText(str_temp); CDialog::OnTimer(nIDEvent);}//函數(shù)的功能是把運算結(jié)果顯示在IDC_EDIT3中7.OnAbout()處理函數(shù)voidCMyDlg::OnAbout(){ //TODO:Addyourcommandhandlercodehere CAboutDlgabout; about.DoModal();}//關(guān)于幫助和版權(quán)信息8.OnQuit()處理函數(shù)voidCMyDlg::OnQuit(){ //TODO:Addyourcommandhandlercodehere OnOK();}//退出主程序菜單9.全部代碼如下://計算器Dlg.cpp:implementationfile//#include"stdafx.h"#include"計算器.h"#include"計算器Dlg.h"#include"Calculate.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public: CAboutDlg();//DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::CMyDlg(CWnd*pParent/*=NULL*/) :CDialog(CMyDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMyDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCMyDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Control(pDX,IDC_EDIT3,m_time); DDX_Control(pDX,IDC_EDIT2,m_result); DDX_Control(pDX,IDC_EDIT1,m_input); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg,CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON3,OnButton3) ON_COMMAND(ID_ABOUT,OnAbout) ON_COMMAND(ID_QUIT,OnQuit) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlersBOOLCMyDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon m_Mu.LoadMenu(IDR_MENU2); SetMenu(&m_Mu);CWnd::SetTimer(1,500,NULL); //TODO:Addextrainitializationhere returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCMyDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCMyDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCMyDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}voidCMyDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstr; char*ch; m_input.GetWindowText(str); ch=(LPSTR)(LPCTSTR)str; charch2[50]; strcpy(ch2,ch); Cala(ch2); if(!a.OK) { m_result.SetWindowText("表達式不合法!"); } else { if(a.Sign) { m_result.SetWindowText("除數(shù)為零!"); } else { str.Format("%lf",a.GetV()); m_result.SetWindowText(str); } }}voidCMyDlg::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringch[]={"日","一","二","三","四","五","六"};SYSTEMTIMEst;::GetLocalTime(&st); CStringstr_temp; 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); m_time.SetWindowText(str_temp); CDialog::OnTimer(nIDEvent);}voidCMyDlg::OnButton2(){ //TODO:Addyourcontrolnotificationhandlercodehere m_result.SetWindowText("0");m_input.SetWindowText("");m_input.SetFocus();}voidCMyDlg::OnButton3(){ //TODO:Addyourcontrolnotificationhandlercodeherem_input.SetWindowText("");m_input.SetFocus(); }voidCMyDlg::OnAbout(){ //TODO:Addyourcommandhandlercodehere CAboutDlgabout; about.DoModal(); }voidCMyDlg::OnQuit(){ //TODO:Addyourcommandhandlercodehere OnOK();}三.總結(jié):在設(shè)計當(dāng)中我認(rèn)識到開發(fā)一項好的軟件不是某一個人就能完成的任務(wù)。一個團隊的小組,一個勤奮的小組非常重要,溝通是解決問題的就好辦法。俗話也說得好:“不怕虎一樣的敵人,就怕豬一樣的隊伍”。所以小組中的每個成員的能力與協(xié)作能力也是致關(guān)重要的。同時,不僅是團隊內(nèi)部的交流,更多需要協(xié)調(diào)好團隊之間的交流。其次呢,在設(shè)計過程中我了解了,在開發(fā)一個項目時一定要先做好規(guī)劃,按照軟件的開發(fā)過程,詳細地寫好每一個必要的文檔。一般的規(guī)則是,寫文檔需要團隊協(xié)作,這樣就允許開發(fā)人員和文檔編寫者利用彼此的長處,取長補短。例如,如果預(yù)期讀者是系統(tǒng)設(shè)計師,開發(fā)人員需要提供技術(shù)細節(jié),然后文檔編寫者按照正確語法組織和編輯內(nèi)容。軟件文檔的最主要目標(biāo)是傳達一個系統(tǒng)的技術(shù)要素和使用方法。第二個目標(biāo)是提供軟件開發(fā)過程中的需求,決策,行為,角色和責(zé)任的書面記錄。只有實現(xiàn)了這兩個目標(biāo),軟件文檔才真正提供了有意義的信息。軟件的概念就是:程序+文檔,程序就是文檔,文檔集成在程序中。它要求在選擇開發(fā)環(huán)境時不僅要考慮環(huán)境對設(shè)計、開發(fā)的完美支持,而且要考慮對維護、文檔的支持;它要求軟件人員在設(shè)計、開發(fā)過程中要考慮維護問題、文檔問題;它要求程序與文檔存儲在同一位置、同一系統(tǒng)中;它要求使用相同工具進行程序與文檔的書寫、檢索;它要求在編寫和維護程序的同時形成文檔,在書寫文檔時編寫、維護程序。程序與文檔合一的概念不僅存在于系統(tǒng)的設(shè)計、開發(fā)階段而且存在于系統(tǒng)的維護階段,它貫穿軟件的生命周期。本次MFC簡易表達式計算器的制作,學(xué)習(xí)到了MFC基本的編程方法,增加了小組開發(fā)的團結(jié)協(xié)作能力。對C++的OOP編程思想理解進一步加深。但是程序仍然存在一定的問題,比如除數(shù)不能為0的Exceptionhandle,符號鍵多次點擊結(jié)果混亂,輸入的字符除了數(shù)字還有其他不合法的字符(如字母、空格和其它標(biāo)點符號等)。由于時間倉促,如果有更多的時間,這些問題必定會迎刃而解。通過這次課程設(shè)計,可以很好的加深對C++的理解,以后對Windows應(yīng)用程序的開發(fā)勢必會輕車熟路。四、附錄1.Calculate.cpp源代碼#ifndefCALCULATE_H#defineCALCULATE_H#include<String.h>classCal{public:structTree{charch[50];Tree*Lchild;Tree*Rchild;};public:intSign;boolOK;public: Cal(char*Ex); boolJudge(char*Ex);voidGetTree(char*Ex,Tree*Node);doubleGetResult(Tree*Node);intGetFig(charch);voidGetstring(char*Ex,ints,char*ch);doubleGetValue(char*ch); doubleGetV(); voidDrop(Tree*Node); ~Cal();private: Tree*Node; doubleResult;};Cal::Cal(char*str){Sign=0;OK=true;charEx[50];strcpy(Ex,str);if(Judge(Ex)){Node=newTree;GetTree(Ex,Node);Result=GetResult(Node);}else OK=false;}Cal::~Cal(){ if(OK)Drop(Node);#ifdefMYDEBUG cout<<"end"<<endl;#endif}voidCal::GetTree(char*Ex,Tree*Node){intlength=strlen(Ex); inttag=length;charBch[50]; inti;#ifdefMYDEBUG cout<<"Ex:"<<Ex<<endl;#endif if(Ex[length-1]==')') { intacout=-1; for(i=length-2;i>=0;i--) { if(Ex[i]==')') acout--; if(Ex[i]=='(') { acout++; if(acout==0) { tag=i; break; } } } if(i<0) { Sign=1; return; } if(tag==0) { Ex[length-1]='\0'; Getstring(Ex,1,Bch); GetTree(Bch,Node); } if(tag!=0) { intl_tag=tag; intt=0; for(intj=tag-1;j>=0;j--) { if(Ex[j]==')') t--; if(Ex[j]=='(') t++; if(Ex[j]=='+'||Ex[j]=='-'||Ex[j]=='*'||Ex[j]=='/'&&t==0) { l_tag=j; if(Ex[j]=='+'||Ex[j]=='-') break; } } if(t==0) { Getstring(Ex,l_tag+1,Bch); Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; GetTree(Bch,Node->Rchild); *(Node->ch)=Ex[l_tag]; *(Node->ch+1)='\0'; Ex[l_tag]='\0'; GetTree(Ex,Node->Lchild); } else { Sign=1; return; } } } else {intt=0; for(i=length-1;i>=0;i--) { if(Ex[i]==')') t++; if(Ex[i]=='(') t--; if(Ex[i]=='+'||Ex[i]=='-'||Ex[i]=='*'||Ex[i]=='/'&&t==0) if(tag==length) { tag=i; if(Ex[tag]=='+'||Ex[tag]=='-'&&t==0) { Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; Getstring(Ex,tag+1,Bch); strcpy(Node->Rchild->ch,Bch); Node->Rchild->Lchild=NULL; Node->Rchild->Rchild=NULL; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0'; Ex[tag]='\0'; GetTree(Ex,Node->Lchild); break; } }if(tag!=length&&(Ex[i]=='+'||Ex[i]=='-')&&t==0) { tag=i; Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0';Getstring(Ex,tag+1,Bch); GetTree(Bch,Node->Rchild); Ex[tag]='\0'; GetTree(Ex,Node->Lchild); break; } }if(i<0&&tag!=length) { Tree*Rchild=newTree; Tree*Lchild=newTree; Node->Lchild=Lchild; Node->Rchild=Rchild; Getstring(Ex,tag+1,Bch); strcpy(Node->Rchild->ch,Bch); Node->Rchild->Lchild=NULL; Node->Rchild->Rchild=NULL; *(Node->ch)=Ex[tag]; *(Node->ch+1)='\0'; Ex[tag]='\0'; GetTree(Ex,Node->Lchild); } if(i<0&&tag==length) { strcpy(Node->ch,Ex); Node->Lchild=NULL; Node->Rchild=NULL; } }}doubleCal::GetResult(Tree*Node){if(Node->Lchild!=NULL&&Node->Rchild!=NULL){switch(*(Node->ch)) { case'+':returnGetResult(Node->Lchild)+GetResult(Node->Rchild); case'-':returnGetResult(Node->Lchild)-GetResult(Node->Rchild); case'*':returnGetResult(Node->Lchild)*GetResult(Node->Rchild); case'/': if(GetResult(Node->Rchild)==0) { Sign=1; return-1; } else returnGetResult(Node->Lchild)/GetResult(Node->Rchild); }}else{ doubleValue=GetValue(Node->ch); //deleteNode; returnValue;} }boolCal::Judge(c

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論