当前位置:文档之家› c语言课程设计报告答辩上交

c语言课程设计报告答辩上交

青岛理工大学 《C语言程序设计》

题目 家庭财务管理系统

指导教师: 王金龙 姓名: 吴玮 学号: 201007133 班级: 网络102 专业: 网络工程 地点: 多媒体楼207 时间: 6.27 至 7.01 一、内容 家庭财务管理系统主要是对家庭成员的收入,支出,进行添加,删除,查询等操作,并能统计总收入和总支出。该软件给家庭成员提供了一个管理家庭财务的平台。 1)菜单设计:本系统提供简单易操作的界面。有提示,帮助用户根据需要对家庭财务管理系统进行操作。 2)添加模块:根据实际的收入或支出,添加相应的记录,条数不限。 3)查询模块:可以选择不同关键字输入,查找该条记录。 4)删除模块:若某条记录错误或者不需要则可以删除。 5)显示模块:按照添加的先后顺序依次把记录显示在屏幕上,并显示总收入和总支出以及余额。 6)退出模块:退出财务管理系统并保存文件。 )

二、上机环境 操作系统:windows XP 开发工具:VC6.0++

三、函数调用关系图

开始 打开文件,载入信息

菜单界面

1 添 加联系

2 查询联系3 删除联系4 显示联系0 退出

保存

结束 四、各函数功能说明 1.系统主要函数及功能。 1.)add函数:功能为添加收入或支出的记录 2.)search函数:功能为查找联系人 输入关键字,从文件中搜索相应的记录并显示出来。 3.)delete_rec函数:功能为删除记录 若某条记录错误或者不需要则可以删除。 4.)show函数:功能为显示记录,将添加的记录显示在屏幕上。 5.)quit函数:功能为保存信息退出系统。

五、算法描述 添加:在主菜单选择添加选项后,系统会依次让用户输入年月日,并且限定月份输入时要在1至12内,如果符合要求则继续执行,输完整条记录。动态链表会根据用户的使用情况动态调整内存大小。插入一个结点到已有链表后,head指向插入的结点,该结点指向head原来所指的结点。每添加一条记录后接点随即加一。 查询:在主菜单选择查询选项后,选择查询方式,1.按姓名查 2.按备注查。然后按提示输入相应的信息姓名(或备注),系统会根据信息用一个指针从这个链表的第一个结点依次往后开始查询,若某个结点符合则输出该记录的信息,若指向NULL即最后一个结点也查询完毕依然没找到,则返回主菜单。

删除:输入需要删除的姓名和金额,系统会根据信息用一个q指针从这个链表的第一个结点

依次往后开始查询,并将已查询过的结点赋给另一个p指针。若某个结点符合则显示该记录的信息,并让用户再次确认是否删除。若指向NULL即最后一个结点也查询完毕依然没找到,则则返回主菜单。如果确定删除该结点,则q所指的结点的前一个结点(即p所指的结点)指向该接点所指向的下一个结点,也就是将q所指的结点从原来的链表中分离出来。每删除一条记录后接点随即减一。 六、程序运行效果图 1.添加联系人 添加记录时限定月份在1~12月之间,否则无法添加,每添加一条记录后就返回主菜单,链表中插入了该结点。

2查询联系人 查询记录时,可以选择备注或者姓名进行查找。若选择按姓名查找,则在输入名字后,系统会根据添加的先后顺序,在屏幕上依次显示出该联系人的全部记录。

3 删除联系人 选择删除选项后,界面会让使用者输入要删除者的姓名及金额,并根据输入的信息显示该条记录,并且为了防止意外删除而有提示是否删除,经使用者再三确认后便删除该记录。

4 显示联系人

在菜单中选择显示选项后,系统会把所有的记录按照先后顺序依次逐条显示在界面上,并且还计算出了一共的收入,一共的支出及当前余额。

5退出 在菜单中选中该选项后,系统会把所有的资料都保存到文件中,然后关闭该系统。

七、总结 本次对家庭财务管理系统的编写,我遇到了许多困难。主要原因不怎么擅长使用“指针”。在添加模块中,由于没有很好的理解指针中插入的专用句子,所以脱离书本的时候根本不知怎么开始,自己想了很久也没想出来,后面翻了书,把相关的句子抄上去后死记硬背了下来。p->next=head;head=p;在添加节点数是,未强调Recordcount数据类型。在写删除模块是也遇到了类似的问题。看了书上的一个例题,里面有两个指针,可是我的代码中只有一个,怎么办呢?模仿了书上的写法,第一次以失败告终,经过很多种修改后总结出失败的原因是该指针定义错误,针对该错误,经过很多的尝试终成功了。在显示函数中,自我感觉没有错误 了,可是每次在“一共收入,一共支出,当前余额”后面都显示了一长串数字,在快放弃时终于发现自己犯了一个很可笑的错,printf语言中居然用了取地址符。在保存函数中也犯了一些常见的错,在写入文件中居然用了fscanf语句。

