数据结构课程设计个人账簿管理系统.docx
《数据结构课程设计个人账簿管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计个人账簿管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计个人账簿管理系统
数据结构
课程设计报告
设计题目:
个人帐簿管理系统
专业班级12计科三
学生陈畅灿王飞芦泽奇董帅
学号201223089022012230890520122308912
20122308917
组长王飞
指导教师孙菁
起止时间2014.11-2014,12
目录
1、任务描述。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
2、问题分析。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
2.1设计基础。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
2.2分析设计课题的要求。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
3、课程设计目的。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
4、功能设计。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
4.1算法思想描述。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
3
4.2程序流程图。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
4.3程序模块数据结构。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
4
4.3.1菜单函数。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
5
4.3.2录入数据。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
6
4.3.3查询数据。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
4.3.4修改并查询数据。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
9
4.3.5删除并查询数据。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
11
5、程序调试及简要分析。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
12
6、心得体会及领悟。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
17
参考文献。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
18
1、任务描述
个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。
进入系统后可以输入和修改某月的收支情况,可以根据输入的月份查询每月的收支情况。
2、问题分析:
2.1设计基础:
掌握对文件的插入、删除、修改、排序等操作,建立一个文件,包括某人几月内的收支情况,能对文件中的信息进行扩充(追加),修改和删除,完成系统查询功能.
2.2分析设计课题的要求
◆个人帐务数据由每月的收入及各项开支构成,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等;
◆可以输入和修改某月的收支情况;
◆可以根据输入的月份查询每月的收支情况。
3、课程设计目的
这个课题具体包含对文件的插入、删除、修改、排序等操作,以及对数据元素的定义、调用等操作,在不断地尝试过程中,能够熟练地进行函数的编写和调用。
这一系列的操作,让我们熟悉对文件的操作,以及对学过的知识的掌握与
运用。
4、功能设计
4.1算法思想描述:
第一步——列出菜单
函数功能划分好,将对文件可进行的操作列成菜单,便于用户进行选择,让界面更友好。
第二步——输入数据
向文件内写入内容,让各元素都有初值。
第三步——根据要实现的功能,调用相应的函数
初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;相应的功能可调用相应的函数来实现。
第四步——建好主函数
建立一个好的主函数,将各功能都实现好。
4.2程序流程图
不符条件
符合
图1流程图
4.3程序数据结构模块结构:
由功能块可将程序划分为几个模块(即实现程序功能所需的函数):
◆菜单函数
◆录入数据函数(录入数据主要通过链式2维数组直接录入数据)
◆修改数据函数(修改数据主要通过链式2维数组直接录入数据)
◆查询数据函数
◆删除数据函数
4.3.1菜单函数
菜单函数通过menu()通过一个do--while语句,过滤掉错误的数字输入,即,当输入的数字大于4或者小于0的时候显示输入错误;再由一个swich语句,使菜单内选项可被输入的数字操控,即,可由输入的数字的不同而进行不同的操作。
menu函数:
voidmenu(void)
{
intitem;
intmon;
Infor*a;
a=(Infor*)malloc(sizeof(Infor));
do{
printf("\n…………个人帐簿管理系统设计…………\n\n");
printf("1.录入数据。
\n");
printf("2.修改数据。
\n");
printf("3.查询数据。
\n");
printf("4.删除数据。
\n");
printf("0.退出系统。
\n");
printf("请输入要进行的操作:
");
scanf("%d",&item);
}while(item>4||item<0);
swich()}
菜单界面显示如图2所示:
图2菜单界面
4.3.2录入数据
录入数据模块由两个函数input和writeinfor实现,input函数实现通过键盘输入需要记录的月份的具体花费和收入等信息的功能,writeinfor函数将从键盘上输入的信息存储在文件中,以便数据的查询、修改、删除等操作的进行。
input函数:
录入数据
voidinput(Infor*newI)
{
printf("食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用\n");
scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);
fflush(stdin);
}
writeinfor函数中包含文件的打开、关闭以及文件的创建和文件的读写。
通过一个if语句判断是否满足创建文件的条件,若无法创建文件,则跳出writeinfor函数,若创建成功,则将上一步input函数中输入的信息储存在创建好的文件中,并在显示屏上显示“数据录入成功”;fwrite(newI,sizeof(Infor),1,fp)函数阻止同一个月份的信息输入两次,若录入两次,则查询时打开的文件信息为第一次录入的信息,即,只有进行修改操作时才能更改录入的月份中的信息,用户不能妄想以重新输入的方式改变已经录入的数据信息。
writeinfor函数
voidwriteinfor(Infor*newI)
{
FILE*fp;
fp=fopen(FilePath1,"ab+");
if(fp==NULL)
{
printf("无法创建物件\n",FilePath1);
exit(0);
}
fwrite(newI,sizeof(Infor),1,fp);
fclose(fp);
printf("录入数据成功\n");
}
所用的数据结构:
fwrite()函数,new1相当于一个指针而存储的方式就如一个二维数组链式的存放数据。
数据录入成功界面如图3所示:
图3数据录入成功
4.3.3查询数据
查询数据模块中包含一个search函数,通过search函数查询已经录入成功的月份包含的数据信息,若输入的月份未经录入,则输出提示语句---“无法找到文件”,反之,则输出已经录入好的数据信息。
SStatussearch(Infor*a)
{
FILE*fp1;
intmon;
intisfound=0;
printf("请输入正确查询的月份\n");
scanf("%d",&mon);
fflush(stdin);
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件\n",FilePath1);
returnError;
}
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!
feof(fp1)){
if(a->month==mon)
{
isfound=1;
break;
}
else
{
isfound=0;
}
fread(a,sizeof(Infor),1,fp1);
}
fclose(fp1);
if(isfound)
returnOK;
else
returnNotFound;
}
查询数据界面如图4所示:
图4查询数据
所用的数据结构:
fread()函数,a相当于一个指针而存储的方式就如一个二维数组链式的存放或读取数据。
作用和fwrite()函数一样
4.3.4修改并查询数据
修改并查询数据模块中其主要作用的modify函数,它的作用是先打开文件,将文件内的与输入月份相对应的数据信息先显示出来,然后再将其修改并重新存入文件中。
修改之后再执行查询操作,显示在显示屏上的信息将变成修改后的信息。
voidmodify(Infor*a,intmon){
FILE*fp1,*fp2;
Infor*b;
b=(Infor*)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while(!
feof(fp1)){
if(b->month==mon)
{
fwrite(a,sizeof(Infor),1,fp2);
}
else
{
fwrite(b,sizeof(Infor),1,fp2);}
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);
rename("temp.dat",FilePath1);
printf("修改成功\n");
changeFormat();}
修改数据界面如图5所示:
图5修改后数据
4.3.4删除并查询数据
删除数据模块通过delRecord函数将录入至文件中的信息删除,删除后若再查询已删除月份的数据信息,显示屏上将显示“没有符合条件的记录!
”。
voiddelRecord(intmon){
FILE*fp1,*fp2;
Infor*b;
b=(Infor*)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rt");
fp2=fopen("temp.dat","wt+");
rewind(fp1);
fread(b,sizeof(Infor),1,fp1);
while(!
feof(fp1)){
if(b->month!
=mon)
fwrite(b,sizeof(Infor),1,fp2);
fread(b,sizeof(Infor),1,fp1);
}
fclose(fp1);
fclose(fp2);
remove(FilePath1);
rename("temp.dat",FilePath1);
printf("删除成功");
changeFormat();}
删除数据后查询界面如图8所示:
图8删除后查询数据
5、排序冒泡
通过二维数组来存入数据并排序,运用冒泡排序算法进行操作
voidpaixu(Infor*a)
{
inti=0,j=0,flag=0,t;
pTypepx[8]={{0,0}};
charstr[8][12]={"记录月份","食品消费","房租费用?
","子女费用","水电费用","医疗费用","储蓄费用","本月收入"};
for(;i<8;i++)
px[i].no=i;
px[0].data=a->month;
px[1].data=a->spxf;
px[2].data=a->fzfy;
px[3].data=a->znjy;
px[4].data=a->sdfy;
px[5].data=a->ylfy;
px[6].data=a->cxfy;
px[7].data=a->srfy;
for(i=1;i<8;i++)//冒泡排序
{
flag=0;
for(j=0;j<8-i;j++)
if(px[j].data>px[j+1].data)
{
t=px[j].data;
px[j].data=px[j+1].data;
px[j+1].data=t;
t=px[j].no;
px[j].no=px[j+1].no;
px[j+1].no=t;
flag=1;
}
所用的数据结构:
定义一个链式的二维数字组来存储数据,在通过for()语句来进行排序。
6、程序调试及简要分析
程序调试主要针对input函数
程序原始input函数:
voidinput(Infor*newI)
{
printf("食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用\n");
scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);
fflush(stdin);
}
调试1.
经过长时间的程序分析,我和同组组员发现程序内无判断月份输入是否合法的语句,所以我们进行了第一次调试,在input函数中添加了一个while语句以判断输入月份的合法性。
经第一次调试后的input函数:
voidinput(Infor*newI)
{
printf("\n请依次输入数据:
\n(食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用)\n");
scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);
fflush(stdin);
}
运行结果如图10所示:
图10第一次调试后的结果
调试2:
由图我们可知,这次调试后的结果虽然避免的输入不合法的月份信息,但是,却带来了新的问题,while语句进入了死循环,用户将无法进行其他的操作。
通过对程序的进一步研究,我们发现,while语句运行的条件是当满足while后面括号内的信息时就进入循环,而我们输入月份的语句在while语句之外,即,整个函数只可能执行一次input函数,即此次调试后,我们只能输入一次月份值,而当这个月份值满足while语句的条件时,我们将无限循环while语句内的操作,即,进入了死循环。
所以,我们进行了第二次调试,将while语句替换成if语句。
经第二次调试后的input函数:
voidinput(Infor*newI)
{
printf("食品消费房租费用子女费用水电费用医疗费用储蓄费用收入费用\n");
scanf("%d%d%d%d%d%d%d%d",&newI->month,&newI->spxf,&newI->fzfy,&newI->znjy,&newI->sdfy,&newI->ylfy,&newI->cxfy,&newI->srfy);
fflush(stdin);
}
运行结果如图11所示
图11保存至文件中
7、心得体会及领悟
这次课程设计也让我懂得了团结合作的重要性,这次课程的完成依赖于我的同伴,以及我们之间的默契,这次课程设计让我知道了我在C语言、C++方面的缺陷,以及我那粗心的态度。
像这个个人账簿管理的程序设计,包含我们这一年半时间学过的内容,最主要的是第一学年所学的文件知识,文件的创建、修改、打开以及关闭等功能。
这次课程设计,使得我将差不多已经遗忘的知识点又从记忆边缘拉了回来,可以说是起到了温故而知新的效果,所以,我认为,课程设计是必须的,是有助于我们将知识点巩固起来的一种方法。
在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我们收获的是黎明。
参考文献:
数据结构C语言版清华大学出版社
C语言程序设计清华大学出版社
C++面向对象课程教程清华大学出版社