c語(yǔ)言課程設(shè)計(jì)之圖書管理系統(tǒng)_第1頁(yè)
c語(yǔ)言課程設(shè)計(jì)之圖書管理系統(tǒng)_第2頁(yè)
c語(yǔ)言課程設(shè)計(jì)之圖書管理系統(tǒng)_第3頁(yè)
c語(yǔ)言課程設(shè)計(jì)之圖書管理系統(tǒng)_第4頁(yè)
c語(yǔ)言課程設(shè)計(jì)之圖書管理系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、成績(jī)成績(jī)南京工程學(xué)院課程設(shè)計(jì)說明書(論文)題 目 商品庫(kù)存管理系統(tǒng) 課 程 名 稱 高級(jí)語(yǔ)言程序設(shè)計(jì)(C) 院(系、部、中心) 通信工程 專 業(yè) 多媒體通信 班 級(jí) 媒通111 學(xué) 生 姓 名 張瑜 學(xué) 號(hào) 208110515 設(shè) 計(jì) 地 點(diǎn) 信息樓C216 指 導(dǎo) 教 師 袁璟 設(shè)計(jì)起止時(shí)間:2012年3月5日至2012年3月9日目 錄 TOC o 1-3 h z u HYPERLINK l _Toc185649679 1課程設(shè)計(jì)題目 PAGEREF _Toc185649679 h 1 HYPERLINK l _Toc185649680 2軟件功能描述 PAGEREF _Toc1856496

2、80 h 1 HYPERLINK l _Toc185649681 3軟件總體設(shè)計(jì) PAGEREF _Toc185649681 h 2 HYPERLINK l _Toc185649682 31數(shù)據(jù)結(jié)構(gòu)描述與定義 PAGEREF _Toc185649682 h 2 HYPERLINK l _Toc185649683 32模塊設(shè)計(jì) PAGEREF _Toc185649683 h 2 HYPERLINK l _Toc185649684 4測(cè)試結(jié)果與分析 PAGEREF _Toc185649684 h 3 HYPERLINK l _Toc185649685 5課程設(shè)計(jì)總結(jié) PAGEREF _Toc185

3、649685 h 3 HYPERLINK l _Toc185649686 附錄:源程序清單 PAGEREF _Toc185649686 h 41課程設(shè)計(jì)題目商品庫(kù)存管理系統(tǒng)要求:設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu) 實(shí)現(xiàn)商品的入庫(kù),出庫(kù),查詢等功能,讀/寫文件功能整個(gè)系統(tǒng)均用C語(yǔ)言實(shí)現(xiàn);可以利用數(shù)組、指針、鏈表來實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì);管理系統(tǒng)具有輸入、顯示、查詢、刪除、排序、插入、保存、讀取等基本功能;系統(tǒng)的各個(gè)功能模塊都用函數(shù)的形式來表示;可以將信息保存在文件中;可以將信息從文件中讀取出來。2軟件功能描述商品庫(kù)存管理系統(tǒng)軟件為人們提供了一個(gè)對(duì)商品價(jià)格信息了解,對(duì)商品的錄入錄出功能的使用提供了一個(gè)很好的平臺(tái)。并給人們友好

4、的操作界面,功能需求描述如下:提供系統(tǒng)主控平臺(tái):人們進(jìn)入系統(tǒng)主控平臺(tái),界面中只顯示其含有的功能供人們選擇。當(dāng)顧客在系統(tǒng)的提示下輸入選項(xiàng)代碼時(shí),系統(tǒng)會(huì)調(diào)用相應(yīng)的子程序供人們選擇的功能。因此,系統(tǒng)主控平臺(tái)應(yīng)對(duì)系統(tǒng)提供的功能用列表的方式清晰的給人們呈現(xiàn),并能正確的接受顧客的輸入。創(chuàng)建商品信息文件:人們根據(jù)提示輸入商品編號(hào)、名稱、數(shù)量、保質(zhì)期、生產(chǎn)地、供貨商??梢淮涡暂斎攵鄺l商品信息記錄。系統(tǒng)將商品信息記錄存儲(chǔ)在系統(tǒng)磁盤的文件中,以便進(jìn)行管理和查找。添加商品信息:可在原有商品信息文件的基礎(chǔ)上增加新的商品信息記錄,并繼續(xù)保存在磁盤中。在增加新信息記錄的過程中,系統(tǒng)同樣會(huì)提示人們相應(yīng)地填入商品的編號(hào)、名稱

