课程设计报告课程设计题目:家庭财务管理系统学生姓名:专业: 信息工程班级:指导教师:2018年1月8 日1.需求分析根据家庭账务管理的需要,建立一个“家庭账务管理系统” 收入,以方便对家庭日常及支出进行记录和管理。
该系统要求:①家庭月收入管理②家庭月支出管理③统计家庭总收入/ 总支出④系统提供收入/ 支出的添加、删除和修改功能。
2.总体设计根据以上分析,本家庭账务管理系统主要包括:①从键盘键入家庭月收入、月支出数据;②查询月收入、月支出明细;③删除收入、支出数据;④修改收入、支出数据;⑤统计总收入/总支出;⑥退出系统。
除main()函数之外,系统还定义了以下函数来实现各部分内容:①add_income():添加收入数据函数。
②add_payout():添加支出数据函数。
③search_data():查找数据函数。
④initialize():初始化函数,读取文本数据。
⑤show_info ():显示数据函数。
⑥count_total ():统计函数,统计总收入、总支出。
⑦update_data():修改信息函数。
⑧delete_data():删除数据函数。
⑨quit()退出函数。
程序结构功能图如下:家庭财务管理系统3.详细设计3.1收入管理3.2支出管理4 .测试结果4.1程序运行主菜单室庭财务管理系统4.2添加收入测试明細8统 退>1 麗卿加」人冢雇成貝姓宕〔最大长芨为i0>=iyy耀絨黠離大长度技邮:jdicw E i M i ta iE KW i o t KJ t ao ta cM a o t NW 3<図梵:11:梵]|[梵:《梵]<屛冠屛耳耳9<耳3<耳1<>63<梵1<耳计詔•统计总收人/忌支出S HMXJCKKBOCKJtJt WK W)C :H.J<:JI.)C :IIJ<Jt)CJ<J<J<)CJ<X 8<:MJ<:M ・:MK]il KJl i t ;K M 梵 S C ;K S C >EX W M : X X X I CH X W >CW ;3t 3<:H :弭:H 3<Jt i M :<>Ej C]itS<]<KXN>f K>e K* 支出管理汚冢庭财务管理系统回FC 逼Vk i nd OWE 11 sy=rtem z 2\Debug\Fyyl. G <e4.3查询收入明细测试统计汁•统计总收人二总支出 退 岀词•退岀系统'请选择要进行的換作<0-9>:2 沁青输入要查询的穿月好匹肮”7请按任意键畛心其也数据? <y 叶n>4.4删除收入测试4 hAi>A N*L * WM B . i^ulA WUAWUK J *冢庭财务管理系统rrwwwrMrHrrwYvruruwruwnmmrirurhmmmww耳XJO E X i MICMXX 址风址耳XM I>EKK KN掛耳 XX 3<Wr>E :MiMKl iE XXXX 斃入明细M=建建茉豪事,i Wi atfHW*・ME ・=MX K WlFafr M i 幕荒豪務整豪豪亲=M i MH Sfr M i *H<・ W ,c.轉弼算闿曲若耳豪科,^■■轉if ■苗]<満■科■■■>< ■齋if 轉苗曲満耳酬耳■贰科贰轉曹 统 计汁•统计忌收入儿鼠支出 退 岀汨•退岀系统 》请选择雯迸行的操作個“竹>请初1/厘查询的年月<¥¥¥¥zH>201-4/l I I 4》删除成功P I ^RSS an^ key to cnnt-imie溝漱明细收入管理豊翻细明 支支 沓-修■■68出出 支支 加除i■-«5 年月1 !20t3/09咲型 ;收入1008.00::备汪工资支出吨勰雜.iMO-月:类型:备汪1 !2014/01168.23 :lyy岀羽细4.5修改收入测试JCJ H JCJOtKJt ■* XU JOCWJtKJW M ><:«■: ■! JCJ! MUM BL JCJt MH JCKJCJtK 菱理 KJIM收A 管理m添加收入趴查育3-删除收入弭XJ ta<>E M X a O t MJC H K i M羸算 KW 址耳 KJ t 址豪 KJC M SX i MIC i M K3t 址耳贰疋 XJ f a t X支出管理出7统计叽统计总收人血支岀退出汕*退出系纟充>iMA^<VVVV/M>2013z2〉诗输入擁成员姓名〔最大长度为诃》 ”書输人眷注t 最大长度为饷庆工资.4.6添加支出测试NO.1 !2013/fRU ?UC (_■作月操年:咲型;金额叫夂入30001400.00:「查询支出明细 8 •修改支出4.7查询支出明细测试■ Ud'WmmflUrMgumW -FMiWihiriiMIUriVia^WUirMiWMiiW家庭财务管理系统X >E X i M~:MiKK>ti O f HX a<]<>E :W >E X>E冥耳 N X其 M M i K 弭 K 瓮 XXXX N M N NX H M ; ]«S M收入管鵲:勰怒m林明细X KU >[]<■: K JOCK WJCJfXlHf i l H l fJOt JotKU it MnOiJCKX支岀管瑋汚•探加支出 "查询支出明细巴删除支出孔修改支出 统计伙统计总收人/負支岀 K KM 普材■K4 m W M i K唇・科恒■退 出:0-退出系统I■;青按任意键継续.-亠4.8删除支出测试I 屜月 I IS 作個-9,海^<¥V¥V/M>20i3/1:类型 I 支岀■姓亡3*;金埶1备注200.00 1购物ME界貝其貝耳疑耳冥艮K 耳KME 界]< 界箕梵JOC 3KH M :耳NW 算見其買梵就艮植耳拉算址舅覽如其支出管理參報鑒:義鏗细:K“a< :WFj a Ntf K Itf NJ* ;K“M ; *M* :K h E 倚甘 1* 材 UIfrJtf N Jtfim ;:M H H X l il: K W ;M H U“a< :M ;:M :fcff甘ik计=9 •统计包收入/总支出 退出詬•退出系统KKM^M«tK>CHHX^KKMM^K>£KMtKMK4CX^KM^KM^K»tK4tK»tX^MdKX^KHK>tK>请选择要进行的操隹 <0-9>=7■1A 请输入要査询的年月 H■¥1<Y¥YYZM>2013Z11 ■1 11 1 :NO. 1;年声月"咲型 1;姓名;金额!#i£; 1111iZUlJZOl:支岀 iiyyJ1 1 购物1 1 i1 1i》删除成功11[Press any key to continue4.9修改支出测试«:«■泉庭财务管理系统收入管理沁3務賑旳细4.10统计总收入/支出测试家庭财务管理系绒iSWWMYWM¥WWWWAANiHWWVSAHM¥W%hnAiSWfW芽I* it 員ji ・iKifcK ・・!J R PtK ・貝 ・■*■*“* 応*收 '管理d 添加收入上一査询収入明细*删除收入4-*SK 入请尹 统计=9 ■统计总收入严总支出 X X J t XXXXXK aC X K K XMtK !M XS f K S C H'XXXXX I M ! X m e K X**K St X!KK XK'XW阻出汕”通出系统 K 梵廉拉艮梵耳疋艮3CM8. ■ :JC i M ■>!梵滩X農梵X X M E 4C 旌舅Jt i MK 耳■:梵英]< 梵耳X葺朋觀呈婪进行的操作汚 ;合计支岀 :结余 :500,901 423^.631 :按任焉缶月家庭财务管理系统ru 41WEH U f HEiM *M"U d *M**UI *M * EJ ■ *19! I、MX W5 &FU *、『WT梵ME it WE 梵K XW iM KE M iMr 梵琏梵覺梵K 梵 W 港味疋址梵曲梵琏梵:M 3< H收入管理1席加収入霊查询收入明细4圖除收入4W t f If U ・=Mtl i f If ■・・・・・・・・i f If ・・・i f ・ 筑查询支岀明细 緘修改支出 h l 屛轉I H ■冒!w K ■!< w K ■弭昇轉・屛衬!M 筑岸捕曲KF 弭屛W!岸屛耐忖岸K 屛利K ■统 计汐•统计总收入"总支岀 退支岀管理惰 出通■退岀系统攵入 <0-9>:8<V¥¥YzM>2013/9■M-12013/09年月咲型I 备注lyy300.00:》请输人年月<V¥ y?/M>2013内>请嫡△寡庭喩员妃名〔最工长厦为讪:丄妁 、输人金额:左腼冰蕃注塢俵服i2013/09;裘型 :支出I 金额 200.00:衣朋衣服[合计L 反入4734-63I一湛返回主苹吉出背理汗4.11退出系统测试5 .软件操作使用说明书本系统采用命令行对话方式进行操作,运行后出现主界面(如下图所示) 然后按照主界面菜单指引操作即可6.总结编写程序之前要有一个整体的思路,不能写到哪里算哪里。
这样很容易遗漏,连续性也不好。
通过本次的课程设计让我对于数组、文件的存放、循环结构等知识有了更加透彻的理解。
希望在以后的课程设计中对于知识的运用能够更加的熟练。
代码:#in elude <stdio.h>#in elude <stdlib.h>#in elude <stri ng.h>#include <conio.h> #define MAXNAME 11 // 家庭成员姓名的最大长度#define MAXDETAIL 21 // 注最大长度//自定义枚举类型fi_type,用来表示收入与支出typedef enum _fi_type{income=1,// 收入payout =-1 // 支出} fi_type;// 家庭财务信息结构体typedef struct _fi_info{int year;int month;fi_type type;char name[9];float money;char detail[11];}fi_info;// 存储财务数据结构的结构体typedef struct _fi_data可编辑范本fi_info info;struct _fi_data* next;} fi_data;fi_data *head;// 财务数据的头结点void menu();// 菜单函数void add_income();void search_income();void delete_income();void update_income();void add_payout();void search_payout();void delete_payout();void update_payout();void count_total();void quit();//void search_data(fi_type type); void delete_data(fi_type type); void update_data(fi_type type);//void initialize();void save_to_file(); void clear_data(); fi_data *get_last();fi_data *get_previous(fi_data *p); void input_info(fi_info *info); void show_info(fi_data *p); void menu(){printf("\n");printf("\t\t 收入管理 :"); printf("1. 添加收入 "); printf(" 2.查询收入明细 \n"); printf("\t\t\t 3. 删除收入 "); printf(" 4.修改收入 \n");printf("\t\t~~~~~~~~~~~~~~~~~~~~~~\n"); printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t\t家庭财务管理系统 \n");printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t \t* ******************************************\n"); \t***************************************** ;printf("\t\t 支出管理:");printf("5. 添加支出 "); printf(" 6.查询支出明细 \n"); printf("\t\t\t 7. 删除支出 "); printf(" 8.修改支出 \n");printf("\t\t 统 计:");printf("9. 统计总收入 / 总支出 \n");printf("\t\t 退 出 :0.退出系统 \n");}void main(){int selected=0; initialize();while(selected>=0&&selected<=9){system("cls"); menu();printf("\t\t> 请选择要进行的操作 (0-9):"); if(scanf("%d",&selected)!=1||selected<0||selected>9){printf("\t\t*******************************************\n");printf("\t\t*******************************************\n");printf("\t\t*******************************************\n\n\n");printf("\t\t> 输入有误!请选择(0-9)之间的数字!按任意键重试");getchar();}else{switch(selected){case 0:exit(0);clear_data();break;case 1:add_income();save_to_file();break;case 2:search_income();break;case 3:delete_income();save_to_file();break;case 4:update_income();save_to_file();break;case 5:add_payout();save_to_file();break;case 6:search_payout();break;case 7:delete_payout();save_to_file();break;case 8:update_payout();save_to_file();break;case 9:count_total();break;}}}}void add_income()// 添加收入{fi_data *p=(fi_data *)malloc(sizeof(fi_data));p->next=NULL;input_info(&(p->info));p->info.type=income;if(head==NULL)head=p;elseget_last()->next=p;}void add_payout()// 添加支出{fi_data *p=(fi_data *)malloc(sizeof(fi_data));p->next=NULL;input_info(&(p->info));p->info.type=payout;if(head==NULL)head=p;elseget_last()->next=p;}// 输入函数void input_info(fi_info *info){printf("\t\t> 请输入年月(YYYY/M)");scanf("%d/%d",&(info->year),&(info->month));printf("\t\t> 请输入家庭成员姓名(最大长度为%d):",MAXNAME-1); scanf("%s",info->name);printf("\t\t> 输入金额:");scanf("%f",&(info->money));printf("\t\t> 请输入备注(最大长度为%d):",20);scanf("%s",info->detail);}// 查找数据函数void search_data(fi_type type){int year=0;int month=0;fi_data *p=NULL;int count=0;char input=' ';while(1){printf("\t\t> 请输入要查询的年月(YYYY/M)");if(scanf("%d/%d",&year,&month)!=2){printf("\t\t> 输入有误\n");}else{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)) {show_info(p);system("PAUSE");count++;}p=p->next;}if(count==0){printf("\t\t> 没有找到数据\n");可编辑范本printf("\t\t> 继续查找其他数(y or n)"); 据?input=getchar();if(input=='y'||input=='Y') continue;elsebreak;}}}// 初始化函数,读取文本数据void initialize(){FILE * fp=NULL;fi_data *p=NULL;fi_data *last=NULL;int count=0;fp=fopen("data.txt","rb");if(fp==NULL){fp=fopen("data.txt","w");fclose(fp);return;}p=(fi_data*)malloc(sizeof(fi_data));memset(p,0,sizeof(fi_data));p->next=NULL;while(fread(&(p->info),sizeof(fi_info),1,fp)==1) { if(head==NULL)head=p;else{last=get_last();last->next=p;}count++;fseek(fp,count*sizeof(fi_info),SEEK_SET);p=(fi_data *)malloc(sizeof(fi_data));memset(p,0,sizeof(fi_data));p->next=NULL;}free(p);p=NULL;fclose(fp);}// 显示信息函数void show_info(fi_data *p){int i=0;printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");printf("|NO.\t | 年/ 月\t\t| 类型\t\t| 姓名\t\t| 金额\t\t| 备注\t\t|\n");printf("|%5d\t|%4d/%02d\t|%4s\t|%10s\t|%10.2f|%20s|\n",i+1,p->info.year,p->info.month,p->info.type==income?" 收入":"支出",p->,p->info.money,p->info.detail);printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");}// 统计总收入、总支出void count_total(){float total_income=0.0;float total_payout=0.0;fi_data *p=head;while(p!=NULL){if(p->info.type==income)可编辑范本total_income+=p->info.money;}else{total_payout+=p->info.money;}p=p->next;}printf("\t\t+\t\t+\t\t+\n");printf("\t\t| 合计收入\t| 合计支出\t| 结余\t|\n");printf("\t\t%12.2f|%12.2f|%12.2f|\n",total_income,total_payout,total_income-total_payout);printf("\t\t+\t\t+\t\t+\n");printf("\t\t> 按任意键返回主菜单");getchar();getchar();}// 保存到文件void save_to_file(){FILE *fp=fopen("data.txt","wb" );可编辑范本fi_data *p=head;while(p!=NULL){fwrite(&(p->info),sizeof(fi_info),1,fp);fseek(fp,0,SEEK_END);p=p->next;}fclose(fp);}// 修改信息函数void update_data(fi_type type){ int year=0;int month=0;fi_data *p=NULL;fi_data *pre=NULL;char input;int count=0;int i=0;while(1)(YYYY/M)");{ printf("\t\t> 请输入要查询的年月if(scanf("%d/%d",&year,&month)!=2){printf("\t\t> 输入有误\n");}else{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)) {count++;show_info(p);input_info(&(p->info));printf("\t\t 修改成功\n");p=get_previous(p);}p=p->next;}if(count==0)printf("\t\t> 没有找到数据\n");printf("\t\t> 继续查找其他数据?(y or n)");input=getchar();if(input=='y'||input=='Y')continue;elsebreak;}}}void delete_data(fi_type type)// 删除数据函数{int year=0;int month=0;fi_data *p=NULL;fi_data *pre=NULL;int count=0;char input=' ';int i=0;while(1){ printf("\t\t> 请输入要查询的年月(YYYY/M)");if(scanf("%d/%d",&year,&month)!=2){printf("\t\t> 输入有误\n");可编辑范本{p=head;count=0;while(p!=NULL){if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type)) {count++;show_info(p);pre=get_previous(p);if(pre==NULL)head=head->next;elsepre->next=p->next;free(p);printf("\t\t> 删除成功\n");}p=p->next;}if(count==0)可编辑范本printf("\t\t> 没有找到数据\n");(y or n)");printf("\t\t> 继续查找其他数据?input=getchar();if(input=='y'||input=='Y')continue;elsebreak;}}}void clear_data()// 清空链表数据{fi_data *p=NULL;while(head!=NULL){if(head->next!=NULL){p=head;head=head->next;free(p);p=NULL;else{free(head);head=NULL;}}}fi_data *get_last(){fi_data * p=head;if(p==NULL)return p;while((p!=NULL)&&(p->next!=NULL)) p=p->next;return p;}fi_data *get_previous(fi_data *p) {fi_data *previous=head;while(previous!=NULL){if(previous->next==p)break;previous=previous->next; }return previous;}void search_payout(){search_data(payout);}void delete_payout(){delete_data(payout);}void update_payout(){update_data(payout);}void search_income() {search_data(income);}void delete_income(){delete_data(income);}void update_income(){update_data(income);}[此文档可自行编辑修改,如有侵权请告知删除,感谢您的支持,我们会努力把内容做得更好]。