C語言課程設計_第1頁
C語言課程設計_第2頁
C語言課程設計_第3頁
C語言課程設計_第4頁
C語言課程設計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

C語言課程設計學院:_ 專業: 學號:—班級: _姓名:— 雜志訂閱管理軟件1題目要求使用計算機對一種雜志的訂閱進行管理。該雜志擁有的訂戶最多不超過10人,每個訂戶的信息包括姓名、性別、地址、電話號碼、雜志單價、訂閱數、訂閱的期限(至xx年xx月)。現在要求用菜單選擇并完成如下功能:(1) 增加新訂戶,即將訂戶的全部信息輸入到文件中。(2) 根據當天的日期對訂戶文件進行查詢,刪除已到期的訂戶記錄。(3) 統計本期雜志訂戶數并打印運算結果。例如:本期訂戶信息表訂戶名訂閱數單價金額李平25.511.0黃海15.55.5合計31.016.52需求分析訂戶的信息要用文件存儲,所以要提供文件的輸入/輸出操作;要實現增加新訂戶的功能,所以要提供文件的添加操作;要實現對訂戶文件的查詢,所以要提供文件的查找操作;要刪除已到期的訂戶記錄,所以要提供文件的刪除操作;要統計本期雜志訂戶數并打印運算結果,所以要提供統計和顯示操作;另外,還要提供鍵盤式選擇菜單以實現功能選擇。數據結構選擇結構體,訂戶信息應包括姓名、性別、地址、電話號碼、雜志單價、訂閱數、訂閱的期限等。在“本期訂戶信息表”中,金額=訂閱數X單價,因此沒有必要在結構體中特別定義“金額”這一數據成員。由于訂戶人數最多不超過10個,因此可定義一個大小為10的結構體數組作為全局變量,在程序運行的一開始就從已存儲的dat文件中讀入訂戶信息,然后通過對結構體數組的一系列操作實現各模塊功能,在程序運行結束時,將結構體數組中的數據寫入到dat文件(即之前用于讀入訂戶信息的文件),存儲訂戶信息。3總體設計根據上面的需求分析,可以將該管理軟件設計為“查看所有訂戶信息”模塊,“查找”模塊,“新增訂戶信息添加”模塊,“刪除到期訂戶信息”模塊,“本期訂戶信息統計”模塊。如圖①所示。圖①軟件功能模塊圖

注意:有關數據文件的讀入和輸出模塊隱含在主函數中。4詳細設計4.1頭文件及宏定義#include<stdlib.h>#include<stdio.h>#include<string.h>intN=0;【代碼】#include<stdlib.h>#include<stdio.h>#include<string.h>intN=0;//包涵一些針對控制臺的函數,例如:system(''cls")〃包涵一些對字符的處理〃全局變量,結構體數組大小4.2主函數主函數的設計比較簡潔,在開始通過函數的調用進行文件數據的讀取,在程序結束時則調用函數進行文件數據的錄入,其中個功能模塊用菜單方式選擇。具體流程如圖②所示。圖②主函數流程圖【代碼】intmain(){inta=1,b;〃讀取訂戶信息文件Readfile();〃讀取訂戶信息文件while(a){

