版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、c語言課程設計實習報告班 級:地質11102學生姓名:商博文 學 號: 01 指導老師:何老師/陳老師/龍日 期: 2013.3.7目 錄一、程序分析與設計1二、流程圖2三、源程序清單9四、 調試過程17五、 程序有待改進的地方18六、本次實習的收獲和建議18附錄18c語言課程設計實習報告一、程序分析與設計1、一開始拿到這個程序我感覺到它的流程特別清晰,各個功能項之間聯(lián)系并不十分密切,所以各異很容易的分成許多不同的部分分別以獨立的函數(shù)體進行書寫和編輯。2、確定每一項要求寫成一個或者分成多個函數(shù)體進行書寫。并按照要求的先后順序確定函數(shù)體的排列次序,將最想被調用與被調用次數(shù)最多的函數(shù)體放在最前面,
2、一邊用最簡潔的方式書寫程序,盡量少的進行函數(shù)聲明。3、在確定了函數(shù)名稱后,先將函數(shù)名稱記錄下來,并確定其功能總計有read(),output(),average(),allaverage(),rrank(),fenshuduan(),nopass(),chengjitiao(),menu(),youdengsheng()等十組函數(shù)。4、確定需要調用的庫函數(shù)并進行聲明,設定全局變量size為學生人數(shù)。5、清晰的書寫學生結構體和課程結構體stusize,明確結構體重每一個變量的類型和長度。6、首先書寫讀入輸出函數(shù)read(),將所需數(shù)據按照課程結構體的標準進行讀入用文件格式fscanf。7、寫出函
3、數(shù)向所需數(shù)據的列表進行寫出。8、寫出求學生平均成績的函數(shù)average()并求出學生平均成績三個相加除三取整。9、寫出求各科平均成績的函數(shù)allaverage()并求出各科平均成績學生人數(shù)個相加除學生人數(shù)取整。10、排名函數(shù)rrank(),用抽排法寫出排序并用文件類型輸出。11、分數(shù)段函數(shù)fenshuduan()寫出不同的分數(shù)段并運用數(shù)組寄存每個分數(shù)段的人數(shù)并用兩種方式寫出。12、判斷出不及格的人nopass()并輸出他/她們的學號,姓名,課程名稱,成績等信息。13、運用比較與循環(huán)寫出查詢學生信息的函數(shù)chengjitiao()。14、寫出菜單的輸出函數(shù)menu()。15、運用邏輯運算符寫出優(yōu)
4、等生的求取函數(shù)youdengsheng()。16、寫退出函數(shù)。17、寫出主函數(shù)并且用case語句進行判斷執(zhí)行主函數(shù)的各個功能。18、整個過程中,平均數(shù),學生信息,平均分查詢用文件類型的輸出。二、流程圖main函數(shù)函數(shù)圖主體如果輸入1則運行學生信息設置的函數(shù)如果輸入2則運行求個人平均分的函數(shù)如果輸入3則平均分數(shù)段函數(shù)如果輸入4運行不及格函數(shù)如果輸入0結束read()函數(shù) 此段為讀入函數(shù)的流程圖運用指針讀入文件中的數(shù)據如果指針為空輸出無法打開output函數(shù)此段為寫出文件函數(shù)用指針指向文件夾寫出如果指向空則輸出無法打開average()函數(shù)此段為求每個學生平均成績的函數(shù)現(xiàn)將每個學生的三科成績相加再
5、將所得數(shù)據除以3得到平均分allaverage()函數(shù)此段為求各科平均成績的函數(shù)現(xiàn)將每門課的所有學生得分相加再除以學生人數(shù)最后得到每科總平均分rrank()排名的函數(shù)先運用抽排法確定每一個學生的排名將排名組合到結構體再將包涵排名信息的所有學生信息進行輸出fenshuduan()分數(shù)段函數(shù)將每個學生的每項成績進行判斷然后將學生的成績分別計數(shù)分別統(tǒng)計出來沒想科目每個分數(shù)段的學生人數(shù)用文件類型進行輸入輸出nopass()不及格人數(shù)統(tǒng)計的函數(shù)先求出不及格的成績并記錄該學生的各項信息對各項信息進行輸出chengjitiao()輸出學生的成績條menu()打印主菜單youdengsheng()學生成績查詢
6、的函數(shù)按照課程要求進行邏輯用語的編寫輸出優(yōu)等生的個人信息三、源程序清單#include#include/標準函數(shù)庫調用#define size 40/班里學生40個int english5,c5,math5; /5保留小數(shù)點一位 float englishave;/此變量算英語成績平均分float cave;/計算機float mathave;/數(shù)學struct student/學生結構體char name10;/存放姓名int num;/學號int score3;/學分float ave;/平均分int rank;/排名studsize;/結構體有40個struct course/課程設置結
7、構體char cname20;/存放課程名稱20表示課程名稱最長有20個字節(jié)cur3=大學英語,c語言設計,高等數(shù)學;/分別賦初值為課程的名稱int cour35=0;/后面分段計數(shù)的時候分了5個分數(shù)段共有三門課賦初值為零/讀文件函數(shù)void read()file *fp;/文件型指針變量如果存放地址為空則輸出cant open file!并退出if (fp = fopen(e:stud1.txt,r)=null)printf(cant open file!n);exit(0);for(int i=0;isize;i+)/從0到40讀入每個學生的信息fscanf(fp,%d%s%d%d%d%d
8、,&studi.num,,&studi.score0,&studi.score1,&studi.score2,&studi.score3); /從文件讀取信息 fclose(fp);/寫出文件函數(shù)void output() file *fp;/文件型指針變量if (fp = fopen(e:stud1.txt,r) = null)printf(cant open file!n);exit(0);printf(t 學生原始成績n); printf(| 學號 | 姓名 |英語|c語言|高數(shù)|n);for(int i=0;isize;i+) fscanf(fp,%d%s%d%d%
9、d,&studi.num,,&studi.score0,&studi.score1,&studi.score2); /從文件讀取信息 printf(%6d%12s%6d%6d%6dn,studi.num,,studi.score0,studi.score1 ,studi.score2,studi.score3);/從程序輸出到文件里/求學生平均成績函數(shù)void average()int i,j,sum;for(i=0;isize;i+)/從0到39循環(huán) sum=0;for(j=0;j3;j+)/從第一門課到第三門課循環(huán)sum+=studi.scorej;
10、/每門課的成績相加studi.ave=(int)(sum)/3;/八三門課的成績除以3的平均分/求各科的平均成績函數(shù)void allaverage() int i;englishave=0;cave=0;mathave=0;for(i=0;isize;i+) /循環(huán)人數(shù)mathave+=studi.score0;/所有人數(shù)學課成績相加englishave=(englishave+studi.score1); /英語cave=(cave+studi.score2);/計算機englishave=englishave/size;/除以人數(shù)得到平均分mathave=mathave/size;cave
11、=cave/size;/排名函數(shù)void rrank() int i,j; for(i=0;isize;i+) studi.rank=1;/抽排法for(i=0;isize;i+) studi.rank=1;for(j=0;jsize;j+) if(studi.avestudj.ave) studi.rank+;/排名if(studi+1.rank=studi.rank)studi+2.rank+; /如果.相等再加一個 file *fp;if(fp = fopen(e:stu2.txt,w) = null)printf(cant open the file);return;fprintf(f
12、p,tttt學生成績綜合成績n);fprintf(fp,序號tt姓名t高數(shù)t英語t計基t平均成績t名次n);for(i=0;isize;i+)fprintf(fp,%dt%st%dt%dt%dt%15.2ft%5dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);fclose(fp);/求取個分數(shù)段人數(shù)void fenshuduan()void allaverage();allaverage();int i,j;printf(tt各科分數(shù)段及各科平均成績n);for(i=0;i
13、size;i+)for(j=0;j=90)courj4+;/如果該門課該學生成績大于90則該門課改分數(shù)段人數(shù)加一else if(studi.scorej=80)courj3+;else if(studi.scorej=70)courj2+;else if(studi.scorej=60)courj1+;else courj0+;printf(分數(shù)段t高數(shù)t英語t計基n);printf(60 t%dt%dt%dn,cour00,cour10,cour20);printf(6069 t%dt%dt%dn,cour01,cour11,cour21);printf(7079 t%dt%dt%dn,co
14、ur02,cour12,cour22);printf(8089 t%dt%dt%dn,cour03,cour13,cour23);printf(90100t%dt%dt%dn,cour04,cour14,cour24);printf(平均成績t%4.1ft%4.1ft%4.1fn,mathave,englishave,cave);file *fp;if(null=(fp=fopen(e:stu3.txt,w)printf(cannot open the file);return;fprintf(fp,ttt分數(shù)段及平均分n);fprintf(fp,n);fprintf(fp,分數(shù)段t高數(shù)t大英
15、t計基n);/反斜杠t表示tab反斜杠n表示換行%d表示十進制整數(shù)輸出%f表示十進制實數(shù)輸出%s表示字符串類型輸出f前面的4.1表示共四位數(shù)其中有一位小數(shù)fprintf(fp,60 t%dt%dt%dn,cour00,cour10,cour20);fprintf(fp,6069 t%dt%dt%dn,cour01,cour11,cour21);fprintf(fp,7079 t%dt%dt%dn,cour02,cour12,cour22);fprintf(fp,8089 t%dt%dt%dn,cour03,cour13,cour23);fprintf(fp,90100t%dt%dt%dn,co
16、ur04,cour14,cour24);fprintf(fp,平均成績%4.1ft%4.1ft%4.1ftn,mathave,englishave,cave);fclose(fp);/不及格學生信息函數(shù)void nopass()int i,j;printf(t不及格學生名單n);printf(t學號tt姓名tt不及格課程tt不及格分數(shù)n);for(i=0;isize;i+) for(j=0;j3;j+)if(studi.scorej60)/如果該人該門課分數(shù)低于60則輸出一下信息printf(t%5d %10stt%10stt %dn,studi.num,,a
17、me,studi.scorej);/查詢學生信息函數(shù)void chengjitiao() int i,n;printf(請輸入學號:);scanf(%d,&n);/一個整數(shù)讀入for(i=0;isize;i+)if(n=studi.num)printf(ttt學生成績條n);printf(學號t 姓名t 高數(shù)t英語t計基t平均分t名次n);printf(%dt%st %dt%dt%dt%4.1ft%dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);break;else con
18、tinue;/程序菜單函數(shù)void menu()printf(- welcome -n);printf(n);printf(*n);printf( 輸入1 輸出 學生信息設置 n);printf( 輸入2 輸出 求個人平均分并排名及查詢 n);printf( 輸入3 輸出 求平均分并分段 n);printf( 輸入4 輸出 不及格學生成績 n);printf( 輸入5 輸出 優(yōu)等生名單 n);printf( 輸入0 退出程序 n);printf(*n);/求取優(yōu)等生人數(shù)及信息void youdengsheng() average();rrank();int i;printf(t優(yōu)等生名單n);
19、printf( 學號 tt姓名t高數(shù) 英語 計基 平均成績 名次n);for(i=0;i90|(studi.ave85&(studi.score0=100)|(studi.score1=100)|(studi.score2=100)|(studi.ave85&(studi.score0&studi.score195)|(studi.score0&studi.score295)|(studi.score195)&(studi.score295)&(studi.rank60)&(studi.score160)&(studi.score260)printf(%4dt%6s %d %d %d%10.2
20、f %dn,studi.num,,studi.score0,studi.score1,studi.score2,studi.ave,studi.rank);/主函數(shù)void main() int i;read();output(); while(1)menu();printf(請按照菜單進行操作n);scanf(%d,&i);switch(i)case 1:output();break;case 2:average();rrank();chengjitiao();break;case 3:allaverage();fenshuduan();break;case 4:nopa
21、ss();break; case 5:youdengsheng();break;case 0:goto kill;/exit(0);default:printf(error);kill:printf(您已成功退出程序); 4、 調試過程由于文件類型輸入輸出最后寫入,所以我的程序全部寫完才開始調試,用了逐條注釋的方法,配合程序暫停的方式。起初注釋掉部分函數(shù)后,發(fā)現(xiàn)的主要錯誤是“;”“”的缺失。后來利用程序暫停檢查出一些排序算法上的錯誤。冒泡排序的部分賦初值有問題。在程序運行的過程中還出現(xiàn)了血多奇怪的數(shù)據,發(fā)現(xiàn)是數(shù)據定義和引用的過程中個別的數(shù)據類型和乘除的時候常數(shù)書寫方式的問題。輸出問題讓我發(fā)現(xiàn)了
22、許多“printf”和“fprintf”的問題包括/f,%8,/n,/d等等問題導致的不對齊,數(shù)據類型混亂,與數(shù)據不對應導致的超額輸出。運行輸出數(shù)據錯誤讓我發(fā)現(xiàn)了部分函數(shù)的排放規(guī)則問題。除此之外,還發(fā)現(xiàn)vb編譯器的一些特殊情況我發(fā)準確識別的小bug,如輸入文件的文件名中包涵特殊字符有可能會導致編譯器讀入錯誤。個人在調試程序的時候發(fā)現(xiàn)程序的編譯構成中最易出錯的是循環(huán)語句,排序部分,嘗嘗把循環(huán)的結構搞錯,尤其是抽排序和冒泡排序容易搞混。其次最容易出現(xiàn)的是輸出亂碼,主要是輸出的不匹配。再次就是goto語句在書寫的時候要注意共同的語法。無條件跳出的運用。最后在進行梳理程序的時候發(fā)現(xiàn)了許多用不到的設置和
23、功能進行了清理。再梳理過程中調整了個別函數(shù)功能和輸出的順序。5、 程序有待改進的地方某些函數(shù)在特定情況下依然存在bug。比如2功能求平均分并分段在反復運行的情況下有極大可能出現(xiàn)數(shù)據加倍的情況。輸出依然不夠漂亮,部分函數(shù)體寫得不夠簡潔優(yōu)化清晰。以排序為例,在程序混亂的情況下最有排序方式應當是快速排序,但是為了方便書寫我使用的是冒泡排序,在亂序情況下快速排序(選擇排序)比冒泡排序的理論效率要高很多。把某些必要的引用內容寫在了output函數(shù)里有待考慮同一名同學掛掉了多門課程應該在nopass函數(shù)里添加一個學位警示并記錄學生掛掉的學分及課程,單獨列出一個表。輸出部分要是能做成“.xls”格式的輸入輸
24、出效果一定會好得多。六、本次實習的收獲和建議本次實習收獲很多,主要由以下幾方面。1、 c語言的熟悉程度有了很大的提升。學習了結構體和對文件的輸入和輸出等方面內容。鞏固了以前所學習的選擇結構、循環(huán)結構、指針等知識。2、 了解了很多的調試程序的手段和方法。如程序暫停呵f10一步步運算看參考數(shù)組值。3、 對于程序的運行和構思更加縝密。尤其是在調試的過程中,愈發(fā)的感覺到了權后連貫在一起的全局考慮程序的重要性。4、 培養(yǎng)了細心和耐心的好習慣。5、了解了goto語句的書寫和運用。附錄1、 原始數(shù)據stu1.dat學號 姓名高數(shù) 英語 計基200602222陳果886086200602230丁偉周70596
25、5200602208范勝966590200602239侯聰917787200602244黃蕾926987200602205黃在豹905555200602219李金635360200604845郝妍879295200604846胡金元878897200602231李生鵬863653200602207李志勇845282200602240劉靜828990200602243劉蘭926393200602228劉書松604056200602203劉召807392200602229劉志明815675200602217羅中836982200602210馬俊鋒896983200602223毛春球81717220
26、0602242裴海勤927082200602233全妮878196200602224邵遠846584200602236孫曉瓊937890200602212田松845475200602215王偉967790200602225吳偉975648200602206夏沖655571200602226謝武濤735761200602221熊勇718284200602211徐揚927685200602209徐朕786375200605012余鳳998082200602218楊成坤967488200602216葉太郎876769200602232翟英賀655756200602235張翅806167200602204張浩846762200602227張亮857356200602213趙華平997288200602241周燕9763872、生成文件stu2.dat 學生成績綜合成績序號姓名高數(shù)英語計基平均成績名次200602222陳果88608676.520200602230丁偉周70596568.735200602208范勝96659081.413200602239侯聰91778784.54200602244黃蕾92698780.2172
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《寄生蟲學檢驗》課件-蚤
- 2025年涂料工程環(huán)保驗收報告合同3篇
- 二零二五版電視劇導演劇本改編及版權授權合同2篇
- 二零二五版商業(yè)地產租賃押金退還及管理細則合同3篇
- 2025年度汽車行業(yè)勞動合同范本(汽車版)2篇
- 二零二五年度餐廳桌椅智能控制系統(tǒng)集成采購協(xié)議3篇
- 2025版煤礦安全生產設施改造工程承包合同4篇
- 二零二五年度股權轉讓合同:商業(yè)中心整棟樓物業(yè)交易2篇
- 2025年物業(yè)企業(yè)園林景觀維護合同范本3篇
- 二零二五版抵債協(xié)議書(債權回購)專業(yè)服務3篇
- 上海紐約大學自主招生面試試題綜合素質答案技巧
- 辦公家具項目實施方案、供貨方案
- 2022年物流服務師職業(yè)技能競賽理論題庫(含答案)
- ?;钒踩僮饕?guī)程
- 連鎖遺傳和遺傳作圖
- DB63∕T 1885-2020 青海省城鎮(zhèn)老舊小區(qū)綜合改造技術規(guī)程
- 高邊坡施工危險源辨識及分析
- 中海地產設計管理程序
- 簡譜視唱15942
- 《城鎮(zhèn)燃氣設施運行、維護和搶修安全技術規(guī)程》(CJJ51-2006)
- 項目付款審核流程(visio流程圖)
評論
0/150
提交評論