资源描述
计算机学院信管专业
数据结构课程设计
题 目: 个人帐簿管理系统设计
班 级:
姓 名: 学 号:
同组人姓名:
起 迄 日 期
课程设计地点:
指导老师:
评阅意见:
成绩评定:
评阅人: 日期:
完成日期:12月
目录
第一章 序言……………………………………………………2
第二章 系统功效分析…………………………………………2
1. 功效…………………………………………………………2
2. 要求…………………………………………………………2
3. 系统功效需求………………………………………………2
第三章 总体设计………………………………………………3
1. 系统设计…………………………………………………………3
2. 分块设计…………………………………………………………3
第四章 调试结果和测试分析…………………………………9
1. 主界面……………………………………………………………10
2.录入数据……………………………………………………………10
3.查看数据……………………………………………………………11
4.修改数据……………………………………………………………11
5.查询数据……………………………………………………………11
6.排序数据……………………………………………………………12
7.删除数据……………………………………………………………12
第五章 总结(心得体会)………………………………………12
第六章 参考文件………………………………………………13
第七章 致谢……………………………………………………14
第八章 附录……………………………………………………14
第一章 序言:
程序设计过程有如处理一个实际问题,从处理实际问题角度,我们能够这么来看:首先要了解这个问题基础要求,即输入、输出、完成从输入到输出要求是什么;其次,从问题要害入手,以前到后处理问题每个方面,即从输入开始入手,着重考虑怎样从输入导出输出,在这个过程中,可确定所需变量、数组、指针、链表、命令、函数,然后确定处理过程--算法。可得最终结果
这次我们组要处理实际问题是个人账簿管理系统设计,我们将严格根据程序设计过程来完成这一个课题设计
第二章 系统功效分析
1. 功效:
个人帐簿管理系统统计某人每个月全部收入及各项开支情况,包含食品消费,房租,儿女教育费用,水电费,医疗费,储蓄等。进入系统后能够输入和修改某月收支情况,能够对每个月开支从小到大进行排序,能够依据输入月份查询每个月收支情况。
2. 要求:
1)界面友好,函数功效要划分好
2)总体设计应画一步骤图
3)程序要加必需注释
4)要提供程序测试方案
5) 程序一定要经得起测试,宁可功效少部分,也要能运行起来,不能运行程序是没有价值。
3. 系统功效需求分析
1.文件操作功效:自动加载和保留数据文件。
2.数据输入功效:能够按提醒录入各项数据。
3.数据修改功效:能够按提醒修改各项数据。
4.查询功效:可按月份、食品消费进行特定查询,及显示全部数据。
5.排序功效:完成对每个月开支排序。
6.删除功效:能够按提醒删除部分数据。
7.转码功效:我们对文件用是dat形式,设计转码功效,将它转为txt形式。
第三章 总体设计
1. 系统分析
按系统分析功效要求将系统划分为以下多个关键功效模块:
结构图 主菜单
录入数据
修改数据
查询数据
删除数据
排序
退出
2. 分块设计
1)主界面设计
void menu(void)
{
int item;
int mon;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
do{
printf("…………个人帐簿管理系统设计…………\n");
printf("1.录 入 数 据\n");
printf("2.查 看 数 据\n");
printf("3.修 改 数 据\n");
printf("4.查 询 数 据\n");
printf("5.排 序 数 据\n");
printf("6.删 除 数 据\n");
printf("7.退 出 系 统\n");
printf("请输入要进行操作: " );
scanf("%d",&item);
}while(item>6 || item<-1);
2)录入功效设计
void input(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); }
3)修改功效设计
void modify(Infor *a,int mon)
{
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();
}
4)查询功效设计
Status search(Infor *a)
{
FILE *fp1;
int mon;
int isfound=0;
printf("请正确输入要查询月份:");
scanf("%d",&mon);
fflush(stdin);
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件:%s\n",FilePath1);
return Error; //返回主函数
}
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)
return OK;
else
return NotFound;
}
5)删除功效设计
void delRecord(int mon)
{
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("删除数据成功!\n" );
changeFormat();
}
6)排序功效设计
void paixu(Infor *a)
{
int i=0,j=0,flag=0,t;
pType px[8]={{0,0}};
char str[8][10]={"统计月份","食品消费","房租费用","儿女费用","水电费用","医疗费用","储蓄费用","本月收入"};
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;
}
if(flag==0) break;
}
printf("\n");
for(i=0;i<8;i++)
{
printf(" %s",str[px[i].no]);
}
printf("\n----------------------------------------------------------------------- \n");
for(i=0;i<8;i++)
{
printf("%8d ",px[i].data);
}
printf("\n");
}
第四章 调试结果和测试分析
1. 主界面
2. 录入数据
3. 查看数据
4. 修改数据
5. 查询数据
6. 排序数据
7. 删除数据
第五章 总结(心得体会)
在这次课程设计,我发觉了自己还有很多不足,在数据结构操作方面还有很多不会。还需要愈加深入学习。
经过此次课程设计,在大一C语言学习基础上,我较为深入掌握了数据结构和算法设计方法,含有了一定独立分析和设计能力和初步掌握软件开发过程问题分析、系统设计、程序编码、测试等基础方法和技能。
第六章 参考文件
1. 严蔚敏 吴伟民《数据结构》(C语言版)清华大学出版社
2.催俊凯。计算机软件基础。机械工业出版社。.7
3.唐发根。数据结构教程(第二版)。北京航空航天大学出版社。.5
4.谭浩强。C程序设计(第三版)。清华大学出版社。
5.王宏生,宋继红。数据结构。北京:国防工业出版社,.1
6.李建学,李光元,吴春芳。数据结构课程设计案例精编(用C/C++描述)。北京:清华大学出版社。.2
第七章 致谢
感谢队友帮助,在我部分不懂地方给了我立即帮助
感谢席老师教导,在有些方面自己和同组人还有好多不会,不过经过老师教导还是成功编写了出来
第八章 附录
源程序:#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <windows.h>
//文件保留路径
#define FilePath1 "Myinfor.dat"
#define FilePath2 "Myinfor.txt"
//查询用申明
#define Status int
#define OK 1
#define Error 0
#define NotFound 2
typedef struct {
int month;//月份
int spxf;//食品消费
int fzfy;//房租费用
int znjy;//儿女教育费用
int sdfy;//水电费用
int ylfy;//医疗费用
int cxfy;//储蓄费用
int srfy;//收入费用
} Infor;
typedef struct {// 查询用自定义数据类型
int no;
int data;
}pType;
void menu(void); //菜单
void input(Infor *newI); //接收键盘输入
void writeinfor(Infor *newI);//向文件内写入内容
void changeFormat(void );//将dat格式文件转换为txt文件
Status search(Infor *a);//查询函数[返回查询结果及查询状态]
void paixu(Infor *a);//对查询据结果排序
void modify(Infor *a,int mon);//修改数据
void delRecord(int mon);//删除数据
void main()
{
while(1)
{
menu();
}
}
void menu(void)
{
int item;
int mon;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
do{
printf("…………个人帐簿管理系统设计…………\n");
printf("1.录 入 数 据\n");
printf("2.查 看 数 据\n");
printf("3.修 改 数 据\n");
printf("4.查 询 数 据\n");
printf("5.排 序 数 据\n");
printf("6.删 除 数 据\n");
printf("7.退 出 系 统\n");
printf("请输入要进行操作: " );
scanf("%d",&item);
}while(item>6 || item<-1);
switch(item)
{ //退出程序
case 0: getchar();
getchar();
exit(1);
break;
//录入数据
case 1: input(a);
writeinfor(a);
break;
//查看数据
case 2: changeFormat();
break;
//修改数据
case 3: item=search(a);
mon=a->month;
if (item!=OK) printf("\n没有符合条件统计!\n");
else
{
printf("\n录月份 食品消费 房租费用 儿女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");
printf("----------------------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d/n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy,a->cxfy,a->srfy);
input(a);
modify(a,mon);
}
break;
//查询数据
case 4: item=search(a);
if (item!=OK) printf("\n没有符合条件统计!\n");
else{
printf("\n统计月份 食品消费 房租费用 儿女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");
printf("----------------------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d/n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy,a->cxfy,a->srfy);
}
break;
//排序数据
case 5: item=search(a);
if (item!=OK) printf("\n没有符合条件统计!\n");
else
paixu(a);
break;
//删除数据
case 6:
item=search(a);
mon=a->month;
if (item!=OK) printf("\n没有符合条件统计!\n");
else
{
printf("\n统计月份 食品消费 房租费用 儿女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");
printf("----------------------------------------------------------------------- \n");
printf("%7d %8d %8d %8d %8d %8d %8d %8d/n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy,a->cxfy,a->srfy);
delRecord(mon);
}
break;
}
free(a);//释放内存空间
}
void input(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);
}
void writeinfor(Infor *newI)
{
FILE *fp;
fp=fopen(FilePath1,"ab+");
if(fp==NULL)
{
printf("无法创建文件:%s",FilePath1);
exit(0);
}
fwrite(newI,sizeof(Infor),1,fp);
fclose(fp);
printf("数据录入成功!\n");
}
void changeFormat(void) //临时只能操作一行文件有待改善
{
FILE *fp1,*fp2;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件:%s\n",FilePath1);
return ; //返回主函数
}
fp2=fopen(FilePath2,"wt+");
if(fp2==NULL)
{
printf("无法创建文件:%s\n",FilePath2);
return ; //返回主函数
}
fputs(" \n……………………………………个人帐簿管理系统……………………………………\n",fp2);
fputs("统计月份 食品消费 房租费用 儿女费用 水电费用 医疗费用 储蓄费用 本月收入\n",fp2);
fputs("----------------------------------------------------------------------- \n",fp2);
printf("\n统计月份 食品消费 房租费用 儿女费用 水电费用 医疗费用 储蓄费用 本月收入 \n");
printf("----------------------------------------------------------------------- \n");
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!feof(fp1))
{
printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy,a->cxfy,a->srfy);
fprintf(fp2,"%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fzfy,a->znjy,a->sdfy,a->ylfy,a->cxfy,a->srfy);
fread(a,sizeof(Infor),1,fp1);
}
fputs("----------------------------------------------------------------------- \n",fp2);
fputs("关闭本程序继续原程序!\n",fp2);
fclose(fp1);
fclose(fp2);
system(FilePath2); //调用打开转换文本文件
remove(FilePath2);//删除文本文件文件
}
Status search(Infor *a)
{
FILE *fp1;
int mon;
int isfound=0;
printf("请正确输入要查询月份:");
scanf("%d",&mon);
fflush(stdin);
fp1=fopen(FilePath1,"rb+");
if(fp1==NULL)
{
printf("无法找到文件:%s\n",FilePath1);
return Error; //返回主函数
}
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)
return OK;
else
return NotFound;
}
void paixu(Infor *a)
{
int i=0,j=0,flag=0,t;
pType px[8]={{0,0}};
char str[8][10]={"统计月份","食品消费","房租费用","儿女费用","水电费用","医疗费用","储蓄费用","本月收入"};
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;
}
if(flag==0) break;
}
printf("\n");
for(i=0;i<8;i++)
{
printf(" %s",str[px[i].no]);
}
printf("\n----------------------------------------------------------------------- \n");
for(i=0;i<8;i++)
{
printf("%8d ",px[i].data);
}
printf("\n");
}
void modify(Infor *a,int mon)
{
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();
}
void delRecord(int mon)
{
FILE *fp1,*fp2;
Infor *b;
展开阅读全文