个人账簿管理系统.docx

上传人:b****7 文档编号:9074743 上传时间:2023-02-03 格式:DOCX 页数:17 大小:138.87KB
下载 相关 举报
个人账簿管理系统.docx_第1页
第1页 / 共17页
个人账簿管理系统.docx_第2页
第2页 / 共17页
个人账簿管理系统.docx_第3页
第3页 / 共17页
个人账簿管理系统.docx_第4页
第4页 / 共17页
个人账簿管理系统.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

个人账簿管理系统.docx

《个人账簿管理系统.docx》由会员分享,可在线阅读,更多相关《个人账簿管理系统.docx(17页珍藏版)》请在冰豆网上搜索。

个人账簿管理系统.docx

个人账簿管理系统

数据结构课程设计报告之二个人帐簿管理系统设计

一、任务描述

个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。

进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。

要求:

根据以上任务说明,设计数据结构,并设计程序完成功能。

二、问题分析

1、设计基础

熟练掌握数组、指针的各种操作,以及一些算法思想的应用。

2、分析设计课题的要求,要求编程实现

(1)记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等

(2)可以输入和修改某月的收支情况

(3)可以对每月的开支从小到大进行排序

(4)可以根据输入的月份查询每月的收支情况

三、数据结构和功能分析

主菜单

1、录入数据

2、查看数据

3、修改数据

4、查询数据

5、排序数据

6、删除数据

0、退出数据

录入数据

本月月份

食品消费

房租费用

子女费用

水电费用

医疗费用

储蓄费用

收入费用

查看数据

继续y

退出n

修改数据

要修改的月份

查询数据

要查询的月份

排序数据

月份

删除数据

删除的月份

退出系统

继续y

退出n

四、程序结构分析

1、程序模块分析

●菜单函数

●输入函数

●写入函数

●格式转换函数

●查询函数

●排序函数

●修改数据函数

●删除函数

2、程序的主要结构

流程的名称解释如下——main()是主函数,负责调用其他所有的函数,menu()菜单函数,input()函数用于接收键盘输入,writeinfor()函数用于向文件内写入内容,changeFormat()函数用于将dat格式文件转换为txt文件,Statussearch()查询函数[返回查询的结果及查询的状态],paixu()函数用于对查询据结果排序,modify()函数用于修改数据,delRecord()函数用于删除数据

五、程序运行结果

1、原文件内容

#include

#include

#include

#include

//文件保存路径

#defineFilePath1"Myinfor.dat"

#defineFilePath2"Myinfor.txt"

//查询用声明

#defineStatusint

#defineOK1

#defineError0

#defineNotFound2

typedefstruct{

intmonth;//月份

intspxf;//食品消费

intfzfy;//房租费用

intznjy;//子女教育费用

intsdfy;//水电费用

intylfy;//医疗费用

intcxfy;//储蓄费用

intsrfy;//收入费用

}Infor;

typedefstruct{//查询用自定义数据类型

intno;

intdata;

}pType;

voidmenu(void);//菜单

voidinput(Infor*newI);//接收键盘输入

voidwriteinfor(Infor*newI);//向文件内写入内容

voidchangeFormat(void);//将dat格式文件转换为txt文件

Statussearch(Infor*a);//查询函数[返回查询的结果及查询的状态]

voidpaixu(Infor*a);//对查询据结果排序

voidmodify(Infor*a,intmon);//修改数据

voiddelRecord(intmon);//删除数据

voidmain()

{

while

(1)

{

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("5.排序数据\n");

printf("6.删除数据\n");

printf("0.退出系统\n\n");

printf("请输入要进行的操作:

");

scanf("%d",&item);

}while(item>6||item<-1);

switch(item)

{//退出程序

case0:

getchar();

getchar();

exit

(1);

break;

//录入数据

case1:

input(a);

writeinfor(a);

break;

//查看数据

case2:

changeFormat();

break;

//修改数据

case3:

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;

//查询数据

case4:

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;

//排序数据

case5:

item=search(a);

if(item!

=OK)printf("\n没有符合条件的记录!

\n");

else

paixu(a);

break;

//删除数据

case6:

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);//释放内存空间

}

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);

}

voidwriteinfor(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");

}

voidchangeFormat(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);//删除文本文件文件

}

Statussearch(Infor*a)

{

FILE*fp1;

intmon;

intisfound=0;

printf("请正确输入要查询的月份:

");

scanf("%d",&mon);

fflush(stdin);

fp1=fopen(FilePath1,"rb+");

if(fp1==NULL)

{

printf("无法找到文件:

%s\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;

}

voidpaixu(Infor*a)

{

inti=0,j=0,flag=0,t;

pTypepx[8]={{0,0}};

charstr[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");

}

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();

}

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("删除数据成功!

\n");

changeFormat();

}

2、本程序是在VC++环境下实现,下面将演示该软件的使用方法。

主菜单

录入记录

修改数据

排序

查看收支状况

六、收获与体会

注意申请内存空间。

C语言中,对数组的操作,是仿照指针的模式进行的。

但是需要记住一点,数组不等于指针。

对于一维数组a[],指向数组的指针p=a来说,他们之间最大的区别在于,数组方式使用数组名a(同时也是数组的首地址)对数组进行直接的访问和操作,而指针方式使用指针名p对数组进行的是间接的访问和操作。

在多数情况下,他们操作结果是相同的,但是也有例外。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1