八、参考文献 谭浩强.C程序设计(第四版).清华大学出版社。 九、程序清单(双列排版,小五号字) #include #include #include struct F_Data { int year; //年 int month; //月 int data; //日期 float amout; //金额 char name[20]; //姓名 int type; //收入或支出类型 char comment[100]; //备注 struct F_Data*next; //定义一个指针 }; void main() { int i,w=1; void add(); void search(); void delete_rec(); void show(); do { printf("***********************************\n"); printf("欢迎使用家庭财务管理系统\n"); printf("1:添加记录\n"); printf("2:查询记录\n"); printf("3:删除记录\n"); printf("4:显示所有记录\n"); printf("0:退出\n"); scanf("%d",&i); switch(i) { case 1:add();break; case 2:search();break; case 3:delete_rec();break; case 4:show();break; } }while(w==1); }

void add() { system("cls"); /*清屏*/ int Recordcount; struct F_Data*head; struct F_Data *p=NULL; /*定义pNode为struct F_Data类型指针*/ p=(struct F_Data*)malloc(sizeof(struct F_Data)); /*运行时动态调整所占内存 的大小*/ printf("请输入年份:"); scanf("%d",&p->year); printf("请输入月份:"); scanf("%d",&p->month); if((p->month>0)&&(p->month<13)) /*限定月份为1~12 */ { printf("请输入日期:"); scanf("%d",&p->data); printf("请输入金额:"); scanf("%f",&p->amout); printf("请输入姓名:"); scanf("%s",p->name); printf("收入按1,支出按0:"); scanf("%d",&p->type); printf("请输入类型:"); scanf("%s",p->comment); p->next=head; /*插入一个结点 */ head=p; Recordcount++; /*结点数加一 */ } system("PAUSE"); /*停顿*/ } void search() { system("cls"); /*清屏*/ struct F_Data*head; char name[20]; int type; int choice; struct F_Data*p=NULL; /*定义pNode为struct F_Data类型指针*/ printf("1按姓名查找\n2按备注查找\n "); printf("请输入你的选择:"); scanf("%d",&choice); if(choice==1) { printf("请输入姓名:"); scanf("%s",name); for(p=head;p!=NULL;p=p->next) /*从链表的第一个结点到尾结点 */ if(strcmp(p->name,name)==0) /*如果输入的name和结点中的name一样 */ { printf("%d\t",p->year); printf("%d\t",p->month); printf("%d\t",p->data); printf("%.2f\t",p->amout); printf("%s\t",p->name); printf("%d\t",p->type); printf("%s\n",p->comment); } } if(choice==2) { printf("请输入类型:1收入 0支出\n "); scanf("%d",&type); for(p=head;p!=NULL;p=p->next); if(p->type==type) /*如果输入的type和结点中的type一样 */ { printf("%d\t",p->year); printf("%d\t",p->month); printf("%d\t",p->data); printf("%.2f\t",p->amout); printf("%s\t",p->name); printf("%d\t",p->type); printf("%s\n",p->comment); } } system("PAUSE"); /*停顿*/ } void delete_rec() { system("cls"); /*清屏*/ struct F_Data*head; int Recordcount; char name[20]; float amout; int choice; struct F_Data *p=NULL,*q=NULL; /*定义p和q都为struct F_Data类型指针*/ p=head; /*p指向第一个结点 */ q=head; /*q指向第一个结点 */ printf("请输入要删除者的姓名:"); scanf("%s",name); printf("请输入金额:"); scanf("%f",&amout); for(;q!=NULL;q=q->next) /*q指针从链表的第一个结点到尾结点 */ { if((head->amout==amout)&&(strcmp(head->name,name)==0)) /*如果头结点符合要求 */ { printf("%d\t",q->year); printf("%d\t",q->month); printf("%d\t",q->data); printf("%.2f\t",q->amout); printf("%s\t",q->name); printf("%d\t",q->type); printf("%s\n",q->comment); printf("确认删除?\n 1是\n 2否

相关主题