LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第1頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第2頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第3頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第4頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第5頁
已閱讀5頁,還剩46頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

武漢理工大學《專業課程設計3》課程設計說明書PAGEPAGE1畢業設計(論文)開題報告題目LPX6電動機下置式錘式破碎機專業名稱機械設計制造及其自動化班級學號學生姓名指導教師填表日期20年5月日一、選題的依據及意義隨著國內基本建設和國民經濟的持續發展,我國的建設機械市場已經成為國際設備制造商關注的焦點,破碎機械行業也不例外,外資的進入,進一步加劇了市場的競爭程度,國內破碎機械企業要想在競爭的大潮中取得先機,其首要問題就是要提高現有破碎設備的質量和技術含量,盡快縮小與國外先進水平的差距,創造自己的品牌,爭取市場主動。國內外破碎機械存在差距的原因很多,其中市場需求不同是造成差距的客觀原因,由于國際市場上優秀的破碎設備制造商集中在歐美地區,那里大規模的基本建設階段已過去,市場對砂石料的需求不多,且環保要求又高,勢必形成砂石場高度集中以大規模生產來實現環境保護,幫所需破碎設備規格大、自動化程試想高、機動性強。滿足這樣的市場需求發展的破碎設備與國內產品不大一樣,而我們正處于大規模的基本建設時期,各地對砂石料的需求劇增,引起投資砂石場熱,遍地開花的砂石場往往規模小,只求上馬快、投資少,供不應求的市場使粗制濫造、技術水平低下、耗能高、污染環境嚴重的產品紛紛進入,而這些設備往往只能以低價來占領市場,因此與國際上先進水平差距明顯。國際上專業的立軸沖擊式破碎機制造商已普遍采用陶瓷制作耐磨零件,而不僅僅是硬質合金(碳化鎢)和高鉻鑄鐵。陶瓷材料不但可耐較高的溫度,而且有特別好的抗腐蝕性,因而在帶有相當溫度的物料高速沖擊時耐磨性能良好。國內的立軸立軸沖擊式破碎機目前采用硬質合金和高鉻鑄鐵材料,質量不穩定,易腐蝕和磨損,且易被金屬件擊碎,由于砂石場使用的破碎設備國內外產品差距明顯,故國內高端市場,如規模較大的砂石場仍是進口的設備占多數。

因而近制就是測繪國外產品,以此作為更新換代的主要手段,技術進步甚慢。目前國內的破碎機械制造商無論國有企業還是民營企業,在科技開發上的投入不足是產品差距的主觀原因,既缺乏科研手段(例如幾乎沒有一家制造商具備巖石實險室),又缺少先進技術支撐,自主產權的開發力量十分薄弱。盡管國內外破碎設備差距很大,但縱觀國外的破碎設備制造商由于本土市場日漸縮小,生產成本高,紛紛開拓本國以外的市場,而且作為傳統工業在資金、人才等方面獲得新的投入甚少,因此,近來年兼并重組頻繁,這種局面給國內破碎機械制造商以很大的發展機遇,畢竟我國的制造成本較低,又有較好的重工業基礎,通過引進國際上先進技術,產學科研投入,一定能克服技術上的差距,使我國的破碎設備產品更好的進入國內外市場。

立軸錘式破碎機在吸收國內外先進技術和綜合國內外同類破碎機技術,具有破碎效率高、破碎比大、磨損少、工作平穩、能耗低、維修方便等優點,是一種較理想的節能型破碎設備。

