第一篇:C語言實訓(xùn)報告
湖北汽車工業(yè)學(xué)院電氣與信息工程學(xué)院
《C語言程序設(shè)計》
實訓(xùn)報告
實訓(xùn)題目: 學(xué)生信息管理系統(tǒng)
專業(yè): 汽車電子工程專業(yè) 班級:
姓名: 成績:
一、需求分析
1、問題
根據(jù)需求,該系統(tǒng)所應(yīng)包含的信息有以下一些: 學(xué)生的基本信息:
學(xué)號,班級,姓名,年齡,出生日期。
根據(jù)需求,該系統(tǒng)所應(yīng)實現(xiàn)的功能有以下一些:
各種基本信息數(shù)據(jù)的錄入:a由鍵盤輸入學(xué)號,班級等基本信息。B由文件錄入學(xué)生信息。對學(xué)生信息的查詢:a按學(xué)號查詢指定學(xué)生信息。
b按班級查詢指定班級內(nèi)學(xué)生的信息。
學(xué)生基本信息數(shù)據(jù)的刪除:按學(xué)生學(xué)號來刪除指定學(xué)號的學(xué)生信息。學(xué)生基本信息的保存:將錄入的學(xué)生信息保存到文件中。
2、系統(tǒng)
采用C語言實現(xiàn),開發(fā)環(huán)境為VC,可以運行在操作系統(tǒng)windows98及以上皆可。
3、運行要求
能連續(xù)錄入任意個數(shù)學(xué)生的基本信息。
界面簡潔,操作方便,提示人性化,例如刪除前需要提示用戶是否刪除
容錯性強(qiáng),例如輸入的學(xué)生出生日期格式不對或日期不符合時提示輸入錯誤,并可重新輸入。
二、總體設(shè)計
1、系統(tǒng)流程設(shè)計
根據(jù)系統(tǒng)要求,設(shè)計如下的系統(tǒng)流程
菜單顯示用戶輸入操作判斷用戶選擇的操作執(zhí)行相應(yīng)的操作退出
+
2、系統(tǒng)模塊設(shè)計
根據(jù)系統(tǒng)的功能設(shè)計,如下模塊
學(xué)生信息管理系統(tǒng)主界面顯示功能選擇鍵盤輸入學(xué)生信息文件錄入學(xué)生信息按學(xué)號查學(xué)生信息按班級查學(xué)生信息刪除指定學(xué)號信息保存學(xué)生信息
主界面模塊:完成系統(tǒng)菜單的顯示
功能選擇模塊:根據(jù)用戶的選擇,完成其相應(yīng)的功能
鍵盤輸入學(xué)生信息:從鍵盤輸入任意個數(shù)學(xué)生的基本信息,并保存到結(jié)構(gòu)體鏈表中。
文件錄入學(xué)生信息:從指定的文件中錄入學(xué)生的基本信息,并保存到結(jié)構(gòu)體鏈表中。
按學(xué)號查學(xué)生信息:輸入要查找的學(xué)生的學(xué)號,可查詢并顯示該學(xué)號對應(yīng)學(xué)生的基本信息。
按班級查學(xué)生信息:輸入要查找的班級,可查詢并顯示該班級內(nèi)學(xué)生的基本信息。
刪除指定學(xué)號信息:輸入要刪除的學(xué)生的學(xué)號,可找到并顯示該學(xué)號對應(yīng)學(xué)生的信息并刪除其信息。
保存學(xué)生信息:可將已錄入的學(xué)生信息保存到指定的文件中。
三、詳細(xì)設(shè)計
1、數(shù)據(jù)結(jié)構(gòu)設(shè)計
根據(jù)系統(tǒng)要求,系統(tǒng)中需要保存的數(shù)據(jù)有通訊錄的信息,其結(jié)構(gòu)如下: 數(shù)據(jù)項 數(shù)據(jù)項名稱 數(shù)據(jù)類型 數(shù)據(jù)長度 備注 學(xué)號 xh_number 整形變量 2 班級 bj_number 整形變量 2 姓名 name 字符串變量 20 年齡 nl_number 整形變量 2
指向日期結(jié)構(gòu)指向日期結(jié)構(gòu)體類型的指針體的指針 born_day*q 變量
應(yīng)題目要求另加一個存放日期的結(jié)構(gòu)體: 數(shù)據(jù)項 數(shù)據(jù)項名稱 數(shù)據(jù)類型 數(shù)據(jù)長度 備注 年份 y 整形變量 2 月份 m 整形變量 2 號 d 整形變量 2
為了能實現(xiàn)可連續(xù)輸入任意個數(shù)的學(xué)生信息,我采用鏈表的結(jié)構(gòu)保存學(xué)生的基本信息,在增加學(xué)生的基本信息時,創(chuàng)建一個學(xué)生信息的節(jié)點,將其插入到鏈表中,示意圖如下。
學(xué)生基本信息1學(xué)生基本信息2學(xué)生基本信息3學(xué)生基本信息4
使用C語言創(chuàng)建的結(jié)構(gòu)體如下: struct student { int xh_number;學(xué)號 int bj_number;班級 char name[20];姓名 int nl_number;年齡
struct born_day*q;指向日期結(jié)構(gòu)體類型的指針
struct student *next;指向?qū)W生信息結(jié)構(gòu)體類型的指針 };
2、界面設(shè)計 主界面:
根據(jù)系統(tǒng)要求,設(shè)計一個字符界面,顯示系統(tǒng)的菜單,為了體現(xiàn)友好性,將在每個菜單前顯示該菜單項對應(yīng)的數(shù)字
用戶輸入菜單項前面的數(shù)字,主菜單消失,進(jìn)入該模塊的相應(yīng)界面,進(jìn)行相應(yīng)的操作,完成后,回到主界面。
輸入界面:
a通過鍵盤輸入錄入學(xué)生信息:
根據(jù)提示語句可連續(xù)輸入多個學(xué)生的學(xué)生信息
b通過文件錄入學(xué)生信息:
查詢界面: a按學(xué)號查詢:
b按班級查詢:
刪除界面:
輸入要刪除的學(xué)生的學(xué)號,確認(rèn)刪除收即可刪除.導(dǎo)出界面:
3、模塊實現(xiàn)
主界面實現(xiàn):調(diào)用printf()函數(shù),在屏幕上打印需要顯示的字符信息,需要在顯示之前調(diào)用system(“cls”)函數(shù)將前面的界面清空。
對應(yīng)的實現(xiàn)函數(shù)ml();功能選擇模塊實現(xiàn):
接受從鍵盤輸入的菜單選擇,判斷并調(diào)用相應(yīng)的功能函數(shù),完成其對應(yīng)的功能。實現(xiàn)功能選擇。
對應(yīng)的語句:switch();學(xué)生信息錄入模塊實現(xiàn):
模塊說明:從鍵盤接收輸入的學(xué)生信息,在動態(tài)存儲區(qū)中創(chuàng)建學(xué)生信息的節(jié)點,遍歷鏈表,將其插入到學(xué)生信息鏈表的最后位置。
模塊流程:
清屏遍歷鏈表找到最后一個節(jié)點創(chuàng)建一個新節(jié)點從鍵盤給新節(jié)點賦值將新節(jié)點連接到鏈表的最后一個節(jié)點上 對應(yīng)函數(shù):struct student *creat()
學(xué)生信息導(dǎo)入模塊實現(xiàn):
模塊說明:進(jìn)入功能后先對屏幕清屏,再從鍵盤輸入要導(dǎo)入的文件名,及要錄入的學(xué)生的個數(shù)。根據(jù)學(xué)生個數(shù)創(chuàng)建含有對應(yīng)個學(xué)生信息結(jié)構(gòu)體的鏈表。判斷打開文件是否成功,從文件中依次將學(xué)生信息錄入到鏈表中的對應(yīng)結(jié)構(gòu)體內(nèi),錄入完畢后,判斷文件是否關(guān)閉成功,模塊結(jié)束。
模塊流程:
清屏輸入導(dǎo)入的文件名和要記錄學(xué)生的個數(shù)建立含有相應(yīng)個數(shù)結(jié)構(gòu)體的鏈表判斷鏈表是否結(jié)束從文件讀入學(xué)生信息錄入到結(jié)構(gòu)體移動指針到下一結(jié)構(gòu)體顯示文件錄入成功
對應(yīng)函數(shù):struct student *duru()學(xué)生信息按學(xué)號與按班級查詢模塊實現(xiàn):
模塊說明:先清屏,然后輸入要查詢的學(xué)生的學(xué)號或班級,建立一個指針從學(xué)生信息鏈表的首地址看是逐個判斷其結(jié)構(gòu)體內(nèi)的學(xué)生學(xué)號或班級是否相等,如果相等就顯示并跳出循環(huán)。如果循環(huán)到最后都沒有相等的就顯示沒有此學(xué)號或班級的學(xué)生信息,并結(jié)束功能。
模塊流程 輸入要查詢的學(xué)號或班級判斷循環(huán)是否結(jié)束否如果本結(jié)構(gòu)體內(nèi)學(xué)號與要查詢的一樣就顯示器信息并將-1賦給num同時跳出循環(huán)不一樣就移動指針到下一個結(jié)構(gòu)體是判斷num是不是-1否顯示此學(xué)號或班級無對應(yīng)的學(xué)生信息是顯示查詢功能結(jié)束
對應(yīng)函數(shù):xhcx(struct student *p)和bjcx(struct student *p)
學(xué)生信息刪除模塊實現(xiàn):
模塊說明:先清屏,然后輸入要刪除的學(xué)生學(xué)號,循環(huán)判斷鏈表中的結(jié)構(gòu)體是否為要刪除的學(xué)生信息結(jié)構(gòu)體,如果是就提示是否刪除,若要刪除就將此結(jié)構(gòu)體的前一個和后一個結(jié)構(gòu)體連接起來,然后對出功能。
模塊流程: 輸入要刪除的學(xué)號判斷循環(huán)是否結(jié)束否判斷是否是要刪除的結(jié)構(gòu)體是提問是否刪除是將前一結(jié)構(gòu)體與后一結(jié)構(gòu)體連接,并且令x為-1否否是移動指針到下一個結(jié)構(gòu)體令x為-2,并跳出循環(huán)判斷x是否大于零是顯示次學(xué)號無對應(yīng)的學(xué)生信息是判斷x是不是-1是刪除成功,并退出功能否不進(jìn)行刪除,并退出功能 對應(yīng)函數(shù):delete(struct phone * head)通訊錄信息導(dǎo)出模塊實現(xiàn):
模塊說明:先清屏,然后打開一個文件,并且令文件指針指向此文件,進(jìn)行循環(huán)依次將結(jié)構(gòu)體里的信息輸入到文件中,最后關(guān)閉文件,并對出功能。
模塊流程:
創(chuàng)建文件指針判斷打開文件是否成功否關(guān)閉程序是判斷循環(huán)是否結(jié)束否將指針?biāo)傅慕Y(jié)構(gòu)信息體輸入到文件中是將指針移動到下一個結(jié)構(gòu)體保存文件并退出功能
對應(yīng)函數(shù):save(struct student *p)
四、測試結(jié)果
1、輸入學(xué)生信息測試
測試數(shù)據(jù):
輸入 001 1 王天祺 19 1992-03-05
測試結(jié)果: 程序運行出現(xiàn)錯誤
原因 sanf()中沒有加取址符&。經(jīng)過修改再次輸入數(shù)據(jù) 運行成功,結(jié)果:
2、從文件錄入測試 已知有一文件:
又將此文件內(nèi)的信息錄入到系統(tǒng)中 測試結(jié)果:
3、查詢學(xué)生信息測試
測試數(shù)據(jù):在系統(tǒng)中存在一個學(xué)號為001的學(xué)生。
測試成功,結(jié)果:
此為按學(xué)號查詢
此為按班級查詢
4、刪除測試
測試數(shù)據(jù):已有三個數(shù)據(jù):001 1 wtq 19 1992-03-05
002 2 zdy 19 1991-02-19
003 1 sdf 20 1992-01-12 刪除學(xué)號為2的學(xué)生信息 測試結(jié)果:
5保存學(xué)生信息的測試:
測試數(shù)據(jù):將測試4中刪除后的學(xué)生信息保存起來: 測試結(jié)果:
此為保存的文件內(nèi)容。
五、實訓(xùn)總結(jié)
實訓(xùn)感想
對系統(tǒng)開發(fā)的總結(jié)(設(shè)計亮點,存在的不足,需要改進(jìn)的地方)
本學(xué)生信息管理系統(tǒng)程序的編輯的整體思路并不復(fù)雜,主要就是通過建立由儲存有學(xué)生基本信息的結(jié)構(gòu)體構(gòu)成的鏈表以及對鏈表的一些技術(shù)運用,來達(dá)到
1.各種基本信息數(shù)據(jù)的錄入如:a由鍵盤輸入學(xué)號,班級等基本信息。b由文件錄入學(xué)生信息。2.對學(xué)生信息的查詢:a按學(xué)號查詢指定學(xué)生信息。
b按班級查詢指定班級內(nèi)學(xué)生的信息。
3.學(xué)生基本信息數(shù)據(jù)的刪除:按學(xué)生學(xué)號來刪除指定學(xué)號的學(xué)生信息。4.學(xué)生基本信息的保存:將錄入的學(xué)生信息保存到文件中。等功能的實現(xiàn)的目的。
在此次的編程過程,我對c語言的程序設(shè)計有了更深的理解,在設(shè)計的程序中有我自己的設(shè)計亮點,也有存在的不足,以及需要改進(jìn)的地方。
例如在學(xué)生信息的錄入功能的編程過程中,就有一個要求是要能夠判斷所輸入的學(xué)生出生日期的格式以及日期是否符合要求。在做到這一點的功能的時候,我花了很多的時間,首先是定義了一個全局的字符數(shù)組變量用來以字符的形式存放輸入的日期,然后通過一個函數(shù)來講起對應(yīng)的年份、月份、號等信息從字符變量轉(zhuǎn)換成了整形變量,以便對其日期進(jìn)行檢測。通過判斷其是否為閏年,二月是否有29天,2、4、6、9、11月份是否在30天以內(nèi)等等來判斷其日期是否符合要求。最后把通過的日期以整形的形式保存到一個日期結(jié)構(gòu)體中,再把結(jié)構(gòu)體連接到每一個學(xué)生信息結(jié)構(gòu)體中。以這種方式來達(dá)到判斷日期的目的。而且我并沒有把學(xué)生出生日期的信息直接存放到學(xué)生信息的大結(jié)構(gòu)體中,而是又另建立了一個專門存放日期的結(jié)構(gòu)體數(shù)組,并將存放日期信息的結(jié)構(gòu)體數(shù)組中的結(jié)構(gòu)體變量分別連接到了存放學(xué)生信息的大結(jié)構(gòu)體中,用一個指向存放日期的結(jié)構(gòu)體類型的指針來接收。這樣,學(xué)生的出生日期的信息就可以和每一個學(xué)生的其他信息聯(lián)系到一起。這些是我設(shè)計的程序當(dāng)中的亮點。
當(dāng)然也有一些不足之處,在整個系統(tǒng)運行的過程中,存在著一個很大的問題,那就是,輸入學(xué)生信息的時候只能一次性的輸入,而不能間斷的,回到菜單后在此進(jìn)入然后接著上次的學(xué)生信息再次往下輸入,從文件中錄入學(xué)生信息也是一樣,不能間斷的從文件中錄入,而且從文件錄入學(xué)生信息時也要提前輸入要從文件中錄入學(xué)生信息的學(xué)生個數(shù),而不能自動的檢測文件中就多少個學(xué)生的信息。同時被錄入學(xué)生信息的文件的文件名以及地址都是定死的,不能從鍵盤輸入,雖然調(diào)試過很多次,但還是無法解決這一問題。這些也都是需要我在以后的時間里去慢慢改進(jìn),慢慢體會的地方。
總之,此次的c語言程序設(shè)計課設(shè)讓我看到了我設(shè)計c語言程序的亮點與不足之處,對于我的亮點,我需要保留并繼續(xù)下去。而對于我的不足之處,我會花時間去理解,彌補(bǔ),去完善。雖然此處程序并不是非常簡潔,但是確是我自己設(shè)計出來的,相信有了這一次設(shè)計的經(jīng)歷,以后對其它程序的設(shè)計我會更加的得心應(yīng)手。
六、附錄 程序源代碼
/*
1、學(xué)生信息管理 問題描述:
已知程序要求管理的學(xué)生信息包括:學(xué)號(不重復(fù)),班級,姓名,年齡,性別,出生日期,地址,電話,E-mail等。設(shè)計一程序,完成以下功能: 1)能從鍵盤輸入學(xué)生的信息(增加,輸入時需要能檢查該學(xué)號的學(xué)生的記錄是否已經(jīng)存在,出生日期格式是否合法(格式為:YYYY-MM-DD,如2009-01-02))2)能從指定的文件中讀入學(xué)生的信息 3)能按學(xué)號查詢學(xué)生的信息 4)能按班級查詢學(xué)生信息
5)能刪除指定學(xué)號的學(xué)生信息 6)能將學(xué)生信息保存在指定的文件中 提示:
從文件讀入學(xué)生信息時,需要先設(shè)計好文件的格式,從文件中讀取數(shù)據(jù)后,按照預(yù)先設(shè)計的格式分析數(shù)據(jù),提取學(xué)生的信息,讀入程序
定義一個日期結(jié)構(gòu)體保存日期,具體信息為:年、月、日
判斷出生日期的格式是否合法時,需要判斷長度是否為10,第5位和第8位是否為'-',字符,將1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分別轉(zhuǎn)換成整數(shù)。判斷是否滿足構(gòu)成日期的條件閏年月份只能是1-12之間的數(shù),如果是閏年,二月可以是29天否則不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建議寫成函數(shù))。*/
#include