5、、數(shù)量、保質(zhì)期、生產(chǎn)地、供貨商。刪除商品信息:根據(jù)人們輸入要進(jìn)行刪除操作的商品的編號(hào),如果在文件中有該商品的信息記錄存在,則將提示人們是否確認(rèn)將其刪除,若確認(rèn),則將該編號(hào)所對(duì)應(yīng)的名稱等各種信息在對(duì)應(yīng)文件中加以刪除。如果該商品不存在,則將顯示“該商品不存在!按任意鍵退出”。修改商品信息:提示人們輸入要進(jìn)行修改操作的商品編號(hào),如果在文件中有該商品的信息記錄存在,則將提示人們輸入該編號(hào)的對(duì)應(yīng)的商品編號(hào)、名稱、數(shù)量、報(bào)質(zhì)期、生產(chǎn)地、提供商等需要修改的選項(xiàng),并將修改結(jié)果存儲(chǔ)于文件。查詢商品信息:提示人們輸入要查詢的商品信息的編號(hào),如果在磁盤文件中有對(duì)應(yīng)商品信息記錄,則將查詢的商品的信息逐項(xiàng)列出。查詢完畢

6、后可按任意鍵返回主鍵面。顯示商品信息:當(dāng)人們選擇了顯示商品信息該選項(xiàng)后,系統(tǒng)會(huì)自動(dòng)進(jìn)入一個(gè)界面,一個(gè)將之前存儲(chǔ)在這個(gè)文件中的所以商品的各項(xiàng)信息都逐個(gè)陳列出來的界面。排序全部信息:當(dāng)人們選擇了排序全部信息該選項(xiàng)后,系統(tǒng)會(huì)自動(dòng)進(jìn)入一個(gè)界面,這個(gè)界面中的全部商品信息記錄都按照編號(hào)排列(從小到大),以便人們能更直觀的瀏覽到全部的商品信息。3軟件總體設(shè)計(jì)1、系統(tǒng)模塊結(jié)構(gòu)圖商品庫(kù)存管商品庫(kù)存管理創(chuàng)建商品信息添加商品信息刪除商品信息修改商品信息查詢商品信息顯示商品信息排序全部信息insert函數(shù)delet函數(shù)Modify函數(shù)find函數(shù)print函數(shù)sort函數(shù)系統(tǒng)模塊結(jié)構(gòu)圖開始輸入選項(xiàng)開始輸入選項(xiàng)判斷選項(xiàng)

7、輸入操作選項(xiàng)結(jié)束輸出數(shù)據(jù)退出系統(tǒng)排序信息顯示全部信息查詢信息修改信息刪除信息添加信息對(duì)已有文件進(jìn)行操作結(jié)束保存輸入各項(xiàng)信息結(jié)束輸入操作選項(xiàng)結(jié)束輸出數(shù)據(jù)退出系統(tǒng)排序信息顯示全部信息查詢信息修改信息刪除信息添加信息對(duì)已有文件進(jìn)行操作結(jié)束保存輸入各項(xiàng)信息結(jié)束創(chuàng)建新的創(chuàng)建新的商品信息流程圖3、程序中各項(xiàng)功能具體定義:Elemsn *creatlink(void)創(chuàng)建鏈表信息void savelink(Elemsn *h)保存鏈表信息Elemsn *readlink(void)讀出已存文件信息Elemsn *insert(Elemsn *head)添加信息Elemsn *delet(Elemsn *p0

8、)刪除信息Elemsn *modify(Elemsn *h)修改信息void find(Elemsn *h)查詢信息void print(Elemsn *p)顯示全部信息Elemsn *sort(Elemsn *head)排序信息4、程序中各項(xiàng)功能描述:一:頭文件,變量定義,函數(shù)的聲明,定義結(jié)構(gòu)體 定義結(jié)構(gòu)體 typedef struct pro 為結(jié)構(gòu)體命名 Elemsn 對(duì)系統(tǒng)所使用的變量進(jìn)行定義,對(duì)函數(shù)進(jìn)行聲明二:商品庫(kù)存管理系統(tǒng)主界面設(shè)計(jì) 聲明函數(shù)void main(),對(duì)整個(gè)系統(tǒng)進(jìn)行選擇使用說明三:創(chuàng)建商品庫(kù)存信息聲明函數(shù)creatlink(),用Elemsn *creatlink(

9、void)創(chuàng)建鏈表信息四:商品庫(kù)存信息的添加聲明void insert()插入商品信息,先通過判斷該商品是否存在,若不存在則繼續(xù)輸入,若是存在則跳出,重新循環(huán)五:保存信息 void savelink()用于保存鏈表信息六:商品庫(kù)存信息的刪除聲明void delet()實(shí)現(xiàn)商品信息刪除,通過編號(hào)對(duì)比確定要?jiǎng)h除的信息,然后用后一個(gè)替換掉。七:商品庫(kù)存信息的修改聲明void modify()為商品信息修改函數(shù),通過switch(n)設(shè)定所要修改的項(xiàng)目八:商品信息的查找聲明void find()為查找函數(shù),通過switch(item)設(shè)定用編號(hào)查找九:顯示全部商品信息 通過void print()函數(shù)

