c掃雷課程設(shè)計報告和c萬年歷課程設(shè)計_第1頁
c掃雷課程設(shè)計報告和c萬年歷課程設(shè)計_第2頁
c掃雷課程設(shè)計報告和c萬年歷課程設(shè)計_第3頁
c掃雷課程設(shè)計報告和c萬年歷課程設(shè)計_第4頁
c掃雷課程設(shè)計報告和c萬年歷課程設(shè)計_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

青島理工大學(xué)C++面向?qū)ο笳n程設(shè)計報告院(系):專業(yè):學(xué)生姓名:學(xué)號:班級:______題目:起迄日期:設(shè)計地點:指導(dǎo)教師:完成日期:20年7月5日目錄一、題目概述 1二、設(shè)計內(nèi)容 2三、調(diào)試分析 5四、設(shè)計總結(jié) 12五、參考文獻 13六、附錄 13一、題目概述(一):選課題目:題目:游戲—《掃雷》設(shè)計內(nèi)容:掃雷程序?qū)⒁獙崿F(xiàn)類似windows系統(tǒng)自帶的掃雷程序功能即可以顯示附近雷區(qū)雷的個數(shù),同時在游戲成功和失敗的時候能跳出新的對話框,并配有相對應(yīng)的表情,還可以記錄玩家玩耍的時間和剩余雷區(qū)雷的個數(shù)等基本功能。(二):選做次項目的意義:意義:隨著科學(xué)技術(shù)突飛猛進,知識經(jīng)濟初見端倪,特別是信息技術(shù)和網(wǎng)絡(luò)技術(shù)的迅速發(fā)展和廣泛應(yīng)用,對社會的政治、經(jīng)濟、軍事、科技和文化等領(lǐng)域產(chǎn)生越來越深刻的影響,也正在改變這人們的工作、生活、學(xué)習(xí)和文化交流方式。尤其在游戲方面更是影響甚大,各種網(wǎng)絡(luò)游戲隨處可見。尤其可以借助C++實現(xiàn)很多簡單游戲的制作,其中掃雷就是一款適合單機玩耍的游戲。掃雷最原始的版本可以追溯到1973年一款名為“方塊”的游戲。不久之后,“方塊”被改寫成了游戲“Rlogic”。在“Rlogic”里,玩家的任務(wù)是作為美國海軍陸戰(zhàn)隊隊員,為指揮中心探出一條沒有地雷的安全路線,如果路全被地雷堵死就算輸。兩年后,湯姆·安德森在“Rlogic”的基礎(chǔ)上又編寫出了游戲“地雷”,由此奠定了現(xiàn)代掃雷游戲的雛形。1981年,微軟公司的羅伯特·杜爾和卡特·約翰遜兩位工程師在Windows3.1系統(tǒng)上加載了該游戲,掃雷游戲才正式在全世界推廣開來。這款游戲的玩法是在一個9*9(初級),16*16(中級),16*30(高級),或自定義大小的方塊矩陣中隨機布置一定量的地雷(初級為10個,中級為40個,高級為99個)。由玩家逐個翻開方塊,以找出所有地雷為最終游戲目標。如果玩家翻開的方塊有地雷,則游戲結(jié)束。本課程設(shè)計實現(xiàn)類似于Windows操作系統(tǒng)自帶的掃雷游戲。在課程設(shè)計中,系統(tǒng)開發(fā)平臺為WindowsXP/windows7,程序設(shè)計語言采用VisualC++,程序運行平臺為WindowsXP/windows7。在程序設(shè)計中,把整個雷區(qū)看成一個二維數(shù)組,把雷方塊定義為具有所在雷區(qū)二維數(shù)組的行和列、當(dāng)前狀態(tài)、方塊屬性、歷史狀態(tài)的結(jié)構(gòu)體。整個游戲程序包括了布雷、掃雷過程和結(jié)果三個階段,在處理鼠標響應(yīng)事件中伴隨著GDI繪圖。程序通過調(diào)試運行,實現(xiàn)了設(shè)計目標,能夠同時滿足掃雷游戲初學(xué)者和高手的需要。(三):程序所實現(xiàn)的功能:本系統(tǒng)是使用VisualC++在C++的基礎(chǔ)上創(chuàng)建的,并用MFC實現(xiàn)程序可視化,程序功能不是太多,但基本功能都可以實現(xiàn),主要功能包括:(1)選擇級別后將出現(xiàn)相應(yīng)級別的掃雷區(qū)域,這是用戶使用鼠標左鍵單擊雷區(qū)中任何一個方塊便啟動計時器。(2)用戶要揭開某個方塊,可單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下無雷,則顯示一個數(shù)字,該數(shù)字代表方塊的周圍的8個方塊中共有多少顆雷。(3)如果用戶認為某個方塊下埋著雷,單擊右鍵可以在方塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記。用戶每標記出一個掃雷標記(無論用戶的標記是否正確),程序?qū)@示的剩余雷數(shù)減少一個。(4)掃雷勝利后,顯示游戲勝利,失敗后顯示再來一局。(5)用戶可以改變游戲界面的顏色外觀。(6)游戲中用戶可以通過菜單重新開始新游戲。(四):本程序所使用的開發(fā)運行環(huán)境主要包括:開發(fā)工具:VC++6.0運行環(huán)境:Windowswin7、windowsxp(五):本程序設(shè)計要達到的最終目的:將理論教學(xué)中涉及到的知識點貫穿起來,對不同的數(shù)據(jù)類型、程序控制結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)作一比較和總結(jié),結(jié)合設(shè)計題目進行綜合性應(yīng)用,對所學(xué)知識達到融會貫通的程度。通過課程設(shè)計,學(xué)生在下述各方面的能力應(yīng)該得到鍛煉:(1)進一步鞏固、加深學(xué)生所學(xué)專業(yè)課程《C++語言教程》的基本理論知識,理論聯(lián)系實際,進一步培養(yǎng)學(xué)生綜合分析問題,解決問題的能力。(2)全面考核學(xué)生所掌握的基本理論知識及其實際業(yè)務(wù)能力,從而達到提高學(xué)生素質(zhì)的最終目的。(3)利用所學(xué)知識,開發(fā)小型應(yīng)用系統(tǒng),掌握運用C++語言編寫調(diào)試應(yīng)用系統(tǒng)程序,訓(xùn)練獨立開發(fā)應(yīng)用系統(tǒng),進行數(shù)據(jù)處理的綜合能力。(4)對于給定的設(shè)計題目,如何進行分析,理清思路,并給出相應(yīng)的數(shù)學(xué)模型。(5)掌握面向?qū)ο蟪绦蛟O(shè)計的方法。(6)熟練掌握C++語言的基本語法,靈活運用各種數(shù)據(jù)類型。(7)進一步掌握在集成環(huán)境下如何調(diào)試程序和修改程序。二、設(shè)計內(nèi)容(一):系統(tǒng)總體流程圖:開始開始依照使用者初始設(shè)定等待按鍵左鍵鍵右鍵第一次按下方塊顯示方塊布置地雷啟動計時器按下方塊是否為地雷顯示分數(shù)是否再玩玩結(jié)束延按下方塊周圍展開非地雷方塊計時器時間到否否是是否否是是否圖1.系統(tǒng)整體流程圖(二):系統(tǒng)結(jié)構(gòu)圖:掃雷掃雷窗體類模塊背景音樂英雄榜級別選擇鼠標開始窗體加載鼠標函數(shù)遞歸函數(shù)重開函數(shù)畫圖函數(shù)音樂函數(shù)圖2.系統(tǒng)結(jié)構(gòu)圖(三):布雷函數(shù)流程圖開始開始生成隨機的雷方塊的坐標(x,y)判斷(x,y)區(qū)域是否已經(jīng)布下雷在(x,y)區(qū)域布雷,修改狀態(tài)數(shù)據(jù)據(jù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。判斷是否布下所有雷結(jié)束否是是否圖3.布雷函數(shù)流程圖三、調(diào)試分析(一):游戲設(shè)計過程中所需窗體設(shè)計圖4游戲選擇界面設(shè)計圖5幫助界面設(shè)計圖6自定義雷區(qū)界面設(shè)計圖7英雄榜界面設(shè)計(二):游戲過程中所出現(xiàn)的重要界面:圖8.低級水平時游戲界面圖9.中級水平時游戲界面圖10.高級水平時游戲界面圖11.破紀錄時界面圖12.游戲失敗時界面(二):關(guān)鍵代碼及功能顯示:(1)游戲自定義雷區(qū):voidCDlgCustom::OnOK()//設(shè)置長和寬{ UpdateData(); if(m_uWidth<9)m_uWidth=9; if(m_uWidth>30)m_uWidth=30; if(m_uHeight<9)m_uHeight=9; if(m_uHeight>24)m_uHeight=24; if(m_uNumber<10)m_uNumber=10; if(m_uNumber>m_uWidth*m_uHeight)m_uNumber=m_uWidth*m_uHeight-1; CMineWnd*pMine=(CMineWnd*)AfxGetMainWnd(); pMine->SetCustom(m_uWidth,m_uHeight,m_uNumber); CDialog::OnOK();}voidCDlgCustom::InitData(UINTxNum,UINTyNum,UINTmNum){ m_uWidth=xNum; m_uHeight=yNum; m_uNumber=mNum;}(2)點中雷區(qū)時:BOOLCMineWnd::IsInMineArea(UINTrow,UINTcol){ return(row>=0&&row<m_uYNum&&col>=0&&col<m_uXNum);}////失敗處理//voidCMineWnd::Dead(UINTrow,UINTcol){ //按鈕所在的區(qū)域 CRectrcBtn(m_uBtnRect[1],15,m_uBtnRect[2],39); //雷區(qū)所在的區(qū)域 CRectrcMineArea(MINE_AREA_LEFT,MINE_AREA_TOP, MINE_AREA_LEFT+m_uXNum*MINE_WIDTH, MINE_AREA_TOP+m_uYNum*MINE_HEIGHT); UINTi,j; if(m_pMines[row][col].uAttrib==ATTRIB_MINE) {//失?。c中雷 for(i=0;i<m_uYNum;i++) { for(j=0;j<m_uXNum;j++) { m_pMines[row][col].uState=STATE_BLAST; m_pMines[row][col].uOldState=STATE_BLAST; if(m_pMines[i][j].uAttrib==ATTRIB_MINE &&m_pMines[i][j].uState!=STATE_FLAG) { m_pMines[i][j].uState=STATE_MINE; m_pMines[i][j].uOldState=STATE_MINE; } } } } else{//失?。e誤雷 for(i=0;i<m_uYNum;i++) { for(j=0;j<m_uXNum;j++) { m_pMines[row][col].uState=STATE_ERROR; m_pMines[row][col].uOldState=STATE_ERROR; if(m_pMines[i][j].uAttrib==ATTRIB_MINE &&m_pMines[i][j].uState!=STATE_FLAG) { m_pMines[i][j].uState=STATE_MINE; m_pMines[i][j].uOldState=STATE_MINE; } } } } //失敗處理 InvalidateRect(rcMineArea); m_uBtnState=BUTTON_DEAD; InvalidateRect(rcBtn); m_uGameState=GS_DEAD; if(m_uTimer!=0) {//將定時器去激活 KillTimer(ID_TIMER_EVENT); m_uTimer=0; } if(m_bSoundful) {//失敗聲音播放 sndPlaySound((LPCTSTR)LockResource(m_pSndDead),SND_MEMORY|SND_ASYNC|SND_NODEFAULT); }}(3)游戲勝利時聲音代碼:BOOLCMineWnd::Victory(){ UINTi,j; CRectrcBtn(m_uBtnRect[1],15,m_uBtnRect[2],39); //檢測是否勝利 for(i=0;i<m_uYNum;i++) { for(j=0;j<m_uXNum;j++) { if(m_pMines[i][j].uState==STATE_NORMAL)returnFALSE; if(m_pMines[i][j].uState==STATE_DICEY)returnFALSE; } } //勝利則作勝利處理 m_uBtnState=BUTTON_VICTORY; m_uGameState=GS_VICTORY; Invalidate(); if(m_uTimer!=0) {//將定時器去激活 KillTimer(ID_TIMER_EVENT); m_uTimer=0; } //勝利聲音 if(m_bSoundful) { sndPlaySound((LPCTSTR)LockResource(m_pSndVictory), SND_MEMORY|SND_ASYNC|SND_NODEFAULT); }(4)繪制笑臉和數(shù)字圖形代碼: voidCMineWnd::DrawButton(CPaintDC&dc){ CDCcdc; cdc.CreateCompatibleDC(&dc); cdc.SelectObject(m_bmpButton); dc.StretchBlt(m_uBtnRect[0],16,24,24,&cdc,0,24*m_uBtnState,24,24,SRCCOPY); dc.Draw3dRect(m_uBtnRect[1],15,26,26,m_clrDark,m_clrDark); }voidCMineWnd::DrawNumber(CPaintDC&dc){ CDCdcMemory; dcMemory.CreateCompatibleDC(&dc); dcMemory.SelectObject(m_bmpNumber); dc.Draw3dRect(16,15,41,25,m_clrDark,COLOR_WHITE); dc.Draw3dRect(m_uNumRect[0],15,41,25,m_clrDark,COLOR_WHITE); intnum; //drawremainingminenumbers num=(m_nLeaveNum<0)?11:m_nLeaveNum/100; dc.StretchBlt(17,16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY); num=(m_nLeaveNum<0)?-(m_nLeaveNum-num*100)/10:(m_nLeaveNum-num*100)/10; dc.StretchBlt(30,16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY); num=(m_nLeaveNum<0)?-m_nLeaveNum%10:m_nLeaveNum%10; dc.StretchBlt(43,16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY); //drawtakeseconds num=m_uSpendTime/100; dc.StretchBlt(m_uNumRect[0],16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY); num=(m_uSpendTime-num*100)/10; dc.StretchBlt(m_uNumRect[0]+13,16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY); num=m_uSpendTime%10; dc.StretchBlt(m_uNumRect[0]+26,16,13,23,&dcMemory,0,276-23*(num+1),13,23,SRCCOPY);}(5):獲取某個小方塊區(qū)域相鄰8個區(qū)域的雷個數(shù):}UINTCMineWnd::GetAroundNum(UINTrow,UINTcol){ UINTi,j; UINTaround=0; UINTminRow=(row==0)?0:row-1; UINTmaxRow=row+2; UINTminCol=(col==0)?0:col-1; UINTmaxCol=col+2; for(i=minRow;i<maxRow;i++) { for(j=minCol;j<maxCol;j++) { if(!IsInMineArea(i,j))continue; if(m_pMines[i][j].uAttrib==ATTRIB_MINE)around++; } } returnaround;}四、設(shè)計總結(jié)短學(xué)期的課程設(shè)計是一次非常珍貴的機會,這是一次可以讓我們所學(xué)的理論與實際相結(jié)合的機會。我們選擇了游戲掃雷這一題目。通過這次比較完整的一個程序的設(shè)計,我走出了純理論的學(xué)習(xí),從一種全新的角度去學(xué)習(xí)。并且在小團隊實現(xiàn)的MFC過程中,除去知識的大量更新,我學(xué)到了很多東西。其實個人而言,我體會較深的一點是團隊互相幫助學(xué)習(xí)的過程,自己看書學(xué)習(xí)的經(jīng)驗,以及從網(wǎng)上以及其他各種途徑獲得信息和知識的經(jīng)驗。理論與實際相結(jié)合的設(shè)計,鍛煉了我綜合運用所學(xué)的基礎(chǔ)知識,解決實際問題的能力,同時也提高我查閱文獻資料、對程序整體的把握等其他能力水平。而且通過對整體的掌控,對局部的取舍,以及對細節(jié)的斟酌處理,都使我的能力得到了鍛煉,我的各方面經(jīng)驗都得到了極大的豐富。經(jīng)過一個假期,沒有近距離接觸C++,因而一開學(xué)對進行MFC課程設(shè)計這一還算陌生的領(lǐng)域感到有些吃力。在同組的同學(xué)有著很強的C++實力,在進行編程的過程中,我向她學(xué)到了MFC的很多知識,交流中也總結(jié)出比書本上更精髓生動的語言。在自己琢磨MFC各種陌生知識的時候,隊友的耐心與任性,對于知識的渴求,對于工作的專注,極大程度上鼓舞了我。我們在交流中,迸發(fā)出了很多設(shè)計靈感,互相建議改進的過程中,我們分別從各個方面共同改進著,這個已經(jīng)不能僅僅稱作課程設(shè)計的作品。從知識獲得方面來說,各種已經(jīng)學(xué)習(xí)到的C++知識以及各種從網(wǎng)上搜索來的案例,我們都是隨著設(shè)計的不斷深入而不斷熟悉的。和老師以及同學(xué)的溝通交流更使我對程序整體的規(guī)劃與設(shè)計有了新的認識,也對自己提出了新的要求。提高是有限的但提高也是全面的。正是這一次設(shè)計讓我積累了許多實際經(jīng)驗。也必然會讓我在未來的工作學(xué)習(xí)中表現(xiàn)出更高的耐力、理解力、實踐力。順利如期的完成本次課程設(shè)計給了我很大的信心,但是也為我指出很多不足的地方。學(xué)習(xí)其實就是一個不斷完善的過程,正視自己的不足之處。在以后的工作和學(xué)習(xí)中不斷的彌補這些不足之處,在以后的生活中也要保持同樣的態(tài)度,不斷地完善自己。為期二周不到的MFC課程設(shè)計就要這樣畫上一個句號了。從這不長不短的二周中,我獲得了知識,學(xué)到了研究的堅持與韌性,這四周不僅僅是交出了一份作業(yè),還對自己有了新的認識,實在是難得的機遇與經(jīng)歷。五、參考文獻[1]《C++面向?qū)ο蟪绦蛟O(shè)計》.任鳳華、李蘭.西安電子科技大學(xué)出版社[2]《C++面向?qū)ο蟪绦蛟O(shè)計實驗指導(dǎo)及習(xí)題解析》.任鳳華、李蘭。西安電子科技大學(xué)出版社[3].《C++程序設(shè)計實踐教程(第2版)》.吳乃陵、李海文.高等教育出版社[4]《VisualC++課程設(shè)計與系統(tǒng)開發(fā)實例(第4版)》.伍俊良.清華大學(xué)出版社[5]《深入淺出MFC(附光盤)》.侯俊杰.華中科技大學(xué)出版社六附錄 UINT m_uXNum; //X方向小方塊個數(shù) UINT m_uYNum; //Y方向小方塊個數(shù) UINT m_uMineNum; //總的雷個數(shù) int m_nLeaveNum; //剩余的雷個數(shù) UINT m_uSpendTime; //游戲開始擊到目前所花費的時間 UINT m_uGameState; //游戲狀態(tài) UINT m_uTimer; //定時器標識 UINT m_uNewState; //當(dāng)前選中的小方塊的狀態(tài) UINT m_uLevel; //當(dāng)前游戲等級 UINT m_uPrimary; //初級記錄 UINT m_uSecond; //中級記錄 UINT m_uAdvance; //高級記錄 CString m_szPrimary; //初級記錄保持者 CString m_szSecond; //中級記錄保持者 CString m_szAdvance; //高級記錄保持者 BOOL m_bLRBtnDown; //是否為左右鍵同時按下 BOOL m_bClickBtn; //左鍵按下的時候鼠標是否位于按鈕區(qū)域內(nèi) BOOL m_bMarkful; //是否能顯示標記 BOOL m_bColorful; //是否彩色顯示 BOOL m_bSoundful; //是否有聲音 CMenu* m_pSubMenu; //子菜單 CBitmap m_bmpMine; //雷區(qū)背景圖像 CBitmap m_bmpNumber; //數(shù)字背景圖像 CBitmap m_bmpButton; //笑臉按鈕背景圖像 CBrush m_brsBG; //背景畫刷對象 COLORREF m_clrDark; //各按鈕的深色調(diào) RECT m_rcClient; //客戶區(qū)域 UINT m_uBtnRect[3]; //按鈕框區(qū)域坐標數(shù)組 UINT m_uBtnState; //按鈕狀態(tài) UINT m_uNumRect[3]; //數(shù)字框區(qū)域坐標數(shù)組(包括時間和雷個數(shù)) UINT m_uShellRcX[2]; //內(nèi)框以及邊界的坐標X方向 UINT m_uShellRcY[2]; //內(nèi)框以及邊界的坐標Y方向 MINEWND m_pMines[100][100]; //表示雷區(qū)內(nèi)的所有小方塊的二維數(shù)組 MINEWND* m_pNewMine; //當(dāng)前選中的小方塊 MINEWND* m_pOldMine; //上次選中的小方塊 void* m_pSndDead; //失敗提示音 void* m_pSndVictory; //勝利提示音 void* m_pSndClock; //時鐘提示音《高級語言程序設(shè)計》課程設(shè)計報告萬年歷程序設(shè)計信息技術(shù)工程學(xué)院軟件1102張錦琪2012/6/15

課程設(shè)計名稱:C++萬年歷設(shè)計使用工具軟件:MicrosoftvisualC++課程設(shè)計內(nèi)容簡介1、以開關(guān)語句進行執(zhí)行功能的選擇,這些功能分別是:判斷閏年;判斷某天是星期幾;判斷某年的隸屬生肖;輸出某年的日歷;輸出某月的日期;退出系統(tǒng);2、建立類wnl,定義類的成員函數(shù); voidisleapyear(); //判斷閏年,用于輸出判斷結(jié)果,以流的形式boolisleap(intyear); //判斷閏年,返回判斷結(jié)果,用于計算天數(shù)intgetdays(intyear,intmonth,intday); //獲取據(jù)第一天天數(shù)voidweekdays(intyear,intmonth,intday);//獲取星期幾voidprintyear(intyear); //輸出年的日歷voidprintyearmonth(intyear,intmonth);//輸出某年某月的日歷voidanimal(intyear); //判斷某年的生肖intgetyear(){returnYear;} //返回私有成員的值 intgetmonth(){returnMonth;} intgetday(){returnDay;}3、定義私有成員: intYear,Month,Day;4、定義類的對象:_wnl;5、為類的成員函數(shù)填寫代碼,滿足功能實現(xiàn);6、運行環(huán)境:控制臺應(yīng)用程序的源程序;得意之處:可以滿足多功能實現(xiàn),可以循環(huán)執(zhí)行功能;可以選擇每行輸出的月份數(shù);有歡迎界面;客戶輸入錯誤會有提示;使用了C語言的流的形式,判斷閏年,提高執(zhí)行速度;使用I/O流控制頭文件iomanip.h控制月份日歷的輸出,更加整齊;創(chuàng)意的技術(shù)實現(xiàn)主函數(shù)流程判斷某天是周幾判斷某天是周幾判斷閏年獲取天數(shù)輸出年份課程設(shè)計中目前存在的問題:無法在歡迎頁面插入字符畫;設(shè)計實踐過程中的自我感受這是我第一次編寫如此長的代碼,從網(wǎng)上如同大海撈針似的尋找編寫方法,看鋪天蓋地的長代碼,還有的程序是錯的。輸入的時候,沒有小工具。在看著自己熬通宵打出的代碼,一大串的錯誤,真的有些泄氣。改對了執(zhí)行輸出結(jié)果還是錯的,只好重新思考算法。不過通過這次編程我真的學(xué)會了好多,比如其他的頭文件的功能;setfil(‘’)設(shè)置填充字符;setw()定義字段長度……也讓我真正體會到了編程的作用,愛上了編程。參考文獻:[1]呂鳳翥,《C++語言程序設(shè)計》,清華大學(xué)出版社。實驗代碼://萬年歷#include<iostream.h>#include<stdio.h>#include<iomanip.h>intdayofmonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//整形數(shù)組用于儲存每月的天數(shù)charmonthname[13][5]={"","Jan","Feb","Mar","Apr","May","June","July","Aug","Seb","Oct","Nov","Dec"};//字符型數(shù)組用于儲存月份名第一個數(shù)字用于表示字符串?dāng)?shù)(相當(dāng)于行)第二個用于表示字符串長度(相當(dāng)于列)classwnl{public: voidisleapyear(intyear);//判斷閏年,用于輸出判斷結(jié)果,以流的形式 boolisleap(intyear);//判斷閏年,返回判斷結(jié)果,用于計算天數(shù) intgetdays(intyear,intmonth,intday); //獲取據(jù)第一天天數(shù) voidweekdays(intyear,intmonth,intday); //獲取星期幾 voidprintyear(intyear); //輸出年的日歷 voidprintyearmonth(intyear,intmonth); //輸出某年某月的日歷 voidanimal(intyear); //判斷某年的生肖 intgetyear(){returnYear;}//返回私有成員的值 intgetmonth(){returnMonth;} intgetday(){returnDay;}private: intYear,Month,Day;}_wnl;voidmain(){ intchoice,year,month,day; cout<<"~~歡迎來到萬年歷查詢系統(tǒng)~~"<<endl<<endl; cout<<"設(shè)計人:"<<endl; cout<<"天津職業(yè)技術(shù)師范大學(xué)\n\t\t\t設(shè)計人:張錦琪\n\n"; loop: cout<<"╱請按序號輸入您要做的工作:╲"<<endl; cout<<"▏判斷閏年請按1;▕"<<endl; cout<<"▏判斷某天是星期幾請按2;▕"<<endl; cout<<"▏判斷某年的隸屬生肖請按3;▕"<<endl; cout<<"▏輸出某年的日歷請按4;▕"<<endl; cout<<"▏輸出某月的日期請按5;▕"<<endl; cout<<"╲如果您要退出系統(tǒng)請按0;╱"<<endl; cin>>choice; switch(choice) { case0:return; case1: cout<<"輸入一個年份格式如:xxxx"; cin>>year; _wnl.isleapyear(year);break; case2: { cout<<"請輸入您要查詢的天數(shù)格式如xxxxxxxx"; cin>>year>>month>>day; _wnl.weekdays(year,month,day); }break; case3: { cout<<"請輸入您要查詢的年份格式如xxxx:"; cin>>year; _wnl.animal(year); }break; case4: { cout<<"請輸入你要輸出的年份xxxx:"; cin>>year; _wnl.printyear(year); }break; case5: { cout<<"請輸入您要輸出的年月,形如xxxxxx:"; cin>>year>>month; _wnl.printyearmonth(year,month); }break; default:cout<<"輸入錯誤"<<endl; } cout<<"繼續(xù)查詢請輸1"<<endl<<"退出查詢請輸入字符"<<endl; intx; cin>>x; if(x==1) gotoloop;}voidwnl::isleapyear(intyear){ if(year>=1000&&year<=9999) printf("%s\n",year%(year%100?4:400)?"no":"yes");//以C語言流的形式判斷會更快一些,節(jié)省內(nèi)存 else printf("%s\n","沒有按格式輸入"); }boolwnl::isleap(intyear){ if(year%400==0||(year%100!=0&&year%4==0)) return1; else return0; }voidwnl::weekdays(intyear,intmonth,intday){ if(year>=1000&&year<=9999) { if(month<=12&&month>=1) { intmax=dayofmonth[month]; if(day>0&&day<max) { ints=getdays(year,month,day)%7; switch(s) { case0:cout<<"Sunday"<<endl;break; case1:cout<<"Monday"<<endl;break; case2:cout<<"Tuesday"<<endl;break; case3:cout<<"Wednesday"<<endl;break; case4:cout<<"Thursday"<<endl;break; case5:cout<<"Friday"<<endl;break; case6:cout<<"Saturday"<<endl; } } } } else cout<<"沒有按格式輸入"<<endl;}intwnl::getdays(intyear,intmonth,intday){ inti,sum=0; for(i=1;i<year;i++) { if(isleap(i))sum+=366; elsesum+=365; } if(isleap(year))dayofmonth[2]=29; for(i=1;i<month;i++)sum+=dayofmonth[i]; sum+=day; returnsum;}voidwnl::animal(intyear){ if(year>=1000&&year<=9999) { intn=year%12; switch(n) { case0:cout<<"該年是猴年"<<endl;break; case1:cout<<"該年是雞年"<<endl;break; case2:cout<<"該年是狗年"<<endl;break; case3:cout<<"該年是豬年"<<endl;break; case4:cout<<"該年是鼠年"<<endl;break; case5:cout<<"該年是牛年"<<endl;break; case6:cout<<"該年是虎年"<<endl;break; case7:cout<<"該年是兔年"<<endl;break; case8:cout<<"該年是龍年"<<endl;break; case9:cout<<"該年是蛇年"<<endl;break; case10:cout<<"該年是馬年"<<endl;break; case11:cout<<"該年是羊年"<<endl;break; } } else cout<<"沒有按格式輸入"<<endl;}voidwnl::printyear(intyear){ if(year>=1000&&year<=9999) { cout<<"輸入一行輸出的月份數(shù):"; intchoice; cin>>choice; ints; inta[3],b[3];//b數(shù)組用來儲存每月的天數(shù)a數(shù)組用來臨時儲存那一月輸出到的日期 cout<<"year:"<<year<<endl; inti=1; for(i=1;i<=12/choice;i++)//計算縱向輸出幾個月 { for(inth=1;h<=choice;h++)//該循環(huán)用于輸出橫向月份名 { intm=choice*(i-1)+h;//計算月份 cout<<""<<monthname[m]<<""; } cout<<endl; for(h=1;h<=choice;h++) cout<<""; cout<<endl; for(intj=0;j<choice;j++) { cout<<"Su"<<"Mo"<<"Tu"<<"We"<<"Th"<<"Fr"<<"Sa"<<""; } cout<<endl; for(j=0;j<choice;j++)//這個循環(huán)是為了輸出第一行,第一行都是單數(shù),所以提出來輸 { intmonth; month=choice*(i-1)+j+1;//計算月份 s=getdays(year,month,1); s=s%7;//獲取每月第一天 for(intm=0;m<s;m++) cout<<"";//輸出月前的空 if(isleap(year))dayofmonth[2]=29; b[j]=dayofmonth[month];//月份天數(shù)b數(shù)組儲存一個月的

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論