版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計課程設(shè)計報告完成任務(wù):1 用二分法求方程根2 矩陣求逆3 鏈表制作4 二十四點游戲5 學(xué)籍管理程序?qū)I(yè):計算機科學(xué)與技術(shù)班級:計二班學(xué)號:0705010225姓名:李海波本人于2008年9月1號在計算機中心6號機房25號機器上完成了本次課程設(shè)計。課程設(shè)計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務(wù)二 用二分法求方程根目的與意義用二分法求方程f(x)=x3-x-1=0在區(qū)間1.0,1.5內(nèi)的一個實根,要求準(zhǔn)確到小數(shù)點后第2位。任務(wù)分析方程在區(qū)間1.0,1.5上單調(diào)并且存在一個根。取區(qū)間中點,確定方程的根在左右哪個區(qū)間(或者恰好是區(qū)間中點)內(nèi),這樣
2、一次就可以把區(qū)間縮小一半,重復(fù)做此步驟直到滿足精確度為止。方程的近似根為區(qū)間中點。取區(qū)間中點:只需用區(qū)間的兩個端點相加,在除以2即可。確定根所在位置:區(qū)間a,b中,取中點c=(a+b)/2,與a,b構(gòu)成兩個區(qū)間:a,c與c,b。而方程的根的位置有三種可能1.在區(qū)間a,c中;2.在區(qū)間c,b中;3.根就是中點c。若中點就是方程的根,則可以直接輸出。若不是這是剩下兩種情況。若f(c)*f(a)<0,則根在區(qū)間a,c中,若f(b)*f(a)<0,則根在區(qū)間b,c中,兩者只有一種情況成立。驗證是否滿足精確度:精確到小數(shù)點后兩位,就是說0.01.。由于是用二分法,所以到了0.01后,還要繼續(xù)
3、二分,直到0.01后才能滿足精確度。也就是說,區(qū)間左右值相減要小于0.001時,輸出區(qū)間中點即可。數(shù)據(jù)結(jié)構(gòu)設(shè)計此程序?qū)⑸婕叭齻€變量:區(qū)間的兩個端點,區(qū)間中點。由于要精確到小數(shù)點后兩位,所以必須設(shè)置為float類型。還有一個函數(shù),由于只需要驗證返回值的正負(fù),所以只需用int類型就可以了。后來在函數(shù)運行中出現(xiàn)錯誤,更改為float類型(具體錯誤將在“代碼調(diào)試與運行”部分說明)。關(guān)鍵算法設(shè)計本程序比較小,原本只用一個main函數(shù)就可以完成,可是由于方程的函數(shù)每次輸入比較麻煩,所以設(shè)置了一個簡單的函數(shù):Int hanshu(float x)return x*x*x-x-1;用它來返回方程函數(shù)的帶入值。
4、程序的關(guān)鍵在于不斷二分,確定根所在位置的循環(huán)算法。此循環(huán)代碼如下:dof=(a+b)/2;if(hanshu(f)=0)printf("方程的根為%.2fn",f);break;if(hanshu(a)*hanshu(f)<0)b=f;elsea=f;while(b-a>0.001);首先給f賦值為區(qū)間中點。若它滿足hanshu(f)=0,說明f為方程的根,直接輸出f,并用break語句,結(jié)束循環(huán)。如果不滿足,則驗證根在哪個區(qū)間,并執(zhí)行相應(yīng)賦值,形成新的區(qū)間,繼續(xù)執(zhí)行循環(huán)。循環(huán)在執(zhí)行到滿足精確度時結(jié)束,即b-a<=0.001,結(jié)束循環(huán)。輸出方程的根最好區(qū)分
5、開此根是近似根還是準(zhǔn)確根。所以把輸出分為兩部分。一部分在循環(huán)內(nèi),驗證區(qū)間中點為準(zhǔn)確根的時候輸出。若要輸出近似根則要循環(huán)結(jié)束后,所以輸出語句在循環(huán)結(jié)構(gòu)外面。為了驗證循環(huán)結(jié)束后得到的根f是不是準(zhǔn)確根,顧輸出語句在if語句內(nèi)。代碼如下:if(b-a<0.01)printf("方程的近似根為%.2fn",f);代碼調(diào)試與運行原程序運行時結(jié)果出人預(yù)料:方程的根為1.25注意到1.25恰好是原來區(qū)間的中點,而根據(jù)輸出來看,1.25是方程的精確根??墒墙?jīng)過計算我得到方程的根應(yīng)該在1.3到1.4之間。會輸出這個結(jié)果,也就是說程序執(zhí)行了if(hanshu(f)=0)printf(&qu
6、ot;方程的根為%.2fn",f);break;為什么會這樣?我想起返回函數(shù)帶入值的函數(shù)hanshu()的返回值是int。如果返回值沒有整數(shù)部分,就會返回0。所以把它更改為float類型,最終得到結(jié)果:1.33。屏幕顯示為:方程的近似根為1.33小結(jié)與體會每項數(shù)據(jù)在數(shù)據(jù)設(shè)定時需要細(xì)致詳細(xì)的考慮數(shù)據(jù)的用途,以及可能出現(xiàn)的錯誤。注意每種數(shù)據(jù)的范圍以防止程序運行中出錯。一個簡單的程序,也不能保證一次編寫毫無錯誤。尤其在DEBUGE系統(tǒng)不能檢驗出錯誤,但是結(jié)果又不是期望值時,必須重新檢查程序,任何細(xì)小的地方都可能是出錯的原因。本人于2008年9月2號到2008年9月5號在計算機中心6號機房1
7、4號機器上嘗試了本次課程設(shè)計。課程設(shè)計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。由于各種原因至今沒有完成,個大函數(shù)已經(jīng)完成,但是在運行中出現(xiàn)錯誤的原因沒有找到。任務(wù)一 矩陣求逆·目的與意義給定一個8X8的矩陣A,求出它的逆矩陣A-1。矩陣的元素由鍵盤中輸入,首先判斷矩陣是否可逆,若可逆則求出其逆矩陣并在屏幕上用適當(dāng)格式顯示出來。程序可以把矩陣求逆這一復(fù)雜的運算由計算機代替計算,既可以保證結(jié)果的準(zhǔn)確,又可以高速度的完成復(fù)雜的計算。·任務(wù)分析根據(jù)線性數(shù)學(xué)的學(xué)習(xí)知道,矩陣求逆有兩種方法:單位矩陣化歸法、伴隨矩陣法。根據(jù)指導(dǎo)上的分析,第一種需要三個
8、函數(shù)。那就是:行交換、將第n行乘以e、第i行乘以k加到第j行。這三個函數(shù)都不難做,但是如何利用這三個函數(shù),求出逆矩陣我卻無從下手。我只好用另外一種方法做。用伴隨矩陣求逆矩陣需要兩個函數(shù):求矩陣行列式、計算代數(shù)余子式。而這兩個函數(shù)在使用中又相互使用,也就是相互調(diào)用。利用相互調(diào)用,就可以吧求你矩陣所需的的代數(shù)余子式和矩陣行列式求出來。求出矩陣行列式就可以驗證矩陣是否存在逆矩陣。由代數(shù)余子式得到矩陣的伴隨矩陣,兩者相除就可以得到矩陣的逆矩陣了。·數(shù)據(jù)結(jié)構(gòu)設(shè)計 程序里輸入輸出都是矩陣,自然用二維數(shù)組。矩陣不見得都是整數(shù),所以用float來定義最好。在帶入兩個函數(shù)時需要函數(shù)的階數(shù),這個一定是正
9、整數(shù),用int定義就可以。兩個函數(shù)舉證的行列式肯定是用float定義。求代數(shù)余子式的函數(shù)還要傳入行數(shù)和列數(shù),用int定義就好。·關(guān)鍵算法程序關(guān)鍵算法就是兩個。一是計算方陣的行列式,另一個是計算方陣對于某個元素的代數(shù)余子式。由于兩個函數(shù)相互調(diào)用,所以在函數(shù)中會有另一個函數(shù)的函數(shù)聲明。我的求方陣行列式函數(shù)聲名為float hangleishi(int n,float x88),其中n表示方陣的階數(shù)。求代數(shù)余子式的函數(shù)聲明為float yuzishi(int n,float x88,int i,int j),其中n表示階數(shù),i,j表示求方陣對于第i行,第j列的代數(shù)余子式。求方陣行列式的函數(shù)
10、代碼如下:float hangleishi(int n,float x88)float h;int i=0;float yuzishi(int n,float x88,int i,int j);/*函數(shù)聲明*/if (n=2)h=x00*x11-x01*x10;elsefor(i=0;i<n;i+)h=h+x0i*yuzishi(n,x,0,i);return h;函數(shù)運用了函數(shù)遞歸的原理。在n>2時,函數(shù)執(zhí)行else 的語句。語句中使用了求代數(shù)余子式的函數(shù),是求行列式的一般求法,也是普遍求法。沒有技巧,但是編程簡單,算法也容易實現(xiàn)。n=2時,就可以直接算出來,返回h即方陣的行列式
11、。降階在函數(shù)yuzishi()中實現(xiàn)。求代數(shù)余子式的函數(shù)如下:float yuzishi(int n,float x88,int i,int j)int a=1,c=0,d=0;float h=0;float y88;for(c=0;c<i;c+)for(d=0;d<j;d+)ycd=xcd;for(;c<n-1;c+)for(;d<n-1;d+)ycd=xc+1d+1;h=hangleishi(n-1),y);for(;a<=i+j;a+)h=-h;return h;函數(shù)大致分為兩部分。第一部分把傳入的矩陣中的第i行、第j列的元素刪除,并把剩下的復(fù)制到另外一個矩
12、陣中,然后再求復(fù)制完矩陣的行列式。求行列式時用到了求行列式函數(shù),在調(diào)用的時,傳入n-1,就完成了降階。其余的就是矩陣的輸入與輸出。這個可以在主函數(shù)中一起實現(xiàn)。只需要連個循環(huán)的嵌套就可以了。·代碼調(diào)試與運行程序運行時,會請用戶輸入所有的64個元素,之后就會開始運算。但是由于錯誤不管輸入什么值,計算的行列式都是0。我無法找出其中的毛病。因為Debuge系統(tǒng)是找不到的,這種問題往往比較難找。時間關(guān)系我繼續(xù)了我的課程設(shè)計,沒有全部完成這項設(shè)計任務(wù)·小結(jié)與體會程序沒有很好的完成,這讓我很遺憾。我很想把每個我編的程序都盡量做好,做完善。可是這次我找了很多班里的C語言“大師”,都沒有找到
13、錯誤所在,而且有人的錯誤竟然和我的一模一樣。我很詫異,也很無奈。這個程序我之后又反復(fù)看了很多次,終究找不到問題出在哪里,也許這就是水平問題吧。后來,我也只好用殘缺也是一種美來安慰自己,把它保存下來。等以后自己能力高些了再來找出問題所在。本人于2008年9月4號到2008年9月8號在計算機中心6號機房12號機器上完成了本次課程設(shè)計。課程設(shè)計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務(wù)三 鏈表操作目的與意義在屏幕上輸出菜單,先從鍵盤接收整數(shù)序列。將這些整數(shù)作為鏈表節(jié)點的值,完成鏈表的創(chuàng)建、節(jié)點插入、節(jié)點的刪除以及整個鏈表的撤銷等操作。后來覺得程序的使用者很可能修
14、改某個節(jié)點,所以添加了節(jié)點的修改功能。使用程序的人可以根據(jù)菜單提示,完成最基本的鏈表操作,完成一個自己需要的整數(shù)一維鏈表。任務(wù)分析這是一個比較大的程序,所以必定要分多個函數(shù)完成。首先必定要輸出菜單,所以一定有一個菜單函數(shù):caidan();另外根據(jù)要求還要有創(chuàng)建函數(shù)chuangjian()、插入節(jié)點函數(shù)charu()、刪除節(jié)點函數(shù)shanchu()、修改節(jié)點函數(shù)xiugai()、撤銷鏈表函數(shù)chexiao()、鏈表顯示函數(shù)print(),還要有一個結(jié)束選項,于是就有了結(jié)束函數(shù)jieshu()。主函數(shù)mian(),里面有各個函數(shù)的聲明和調(diào)用。但是各個函數(shù)之間相互獨立不互相調(diào)用,這樣就可以把問題分
15、割,逐一擊破,出錯之后也容易判斷出錯的位置。創(chuàng)建函數(shù)只需鏈表創(chuàng)建完,傳回首地址就可以了??墒怯幸粋€問題,那就是到底用戶輸入什么結(jié)束輸入。由于這是個整數(shù)鏈表,通常所用的0,-1等都不妥當(dāng)。于是我就想輸入999999,也就是六個九結(jié)束輸入。之后的幾個函數(shù)插入節(jié)點函數(shù)charu()、刪除節(jié)點函數(shù)shanchu()、修改節(jié)點函數(shù)xiugai()都涉及到一個問題,那就是節(jié)點位置的確定。在操作時必定要確定操作的節(jié)點位置,必須用到搜索。搜索有兩種方式:一、根據(jù)節(jié)點的位置,也就是直接讓用戶輸入對第幾個節(jié)點進(jìn)行操作;二、根據(jù)節(jié)點的數(shù)值搜索,也就是讓用戶輸入節(jié)點的值,然后進(jìn)行搜索。我當(dāng)時想,如果鏈表過于長,用戶在
16、使用時很難數(shù)清要操作的是第幾個節(jié)點,我就用了第二種方法,也就是根據(jù)數(shù)值搜索。但是用第二種方法搜索,在插入函數(shù)有一定問題。那就是如果要輸入插入點前面的數(shù),則第一個數(shù)值用法無法找到。如果輸入新節(jié)點后面的數(shù),則最后一個數(shù)無法找到。所以我決定分成兩部分,先問用戶是不是要插入到第一個節(jié)點上,如果是直接插入第一個節(jié)點。否則就要用戶輸入插入點前面的數(shù),這樣確定新節(jié)點位置。然后除創(chuàng)建函數(shù)和結(jié)束函數(shù)以外,其他的函數(shù)在執(zhí)行前必定要驗證鏈表是否已經(jīng)創(chuàng)建的。而我把這個驗證過程放在來了每個函數(shù)里面,這樣可以讓主函數(shù)看起來整齊,對自己檢查錯誤有幫助。菜單在每次執(zhí)行完一項任務(wù)之后都要輸出一次,以便用戶選擇要使用的功能。用戶
17、選擇功能要輸入數(shù)字,肯定是用switch語句。運行相應(yīng)函數(shù)之后,用goto語句返回,重新顯示菜單,并再一次獲取用戶的功能選擇數(shù)值。結(jié)束函數(shù)我想打幾句話,就像什么版權(quán)所有啊,盜版必究啊之類的。雖然這不是一個真正的應(yīng)用程序,可是他終究是我的一份心血,我希望它能夠盡量完善。數(shù)據(jù)結(jié)構(gòu)設(shè)計因為是一個一維的整數(shù)鏈表,所以在數(shù)據(jù)的設(shè)定上幾乎沒有什么不一樣的:struct zhengshu int shuzi;struct zhengshu *next;定義這樣一個結(jié)構(gòu)體,第一部分為int類型,用來存放鏈表節(jié)點的數(shù)字。第二部分為struct zhengshu類型的一個指針,用來指向下一個節(jié)點。所有的函數(shù),結(jié)束
18、函數(shù)設(shè)置為空類型。顯示函數(shù)也設(shè)為空類型,形參類型為struct zhengshu類型的指針,即struct zhengshu *。其他的所有函數(shù)類型都為struct zhengshu *,傳入值類型同樣為struct zhengshu *。 關(guān)鍵算法這個程序比較大,所以函數(shù)也很多。每個函數(shù)代表一個功能,各函數(shù)相互獨立,共同完成所有功能。下面是程序中的幾個重要函數(shù):輸出菜單函數(shù):void caidan()printf("請輸入數(shù)字選擇您要使用的功能n");printf("1.創(chuàng)建鏈表n");printf("2.插入一個新的節(jié)點n");p
19、rintf("3.刪除鏈表一個節(jié)點n");printf("4.修改某個結(jié)點值n");printf("5.撤消鏈表n");printf("6.顯示鏈表n");printf("7.結(jié)束n");它用來輸出菜單,以便用戶選擇想要運行的功能。鏈表創(chuàng)建函數(shù):struct zhengshu *chuangjian(struct zhengshu *head)if(head!=NULL)printf("鏈表已創(chuàng)建n");elseint n;struct zhengshu *p1=NULL,*
20、p2=NULL;printf("依次輸入各個節(jié)點的整數(shù),輸入999999結(jié)束n");scanf("%d",&n);while(n!=999999)p1=(struct zhengshu*)malloc(sizeof(struct zhengshu);p1->shuzi=n;p1->next=NULL;if(head=NULL)head=p1;elsep2->next=p1;p2=p1;scanf("%d",&n);return head;首先確定鏈表是否已經(jīng)創(chuàng)建,如果已經(jīng)創(chuàng)建,就結(jié)束函數(shù)返回。如果沒有
21、就進(jìn)入創(chuàng)建函數(shù)。由用戶輸入n的數(shù)值,如果不是結(jié)束識別符(999999),函數(shù)就會用malloc申請一個新空間,并強制賦值為struct zhengshu*類型,并賦值給指針P1。如果head為空,就把p1的值賦給head,否則賦給p2。這樣繼續(xù)下一次循環(huán),p1又被重新賦值。知道用戶輸入999999,結(jié)束循環(huán) 。返回值head賦值給原來的head,表頭被改變,鏈表創(chuàng)建完成。插入函數(shù)分為幾個部分,一個是查詢部分,另一個是插入部分。查詢部分與其他的函數(shù)基本相同。查詢部分在此介紹,以后部分不再做具體介紹。查詢部分代碼如下:printf("請輸入插入點前面的整數(shù)數(shù)值n");scanf
22、("%d",&a);p1=head;doif(p1->shuzi=a)b+;printf("檢索成功!n");break; while(p1->next!=NULL)先由用戶輸入插入節(jié)點前面的節(jié)點數(shù)值,這樣搜索開始。搜索中,定義一個指針。當(dāng)指針指向的節(jié)點不為空時,則驗證是否節(jié)點值為要搜索的數(shù)值。如果不是,則繼續(xù)賦值為下一個節(jié)點。這個搜索函數(shù)有一定弊病,那就是不能找到第一個節(jié)點值,所以在這個函數(shù)之前,我已經(jīng)設(shè)置了函數(shù)問用戶是否把節(jié)點插入在第一個位置。這樣對這個漏洞做了有效的補救。插入函數(shù)第二部分,插入操作部分:printf("
23、請輸入新節(jié)點的數(shù)值n");scanf("%d",&a);p2=(struct zhengshu*)malloc(sizeof(struct zhengshu);p3=p1;p1=p1->next;p2->shuzi=a;p3->next=p2;p2->next=p1;printf("插入結(jié)點成功!n");這是插入函數(shù)的一部分,是在把新節(jié)點插入到鏈表中間位置時的函數(shù)。插入到最前端和最后端函數(shù)稍有不同,已插入中間為例介紹。首先要求用戶輸入新節(jié)點的值,然后用malloc函數(shù)申請一個新空間,把類型轉(zhuǎn)換為struct zh
24、engshu *,并把它賦值給指針p2。這樣在經(jīng)過一系列賦值語句,就可以使前面節(jié)點的的指針指向新節(jié)點,而新節(jié)點下的新指針指向下個節(jié)點,完成新節(jié)點的插入。節(jié)點的修改比插入節(jié)點要簡單一些,只需找到節(jié)點并對節(jié)點的數(shù)值重新賦值就可以了。而節(jié)點的刪除函數(shù)跟節(jié)點修改很相似,只不過是把賦值語句更改為空間釋放,并多加一個指針賦值而已。下面只介紹節(jié)點的刪除函數(shù):if(b=0)printf("鏈表中無此節(jié)點 n");elseif(p1->next!=NULL)p2=p1;p1=p1->next;p2->next=p1->next;free(p1);printf(&quo
25、t;刪除節(jié)點成功!n");elsep2->next=NULL;free(p1);大家可以看到,我在前面的搜索語句中加入了一個b+語句。這個語句的作用是來判斷查詢語句的循環(huán)結(jié)束,究竟使由于p1->next=0還是找到了要查找的數(shù)值,由于break跳出的循環(huán)。如果b被重新賦值說明成功搜索到了節(jié)點。在這個函數(shù)里,首先看b是不是還為0,如果是說明沒有找到節(jié)點,輸出未找到。如果不是,則說明找到了節(jié)點,而且這是p1的next正指向這個節(jié)點。把它賦值給P2,并使p1指向下一個節(jié)點,也就是要查找的節(jié)點。然后執(zhí)行p2->next=p1->next,這樣就把p1所指的節(jié)點,從鏈表
26、中摘下來了。然后用free語句把空間釋放,就完成了節(jié)點的刪除。鏈表的撤銷函數(shù)跟刪除函數(shù)很是相像,只是依次釋放各個節(jié)點罷了。我編的函數(shù)代碼如下:struct zhengshu *chexiao(struct zhengshu *head)struct zhengshu *p;p=head;if(p=NULL)printf("鏈表未創(chuàng)建n");elsewhile(head!=NULL)p=head;head=head->next;free(p);printf("鏈表撤消成功!n");return head;如果鏈表沒有創(chuàng)建則直接返回。如果找到了,就用一
27、個指針指向它,并把他的空間釋放,而這時head已經(jīng)指向了下一個節(jié)點,指針又會被重新賦值。循環(huán)一直到head指向NULL時結(jié)束,這時鏈表的空間都被釋放,鏈表撤銷結(jié)束。鏈表的輸出不過是一個循環(huán)的輸出語句,在此不做介紹。結(jié)束函數(shù)也只是一些場面話,沒有什么具體意義。下面使縱覽全局的主函數(shù):void main()printf("歡迎使用本鏈表制作程序!n海波制作群預(yù)祝您身體健康,萬事如意!n如果您使用中發(fā)現(xiàn)BUG,請與我們聯(lián)系n");printf("電話QQ:279528056 聯(lián)系人:李海波nnnn");void caidan();st
28、ruct zhengshu *chuangjian(struct zhengshu *head);struct zhengshu *charu(struct zhengshu *head);struct zhengshu *xiugai(struct zhengshu *head);struct zhengshu *shanchu(struct zhengshu *head);struct zhengshu *chexiao(struct zhengshu *head);void print(struct zhengshu *head);void jieshu ();struct zhengs
29、hu *head;int a=0;head=NULL;loop:caidan();scanf("%d",&a);switch(a)case 1:head=chuangjian(head);goto loop;case 2: head=charu(head);goto loop;case 4: head=xiugai(head);goto loop;case 3:head=shanchu(head);goto loop;case 5:head=chexiao(head);goto loop;case 6: print(head);goto loop;case 7: j
30、ieshu();主函數(shù)的布局我盡量做得規(guī)范。最上面是所有函數(shù)的聲明,然后是各種類型變量的定義,之后就是loop后面的語句。Loop后首先執(zhí)行菜單函數(shù),輸出菜單。然后是switch語句執(zhí)行相應(yīng)函數(shù),執(zhí)行結(jié)束后直接由goto語句返回loop。這樣菜單再次輸出,功能在此重新選擇。調(diào)試與運行調(diào)試過程中出現(xiàn)了很多錯誤,還有一些設(shè)計上不合理的地方。這些錯誤大部分已經(jīng)被更正,或是做了修改和補救。例如,插入節(jié)點查詢函數(shù)采用查找節(jié)點數(shù)值的方式,無法找到最前面數(shù)值的問題。我加了一個詢問語句,和表頭節(jié)點的插入補救。結(jié)束函數(shù),由于都是printf語句,真正的exe文件執(zhí)行的時候會執(zhí)行玩這些立刻結(jié)束,我加了一個輸入語句
31、,使用戶可以看清楚結(jié)束的話,在自己想結(jié)束的時候輸入一個字符結(jié)束程序。我已經(jīng)對程序里各項功能做了比較詳細(xì)的測試,程序的功能可以正常運行,不會出現(xiàn)意想不到的結(jié)果。但是在測試中發(fā)現(xiàn)了一個問題,至今沒有解決。那就是,按照節(jié)點數(shù)值查找,無法解決有相同節(jié)點的問題。如果有兩個節(jié)點,程序只會對第一個節(jié)點進(jìn)行操作,會完全忽略掉。這樣使整個程序變得和不完整。因為幾乎所有的重要函數(shù)都用到了查詢函數(shù)。如果更改查詢函數(shù),就會“牽一發(fā)而動全身”,整個程序各部分都要重新更改,由于時間關(guān)系我沒有做改動,這時本程序需要改進(jìn)的地方。小結(jié)與體會這個程序是我獨立完成的第一個比較大的程序,當(dāng)然對于那些真正的大程序來說,這個不爾爾??墒?/p>
32、對我來說不一樣,我真的用心在做。做的過程中遇到不少麻煩,也曾經(jīng)止步不前,可是我最終還是把它成功編寫出來了,我覺得很有成就感。雖然程序中還有很多弊病在里面,說不上一個完善的程序,但它終究是我努力的結(jié)果。在編寫程序時,一邊寫就會一邊發(fā)現(xiàn)很多的問題。寫得時間越長,發(fā)現(xiàn)的問題也越來越多。一個個把問題解決掉真的很開心。可是我覺得,真正編寫程序不應(yīng)該是這樣的。應(yīng)該在寫程序之前,就把所有的問題想清楚。這樣可以給自己剩下大量的時間,而且程序看起來也會渾然一體,而不是“各自為戰(zhàn)”。這個程序還讓我感覺的,各個函數(shù)相互獨立的方式編輯函數(shù)很有優(yōu)越性。一個函數(shù)只負(fù)責(zé)而且可以獨立負(fù)責(zé)一個功能,就可以避免,函數(shù)之間相互調(diào)用
33、,把簡單的問題復(fù)雜化。這樣很容易找到問題發(fā)生的地方,并修改不必考慮對其他函數(shù)的影響。本人于2008年9月9號到2008年9月12日在計算機中心6號機房12號機器上嘗試完成了本次課程設(shè)計。但是由于時間關(guān)系,沒有能全部完成程序的編寫任務(wù)。課程設(shè)計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務(wù)五 學(xué)籍管理目的與意義在某大學(xué)的一個專業(yè),里面有四個班,每個班最多可以有40個學(xué)生。每個學(xué)生有學(xué)號、性別、籍貫等數(shù)據(jù)。在某個學(xué)期,他們開了高等數(shù)學(xué)一、英語一、線性數(shù)學(xué)、離散數(shù)學(xué)一、高等物理、思想品德教育、體育等8們課程,每門學(xué)分依次為3、3、2、2、2、1、2.。編制一個程序,
34、使用戶方便管理他們的學(xué)籍信息。需要輸出沒管的功能菜單。對于每個學(xué)生,可以進(jìn)行基本情況的錄入、查詢、修改、刪除。還有學(xué)生成績的錄入,查詢,個人加權(quán)成績計算,修改等。還要完成班里加權(quán)成績的平均分計算和排名。要求所有的數(shù)據(jù)用文件形式存取。還要設(shè)置管理員的權(quán)限和密碼管理。任務(wù)分析根據(jù)我以前編寫鏈表程序的經(jīng)驗,我想這次還是采取各個函數(shù)獨立完成一項功能,彼此不相互調(diào)用的形式完成這次編程任務(wù)。首先要建立一個菜單,菜單上顯示所有的功能,以便于用戶選擇相應(yīng)的功能。但是美觀很難做到,因為我知道機房的gotoxy的函數(shù)是不能用的。我就決定先把真材實料的東西做完,至于美觀,在做完各個函數(shù)之后再去考慮。四個班的文件分開
35、存放的,也就是說分4個文件存放。這樣在執(zhí)行其他功能時,必須要用戶輸入要進(jìn)行操作的班級,不過這樣省去了在一個文件中分出四個班的麻煩。錄入函數(shù)是一個比較重要的函數(shù),因為所有的操作都是再文件的進(jìn)行的,所以難度增加了不少。但是這是必須的,總不能輸入一次看一次。錄入函數(shù)中,肯定是用“w”形式打開文件,因為這里只有文件的寫入。我想這函數(shù)肯定要設(shè)計一個結(jié)構(gòu)體的類型的。所以用fwrite函數(shù)成塊寫入文件是最恰當(dāng)?shù)?。查詢個人信息函數(shù)中,文件用“r”,也就是只讀形式打開。當(dāng)然是用fread函數(shù)成塊讀出文件信息,并對它進(jìn)行操作。查詢至少要兩種查詢路線,也就是按姓名和按學(xué)號。這兩種都是常用的搜索,所以都要包括在內(nèi)。查
36、詢班級信息函數(shù),必須輸出班級的加權(quán)平均分。我決定在錄入函數(shù)中直接由程序算出學(xué)生的加權(quán)成績存儲起來。另外是班級排名,使用冒泡法排序代碼簡單,又容易實現(xiàn)。由于時間關(guān)系,刪除,修改和管理權(quán)限、密碼設(shè)置都沒有完成。數(shù)據(jù)結(jié)構(gòu)設(shè)計這里的數(shù)據(jù)用結(jié)構(gòu)體是毫無疑問的。我的數(shù)據(jù)類型定義為:typedef structchar xingming9;char xuehao11;char xingbie3;char jiguan9;float chengji9;xue;學(xué)號、姓名、性別、籍貫都用char,也就是字符串類型定義。單科成績共有8門,用float定義一個9個元素的數(shù)組,最后的用來存放學(xué)生的加權(quán)成績。我在程序里
37、還定義了一個結(jié)構(gòu)體:typedef structchar xingming9;char xuehao11;float jiaquan;ss;這是在班級加權(quán)成績是用到的數(shù)據(jù)類型。因為在班級排名時,我們只關(guān)心學(xué)生的姓名、學(xué)號還有他的成績,所以我們只使用這三個元素,沒有必要在用原類型了。關(guān)鍵算法菜單函數(shù)只是一些輸入函數(shù),用來提示用戶選擇相應(yīng)的功能。由于沒有在美觀上下工夫,所以我的菜單函數(shù)十分簡單,只是一些輸出函數(shù)而已。信息的錄入函數(shù)如下:void luru()printf("您要錄入哪個班的成績?請輸入數(shù)字n");int a=0;FILE *p;xue b;scanf("
38、;%d",&a);switch(a)case 1: p=fopen("c:yiban.txt","w");break;case 2: p=fopen("c:erban.txt","w");break;case 3: p=fopen("c:sanban.txt","w");break;case 4: p=fopen("c:siban.txt","w");break;doprintf("請輸入學(xué)生的基本信息,依次
39、輸入姓名,學(xué)號,性別,籍貫(省名),中間用空格擱開n");scanf("%s %s %s %s",&b.xingming,&b.xuehao,&b.xingbie,&b.jiguan);printf("請輸入此學(xué)生的成績(按照數(shù)學(xué),英語,線形數(shù)學(xué),離散數(shù)學(xué),物理,品德,體育的順序),中間逗號擱開n");scanf("%f,%f,%f,%f,%f,%f,%f",&b.chengji0,&b.chengji1,&b.chengji2,&b.chengji3,&
40、;b.chengji4,&b.chengji5,&b.chengji6);b.chengji7=(b.chengji0*3+b.chengji1*3+b.chengji2*2+b.chengji3*2+b.chengji4*2+b.chengji5+b.chengji6*2)/(3+3+2+2+1+2+2);fwrite(&b,sizeof(b),1,p);printf("繼續(xù)錄入請輸入1,結(jié)束錄入請輸入2n");scanf("%d",&a);while(a=1);fclose(p);先打開或建立相應(yīng)的文件,這里需要用戶輸
41、入要錄入的班級,以便把文件分開管理。打開成功后,開始請用戶錄入信息。信息先存放在一個變量里,然后在一個人的成績完全輸入完成后,直接算出學(xué)生的加權(quán)成績,全部存入變量。然后全部寫入文件。然后詢問用戶是否還要繼續(xù)輸入,用戶只要輸入相應(yīng)指令,就可以繼續(xù)或結(jié)束輸入。查詢函數(shù)中包括了兩種查詢方式:學(xué)號查詢和姓名查詢。兩個部分大致相同,這里只介紹下其中之一:學(xué)號查詢.printf("請輸入學(xué)生的學(xué)號n");scanf("%s",&c);while(fread(&d,sizeof(d),1,p)!=0)if(strcmp(d.xuehao,c)=0)pr
42、intf("姓名,學(xué)號,性別,籍貫");printf("%s,%s,%s,%s",d.xingming,d.xuehao,d.xingming,d.jiguan);printf("高等數(shù)學(xué)一,英語一,線形數(shù)學(xué),離散數(shù)學(xué),高等物理,思想品德,體育,加權(quán)成績n");printf("%7.1f,%7.1f,%7.1f,%7.1f,%7.1f,%7.1f,%7.1f,%7.1f",d.chengji0,d.chengji1,d.chengji2,d.chengji3,d.chengji4,d.chengji5,d.chen
43、gji6,d.chengji7);if(fread(&d,sizeof(d),1,p)=0)printf("查詢結(jié)束,該班無此人信息n");先由用戶輸入學(xué)生的學(xué)號,然后開始讀取函數(shù)數(shù)據(jù)。函數(shù)數(shù)據(jù)存放在一個變量p中。用strcmp函數(shù)驗證是不是兩個字符串相同,相同的話就輸出這個學(xué)生的成績。后面有個if語句。當(dāng)沒有找到這個學(xué)號時就會運行,顯示沒有找到。查詢班級成績,要函數(shù)比較麻煩。因為我把班級的排名也放在這里面,所以代碼有些長。但是有大部分跟查詢函數(shù)類似,下面是排名的函數(shù):for(j=0;j!=0;)j=0;for(k=0;k<=40;k+)if(uk.jiaqu
44、an<=uk+1.jiaquan)m=uk;uk=uk+1;uk+1=m;j+;用的是課本上說的冒泡排序法。當(dāng)初只是知道了這種思想,自己寫出代碼后發(fā)現(xiàn)與課本上不是太一樣,不過功能相同,沒有什么差別。實現(xiàn)排名后,只要依次輸出各項數(shù)據(jù)就可以了。調(diào)試與運行調(diào)試運行的時候自然錯誤很多,我對他們做了更愛和補救。在編寫查詢函數(shù)時,發(fā)現(xiàn)一個問題到現(xiàn)在也沒有解決。那就是在獲取用戶要查找的學(xué)生信息時,用gets函數(shù)不行。不知道為什么,程序會自動跳過這一句,直接進(jìn)行下面的語句。到現(xiàn)在也沒有弄明白這是為什么,我只好用scanf代替了gets。小結(jié)與體會程序因為時間關(guān)系沒有寫完,我很遺憾。本來指導(dǎo)老師告訴我,這
45、個程序太大,建議四人一組共同完成編程任務(wù)??墒俏覜]有聽,否則應(yīng)該可以把它寫完的。今后不管是學(xué)習(xí)還是生活,都要重視團(tuán)隊合作的力量。另外在編寫過程中發(fā)現(xiàn),一些自認(rèn)為很簡單的問題,自己寫起來總是出錯??梢姽湃怂f的眼高手低還是有道理的。凡事尤其是編寫程序,切記不可在不動手的情況下,低估程序的難度。本人于2008年9月8號在計算機中心6號機房5號機器上完成了本次課程設(shè)計。課程設(shè)計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務(wù)四 黑白棋游戲、任務(wù)和意義設(shè)計一個程序完成黑白棋,兩人對弈。任務(wù)分析黑白棋的玩法大家都知道,而要實現(xiàn)一人與電腦對弈的模式牽扯到人工智能方面的知識,
46、遠(yuǎn)在我的水平之外。所以只好編寫兩人對弈的模式。開始自己也想過很多,可是后來發(fā)現(xiàn)這些都是枉然。這個程序的難度完全超越了我目前的水平。所以把附錄上的程序敲入到電腦里。對這已經(jīng)編好的程序看了好久,由于程序代碼太長,而我自己的水平又確實有限,只是看懂了部分代碼。關(guān)鍵算法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
47、(0);/*取消圓周圍的一圈東西*/ setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/ fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/ setfillstyle(SOLID_FILL,8); /*黑色實體填充模式*/ fillellipse(500,300,15,15); a33=a44=1;/*初始兩個黑棋*/ a34=a43=2;/*初始兩個白棋*/ setfillstyle(SOLID_FILL,WHITE); fillellipse(120+3*40,120+3*40,15,15); fillellipse(120+
48、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; /*有棋后改變分?jǐn)?shù)*/ DoScore();/*輸出開始分?jǐn)?shù)*/主函數(shù)只有函數(shù)的聲明,以及函數(shù)的調(diào)用。我認(rèn)為自己編寫過得程序,主函數(shù)的已經(jīng)非常的整齊,可是我不得不承認(rèn),我與真正的大使級變成大師確實還有很遠(yuǎn)的一段距離。由于程序設(shè)計大量的顯示方面的函數(shù),我完全沒有接觸過??戳撕镁靡彩冀K是一頭霧水。總覺得每個函數(shù)都不可
49、缺少,卻又不知道為什么。調(diào)試與運行原本老師說,這個程序可能村子幾個小錯誤??墒俏矣胐ebuge系統(tǒng)沒有檢查出錯誤,只是不能夠運行而已。找到了正確的運行環(huán)境,我是用了這個程序。用它跟同學(xué)對弈了一下,沒有發(fā)祥任何異?,F(xiàn)象,可以說沒有任何錯誤。小結(jié)與體會當(dāng)我看著這份代碼為n行的程序時,大致有兩個感覺。一是感覺,這么長的代碼,寫他的人要多大的耐力;第二,肯定有很多錯誤??墒钱?dāng)晚把它打完、運行后,我不得不承認(rèn)它一點錯誤都沒有。我完全被它折服了,其實是被編寫它的老師折服了。意識到自己究竟有多么渺小,水平到底有多么的粗淺。覺得自己路還有很長,可是我并不氣餒。因為我相信,終有一天,我也可以做這樣的程序出來,可
50、是這一天距離我還有好遠(yuǎn)。雄關(guān)漫道真如鐵,而今邁步從頭越!附錄(各個程序)二分法:#include<stdio.h>float hanshu(float x)return x*x*x-x-1;void main ()float a=1,b=1.5,f;dof=(a+b)/2;if(hanshu(f)=0)printf("方程的根為%.2fn",f);break;if(hanshu(a)*hanshu(f)<0)b=f;elsea=f;while(b-a>0.001);if(b-a<0.001)printf("方程的近似根為%.2fn&q
51、uot;,f);矩陣求逆(未調(diào)試成功):#include<stdio.h>float hangleishi(int n,float x88)float h;int i=0;float yuzishi(int n,float x88,int i,int j);if (n=2)h=x00*x11-x01*x10;elsefor(i=0;i<n;i+)h=h+x0i*yuzishi(n,x,0,i);return h;float yuzishi(int n,float x88,int i,int j)int a=1,c=0,d=0;float h=0;float y88;for(c
52、=0;c<i;c+)for(d=0;d<j;d+)ycd=xcd;for(;c<n-1;c+)for(;d<n-1;d+)ycd=xc+1d+1;h=hangleishi(n-1),y);for(;a<=i+j;a+)h=-h;return h;void main()float a88,b88;float h;printf("輸入矩陣數(shù)值n");int i=0,j=0;for(i=0;i<8;i+)for(j=0;j<8;j+)printf("輸入矩陣a%d%d數(shù)值n",i+1,j+1);scanf("
53、%d",&aij);h=hangleishi(8,a);if(h=0)printf("此矩陣沒有逆矩陣n");elseprintf("%fn",h);i=0;j=0;for(i=0;i<8;i+)for(j=0;j<8;j+)bij=yuzishi(8,a,j,i)/h;printf("%4d",bij);printf("n");鏈表操作:#include<stdio.h>#include<stdlib.h>struct zhengshu int shuzi;s
54、truct zhengshu *next;void main()printf("歡迎使用本鏈表制作程序!n海波制作群預(yù)祝您身體健康,萬事如意!n如果您使用中發(fā)現(xiàn)BUG,請與我們聯(lián)系n");printf("電話QQ:279528056 聯(lián)系人:李海波nnnn");void caidan();struct zhengshu *chuangjian(struct zhengshu *head);struct zhengshu *charu(struct zhengshu *head);struct zhengshu *xiugai(struct zhengshu *head);struct zhengshu *shanchu(struct zhengshu *head);struct zhengshu *chexiao(struct zhengshu *head);void print(struct zhengshu *head);void jieshu ();struct zhengshu *
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年撰寫:中國無線搜索行業(yè)發(fā)展趨勢及競爭調(diào)研分析報告
- 2024-2030年撰寫:中國吊針注射液行業(yè)發(fā)展趨勢及競爭調(diào)研分析報告
- 房屋租賃Javaweb課程設(shè)計
- 2024-2030年天然玉石類礦公司技術(shù)改造及擴產(chǎn)項目可行性研究報告
- 2024-2030年國家甲級資質(zhì):中國魔芋切割機融資商業(yè)計劃書
- 2024-2030年國家甲級資質(zhì):中國內(nèi)爬式塔式起重機融資商業(yè)計劃書
- 2024-2030年吹氣閥搬遷改造項目可行性研究報告
- 2024年度智慧交通系統(tǒng)建設(shè)包工合同3篇
- 2024-2030年冶銅搬遷改造項目可行性研究報告
- 2024-2030年全球及中國阻燃PA66行業(yè)供需現(xiàn)狀及投資動向預(yù)測報告
- 國家開放大學(xué)電大《計算機應(yīng)用基礎(chǔ)(本)》學(xué)士學(xué)位論文家用電器銷售管理系統(tǒng)的設(shè)計與實現(xiàn)
- 水利工程運維水利工程運行和日常維修養(yǎng)護(hù)方案
- MOOC 管理學(xué)-北京師范大學(xué) 中國大學(xué)慕課答案
- 鄉(xiāng)村內(nèi)碳排放量計算方法
- 不銹鋼蜂窩材料市場洞察報告
- 科研思路與方法智慧樹知到期末考試答案2024年
- 工程水文學(xué)智慧樹知到期末考試答案2024年
- 有關(guān)物業(yè)管家培訓(xùn)課件模板
- 肇事逃逸的法律規(guī)定
- 300KW儲能系統(tǒng)初步設(shè)計方案及調(diào)試
- 2024年安徽合肥市軌道交通集團(tuán)有限公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論