个人账簿管理系统设计书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
个人账簿管理系统设计书
3.相关的数据类型
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;
4.各问题处理的流程图4.1 录入模块
4.2 修改模块
4.3 查询模块
4.4 排序模块
4.5 删除模块
5.描述实现函数的调用关系图
6.调试分析
6.1 调试中遇到的问题及对问题的解决方法
创建结构体对该程序至关重要,通过查阅参考书籍,创建了合适的结构体。
由于初期未考虑到排序功能,后期做排序的时候,对整个程序做了一些修改,主要是结构体方面。
本程序的排序系统的采用的是“快速排序”,代码主要来自《数据结构(c语言版)》,由于书上代码为伪代码,所以调试时遇到一些问题,由于习惯使用c++中的引用传递,导致在c 文件中编译错误,经过查找资料才发现问题所在,于是将c文件改为cpp文件,解决了做排序功能时遇到的一些问题
6.2 算法的时间复杂度和空间复杂度
空间复杂度: O(f(n))
时间复杂度:O(n)
7.输出典型数据,获得测试结果;
8.源程序(带注释)
#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);//删除数据
int main()
{
while(1)
{
menu();
}
}
void menu(void)
{
int item;
int mon;
Infor *a;
a=(Infor *)malloc(sizeof(Infor));
do{
printf("\n…………个人帐簿管理系统设计…………\n\n"); printf("\t\t1.录入数据。
\n");
printf("\t\t2.查看数据。
\n");
printf("\t\t3.修改数据。
\n");
printf("\t\t4.查询数据。
\n");
printf("\t\t5.排序数据。
\n");
printf("\t\t6.删除数据。
\n");
printf("\t\t0.退出系统。
\n\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->fz fy,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->fz fy,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->fz fy,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,&ne wI->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);//这里可以做特别处理可防止存在同一月份有2条以上的记录问题。
这里就不写了。
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\n",fp2);
fputs("记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入 \n",fp2);
fputs("----------------------------------------------------------------------- \n",fp2);
printf("\n记录月份食品消费房租费用子女费用水电费用医疗费用储蓄费用本月收入 \n");
printf("----------------------------------------------------------------------- \n");
rewind(fp1);
fread(a,sizeof(Infor),1,fp1);
while(!feof(fp1))//从原文件[.dat]中读数据写入显示文件[.txt]中 {
printf("%7d %8d %8d %8d %8d %8d %8d %8d\n",a->month,a->spxf,a->fz fy,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;
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(); //显示数据
}
9.总结
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并对数据结构和算法的配合对于程序时间和空间性能的影响以及软件工程提供的开发流程和工具对于实现特定功能程序的重要意义。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法,例如,马踏棋盘问题就可以采用广度优先搜索或深度优先搜索来解决。
因此此时就应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。
一个数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机存储,数据的存储结构是数据结构的实现形式,是其在计算机的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非常重要的。
选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
10.致
感课设期间永老师和睿老师给予我们的悉心帮助。
11.参考文献
1 严蔚敏,吴伟民.数据结构(C语言版)[M].:清华大学.2003
2 严蔚敏,吴伟民.数据结构题集(C语言版)[m]. :清华大学.2003
3 William Ford,William Topp.DATA STRUCTURE WITH C++ .:清华大学(影印版). 2005
4 谭浩强.c语言程序设计[M].:清华大学. 2005.。