printf("**雜志訂閱管理系統**\n")printf("1查看所有訂戶信息\n")printf("2查找\n")printf("3新增訂戶信息添加\n")printf("4刪除到期訂戶信息\n")printf("5本期訂戶信息統計\n")printf("6退出\n")〃清除控制臺的歷史輸出system("cls");printf("\n\n");printf("請選擇功能序號:”);scanf("%d”,&b);switch(b)case1Display(); break;case2Find(); break;case1Display(); break;case2Find(); break;case3Append(); break;case4Delete(); break;case5Statistics();break;case6a=0; break;{}〃調用“查看所有訂戶信息”模塊函數〃調用“查找”模塊函數〃調用“新增訂戶信息添加”模塊函數〃調用“刪除到期訂戶信息”模塊函數〃調用“本期訂戶信息統計”模塊函數//結束循環,準備結束程序}Writefile();〃錄入訂戶信息文件return0;}4.3各功能模塊設計(1) 數據結構的確定}Writefile();〃錄入訂戶信息文件return0;}4.3各功能模塊設計(1) 數據結構的確定首先,得確定應該采用那種數據結構來存放訂戶信息。單看各數據信息,姓名、性別、地址、訂閱的期限是字符串,可以采用字符型數組;電話號碼可以是整型,也可以是字符串,為了保證有足夠的長度來存放電話號碼也應采用字符型數組;單價采用浮點型;訂閱數采用整型。這里的訂戶信息可以采用結構體的形式,把訂戶的各種信息作為這個結構體的成員。因為要存放若干個訂戶信息就得定義一個結構體數組。該結構設計如下:【代碼】structUser{charcharcharcharfloatintchar}c[10];name[10];sex[3];address[30];phonenum[12]price;number;term[12];〃姓名〃性別〃地址〃電話號碼〃單價//訂閱數〃訂閱的期限//c[10]中每一個數組元素對應一個訂戶(2) 數據讀取模塊及數據的錄入模塊數據的讀取模塊:從dat文本中每次讀取一位訂戶信息,并將讀取的數據依次放入結構體數組中,直到文件結束?!敬a】voidReadfile(){FILE*fp; 〃文件指針,用于文件的操作if((fp=fopen("17.dat”,"r"))==NULL) 〃打開文件{printf("can'topenfile!\n");exit(0); 〃文件打開失敗則結束程序}while(fscanf(fp,"%s%s%s%s%f%d%s”,c[N].name,c[N].sex,c[N].address,c[N].phonenum,&c[N].price,&c[N].number,c[N].term)!=EOF)N++; //N為定義的全局變量,即結構體數組大小fclose(fp); 〃關閉文件}數據的錄入模塊:將結構體數組中的每一位訂戶信息依次寫入dat文本中,直到所有信息都寫入文本保存?!敬a】voidWritefile(){FILE*fp;intj;if((fp=fopen("17.dat”,"w"))==NULL){printf("can'topenfile!\n");exit(0);}for(j=0;j<N;j++) //依次從結構體數組中讀取數據{fprintf(fp,"%s\n%s\n%s\n%s\n%f\n%d\n%s\n”,c[j].name,c[j].sex,c[j].address,c[j].phonenum,c[j].price,c[j].number,c[j].term);〃將數據寫入文件}fclose(fp);}(3) “查看所有訂戶信息”模塊該模塊用于顯示所有訂戶的相關信息,不僅在主函數中會調用,在執行其他函數模塊功能的時候也需要調要改函數?!敬a】voidDisplay(){intj;system("cls");printf("\n **訂戶信息表** \n");printf(-\n姓名性別地址 電話號碼雜志單價訂閱數 訂閱期限\n");for(j=0;j<N;j++) 〃利用循環將所有訂戶信息輸出{printf("%-8s%-5s%T5s%T5s%T3.2f%-6d%T0s\n”,c[j].name,c[j].sex,c[j].address,c[j].phonenum,c[j].price,c[j].number,c[j].term);}printf("按任意鍵返回主菜單。。。\n");system("pause"); //使控制臺暫停運行}“查找”模塊該模塊功能是根據輸入的姓名查找對應的記錄,找到以后,輸出該訂戶的全部信息,其流程圖如圖③所示。圖③ “查找”模塊流程圖【代碼】voidFind(){charm[10]; 〃建立一個字符串數組用于存放輸入的姓名intj,i=1;system("cls");printf("\n **查找** \n");printf("請輸入姓名:");scanf("%s”,&m);printf("查找結果:\n");for(j=0;j<N;j++){if(strcmp(m,c[j].name)==0) 〃進行字符串的比較{printf("姓名:%s\n”,c[j].name);printf("性別:%s\n”,c[j].sex);printf("地址:%s\n”,c[j].address);printf("電話號碼:%s\n”,c[j].phonenum);printf("雜志單價:%-6.2f\n”,c[j].price);printf("訂閱數: %d\n”,c[j].number);printf("訂閱期限:%s\n”,c[j].term);i=0;〃改變i的狀態i=0;}if(i) 〃根據i的狀態是否發生改變來判斷有沒有找到printf("查無此人!\n");printf("按任意鍵返回主菜單。。。\n");system("pause");}“新增訂戶信息添加”模塊該模塊的功能是增加新的訂戶的所有信息,用戶從鍵盤輸入,先寫入到結構體數組中,等程序結束時隨結構體數組一起寫入到文件中保存。值得注意的是這里的采用的是增加,而不是覆蓋。【代碼】voidAppend(){intj=N,a;system("cls");printf("\n **新增訂戶信息添加** \n");printf("新增訂戶數:”);scanf("%d”,&a);N=N+a; 〃改變N值,使結構體數組大小發生改變,以存儲新增數據printf("請按提示輸入相關信息:\n");for(;j<N;j++) //j在定義是賦了未發生改變時的N,新增數據不會覆蓋原有數據{printf("姓名:");scanf("%s”,c[j].name);printf("性別:”);scanf("%s”,c[j].sex);printf("地址:”);scanf("%s”,c[j].address);printf(-電話號碼:");scanf("%s”,c[j].phonenum);printf("雜志單價:");scanf("%f”,&c[j].price);printf("訂閱數:");scanf("%d”,&c[j].number);printf("訂閱期限:”);scanf("%s”,c[j].term);}printf("\n添加完畢!\n");printf("按任意鍵返回主菜單。。\n");system("pause");}“刪除到期訂戶信息”模塊用戶從鍵盤輸入當前的日期,根據當前的日期與訂戶信息中的訂閱期限進行比較,如果當前日期超過訂閱期限,則刪除該訂戶。刪除的一遍做法是將刪除位置后面的記錄往前移動,即用后面一位覆蓋前面一位,再減小結構體數組的大小。還應注意一點,訂戶中存在同時到期的現象,因此,刪除應將滿足條件的訂戶信息全部刪除。【代碼】voidDelete(){intj,i,a;charm[12];Display();printf("\n **刪除到期訂戶信息** \n");printf("請輸入當前日期:”);scanf("%s”,&m);for(i=0;i<N;i++) 〃借助外循環可以實現多個滿足條件用戶的刪除{for(j=0;j<N;j++) //查找滿足條件的訂戶,每次只能刪除一個{if(strcmp(m,c[j].term)>0) 〃進行字符串的比較,判斷是否到期{N=N-1;for(a=j;a<=N;a++)c[a]=c[a+1];}}}printf("更新后訂戶信息如下:\n");printf("\n **訂戶信息表** \n")printf(-\n姓名性別地址 電話號碼 雜志單價訂閱數訂閱期限\n");for(j=0;j<N;j++){printf("%-8s%-5s%-15s%-15s%-13.2f%-6d%-10s\n”,c[j].name,c[j].sex,c[j].address,c[j].phonenum,c[j].price,c[j].number,c[j].term);}printf("按任意鍵返回主菜單。。。\n");system("pause");}“本期訂戶信息統計”模塊該模塊的功能是根據題目要求計算總訂閱數及金額,并將結果一列表的形式打印

