您的位置:首页 > 理论基础 > 数据结构算法

个人帐簿管理系统设计[数据结构课程设计]

2008-10-03 17:46 726 查看
数据结构课程设计任务书11
题目:个人帐簿管理系统设计
功能: 个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。

分步实施:
1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2. 完成最低要求:建立一个文件,包括某人5个月的收支情况,能对文件中的信息进行扩充(追加),修改和删除;
3. 进一步要求:完成对每月的开支排序,以及完成系统查询功能。有兴趣的同学可以自己扩充系统功能。

要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

我的源代码如下:

#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…………个人帐簿管理系统设计【云磊制作】…………/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->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);//这里可以做特别处理可防止存在同一月份有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))
{
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;
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: