C语言程序设计实验报告

更新时间:2023-05-13 11:30:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

家庭财务管理系统

安阳工学院

C 语言 课 程 设 计

课程题目:家庭财务管理系统

院 系:计算机科学与信息工程学院 专业班级:11级计算机科学与技术(嵌入方向) 姓 名:吕鹏

学 号:201103010042 QQ 号码:1476265623 指导老师:高原

家庭财务管理系统

完成时间:公元二零一二年六月十五

课 程 设 计 任 务 书

家庭财务管理系统

工作计划: 1. 小组审题,查阅资料,进行设计前的必要资料准备(2 天) 。 2. 把程序完整运行出来(3 天) 。 3. 增加改进程序(2 天) 。 4. 写课程设计报告(2 天) 。 5. 提交课程设计报告及答辩(1 天) 任务下达日期:2012 任务完成日期:2012 年 6 月 1 日 年 6 月 15 日 指导教师(签名) : 学生(签名) :

吕鹏

家庭财务管理系统一、设计要求1.要求使用多文件方式实现设计. 2.要求在各个文件内实现结构化设计. 3.每个模块作为一个单独的 C 文件. 4.宏和数据结构等放在头文件中,并使用条件编译.

二、系统的功能模块 根据设计要求,学生成绩管理系统功能模块如图 2-1 所示。

家庭财务管理系统

收入管理

支出管理

统计

退出

添对 加法 收 入

查 删 除 询 收 收 入 图 2—1 入 明 细 反

修 改 收 入

添 加 支 出

查 询 支 出 明 细

删 除 支 出

修 改 支 出

家庭财务管理系统

三、数据结构定义及描述#define MAX_NAME 11/*家庭成员姓名最大长度*/ #define MAX_DETAIL 21/*备注最大长度*/ #define MENU_COUNT 9 /*菜单选项个数*/

#define DATA_FILE "fs.dat"/*数据文件文件名*/ typedef enum _fi_type /*自定义枚举型表示收入收出*/ { income = 1,/*收入*/ payout = -1/*支出*/ }fi_type; typedef struct _fi_info/*储存家庭财务信息的结构体*/ { int year;/*年*/ int month;/*月*/ fi_type type;/*数据类型*/ char name[MAX_NAME];/*家庭成员姓名*/ float money;/*收入或支出金额*/ char detail [MAX_DETAIL];/*备注*/ }fi_info; typedef struct _fi_data/*储存财务数据结构

的结构体*/ { fi_info info;/*财务数据*/

家庭财务管理系统

每个家庭成员的财务讯息用结构体 fi_info 来储存,用结构体 fi_date 来储存财务的数据,其中 MAX_NAME, 家庭成员姓名的长度, MAX_DETAIL 来限定备注的长度。 用 其中 struct _fi_data*next; 来表示指向下一个节点的指针,用于方便操作。

四、函数功能及参数说明、相互调用关系根据功能模块划分,学生成绩管理系统需建立的文件、各文件所包含的函数以及 各函数的相互调用关系下表所示。

源函数

menu

函数名称 quit add_income search_income delete_income updete_income add_payout search_payout delete_payout updete_payout count_total 表4-1

函数功能 退出系统 添加收入 查询收入明细 删除收入 修改收入 添加支出 查询支出明细 删除支出 修改支出 统计总支出收入

总控函数

main()

函数名称 search_date delete_date

函数功能 查询处理 删除处理

家庭财务管理系统

函数名称 initialize save_to_file() clear_date() 辅助函数 fi_date* get_last fi_date* get_previous input_info show_info fi_data*head

函数功能 系统初始化 将财务数据保存到文件 清空链表中的数据 得到财务链表最后一个节点 取得财务数据节点的前一个节点 输入财务数据信息 显示财务数据 财务数据的头节点

图 4-3五、各变量的定义和作用

#define MAX_NAME 11/*家庭成员姓名最大长度*/ #define MAX_DETAIL 21/*备注最大长度*/ #define MENU_COUNT 9 /*菜单选项个数*/

#define DATA_FILE "fs.dat"/*数据文件文件名*/ typedef struct _fi_info/*储存家庭财务信息的结构体*/ { int year;/*年*/ int month;/*月*/ fi_type type;/*数据类型*/ char name[MAX_NAME];/*家庭成员姓名*/ float money;/*收入或支出金额*/ char detail [MAX_DETAIL];/*备注*/

家庭财务管理系统

主函数(main())在此文件的主要功能是根据用户输入不同的值, 调用对应的处理 函数,用户输入的数值与之对应的处理函数如下图所示。 主函数 main(),输入不同的数值调用不同的处理函数 数 1 值 调 添 加 查 询 收 删除 修 改 添 加 查 询 删 除 支 修 改 统 计 退出系统 用 收入 函 数 功 能 调 add_ 用 inco 函 me 数 类 型 输入错误后,请选择 0-9 的任意数重试 Search_ income dele te_ inco me updat e_ incom e add_ payou t searc h_ payou t delete_ payout updat e payou t count total quit 入明细 收入 收入 支出 支 出 出 明细 支出 总 支 出 收 入 2 3 4 5 6 7 8 9 0

2、search_date该函数的功能是收入和支出的查询操作。提示用户按照指定的格式输入要 查询的年月,如果用户输入错误,给出相应的提示信息,如果用户输入正确, 则在单链表中查询该年月的收入信息。如果查询成功,判断查询的个数是否 小于九,调用函数 show_info 显示找到的收入信息;如果大于 9,按空格键进

家庭财务管理系统

3、delte_data该函数的功能为收入和支

出的删除操作,首先提示用户输入要删除收入 的年月,然后根据用户收入的年月信息在单链中查找相关的信息,如果查找 成功,且查找的数据小于 9,直接调用 show_info()h 函数显示查找到的收入 信息;如果查到的信息大于九条,则按空格键翻页。最后提示用户输出要删 除的收入信息的序号,完成删除操作。如果查找不成功,给出相应的提示信 息。提示用户是否继续删除操作,如果输入 Y 或 Y,则在进行操作,否则返 回主菜单界面。 七、改进或增加功能模块说明1、在程序中增加了设置密码选项,只有用户输入自己的密码才能进行各种操作,程序如下 #include<string.h> int main() { struct data { int i; char ch[20]; char name[20]; }dt; FILE * fp; char shuru[20]; char ch; char c; if((fp=fopen("aa.dat","w"))==NULL) { printf("Can not open 《aa.dat》file!\nPlease set up this file in same directory!\n"); printf("按回车键退出......\n"); ch=getchar();

家庭财务管理系统

fread(&dt,sizeof(struct data),1,fp); if(dt.i==2) { printf("请输入密码:"); gets(shuru); if(strcmp(shuru,dt.ch)==0) { main_1(); } else { printf("password error!\n"); printf("是否重设密码: Y N \n"); scanf("%c",&ch); c=getchar(); if(ch=='Y'||ch=='y') { printf("请输入用户名:"); gets(shuru); if(strcmp(shuru,)==0) { fp=fopen("aa.dat","w"); printf("**********************提示**********************\n"); printf("*账户已清除(原储存资料未清除)!请重设账户与密码!*\n"); printf("************************************************\n"); printf("按回车键退出......\n"); ch=getchar(); } } } fclose(fp); } else { if(dt.i!=2) { printf("首次登陆(或已清除账户),请设置用户名及密码\n"); printf("请输入用户名(为找回密码而设):");

家庭财务管理系统

scanf("%s",dt.ch); ch=getchar(); if((fp=fopen("aa.dat","w"))==NULL) { printf("can not open!"); exit(0); } dt.i=2; fwrite(&dt,sizeof(struct data),1,fp); fclose(fp); main_1(); } } return 0; }

//接收最后的回车字符

增加此程序后可以提高系统的安全系数以及可操作性。 八、程序测试 1、系统运行后,需要输入密码后才能进入主界面。允许用户输 入 0—9 的不同数字,以实现不同的操作。输入密码界面和主界面如 图 8-1,8-2 所示。

家庭财务管理系统

图 8-2 管理系统主菜单界面

2、添加收入信息进入主菜单界面后,输入数字 1,进入添加信息操作,用户根据提示的信息输入 年月,家庭成员姓名、输入明细和备注信息,输入完成后返回主界面。输入信息情 况如 8-3 所示。

家庭财务管理系统

界面

家庭财务管理系统

5、修改收入信息 在主菜单中输入 4,则进行修改信息的操作,系统提示要查询的年月,修改收入信息的操作界 面如 8-6 所示。

图 8—6 修改输入信息 6、添加支出信息以及查询支出信息 在菜单中输入 5,进入添加支出信息操作,输入信息和查询支出情况如 8-7,8-8 所示。

家庭财务管理系统

图 8-8 查询支出信息 7、修改支出信息 在主菜单中的输入 8,进行修改支出操作,修改支出的信息的界面如图 8-9 所示

图 8-9 修改后的数据 8、在主菜单中输入 9,进行总收入和总支出信息的操作,操作界面如 8-10 所示。

家庭财务管理系统

九、程序设计过程中遇到的问题及解决过程

1.对程序整体理解,但在设计过程中,细节问题处理不当,造成程序不能运行或者运行错误,并且,对某一部分的程序不能独立设计出来。

对此问题的解决是参考了《c程序设计课程设计》上的参考程序,完成了设计,但是不是一味的照搬,对参考程序进行了修改和添加。增加了按成绩区间查询的查询方式,增加了按总成绩排序的排序方式。

家庭财务管理系统

2.在组建工程的时候,将各个程序分给小组成员,两个人设计一个模块,但是出现了连接错误,各个模块之间也出现了输入上的错误,致使程序不能运行。 对于各个模块逐一检查,添加修改,最终使各个模块错误消除,同时连接错误也自行解决。

3.在刚开始程序设计的时候,不了解什么是组建工程,什么是模块,对于程序设计本身也有不理解的地方,不知道该从何下手。

解决方法:先看《c程序设计课程设计》,了解怎样组建工程,理解每个模块的作用,弄清楚参考程序上的逻辑顺序以及如何设计等问题,然后再进行课程设计。

十、课程设计心得及体会

对于第一次做课程设计的我来说,这次的课程设计是一次既让人痛苦又让人开心的事情。开始的时候根本不清楚课程设计要设计什么,不知道到底怎样设计,因为平时所写的c程序都是一些简单而且基本的C程序,根本不是解决实际情况,符合客户要求的工程程序,所以觉得无从下手,觉得很困难,甚至没有一个思路,而且对于组建工程,构建模块等工作无法理解。这些情况都使自己陷入了苦恼的深渊。

后来,听从辅导老师的意见,从《C程序设计课程设计》开始,一点点了解怎样组建工程,怎么样构建模块,对于每个模块应该怎么样进行设计,逻辑思维是什么,然后开始构建。

在设计过程中一直都有错误存在,困难重重。遇到困难就开始用大量的时间进行修改以及整理,理出思路。最终将工程调试成功,添加模块成功,而这些成功的瞬间是最快乐最开心的时刻。

而且通过这次课程设计我学会了好多东西,觉得自己设计的东西更加接近实际的程序要求。知道团队合作的重要性,知道怎样使团队一起合作构建程序。

总的来说,我获益匪浅。

十一、参考文献

[1] 梁旭等.《C程序设计课程设计(第2版)》 电子工业出版社,2011

家庭财务管理系统

[2] 刘振安等.C程序设计课程设计,机械工业出版社,2007 [3] 谭浩强.C程序设计(第五版),清华大学出版社,2011

十二、源程序