出來。這里的總訂閱數和金額是一個累加的值。在結構體中為定義這兩個成員?!敬a】voidStatistics(){intj,a=0,i=0;floatb=0;system("cls");printf("\n **本期訂戶信息統計** \n");printf("\n訂戶名訂閱數單價 金額\n");for(j=0;j<N;j++){printf("%T4s%T0d%T0.2f%T0.2f\n”,c[j].name,c[j].number,c[j].price,(c[j].number)*(c[j].price));a=a+c[j].number; //累加總訂閱數b=b+(c[j].number)*(c[j].price); 〃累加金額}printf("合計 %-10d\\ %-10.2f\n”,a,b);printf("按任意鍵返回主菜單。。。\n");system("pause");

5上機操作下面是各個模塊的界面效果:5.1主函數界面(也稱主界面)主界面如圖④所示。rTJC^UsersikAdi-i,iinistrator\De£lctop\S^Kr!-^H^5_S^\Debiig\17-^xe'浦選攆功能序號志言當吊肅_■12^45^且:'|.電

'_i!—'_=?

r浦選攆功能序號志言當吊肅_■12^45^且:'|.電

'_i!—'_=?

r嘲戶

Trl”圖④主界面5.2“查看所有訂戶信息”模塊在主界面中輸入“1”,按Enter鍵,進入“查找”模塊,如圖⑤所示。■C:\Ui?rs\AdininistratoADesktop\^■C:\Ui?rs\AdininistratoADesktop\^:rriB?lS^.DebLig\17.eKe-**訂戶信息表"名叫砂IffF挎tU勺.電話號幣馬訂閱期限男女亨世健撾名叫砂IffF挎tU勺.電話號幣馬訂閱期限男女亨世健撾.F.I咨一安Wa--倍羿-,主紜號號片號08938-2311£3847&50928132537?!20?5_S09.1G12-^0私m2B14-12-01201€-0^-01aoiE-ii-i^2816-12-11圖⑤“查看所有訂戶信息”模塊5.3“查找”模塊在主界面中輸入“2”,然后按Enter鍵,將進入“查找“模塊,按照提示進行操作。結果如圖⑥所示。圖⑥“查找”模塊“新增訂戶信息添加“模塊在主界面中輸入“3”,然后按Enter鍵,將進入“新增訂戶信息添加”模塊,按照提示,添加數據。結果如圖⑦所示。圖⑦“新增訂戶信息添加”模塊

“刪除到期訂戶信息”模塊在主界面中輸入“4”,然后按Enter鍵,將進入“刪除到期訂戶信息”模塊,按照提示進行操作。結果如圖⑧所示。地址條志苧(■.!■?rjr.性別|=|\Enn\n!T_-Inhu.3^擔..F.r怠-_5-is守展_示座X099282,2311£理如山一一無R1見拿<一鑿,.如點刊除陽期地址條志苧(■.!■?rjr.性別|=|\Enn\n!T_-Inhu.3^擔..F.r怠-_5-is守展_示座X099282,2311£理如山一一無R1見拿<一鑿,.如點刊除陽期ijfu息5**「J-?寧日,表**?生山I1.1電話號碼苗一?心H7.1MV.1M訂閱激1訂閱轂1圖⑧“刪除到期訂戶信息”模塊“本期訂戶信息統計”模塊在主界面中輸入“5”,然后按Enter鍵,進入“本期少信息統計”模塊,將自動進行總訂閱數與金額的計算,并顯示。結果如圖⑨所示。圖⑨ “本期訂戶信息統計”模塊6源代碼#include<stdlib.h>#include<stdio.h>#include<string.h>intN=0;structUser{charcharcharcharfloatintcharname[10];sex[3];address[30];phonenum[12];price;number;term[12];}c[10];voidReadfile(){FILE*fp;if((fp=fopen("17.dat”,"r"))==NULL){printf("can'topenfile!\n");exit(0);}while(fscanf(fp,"%s%s%s%s%f%d%s”,c[N].name,c[N].sex,c[N].address,c[N].phonenum,&c[N].price,&c[N].number,c[N].term)!=EOF)N++;fclose(fp);}voidDisplay(){intj;system("cls");printf("\n **訂戶信息表** \n");printf(-\n姓名性別地址 電話號碼 雜志單價訂閱數訂閱期限\n");for(j=0;j<N;j++){printf("%-8s%-5s%T5s%T5s%T3.2f%-6d%T0s\n”,c[j].name,c[j].sex,c[j].address,c[j].phonenum,c[j].price,c[j].number,c[j].term);}printf("按任意鍵返回主菜單。。。\n");system("pause");}voidFind(){charm[10];intj,i=1;system("cls");printf("\n **查找** \n");printf("請輸入姓名:");scanf("%s”,&m);printf("查找結果:\n");for(j=0;j<N;j++){if(strcmp(m,c[j].name)==0) 〃進行字符串的比較{printf("姓名:%s\n”,c[j].name);printf("性別:%s\n”,c[j].sex);printf("地址:%s\n”,c[j].address);printf("電話號碼:%s\n”,c[j].phonenum);printf("雜志單價:%-6.2f\n”,c[j].price);printf("訂閱數:%d\n”,c[j].number);printf("訂閱期限:%s\n”,c[j].term);i=0;}}if(i)printf("查無此人!\n");printf("按任意鍵返回主菜單。。。\n");system("pause");}voidAppend(){intj=N,a;system("cls");printf("\n **新增訂戶信息添加** \n");printf("新增訂戶數:”);scanf("%d”,&a);N=N+a;printf("請按提示輸入相關信息:\n");for(;j<N;j++){printf("姓名:");scanf("%s”,c[j].name);printf("性別:”);scanf("%s”,c[j].sex);printf("地址:”);scanf("%s”,c[j].address);printf(-電話號碼:");scanf("%s”,c[j].phonenum);printf("雜志單價:");scanf("%f”,&c[j].price);printf("訂閱數:");scanf("%d”,&c[j].number);printf("訂閱期限:”);scanf("%s”,c[j].term);}printf("\n添加完畢!\n");printf("按任意鍵返回主菜單。。\n");system("pause");}voidDelete(){intj,i,a;charm[12];Display();\n");**刪除到期訂戶信息\n");**刪除到期訂戶信息**printf("請輸入當前日期:”);scanf("%s”,&m);for(i=0;i<N;i++){for(j=0;j<N;j++){if(strcmp(m,c[j].term)>0){N=N-1;for(a=j;a<=N;a++)c[a]=c[a+1];}}}printf("更新后訂戶信息如下:\n");printf("\n **訂戶信息表** \n")printf(-\n姓名性別地址 電話號碼 雜志單價訂閱數訂閱期限\n");for(j=0;j<N;j++){printf("%-8s%-5s%-15s%-15s%-13.2f%-6d%-10s\n”,c[j].name,c[j].sex,c[j].address,c[j].phonenum,c[j].price,c[j].number,c[j].term);}printf("按任意鍵返回主菜單。。。\n");system("pause");}voidStatistics(){intj,a=0,i=0;floatb=0;system("cls");printf("\

溫馨提示

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

評論

0/150

提交評論