10、輸出商品信息十:商品信息的排序聲明void sort()將錄入商品的編號(hào)按升序排列,用的是“冒泡排序法”實(shí)現(xiàn)排序31數(shù)據(jù)結(jié)構(gòu)描述與定義1、測(cè)量結(jié)構(gòu)體變量的大小# define N sizeof(struct pro)2、商品庫(kù)存信息數(shù)據(jù)結(jié)構(gòu)用于存放每個(gè)商品的編號(hào)、名稱、數(shù)量、保質(zhì)期、提供商和生產(chǎn)地各方面的信息。typedef struct prochar number20;char name20;char amount20;char deadline20;char supply20;char add20;struct pro *next; Elemsn; /為結(jié)構(gòu)體命名/用結(jié)構(gòu)體定義商品信息。

11、由于編號(hào)、名稱、價(jià)格、數(shù)量等是用于描述一個(gè)有機(jī)整體商品,為了表明這些字段不是孤立的,而是共同描述一個(gè)完整的事物,因此用結(jié)構(gòu)體這種形式來體現(xiàn)。32模塊設(shè)計(jì)1、模塊描述對(duì)若干商品價(jià)格,名稱,生產(chǎn)日期等記錄進(jìn)行創(chuàng)建商品信息文件、增加商品信息、刪除商品信息、修改商品信息、查詢商品信息、顯示商品信息和排序全部信息幾項(xiàng)功能管理。對(duì)文件有修改的操作,會(huì)將操作結(jié)果保存至文件,對(duì)于需要查看結(jié)果的操作,文件中的操作結(jié)果將會(huì)顯示于屏幕上。2、模塊設(shè)計(jì)總體框架圖:商品庫(kù)存管理系統(tǒng) 1.添加商品信息 2刪除商品信息3修改商品信息4查詢商品信息5.顯示商品信息6排序全部商品信息3、系統(tǒng)模塊流程圖商品庫(kù)存管理商品庫(kù)存管理創(chuàng)

12、建商品信息添加商品信息刪除商品信息修改商品信息查詢商品信息顯示商品信息排序全部信息系統(tǒng)模塊結(jié)構(gòu)圖4測(cè)試結(jié)果與分析執(zhí)行效果如下:1、主界面:2、輸入1后編輯的商品信息(創(chuàng)建新文件):3、保存文件后,進(jìn)入商品庫(kù)存管理系統(tǒng):4、執(zhí)行1添加功能:5、執(zhí)行2刪除功能:6、執(zhí)行3修改功能:執(zhí)行4查詢功能:執(zhí)行5顯示功能:執(zhí)行6排序功能:5課程設(shè)計(jì)總結(jié)經(jīng)過一個(gè)禮拜的努力,終于,一個(gè)比較完整的小型商品庫(kù)存管理系統(tǒng)就創(chuàng)建完畢了。我們組創(chuàng)建的商品庫(kù)存管理,系統(tǒng)能實(shí)現(xiàn)商品信息的添加,刪除,修改,查詢,顯示,排序等簡(jiǎn)單的基本功能。雖然這個(gè)課程設(shè)計(jì)是從寒假就開始準(zhǔn)備了,但是說實(shí)話,在沒有人能商量的情況下,我對(duì)這個(gè)課程設(shè)

13、計(jì)的題目還是一頭霧水的,雖然有上網(wǎng)查找資料并且問了家里有從事編程工作的親戚,但是,我想說請(qǐng)?jiān)徫业倪t鈍,因?yàn)槲疫€是對(duì)課程設(shè)計(jì)無從下手。來了學(xué)校后,因?yàn)殚_學(xué)的第三周是課程設(shè)計(jì),我特地去問了學(xué)姐有關(guān)課程設(shè)計(jì)的信息,并去圖書館查了大量資料??赡苁怯捎谫Y料的繁多重復(fù)吧,我沒辦法從里面理出頭緒,所以我讓組長(zhǎng)給我整理了資料,十分感謝我們組的組長(zhǎng),他給我整理的資料很簡(jiǎn)練,在后面幾天的編程中,我有不懂并且解決不了的程序問題,他都很耐心的幫我解答,調(diào)試。從這次的課程設(shè)計(jì),從組長(zhǎng)那里,我想我學(xué)到了很多,從第一天的無從下手到最后檢驗(yàn)是能運(yùn)行簡(jiǎn)單的功能操作,雖然程序還不是很完善,但是我還是感到很開心。老師檢驗(yàn)的時(shí)候,