#define MAX_NAME 11 #define MAX_DETAIL 21 #define MENU_COUNT 9 #define DATA_FILE "fs.dat" #define MAX_USERNAME 10 typedef enum _fi_type {

income = 1, payout = -1

}fi_type;

typedef struct _fi_info {

int year;

int month; fi_type type;

char name[MAX_NAME]; float money;

char detail [MAX_DETAIL];

}fi_info;

typedef struct _fi_data { fi_info info; struct _fi_data*next; }fi_data;

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_all(); void main_1();

家庭财务管理系统

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_info* p); void input_info(fi_info* info); void show_info(fi_data* p[],int count); fi_data* head; char menu[]=

"|================================================================|\n" "| 吕鹏 家庭财务管理系统 |\n" "+----------------------------------------------------------------+\n"

"| 收入管理 |\n" "| <1>添加收入 |\n" "| <2>查询收入 |\n" "| <3>删除收入 |\n" "| <4>修改收入 |\n" "| 支出管理 |\n" "| "| "| "|

<5>添加支出 <6>查询支出 <7>删除支出 <8>修改支出

|\n" |\n" |\n" |\n"

//修改项

"| 统计 |\n" "| <9>统计收支 |\n" "+----------------------------------------------------------------+\n"

"| 退出 <0>退出系统 |\n" "+----------------------------------------------------------------+\n" "+------+\n"

"+----------------------------------------------------------------+\n"; void (* menu_fun[])()= {

quit,

add_income, search_income, delete_income, update_income, add_payout, search_payout, delete_payout, update_payout, count_total

家庭财务管理系统

#include<stdio.h> #include<stdlib.h> #include<string.h> int main() {

struct data {

int i; char ch[20];

char name[20]; }dt;

FILE * fp; char shuru[20]; char ch; char c;

if((fp=fopen("aa.dat","w"))==NULL) { printf("Can not open 《aa.dat》file!\nPlease set up this file in same directory!\n");

printf("按回车键退出......\n"); ch=getchar();

exit(0); }

fread(&dt,sizeof(struct data),1,fp); if(dt.i==2) {

printf("请输入密码:"); gets(shuru);

if(strcmp(shuru,dt.ch)==0) { } else {

printf("password error!\n");

printf("是否重设密码: Y N \n"); scanf("%c",&ch); c=getchar();

if(ch=='Y'||ch=='y') {

printf("请输入用户名:"); gets(shuru);

if(strcmp(shuru,)==0) { main_1();

家庭财务管理系统

}

} else { }

}

}

}

printf("**********************提示**********************\n"); printf("*账户已清除(原储存资料未清除)!请重设账户与密码!*\n"); printf("************************************************\n"); printf("按回车键退出......\n"); ch=getchar();

fclose(fp);

if(dt.i!=2)

{

printf("首次登陆(或已清除账户),请设置用户名及密码\n"); printf("请输入用户名(为找回密码而设):"); scanf("%s",); printf("请输入密码:"); scanf("%s",dt.ch); ch=getchar();

//接收最后的回车字符

if((fp=fopen("aa.dat","w"))==NULL) { printf("can not open!"); exit(0); }

dt.i=2;

fwrite(&dt,sizeof(struct data),1,fp); fclose(fp); main_1(); }

return 0;

void initialize() {

FILE* fp = NULL; fi_data* p = NULL; fi_data* last = NULL; int count = 0;

fp = fopen(DATA_FILE,"rb"); if(fp==NULL) { fp = fopen(DATA_FILE,"wb");

家庭财务管理系统

}

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) { } else {

last = get_last(); last->next = p; head=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 add_income() { fi_data* p = (fi_data*)malloc(sizeof(fi_data));

memset(p, 0, sizeof(fi_data)); p->next = NULL; input_info(&(p->info)); p->info.type = income; if(head==NULL) { } else {

get_last(head)->next = p; head = p;

} }

//查询收入明细

本文来源:https://www.bwwdw.com/article/izge.html

Top