第一篇:貪吃蛇C語(yǔ)言課程設(shè)計(jì)報(bào)告
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
貪吃蛇游戲設(shè)計(jì)
姓名: 張力
學(xué)號(hào): 1002032
3完成日期: 月 日1
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
一、設(shè)計(jì)目的
貪吃蛇游戲程序功能的實(shí)現(xiàn)主要是建立在二維數(shù)組和圖形界面的應(yīng)用上,通過編寫游戲程序能夠熟悉掌握相關(guān)數(shù)組和圖形函數(shù)的運(yùn)用,提高編程水平,增加編程的興趣
二、總體設(shè)計(jì)
主函數(shù)
↓
圖形驅(qū)動(dòng)Init 畫界面DrawK 游戲具體過程GamePlay 圖形結(jié)束Close
↓
游戲結(jié)束GameOver 輸出成績(jī)PrScore
三、詳細(xì)設(shè)計(jì)(項(xiàng)目成員及分工、模塊功能說明(如函數(shù)功能、入口及出口參數(shù)說明,函數(shù)調(diào)用關(guān)系描述等)
①主函數(shù)main():
定義使用的常數(shù),全局變量及函數(shù)原型說明,并調(diào)用Init()函數(shù)初始化圖形系統(tǒng);然后調(diào)用DrawK()函數(shù)畫界面,調(diào)用GamePlay()函數(shù)實(shí)現(xiàn)游戲的具體過程,游戲結(jié)束后調(diào)用Close()函數(shù)關(guān)閉圖形系統(tǒng)結(jié)束程序。
②畫界面函數(shù)DrawK():
主界面是一個(gè)密封的圍墻,用兩個(gè)循環(huán)語(yǔ)句分別在水平方向和垂直方向輸出連續(xù)的寬度和高度均為10個(gè)單位的矩形小方塊,設(shè)置成淡青色,背景顏色為黑色。
③游戲具體過程函數(shù)GamePlay():
算法過程:
a.設(shè)置初始值。為防止食物出現(xiàn)在一個(gè)位置上,要設(shè)置隨機(jī)數(shù)發(fā)生器,真正產(chǎn)生隨機(jī)數(shù)。初始時(shí),蛇只有蛇頭,設(shè)定一個(gè)開始方向;
b.循環(huán)執(zhí)行,直到按Esc鍵退出; c.沒有按鍵的情況下,循環(huán)執(zhí)行。
如果沒有食物,隨機(jī)出現(xiàn)食物;食物的隨機(jī)出現(xiàn)要確保它的位置在10的倍數(shù)位置上,因?yàn)樯叩淖鴺?biāo)都是以10為模的;如果有食物,則顯示食物,蛇
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
移動(dòng)身體,根據(jù)蛇的方向改變坐標(biāo)值,并判斷蛇是否撞到了墻或自己吃到了自己,如果出現(xiàn)這兩種情況之一,則蛇死;調(diào)用游戲結(jié)束函數(shù)GamePlay(),結(jié)束本次游戲;
判斷蛇吃到食物的方法是蛇頭的坐標(biāo)和食物的坐標(biāo)都相等;如果蛇吃到了食物,蛇身體長(zhǎng)一節(jié),數(shù)組元素增加一個(gè),身體節(jié)數(shù)、分?jǐn)?shù)都進(jìn)行相應(yīng)的改變。
在新位置畫出蛇。采用的方法是每次移動(dòng)的時(shí)候從最后一節(jié)開始到倒數(shù)第二節(jié),將前一節(jié)的坐標(biāo)賦值給后一節(jié)的坐標(biāo),移動(dòng)后只要把最后一節(jié)用背景色去除即可。
D.如果有按鍵,則識(shí)別按鍵值。如果按鍵為Esc鍵則結(jié)束游戲,程序運(yùn)行結(jié)束;如果所按鍵為方向鍵,則根據(jù)該鍵改變蛇方向的變量direction的值,相反方向鍵無(wú)效。
④游戲結(jié)束函數(shù)GameOver():
游戲結(jié)束,清除屏幕,調(diào)用輸出分?jǐn)?shù)函數(shù)PrScore(),并顯示游戲結(jié)束。
⑤輸出分?jǐn)?shù)函數(shù)PrScore():
在指定位置利用sprintf()將整數(shù)轉(zhuǎn)換為字符串,用outtextxy()輸出,、bar()函數(shù)的應(yīng)用是為了覆蓋原來的值。
⑥圖形結(jié)束函數(shù)Close():
在顯示游戲結(jié)束信息的畫面時(shí),按任意鍵關(guān)閉圖形系統(tǒng),程序結(jié)束。
四、調(diào)試與測(cè)試:調(diào)試方法,測(cè)試結(jié)果的分析與討論,測(cè)試過程中遇到的主要問題和采取的解決措施等;
將源文件在TC3.0環(huán)境下調(diào)試運(yùn)行,前期發(fā)現(xiàn)錯(cuò)誤為游戲界面靜止。
五、源程序清單及執(zhí)行結(jié)果:
#include
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
#define UP 0x4800 #define Esc 0x011b #define N 200 /*定義全局變量*/ int i,key;int score=0;/*得分*/ int gamespeed=50000;/*游戲速度可以自己調(diào)整*/ struct Food { int x;/*定義食物的橫坐標(biāo)*/ int y;/*定義食物的縱坐標(biāo)*/ int yes;/*判斷是否要出現(xiàn)食物的變量*/ }food;/*食物的結(jié)構(gòu)體*/ struct snake { int x[N];int y[N];int node;/*蛇的節(jié)數(shù)*/ int direction;/*蛇的移動(dòng)方向*/ int life;/*蛇的生命,0活著,1死亡*/ }snake;
void Init(void);/*圖形驅(qū)動(dòng)*/ void Close(void);/*圖形結(jié)束*/ void DrawK(void);/*開始畫面*/ void GameOver(void);/*結(jié)束游戲*/ void GamePlay(void);/*玩游戲的具體過程*/ void PrScore(void);/*輸出成績(jī)*/
/*圖形驅(qū)動(dòng)*/ void Init(void){ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“D:TC30LIB”);}
/*開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/ void DrawK(void){ setbkcolor(LIGHTGREEN);setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/ for(i=50;i<=600;i+=10)/*畫圍墻*/ {
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
rectangle(i,40,i+10,49);/*上邊*/
rectangle(i,451,i+10,460);/*下邊*/ } for(i=40;i<=450;i+=10){
rectangle(50,i,59,i+10);/*左邊*/
rectangle(601,i,610,i+10);/*右邊*/ } }
/*玩游戲的具體過程*/ void GamePlay(void){ randomize();/*隨機(jī)數(shù)發(fā)生器*/ food.yes=1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/ snake.life=0;/*蛇還活著^ ^*/ snake.direction=1;/*方向向右*/ snake.x[0]=100;snake.y[0]=100;/*蛇頭*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*蛇的節(jié)數(shù)為2*/ PrScore();/*輸出得分*/ while(1)/*可以重復(fù)玩游戲,按Esc鍵結(jié)束*/ {
While(!kbhit())/*在沒有按鍵的情況下,蛇自己移動(dòng)身體*/
{
if(food.yes==1)/*需要出現(xiàn)新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
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--)/*蛇一個(gè)節(jié)一個(gè)節(jié)地往前移*/
{
snake.x[i]=snake.x[i-1];
貪吃蛇游戲程序設(shè)計(jì)報(bào)告
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右左上下四個(gè)方向,通過判斷這個(gè)來移動(dòng)蛇頭*/
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;
}
/*從蛇的第四節(jié)開始判斷蛇有沒有自己把自己吃掉*/
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*顯示游戲結(jié)束*/ snake.life=1;/*蛇死了T T!*/ break; } } If(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*判斷蛇是否撞到墻*/ { GameOver();/*游戲結(jié)束*/ snake.life=1;/*蛇死了T T!*/ } if(snake.life==1)/*如果蛇死了就跳出內(nèi)循環(huán),重新開始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃掉食物啦!*/ { setcolor(0);/*把畫面上的食物顏色覆蓋掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20; snake.y[snake.node]=-20; /*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/ snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/ food.yes=1;/*畫面上需要出現(xiàn)新的食物*/ score+=10;/*加十分!*/ PrScore();/*輸出新得分*/ } setcolor(4);/*畫出蛇*/ for(i=0;i 貪吃蛇游戲程序設(shè)計(jì)報(bào)告 rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的最后一節(jié)*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);}/*endwhile(!kbhit)*/ if(snake.life==1)/*如果蛇死了就跳出循環(huán)*/ break;key=bioskey(0);/*接收按鍵*/ if(key==Esc)/*按Esc鍵退出*/ break;else if(key==UP&&snake.direction!=4)/*判斷是否往相反方向移動(dòng)*/ snake.direction=3;else if(key==RIGHT&&snake.direction!=2) snake.direction=1;else if(key==LEFT&&snake.direction!=1) 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”);/*顯示游戲結(jié)束*/ getch();} void PrScore(void)/*輸出成績(jī)*/ { 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);} 貪吃蛇游戲程序設(shè)計(jì)報(bào)告 void Close(void)/*圖形結(jié)束*/ { getch();closegraph();} void main(void)/*主函數(shù)*/ { Init();DrawK();GamePlay();Close();} 8 高級(jí)語(yǔ)言程序設(shè)計(jì) 課程設(shè)計(jì)報(bào)告 Experiment Designing reporter 課程名稱:高級(jí)語(yǔ)言程序設(shè)計(jì) 英文名稱 : C Program Experiment Designing 專業(yè):自動(dòng)化 111 學(xué)號(hào): XXX 姓名: XXX 指導(dǎo)教師: XXX 日期: 2012 年 6月 17日至 2011 年6 月 20 日 山東工商學(xué)院信電學(xué)院 一:課程設(shè)計(jì)內(nèi)容 程序功能介紹 貪吃蛇游戲是一個(gè)經(jīng)典小游戲,深受眾多玩家喜愛,其規(guī)則是:一條蛇在封閉圍墻里,圍墻里隨機(jī)出現(xiàn)一個(gè)食物,通過按鍵盤四個(gè)光標(biāo)鍵控制蛇向上下左右四個(gè)方向移動(dòng),蛇頭撞倒食物,則食物被吃掉,蛇身體長(zhǎng)一節(jié),同時(shí)記10分,接著又出現(xiàn)食物,等待蛇來吃,如果蛇在移動(dòng)中撞到墻或身體交叉蛇頭撞倒自己身體游戲結(jié)束。此游戲不僅能鍛煉人的思維敏捷性,而且還可以提高玩家的邏輯判斷能力。設(shè)計(jì)思路 我們小組稱設(shè)計(jì)本次課題——貪吃蛇的思路為“貪快速上手貪吃蛇三步曲”: 第一步: 尋找到一個(gè)真正可以運(yùn)行的已用C編好的貪吃蛇。因?yàn)槲覀儺吘箯奈纯吹竭^用C編游戲的程序,讓我們兩手一抹黑的開始編寫是有一定的困難的,如果我們自己找一個(gè)已經(jīng)設(shè)計(jì)好的程序,以此為跳板實(shí)現(xiàn)我們想要達(dá)到的效果,那么肯定是高效的。所以我們組統(tǒng)一決定,去尋找一個(gè)可以運(yùn)行的C編譯的貪吃蛇。第二步: 運(yùn)行游戲并了解游戲程序。 我們認(rèn)為,只有你運(yùn)行并了解一個(gè)游戲,才能知道游戲里需要什么樣的改進(jìn)和創(chuàng)新,如果你自己本身就沒玩過這個(gè)游戲,那么你就是再有技術(shù),你也永遠(yuǎn)改進(jìn)和改編不了一個(gè)游戲,因?yàn)槟愀静恢滥阍诟墒裁础?/p> 同樣重要的是了解游戲程序。因?yàn)橹挥锌炊顺绦颍拍軐?shí)現(xiàn)對(duì)他的改編,才能游刃有余。第三步: 尋找模塊并分類,而后進(jìn)行改編。 尋找到你想要改變的游戲內(nèi)容的控制模塊,比如,我想要增加一堵墻,那么就應(yīng)該找到 void DrawK(void){ setcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH);for(i=200;i<=500;i+=10) rectangle(i,200,i+10,209);} 然后要找到:改變蛇初始長(zhǎng)度、顏色、初始位置的模塊,改變蘋果出現(xiàn)位置的模塊,讓蛇見墻死的模塊,讓蛇吃蘋果加長(zhǎng)的模塊???.并且進(jìn)行分類,這樣下次再想實(shí)現(xiàn)某個(gè)目標(biāo)時(shí),可以一目了然的進(jìn)行改編。對(duì)于找到的模塊如何進(jìn)行改編呢?怎么才能知道某個(gè)數(shù)值或函數(shù)代表什么呢? 我們有兩個(gè)方法: 1.)看名字,比如snakecolor(),很明顯他的意思是蛇的顏色。2.)控制變量猜想,比如設(shè)置墻的時(shí)候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309);中的200,500,300,209 代表什么呢?我們可以猜想:它很像是坐標(biāo)上的(x,y)的格式,是不是呢?可可以先讓其他數(shù)值不變,只讓309改變,改變后發(fā)現(xiàn)上面的墻變粗了,由此可見這個(gè)數(shù)字控制的是一堵墻的最下面一行的坐標(biāo)。 關(guān)于該程序的相關(guān)分析思路答題模板: 1.貪吃蛇程序流程圖如下: 二.貪吃蛇程序的改編: 經(jīng)過小組成員的認(rèn)真研究我們對(duì)其進(jìn)行了如下改編 第一步加墻 void DrawK(void){ /*setbkcolor(MAGENTA);*/ setcolor(5);// 可以改變顏色 setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/ 橫向上的墻: for(i=100;i<=600;i+=10)// 本行代表行坐標(biāo)上:100代表墻的初始位置,i<=600代表墻的結(jié)尾。 { rectangle(i,60,i+10,69);//本行代表縱坐標(biāo)上:60代表墻的最上面一行的位置,69代表墻最下面一行的位置。69-60=9,9代表墻塊的厚度 } 縱向上的墻: for(i=100;i<=400;i+=10)//本行代表縱坐標(biāo)上:100代表墻的初始位置,i<=400代表墻的結(jié)尾 { rectangle(100,i,109,i+10);//本行代表縱坐標(biāo)上:100代表墻的最左邊面一行的位置,69代表墻最右面一行的位置。69-60=9,9代表墻塊的寬度 } 我們認(rèn)為本模塊最重要的是for語(yǔ)句控制的坐標(biāo)代表的意思。只要明白了坐標(biāo)的意思,就可以實(shí)現(xiàn)對(duì)游戲的改編。 第二步就是進(jìn)行對(duì)新加入的墻蛇是否撞上死亡 讓蛇撞墻死 if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&& snake.y[0]<=215) /*其中,對(duì)x,y范圍的控制,實(shí)際是對(duì)蛇撞擊的死亡區(qū)域的限制。*/ { GameOver();/*本次游戲結(jié)束*/ snake.life=1;/*蛇死*/ } 相應(yīng)的新添加的墻。 for(i=200;i<=500;i+=10)/*畫圍墻*/ { rectangle(i,200,i+10,209);/*指定位置*/ 第三步食物的定點(diǎn)出現(xiàn) if(food.yes==1)/*需要出現(xiàn)新食物*/ 這里說明一下:rand()產(chǎn)生0-65535的數(shù),在limits.h里有定義%400后產(chǎn)生一個(gè)0-399的數(shù)+60 則為 60 –459,即:%400+60意思是在60~399之間隨機(jī)產(chǎn)生一個(gè)數(shù)。 { food.x=rand()%400+60; food.y=rand()%350+60; while(food.x%10!=0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/ food.x++; while(food.y%10!=0) food.y++; food.yes=0;/*畫面上有食物了*/ } 如果將food.x=(常數(shù)a)那么食物就會(huì)出現(xiàn)在x=a行的隨機(jī)列,對(duì)于food.y=(常數(shù)b)那么食物就出現(xiàn)在y=b列的隨機(jī)行。 第四步對(duì)食物墻壁的顏色以及對(duì)蛇的運(yùn)動(dòng)速個(gè)性化調(diào)節(jié) setcolor(4);// 對(duì)顏色的調(diào)整 int gamespeed=50000;/*游戲速度自己調(diào)整*/ 通過改變變量的值,就可以個(gè)性化選擇自己喜歡的顏色,這將是一場(chǎng)別開生面的游戲界面。* 紅色代表解析淺藍(lán)代表提示 三.課程設(shè)計(jì)總結(jié) 有言曰:“實(shí)踐出真知”,在這幾天的課程設(shè)計(jì)實(shí)踐中,我們組三人真正的體會(huì)到了這句話的真諦。 在經(jīng)歷了一學(xué)期的C語(yǔ)言學(xué)習(xí)后,我們從以往的“紙上談兵”直接過渡到“實(shí)際作戰(zhàn)”。我們實(shí)現(xiàn)了讓靜態(tài)的程序變成動(dòng)態(tài)的游戲效果,雖然我們只是改編了一下別人做好的程序,但我們同樣由此獲益匪淺,感觸頗深,當(dāng)然也發(fā)現(xiàn)了許多自己的不足。 首先,在我們剛剛進(jìn)行第一步“尋找程序”的時(shí)候,就被擱淺了,因?yàn)槲覀儼l(fā)現(xiàn),在網(wǎng)上能找到一個(gè)真正符合我們使用標(biāo)準(zhǔn)的程序很難,就是找到了幾個(gè)也沒有能運(yùn)行它們的程序。我們花費(fèi)了前兩天的時(shí)間來尋找能夠使用的程序和軟件,但最后還是一無(wú)所獲,正當(dāng)我們一籌莫展的時(shí)候,我們的導(dǎo)師——楊老師給我們帶來了曙光,使得我們?cè)诤诎抵姓业搅讼M墓饷?,楊老師給我們傳來了一個(gè)上屆師哥做好的程序,并且把它的運(yùn)行軟件也給了我們,這對(duì)我們來說無(wú)疑是雪中送炭,得到這個(gè)程序后,我們?nèi)齻€(gè)人看到了C語(yǔ)言運(yùn)行一個(gè)游戲的流程和方法,我們腦中也大概有了一個(gè)思路。我們?nèi)齻€(gè)人以此程序?yàn)樘?,直接開始對(duì)程序模塊進(jìn)行挑選,因?yàn)槲覀円呀?jīng)浪費(fèi)了兩天,所以我們決定進(jìn)行分工作業(yè),分別去尋找:筑墻模塊,加蘋果模塊,撞墻死模塊。最后我們用了一下午時(shí)間完成了三大步中的前兩大步和第三步的第一部分,剩下的就是最重要而充滿挑戰(zhàn)的改編了,從以上的操作中,讓我們明白了找對(duì)一個(gè)平臺(tái)的重要性,這個(gè)平臺(tái)就是老師給我們的程序,就是我們的前進(jìn)方向。沒有了方向了的征程,一開始就是個(gè)錯(cuò)誤。在我們尋找程序模塊的時(shí)候,我們對(duì)于程序中的很多東西都是模模糊糊的概念,比如struck是什么,比如for語(yǔ)句的使用,以及for語(yǔ)句的循環(huán)體是什么,當(dāng)然我們也發(fā)現(xiàn)了定義字符在長(zhǎng)的程序中的方便與重要性。還有就是我們發(fā)現(xiàn)程序在編寫時(shí)的規(guī)范性很重要,比如同級(jí)別花括號(hào)的位置的對(duì)應(yīng),對(duì)應(yīng)好了,模塊就好找,對(duì)應(yīng)不好就很亂。還有定義函數(shù)及變量的時(shí)候,函數(shù)名字和變量名最好是見名知意,比如我們所看的程序中,gamespeed,snakecolour,food.....在最后的攻堅(jiān)階段,為了實(shí)現(xiàn)對(duì)程序的改編,我們使用控制變量猜想法是正確的選擇,比如設(shè)置墻的時(shí)候for(i=200;i<=500;i+=10); rectangle(i,300,i+10,309);中的200,500,300,209 代表什么呢?我們猜想:它很像是坐標(biāo)上的(x,y)的格式,是不是呢?我們先讓其他數(shù)值不變,只讓309改變,改變后發(fā)現(xiàn)上面的墻變粗了,由此我們知道這個(gè)數(shù)字控制的是一堵墻的最下面一行的坐標(biāo)。我們用這個(gè)方法知道了其他很多數(shù)值的用途。我們用這種方法先是知道了如何設(shè)置一堵墻,在我們欣喜設(shè)置一堵墻以后才發(fā)現(xiàn):蛇撞了墻后不死。在我們進(jìn)行了全局來看以后才知道,原來設(shè)計(jì)一堵墻,都要再設(shè)計(jì)一個(gè)if語(yǔ)句來使得蛇在這個(gè)范圍內(nèi)會(huì)死亡。并且我們發(fā)現(xiàn)在設(shè)計(jì)這個(gè)if語(yǔ)句的時(shí)候,不僅要計(jì)算好墻的坐標(biāo),而且還要用好邏輯語(yǔ)言(&&,||?。┩瑫r(shí)語(yǔ)句的運(yùn)算順序也很重要。剛一開始我們忽略的&&和關(guān)系運(yùn)算符級(jí)別的高低,使得我們?cè)O(shè)計(jì)的墻,總是撞不死蛇,為此我們很是惱火,著急的組員還在這里發(fā)生了點(diǎn)小摩擦,由此可見C語(yǔ)言的嚴(yán)謹(jǐn)性! 最后我們又通過在網(wǎng)上查找信息,知道了隨機(jī)數(shù)發(fā)生器randomize()的用法:rand()=x%+d 意思是說在d~(x-1)之間隨機(jī)產(chǎn)生一個(gè)數(shù)字。我們很自然的聯(lián)想到,如果把food.x等于常數(shù)a;把food.y等于一個(gè);x%+d的隨機(jī)數(shù),那不就能固定只在某一行出現(xiàn)蘋果了嗎?所以我們覺得,充分利用手邊的資源也是很重要的,畢竟C語(yǔ)言很高深,課本上的東西總是有限的,要想知道更多的東西還需多練習(xí),多查閱資料??傊焊锩形闯晒?,通知還需努力??!四個(gè)人感受: 湯X: 就我個(gè)人而言,這次課程設(shè)計(jì),我覺得我最大的收獲就是:我明白了,我們其實(shí)真的沒那么厲害,我們真的還有很多東西不會(huì),我們真的連課本上的基本東西都沒掌握,課本上的東西,真的也只是C語(yǔ)言這個(gè)大海中的一滴水而已。而在我本人還沒有掌握好課本的知識(shí)點(diǎn)的情況下,做起這個(gè)程序自然很費(fèi)事,一個(gè)簡(jiǎn)單的課本P293講到的struct結(jié)構(gòu)體,我一開始竟然忘記它是什么意思,不知道它是什么,就更不用談怎么用它了。還有邏輯語(yǔ)言的使用。我想,現(xiàn)在肯定有很多同學(xué)還不知道邏輯運(yùn)算的優(yōu)先次序吧?這個(gè)問題我本人在使用邏輯語(yǔ)言的時(shí)候也不太會(huì),還查看了書。像這些小的知識(shí)點(diǎn),我個(gè)人認(rèn)為如果掌握不好的話,是不可能讓整個(gè)大程序運(yùn)行起來的。還有比如我在遇到程序顯示“else多余”的警告時(shí)候不不知所措,問了老師才知道是if()后面加了“;”而且if沒有用“{}”來固定范圍,這個(gè)錯(cuò)誤原因是分號(hào)使得if語(yǔ)句結(jié)束了,孤立的else當(dāng)然是多余的了。一個(gè)小小的分號(hào)使得程序無(wú)法運(yùn)行,由此可見在今后的編程中,一定要注意謹(jǐn)慎,仔細(xì)。同時(shí)要注意記住平時(shí)編程的時(shí)候,出現(xiàn)的錯(cuò)誤指示是什么意思。比如這次的“else多余”就是因?yàn)閕f后多了分號(hào)。還有在編程時(shí)候,書寫一定要規(guī)范,特別是if語(yǔ)句的花括號(hào)的位置要對(duì)應(yīng)起來,因?yàn)槲恢脹Q定范圍。注意定義變量和函數(shù)要使用規(guī)范的英文單詞,這樣才能見名知意,為以后修改找變量節(jié)省時(shí)間。對(duì)于這次課題中,“設(shè)計(jì)一個(gè)墻,就要對(duì)應(yīng)一個(gè)函數(shù)舍得蛇撞墻死”,讓我明白,C語(yǔ)言程序中各部分的聯(lián)系性,牽一發(fā)而動(dòng)全身,所以在編程時(shí)一定要注意全局的把握。我們最后還要說說在編程中,好好利用網(wǎng)絡(luò)資源,因?yàn)檎n本里的東西總是有限的,而C語(yǔ)言又那么高深,像隨機(jī)數(shù)發(fā)生器,還有顏色的定都是我第一次接觸,這些東西的用處可是頗大,以后一定好好學(xué)習(xí)。多看,多練,多總結(jié)。最后還要感謝指導(dǎo)老師,楊老師對(duì)我學(xué)習(xí)的幫助和指導(dǎo)。徐XXX: 剛開始拿到題目時(shí)候什么也不會(huì)一片茫然,從網(wǎng)上找了一個(gè)程序一看,太嚇人了,這么長(zhǎng)怎么看啊,而且還是錯(cuò)誤的。沒辦法只能硬著頭皮去改了,但是在改的過程中才發(fā)現(xiàn)其實(shí)c語(yǔ)言沒有想象的那么難而且還很有意思,只是自己平時(shí)沒有好好學(xué)所以在改的時(shí)候非常吃力,有很多簡(jiǎn)單的知識(shí)都不知道,沒有記住。沒辦法只能借助與課本了。但是幾天下來發(fā)現(xiàn)自己已經(jīng)不再像以前那樣是個(gè)菜鳥了,雖然很多知識(shí)還沒掌握。同時(shí)在編改程序的時(shí)候切記不能煩躁要靜心慢慢來,好幾次自己都因心燥出現(xiàn)了很多不該出現(xiàn)的錯(cuò)誤浪費(fèi)了很多時(shí)間。 對(duì)鍵盤的熟悉在編程時(shí)也是很重要的,自己在寫的時(shí)候往往就是跟一指禪差不多眼睛盯著鍵盤打,打錯(cuò)了也不知道最后導(dǎo)致整個(gè)程序都是錯(cuò)誤的,就因?yàn)橐粋€(gè)打錯(cuò)了一個(gè)字母。 總的來說這次課程設(shè)計(jì)收獲很多,也知道了自己的不足,在以后的學(xué)習(xí)中要多實(shí)踐,實(shí)踐很能提高自己的能力。劉XX: 4天的C語(yǔ)言課程設(shè)計(jì)上機(jī)學(xué)習(xí)讓我感受頗多,每天都發(fā)現(xiàn)新的問題,又不得不絞盡腦汁解決問題,心情就像正弦函數(shù),隨著問題的出現(xiàn)和解決一起一伏。剛開始接觸貪吃蛇的C語(yǔ)言成尋時(shí),看著C-free上面出現(xiàn)的有十幾個(gè)錯(cuò)誤的程序,一片茫然不知所措。只能繼續(xù)在網(wǎng)上搜索錯(cuò)誤較少的程序,并結(jié)合書上的基礎(chǔ)知識(shí)查看錯(cuò)誤所在,最終發(fā)現(xiàn)是 作為小組中唯一的女生,明顯感覺有壓力,打字速度不如另外兩個(gè)男生,對(duì)游戲和程序的敏感也不如他們強(qiáng),有種小小的挫敗感。旁邊小組的同學(xué)也給我很大的壓力。他們自己編寫程序,我很佩服他們,越是這樣想。心里越著急,越不能解決問題,每當(dāng)感覺有壓力的時(shí)候,就提醒自己心靜,認(rèn)真的看程序。在學(xué)習(xí)過程中,深深的發(fā)現(xiàn)了自己的不足之處,對(duì)于C語(yǔ)言,只學(xué)了一點(diǎn)點(diǎn)皮毛東西,想要學(xué)好C語(yǔ)言,編好程序,還要付出很多的努力,還要用更多的時(shí)間來學(xué)習(xí)C語(yǔ)言這門深?yuàn)W的學(xué)科。現(xiàn)在只能借用別人已經(jīng)寫好的程序,在別人的基礎(chǔ)上,一點(diǎn)點(diǎn)進(jìn)步和學(xué)習(xí),比如程序中筑墻,需要仿照已有的程序,結(jié)合邏輯運(yùn)算,關(guān)系運(yùn)算和數(shù)學(xué)知識(shí)才能讓蛇撞墻死。蘋果位置的出現(xiàn)也同樣需要進(jìn)一步的搜索,通過更改食物的橫縱坐標(biāo)以及出現(xiàn)的概率來確定食物的位置。編寫程序時(shí),也發(fā)現(xiàn)書上的東西對(duì)于程序的某些部分來說,沒有什么作用,顯得太淺顯,想要實(shí)現(xiàn)老師給出的一些要求,還需要實(shí)踐,通過上機(jī)學(xué)習(xí),自己摸索才能成功。一次次修改,一次次失敗,就像貪吃蛇想方設(shè)法吃蘋果會(huì)Game over,我們只有認(rèn)真學(xué)好基礎(chǔ)理論,并結(jié)合實(shí)踐經(jīng)驗(yàn)才會(huì)取得進(jìn)步。 在這次學(xué)習(xí)過程中,我很感謝我的組員,雖然有時(shí)我們的意見出現(xiàn)分歧,但是通過大家的共同努力,我們收獲了很多,一起討論,一起研究怎樣解決問題,對(duì)老師提出的要求個(gè)個(gè)擊破,我們擰成一股繩共同應(yīng)對(duì)問題,讓我感受了團(tuán)隊(duì)的力量希望在以后的學(xué)習(xí)過程中,我們依然能夠互相幫助,共同進(jìn)步。 五 課程設(shè)計(jì)修改后的程序.加墻 for(i=200;i<=500;i+=10)/*畫圍墻*/ { rectangle(i,200,i+10,209);/*指定位置1*/ } for(i=120;i<=200;i+=10)/*畫圍墻*/ { rectangle(100,i,109,i+10);/*指定位置2*/ } 2.指定位置加蘋果 if(food.yes==1)/*需要出現(xiàn)新食物*/ { food.x=rand()60; food.y=rand()%200+60; while(food.x%10!=0) food.x++; while(food.y%10!=0) food.y++; food.yes=0;3.指定地方撞墻死 if(snake.x[0]>190&&snake.x[0]< 510&&snake.y[0]>=200&& snake.y[0]<=215) { GameOver();/*本次游戲結(jié)束*/ snake.life=1;/*蛇死*/ } if(snake.x[0]>90&&snake.x[0]<110&&snake.y[0]>=110&&snake.y[0]<=215) { GameOver();/*本次游戲結(jié)束*/ snake.life=1;/*蛇死*/ } } C語(yǔ)言課程設(shè)計(jì)報(bào)告 Experiment Designing reporter 課程名稱 : C語(yǔ)言課程設(shè)計(jì) 英文名稱 : C Program Experiment Designing 專 業(yè) : 學(xué) 號(hào) : 姓 名 : 指導(dǎo)教師 : 日 期: 2011年7月18日 至2011年7月22日 《C語(yǔ)言課程設(shè)計(jì)》報(bào)告 C Program Experiment Designing 課程編號(hào):01200308005 學(xué)時(shí): 40學(xué)時(shí) 適用專業(yè):軟件工程專業(yè) 授課單位:軟件學(xué)院 一、C語(yǔ)言課程設(shè)計(jì)目的及要求 目的: 根據(jù)課堂講授內(nèi)容,學(xué)生做相應(yīng)的自主練習(xí),消化課堂所講解的內(nèi)容;通過調(diào)試典型例題或習(xí)題積累調(diào)試C程序的經(jīng)驗(yàn);通過完成輔導(dǎo)教材中的編程題,逐漸培養(yǎng)學(xué)生的編程能力、用計(jì)算機(jī)解決實(shí)際問題的能力。 要求: 1. 熟悉Turbo C 的編程環(huán)境、主要菜單功能。 2. 通過上機(jī)驗(yàn)證運(yùn)算符、表達(dá)式、運(yùn)算規(guī)則、函數(shù)使用。3. 熟練使用C語(yǔ)言的典型語(yǔ)句編寫簡(jiǎn)單程序。4. 調(diào)試典型例題或習(xí)題。5. 提高上機(jī)編程能力 二、實(shí)驗(yàn)類型 設(shè)計(jì)類型 三、實(shí)驗(yàn)學(xué)時(shí) 40學(xué)時(shí) 四、實(shí)驗(yàn)設(shè)備 微型計(jì)算機(jī)、WINDOWS98以上版本的操作系統(tǒng)、Turbo C2.0 軟件一套 五、C語(yǔ)言課程參考教材: 1.李瑞 C語(yǔ)言程序基礎(chǔ)(第二版)清華大學(xué)出版社 2.梁旭 C語(yǔ)言課程設(shè)計(jì).電子工業(yè)出版社 課程設(shè)計(jì)(報(bào)告)任務(wù)書 任務(wù)及要求: 1.設(shè)計(jì)(研究)內(nèi)容和要求 研究?jī)?nèi)容:C語(yǔ)言課程設(shè)計(jì)題目相關(guān)內(nèi)容 任務(wù)和要求: (1).學(xué)習(xí)C語(yǔ)言基礎(chǔ)知識(shí),掌握C語(yǔ)言編程和程序調(diào)試的基本技能。(2).對(duì)指導(dǎo)教師下達(dá)的題目進(jìn)行系統(tǒng)分析。(3).根據(jù)分析結(jié)果完成系統(tǒng)設(shè)計(jì)。 (4).編程:在計(jì)算機(jī)上實(shí)現(xiàn)題目的代碼實(shí)現(xiàn)。(5).完成對(duì)該系統(tǒng)的測(cè)試和調(diào)試。(6).提交課程設(shè)計(jì)報(bào)告。(7).指標(biāo): 要求完成課程設(shè)計(jì)報(bào)告3千字以上(約二、三十頁(yè)).完成若干綜合性程序設(shè)計(jì)題目,每個(gè)綜合設(shè)計(jì)題目的語(yǔ)句行數(shù)的和在300行語(yǔ)句以上.2.原始依據(jù) 了解C語(yǔ)言的基礎(chǔ)知識(shí),有一定的語(yǔ)言編程基礎(chǔ),能夠熟練運(yùn)用C語(yǔ)言進(jìn)行程序設(shè)計(jì)。通過用C語(yǔ)言完成的題目,提高用C語(yǔ)言解決實(shí)際問題的能力。3.參考文獻(xiàn) [1] 黃明等.C語(yǔ)言程序設(shè)計(jì)輔導(dǎo)教材.大連理工大學(xué)出版社,2006 [2] 馬靖善等.C語(yǔ)言程序設(shè)計(jì).清華大學(xué)出版社,2005 [3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)(第二版).北京:高等教育出版社,2002 目錄 C語(yǔ)言課程設(shè)計(jì)報(bào)告................................................................................錯(cuò)誤!未定義書簽。 1. 輸出楊輝三角.............................................................................................................1 1.1 系統(tǒng)分析..............................................................................................................1 1.2 設(shè)計(jì)說明..............................................................................................................1 1.3 程序運(yùn)行截圖......................................................................................................2 1.4 源程序代碼..........................................................................................................2 2 漢諾塔求解方法.............................................................................................................3 2.1 系統(tǒng)分析..............................................................................................................3 2.2 設(shè)計(jì)說明..............................................................................................................3 2.3 程序運(yùn)行截圖......................................................................................................4 2.4 源程序代碼..........................................................................................................4 3 輸出200以內(nèi)的素?cái)?shù).....................................................................................................5 3.1功能說明...............................................................................................................5 3.2 設(shè)計(jì)說明..............................................................................................................5 3.3 程序運(yùn)行截圖......................................................................................................5 3.4 源程序代碼..........................................................................................................6 4 進(jìn)制轉(zhuǎn)換計(jì)算器.............................................................................................................6 4.1功能說明...............................................................................................................6 4.2 設(shè)計(jì)說明..............................................................................................................6 4.3程序運(yùn)行截圖.......................................................................................................7 4.4 源程序代碼..........................................................................................................7 5 一元稀疏多項(xiàng)式.............................................................................................................8 5.1 功能說明..............................................................................................................8 5.2 設(shè)計(jì)說明..............................................................................................................8 5.3 程序運(yùn)行截圖....................................................................................................10 5.4 源程序代碼........................................................................................................11 1. 輸出楊輝三角 1.1 系統(tǒng)分析 以等腰直角三角形輸出楊輝三角 1.2 設(shè)計(jì)說明 1、包含頭文件 #include #include 其中,頭文件 2、子函數(shù) 函數(shù)名:int num(i,j) 函數(shù)功能:以遞歸的方式進(jìn)行計(jì)算,用函數(shù)代替二維數(shù)組 函數(shù)參數(shù):int i;int j; 含義:相當(dāng)于二維數(shù)組的a[i][j] 函數(shù)流程 Step1:輸出最外行,即三角形兩直角邊的結(jié)果都為 1 ; Step2:討論其余情況,相當(dāng)于數(shù)組中的 a[i][j] = a[i-1][j-1] + a[i-1][j]。 3、main()函數(shù) 1為保證結(jié)果完整輸出,先進(jìn)行清屏; ○2輸入要打印的行數(shù),由于一行只能顯示80個(gè)字符,建議不要超過13行; ○3用循環(huán)調(diào)用函數(shù)int num(int i , int j)○ 其中循環(huán)為三重循環(huán):i 循環(huán)控制行打印 j 循環(huán)控制列打印 k 循環(huán)控制空格打印 每執(zhí)行一次i 循環(huán)輸出一個(gè)換行符,直角三角形定點(diǎn)放在第36個(gè)字符的位置上。 每個(gè)數(shù)字占6個(gè)字符的格。 1.3 程序運(yùn)行截圖 1.4 源程序代碼 #include int num(i,j){ int i,j; if(I == j ||j == 0)return(1); else return(num(i-1 , j-1)+num(i-1 , j));} int main(void){ int n,k,i,j; clrscr(); puts(“input row n:”); scanf(“%d”,&n); for(i = 0;i < n;i++) { { for(k = 0;k < 36-3*i;k++) putchar(' '); } { for(j = 0;j <= i;j++) printf(“%6d”,num(i , j)); } puts(“"); } getch(); return 0; } 漢諾塔求解方法 2.1 系統(tǒng)分析 漢諾塔求解方法 2.2 設(shè)計(jì)說明 1、包含頭文件: #include 其中,#include 2、子函數(shù) 函數(shù)名:void move(int n , char a , char b) 函數(shù)功能:打印移動(dòng)的主子編號(hào) 函數(shù)參數(shù):int n , char a , char b; 含義:n為移動(dòng)的序數(shù),a為源柱號(hào),b目的柱號(hào) 函數(shù)流程 Step1:輸出盤子移動(dòng)情況; Step2:打印換行。 函數(shù)名:void hanoi(int n,char a,char b,char c) 函數(shù)功能:以游戲規(guī)則求解移動(dòng)盤子的方法 函數(shù)參數(shù):int n,char a,char b,char c; 含義:n移動(dòng)的序數(shù),a為源柱號(hào),b為目的柱號(hào),c為中間柱號(hào) 函數(shù)流程 Step1:遞歸調(diào)用函數(shù) hanoi(n-1,a,c,b); Step2:調(diào)用函數(shù)move(n-1,a,b); Step3:繼續(xù)遞歸調(diào)用函數(shù)hanoi(n-1,c,b,a); 3、主函數(shù)main()1為了使程序可以重復(fù)運(yùn)行,定義了變量ch,當(dāng)ch == N 時(shí),退出游戲; ○2使用while()循環(huán)使游戲重復(fù)運(yùn)行; ○3輸入盤子的數(shù)目以調(diào)整游戲的難度; ○3調(diào)用函數(shù)hanoi()○ 2.3 程序運(yùn)行截圖 2.4 源程序代碼 #include ”stdio.h“ #include ”ctype.h“ //應(yīng)用函數(shù)toupper void move(int n,char a,char b) //n為移動(dòng)的序數(shù),a為源柱號(hào),b目的柱號(hào)*/ { printf(”Disc%d move from %c to %c;“,(n+1),a,b); printf(”n“);} void hanoi(int n,char a,char b,char c){ //n移動(dòng)的序數(shù),a為源柱號(hào),b為目的柱號(hào),c為中間柱號(hào) if(n>0) { hanoi(n-1,a,c,b); //遞歸調(diào)用 move(n-1,a,b); hanoi(n-1,c,b,a); } } main(){ int n; char ch ='Y'; printf(”Now let us play the game of hanoitowern“); while(ch == 'Y') //通用性設(shè)計(jì) { printf(”n Input the number of disc[2-15]:“); scanf(”%d“,&n);getchar(); printf(”n The orders of moving %d discs from A to B are:n“,n); hanoi(n,'A','B','C'); //調(diào)用函數(shù) printf(”n Continue(Y/N):“); ch=getchar(); getchar(); ch=toupper(ch);} return 0;} 3 輸出200以內(nèi)的素?cái)?shù) 3.1功能說明 輸出200以內(nèi)的素?cái)?shù) 3.2 設(shè)計(jì)說明 1、宏定義 #define M 200 //范圍,表示輸出200以內(nèi)的素?cái)?shù) #define N((M+1)/2) //奇數(shù)的個(gè)數(shù) 處理流程: Step1:第一步篩選掉所有的偶數(shù),將剩余的奇數(shù)存放在a[N]中; Step2:第二部篩選掉多有可以被整除的數(shù) Step3:將得到的素?cái)?shù)10個(gè)一行打印。 3.3 程序運(yùn)行截圖 3.4 源程序代碼 #include ”stdio.h“ #define M 200 //范圍 #define N((M+1)/2) //奇數(shù)的個(gè)數(shù) main(){ int i,j,a[N]; a[0]=2; for(i=1;i //初始數(shù)組實(shí)現(xiàn)第一步篩選 a[i]=2*i+1; for(i=1;i<(N-1);i++) //第二步篩選 if(a[i]!=0) for(j=i+1;j if((a[j]%a[i]==0)) //倍數(shù)時(shí)置零篩去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //顯示得到素?cái)?shù) { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十個(gè)數(shù)換行 printf(”n“); } } return 0;} 進(jìn)制轉(zhuǎn)換計(jì)算器 4.1功能說明 進(jìn)行進(jìn)制轉(zhuǎn)換。 4.2 設(shè)計(jì)說明 1、處理流程: Step1:輸入原始數(shù)值xa,原始權(quán)a,已經(jīng)希望轉(zhuǎn)換的進(jìn)制b;Step2:逐位取值,將原始數(shù)值轉(zhuǎn)換成10進(jìn)制 Step3:逐位取值,將原始數(shù)值轉(zhuǎn)換成b 進(jìn)制 4.3程序運(yùn)行截圖 4.4 源程序代碼 void main()#include ”stdio.h“ main() { int a=0,/*原始進(jìn)制*/ b=8,/*轉(zhuǎn)換進(jìn)制,默認(rèn)為八*/ k=1; /*位權(quán)*/ long xa=0,/*原始數(shù)值*/ xb=0,/*轉(zhuǎn)換數(shù)值*/ x1=0,x2=0; /*十進(jìn)制數(shù)值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*轉(zhuǎn)換為十進(jìn)制數(shù)*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*轉(zhuǎn)換為b進(jìn)制數(shù)*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多項(xiàng)式 5.1 功能說明 求一元稀疏多項(xiàng)式的運(yùn)算: 1、求兩多項(xiàng)式加法; 2、求兩多項(xiàng)式減法; 3、求兩多項(xiàng)式乘法; 4、求兩多項(xiàng)式導(dǎo)數(shù); 5、求兩多項(xiàng)式在x=m處的值。 5.2 設(shè)計(jì)說明 1、鏈表結(jié)點(diǎn)的定義: typedef struct polyn { float coef; //多項(xiàng)式系數(shù) int expn; //多項(xiàng)式指數(shù) struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函數(shù),多項(xiàng)式的基本運(yùn)算。函數(shù)名:linkpolyn CREATEPOLYN()函數(shù)功能:創(chuàng)建多項(xiàng)式鏈表,在輸入的時(shí)候進(jìn)行升序排列 返回值:return head,即建立的多項(xiàng)式頭結(jié)點(diǎn) 參數(shù):linkpolyn head,含義:鏈表頭結(jié)點(diǎn) 處理流程: Step1:輸入第一個(gè)結(jié)點(diǎn),且第一個(gè)結(jié)點(diǎn)自然有序; Step2:循環(huán)輸入其余結(jié)點(diǎn),當(dāng)輸入0 0是表示輸入結(jié)束; Step3:輸入過程中進(jìn)行升冪排序,用二分法,找到新結(jié)點(diǎn)插入點(diǎn); Step4:插入新結(jié)點(diǎn);繼續(xù)循環(huán),直到輸入0 0,循環(huán)結(jié)束,鏈表建立成功。Step5:返回建立鏈表頭結(jié)點(diǎn),函數(shù)結(jié)束。 函數(shù)名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函數(shù)功能:多項(xiàng)式求導(dǎo) 返回值:return(head),即求導(dǎo)多項(xiàng)式的鏈表頭結(jié)點(diǎn) 參數(shù):linkpolyn L,含義:把建立好的鏈表A和B傳遞給L 處理流程: Step1:分別用指針指向L的頭結(jié)點(diǎn)和求導(dǎo)多項(xiàng)式的頭結(jié)點(diǎn)head; Step2:用循環(huán)逐個(gè)對(duì)L鏈表中的結(jié)點(diǎn)求導(dǎo),一次存放在求導(dǎo)多項(xiàng)式中的新結(jié)點(diǎn)中; Step3:循環(huán)中考慮,當(dāng)L鏈表中的結(jié)點(diǎn)僅存放一個(gè)常數(shù),則跳過該結(jié)點(diǎn),繼續(xù)遍歷下一結(jié)點(diǎn); Step4:當(dāng)循環(huán)結(jié)束,即L中的各項(xiàng)以被求導(dǎo),返回求導(dǎo)多項(xiàng)式頭結(jié)點(diǎn)head。 函數(shù)名:linkpolyn INITPOLYN()函數(shù)功能:鏈表初始化 返回值:return(head),即求導(dǎo)多項(xiàng)式生成的鏈表頭結(jié)點(diǎn) 參數(shù):無(wú)參數(shù) 處理流程: Step1:生成一個(gè)新的空間作為新結(jié)點(diǎn); Step2:將新節(jié)點(diǎn)的coef域賦0,expn域賦-1,以區(qū)分其他節(jié)點(diǎn); Step3:將頭結(jié)點(diǎn)的前去指針和后即指針置空,并返回頭結(jié)點(diǎn)。 函數(shù)名:void PRINTLIST(linkpolyn head)函數(shù)功能:以類數(shù)學(xué)表達(dá)式的形式打印 返回值:無(wú)返回值 參數(shù):linkpolyn head,含義:處理過的鏈表頭結(jié)點(diǎn) 處理流程: Step1:討論是否鏈表為空,若為空,則輸出0; Step2:若鏈表不為空,則輸出第一個(gè)值,第一個(gè)值不用輸出符號(hào); Step3:用循環(huán)依次輸出其余各項(xiàng),附加符號(hào)輸出; 函數(shù)名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函數(shù)功能:加法運(yùn)算 返回值:return ptr,即和多項(xiàng)式的頭結(jié)點(diǎn) 參數(shù):linkpolyn A , linkpolyn B,含義:創(chuàng)建的鏈表A和B 處理流程: Step1:分別以兩個(gè)指針pa和pb遍歷鏈表A和B; Step2:當(dāng)A和B兩鏈表都為遍歷完畢時(shí),進(jìn)行加法運(yùn)算,分配新的空間存放和多項(xiàng)式,并用二分法進(jìn)行升冪排序; Step3:當(dāng)A遍歷完畢而B未遍歷完畢,將B其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; Step4:當(dāng)B遍歷完畢而A未遍歷完畢,將A其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; 函數(shù)名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函數(shù)功能:計(jì)算A-B的值 返回值:return ptr,即差多項(xiàng)式的頭結(jié)點(diǎn) 參數(shù):linkpolyn A , linkpolyn B,含義:創(chuàng)建的鏈表A和B 處理流程: Step1:分別以兩個(gè)指針pa和pb遍歷鏈表A和B; Step2:當(dāng)A和B兩鏈表都為遍歷完畢時(shí),進(jìn)行減法運(yùn)算,分配新的空間存放和多項(xiàng)式,并用二分法進(jìn)行升冪排序; Step3:當(dāng)A遍歷完畢而B未遍歷完畢,將B其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; Step4:當(dāng)B遍歷完畢而A未遍歷完畢,將A其余各項(xiàng)拷貝到 差多項(xiàng)式鏈表中; Step5:返回多項(xiàng)式頭結(jié)點(diǎn) 函數(shù)名:float WORK(float x,int e)函數(shù)功能:求x的冪 返回值:return t,即計(jì)算冪結(jié)果 參數(shù):float x,int e,含義:x為輸入的x的值,e為x的指數(shù) 處理流程: Step1:分別討論正指數(shù)與負(fù)指數(shù)的的情況; Step2:若e>0,則累乘e次x; Step3:若e<0,則累除e次x;; Step4:將所求結(jié)果返回; 3、主函數(shù)main()Step1:依次調(diào)用函數(shù)進(jìn)行運(yùn)算操作; Step2:調(diào)用函數(shù)創(chuàng)建鏈表; Step3:調(diào)用函數(shù)進(jìn)行運(yùn)算; 5.3 程序運(yùn)行截圖 5.4 源程序代碼 #include ”stdio.h“ #include typedef struct polyn { float coef;//多項(xiàng)式系數(shù) int expn;//多項(xiàng)式指數(shù) struct polyn * prior,* next;} polyn, *linkpolyn; void DESTROYPOLYN(linkpolyn head){ //銷毀鏈表 linkpolyn s,p;p=head; while(p->next!= NULL){ s = p; p = p->next; free(s);} } //DESTROYPOLYN linkpolyn INITPOLYN(){ //鏈表初始化 struct polyn * head;head=(linkpolyn)malloc(sizeof(polyn));head->coef=0.0;//假設(shè)頭結(jié)點(diǎn)系數(shù)為0 head->expn=-1;//假設(shè)頭結(jié)點(diǎn)指數(shù)為-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //將結(jié)點(diǎn)s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //創(chuàng)建多項(xiàng)式鏈表,在輸入的時(shí)候進(jìn)行升序排列 linkpolyn head,s,p,m,r; int num = 1;//計(jì)數(shù)器 head = INITPOLYN();//初始化鏈表 head r = head;//設(shè)置為指針 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”請(qǐng)輸入第%d項(xiàng)系數(shù)和指數(shù):“,num);/**輸入第一個(gè)結(jié)點(diǎn),并且第一個(gè)結(jié)點(diǎn)自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾結(jié)點(diǎn) r->next = NULL;p = r;//p為s的插入點(diǎn)前一個(gè)結(jié)點(diǎn) m = r;//m為拍完結(jié)點(diǎn)中間的節(jié)點(diǎn),二分法排序 while(++num)//while # 當(dāng)將 s->coef 與 s->expn 都賦值為0的時(shí)候,認(rèn)為輸入結(jié)束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”請(qǐng)輸入第%d項(xiàng)系數(shù)和指數(shù):“,num);scanf(”%f%d“,&s->coef,&s->expn); if((fabs(s->coef)<= FZ)&&(s->expn == 0))//if @ { free(s); break; } //else @ else //else @ { if(s->expn <= p->expn)//if # { while(p->prior!= NULL && p->expn > s->expn) p = p->prior;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入結(jié)點(diǎn)s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍歷鏈表,找到插入點(diǎn) if(s->expn == p->expn) { p->coef += s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r = r->next; r->next = NULL; } } } //else # } //else @ } //while # return head;} //CREATEPOLYN void PRINTPOLYN(linkpolyn head){ //以類數(shù)學(xué)表達(dá)式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//鏈表為空 puts(”0“);else //else @ { //鏈表不為空,輸出第一個(gè)結(jié)點(diǎn)的值 if(p->expn == 0)printf(”%f“,p->coef);//指數(shù)為0時(shí)不輸出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一項(xiàng)前不需要輸出符號(hào)**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次輸出以后各節(jié)點(diǎn) if(p->coef>0) { //當(dāng)系數(shù)為正時(shí),討論輸出符號(hào)問題 if(p->expn == 0)printf(”+%g“,p->coef);else if(p->coef == 1)printf(”+x^%d“,p->expn);else printf(”+%gx^%d“,p->coef,p->expn); } else { //當(dāng)系數(shù)為負(fù)時(shí),討論輸出符號(hào)問題 if(p->expn == 0)printf(”%g“,p->coef);else if(p->coef ==-1)printf(”-x^%d“,p->expn);else printf(”%gx^%d“,p->coef,p->expn); } p = p->next; } } //else @ } //PRINTPOLYN linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B){ //加法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多項(xiàng)式頭結(jié)點(diǎn)初始化 ptr = q;//ptr指向和多項(xiàng)式頭結(jié)點(diǎn) while((qa!= NULL)&&(qb!= NULL)){ //升冪求和 if(qa->expn == qb->expn)//指數(shù)相同的項(xiàng) { x = qa->coef + qb->coef;//系數(shù)相加 if(x!= 0)//求得系數(shù)非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多項(xiàng)式的節(jié)結(jié)點(diǎn) qa = qa->next; qb = qb->next; } else //指數(shù)不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多項(xiàng)式當(dāng)前指數(shù)大于B { q->coef = qb->coef;//B多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qb->expn; qb = qb->next; } else //B多項(xiàng)式當(dāng)前指數(shù)大于A { q->coef = qa->coef;//A多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一個(gè)多項(xiàng)式已經(jīng)處理完畢 while(qa!= NULL)//A未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多項(xiàng)式最末的節(jié)點(diǎn)指向頭結(jié)點(diǎn) return ptr;//返回多項(xiàng)式頭指針 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //減法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多項(xiàng)式頭結(jié)點(diǎn)初始化 ptr = q;//ptr指向和多項(xiàng)式頭結(jié)點(diǎn) while((qa!= NULL)&&(qb!= NULL)){ //升冪求差 if(qa->expn == qb->expn)//指數(shù)相同的項(xiàng) { x = qa->coef-qb->coef;//多項(xiàng)式A的系數(shù)減去B的系數(shù) if(x!= 0)//求得系數(shù)非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多項(xiàng)式的節(jié)結(jié)點(diǎn) q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指數(shù)不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多項(xiàng)式當(dāng)前指數(shù)大于B { q->coef =-(qb->coef);//B多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qb->expn; qb = qb->next; } else //B多項(xiàng)式當(dāng)前指數(shù)大于A { q->coef = qa->coef;//A多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一個(gè)多項(xiàng)式已經(jīng)處理完畢 while(qa!= NULL)//A未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多項(xiàng)式最末的節(jié)點(diǎn)指向頭結(jié)點(diǎn) return ptr;//返回多項(xiàng)式頭指針 } //SUBTRACTPOLYN linkpolyn MULTIPLYPOLYN(linkpolyn A,linkpolyn B){ //乘法 linkpolyn pa,pb,s,head,m,r,p;pa = A->next;pb = B->next;head = INITPOLYN();r = head; s=(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef;//計(jì)算第一個(gè)結(jié)點(diǎn),并且第一個(gè)結(jié)點(diǎn)自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p為插入點(diǎn)前一結(jié)點(diǎn) m=r;//m指向排完結(jié)點(diǎn)中間節(jié)點(diǎn) pb=pb->next;// 第一個(gè)乘積處理完畢 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 處理其余乘積 { //用A的第一個(gè)結(jié)點(diǎn)分別與B的其余結(jié)點(diǎn)相乘 if(pa == A->next) pb = B->next->next; else pb = B->next; for(;pb!= NULL;pb = pb->next)//for pb { s =(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef; s->expn = pa->expn + pb->expn;if(s->expn <= p->expn)//if # { while(p->prior!=NULL && p->expn > s->expn)p=p->prior;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入結(jié)點(diǎn)s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r=r->next; r->next=NULL; } } } //else # } //for pb } //for pa return head;} //MULTIPLYPOLYN linkpolyn DERIVATIONPOLYN(linkpolyn L){ //多項(xiàng)式求導(dǎo) linkpolyn head,p,s,r;head = INITPOLYN();//head為求導(dǎo)多項(xiàng)式頭結(jié)點(diǎn) r = head;p = L->next;while(p!= NULL){ if(p->expn == 0) { p = p->next;continue;} s =(linkpolyn)malloc(sizeof(polyn));s->coef = p->coef * p->expn;s->expn = p->expn-1;s->prior = r; r->next = s; r = r->next; r->next = NULL; p = p->next;} return(head);} //DERIVATIONPOLYN float WORK(float x,int e){ //求x的冪 float t = 1;if(e>0){ while(e) { t *= x;e--;} } if(e<0){ while(e) { t *= 1/x;e++;} } return(t);} //WORK float CALCULATEPOLYN(linkpolyn head,float x){ //計(jì)算多項(xiàng)式在x處的值 float t = 0;linkpolyn p;p = head->next;while(p){ t = t +((p->coef)*(WORK(x,p->expn)));p = p->next;} return(t);} //CALCULATEPOLYN int main(void){ linkpolyn A, B,addp,decp,mulp,derp1,derp2;int i;float x;start: system(”cls“);printf(”一元稀疏多項(xiàng)式計(jì)算nn“);printf(”1.建立多項(xiàng)式n“);printf(”2.多項(xiàng)式加法n“);printf(”3.多項(xiàng)式減法n“);printf(”4.多項(xiàng)式乘法n“);printf(”5.計(jì)算多項(xiàng)式在x處的值n“);printf(”6.對(duì)多項(xiàng)式求導(dǎo)n“);printf(”7.清空數(shù)據(jù)n“);printf(”8.關(guān)閉計(jì)算器n“);printf(”請(qǐng)輸入選項(xiàng)(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多項(xiàng)式nn“);printf(”建立多項(xiàng)式A,當(dāng)輸入0 0 時(shí)表示出入完畢n“);A = CREATEPOLYN();printf(”建立多項(xiàng)式成功n“);printf(”建立多項(xiàng)式B,當(dāng)輸入0 0 時(shí)表示出入完畢n“);B = CREATEPOLYN();printf(”建立多項(xiàng)式成功n“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B); printf(”nn輸入回車返回上一級(jí)“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多項(xiàng)式加法nn“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多項(xiàng)式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn輸入回車返回上一級(jí)“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多項(xiàng)式減法nn“);printf(”多項(xiàng)式B:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多項(xiàng)式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn輸入回車返回上一級(jí)“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多項(xiàng)式乘法nn“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多項(xiàng)式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn輸入回車返回上一級(jí)“); getchar();getchar();goto start;case(5): system(”cls“);printf(”計(jì)算多項(xiàng)式在x處的值n“);printf(”請(qǐng)輸入x的值:“);scanf(”%f“,&x);printf(”n多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n值為:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n值為:%f“,CALCULATEPOLYN(B,x));printf(”nn輸入回車返回上一級(jí)“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多項(xiàng)式求導(dǎo)n“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求導(dǎo)后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求導(dǎo)后B':“);PRINTPOLYN(derp2);printf(”nn輸入回車返回上一級(jí)“);getchar();getchar();goto start;case(7): system(”cls“);DESTROYPOLYN(A);DESTROYPOLYN(B);DESTROYPOLYN(addp);DESTROYPOLYN(decp);DESTROYPOLYN(mulp);DESTROYPOLYN(derp1);DESTROYPOLYN(derp2);printf(”已清空所有數(shù)據(jù)n“);printf(”nn輸入回車返回上一級(jí)“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目錄 1前言..............................................................1 2正文..............................................................1 2.1設(shè)計(jì)目的........................................................1 2.2設(shè)計(jì)意義........................................................1 2.3設(shè)計(jì)方案與內(nèi)容..................................................2 2.3.1設(shè)計(jì)內(nèi)容......................................................2 2.3.2程序調(diào)試......................................................4 3致謝..............................................................7 4參考文獻(xiàn)..........................................................7 5附錄..............................................................8 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 前言 17世紀(jì)初,西方國(guó)家的計(jì)算工具有了較大的發(fā)展,英國(guó)數(shù)學(xué)家納皮爾發(fā)明的“納皮爾算籌”,英國(guó)牧師奧卻德發(fā)明了圓柱型對(duì)數(shù)計(jì)算尺,這種計(jì)算尺不僅能做加減乘除、乘方、開方運(yùn)算,甚至可以計(jì)算三角函數(shù),指數(shù)函數(shù)和對(duì)數(shù)函數(shù),這些計(jì)算工具不僅帶動(dòng)了計(jì)算器的發(fā)展,也為現(xiàn)代計(jì)算器發(fā)展奠定了良好的基礎(chǔ),成為現(xiàn)代社會(huì)應(yīng)用廣泛的計(jì)算工具. 1642年,年僅19歲的法國(guó)偉大科學(xué)家帕斯卡引用算盤的原理,發(fā)明了 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 其自身的優(yōu)勢(shì),仍然是一種重要的語(yǔ)言,而且它還是通往c++的必由之路。它是融合了控制特性的的現(xiàn)代語(yǔ)言,其設(shè)計(jì)使得用戶可以自然的采用自頂向下的規(guī)劃、結(jié)構(gòu)化的編程,以及模塊化的設(shè)計(jì)。這種做法使得編寫出的程序更可靠、更易懂。它是一種高級(jí)語(yǔ)言,在設(shè)計(jì)上它充分利用了當(dāng)前計(jì)算機(jī)在能力上的優(yōu)點(diǎn)。C程序往往很緊湊且運(yùn)行速度快,其還表現(xiàn)出通常只有匯編語(yǔ)言才具有的精細(xì)控制能力,可以用于電腦cpu的編程控制語(yǔ)言,如果愿意,可以細(xì)調(diào)程序以獲得最大速度或最大內(nèi)存使用率。其可移植性的特點(diǎn),可以使其在不經(jīng)過太大的修改,便可在其它系統(tǒng)上運(yùn)行,同時(shí),它也是很多大型系統(tǒng)的編程語(yǔ)言,(比如說UNIX的操作系統(tǒng)就是建立在c之上的)。 2.3設(shè)計(jì)方案與內(nèi)容 我此次設(shè)計(jì)的是一個(gè)計(jì)算器,主要是利用我們所學(xué)的知識(shí),做到進(jìn)一步掌握c語(yǔ)言的奧秘,使這種功能強(qiáng)大的高級(jí)語(yǔ)言走近我們的生活。本計(jì)算系統(tǒng)主要是作加減乘除運(yùn)算。 該計(jì)算系統(tǒng)程序包括:main()函數(shù)、加函數(shù)、減函數(shù)、乘函數(shù)、除函數(shù)和顯示函數(shù)。2.3.1設(shè)計(jì)內(nèi)容 1、加運(yùn)算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、減運(yùn)算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘運(yùn)算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除運(yùn)算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、顯示函數(shù)程序: 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*選擇提示*/ printf(“***************************n”);/*分隔號(hào)*/ printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/ printf(“1:apply is additionn”);/*選擇加號(hào)*/ printf(“2:apply is subtractionn”);/*選擇減號(hào)*/ printf(“3: apply is multiplicationn”);/*選擇乘號(hào)*/ printf(“4:apply is divisionn”);/*選擇除號(hào)*/ } 顯示界面程序圖如圖2-1所示 圖2-1顯示界面 程序分析: 1)printf(“please choose lower level operation sign n”);/*選擇提示*/這句可以根據(jù)需要寫成時(shí)間,一句鼓勵(lì)自己的話,或者別的什么,都將不影響改程序的正常運(yùn)行,只要在規(guī)定的“n”里,用戶可以根據(jù)自己的需要把它用一句英文表達(dá)出來。 2)printf(“***************************n”);/*分隔號(hào)*/此句無(wú)關(guān)緊要,可以去掉也可以保留,看個(gè)人心情,不過個(gè)人建議,還是保留的比較好,它能保持計(jì)算器界面的美觀特點(diǎn),還能作為分隔運(yùn)算程序的作用,讓使用者能最快的對(duì)運(yùn)算區(qū)進(jìn)行劃區(qū)。3)printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/此句在運(yùn)算界面里出現(xiàn),當(dāng)用戶使用時(shí),不小心輸入了一個(gè)字符,非1~4以內(nèi),則會(huì)提示錯(cuò)誤,按‘enter’結(jié)束該片段,然后根據(jù)提示,選擇自己所希望使用的運(yùn)算符號(hào)進(jìn)行運(yùn)算。 4)printf(“1:apply is additionn”);/*選擇加號(hào)*/此句是加法運(yùn)算提示,當(dāng)輸入‘1’后按‘enter’會(huì)得到可以使用加法的提示,然后就可以使用加法運(yùn)算了,使用空格將數(shù)字與要加的數(shù)字分開,按‘enter’將得到你要的答案。5)printf(“2:apply is subtractionn”);/*選擇減號(hào)*/這是加法運(yùn)算提示。它的使用方法和 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 相同。 2.3.2程序調(diào)試 1、加法運(yùn)算 加法運(yùn)算運(yùn)行結(jié)果如圖2-2所示。 圖2-2加法運(yùn)算運(yùn)行結(jié)果 2、減法運(yùn)算 減法運(yùn)算結(jié)果如圖2-3所示。 圖2-3減法運(yùn)算 3、乘法運(yùn)算 乘法運(yùn)算如圖2-4所示。 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 圖2-4乘法運(yùn)算 4、除法運(yùn)算 除法運(yùn)算如圖2-5所示 圖2-5除法運(yùn)算 6、主函數(shù)程序: int main(){ int a, b; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) for(;;){ xian();switch(getchar()){ case '0':printf(“ tui chu: ”);getchar();return 0;case '1': printf(“ apply is '+': n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jia(a,b);break;case '2':printf(“ apply is '-':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jian(a,b);break;case '3':printf(“apply is '*':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();cheng(a,b);break;case '4':printf(“ apply is '/':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();chu(a,b);break;default:printf(“wrong!please push down'enter' go on with ”);/*提示錯(cuò)誤*/ getchar();break; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) } } return 0;/*一輪運(yùn)算結(jié)束后返回符號(hào)選擇功能選項(xiàng)*/ } 該主函數(shù)程序中使用了xian()函數(shù)、switch(getchar())語(yǔ)句、getchar()、for、break、return。xian()函數(shù)的功能是在程序運(yùn)行中,具有顯示界面的功能。switch(getchar())語(yǔ)句具有多分支選擇功能。getchar()是庫(kù)函數(shù)。for循環(huán)語(yǔ)句。是break語(yǔ)句是實(shí)現(xiàn)跳出循環(huán)的功能的語(yǔ)句。Return語(yǔ)句是返回語(yǔ)句,是程序最后一個(gè)語(yǔ)句,在int main(void)中int表示main()函數(shù)的返回值應(yīng)該是一個(gè)整數(shù)。該程序具備的選擇功能: (1)選擇提示:該計(jì)算器編輯界面有5個(gè)提示,它們分別是‘0’、‘1’,‘2’、‘3’、‘4’,當(dāng)使用者在該界面上輸入它們其中一個(gè)數(shù)字,會(huì)得到相對(duì)應(yīng)的提示,其中1~4分別表示加、減、乘、除運(yùn)算?!?’表示結(jié)束工作框結(jié)束。 (2)使用方法:進(jìn)入選擇界面后,要選擇加法運(yùn)算,請(qǐng)輸入‘1’,然后按下‘enter’鍵。會(huì)得到提示 致謝 在本次課程設(shè)計(jì)中,首先我要感謝張老師。是他至始至終的教導(dǎo)讓我能夠在編程方面迅速的入門。在我們對(duì)程序語(yǔ)言的學(xué)習(xí)過程中,是他不斷的給我們講解語(yǔ)句內(nèi)容并且糾正我們存在的錯(cuò)誤。不斷的給我們提供幫助并且給我們分析遇到的問題。老師認(rèn)真負(fù)責(zé)的工作態(tài)度,嚴(yán)謹(jǐn)治學(xué)的精神和深厚的理論水平都使我受益匪淺。他們無(wú)論在理論上還是實(shí)踐中都給了我很大的幫助,使我整體水平得到了提高,對(duì)于我以后的學(xué)習(xí)和工作都有一定的幫助,感謝張兵老師的耐心輔導(dǎo)! 參考文獻(xiàn) [1]孫雄勇.Visual C++ 6.0 實(shí)用教程.北京:中國(guó)鐵道出版社,2004.[2]新電腦課堂編委會(huì).Visual C++ 編程篇.北京:電子工業(yè)出版社,2004.[3]陳清華.Visual C++課程設(shè)計(jì)案例精選與編程指導(dǎo).北京:北京大學(xué)出版社,2005.[4]李東玉.Visual C++.NET實(shí)用編程100例.北京:中國(guó)鐵道出版社,2003.[6]張志清.管理信息系統(tǒng).南京:東南大學(xué)出版社,2003. 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 附錄 #include int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*選擇提示*/ printf(“***************************n”);/*分隔號(hào)*/ printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/ printf(“1:apply is additionn”);/*選擇加號(hào)*/ printf(“2:apply is subtractionn”);/*選擇減號(hào)*/ printf(“3: apply is multiplicationn”);/*選擇乘號(hào)*/ printf(“4:apply is divisionn”);/*選擇除號(hào)*/ } int main(){ 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) int a, b; for(;;){ xian(); switch(getchar()) { case '0':printf(“ tui chu: ”); getchar(); return 0; case '1': printf(“ apply is '+': n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jia(a,b); break; case '2':printf(“ apply is '-':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jian(a,b); break; case '3':printf(“apply is '*':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); cheng(a,b); break; case '4':printf(“ apply is '/':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); chu(a,b); break; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) default:printf(“wrong!please push down'enter' go on with ”);/*提示錯(cuò)誤*/ getchar(); break; } } return 0;/*一輪運(yùn)算結(jié)束后返回符號(hào)選擇功能選項(xiàng)*/ } C語(yǔ)言課程設(shè)計(jì)報(bào)告 班 級(jí): 10電子本1 學(xué) 號(hào): 10303033122 姓 名: 指導(dǎo)老師: 方文森 完成日期: 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 目 錄 1、課程設(shè)計(jì)目的和要求.....................................................................................................2 2、課程設(shè)計(jì)任務(wù)內(nèi)容.........................................................................................................2 3、詳細(xì)設(shè)計(jì)說明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2軟件設(shè)計(jì).................................................................................................................3 3.3軟件調(diào)試(對(duì)編程中的錯(cuò)誤進(jìn)行記錄,并給出你的解決辦法).....................3 4、軟件使用說明.................................................................................................................4 5、課程設(shè)計(jì)心得與體會(huì).....................................................................................................4 附錄1:參考文獻(xiàn)................................................................................................................5 附錄2:部分程序清單(帶有較詳細(xì)的注釋)................................................................5 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) C語(yǔ)言課程設(shè)計(jì)報(bào)告 1、課程設(shè)計(jì)目的和要求 目的:(1)鞏固和加深學(xué)生對(duì)C語(yǔ)言課程的基本知識(shí)的理解和掌握(2)掌握C語(yǔ)言編程和程序調(diào)試的基本技能(3)利用C語(yǔ)言進(jìn)行基本的軟件設(shè)計(jì)(4)掌握書寫程序設(shè)計(jì)說明文檔的能力(5)提高運(yùn)用C語(yǔ)言解決實(shí)際問題的能力 要求:(1)分析課程設(shè)計(jì)題目的要求(2)寫出詳細(xì)設(shè)計(jì)說明 (3)編寫程序代碼,調(diào)試程序使其能正確運(yùn)行(4)設(shè)計(jì)完成的軟件要便于操作和使用(5)設(shè)計(jì)完成后提交課程設(shè)計(jì)報(bào)告 2、課程設(shè)計(jì)任務(wù)內(nèi)容 1)一個(gè)班級(jí)有4個(gè)學(xué)生,共學(xué)習(xí)5門課程(大學(xué)英語(yǔ)、高等數(shù)學(xué)、C語(yǔ)言程序設(shè)計(jì)、VB程序設(shè)計(jì)、大學(xué)語(yǔ)文)。要求編寫程序完成相應(yīng)功能。2) 輸入并保存]5門課程名稱; 3) 輸入并保存]4個(gè)學(xué)生的學(xué)號(hào)及其[個(gè)人相關(guān)信息]; 4) 輸入并保存]每個(gè)學(xué)生對(duì)應(yīng)的每門課程成績(jī); 5)求出每門功課的平均分; 6)找出有兩門以上功課不及格的學(xué)生,輸出他們的學(xué)號(hào)和全部課程成績(jī)及該學(xué)生5門課程的平均成績(jī); 7)找出平均成績(jī)?cè)?0分以上或者全部課程成績(jī)?cè)?5分以上的學(xué)生,輸出他們的學(xué)號(hào)和全部課程成績(jī)及該學(xué)生5門課程的平均成績(jī); 8)計(jì)算每位學(xué)生的總分,并按總分進(jìn)行排名,按由高到低輸出他們的學(xué)號(hào)及總成績(jī); 9)對(duì)前面問題進(jìn)行優(yōu)化,即在一維數(shù)駔的基礎(chǔ)上,考慮采用二維數(shù)組、函數(shù)及其參數(shù)傳遞的方式來解決相關(guān)問題; 10)對(duì)前面問題進(jìn)行優(yōu)化,在學(xué)號(hào)的基礎(chǔ)上,增加學(xué)生的其它個(gè)人信息,包括:學(xué)號(hào)、姓名、年齡、性別,并采用結(jié)構(gòu)體形式加以表示; 11)利用文件實(shí)現(xiàn)對(duì)輸入及分析輸出數(shù)據(jù)的存取操作。 12)參照教材P27頁(yè),3-11題引入選擇功能,輸入功能編號(hào)可以實(shí)現(xiàn)以上功能(考慮清屏函數(shù),自查)。 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 3、詳細(xì)設(shè)計(jì)說明 3.1分析 3.2軟件設(shè)計(jì) 開始菜單(功能選擇)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10寫入課程名讀取課程名輸入學(xué)生信息讀取學(xué)生信息建立了學(xué)生信息及課程名稱?退出程序讀取課程、學(xué)生、成績(jī)讀取課程成績(jī)輸出功課的平均分兩門以上功課不及格的學(xué)生輸出高分的學(xué)生總分由高到低排序No保存保存Yes輸入課程成績(jī)(提示)必須輸入課程名稱、學(xué)生信息才能建立成績(jī)保存清屏 3.3軟件調(diào)試(對(duì)編程中的錯(cuò)誤進(jìn)行記錄,并給出你的解決辦法) 取地址。 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 4、軟件使用說明 1.2.3.4.5.6.7.8.9.10.11.12.[99]讀取課程、學(xué)生、成績(jī) [1]輸入課程名稱.[2]讀取課程名稱.[3]輸入學(xué)生信息.[4]讀取學(xué)生信息.[5]輸入課程成績(jī).[6]讀取課程成績(jī).[7]功課的平均分.[8]兩門以上功課不及格的學(xué)生 [9]-高分的學(xué)生-.[10]學(xué)生總分排序.[0]退出應(yīng)用程序.5、課程設(shè)計(jì)心得與體會(huì) 在大家的共同努力下,忙碌了兩個(gè)星期,我們順利完成了對(duì)此程序的編譯及試運(yùn)行。在設(shè)計(jì)程序的過程中,我們了解到要設(shè)計(jì)一個(gè)完整的程序,其中最難的可能就屬設(shè)計(jì)整個(gè)程序的框架,其中可能會(huì)需要經(jīng)過很多次的修改與調(diào)試,所以必須要有耐心,直至最后設(shè)計(jì)出自己想要的程序。 另外平時(shí)學(xué)習(xí)c語(yǔ)言的基礎(chǔ)也很關(guān)鍵,因?yàn)槿绻綍r(shí)學(xué)得就不怎么樣,那么你面對(duì)這么一個(gè)比較有難度的程序,可能會(huì)望而卻步,看懂他人的程序都是個(gè)難點(diǎn),更別說讓自己去設(shè)計(jì)。為了解決此類問題,最好就是多向同學(xué),老師請(qǐng)教,查找資料。 設(shè)計(jì)一個(gè)程序的過程就是解決一個(gè)實(shí)際問題的過程,從解決實(shí)際問題的角度,我們可以這樣來看:首先要了解這個(gè)問題的基本要求,即輸入、輸出、完成從輸入到輸出的要求是什么;在次我們必須捋清思路,逐一的解決問題的各個(gè)方面,即從輸入開始入手,著重考慮如何從輸入導(dǎo)出輸出,在這個(gè)過程中,可確定所需的變量、數(shù)組、函數(shù),然后確定處理過程--算法。 感謝這次的課程設(shè)計(jì),它使我更加深刻地體會(huì)到c語(yǔ)言程序編寫過程的嚴(yán)謹(jǐn)與細(xì)致,還有就是無(wú)論做任何事都要有耐心。當(dāng)然團(tuán)隊(duì)合作也是非常重要的一個(gè)環(huán)節(jié),這會(huì)使你在學(xué)習(xí)過程中倍感輕松 總的來說,這次程序設(shè)計(jì)讓我獲益匪淺,對(duì)C語(yǔ)言也有了進(jìn)一步的認(rèn)識(shí):C語(yǔ)言功能高、表達(dá)能力強(qiáng)、使用靈活方便、目標(biāo)程序效率高等等。C語(yǔ)言是在國(guó)內(nèi)外廣泛使用的一種計(jì)算機(jī)語(yǔ)言,相信除了以上優(yōu)點(diǎn),還有許多我們還未發(fā)現(xiàn),希望能在以后的學(xué)習(xí)中有更深入的認(rèn) 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 識(shí)。 附錄1:參考文獻(xiàn) 《C語(yǔ)言程序設(shè)計(jì)與實(shí)踐教程》 附錄2:部分程序清單(帶有較詳細(xì)的注釋) #include #define N 4 #define M 5 #define Debug 1 typedef struct { char SNo[5];char SName[10];}Student; void ScoreRead(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) void ScoreWrite(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i void CoureseRead(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;char ch;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} i=0;j=0;while(1){ ch = fgetc(fp);if(ch==EOF)break;if(ch=='n'){ Cname[i][j]='
第二篇:c語(yǔ)言程序貪吃蛇課程設(shè)計(jì)報(bào)告
第三篇:C語(yǔ)言課程設(shè)計(jì)報(bào)告
第四篇:C語(yǔ)言課程設(shè)計(jì)報(bào)告
第五篇:C語(yǔ)言課程設(shè)計(jì)報(bào)告