14、問了我這樣一個(gè)問題,她問:你for循環(huán)體在哪里?好吧,我突然感覺很糟糕,因?yàn)槲抑豢吹揭粋€(gè)分號(hào),下面的printf并不是循環(huán)體,可是我不知道該怎么說,我想不起來那個(gè)叫什么,我那個(gè)程序里的for循環(huán)只是起到一個(gè)將信息全部讀完的作用。是的,很糟糕,真是太糟糕了。好吧,我承認(rèn),我的基本功真的不扎實(shí)。經(jīng)過這次的課程設(shè)計(jì),我覺得做一個(gè)系統(tǒng)真的需要很好的邏輯能力,并且你的基本功要扎實(shí),不然大小錯(cuò)誤會(huì)不斷。還有我發(fā)現(xiàn)當(dāng)你只看不做的時(shí)候,覺得什么都不會(huì),當(dāng)你去嘗試了去討論了去做出結(jié)果了,可能結(jié)果不是很如人意,但是你會(huì)收獲很多很多。我很幸運(yùn)我能有這樣一次機(jī)會(huì),對(duì)老師來說可能做的很糟,但是對(duì)我來說已經(jīng)是個(gè)很大的突破

15、了,因?yàn)槲覄?dòng)手做了,動(dòng)腦想了,還去討論了,可以說是沒什么遺憾了吧,唯一感到很遺憾的是一周的時(shí)間真的是太少了。我想在以后在我學(xué)習(xí)了更多之后,我的程序會(huì)更好,到時(shí)候我希望自己能獨(dú)立寫出一個(gè)能運(yùn)行的系統(tǒng)程序。附錄:源程序清單#include stdio.h#include stdlib.h#include string.h# include conio.h# define N sizeof(struct pro) /測(cè)結(jié)構(gòu)體變量的大小/typedef struct prochar number20;char name20;char amount20;char deadline20;char supp

16、ly20;char add20;struct pro *next;Elemsn; /為結(jié)構(gòu)體命名/Elemsn *creatlink(void) /創(chuàng)建鏈表信息/ Elemsn *p1,*p2,*head; /p1為前驅(qū),p2為后繼/ int i=1; char choice; head=p2=(Elemsn *)malloc(N); head-next=NULL; choice=y; for(i=1;choice=y|choice=Y;i+) p1=(Elemsn *)malloc(N); printf(*nn); printf(請(qǐng)輸入第%d個(gè)商品的信息:n,i); printf(編號(hào):);

17、 scanf(%s,p1-number); printf(n名稱:); scanf(%s,p1-name); printf(n數(shù)量:); scanf(%s,p1-amount); printf(n保質(zhì)期:); scanf(%s,p1-deadline); printf(n供貨商:); scanf(%s,p1-supply); printf(n出產(chǎn)地:); scanf(%s,p1-add); p2-next=p1; p2=p1; printf(n是否繼續(xù)?(Y/N):); choice=getche(); printf(n); p2-next=NULL; return(head);void sa

18、velink(Elemsn *h) /保存鏈表信息/ Elemsn *p; FILE *fp; char fliename20; printf(n請(qǐng)輸入你要保存的文件名:); scanf(%s,fliename); if(fp=fopen(fliename,wt)=NULL) printf(寫文件出錯(cuò),按任意鍵退出!); getche(); exit(1); for(p=h-next;p!=NULL;p=p-next) fprintf(fp,%s %s %s %s %s %sn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); /向文件中

