C語言程序課程設計_第1頁
C語言程序課程設計_第2頁
C語言程序課程設計_第3頁
C語言程序課程設計_第4頁
C語言程序課程設計_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言程序設計課程設計報告完成任務:1 用二分法求方程根2 矩陣求逆3 鏈表制作4 二十四點游戲5 學籍管理程序專業(yè):計算機科學與技術班級:計二班學號:0705010225姓名:李海波本人于2008年9月1號在計算機中心6號機房25號機器上完成了本次課程設計。課程設計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務二 用二分法求方程根目的與意義用二分法求方程f(x)=x3-x-1=0在區(qū)間1.0,1.5內的一個實根,要求準確到小數點后第2位。任務分析方程在區(qū)間1.0,1.5上單調并且存在一個根。取區(qū)間中點,確定方程的根在左右哪個區(qū)間(或者恰好是區(qū)間中點)內,這樣

2、一次就可以把區(qū)間縮小一半,重復做此步驟直到滿足精確度為止。方程的近似根為區(qū)間中點。取區(qū)間中點:只需用區(qū)間的兩個端點相加,在除以2即可。確定根所在位置:區(qū)間a,b中,取中點c=(a+b)/2,與a,b構成兩個區(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中,兩者只有一種情況成立。驗證是否滿足精確度:精確到小數點后兩位,就是說0.01.。由于是用二分法,所以到了0.01后,還要繼續(xù)

3、二分,直到0.01后才能滿足精確度。也就是說,區(qū)間左右值相減要小于0.001時,輸出區(qū)間中點即可。數據結構設計此程序將涉及三個變量:區(qū)間的兩個端點,區(qū)間中點。由于要精確到小數點后兩位,所以必須設置為float類型。還有一個函數,由于只需要驗證返回值的正負,所以只需用int類型就可以了。后來在函數運行中出現錯誤,更改為float類型(具體錯誤將在“代碼調試與運行”部分說明)。關鍵算法設計本程序比較小,原本只用一個main函數就可以完成,可是由于方程的函數每次輸入比較麻煩,所以設置了一個簡單的函數:Int hanshu(float x)return x*x*x-x-1;用它來返回方程函數的帶入值。

4、程序的關鍵在于不斷二分,確定根所在位置的循環(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語句,結束循環(huán)。如果不滿足,則驗證根在哪個區(qū)間,并執(zhí)行相應賦值,形成新的區(qū)間,繼續(xù)執(zhí)行循環(huán)。循環(huán)在執(zhí)行到滿足精確度時結束,即b-a<=0.001,結束循環(huán)。輸出方程的根最好區(qū)分

5、開此根是近似根還是準確根。所以把輸出分為兩部分。一部分在循環(huán)內,驗證區(qū)間中點為準確根的時候輸出。若要輸出近似根則要循環(huán)結束后,所以輸出語句在循環(huán)結構外面。為了驗證循環(huán)結束后得到的根f是不是準確根,顧輸出語句在if語句內。代碼如下:if(b-a<0.01)printf("方程的近似根為%.2fn",f);代碼調試與運行原程序運行時結果出人預料:方程的根為1.25注意到1.25恰好是原來區(qū)間的中點,而根據輸出來看,1.25是方程的精確根??墒墙涍^計算我得到方程的根應該在1.3到1.4之間。會輸出這個結果,也就是說程序執(zhí)行了if(hanshu(f)=0)printf(&qu

6、ot;方程的根為%.2fn",f);break;為什么會這樣?我想起返回函數帶入值的函數hanshu()的返回值是int。如果返回值沒有整數部分,就會返回0。所以把它更改為float類型,最終得到結果:1.33。屏幕顯示為:方程的近似根為1.33小結與體會每項數據在數據設定時需要細致詳細的考慮數據的用途,以及可能出現的錯誤。注意每種數據的范圍以防止程序運行中出錯。一個簡單的程序,也不能保證一次編寫毫無錯誤。尤其在DEBUGE系統(tǒng)不能檢驗出錯誤,但是結果又不是期望值時,必須重新檢查程序,任何細小的地方都可能是出錯的原因。本人于2008年9月2號到2008年9月5號在計算機中心6號機房1

7、4號機器上嘗試了本次課程設計。課程設計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。由于各種原因至今沒有完成,個大函數已經完成,但是在運行中出現錯誤的原因沒有找到。任務一 矩陣求逆·目的與意義給定一個8X8的矩陣A,求出它的逆矩陣A-1。矩陣的元素由鍵盤中輸入,首先判斷矩陣是否可逆,若可逆則求出其逆矩陣并在屏幕上用適當格式顯示出來。程序可以把矩陣求逆這一復雜的運算由計算機代替計算,既可以保證結果的準確,又可以高速度的完成復雜的計算。·任務分析根據線性數學的學習知道,矩陣求逆有兩種方法:單位矩陣化歸法、伴隨矩陣法。根據指導上的分析,第一種需要三個

8、函數。那就是:行交換、將第n行乘以e、第i行乘以k加到第j行。這三個函數都不難做,但是如何利用這三個函數,求出逆矩陣我卻無從下手。我只好用另外一種方法做。用伴隨矩陣求逆矩陣需要兩個函數:求矩陣行列式、計算代數余子式。而這兩個函數在使用中又相互使用,也就是相互調用。利用相互調用,就可以吧求你矩陣所需的的代數余子式和矩陣行列式求出來。求出矩陣行列式就可以驗證矩陣是否存在逆矩陣。由代數余子式得到矩陣的伴隨矩陣,兩者相除就可以得到矩陣的逆矩陣了。·數據結構設計 程序里輸入輸出都是矩陣,自然用二維數組。矩陣不見得都是整數,所以用float來定義最好。在帶入兩個函數時需要函數的階數,這個一定是正

9、整數,用int定義就可以。兩個函數舉證的行列式肯定是用float定義。求代數余子式的函數還要傳入行數和列數,用int定義就好。·關鍵算法程序關鍵算法就是兩個。一是計算方陣的行列式,另一個是計算方陣對于某個元素的代數余子式。由于兩個函數相互調用,所以在函數中會有另一個函數的函數聲明。我的求方陣行列式函數聲名為float hangleishi(int n,float x88),其中n表示方陣的階數。求代數余子式的函數聲明為float yuzishi(int n,float x88,int i,int j),其中n表示階數,i,j表示求方陣對于第i行,第j列的代數余子式。求方陣行列式的函數

10、代碼如下: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;函數運用了函數遞歸的原理。在n>2時,函數執(zhí)行else 的語句。語句中使用了求代數余子式的函數,是求行列式的一般求法,也是普遍求法。沒有技巧,但是編程簡單,算法也容易實現。n=2時,就可以直接算出來,返回h即方陣的行列式

11、。降階在函數yuzishi()中實現。求代數余子式的函數如下: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;函數大致分為兩部分。第一部分把傳入的矩陣中的第i行、第j列的元素刪除,并把剩下的復制到另外一個矩

12、陣中,然后再求復制完矩陣的行列式。求行列式時用到了求行列式函數,在調用的時,傳入n-1,就完成了降階。其余的就是矩陣的輸入與輸出。這個可以在主函數中一起實現。只需要連個循環(huán)的嵌套就可以了。·代碼調試與運行程序運行時,會請用戶輸入所有的64個元素,之后就會開始運算。但是由于錯誤不管輸入什么值,計算的行列式都是0。我無法找出其中的毛病。因為Debuge系統(tǒng)是找不到的,這種問題往往比較難找。時間關系我繼續(xù)了我的課程設計,沒有全部完成這項設計任務·小結與體會程序沒有很好的完成,這讓我很遺憾。我很想把每個我編的程序都盡量做好,做完善??墒沁@次我找了很多班里的C語言“大師”,都沒有找到

13、錯誤所在,而且有人的錯誤竟然和我的一模一樣。我很詫異,也很無奈。這個程序我之后又反復看了很多次,終究找不到問題出在哪里,也許這就是水平問題吧。后來,我也只好用殘缺也是一種美來安慰自己,把它保存下來。等以后自己能力高些了再來找出問題所在。本人于2008年9月4號到2008年9月8號在計算機中心6號機房12號機器上完成了本次課程設計。課程設計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務三 鏈表操作目的與意義在屏幕上輸出菜單,先從鍵盤接收整數序列。將這些整數作為鏈表節(jié)點的值,完成鏈表的創(chuàng)建、節(jié)點插入、節(jié)點的刪除以及整個鏈表的撤銷等操作。后來覺得程序的使用者很可能修

14、改某個節(jié)點,所以添加了節(jié)點的修改功能。使用程序的人可以根據菜單提示,完成最基本的鏈表操作,完成一個自己需要的整數一維鏈表。任務分析這是一個比較大的程序,所以必定要分多個函數完成。首先必定要輸出菜單,所以一定有一個菜單函數:caidan();另外根據要求還要有創(chuàng)建函數chuangjian()、插入節(jié)點函數charu()、刪除節(jié)點函數shanchu()、修改節(jié)點函數xiugai()、撤銷鏈表函數chexiao()、鏈表顯示函數print(),還要有一個結束選項,于是就有了結束函數jieshu()。主函數mian(),里面有各個函數的聲明和調用。但是各個函數之間相互獨立不互相調用,這樣就可以把問題分

15、割,逐一擊破,出錯之后也容易判斷出錯的位置。創(chuàng)建函數只需鏈表創(chuàng)建完,傳回首地址就可以了??墒怯幸粋€問題,那就是到底用戶輸入什么結束輸入。由于這是個整數鏈表,通常所用的0,-1等都不妥當。于是我就想輸入999999,也就是六個九結束輸入。之后的幾個函數插入節(jié)點函數charu()、刪除節(jié)點函數shanchu()、修改節(jié)點函數xiugai()都涉及到一個問題,那就是節(jié)點位置的確定。在操作時必定要確定操作的節(jié)點位置,必須用到搜索。搜索有兩種方式:一、根據節(jié)點的位置,也就是直接讓用戶輸入對第幾個節(jié)點進行操作;二、根據節(jié)點的數值搜索,也就是讓用戶輸入節(jié)點的值,然后進行搜索。我當時想,如果鏈表過于長,用戶在

16、使用時很難數清要操作的是第幾個節(jié)點,我就用了第二種方法,也就是根據數值搜索。但是用第二種方法搜索,在插入函數有一定問題。那就是如果要輸入插入點前面的數,則第一個數值用法無法找到。如果輸入新節(jié)點后面的數,則最后一個數無法找到。所以我決定分成兩部分,先問用戶是不是要插入到第一個節(jié)點上,如果是直接插入第一個節(jié)點。否則就要用戶輸入插入點前面的數,這樣確定新節(jié)點位置。然后除創(chuàng)建函數和結束函數以外,其他的函數在執(zhí)行前必定要驗證鏈表是否已經創(chuàng)建的。而我把這個驗證過程放在來了每個函數里面,這樣可以讓主函數看起來整齊,對自己檢查錯誤有幫助。菜單在每次執(zhí)行完一項任務之后都要輸出一次,以便用戶選擇要使用的功能。用戶

17、選擇功能要輸入數字,肯定是用switch語句。運行相應函數之后,用goto語句返回,重新顯示菜單,并再一次獲取用戶的功能選擇數值。結束函數我想打幾句話,就像什么版權所有啊,盜版必究啊之類的。雖然這不是一個真正的應用程序,可是他終究是我的一份心血,我希望它能夠盡量完善。數據結構設計因為是一個一維的整數鏈表,所以在數據的設定上幾乎沒有什么不一樣的:struct zhengshu int shuzi;struct zhengshu *next;定義這樣一個結構體,第一部分為int類型,用來存放鏈表節(jié)點的數字。第二部分為struct zhengshu類型的一個指針,用來指向下一個節(jié)點。所有的函數,結束

18、函數設置為空類型。顯示函數也設為空類型,形參類型為struct zhengshu類型的指針,即struct zhengshu *。其他的所有函數類型都為struct zhengshu *,傳入值類型同樣為struct zhengshu *。 關鍵算法這個程序比較大,所以函數也很多。每個函數代表一個功能,各函數相互獨立,共同完成所有功能。下面是程序中的幾個重要函數:輸出菜單函數:void caidan()printf("請輸入數字選擇您要使用的功能n");printf("1.創(chuàng)建鏈表n");printf("2.插入一個新的節(jié)點n");p

19、rintf("3.刪除鏈表一個節(jié)點n");printf("4.修改某個結點值n");printf("5.撤消鏈表n");printf("6.顯示鏈表n");printf("7.結束n");它用來輸出菜單,以便用戶選擇想要運行的功能。鏈表創(chuàng)建函數:struct zhengshu *chuangjian(struct zhengshu *head)if(head!=NULL)printf("鏈表已創(chuàng)建n");elseint n;struct zhengshu *p1=NULL,*

20、p2=NULL;printf("依次輸入各個節(jié)點的整數,輸入999999結束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;首先確定鏈表是否已經創(chuàng)建,如果已經創(chuàng)建,就結束函數返回。如果沒有

21、就進入創(chuàng)建函數。由用戶輸入n的數值,如果不是結束識別符(999999),函數就會用malloc申請一個新空間,并強制賦值為struct zhengshu*類型,并賦值給指針P1。如果head為空,就把p1的值賦給head,否則賦給p2。這樣繼續(xù)下一次循環(huán),p1又被重新賦值。知道用戶輸入999999,結束循環(huán) 。返回值head賦值給原來的head,表頭被改變,鏈表創(chuàng)建完成。插入函數分為幾個部分,一個是查詢部分,另一個是插入部分。查詢部分與其他的函數基本相同。查詢部分在此介紹,以后部分不再做具體介紹。查詢部分代碼如下:printf("請輸入插入點前面的整數數值n");scanf

22、("%d",&a);p1=head;doif(p1->shuzi=a)b+;printf("檢索成功!n");break; while(p1->next!=NULL)先由用戶輸入插入節(jié)點前面的節(jié)點數值,這樣搜索開始。搜索中,定義一個指針。當指針指向的節(jié)點不為空時,則驗證是否節(jié)點值為要搜索的數值。如果不是,則繼續(xù)賦值為下一個節(jié)點。這個搜索函數有一定弊病,那就是不能找到第一個節(jié)點值,所以在這個函數之前,我已經設置了函數問用戶是否把節(jié)點插入在第一個位置。這樣對這個漏洞做了有效的補救。插入函數第二部分,插入操作部分:printf("

23、請輸入新節(jié)點的數值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("插入結點成功!n");這是插入函數的一部分,是在把新節(jié)點插入到鏈表中間位置時的函數。插入到最前端和最后端函數稍有不同,已插入中間為例介紹。首先要求用戶輸入新節(jié)點的值,然后用malloc函數申請一個新空間,把類型轉換為struct zh

24、engshu *,并把它賦值給指針p2。這樣在經過一系列賦值語句,就可以使前面節(jié)點的的指針指向新節(jié)點,而新節(jié)點下的新指針指向下個節(jié)點,完成新節(jié)點的插入。節(jié)點的修改比插入節(jié)點要簡單一些,只需找到節(jié)點并對節(jié)點的數值重新賦值就可以了。而節(jié)點的刪除函數跟節(jié)點修改很相似,只不過是把賦值語句更改為空間釋放,并多加一個指針賦值而已。下面只介紹節(jié)點的刪除函數: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)結束,究竟使由于p1->next=0還是找到了要查找的數值,由于break跳出的循環(huán)。如果b被重新賦值說明成功搜索到了節(jié)點。在這個函數里,首先看b是不是還為0,如果是說明沒有找到節(jié)點,輸出未找到。如果不是,則說明找到了節(jié)點,而且這是p1的next正指向這個節(jié)點。把它賦值給P2,并使p1指向下一個節(jié)點,也就是要查找的節(jié)點。然后執(zhí)行p2->next=p1->next,這樣就把p1所指的節(jié)點,從鏈表

26、中摘下來了。然后用free語句把空間釋放,就完成了節(jié)點的刪除。鏈表的撤銷函數跟刪除函數很是相像,只是依次釋放各個節(jié)點罷了。我編的函數代碼如下: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已經指向了下一個節(jié)點,指針又會被重新賦值。循環(huán)一直到head指向NULL時結束,這時鏈表的空間都被釋放,鏈表撤銷結束。鏈表的輸出不過是一個循環(huán)的輸出語句,在此不做介紹。結束函數也只是一些場面話,沒有什么具體意義。下面使縱覽全局的主函數:void main()printf("歡迎使用本鏈表制作程序!n海波制作群預祝您身體健康,萬事如意!n如果您使用中發(fā)現BUG,請與我們聯系n");printf("電話QQ:279528056 聯系人:李海波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();主函數的布局我盡量做得規(guī)范。最上面是所有函數的聲明,然后是各種類型變量的定義,之后就是loop后面的語句。Loop后首先執(zhí)行菜單函數,輸出菜單。然后是switch語句執(zhí)行相應函數,執(zhí)行結束后直接由goto語句返回loop。這樣菜單再次輸出,功能在此重新選擇。調試與運行調試過程中出現了很多錯誤,還有一些設計上不合理的地方。這些錯誤大部分已經被更正,或是做了修改和補救。例如,插入節(jié)點查詢函數采用查找節(jié)點數值的方式,無法找到最前面數值的問題。我加了一個詢問語句,和表頭節(jié)點的插入補救。結束函數,由于都是printf語句,真正的exe文件執(zhí)行的時候會執(zhí)行玩這些立刻結束,我加了一個輸入語句

31、,使用戶可以看清楚結束的話,在自己想結束的時候輸入一個字符結束程序。我已經對程序里各項功能做了比較詳細的測試,程序的功能可以正常運行,不會出現意想不到的結果。但是在測試中發(fā)現了一個問題,至今沒有解決。那就是,按照節(jié)點數值查找,無法解決有相同節(jié)點的問題。如果有兩個節(jié)點,程序只會對第一個節(jié)點進行操作,會完全忽略掉。這樣使整個程序變得和不完整。因為幾乎所有的重要函數都用到了查詢函數。如果更改查詢函數,就會“牽一發(fā)而動全身”,整個程序各部分都要重新更改,由于時間關系我沒有做改動,這時本程序需要改進的地方。小結與體會這個程序是我獨立完成的第一個比較大的程序,當然對于那些真正的大程序來說,這個不爾爾。可是

32、對我來說不一樣,我真的用心在做。做的過程中遇到不少麻煩,也曾經止步不前,可是我最終還是把它成功編寫出來了,我覺得很有成就感。雖然程序中還有很多弊病在里面,說不上一個完善的程序,但它終究是我努力的結果。在編寫程序時,一邊寫就會一邊發(fā)現很多的問題。寫得時間越長,發(fā)現的問題也越來越多。一個個把問題解決掉真的很開心??墒俏矣X得,真正編寫程序不應該是這樣的。應該在寫程序之前,就把所有的問題想清楚。這樣可以給自己剩下大量的時間,而且程序看起來也會渾然一體,而不是“各自為戰(zhàn)”。這個程序還讓我感覺的,各個函數相互獨立的方式編輯函數很有優(yōu)越性。一個函數只負責而且可以獨立負責一個功能,就可以避免,函數之間相互調用

33、,把簡單的問題復雜化。這樣很容易找到問題發(fā)生的地方,并修改不必考慮對其他函數的影響。本人于2008年9月9號到2008年9月12日在計算機中心6號機房12號機器上嘗試完成了本次課程設計。但是由于時間關系,沒有能全部完成程序的編寫任務。課程設計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務五 學籍管理目的與意義在某大學的一個專業(yè),里面有四個班,每個班最多可以有40個學生。每個學生有學號、性別、籍貫等數據。在某個學期,他們開了高等數學一、英語一、線性數學、離散數學一、高等物理、思想品德教育、體育等8們課程,每門學分依次為3、3、2、2、2、1、2.。編制一個程序,

34、使用戶方便管理他們的學籍信息。需要輸出沒管的功能菜單。對于每個學生,可以進行基本情況的錄入、查詢、修改、刪除。還有學生成績的錄入,查詢,個人加權成績計算,修改等。還要完成班里加權成績的平均分計算和排名。要求所有的數據用文件形式存取。還要設置管理員的權限和密碼管理。任務分析根據我以前編寫鏈表程序的經驗,我想這次還是采取各個函數獨立完成一項功能,彼此不相互調用的形式完成這次編程任務。首先要建立一個菜單,菜單上顯示所有的功能,以便于用戶選擇相應的功能。但是美觀很難做到,因為我知道機房的gotoxy的函數是不能用的。我就決定先把真材實料的東西做完,至于美觀,在做完各個函數之后再去考慮。四個班的文件分開

35、存放的,也就是說分4個文件存放。這樣在執(zhí)行其他功能時,必須要用戶輸入要進行操作的班級,不過這樣省去了在一個文件中分出四個班的麻煩。錄入函數是一個比較重要的函數,因為所有的操作都是再文件的進行的,所以難度增加了不少。但是這是必須的,總不能輸入一次看一次。錄入函數中,肯定是用“w”形式打開文件,因為這里只有文件的寫入。我想這函數肯定要設計一個結構體的類型的。所以用fwrite函數成塊寫入文件是最恰當的。查詢個人信息函數中,文件用“r”,也就是只讀形式打開。當然是用fread函數成塊讀出文件信息,并對它進行操作。查詢至少要兩種查詢路線,也就是按姓名和按學號。這兩種都是常用的搜索,所以都要包括在內。查

36、詢班級信息函數,必須輸出班級的加權平均分。我決定在錄入函數中直接由程序算出學生的加權成績存儲起來。另外是班級排名,使用冒泡法排序代碼簡單,又容易實現。由于時間關系,刪除,修改和管理權限、密碼設置都沒有完成。數據結構設計這里的數據用結構體是毫無疑問的。我的數據類型定義為:typedef structchar xingming9;char xuehao11;char xingbie3;char jiguan9;float chengji9;xue;學號、姓名、性別、籍貫都用char,也就是字符串類型定義。單科成績共有8門,用float定義一個9個元素的數組,最后的用來存放學生的加權成績。我在程序里

37、還定義了一個結構體:typedef structchar xingming9;char xuehao11;float jiaquan;ss;這是在班級加權成績是用到的數據類型。因為在班級排名時,我們只關心學生的姓名、學號還有他的成績,所以我們只使用這三個元素,沒有必要在用原類型了。關鍵算法菜單函數只是一些輸入函數,用來提示用戶選擇相應的功能。由于沒有在美觀上下工夫,所以我的菜單函數十分簡單,只是一些輸出函數而已。信息的錄入函數如下:void luru()printf("您要錄入哪個班的成績?請輸入數字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("請輸入學生的基本信息,依次

39、輸入姓名,學號,性別,籍貫(省名),中間用空格擱開n");scanf("%s %s %s %s",&b.xingming,&b.xuehao,&b.xingbie,&b.jiguan);printf("請輸入此學生的成績(按照數學,英語,線形數學,離散數學,物理,品德,體育的順序),中間逗號擱開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,結束錄入請輸入2n");scanf("%d",&a);while(a=1);fclose(p);先打開或建立相應的文件,這里需要用戶輸

41、入要錄入的班級,以便把文件分開管理。打開成功后,開始請用戶錄入信息。信息先存放在一個變量里,然后在一個人的成績完全輸入完成后,直接算出學生的加權成績,全部存入變量。然后全部寫入文件。然后詢問用戶是否還要繼續(xù)輸入,用戶只要輸入相應指令,就可以繼續(xù)或結束輸入。查詢函數中包括了兩種查詢方式:學號查詢和姓名查詢。兩個部分大致相同,這里只介紹下其中之一:學號查詢.printf("請輸入學生的學號n");scanf("%s",&c);while(fread(&d,sizeof(d),1,p)!=0)if(strcmp(d.xuehao,c)=0)pr

42、intf("姓名,學號,性別,籍貫");printf("%s,%s,%s,%s",d.xingming,d.xuehao,d.xingming,d.jiguan);printf("高等數學一,英語一,線形數學,離散數學,高等物理,思想品德,體育,加權成績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("查詢結束,該班無此人信息n");先由用戶輸入學生的學號,然后開始讀取函數數據。函數數據存放在一個變量p中。用strcmp函數驗證是不是兩個字符串相同,相同的話就輸出這個學生的成績。后面有個if語句。當沒有找到這個學號時就會運行,顯示沒有找到。查詢班級成績,要函數比較麻煩。因為我把班級的排名也放在這里面,所以代碼有些長。但是有大部分跟查詢函數類似,下面是排名的函數: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+;用的是課本上說的冒泡排序法。當初只是知道了這種思想,自己寫出代碼后發(fā)現與課本上不是太一樣,不過功能相同,沒有什么差別。實現排名后,只要依次輸出各項數據就可以了。調試與運行調試運行的時候自然錯誤很多,我對他們做了更愛和補救。在編寫查詢函數時,發(fā)現一個問題到現在也沒有解決。那就是在獲取用戶要查找的學生信息時,用gets函數不行。不知道為什么,程序會自動跳過這一句,直接進行下面的語句。到現在也沒有弄明白這是為什么,我只好用scanf代替了gets。小結與體會程序因為時間關系沒有寫完,我很遺憾。本來指導老師告訴我,這

45、個程序太大,建議四人一組共同完成編程任務??墒俏覜]有聽,否則應該可以把它寫完的。今后不管是學習還是生活,都要重視團隊合作的力量。另外在編寫過程中發(fā)現,一些自認為很簡單的問題,自己寫起來總是出錯。可見古人所說的眼高手低還是有道理的。凡事尤其是編寫程序,切記不可在不動手的情況下,低估程序的難度。本人于2008年9月8號在計算機中心6號機房5號機器上完成了本次課程設計。課程設計過程中使用的操作系統(tǒng)是Windows 2000,主要開發(fā)平臺VC+ 6.0。任務四 黑白棋游戲、任務和意義設計一個程序完成黑白棋,兩人對弈。任務分析黑白棋的玩法大家都知道,而要實現一人與電腦對弈的模式牽扯到人工智能方面的知識,

46、遠在我的水平之外。所以只好編寫兩人對弈的模式。開始自己也想過很多,可是后來發(fā)現這些都是枉然。這個程序的難度完全超越了我目前的水平。所以把附錄上的程序敲入到電腦里。對這已經編好的程序看了好久,由于程序代碼太長,而我自己的水平又確實有限,只是看懂了部分代碼。關鍵算法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; /*有棋后改變分數*/ DoScore();/*輸出開始分數*/主函數只有函數的聲明,以及函數的調用。我認為自己編寫過得程序,主函數的已經非常的整齊,可是我不得不承認,我與真正的大使級變成大師確實還有很遠的一段距離。由于程序設計大量的顯示方面的函數,我完全沒有接觸過。看了好久也始終是一頭霧水。總覺得每個函數都不可

49、缺少,卻又不知道為什么。調試與運行原本老師說,這個程序可能村子幾個小錯誤??墒俏矣胐ebuge系統(tǒng)沒有檢查出錯誤,只是不能夠運行而已。找到了正確的運行環(huán)境,我是用了這個程序。用它跟同學對弈了一下,沒有發(fā)祥任何異?,F象,可以說沒有任何錯誤。小結與體會當我看著這份代碼為n行的程序時,大致有兩個感覺。一是感覺,這么長的代碼,寫他的人要多大的耐力;第二,肯定有很多錯誤??墒钱斖戆阉蛲辍⑦\行后,我不得不承認它一點錯誤都沒有。我完全被它折服了,其實是被編寫它的老師折服了。意識到自己究竟有多么渺小,水平到底有多么的粗淺。覺得自己路還有很長,可是我并不氣餒。因為我相信,終有一天,我也可以做這樣的程序出來,可

50、是這一天距離我還有好遠。雄關漫道真如鐵,而今邁步從頭越!附錄(各個程序)二分法:#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);矩陣求逆(未調試成功):#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("輸入矩陣數值n");int i=0,j=0;for(i=0;i<8;i+)for(j=0;j<8;j+)printf("輸入矩陣a%d%d數值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海波制作群預祝您身體健康,萬事如意!n如果您使用中發(fā)現BUG,請與我們聯系n");printf("電話QQ:279528056 聯系人:李海波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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論