首页  ·  知识 ·  编程语言
个人帐簿管理系统设计
不详      编辑:德仔   图片来源:网络
目: 个人帐簿管理系统设计 功能: 个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医
目: 个人帐簿管理系统设计
功能: 个人帐簿管理系统记录某人每月的全部收入及各项开支情况,包括食品消费,房租,子女教育费用,水电费,医疗费,储蓄等。进入系统后可以输入和修改某月的收支情况,可以对每月的开支从小到大进行排序,可以根据输入的月份查询每月的收支情况。
 
分步实施:
1.  初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2.  完成最低要求:建立一个文件,包括某人5个月的收支情况,能对文件中的信息进行扩充(追加),修改和删除;
3.  进一步要求:完成对每月的开支排序,以及完成系统查询功能。有兴趣的同学可以自己扩充系统功能。
 
要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5) 程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

#include 
 #include 
 #include 
 #include 
 
 //文件保存路径
 #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();
 }
 
 
本文作者:不详 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读