同時對主要技術參數進行優化設計研制成的新型細碎、粗磨產品,主要用于中、小型破碎水泥生料、熟料,用于建筑用砂、鐵礦石、砂巖、石膏、煤矸石、塊煤等其它中硬礦石的破碎。具有破碎比大、能耗少、運轉平穩、結構簡單、操作維修方便等特點。它不僅適用于中等硬度脆性物料(如石灰石、水泥熟料、石膏、硫鐵礦石、煤塊等多種物料)的破碎,還適用于建材、化工、冶金、礦山、電力、煤炭等工業部門的原料破碎系統。通過本設計,使我達到了以下幾個目的:1、學會獨立分析和解決工程實踐中所遇到的各種問題。2、掌握獨立完成工程設計的方法。3、掌握總結和撰寫設計說明書的方法。4、學會通過語言表述自己的研究內容、理論、方法、結論。5、為今后綜合能力的提高打下一個良好、扎實的基礎。國內外研究概況及發展趨勢(含文獻綜述)國內外研究概況第一代的破碎機械是在蒸汽機和電動機等動力機械逐漸完善和推廣之后相繼創造出來的。1806年出現了用蒸汽機驅動的輥式破碎機;1858年,美國的布萊克發明了破碎巖石的顎式破碎機;1878年美國發展了具有連續破碎動作的旋回破碎機,其生產效率高于作間歇破碎動作的顎式破碎機;1895年,美國的威廉發明能耗較低的沖擊式破碎機。美國人E.W.布萊克(Black)設計制造的世界上第一臺顎式破碎機。其結構形式為雙肘板式(簡單擺動式)顎式破碎機。由于顎式破碎機具有結構簡單、制造容易、工作可靠、維護方便,體積和高度較小等優點。至今仍然被廣泛應用于破碎堅硬、中硬、軟質礦石和各種物料,如各種礦石、溶劑、爐渣、建筑石料、大理石等。通常使用的顎式破碎機的破碎機為4~6,而小型顎式破碎機有時可達到10.大、中型破碎機的給料力度可達1000~2000mm,其產品粒度可達20~250mm,小型破碎機和新型細碎用顎式破碎機所得產品可以更細一些。顎式破碎機即可用于粗碎作業,也可用于中、細作業。特別是被用于井下破碎作業和中、小型移動式破碎裝置。錘式破碎機的設計簡單、工作可靠和能破碎堅硬物料等優點而被廣泛應用于選礦、建筑材料、硅酸鹽和陶瓷等工業部門。到20世紀80年代,每小時破碎800噸物料的大型顎式破碎機的給料粒度已達1800毫米左右。我國破碎機械制造業總體規模已進入國際生產大國行列,但總體競爭和發展后勁仍無法與發達國家相抗衡,目前國內高端用戶和出口產品配套的基礎零部件主要依靠進口,隨著出口貿易磨擦的加大,勢必要受到國外競爭對手和供應商的制約。因此破碎機械今后振興發展的重心應放到基礎技術和基礎部件上來,提高自主開發水平。大型機械設備,其中錘式破碎機,破石機,顎式破碎機,大型磨粉機等設備已經遠銷哥倫比亞,美國,沙特等地區取得了客戶的好評,特別是制砂機,碎石機設備得到了外商的大力贊賞。目前,我國破碎制造行業市場非常廣泛,包括化工、礦山、建筑、水利、冶金、煤礦、玻璃等各個行業。在中國最重要的應用領域是水泥行業、鋪路和礦山,應用在這兩個行業的破碎機各約占整個行業的30%左右。目前,國際上各國對破碎機的發展抱有較大期望,同時,也取得了一定的成效。尤其是美國、日本、德國在破碎機的研究開發與利用已經達到了一個較高的水平。破碎機廣泛應用于資源開采、工程機械、城市建設、材料分解等多項領域,涉及包括化工、礦山、建筑、水利、冶金、煤礦、玻璃等各個行業。國內近幾年由于經濟的穩定快速發展、以及西部大開發的深入進行,對破碎機的需求大量增加。另一方面,隨著國家繼續擴大內需,基礎設施建設步伐的加大,這就帶動了破碎機的的蓬勃發展。但是一定程度上,我們對破碎機的研究開發與利用還遠沒有達到預期的效果,破碎技術的水平相對有限,為了進一步提高破碎水平,生產出就有高質量和高技術含量的破碎機,盡快縮小與國外先進水平的差距,我們不得不對破碎機進行更加深入的研究。2.現如發展趨勢從上個世紀60年代德國克虜伯公司生產出第一臺液壓破碎錘以來,破碎錘經歷了四十多年的發展,從這次參展情況來看,破碎錘已經從當初結構復雜、功能單一的形式發展到現在的產品多樣化、功能多樣化。具體可以歸納為以下幾個方面的新發展:(1)破碎錘的結構形式多樣化。現在市場上有純液壓靜壓驅動型破碎錘、氣液聯合型破碎錘和氮氣爆炸式碎錘,可以根據需要選擇合適的型號;從與承載機的裝配上看,有側板裝配形式和箱體式裝配形式兩種,側板式裝配形式破碎錘附加功能一般較箱體形式的要少,且沖擊能檔次一般是中小型,大沖擊能的破碎錘現在一般采用箱體式結構,因為箱體式結構便于采取隔音措施,以減小大沖擊能破碎錘工作時的噪聲。(2)產品系列化。根據工作對象的不同,可以選用同一系列不同型號的破碎錘。對于小塊、硬度較低的巖石選川沖擊能小的破碎錘,而對于大塊、硬度高的巖石選用沖擊能大的破碎錘,這樣就可以充分發揮系統的功能,提高能量的利用效率;當然,對于不同的工作對象,還可以選用不同零部件,如對于硬度不同、韌性不同的破碎對象,可以選用不同的釬桿,來達到有效破碎的目的。世界上比較有影響的幾家破碎設備生產廠家如克虜伯、Rammer公司、日本古河、卡特彼勒等,他們都是對某一種結構形式的破碎錘進行系列化生產,多的一種系列有十幾種型號。(3)功能多樣化、結構柔性化。這一點是破碎錘近來最顯著的變化。現在的破碎錘為了使用現代施工要求,已經從功能單一的破碎設備發展到具有多種附加功能的多功能破碎設備。除了具備破碎功能外,對于大型的破碎錘可以利用其安裝外殼實行簡單的搬移功能,從而方便了本身的作業;有些破碎錘同時具備陸上和水下作業功能;有些破碎錘具有噪聲和粉塵控制功能,成為典型的環保型產品;有的具有自動潤滑功能;有的具有防空打功能,從而具備了很高的可靠性。現代破碎錘功能的多樣化,正是通過其結構配置的柔性化來實現的。以上多種附加功能,都可以通過選購相應的功能裝置來進行配置,因而使破碎錘在功能上也具有了很大的柔性。(4)智能化。隨著液壓技術、電子技術、控制技術在工程機械上的不斷應用和發展,破碎錘也向著智能化方向發展。通過液壓控制技術和電子控制技術,破碎錘能夠根據作業對象的不同,自動調節沖擊能和沖擊頻率。破碎錘實現自動調頻調能是破碎錘技術上的一個重大突破,也是破碎錘性能提升和發展的重要方向。(5)便捷的售后服務。任何產品生產出來后,最終都要走向市場,經受市場的嚴格檢驗。在信息化、網絡化的服務型社會,產品的售后服務和技術支持是一個不可忽視的重要環節,完善的售后服務和可靠的技術支持電同樣足提高產品競爭力的重要手段。國外的幾家大公司在這方面都做得非常出色。三、研究內容及實驗方案1、總要求設計電動機下置式立軸錘式破碎機,該破碎機可以將尺寸小于200×200×150的脆性建筑垃圾粉碎成尺寸小于8×8×8的碎塊。2、給定的條件和要求電動機下置式立軸錘式破碎機設計;采用甩錘式結構,結合可更換破碎板工作;產量為每小時6噸;3、確定總體方案分析國內外建筑垃圾破碎機發展和應用的情況,結構類型和功能特點。結合國內建筑行業的實際情況擬定建筑垃圾破碎機的總體方案,并對總體方案進行分析比較,最后確定總體方案。4、機械部分的設計(1)總體機械結構設計,繪制總裝配圖。(2)傳動機構設計,完成從電動機到主軸的傳動機構的設計和計算,繪制部分裝配圖。(3)工作部件設計,完成主軸、甩錘、破碎板等工作部件設計,繪制工作部件部分裝配圖。(4)其他輔助機構設計,完成除塵罩、進料口等鋼結構部件的設計,繪制部分裝配圖。(5)主要零件設計,繪制主要零件的工作圖。5、撰寫畢業設計說明書6、外文資料翻譯7、圖紙要求機械結構裝配圖要求視圖完整、符合最新國家標準,圖面整潔、質量高。四、目標、主要特色及工作進度立軸錘式破碎機由上蓋、機殼、立軸轉子、底座和傳動裝置組成。上蓋一側上面設有喂料口(進料斗),中間設有轉子軸承座。機殼內裝有可拆換的反擊板,中心立軸轉子安裝有數排對稱布置的打擊錘頭,傳動裝置由異步電動機、電機機座、張緊機構及傳動機構構成,同立軸轉子相連,底座下部設有出料口及料斗。立軸錘式破碎機結構簡圖如圖1如下:圖1立軸錘式破碎機結構簡圖4.1立軸錘式破碎機的工作原理:立軸上設置有多層錘頭,由進料斗進來的物料利用物料自重均勻喂入,在自由墜落過程中,首先被上層高速運行的錘頭沖擊,物料被擊向反擊板,反擊板再將物料反彈向錘頭,隨物料的自重向錘頭與反擊板之間沖撞,物料與物料之間的沖撞,使物料粉碎,被粉碎的物料由底部出料斗排出機外。4.2立軸錘式破碎機的特點:該設備破碎比大,破碎水份含量高,對水份含量高的物料加工最為理想,出料粒度可任意調節,無篩條設置,含泥沙量大的物料不會堵塞,不可破碎物進入機體可自動排出,不會造成設備的損壞。該設備粉碎特料直流,生產效率高,結構獨特、運作平穩、噪音低、維修方例,開啟工作倉門即可輕松更換損件。工作平穩、運轉可靠、噪聲小、粉塵少。結構合理,易損件種類少,操作、維修簡便。結構緊湊,占地面積小。4.3方案對比:方案一:電動機上置的立軸錘式破碎機,通過帶輪和皮帶將電動機的轉矩傳遞給主軸,從而帶動錘頭旋轉,來破碎物料。電動機上置的立軸錘式破碎機如下圖2所示:圖2電動機上置式立軸錘式破碎機方案二:電動機下置的立軸錘式破碎機,通過帶輪和皮帶將電動機的轉矩傳遞給主軸,從而帶動錘頭旋轉,來破碎物料。電動機下置的立軸錘式破碎機如下圖圖3所示:圖3電動機下置式立軸錘式破碎機4.4論證結果1.破碎機總體方案的確定選擇電動機下置式錘式破碎機2.破碎機外形結構的確定根據所給設計題目的要求:將尺寸小于200×200×150的脆性建筑垃圾粉碎成尺寸小于8×8×8的碎塊和每小時六噸的產量。破碎機的進料斗采用對稱的雙口進料。這樣可以在物料進入破碎腔時,更多的物料進行碰撞而破碎,減少了物料的粒度,從而也減輕了錘頭的工作量,減輕主軸的承載負荷,降低了電動機的功率。下面采用單個出料口,使在卸料的過程中,大塊的物料能夠再次破碎降低粒度。3.傳動機構的確定由于破碎機的傳動不需要嚴格的傳動比,且根據它的破碎特點,采用帶式傳動。利用帶輪和傳動帶(v帶)間的摩擦將動力源(電動機)的動力傳遞給破碎機的主軸,帶動錘頭進行破碎。采用帶式傳動,能緩和載荷沖擊吸震,運動平穩,無噪聲;價格便宜;能夠實現長距離的傳動。最重要的是在破碎機過載時將引起帶在帶輪上打滑,從而保護了主軸不被破壞。4.破碎機構的確定破碎腔里面的破碎機構采用單轉子多排錘可逆式,單轉子即一根主軸,多排錘頭通過連接裝置固定在主軸上,錘頭交錯布置。而且錘頭的回轉采用可逆式,這樣能夠在錘頭遇到大的破碎阻力時,錘頭向相反的方向轉動,減輕主軸的承載負荷,保護主軸不被損壞。里面的破碎襯板通過螺栓連接固定在筒體上。同時,在筒體上開有維修孔,方便對破碎機構進行維修和更換。筒體和破碎機構固定在底架上。電動機下置式立軸錘式破碎機結構示意圖如下圖圖4:圖4電動機下置式立軸錘式破碎機結構簡圖4.5工作進度1.查閱相關資料,外文資料翻譯(6000字符以上),撰寫開題報告。第1周—第2周2.運動及動力參數計算第3周—第4周3.總裝圖設計第5周—第8周4.主要零、部件強度及選用計算第9周—第10周5.完成進料口等輔助鋼結構部件的設計第11周—第12周6.繪制零、部件圖第13周—第15周7.整理畢業論文及答辯準備第16周—第17周五、主要參考文獻【1】孫桓等主編.機械原理.北京:高等教育出版社,2001【2】濮良貴等主編.機械設計.北京:高等教育出版社,2001【3】胡家秀.機械零件設計實用手冊.北京:機械工業出版社,1999.【4】鄭鳴皋主編.破碎機綜述.北京:機械工業出版社,2001【5】范祖堯主編.現代機械設備設計手冊.北京:機械工業出版社,1996【6】徐灝主編.機械設計手冊(第四版).北京:機械工業出版社.1991【7】ShigleyJE,UicherJJ.Theoryofmachinesandmechanisms.NewYork:McGraw-HillBookCompany,198024點游戲課程設計報告1基本功能描述24點游戲是一種使用撲克牌來進行的益智類游戲,游戲內容是:從一副撲克牌中抽去大小王剩下52張,任意抽取4張牌,把牌面上的數運用加、減、乘、除和括號等進行運算得出24。每張牌都必須使用一次,但不能重復使用。在不同版本中,對J、Q、和K的處理有些差異。一個常見的版本是把J、Q、和K去除,或當成10;還有一個版本是把J表示11,Q表示12,K代表13。本次課程設計采用將J、Q、K去除,使四張牌在1~10這十張牌中隨機取牌。具體功能如下:[1]由三個難度級別數,分別為一級、二級和三級。每次發牌前可進行難度設置,若不設置,系統默認為難度級別數為二級。難度級別設置完后,點擊“發牌”按鈕,桌面上顯示四張翻開的撲克牌,并且游戲開始計時,進度條開始前進。[2]在規定的時間內,用戶可以在輸入算式編輯框中輸入想好的算式,并按下“驗算”按鈕。如果不輸入任何數字和算符,會彈出“表達式有問題!”,然后再彈出一個對話框,顯示“對不起,您的輸入不正確!”;如果輸入的數字與給出的不符或者符號不合法,會彈出“對不起,您的輸入不正確!”;如果輸入的數字與四張牌相符、字符亦合法但是答案不正確,就會出現“Theresultis:!”;如果輸入算式經運算后所得答案正確,則會彈出“你做對了!”。點擊彈出對話框的確定按鈕,會出現本輪的用時和分數。[3]如果在規定的時間內,沒有點擊驗算按鈕,則會彈出一個對話框,上面顯示“TimeOver!”。[4]在結束本輪游戲后,如果用戶想繼續游戲,點擊“重新發牌”按鈕即可重新發牌;如果用戶想結束游戲,點擊“結束”按鈕即可結束游戲。2設計思路24點游戲的具體流程圖如下圖1所示,下面對流程圖進行詳細的說明。在游戲開始前有難度設置選項,用戶可根據自己的實際水平進行設置。難度級別有三個級別,分別為一級、二級和三級。三個級別是通過時間來區別的,級別越高,可用時間越少。三個級別的對應時間分別是100秒、60秒和50秒。該設置不是必選項。如果用戶不設置,系統默認為難度級別二。按下“發牌”,游戲開始,通過調用srand()和rand()函數,桌面上會隨機顯示出4張紙牌,這四張牌從1~10這10張牌中隨機調出。同時,標識耗時時標的進度條開始前進(m_Progress1->SetPos(m_Progress1->GetPos()+1),計時同步開始(SpendTime++)。由于三個等級設置的時間不一樣,進度條在三種情況下的步長也不相同。YYNNYNYYN是否設置難度?一級:m_Hardlevel=100二級:m_Hardlevel=60三級:m_Hardlevel=50系統默認難度級別為二級m_Hardlevel=60初始化:OnInitDialog()發牌:srand();rand()計時開始:OnTimer()輸入算式,進行計算SubCompute();TotalCompute()m_Progress1->GetPos()>=m_Hardlevel顯示“TimeOver!”AfxMessageBox()OnYanSuan()函數判斷計算結果是否為24?算式為空白:顯示:“表達式不能為空白!”輸入字符錯誤:顯示:“對不起,你的輸入不正確!”運算結果正確:“你做對了!”運算結果錯誤:顯示:“Theresultis:!”繼續否?結束開始圖1圖124點游戲程序流程圖游戲設置了時間限制,該設置是通過比較函數m_Progress1->GetPos()的返回值和參數m_Hardlevel的大小。如果函數的返回值小于參數m_Hardlevel,代表游戲還沒結束,用戶還有時間進行思考。否則,本輪游戲結束,在函數OnTimer()的作用下,會彈出對話“TimeOver!”。若用戶在規定時間內點擊了“驗算”按鈕,系統通過對SubCompute()和TotalCompute()兩函數的調用進行相應運算,緊接著系統調用OnYanSuan()函數對編輯框中運算出的結果進行驗算,根據驗算情況給出相應的結果。出現的結果有以下四中情況:(1)如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框。(2)如果輸入的數字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框。(3)如果輸入的數字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”。(4)如果輸入算式經運算后所得答案正確,則會彈出“你做對了!”在以上任意一種情況下,點擊彈出框中的“確定”按鈕,系統會自動給出本局的得分和耗時。游戲的耗時使用SSpendTime.Format("%d",SpendTime)這個函數進行顯示,游戲得分是在綜合考慮游戲級別、游戲所耗費時間的基礎上給出(m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel)。于是,本輪游戲結束。本輪游戲結束后,用戶可以選擇重新開始,否則,可以點擊“結束”按鈕退出游戲。3軟件設計3.1設計步驟24點游戲的具體設計步驟如下:[1]創建MFCAppWizard(exe)工程,鍵入對應的工程名(dinglu),在應用程序類型中選擇基本對話框,其余的都采用默認選項,完成對話框的創建。[2]通過插入-資源-Bitmap加載圖片,圖片通過拷貝和復制等操作加載完成。加載完成的圖片在對應的工作區可以找到,選中對其名字進行修改。在對話框中添加4個圖像、9個按鈕、3個編輯框、1個進度條和3個單選按鈕。然后,根據屬性對以上所添加的控件進行屬性修改,主要是對其進行重命名。圖像內的屬性修改除改名外,還要添加位圖。[3]下一步是對以上控件建立類向導,主要包括AddFunction、AddVariable和EditCode這三項的添加。[4]在類的原文件中添加實現功能所需要的各種函數,并添加相應的代碼,同時在頭文件中添加對各種函數及變量的聲明。[5]對完成的程序進行保存,然后開始調試,根據錯誤進行修改,直至程序不在報錯,并且可以實現預計的各種功能。圖224點游戲運行圖3.2界面設計24點游戲所用控件說明圖如下:表1控件類型、ID及相關說明對象IDCaption或說明變量名進程IDC_PROGRESS1耗時m_Progress1靜態文本IDC_STATIC靜態文字說明一級單選按鈕IDC_RADIO1一級m_Hardleve二級單選按鈕IDC_RADIO2二級三級單選按鈕IDC_RADIO3三級位圖IDC_Picture0位圖位圖IDC_Picture1位圖位圖IDC_Picture2位圖位圖IDC_Picture3位圖編輯框IDC_EDIT1輸入計算m_Edit1編輯框IDC_STATIC10時間SpendTime編輯框IDC_STATIC11得分m_score按鈕IDC_Start開始按鈕IDC_YanSuan驗算續表對象IDCaption或說明變量名按鈕IDC_OK退出按鈕IDC_PARENL_BUTTON(按鈕IDC_ADD_BUTTON+按鈕IDC_SUB_BUTTON-按鈕IDC_MUL_BUTTON*按鈕IDC_DEVIDE_BUTTON/按鈕IDC_PARENR_BUTTON)3.3關鍵功能的實現3.3.1發牌功能的實現首先,通過BOOLCDingluDlg::OnInitDialog()中,根據紙牌對應的ID號加載紙牌,例如:Bitmap[7].LoadBitmap(IDB_BITMAP7)這條語句加載標有7的紙牌。利用該函數加載了標號1~10的十張紙牌和兩張背景紙牌。然后運行中的以下一段代碼,即可在圖像框中得到四張鋪開的紙牌。代碼如下:srand((int)time(0));for(inti=0;i<4;i++)Number[i]=rand()%13;//產生一個0—12的隨機數((CStatic*)GetDlgItem(IDC_Picture0))->SetBitmap(HBITMAP(Bitmap[Number[0]]));((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(HBITMAP(Bitmap[Number[1]]));((CStatic*)GetDlgItem(IDC_Picture2))->SetBitmap(HBITMAP(Bitmap[Number[2]]));((CStatic*)GetDlgItem(IDC_Picture3))->SetBitmap(HBITMAP(Bitmap[Number[3]]));srand(seed)用來設置rand()產生隨機數時的隨機數種子。參數seed必須是個整數,通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。rand的內部實現是用線性同余法做的,他不是真的隨機數,只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,rand()會返回一隨機數值,范圍在0至RAND_MAX間。在調用此函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。rand()產生的是假隨機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函數就是srand()。3.3.2計時功能的實現首先,在voidCDingluDlg::OnStart()中,通過m_Progress->SetStep(1)和m_Progress->SetPos(0)設置進度條的步長為1,進度條的初始位置居左。然后調用voidCDingluDlg::OnTimer(UINTnIDEvent)來完成計時功能。利用函數if(m_Progress1->GetPos()>=m_Hardlevel)來判斷即使結束了沒有,如果括號中的條件滿足,則計時結束,跳出“TimeOver!”的提示框。如果括號中的條件不滿足,則執行以下代碼:CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);m_Progress1->SetRange(0,m_Hardlevel);m_Progress1->SetPos(m_Progress1->GetPos()+1);//進度條前進一步上述代碼表示,如果時間沒到,時間每流逝1秒,進度條就前進一步。當游戲時間即將結束的時候,進度條亦前進到最后一步。3.3.3計算功能的實現對于輸入結果的驗算,主要是通過intLastPos(CStringStr),intFirstPos(CStringStr),charFirstF(CStringStr),intSubCompute(CStringStr),intTotalCompute(CStringStr)等函數來來確定運算式各符號優先級和最終計算出輸入算式的結果。現摘兩段代碼進行詳細說明。代碼1:intPluPos=Str.Find('+')+1;intPos=200;if(PluPos==0)PluPos=200;if(Pos>PluPos)Pos=PluPos;charResult='-';inttempPos=SubPos;if(PluPos<tempPos){Result='+';tempPos=PluPos;}returnResult;代碼1的作用是判斷最先出現的符號是不是+號。Pluspos表示+號出現的位置,如果沒有+號出現,對pluspos負一個不可能的值;如果+號存在,將pluspos與pos比較大小。如果pluspos小于pos,將pluspos的值負給pos。pluspos再與tempos比較,如果在減號之前出現,顯示的結果是+號。代碼2:intCDingluDlg::TotalCompute(CStringStr){ intFirst=Str.ReverseFind('(')+1; while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First CStringLeft=Str.Mid(0,First-1) CStringMiddle=Str.Mid(First,Last-First-1) CStringRight=Str.Mid(Last,Str.GetLength()-Last) intResult=SubCompute(Middle) Middle.Format("%d",Result); Str=Left+Middle+Right; First=Str.ReverseFind('(')+1; } intResult=SubCompute(Str); returnResult;}代碼2的作用是對于編輯框中輸入的表達式進行計算,系統通過Str.ReverseFind('(')+1來反向查找定位第一個“(”所在的位置。然后通過while循環查找到表達式最內層的括號,又借助于Str=Left+Middle+Right;將有優先級差別同時不帶括號的表達式傳送到SubCompute()函數中,最終計算出輸入到編輯框中的表達式結果Result,并將其返回。3.3.4驗算功能的實現1.彈出框的實現在規定的時間內輸入算式進行驗算,根據不同的情況會出現不同的對話框。有以下四種情況:如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框;如果輸入的數字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框;如果輸入的數字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”;如果輸入算式經運算后所得答案正確,則會彈出“你做對了!”。具體代碼如下:if(Str==""){MessageBox("表達式不能為空白!","Warning!",MB_OK);flag=0;}if(Result==24)MessageBox("你輸入正確!","TURE!",MB_OK);由于代碼太長,只摘取不輸入與輸入計算結果正確兩種情況進行說明。當輸入Str為空時,通過MessageBox()顯示“表達式不能為空白!”。當輸入算式正確,判斷計算結果Result==24,通過MessageBox()顯示“你輸入正確!”。當輸入字符有錯,通過一段很長的程序判斷,然后通過MessageBox()顯示“你輸入的不正確!”。2.等分功能的實現當用戶在每局游戲結束后,如果沒有計算出正確結果,得分會顯示為0分;如果計算出了正確結果,則會顯示一個0~100之間的整數值。用戶最終得分的確定是由其選擇的游戲級別和游戲所花費時間長短來確定的。實現代碼如下:if(Result==24){CStringSscore; m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;Sscore.Format("%d",m_score); GetDlgItem(IDC_STATIC11)->SetWindowText(""+Sscore+"分");UpdateData(FALSE);}OnYanSuan()函數來對編輯框中運算出的結果進行驗算,如果Result==24,則if語句被執行。語句m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;說明用戶花費時間越長或者游戲剩余時間占總時間比重越小,則本局游戲得分也相應越小。而通過語句Sscore.Format("%d",m_score);的作用則將int量m_score轉換為Cstring量Sscore。同時,SetWindowText()函數發揮作用,顯示出分數Sscore。4結論與心得體會VC++的課程設計終于接近尾聲了,又到了寫課程設計報告的時間了。這次課設比以往的課設任務重、安排緊。之所以這么安排,我是這么理解的,這次安排單片機的課設是為了鞏固上課所學的知識,將其應用到實踐中來,好歹也是這學期學的。至于安排VC++的課設,我開始是很不能理解,因為我們是大二上學期學的,丟了快一年了,現在做課設又得重新將它撿起來,這很費時間。后來做完課設,看著自己的游戲界面,可以像平時玩的小游戲一樣玩,感覺還挺自豪的,覺得這一星期沒有白過。這一星期走來,我感受頗多,大約有以下幾點:首先,這次課設對VC+起到溫故知新的作用。課程設計之初,思路全無,舉步維艱,對于理論知識學習不夠扎實的我深感“書到用時方恨少”。于是,重新撿起課本,對照課本基本控件這一章,將計算器和菜單欄制作這兩個范例做了幾遍。對于進程條的設置不清楚,又找同學復制了以前的課件來看,經與同學的再三討論,終于弄清了進程條的設置。至于編程這一塊,那是忘得更多了,于是又借了基本參考書來看,遇到難處先是仔細的思考然后在向同學請教。可以說開始的那么幾天都是在查找資料,翻閱相關的書籍。其次,這次課設讓我明白了實踐出真理的道理。最初答辯弄完后,還有一些程序不知道怎么寫。于是,又從網上收集相關程序,經分析、查詢資料仍有一些地方看不懂。只能采用嘗試往對話框中添加相應代碼的方法。根據一大段的分析,感覺程序執行某個功能,將這段代碼添加到對應位置。所有的代碼添加完后,運行、調試,開始會有很多錯誤出現。我記得最多的時候有63個錯誤,逐條進行修改,再進行運行和調試。也不知道改了多少次和重做了多少次,終于做出了完美的游戲界面。再者,讓我學會了如何創新。得到游戲界面后,我又從網上下了幾個24點游戲與我的相比較。相比較發現,網上的游戲出牌比較合理,我的游戲出牌很雜亂,很多情況都是無解,我也相應做了調整。再者,我發現很多游戲都是倒計時,我也進行了嘗試。除此,我發現有些游戲也加了四張牌的按鈕,一發牌,對應的牌就顯示在快捷鍵上,這點我也做了嘗試。以上三點,就是我關于本次課設的創新,雖然最后沒能實現,但這個過程的實踐是快樂的,代表我開動了腦筋。最后,這是一場毅力的考驗。課設開始給人感覺很難,但很慶幸我們都沒有畏懼,還是盡力去查資料、想辦法解決。怎么說,“態度決定一切”,我們終于跨越了這道障礙,圓滿完成了課設。5參考文獻[1]劉於勛等.C++程序設計.科學出版社,2007[2]榮欽科技.VisualC++游戲編程基礎.電子工業出版社,2004[3]揣錦華.面向對象程序設計與VC++實踐.西安電子科技大學出版社,2005[4]羅偉堅.VisualC++經典游戲程序設計.人民郵電出版社,20066思考題1.改變難度可以變化游戲的限時和游戲加分的規則,如何實現?游戲的限時是通過對進度條的設置來實現的,通過定義一個m_Hardlevel變量之后,用它來設置進度條的范圍(SetRange(0,m_Hardlevel);),即當用戶選擇不同級別的游戲時,進度條的范圍會隨著m_Hardlevel的值而不同,游戲難度越大,m_Hardlevel的值越小(本游戲中共設置了100秒、60秒、50秒三個級別),時間也就越短,反之時間越長。游戲的加分規則綜合考慮了用戶選擇的游戲級別和一局游戲所花費時間的長短,即:m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;也就是說難度的選擇和用戶所用時間同時決定最后的得分。2.如何保證程序是根據給出的牌來書寫算式的?答:首先通過每張紙牌的ID號,將它們加載到Bitmap[]中,通過隨機函數得到四個隨機數之后,亦即得到四張系統隨機發放的紙牌;然后利用指針將得到的紙牌在voidCDingluDlg::OnStart()中進行相應設置;最后在voidCDingluDlg::OnYanSuan()中,通過Mid()和intm=(int)(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring));獲取用戶輸入到編輯框中的數據,將m和Number[i]進行比較,從而最終確保程序是根據給出的牌來書寫算式的。3.如何使用隨機函數控制撲克牌的顯示?答:首先在BOOLCDingluDlg::OnInitDialog()中,用紙牌對應的ID號對紙牌進行加載(如Bitmap[12].LoadBitmap(IDB_BITMAP12)),然后在voidCDingluDlg::OnStart()中,利用srand((int)time(0));和Number[i]=rand()%13;兩條語句選出相對應的四張紙牌,即可得到隨機發放的四張撲克牌了。7附錄7.1調試報告7.1.1變量未定義造成錯誤在代碼添加過程中,由于涉及很多的函數和變量,可能會出現某幾個變量忘定義的情況,這些變量有可能是在頭文件中忘記定義或者在某個函數體中忘記定義。下面舉一個在頭文件中變量忘定義的例子,如下所示:圖3因變量未定義而出現的錯誤截面圖在添加完各個函數的代碼完畢后,以為頭文件會自動對相應得變量進行定義,但頭文件沒有對所有的變量都定義,才出現了如上圖所示的錯誤。打開頭文件,雙擊dingluDlg.h,在classCDingluDlg:publicCdialog類定義函數中添加對m_Hardlevel參數的定義。添加完畢后,程序不再報這個錯誤。7.1.2關鍵類未添加在畫圖對話框中,擺好各種控件后,逐一對每個控件添加類向導。對話框中出現的控件一般都不會忘記建立類向導,但有1個類向導是容易忘記的,它是IDC_PROGRESS1建立的類向導名稱是OnOutofmemoryProgress1。下面用圖形表示這個錯誤,如下所示:根據錯誤提示,重新選中圖片,建立OnOutofmemoryProgress1的類向導。建立完畢后,重新運行程序,不再提示開錯誤。圖4因關鍵類未添加而出現的錯誤截面圖7.1.3進度條錯誤類導向和代碼添加完后,運行程序,出現游戲界面。點擊游戲界面內的“發牌”按鈕,出現四張撲克展開,但是沒過2秒鐘跳出“TimeOver!”對話框,并且進度條不動。下面用圖形表示這個錯誤,如下圖所示:圖5進度條設置錯誤而出現的錯誤截面圖這個錯誤可能是計時時間設置的太短,進度條的步長設置的不合理。重新設置計時時間范圍和進度條步長,然后運行程序,錯誤仍然存在。再從頭到尾把程序檢查一遍,做相應修改,再運行,錯誤仍然存在。于是將所有類刪除后重新添加,并且添加相應程序,重新運行,錯誤消失。7.2測試結果7.2.1在規定時間內完成點擊“驗算”按鈕操作測試過程中,由于既涉及到紙牌點數和運算符,又會涉及到運算式結果,于是相應地會顯示出四種結果,分別是:如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框;如果輸入的數字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框;如果輸入的數字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”;如果輸入算式經運算后所得答案正確,則會彈出“你做對了!”。下面用圖形做相應說明:[1]輸入算式為空,點擊“驗算”,顯示“表達式不能為空白!”,如下圖所示:圖6輸入表達式為空而出現的游戲界面[2]輸入的數字與給出的不符或者符號不合法,點擊“驗算”,會彈出“你的輸入不正確!”,如下圖所示:圖7輸入字符錯誤而出現的游戲界面[3]如果輸入的數字與四張牌相符、字符亦合法但是答案不正確,點擊“驗算”,會彈出“Theresultis:!”,如下圖所示:圖8輸入字符正確而運算結果不正確出現的游戲界面[4]如果輸入算式經運算后所得答案正確,點擊“驗算”,則會彈出“你做對了!”,如下圖所示:圖9輸入結果正確而出現的游戲界面7.2.2在規定時間內未完成點擊“驗算”按鈕操作規定時間內未進行輸入,或輸入后未完成點擊“驗算”按鈕操作,顯示“TimeOver!”,如下圖所示:7.3關鍵源代碼BOOLCDingluDlg::OnInitDialog()/程序初始化{ CDialog::OnInitDialog(); Bitmap[0].LoadBitmap(IDB_BITMAP13);//為紙牌圖片的數組加載13張初始圖像Bitmap[1].LoadBitmap(IDB_BITMAP1);Bitmap[2].LoadBitmap(IDB_BITMAP2); Bitmap[3].LoadBitmap(IDB_BITMAP3);Bitmap[4].LoadBitmap(IDB_BITMAP4);Bitmap[5].LoadBitmap(IDB_BITMAP5);Bitmap[6].LoadBitmap(IDB_BITMAP6); Bitmap[7].LoadBitmap(IDB_BITMAP7);Bitmap[8].LoadBitmap(IDB_BITMAP8); Bitmap[9].LoadBitmap(IDB_BITMAP9); Bitmap[10].LoadBitmap(IDB_BITMAP10); Bitmap[11].LoadBitmap(IDB_BITMAP11); Bitmap[12].LoadBitmap(IDB_BITMAP12);CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/設置時間的指針m_Progress1->SetRange(0,1000);/設置進度條的取值范圍 m_Progress1->SetPos(0);//設置進度條的初值GetDlgItem(IDC_YanSuan)->EnableWindow(FALSE);/使驗算按鈕無效CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO2);/測試選中的難度級別UpdateData(FALSE);/難度級別顯示voidCDingluDlg::OnStart()/發牌代碼{ S=1; m_Edit1=_T("");/對編輯框清空 m_score=0;/將等分初始化為0 UpdateData(FALSE);/用負給控件變量的值來刷新控件,讓控件把操作后的變量顯示出srand((int)time(0));/以(int)time(0)做為srand()函數的種子seed for(inti=0;i<4;i++)/應用for語句來為四張牌賦值Number[i]=rand()%13;/產生一個0—12的隨機數((CStatic*)GetDlgItem(IDC_Picture0))->SetBitmap(HBITMAP(Bitmap[Number[0]]));((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(HBITMAP(Bitmap[Number[1]]));((CStatic*)GetDlgItem(IDC_Picture2))->SetBitmap(HBITMAP(Bitmap[Number[2]]));((CStatic*)GetDlgItem(IDC_Picture3))->SetBitmap(HBITMAP(Bitmap[Number[3]]));/將隨機產生的四張圖片加載在四張撲克牌位置 GetDlgItem(IDC_Start)->SetWindowText("重新開始");/將“發牌”按鈕的名字改為“重新開始” GetDlgItem(IDC_YanSuan)->EnableWindow(TRUE);/使驗算按鈕被鼠標點擊有效 /設置三個難度級別intiRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); if(iRADIO==IDC_RADIO1){m_Hardlevel=100;}/一級,允許時間為100秒elseif(iRADIO==IDC_RADIO2){m_Hardlevel=60;}/二級,允許時間為60秒 elseif(iRADIO==IDC_RADIO3){m_Hardlevel=50;}/三級,允許時間為50秒CProgressCtrl*m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/定義進度條指針變量m_Progressm_Progress->SetStep(1);//設置步長值為1m_Progress->SetPos(0);//進度條初始位置居左SetTimer(1,1000,NULL);/設置計時器,每隔1秒發出一個消息映射 SpendTime=0;/游戲耗時初始化為0GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);/游戲開始后,難度選擇按鈕禁用GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE); }voidCDingluDlg::OnTimer(UINTnIDEvent){if(nIDEvent==1)/判斷計時器 { CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/定義進度條指針變量m_progress1 m_Progress1->SetPos(m_Progress1->GetPos()+1);/進度條前進一步 m_Progress1->SetRange(0,m_Hardlevel);/進度條的變化范圍在0與m_Hardlevel之間 if(m_Progress1->GetPos()>=m_Hardlevel)/計時是否結束的判斷語句 { KillTimer(nIDEvent);/計時停止 AfxMessageBox("TimeOver!",MB_OK);/顯示“TimeOver!”對話框GetDlgItem(IDC_YanSuan)->EnableWindow(FALSE);/使驗算按鈕無效GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE);GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE);GetDlgItem(IDC_RADIO3)->EnableWindow(TRUE);/使三個難度級別按鈕無效 } } SpendTime++;/時間的流逝,執行一次,自加一次 CStringSSpendTime;/定義指針變量SSpendTime SSpendTime.Format("%d",SpendTime);/輸出SSpendTime字符串中的內容 GetDlgItem(IDC_EDIT3)->SetWindowText(""+SSpendTime+"秒");/顯示時鐘秒的時間 CStringSscore;/定義指針變量SscoreSscore.Format("%d",m_score);/輸出字符串Sscore中的內容GetDlgItem(IDC_EDIT4)->SetWindowText(""+Sscore+"分");/顯示時鐘分的時間 CDialog::OnTimer(nIDEvent); }/判斷最先出現的符號是+號、-號、*號還是/號charCDingluDlg::FirstF(CStringStr){ intSubPos=Str.Find('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.Find('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.Find('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.Find('/')+1;/從字符串Str中查找除號的位置 intPos=200;/設定一個變量,并賦初值200 if(SubPos==0) SubPos=200;/如果沒有減號,給SubPos賦一個不可能的值 if(PluPos==0) PluPos=200;/如果沒有加號,給PluPos賦一個不可能的值 if(MulPos==0) MulPos=200;/如果沒有乘號,給MulPos賦一個不可能的值 if(DivPos==0) DivPos=200;/如果沒有除號,給DivPos賦一個不可能的值 if(Pos>SubPos) Pos=SubPos;/減號存在,并且把SubPos的值賦給Posif(Pos>PluPos) Pos=PluPos;/加號存在,并且把PlusPos的值賦給Pos if(Pos>MulPos) Pos=MulPos;/乘號存在,并且把MulPos的值賦給Pos if(Pos>DivPos) Pos=DivPos;/除號存在,并且把DivPos的值賦給Pos charResult='-';/將'-'賦給Result inttempPos=SubPos;/定義變量tempPos,并將SubPos的值賦給tempPos if(PluPos<tempPos) { Result='+'; tempPos=PluPos;/如果+號在-號之前出現,Result的值為'+' } if(MulPos<tempPos) { Result='*'; tempPos=MulPos;/如果*號在-號之前出現,Result的值為'*' } if(DivPos<tempPos) { Result='/'; tempPos=DivPos;/如果/號在-號之前出現,Result的值為'/' } returnResult;/將Result的值返回}/定位第一個算術符號的位置intCDingluDlg::FirstPos(CStringStr) { intSubPos=Str.Find('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.Find('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.Find('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.Find('/')+1;/從字符串Str中查找除號的位置 intPos=200; if(SubPos==0)/如果沒有-號 SubPos=200;/將SubPos設置成一個不可能的值 if(PluPos==0)/如果沒有+號 PluPos=200;/將PluPos設置成一個不可能的值 if(MulPos==0)/如果沒有*號 MulPos=200;/將MulPos設置成一個不可能的值 if(DivPos==0)/如果沒有/號 DivPos=200;/將DivPos設置成一個不可能的值 if(Pos>SubPos) Pos=SubPos;/減號存在,并且把SubPos的值賦給Posif(Pos>PluPos) Pos=PluPos;/加號存在,并且把PlusPos的值賦給Pos if(Pos>MulPos) Pos=MulPos;/乘號存在,并且把MulPos的值賦給Pos if(Pos>DivPos) Pos=DivPos;/除號存在,并且把DivPos的值賦給Pos returnPos;/將Pos的值返回 }/定位最后一個算術符號的位置intCDingluDlg::LastPos(CStringStr) { intSubPos=Str.ReverseFind('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.ReverseFind('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.ReverseFind('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.ReverseFind('/')+1;/從字符串Str中查找除號的位置 intPos=SubPos;/定義變量Pos,并給它賦初值 if(Pos<PluPos)/通過以下條件更改Pos的值 Pos=PluPos; if(Pos<MulPos) Pos=MulPos; if(Pos<DivPos) Pos=DivPos; returnPos;/返回Pos的值 }intCDingluDlg::SubCompute(CStringStr){ CStringMiddle=""; CStringMul2=""; CStringRight="";/定義三個變量,Middle、Mul2、Right intMulPos=Str.Find('*')+1;/定義*號的位置 intDivPos=Str.Find('/')+1;/定義/號的位置 intFirst=MulPos; if(MulPos>DivPos) First=DivPos;/如果/號在*號之前出現,將DivPos的值送給First if(DivPos==0&&MulPos!=0) { First=MulPos; DivPos=2000;/除號不存在,并且乘號存在,將MulPos的值送給First,并且將DivPos設為不可能值 } if(MulPos==0&&DivPos!=0) { First=DivPos; MulPos=2000;/乘號不存在,并且除號存在,將DivPos的值送給First,并且將MulPos設為不可能值} while(First) { CStringtempStr=Str.Mid(0,First-1);inttemp=LastPos(tempStr); CStringLeft=Str.Mid(0,temp); CStringMul1=Str.Mid(temp,First-temp-1); tempStr=Str.Mid(First,Str.GetLength()-First); temp=FirstPos(tempStr); if(temp==200) {Mul2=tempStr; Right=""; } else { Mul2=tempStr.Mid(0,temp-1); Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1); } if(MulPos>DivPos) Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)/ strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); elseMiddle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)* strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); Str=Left+Middle+Right; MulPos=Str.Find('*')+1; DivPos=Str.Find('/')+1;First=MulPos; if(MulPos>DivPos) First=DivPos; if(DivPos==0&&MulPos!=0) {First=MulPos; DivPos=2000;}/將除號所在位置設置成一個大于MulPos但又不可能的值 if(MulPos==0&&DivPos!=0) {First=DivPos; MulPos=2000;}/將乘號所在的位置設置成一個大于DivPos但不可能的值 }/定位+號、-號首先出現的位置 First=FirstPos(Str); if(First==200)/如果沒有+號、-號,則可以直接返回結果 return(int)strtod(Str.GetBuffer(Str.GetLength()),&stopstring); charFuhao=FirstF(Str);/確定首先出現的符號是+號還是-號 while(First) {/如果找到+號或-號 CStringtempStr=Str.Mid(0,First-1);inttemp=LastPos(tempStr); CStringLeft=Str.Mid(0,temp); CStringMul1=Str.Mid(temp,First-temp-1);tempStr=Str.Mid(First,Str.GetLength()-First); temp=FirstPos(tempStr); if(temp==200) {Mul2=tempStr;Right="";} else {Mul2=tempStr.Mid(0,temp-1);Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1);} if(Fuhao=='+') Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)+ strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); elseMiddle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)- strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); Str=Left+Middle+Right; First=FirstPos(Str); if(First==200)break; Fuhao=FirstF(Str);} return(int)strtod(Middle.GetBuffer(Middle.GetLength()),&stopstring);}/用于計算表達式的結果intCDingluDlg::TotalCompute(CStringStr){ intFirst=Str.ReverseFind('(')+1; while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First;/定位最后一個(號以后的最開始的)號位置 CStringLeft=Str.Mid(0,First-1);/(號左邊的字符串 CStringMiddle=Str.Mid(First,Last-First-1);/()號中間的字符串 CStringRight=Str.Mid(Last,Str.GetLength()-Last);/()號右邊的字符串 intResult=SubCompute(Middle);/進入下面的計算 Middle.Format("%d",Result); Str=Left+Middle+Right; First=Str.ReverseFind('(')+1; } intResult=SubCompute(Str); returnResult;}voidCDingluDlg::OnYanSuan(){KillTimer(1);/點擊驗算按鈕后停止計時 UpdateData();/數據刷新 intflag=1;/設置變量flag,作為后續程序的判斷標準CStringStr=m_Edit1;intFirst=Str.ReverseFind('(')+1;while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First; CStringLeft=Str.Mid(0,First-1); CStringMiddle=Str.Mid(First,Last-First-1); CStringRight=Str.Mid(Last,Str.GetLength()-Last); Str=Left+Mid

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論