19、寫入數(shù)據(jù)/ printf(文件已成功保存,按任意鍵返回!); getche(); fclose(fp);Elemsn *readlink(void) /讀出已保存文件的信息/ Elemsn *head,*p,*q; FILE *fp; char filename20; printf(n請(qǐng)輸入要打開的文件名:); scanf(%s,filename); if(fp=fopen(filename,rt)=NULL) printf(讀文件出錯(cuò),按任意鍵退出!); getche(); exit(1); head=q=(Elemsn *)malloc(N); head-next=NULL; while(

20、!feof(fp) p=(Elemsn *)malloc(N); /建立新鏈表,并從文件中讀出數(shù)據(jù)/ fscanf(fp,%s %s %s %s %s %sn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); q-next=p; q=p; q-next=NULL; fclose(fp); printf(文件信息已正確讀出,按任意鍵返回!); getch(); return head;Elemsn *insert(Elemsn *head) /插入信息/ Elemsn *p; p=(Elemsn *)malloc(N); printf(n請(qǐng)

21、輸入要插入商品的信息:n); printf(n編號(hào):); scanf(%s,p-number); printf(n名稱:); scanf(%s,p-name); printf(n數(shù)量:); scanf(%s,p-amount); printf(n保質(zhì)期:); scanf(%s,p-deadline); printf(n供貨商:); scanf(%s,p-supply); printf(n出產(chǎn)地:); scanf(%s,p-add); if(head-next!=NULL) p-next=head-next; /插入數(shù)據(jù)操作代碼/ head-next=p; printf(n商品信息插入成功!按任

22、意鍵繼續(xù)!); getche(); return head;Elemsn *delet(Elemsn *p0) /刪除信息/ char num20; Elemsn *p; char choice; if(p0-next=NULL) printf(該商品不存在!按任意鍵退出!); getch(); exit(1); printf(n請(qǐng)輸入要?jiǎng)h除商品的編號(hào):); scanf(%s,num); for(p=p0-next;strcmp(p-number,num)!=0;p0=p,p=p-next) ; /找到要?jiǎng)h除的商品的信息/ printf(你要?jiǎng)h除的信息如下,請(qǐng)確認(rèn)是否刪除:n); printf

23、(n編號(hào):%s 名稱:%s 數(shù)量:%s 保質(zhì)期:%s 供貨商:%s 出產(chǎn)地:%snn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); printf(n是Y,否N:); /顯示要?jiǎng)h除的商品的信息/ choice=getche(); if(choice=Y|choice=y) p0-next=p-next; free(p); printf(n文件刪除成功!); printf(n按任意鍵結(jié)束!); getche(); return p0;Elemsn *modify(Elemsn *h) /修改信息/ char num20; Elemsn *

24、p; char choice; printf(n請(qǐng)輸入要修改商品信息的編號(hào):); scanf(%s,num); for(p=h;strcmp(p-number,num)!=0;p=p-next) ; /找到要修改的商品的信息/ while(1) printf(請(qǐng)輸入修改后商品的信息:n); printf(編號(hào):); scanf(%s,p-number); printf(n名稱:); scanf(%s,p-name); printf(n數(shù)量:); scanf(%s,p-amount); printf(n保質(zhì)期:); scanf(%s,p-deadline); printf(n供貨商:); sca

25、nf(%s,p-supply); printf(n出產(chǎn)地:); scanf(%s,p-add); printf(修改后商品信息如下:n); printf(n編號(hào):%s 名稱:%s 數(shù)量:%s 保質(zhì)期:%s 供貨商:%s 出產(chǎn)地:%snn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); printf(n確認(rèn)?是Y否N:); choice=getche(); if(choice=y|choice=Y) break; printf(n修改成功,按任意鍵繼續(xù)!); getche(); return h;void find(Elemsn *h)

26、/查詢信息/ char num20; Elemsn *p; printf(n請(qǐng)輸入你要查找的商品的編號(hào):); scanf(%s,num); for(p=h;strcmp(p-number,num)!=0;p=p-next) ; printf(你查找的商品信息如下:n); printf(n編號(hào):%s 名稱:%s 數(shù)量:%s 保質(zhì)期:%s 供貨商:%s 出產(chǎn)地:%snn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); printf(按任意鍵繼續(xù)!); getche();void print(Elemsn *p) /顯示全部信息/ p=p-n

27、ext; while(p!=NULL) printf(n編號(hào):%s 名稱:%s 數(shù)量:%s 保質(zhì)期:%s 供貨商:%s 出產(chǎn)地:%sn,p-number,p-name,p-amount,p-deadline,p-supply,p-add); p=p-next; printf(n按任意鍵繼續(xù)!); getche();Elemsn *sort(Elemsn *head) Elemsn *q,*t,*p; p=head; t=NULL; while(t!=head-next) p=head; q=p-next; while(q-next!=t) if(strcmp(p-next-number,q-n

28、ext-number)0) /*前結(jié)點(diǎn)和后結(jié)點(diǎn)比較大小*/p-next=q-next; q-next=q-next-next; p-next-next=q; p=p-next; q=p-next; t=q; printf(商品信息排序完畢,按任意鍵繼續(xù)!);getche();print(head); return(head); /*返回頭指針*/ void main() int choice=1,i,ok=1; /choice用于選擇對(duì)數(shù)據(jù)執(zhí)行操作,i循環(huán),ok主界面選擇/ Elemsn *head,*h; head=NULL; for(i=1;ok!=0;i+) system(cls); p

