第一篇:C語言程序設(shè)計冒泡排序教學(xué)案例 楊進
C語言程序設(shè)計冒泡排序教學(xué)案例
永川職業(yè)教育中心
楊進
【案例背景】
排序是計算機學(xué)科中一項復(fù)雜而重要的技術(shù),在各種軟件中使用頻率都很高,因此專家們研究了各種排序算法。在中職類設(shè)計課程教學(xué)中,常以冒泡排序來講解排序的原理,它簡單,但過程繁瑣,傳統(tǒng)教學(xué)很難激發(fā)學(xué)生興趣,學(xué)生不易理解,也很難編寫掌握冒泡排序。因此,如何合理設(shè)計教學(xué)過程,讓學(xué)生掌握冒泡排序的思想和編程方法,又能發(fā)散思維,擴充知識,進而激發(fā)學(xué)生對編程課程的興趣,是一個關(guān)鍵問題。
1、學(xué)情分析
學(xué)生已學(xué)習(xí)了程序設(shè)計的三種結(jié)構(gòu),學(xué)習(xí)使用了數(shù)組。但在學(xué)習(xí)排序算法的過程中學(xué)生可能會對數(shù)組變量的變化在理解上存在一定困難,在排序算法中,對雙重循環(huán)內(nèi)外層的作用及有關(guān)循環(huán)參數(shù)的設(shè)置可能會產(chǎn)生一些不合理或是錯誤,需要通過實踐的體驗進行強化使用規(guī)范。
2、教學(xué)目標(biāo)
知識目標(biāo):掌握冒泡排序的原理;能結(jié)合冒泡排序的原理看懂冒泡排序的主要代碼;理解冒泡排序的流程圖;
能力目標(biāo):學(xué)會使用冒泡排序思想設(shè)計解決簡單排序問題的算法;進一步理解程序設(shè)計的基本方法,進一步體會算法與程序?qū)崿F(xiàn)的關(guān)系;
情感目標(biāo):培養(yǎng)學(xué)生分析問題、發(fā)現(xiàn)規(guī)律的能力,激發(fā)學(xué)生學(xué)習(xí)熱情;培養(yǎng)良好的讀程習(xí)慣;
3、教學(xué)重點、難點
重點:冒泡排序算法的基本思想,雙重循環(huán)應(yīng)用
難點:雙重循環(huán)程序的解讀,冒泡排序算法實現(xiàn)后對程序的理解
4、教學(xué)策略與手段
以循序漸進、層層深入為教學(xué)的指導(dǎo)方針,采用講解法、演示法、討論合作、分析歸納法引導(dǎo)學(xué)生參與思考,由特殊到一般,有效地突出重點突破難點,逐步深化對冒泡算法、循環(huán)思想和執(zhí)行過程的理解。
1
5、課前準(zhǔn)備
PPT課件、冒泡排序的視頻文件。【案例描述】
師:在前面的學(xué)習(xí)中,我們學(xué)過了用EXCEL進行一些簡單的數(shù)據(jù)處理方法,請同學(xué)們說說看你是怎么對同學(xué)的成績排次序的?
生:先選好數(shù)后,點排序就行了。
師:是的。只要用EXCEL的排序功能就可以了,點點鼠標(biāo)就能完成。在前面的學(xué)習(xí)中,我們已經(jīng)解開了很多單擊鼠標(biāo)就可以完成某一個任務(wù)的秘密,今天我們就來探訪一下排序的秘密。
師:先讓我們來做個舞蹈視頻,同時要求同學(xué)們談?wù)効春蟮淖约旱南敕ā2⒁垘孜煌瑢W(xué)模擬示范。
這段真人編排的排序算法的舞蹈視頻,非常生動有趣,能充分吸引學(xué)生的眼球,極大激發(fā)了學(xué)生的興趣。
播放完畢,老師提問:請同學(xué)們說說你們看到了什么? 生:議論并說自己的想法。(冒泡排序的過程)
由于視頻播放相對較快,為了讓學(xué)生更好理解與參與,老師還根據(jù)具體情況請了四位涌躍分子來作下一個游戲。
請四位同學(xué)從前到后坐好并拿好老師給你們的數(shù)字,然后從后面開始兩個兩個比較你們手中的數(shù),如果后面的同學(xué)數(shù)小的話就和前面的同學(xué)換一下座位,直到拿到最小數(shù)的同學(xué)坐在第一個位子為止。
現(xiàn)在開始,請其他同學(xué)注意觀察。請同學(xué)們說說你們看到了什么? 生:議論并說自己的想法
師:我聽到了同學(xué)們的發(fā)言了,你們都看到了最小數(shù)已經(jīng)在最前面了,并且是經(jīng)過了3次的比較。想一想,如果要讓拿第二小的數(shù)的同學(xué)坐上第二個座位,還要進行幾次的比較呢?(注意只能從后開始兩兩比較)請拿數(shù)的同學(xué)演示一下。幾次?
生:兩次
師:對了,是兩次,比第一次少了一次。請四位同學(xué)回到座位。剛才我們通過四位
2
同學(xué)的演示其實給我們展示了一種數(shù)據(jù)排序的方法---冒泡法。那么什么是冒泡排序法呢?
冒泡排序法:是指把n個要排序的數(shù)看成一垂直列,從最下面的數(shù)開始兩兩比較相鄰的兩個數(shù),把小的數(shù)向上換,經(jīng)過n-1次處理以達到排序目的的一種排序方法。(課件展示)
分析總結(jié)學(xué)生的演示:(課件展示)第1次冒泡排序時 j 從 4 開始到2:
第2次冒泡排序時 j 從 4 開始到3:
第3次冒泡排序時 j 從 4 開始到4
如果用偽代碼可表示為:
第1次冒泡排序時 j 從 4 開始到2: for(j=4;j>=2 ,j--)if(d[j] 3 for(j=4;j>=3 ,j--)if(d[j] 問:如果我們用一個變i(值分別為1,2,3)來記錄冒泡的次數(shù),請問能否將上述的三次代碼合并成一段通用的代碼呢? 生:能(學(xué)生講偽代碼)for(j= 4,j>=i+1,j--)if(d[j] 歸納分析引入核心代碼: 當(dāng)i=1到3時:(課件展示)for(j= 4;j>=i+1;j--)if(d[j] 那么,我們用我們學(xué)過的循環(huán)語句就可以把某一次的比較表示為:(課件展示)for(j= 4;j>=i+1;j--)if(d[j] 生:思考 師:其實,我們可以在剛才的循環(huán)外再加一層循環(huán),使i也參與變化,以達到對次數(shù)的控制(課件展示) for(i=1;i<4;i++)for(j=4;j>= i+1;j--)if(d[j] 剛才我們已經(jīng)講解了4個數(shù)冒泡排序的代碼,那么有n個數(shù)呢?(課件展示)for(i=1;i 4 for(j=n;j>= i+1;j--)if(d[j] 分析冒泡排序的源程序(用tc編輯器演示分析)為了進一步檢驗學(xué)生的情況,老師作了問題延伸: 編寫一個評分系統(tǒng)的代碼段:有10個評委,最后得分為去掉一個最高分與一個最低分后的平均分。(提示:排序后要將最小和最大的數(shù)去除,再累加其余各數(shù)并除以8)。 【案例反思】 1、本課時采用通過對冒泡排序的基本方法進行分析,利用視頻、游戲等多種教學(xué)手段,采用正向講解算法思想,總結(jié)規(guī)律,歸納算法等方法,一方面使學(xué)生順利從排序的思想過渡到偽代碼并到代碼的書寫,逐步引出雙循環(huán)和冒泡排序的程序?qū)崿F(xiàn),另一方面培養(yǎng)學(xué)生觀察算法,分析算法和使用算法的雙向思維意識和發(fā)散思維能力,提高學(xué)生自覺能力和獨立思考能力,體現(xiàn)了在課程教學(xué)中培養(yǎng)學(xué)生綜合素質(zhì)的教育思想。 2、老師要注意講授時間,要能及時調(diào)節(jié)課堂氣氛,防止學(xué)生課內(nèi)思維疲勞。 5 《C語言循環(huán)程序設(shè)計—for語句》教學(xué)案例 漠河縣職業(yè)技術(shù)學(xué)校 塵威威 《C語言循環(huán)程序設(shè)計—for語句》教學(xué)案例 漠河縣職業(yè)技術(shù)學(xué)校 塵威威 C語言基礎(chǔ)是中職計算機專業(yè)的一門必修課,也是要求計算機專業(yè)學(xué)生學(xué)習(xí)、掌握的一門重點課程,這門課程核心內(nèi)容就是要讓學(xué)生掌握一門編程的語言,學(xué)會編寫簡單的程序,能讀懂C語言源程序。 案例背景: 在計算機應(yīng)用專業(yè)教學(xué)中,C語言是一門理論與實踐結(jié)合得比較緊的課程。要掌握和使用好這門語言,既要求學(xué)生有比較扎實的理論基礎(chǔ),又要具備較強的應(yīng)用實踐能力。如果只是按照傳統(tǒng)的知識體系照本宣科,讓學(xué)生理解這些枯燥的概念都難,更不要說達到良好的教學(xué)效果,而且易挫傷學(xué)生學(xué)習(xí)編程的積極性。因此,在教學(xué)中可以改為從案例入手,通過給學(xué)生演示、讓學(xué)生模仿,在實際應(yīng)用中去探究和領(lǐng)悟這些概念,并適時地加以歸納總結(jié)和進行概念的延伸,讓學(xué)生在輕松愉快的氣氛中學(xué)習(xí)新知識。所以從課程內(nèi)容而言,案例教學(xué)是適用的,是切合學(xué)生的。 循環(huán)結(jié)構(gòu)是程序設(shè)計三種基本結(jié)構(gòu)的重中之重,而循環(huán)中的for循環(huán)是程序中運用最多的,也是較靈活的語句之一,它既是前面知識的延續(xù),又是后面知識的基礎(chǔ),在知識構(gòu)架中起著重要的銜接作用,如果不采用一些恰當(dāng)有效的方法,學(xué)生在學(xué)習(xí)過程中會難以掌握。在教學(xué)過程中教師應(yīng)結(jié)合一些有趣的程序,提高學(xué)生的學(xué)習(xí)興趣,引導(dǎo)學(xué)生全身心地投入課堂。本文針對學(xué)生的實際情況,具體闡述for循環(huán)語句在具體編程時的靈活應(yīng)用。 教學(xué)目標(biāo)確定 (一)知識與技能 1、領(lǐng)會程序設(shè)計中構(gòu)成循環(huán)的方法 2、能使用for循環(huán)語句編寫C語言語句,并能運用for循環(huán)語句編寫出正確的程序。 (二)過程與方法 C語言程序設(shè)計中for循環(huán)語句教學(xué)以行動導(dǎo)向教學(xué)為主線,通過“提出問題―分析問題―解決問題―問題擴展―討論―總結(jié)歸納―實踐”的程序,過渡到知識應(yīng)用和練習(xí)。 本課采用多媒體課件進行教學(xué),通過課件把文字和圖片有機的結(jié)合,使學(xué)生在學(xué)習(xí)過程中更加容易理解,學(xué)習(xí)效率高。在課堂討論和實踐過程中,教師適當(dāng)引導(dǎo),學(xué)生主動探究、歸納總結(jié)學(xué)習(xí)內(nèi)容,既有利于領(lǐng)會掌握新知識點,又能充分發(fā)揮學(xué)生的主體作用。在重點的突破上,采用范例比較教學(xué)法,給出具體的案例,讓學(xué)生通過典型的例子掌握知識,同時通過用while、do while語句的所編寫的程序進行比較,加深學(xué)生印象,讓學(xué)生快速的掌握for循環(huán)語句的基本結(jié)構(gòu)及使用方法。 (三)情感與價值觀 1.讓學(xué)生在自主解決問題的過程中培養(yǎng)成就感,為今后自主學(xué)習(xí)打下良好的基礎(chǔ)。 2、培養(yǎng)學(xué)生學(xué)習(xí)的主動性,激發(fā)學(xué)生學(xué)習(xí)熱情,以及培養(yǎng)團隊合作的精神、自主探究,合作交流的學(xué)習(xí)方法,觀察,樂于分析的學(xué)習(xí)態(tài)度。 教學(xué)重難點確定 C語言程序設(shè)計中for循環(huán)語句的重點是“for語句的結(jié)構(gòu)”,分析題目意圖(即算法分析),并用讓學(xué)生便于理解的方式描述,學(xué)生掌握語句的結(jié)構(gòu)和用法并不困難,難的是在實際的應(yīng)用中那些時候該使用哪種循環(huán)來解決問題比較簡潔、高效,所以我把本節(jié)課的難點確定為“for語句的應(yīng)用”。 學(xué)情分析:本節(jié)課我主要針對計算機專業(yè)高三高考班的學(xué)生,在學(xué)這節(jié)課之前他們應(yīng)準(zhǔn)確掌握《C語言程序設(shè)計》中關(guān)于實現(xiàn)循環(huán)結(jié)構(gòu)語句,如 for 或 while,do-while。并擁有能分析并描述簡單算法如求累加,累乘的能力。 案例描述 案例1:教師將一張空白A4紙向?qū)W生展示,跟同學(xué)們說,今天老師給大家做個試驗,讓你們來猜一猜(學(xué)生的興趣和精神一下就提起來了),然后老師邊演示邊講解,將這張紙對折一下后幾張?學(xué)生都能回答: 2張。繼續(xù)發(fā)問,對折兩下幾張?學(xué)生:4張。對折三下呢?學(xué)生:8張。(這個時候?qū)W生充滿疑惑,老師想干嘛呢,問這么簡單的問題)接著老師提出問題:如果紙理想化的大,對折42下,這些紙的厚度將會多高? 這個教室一下就熱鬧起來了,學(xué)生們紛紛給出自己想像的答案,有些同學(xué)比劃出手勢:伸開雙手說:有那么高,有人說桌子那么高的,有說房子那么高的。又有人馬上否定,哪有那么高。有些同學(xué)拿起筆就開始算,算著算著就不知道該從哪兒下手了。 這個時候老師組織安靜課堂,叫同學(xué)分組給出自己心里傾向的答案,可以估計,可不說理由。 四個小組分別給出的答案是:1:書桌那么高(大概50cm)。2:人的高度(大概170cm)。3:樓房的高度(大概3000cm)。4:大概10厘米。 老師不說哪一組對,只是問同學(xué)們,這個高度該怎么算? 接下來和同學(xué)一起分析得出以下結(jié)論: 1、紙張的厚度h? 2、有多少張紙n? 3、高度=h*n.解決問題1:同學(xué)自行測量(4組同學(xué)各自準(zhǔn)備100頁紙,測出總高度/100,取4個小組的平均值)。最后得出一張紙的厚度約=0.1mm。 這個環(huán)節(jié)的主要目的是讓每個學(xué)生動手,鍛煉他們的動手實踐,合作交流的集體合作精神。 解決問題2:有多少張紙?2的42次方。接下來利用循環(huán)語句來做(即有42個2相乘)。 編寫源程序 所用方法:學(xué)生自己編寫,小組同學(xué)相互交流。 目的:培養(yǎng)并鍛煉學(xué)生將心中已明確的算法落實到具體的程序語句上。 教師活動 這個時候巡查教室,檢查并了解學(xué)生完成情況,對部分有小問題的同學(xué)給予及時幫助。 組上有成績比較好的同學(xué)很快就把程序編寫完畢,我看了一下,選了一個同學(xué)到教室機給大家調(diào)試展示。該同學(xué)給出的程序如下: main(){ int i,k=1;float s;for(i=1;i<=42;i++)k=k*2;/* k是紙張的張數(shù) */ s=k*0.1*1.0e-6;/* 將mm轉(zhuǎn)換成km */ printf(“將一張紙折42下的高度為:%.2f公里”,s);} 調(diào)試結(jié)果:將一張紙折42下的高度為:0.00公里.這個時候老師提問:為什么會出現(xiàn)0.00的情況?請同學(xué)們?yōu)樗赋鰡栴}。同學(xué)們思考了一會無人作答。這個時候老師提醒:k的值將會很大.結(jié)果部分同學(xué)作恍然大悟狀態(tài),有同學(xué)馬上舉手:老師,變量k的值不能定義為int,應(yīng)定義為long;問他為什么?他說:int類型的取值范圍是:32767,裝不下k。老師微笑表揚:方向?qū)α恕8暮茫{(diào)試,結(jié)果還是0.00公里。這個時候又有同學(xué)發(fā)言了:老師,不會定義為long都裝不下k吧。這個時候老師提問:如果整型數(shù)據(jù)long都裝不下的數(shù)據(jù)該定義為什么?學(xué)生回答:實型float。 改好,調(diào)試,Ok,成功!源程序如下 main(){ int i;float s,k=1;for(i=1;i<=42;i++)k=k*2;/* k是紙張的張數(shù) */ s=k*0.1*1.0e-6;/* 將mm轉(zhuǎn)換成km */ printf(“將一張紙折42下的高度為:%.2f公里”,s);} 調(diào)試結(jié)果:調(diào)試結(jié)果:將一張紙折42下的高度為:439804.66公里.全班同學(xué)的臉上都露出成功的喜悅。可同學(xué)們看到結(jié)果,表示不太相信,問老師,是不是算錯了,有這么高呀。老師作肯定的答復(fù):沒錯,就有這么高。比地球到月亮的距離(384,401公里)都還要高。這里可以告誡學(xué)生,科學(xué)不是憑想像,實踐出真知。 問題延伸:已知太陽離地球有1.5億公里,如果理想化的去折紙,最多折多少下有這么高? 學(xué)生分組討論,用什么語句最恰當(dāng)。得出結(jié)論。(用 do while語句)給同學(xué)們五分鐘,請同學(xué)們給出程序并且調(diào)試出結(jié)果。教師點評學(xué)生的程序,指出程序中容易出現(xiàn)錯誤的地方。源程序如下: main(){ int i,k=1;float s;do { k=k*2;S=k*0.1*1.0e-6;i++;} while(s<=1.5e8);printf(“最多可折%d下有地球到太陽那么高”,i);} 案例反思: 通過這案例教學(xué)也給我留下了很多啟示: 1、根據(jù)C語言的學(xué)科特點,和學(xué)生的現(xiàn)狀,特別是根據(jù)學(xué)生平時厭理論而樂操作、解決實際問題能力較差的特點,采用案例教學(xué)可以充分調(diào)動學(xué)生學(xué)習(xí)C語言的興趣和積極性,使學(xué)生處于精神集中的狀態(tài),確保學(xué)生將知識真正學(xué)到手。通過新鮮的案例引領(lǐng)課堂,平時上課精神不集中的學(xué)生都認真分析問題了,個別平時打瞌睡的學(xué)生精神也集中了。 2、學(xué)生編程的信心需要老師去引導(dǎo)和激發(fā)。因為C語言程序?qū)τ谥新殞W(xué)生來講有些難度,部分學(xué)生一看到編程就放棄了,想都不會去想。這個時候老師就要從案例中去引導(dǎo)學(xué)生,和學(xué)生一起從案例去分析解決這個問題的算法,激發(fā)他們編程的嘗試。隨著程序的成功調(diào)試,信心就有了。一個人有了足夠的自信,他將有無窮的力量去面對將來的學(xué)習(xí)和生活。 C語言程序設(shè)計教學(xué)安排 本課程的任務(wù)是結(jié)合一般數(shù)值計算向?qū)W生介紹計算機程序設(shè)計的基本知識,使學(xué)生掌握C語言的基本內(nèi)容及程序設(shè)計的基本方法與編程技巧,了解進行科學(xué)計算的一般思路,培養(yǎng)學(xué)生應(yīng)用計算機解決和處理實際問題的思維方法與基本能力,為進一步學(xué)習(xí)和應(yīng)用計算機打下基礎(chǔ)。本課程學(xué)時總計32學(xué)時。 二、課程內(nèi)容、基本要求與學(xué)時分配 ㈠ C語言的基本概念 3學(xué)時 1.了解C語言的特點及發(fā)展 2.掌握程序的基本結(jié)構(gòu)與書寫格式 3.掌握頭文件、數(shù)據(jù)說明、函數(shù)的開始和結(jié)束標(biāo)志。 ㈡ 數(shù)據(jù)類型及其運算 2學(xué)時 1.掌握數(shù)據(jù)類型(基本類型、構(gòu)造類型、指針類型、空類型)及其定義方法。 2.掌握運算符的種類、運算優(yōu)先級、結(jié)合性。 3.掌握不同類型數(shù)據(jù)間的轉(zhuǎn)換與運算。 4.掌握表達式類型(賦值表達式、算術(shù)表達式、關(guān)系表達式、邏輯表達式、條件表達式、逗號表達式)和求值規(guī)則。 ㈢ 基本語句 2學(xué)時 1.掌握表達式語句、空語句、復(fù)合語句。 2.掌握數(shù)據(jù)的輸入/輸出和輸入/輸出函數(shù)。 3.掌握go to 語句和語句標(biāo)號的使用。 ㈣ 選擇結(jié)構(gòu) 2學(xué)時 1.掌握用if語句實現(xiàn)選擇結(jié)構(gòu)。 2.掌握用switch語句實現(xiàn)多分支選擇結(jié)構(gòu)。 ㈤ 循環(huán)結(jié)構(gòu) 4學(xué)時 1.掌握for循環(huán)結(jié)構(gòu)。 2.掌握while和do while循環(huán)結(jié)構(gòu)。 3.掌握continue、break、return語句。 4.掌握循環(huán)的嵌套。 ㈥ 數(shù)組的定義和引用 4學(xué)時 1.掌握一維數(shù)組和多維數(shù)組的定義、初始化和引用。 2.掌握字符串與字符數(shù)組。 ㈦函數(shù) 6學(xué)時 1.掌握庫函數(shù)的正確調(diào)用。 2.掌握函數(shù)的定義方法。 3.掌握函數(shù)的類型和返回值。 4.掌握形式參數(shù)與實在參數(shù)的區(qū)別,參數(shù)值的傳遞。 5.掌握函數(shù)的一般調(diào)用和嵌套調(diào)用,學(xué)會遞歸調(diào)用。 6.掌握局部變量和全局變量。 7.掌握變量的存儲類型(自動、靜態(tài)、寄存器、外部),變量的作用域和生存期。 8.了解內(nèi)部函數(shù)和外部函數(shù)。 ㈧編譯預(yù)處理 1學(xué)時 1.掌握編譯預(yù)處理的概念和特點 2.了解帶參數(shù)的宏定義及其使用,掌握不帶參數(shù)的宏定義及其使用。 3.掌握“文件包含”的概念和使用。 ㈨指針 8學(xué)時 1.掌握指針的概念及指針的定義。 2.掌握指針運算。 3.掌握指向變量、數(shù)組、字符串、函數(shù)的指針變量。 4.掌握用指針作函數(shù)參數(shù)。 5.掌握指針數(shù)組和指向指針的指針的概念及其定義方法,了解main函數(shù)的命令行參數(shù)。 ㈩結(jié)構(gòu)與聯(lián)合 2學(xué)時 1.掌握結(jié)構(gòu)和聯(lián)合類型數(shù)據(jù)的定義方法。 2.掌握結(jié)構(gòu)和聯(lián)合類型數(shù)據(jù)的引用方法。3.掌握指向結(jié)構(gòu)體的指針變量。3.了解用typedef 定義類型的方法。 (十一)文件操作 2學(xué)時 1.掌握文件類型指針(file類型指針)。 2.掌握文件的打開與關(guān)閉(fopen和fclose函數(shù))。 3.掌握文件的讀與寫(fprintf和fscanf函數(shù))。 三、說明 本課程的先修課程為《計算機文化基礎(chǔ)》和《高等數(shù)學(xué)》 四、課程使用的教材和主要參考書 使用的教材:《C程序設(shè)計》 潭浩強 著 清華大學(xué)出版社 主要參考書:《C語言程序設(shè)計》 王樹義 錢達源 編著 大連理工大學(xué)出版社 編游戲 C語言程序設(shè)計案例精編.txt讓人想念而死,是謀殺的至高境界,就連法醫(yī)也鑒定不出死因。。。C語言 編游戲案例精編 案例一 貪吃蛇游戲 #define N 200 #include food.x++;while(food.y%10!=0) food.y++; food.yes=0;/*畫面上有食物了*/ } if(food.yes==0)/*畫面上有食物了就要顯示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每個環(huán)節(jié)往前移動,也就是貪吃蛇的關(guān)鍵算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i snake.direction=2;else if(key==DOWN&&snake.direction!=3) snake.direction=4;}/*endwhile(1)*/ } /*游戲結(jié)束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*輸出成績*/ void PrScore(void){ char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} /*圖形結(jié)束*/ void Close(void){ getch();closegraph();} 案例二 計算器 #include x=x0; m=0;} else { x=x+width+width/2; m++;} /*否則,右移到下一個字符位置*/ if(v==LEFT)/*左移箭頭時新位置計算*/ if(x<=x0){ x=x0+6*width; m=4;} /*如果移到頭,再左移,則移動到最右邊字符位置*/ else { x=x-width-width/2; m--;} /*否則,左移到前一個字符位置*/ if(v==UP)/*上移箭頭時新位置計算*/ if(y<=y0){ y=y0+4*height+height/2; n=3;} /*如果移到頭,再上移,則移動到最下邊字符位置*/ else { y=y-height-height/2;n--;} /*否則,移到上邊一個字符位置*/ if(v==DOWN)/*下移箭頭時新位置計算*/ if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,則移動到最上邊字符位置*/ else { y=y+height+height/2; n++;} /*否則,移到下邊一個字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置顯示光標(biāo)箭頭*/ } c=str1[n*5+m];/*將字符保存到變量c中*/ if(isdigit(c)||c=='.')/*判斷是否是數(shù)字或小數(shù)點*/ { if(flag==-1)/*如果標(biāo)志為-1,表明為負數(shù)*/ { strcpy(str2,”-“);/*將負號連接到字符串中*/ flag=1;} /*將標(biāo)志值恢復(fù)為1*/ sprintf(temp,”%c“,c);/*將字符保存到字符串變量temp中*/ strcat(str2,temp);/*將temp中的字符串連接到str2中*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,str2);/*顯示字符串*/ } if(c=='+'){ num1=atof(str2);/*將第一個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=1;/*做計算加法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='-'){ if(strcmp(str2,”“)==0)/*如果str2為空,說明是負號,而不是減號*/ flag=-1;/*設(shè)置負數(shù)標(biāo)志*/ else { num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=2;/*做計算減法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } } if(c=='*'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=3;/*做計算乘法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='/'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=4;/*做計算除法標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='^'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=5;/*做計算乘方標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='%'){ num1=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ strcpy(str2,”“);/*將str2清空*/ act=6;/*做計算模運算乘方標(biāo)志值*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='='){ num2=atof(str2);/*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/ switch(act)/*根據(jù)運算符號計算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做減法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6:result=fmod(num1,num2);break;/*做模運算*/ } setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/ sprintf(temp,”%f“,result);/*將結(jié)果保存到temp中*/ outtextxy(5*width,height,temp);/*顯示結(jié)果*/ } if(c=='c'){ num1=0;/*將兩個操作數(shù)復(fù)位0,符號標(biāo)志為1*/ num2=0;flag=1;strcpy(str2,”“);/*將str2清空*/ setfillstyle(SOLID_FILL,color+3);/*設(shè)置用淡綠色實體填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/ outtextxy(5*width,height,”0.“);/*顯示字符串*/ } if(c=='Q')exit(0);/*如果選擇了q回車,結(jié)束計算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光標(biāo)箭頭*/ return;/*返回*/ } /*窗口函數(shù)*/ void mwindow(char *header){ int height;cleardevice(); /* 清除圖形屏幕 */ setcolor(MaxColors1);/*設(shè)置當(dāng)前顏色為白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*設(shè)置畫線方式*/ getviewsettings(&vp);/*將當(dāng)前視口信息裝入vp所指的結(jié)構(gòu)中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*畫矩形邊框*/ } /*設(shè)計鼠標(biāo)圖形函數(shù)*/ int arrow(){ int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定義多邊形坐標(biāo)*/ setfillstyle(SOLID_FILL,2);/*設(shè)置填充模式*/ fillpoly(8,raw);/*畫出一光標(biāo)箭頭*/ size=imagesize(4,4,16,16);/*測試圖象大小*/ rar=malloc(size);/*分配內(nèi)存區(qū)域*/ getimage(4,4,16,16,rar);/*存放光標(biāo)箭頭圖象*/ putimage(4,4,rar,XOR_PUT);/*消去光標(biāo)箭頭圖象*/ return 0;} /*按鍵函數(shù)*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待鍵盤輸入*/ key=bioskey(0);/*鍵盤輸入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊鍵的掃描值,其余為0*/ return(key);/*返回鍵值*/ } 案例三 黑白棋游戲 #include ”graphics.h“ /*圖形系統(tǒng)頭文件*/ #define LEFT 0x4b00 /*光標(biāo)左鍵值*/ #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/ #define DOWN 0x5000 /*光標(biāo)下鍵值*/ #define UP 0x4800 /*光標(biāo)上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分數(shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個人的得分轉(zhuǎn)換成字符串輸出*/ void playtoplay(void);/*人人對戰(zhàn)函數(shù)*/ void DrawQp(void);/*畫棋盤函數(shù)*/ void SetPlayColor(int x);/*設(shè)置棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復(fù)原來棋盤狀態(tài)*/ int QpChange(int x,int y,int z);/*判斷棋盤的變化*/ void DoScore(void);/*處理分數(shù)*/ void PrintScore(int n);/*輸出成績*/ void playWin(void);/*輸出勝利者信息*/ /******主函數(shù)*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化圖形系統(tǒng)*/ DrawQp();/*畫棋盤*/ playtoplay();/*人人對戰(zhàn)*/ getch();closegraph();/*關(guān)閉圖形系統(tǒng)*/ } void DrawQp()/*畫棋盤*/ { int i,j;score1=score2=0;/*棋手一開始得分都為0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*畫水平線*/ line(i,100,i,420);/*畫垂直線*/ } setcolor(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/ fillellipse(500,200,15,15);/*在顯示得分的位置畫棋*/ setfillstyle(SOLID_FILL,8);/*黑色實體填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始兩個黑棋*/ a[3][4]=a[4][3]=2;/*初始兩個白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改變分數(shù)*/ DoScore();/*輸出開始分數(shù)*/ } void playtoplay()/*人人對戰(zhàn)*/ { int x,y,t=1,i,j,cc=0;while(1)/*換棋手走棋*/ { x=120,y=80;/*每次棋子一開始出來的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/ while(1)/*具體一個棋手走棋的過程*/ { PrintScore(1);/*輸出棋手1的成績*/ PrintScore(2);/*輸出棋手2的成績*/ SetPlayColor(t);/*t變量是用來判斷棋手所執(zhí)棋子的顏色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*跳出游戲*/ break;else if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/ { if(t%2==1)/*如果是棋手1移動*/ a[(x-120)/40][(y-120)/40]=1;else/*否則棋手2移動*/ a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判斷棋盤的變化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢復(fù)空格狀態(tài)*/ cc++;/*開始統(tǒng)計嘗試次數(shù)*/ if(cc>=64-score1-score2)/*如果嘗試超過空格數(shù)則停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break;} else continue;/*如果按鍵無效*/ } DoScore();/*分數(shù)的改變*/ break;/*棋盤變化了,則輪對方走棋*/ } else/*已經(jīng)有棋子就繼續(xù)按鍵*/ continue;} else /*四個方向按鍵的判斷*/ if(key==LEFT&&x>120)/*左方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向鍵*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)/*結(jié)束游戲*/ break;if((score1+score2)==64||score1==0||score2==0)/*格子已經(jīng)占滿或一方棋子為0判斷勝負*/ { playWin();/*輸出最后結(jié)果*/ break;} t=t%2+1;/*一方走后,改變棋子顏色即輪對方走*/ cc=0;/*計數(shù)值恢復(fù)為0*/ } /*endwhile*/ } void SetPlayColor(int t)/*設(shè)置棋子顏色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢復(fù)原來格子的狀態(tài)*/ { if(y<100)/*如果是從起點出發(fā)就恢復(fù)藍色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍色棋盤*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*藍色*/ } } int QpChange(int x,int y,int t)/*判斷棋盤的變化*/ { int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*計算數(shù)組元素的行下標(biāo)*/ j=(y-120)/40;/*計算數(shù)組元素的列下標(biāo)*/ SetPlayColor(t);/*設(shè)置棋子變化的顏色*/ /*開始往8個方向判斷變化*/ if(j<6)/*往右邊*/ { for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結(jié)束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk 案例四 迷宮問題 #include DrawPeople(&x,&y,4);/*右下*/ else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5);/*下*/ else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6);/*左下*/ else if(c=='a'&&map[x][y-1]!=1) DrawPeople(&x,&y,7);/*左*/ else if(c=='q'&&map[x-1][y-1]!=1) DrawPeople(&x,&y,8);/*左上*/ } setfillstyle(SOLID_FILL,WHITE);/*消去紅色探索物,恢復(fù)原迷宮圖*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x==N-2&&y==N-2)/*人工控制找成功的話*/ yes=1;/*如果成功標(biāo)志為1*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷貝迷宮數(shù)組 */ { int i,j;for(i=0;i 案例五 掃地雷游戲 #include if(i==9&&j==9)/*右下角格子的統(tǒng)計*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左邊第一列格子的統(tǒng)計*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右邊第一列格子的統(tǒng)計*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的統(tǒng)計*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;} else if(i==9)/*最后一行格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;} else/*普通格子的統(tǒng)計*/ { if(Mine[i-1][j].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;if(Mine[i][j+1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;if(Mine[i+1][j].num==1) nNUM++;if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;} return(nNUM);/*把格子周圍一共有多少雷數(shù)的統(tǒng)計結(jié)果返回*/ } int ShowWhite(int i,int j)/*顯示無雷區(qū)的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/ return;mineNUM--;/*顯示過數(shù)字或者空格的格子就表示多處理了一個格子,當(dāng)所有格子都處理過了表示勝利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*輸出雷數(shù)*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已經(jīng)輸出雷數(shù)的格子用0表示已經(jīng)用過這個格子*/ return;} /*8個方向遞歸顯示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戲過程*/ { int i,j,Num;/*Num用來接收統(tǒng)計函數(shù)返回一個格子周圍有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*統(tǒng)計每個格子周圍有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠標(biāo)左鍵盤按下*/ { */ */ MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi) { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/ continue;if(Mine[i][j].num!=0)/*如果格子沒有處理過*/ { if(Mine[i][j].num==1)/*鼠標(biāo)按下的格子是地雷*/ { MouseOff();GameOver();/*游戲失敗*/ break;} else/*鼠標(biāo)按下的格子不是地雷*/ { MouseOff();Num=MineStatistics(i,j);if(Num==0)/*周圍沒地雷就用遞歸算法來顯示空白格子*/ ShowWhite(i,j);else/*按下格子周圍有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*輸出當(dāng)前格子周圍的雷數(shù)*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;} MouseOn();Mine[i][j].num=0;/*點過的格子周圍雷數(shù)的數(shù)字變?yōu)?表示這個格子已經(jīng)用過 if(mineNUM<1)/*勝利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠標(biāo)右鍵鍵盤按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當(dāng)前鼠標(biāo)位置在格子范圍內(nèi)*/ { j=(MouseX-190)/20;/*x坐標(biāo)*/ i=(MouseY-90)/20;/*y坐標(biāo)*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現(xiàn)在顯示紅旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有紅旗標(biāo)志再按右鍵就紅旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn();sleep(1);} } } 案例六 速算24 #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系統(tǒng)時間函數(shù)*/ #include ”graphics.h“ /*圖形函數(shù)*/ #include ”alloc.h“/*動態(tài)地址分配函數(shù)*/ #include ”stdlib.h“ /*庫函數(shù)*/ #include ”string.h“ /*字符串函數(shù)*/ #include ”ctype.h“ /*字符操作函數(shù)*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*撲克牌,10用0來表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*棧1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*棧2*/ void init(void);/*圖形驅(qū)動*/ void close(void);/*圖形關(guān)閉*/ void play(void);/*發(fā)牌的具體過程*/ void rand1(int j);/*隨機發(fā)牌函數(shù)*/ void change(char *e,char *a);/*中綴變后綴函數(shù)*/ int computer(char *s);/*后綴表達式計算函數(shù)*/ STACK1 *initstack1(STACK1 *top);/*棧1初始化*/ STACK1 *push(STACK1 *top,int x);/*棧1入棧運算*/ STACK1 *pop(STACK1 *top);/*棧1刪除棧頂元素*/ int topx(STACK1 *top);/*棧1讀棧頂元素*/ STACK1 *ptop(STACK1 *top,int *x);/*棧1讀出棧頂元素值并刪除棧頂元素*/ int empty(STACK1 *top);/*判棧1是否為空函數(shù)*/ STACK2 *initstack2(STACK2 *top);/*棧2初始化*/ STACK2 *push2(STACK2 *top,char x);/*棧2入棧運算*/ STACK2 *pop2(STACK2 *top);/*棧2刪除棧頂元素*/ char topx2(STACK2 *top);/*棧2讀棧頂元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*棧2讀出棧頂元素值并刪除棧頂元素*/ int empty2(STACK2 *top);/*判棧2是否為空函數(shù)* int text1(char *s);/*顯示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函數(shù)*/ while(1){ setbkcolor(BLACK);/*設(shè)置背景顏色*/ cleardevice();/*清屏*/ play();/*發(fā)牌*/ gotoxy(1,15);/*移動光標(biāo)*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示輸入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*輸入字符串壓回車鍵*/ change(s1,s);/*調(diào)用change函數(shù)將中綴表達式s1轉(zhuǎn)換為后綴表達式s*/ result=computer(s);/*計算后綴表達式的值,返回結(jié)果result */ if(result==24)/*如果結(jié)果等于24*/ text1(”very good“);/*調(diào)用函數(shù)text1顯示字符串”very good“*/ else text1(”wrong!!“);/*否則函數(shù)text1顯示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否繼續(xù)*/ scanf(”%c“,&ch);/*輸入一字符*/ if(ch=='n'||ch=='N')/*如果該字符等于n或N*/ break;/*跳出循環(huán),程序結(jié)束*/ } /*否則,開始下一輪循環(huán)*/ close();return;/*返回*/ } void rand1(int j)/*隨機發(fā)牌函數(shù)*/ { int kind,num;char str[3],n;randomize();while(1)/*循環(huán)直到有牌發(fā)*/ { kind=random(4);/*花色隨機數(shù)*/ num=random(13);/*大小隨機數(shù)*/ if(p[kind][num]!=-1)/*該數(shù)未取過*/ { n=p[kind][num];/*取相應(yīng)位置的撲克牌數(shù)*/ p[kind][num]=-1;/*牌發(fā)好以后相應(yīng)位置的元素置-1*/ break;} } switch(kind)/*花式的判斷*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*紅桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*顯示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*顯示右下角花色*/ if(n!='0')/*輸出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*顯示牌的大小*/ } else/*輸出10的時候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*發(fā)牌的具體過程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*畫空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*畫矩形框*/ rand1(j);/*隨機取牌*/ delay(10000);/*延時顯示*/ } } void init(void)/*圖形驅(qū)動*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*圖形關(guān)閉*/ { closegraph();} void change(char *e,char *a)/*中綴字符串e轉(zhuǎn)后綴字符串a(chǎn)函數(shù)*/ { STACK2 *top=NULL;/* 定義棧頂指針*/ int i,j;char w;i=0;j=0;while(e[i]!='
主站蜘蛛池模板:
女同久久精品国产99国产精品|
小12萝8禁在线喷水观看|
五月狠狠亚洲小说专区|
av在线观看地址|
人妻精品久久久久中文字幕69|
欲香欲色天天天综合和网|
国产精品美女久久久久久久久|
欧美成妇人吹潮在线播放|
男女性爽大片视频|
国产3p露脸普通话对白|
亚洲精品卡2卡三卡4卡2卡乱码|
欧美成人精品三级网站视频|
久久综合精品国产一区二区三区无|
国产日韩精品中文字无码|
黑人强伦姧人妻久久|
av国产传媒精品免费|
又粗又大内射免费视频小说|
无码aⅴ精品一区二区三区浪潮|
华人在线亚洲欧美精品|
无码国内精品人妻少妇蜜桃视频|
精品一区二区三区波多野结衣|
久久中文字幕人妻av熟女|
欧美另类精品xxxx|
亚洲第一成人网站|
国产av无码一区二区二三区j|
精产国品一区二区三产区|
人妻少妇中文字幕乱码|
人妻夜夜爽天天爽爽一区|
免费观看又色又爽又湿的视频软件|
人妻少妇伦在线无码专区视频|
亚洲不卡av不卡一区二区|
国产互换人妻xxxx69|
欧美大片aaaaa免费观看|
亚洲伊人久久成人综合网|
亚洲女女女同性video|
久久精品国产一区二区三区肥胖|
国产成人麻豆精品午夜福利在线|
无码精品尤物一区二区三区|
欧洲无码一区二区三区在线观看|
69天堂人成无码麻豆免费视频|
国产精一品亚洲二区在线播放|
第二篇:《C語言循環(huán)程序設(shè)計for語句》教學(xué)案例
第三篇:C語言程序設(shè)計教學(xué)安排
第四篇:編游戲 C語言程序設(shè)計案例精編