29、rintf(n歡迎來到商品庫(kù)管理系統(tǒng)主界面!nnn); printf(nnn 1.創(chuàng)建新文件.nnn); printf( 2.讀取原文件,并執(zhí)行相應(yīng)操作.(原文件名為:jxx); printf(nnn 0.退出;); printf(nnnnn請(qǐng)選擇你要執(zhí)行的操作:); scanf(%d,&ok); if(ok=1) system(cls); head=creatlink(); /創(chuàng)建新鏈表并保存文件/ savelink(head); if(ok=2) head=readlink(); /進(jìn)入文件,對(duì)已知數(shù)據(jù)進(jìn)行操作/ for(i=1;choice!=0;i+) system(cls); pri

30、ntf(*歡迎來到商品庫(kù)管理系統(tǒng)*nnn); printf( 1. 添加商品信息; nn); printf( 2. 刪除商品信息; nn); printf( 3. 修改商品信息; nn); printf( 4. 查詢商品信息; nn); printf( 5. 顯示商品信息; nn); printf( 6. 排序全部信息; nn); printf( 0. 退出; nn); printf(請(qǐng)輸入你要執(zhí)行的操作代碼:); scanf(%d,&choice); switch(choice) case 1: h=insert(head);savelink(h);break; /執(zhí)行增,刪,改完畢后對(duì)新信

31、息進(jìn)行保存/ case 2: h=delet(head);savelink(h);break; case 3: h=modify(head);savelink(h);break; case 4: find(head);break; case 5: print(head);break; case 6: h=sort(head);savelink(h);break; case 0: break; 附錄資料:不需要的可以自行刪除C語(yǔ)言中如何獲取時(shí)間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時(shí)間精確到1

32、/CLOCKS_PER_SEC秒3 計(jì)算時(shí)間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確到毫秒5 如果使用MFC的CTime類,可以用CTime:GetCurrentTime() 精確到秒6 要獲取高精度時(shí)間,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計(jì)數(shù)器的頻率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計(jì)數(shù)

33、器的值然后用兩次計(jì)數(shù)器的差除以Frequency就得到時(shí)間。7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標(biāo)準(zhǔn)C實(shí)現(xiàn)獲取當(dāng)前系統(tǒng)時(shí)間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時(shí)間距1970年1月1日的秒數(shù),以秒計(jì)數(shù)單位,存于rawtime 中。#include time.hvoid main ()time_t rawti

34、me;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必須的時(shí)間函數(shù)頭文件time_t - 時(shí)間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時(shí)間結(jié)構(gòu),time.h 定義如下:int tm_sec;int tm_min;int tm_hour;int tm

35、_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 獲取時(shí)間,以秒計(jì),從1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); - 轉(zhuǎn)為當(dāng)?shù)貢r(shí)間,tm 時(shí)間結(jié)構(gòu)asctime ()- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時(shí)間格式:星期 月 日 時(shí):分:秒 年二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動(dòng)以后的毫秒級(jí)時(shí)間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_t clock ( void );#includ

36、eclock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是記錄時(shí)鐘周期的,實(shí)現(xiàn)看來不會(huì)很精確,需要試驗(yàn)驗(yàn)證;三.gettime(&t); 據(jù)說tc2.0的time結(jié)構(gòu)含有毫秒信息#include#includeint main(void)struct time t;gettime(&t);printf(The current time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一個(gè)結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。四.GetTickCo

37、unt(),這個(gè)是windows里面常用來計(jì)算程序運(yùn)行時(shí)間的函數(shù);DWORD dwStart = GetTickCount();/這里運(yùn)行你的程序代碼DWORD dwEnd = GetTickCount();則(dwEnd-dwStart)就是你的程序運(yùn)行時(shí)間, 以毫秒為單位這個(gè)函數(shù)只精確到55ms,1個(gè)tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這里運(yùn)行你的程序代碼DWORD dwEnd = timeGetTime();則(dwEnd-dwSta

38、rt)就是你的程序運(yùn)行時(shí)間, 以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。=/*Unix#unix時(shí)間相關(guān),也是標(biāo)準(zhǔn)庫(kù)的/*1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時(shí)區(qū)信息;time_t timegm(struct tm *tm);2.mktime使用時(shí)區(qū)信息time_t mktime(struct tm *tm);timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_t timelocal (struct tm *tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時(shí)區(qū)信息;st

39、ruct tm * gmtime(const time_t *clock);4.localtime使用時(shí)區(qū)信息struct tm * localtime(const time_t *clock);1.time獲取時(shí)間,stime設(shè)置時(shí)間time_t t;t = time(&t);2.stime其參數(shù)應(yīng)該是GMT時(shí)間,根據(jù)本地時(shí)區(qū)設(shè)置為本地時(shí)間;int stime(time_t *tp)3.UTC=true 表示采用夏時(shí)制;4.文件的修改時(shí)間等信息全部采用GMT時(shí)間存放,不同的系統(tǒng)在得到修改時(shí)間后通過localtime轉(zhuǎn)換成本地時(shí)間;5.設(shè)置時(shí)區(qū)推薦使用setup來設(shè)置;6.設(shè)置時(shí)區(qū)也可以先更變

40、/etc/sysconfig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t看看你的系統(tǒng)是否有time_t64,它能表示更大的時(shí)間范圍/*windows#Window里面的一些不一樣的/*一.CTime () 類VC編程一般使用CTime類 獲得當(dāng)前日期和時(shí)間CTime t = GetCurrentTime();SYSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD

41、wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts

42、(t);/*獲得當(dāng)前日期和時(shí)間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時(shí)間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTime:GetCurrentTime(); /獲取系統(tǒng)日期,存儲(chǔ)在t里面int d=t.GetDay(); /獲得當(dāng)前日期int y=t.GetYear(); /獲取當(dāng)前年份int m=t.GetMonth(); /獲取當(dāng)前月份int h=t.GetHour(); /獲取當(dāng)前為幾時(shí)int mm=t.GetMinute(); /獲取當(dāng)前分鐘i

43、nt s=t.GetSecond(); /獲取當(dāng)前秒int w=t.GetDayOfWeek(); /獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計(jì)算兩段時(shí)間的差值,可以使用CTimeSpan類,具體使用方法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime();CTimeSpan span=t-t1; /計(jì)算當(dāng)前系統(tǒng)時(shí)間與時(shí)間t1的間隔int iDay=span.GetDays(); /獲取這段時(shí)間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總

44、共有多少小時(shí)int iMin=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒三._timeb()函數(shù)_timeb定義在SYSTIMEB.H,有四個(gè)fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時(shí)間:文檔講可以到ms,有人測(cè)試,好象只能到16ms!四.設(shè)置計(jì)時(shí)器定義TIMER ID#define TIME

45、RID_JISUANFANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時(shí)鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時(shí)器的時(shí)候的時(shí)候銷毀掉時(shí)鐘KillTimer(TIMERID_JISUANFANGSHI);對(duì)應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)#如何設(shè)定當(dāng)前系統(tǒng)時(shí)間windowsSYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLo

46、calTime.wDay=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMillisec;lpSystemTime=&m_myLocalTime;if( SetLocalTime(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myL

47、ocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級(jí)精度定時(shí)器的方法當(dāng)使用定時(shí)器時(shí),在很多情況下只

48、用到毫秒級(jí)的時(shí)間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個(gè)定時(shí)器后,在程序中通過處理由定時(shí)器發(fā)送到線程消息隊(duì)列中的WM_TIMER消息,而得到定時(shí)的效果(退出程序時(shí)別忘了調(diào)用和SetTimer配對(duì)使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計(jì)算機(jī)啟動(dòng)后的時(shí)間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時(shí)效果,此方式跟第一種方式一樣,精度也是毫秒級(jí)的。用這兩種方式取得的定時(shí)效果雖然在許多場(chǎng)合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級(jí)的,而且在要求定時(shí)時(shí)間間隔小時(shí),實(shí)際定時(shí)誤差大。下面介紹一種

49、能取得高精度定時(shí)的方法。在一些計(jì)算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計(jì)數(shù)器(high-resolution performance counter),利用它可以獲得高精度定時(shí)間隔,其精度與CPU的時(shí)鐘頻率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerformanceFrequency函數(shù)取得高精度運(yùn)行計(jì)數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時(shí)的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計(jì)數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時(shí)間間隔,t=(n2-n1)/f。下面舉一個(gè)例子來演示這種方法的使用及它的精確度。在V

50、C 6.0 下用MFC建立一個(gè)對(duì)話框工程,取名為HightTimer.在對(duì)話框面板中控件的布局如下圖:其中包含兩個(gè)靜態(tài)文本框,兩個(gè)編輯框和兩個(gè)按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過MFC ClassWizard添加的成員變量也分別對(duì)應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的ID為IDOK,“開始測(cè)試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control n

51、otification handler code hereUpdateData(TRUE); /取輸入的測(cè)試時(shí)間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER frequence;if(!QueryPerformanceFrequency( &frequence) /取高精度運(yùn)行計(jì)數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_

52、OK);LARGE_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通過頻率換算微秒數(shù)到對(duì)應(yīng)的數(shù)量(與CPU時(shí)鐘有關(guān)),1秒=1000000微秒ret = MySleep( test ); /調(diào)用此函數(shù)開始延時(shí),返回實(shí)際花銷的數(shù)量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(FALSE); /顯示到對(duì)話框面板其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGER

53、CHightTimerDlg:MySleep(LARGE_INTEGER Interval)/ 功能:執(zhí)行實(shí)際的延時(shí)功能 / 參數(shù):Interval 參數(shù)為需要執(zhí)行的延時(shí)與時(shí)間有關(guān)的數(shù)量 / 返回值:返回此函數(shù)執(zhí)行后實(shí)際所用的時(shí)間有關(guān)的數(shù)量 / LARGE_INTEGER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCo

54、unter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366, 64M內(nèi)存)測(cè)試,當(dāng)測(cè)試時(shí)間超過3微秒時(shí),準(zhǔn)確度已經(jīng)非常高了,此時(shí)機(jī)器執(zhí)行本身延時(shí)函數(shù)代碼的時(shí)間對(duì)需要延時(shí)的時(shí)間影響很小了。上面的函數(shù)由于演示測(cè)試的需要,沒有在函數(shù)級(jí)封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:執(zhí)行微秒級(jí)的延時(shí)功能

55、 / 參數(shù):Interval 參數(shù)為需要的延時(shí)數(shù)(單位:微秒) / 返回值:若計(jì)算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE / BOOL bNormal = TRUE;LARGE_INTEGER frequence, privious, current, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support,

56、MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInterval / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t )

57、;return bNormal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時(shí)間也很長(zhǎng),所以在需要幾個(gè)微秒的延時(shí)時(shí),會(huì)影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerformanceCounter這兩個(gè)函數(shù)就能按實(shí)際需要寫出自己的延時(shí)代碼了。使用CPU時(shí)間戳進(jìn)行高精度計(jì)時(shí)對(duì)關(guān)注性能的程序開發(fā)人員而言,一個(gè)好的計(jì)時(shí)部件既是益友,也是良師。計(jì)時(shí)器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對(duì)不同的算法作出有說服力的性能比較。在W

58、indows平臺(tái)下,常用的計(jì)時(shí)器有兩種,一種是timeGetTime多媒體計(jì)時(shí)器,它可以提供毫秒級(jí)的計(jì)時(shí)。但這個(gè)精度對(duì)很多應(yīng)用場(chǎng)合而言還是太粗糙了。另一種是QueryPerformanceCount計(jì)數(shù)器,隨系統(tǒng)的不同可以提供微秒級(jí)的計(jì)數(shù)。對(duì)于實(shí)時(shí)圖形處理、多媒體數(shù)據(jù)流處理、或者實(shí)時(shí)系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項(xiàng)基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時(shí)間戳進(jìn)行計(jì)時(shí)的高精度計(jì)時(shí)手段。以下討論主要得益于Windows圖形編程一書,第15頁(yè)17頁(yè),有興趣的讀者可以直接參考該書。關(guān)于R

59、DTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊(cè)。本文僅僅作拋磚之用。在Intel Pentium以上級(jí)別的CPU中,有一個(gè)稱為“時(shí)間戳(Time Stamp)”的部件,它以64位無符號(hào)整型數(shù)的格式,記錄了自CPU上電以來所經(jīng)過的時(shí)鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個(gè)部件可以達(dá)到納秒級(jí)的計(jì)時(shí)精度。這個(gè)精確性是上述兩種方法所無法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來讀取這個(gè)時(shí)間戳的數(shù)字,并將其保存在EDX:EAX寄存器對(duì)中。由于EDX:EAX寄存器對(duì)恰好是Win32平臺(tái)下C+語(yǔ)言保存函數(shù)返回值的寄存器

60、,所以我們可以把這條指令看成是一個(gè)普通的函數(shù)調(diào)用。像這樣:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因?yàn)镽DTSC不被C+的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計(jì)數(shù)器的場(chǎng)合,可以像使用普通的Win32 API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個(gè)返回值的差,像這樣: unsigned long

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論