| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1080 人关注过本帖
标题:大侠帮忙改错:用C语言编家庭财务管理系统问题
取消只看楼主 加入收藏
chenhongzhi
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2011-6-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
大侠帮忙改错:用C语言编家庭财务管理系统问题
  注:语法没有错误,可以正常运行。添加收入/支出和查询收入/支出都没有问题。但是删除收入/支出和修改收入/支出,还有统计收入/支出就有问题,VC++编译是内存问题,求各位大侠解释并改正,不胜感激!
    以下是所有程勋代码!
   /*家庭财务管理系统*/
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <conio.h>
 #define MAXNAME 11    //家庭成员姓名的最大长度
 #define MAXDETAIL 21    //注最大长度

 
//自定义枚举类型fi_type,用来表示收入与支出
   typedef enum _fi_type
   {
   income=1,//收入
   payout =-1 //支出
   } fi_type;
  // 家庭财务信息结构体
 typedef struct _fi_info
   {
   int year;
   int month;
   fi_type type;
   char name[9];
   float money;
   char detail[11];
   }fi_info;

   // 存储财务数据结构的结构体
   typedef struct _fi_data
   {
   fi_info info;
   struct _fi_data* next;
   } fi_data;
   fi_data *head;//财务数据的头结点
   void menu();//菜单函数
   void add_income();
   void search_income();
   void delete_income();
   void update_income();
   void add_payout();
   void search_payout();
   void delete_payout();
   void update_payout();
   void count_total();
   void quit();
   //
   void search_data(fi_type type);
   void delete_data(fi_type type);
   void update_data(fi_type type);
   //
   void initialize();
   void save_to_file();
   void clear_data();
   fi_data *get_last();
   fi_data *get_previous(fi_data *p);
   void input_info(fi_info *info);
   void show_info(fi_data *p);
   void menu()
   {
      printf("\n");
      printf("\t\t            ~~~~~~~~~~~~~~~~~~~~~~\n");
      printf("\t\t            ~~~~~~~~~~~~~~~~~~~~~~\n");
      printf("\t\t\t       家庭财务管理系统\n");
      printf("\t\t            ~~~~~~~~~~~~~~~~~~~~~~\n");
      printf("\t\t            ~~~~~~~~~~~~~~~~~~~~~~\n");
      printf("\t\t*******************************************\n");
      printf("\t\t收入管理:");
      printf("1.添加收入");
      printf("  2.查询收入明细\n");
      printf("\t\t\t 3.删除收入");
      printf("  4.修改收入\n");
      printf("\t\t*******************************************\n");
      printf("\t\t支出管理:");
      printf("5.添加支出");
      printf("  6.查询支出明细\n");
      printf("\t\t\t 7.删除支出");
      printf("  8.修改支出\n");
      printf("\t\t*******************************************\n");
      printf("\t\t统计:");
      printf("9.统计总收入/总支出\n");
      printf("\t\t*******************************************\n");
      printf("\t\t0.退出系统");
      
   }
  main()
  {
      int selected=0;
      initialize();
      while(selected>=0&&selected<=9)
      {
       system("cls");
       menu();
       printf(">请选择要进行的操作(0-9)");
       if(scanf("%d",&selected)!=1||selected<0||selected>9)
       {
       printf(">输入有误!请选择(0-9)之间的数字!按任意键重试...");
       getchar();
       }
       else
       {
         switch(selected)
         {
           case 0:exit(0);clear_data();break;
           case 1:add_income();save_to_file();break;
           case 2:search_income();break;
           case 3:delete_income();save_to_file();break;
           case 4:update_income();save_to_file();break;
           case 5:add_payout();save_to_file();break;
           case 6:search_payout();break;
           case 7:delete_payout();save_to_file();break;
           case 8:update_payout();save_to_file();break;
           case 9:count_total();break;
         }
         
       }

      }

  }
  void add_income()//添加收入
  {
    fi_data *p=(fi_data *)malloc(sizeof(fi_data));
    p->next=NULL;
    input_info(&(p->info));
    p->info.type=income;
    if(head==NULL)
     head=p;
    else
     get_last(head)->next=p;
  }
   void add_payout()//添加收入
  {
    fi_data *p=(fi_data *)malloc(sizeof(fi_data));
    p->next=NULL;
    input_info(&(p->info));
    p->info.type=payout;
    if(head==NULL)
     head=p;
    else
     get_last(head)->next=p;
  }
  //输入函数
  void input_info(fi_info *info)
  {
  printf("<请输入年月(YYYY/M)");
  scanf("%d/%d",&(info->year),&(info->month));
  printf("<请输入家庭成员姓名(最大长度为%d):",MAXNAME-1);
  scanf("%s",info->name);
  printf(">输入金额:");
  scanf("%f",&(info->money));
  printf(">请输入备注(最大长度为%d):",20);
  scanf("%s",info->detail);
  }

   //查找数据函数
   void search_data(fi_type type)
   {
   int year=0;
   int month=0;
   fi_data *p=NULL;
   int count=0;
   char input=' ';
   while(1)
   {
   printf(">请输入要查询的年月(例如:2009/1)");
   if(scanf("%d/%d",&year,&month)!=2)
   {
      printf(">输入有误\n");

   }
   else
   {
   p=head;
   count=0;
   while(p!=NULL)
   {
   if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type))
   {
   show_info(p);
   system("PAUSE");
   count++;
   }
   p=p->next;
   }
   if(count==0)
   {
   printf(">没有找到数据\n");
   }
   printf(">继续查找其他数据?(y or n)");
   input=getchar();
   if(input=='y'||input=='Y')
   continue;
   else
   break;
   }
   }
   }
   //初始化函数,读取文本数据
   void initialize()
   {
   FILE * fp=NULL;
   fi_data *p=NULL;
   fi_data *last=NULL;
   int count=0;
   fp=fopen("data.txt","rb");
   if(fp==NULL)
   {
   fp=fopen("data.txt","w");
   fclose(fp);
   return;
   }
   p=(fi_data*)malloc(sizeof(fi_data));
   memset(p,0,sizeof(fi_data));
   p->next=NULL;
   while(fread(&(p->info),sizeof(fi_info),1,fp)==1)
   {
   if(head==NULL)
   head=p;
   else
   {
   last=get_last();
   last->next=p;
   }
   count++;
   fseek(fp,count*sizeof(fi_info),SEEK_SET);
   p=(fi_data *)malloc(sizeof(fi_data));
   memset(p,0,sizeof(fi_data));
   p->next=NULL;
   }
   free(p);
   p=NULL;
   fclose(fp);
   }
   //显示信息函数
   void show_info(fi_data *p)
  {
  int i=0;
  printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");
  printf("|NO.\t |年/月\t|类型\t|姓名\t|金额\t|备注\t|\n");

  printf("|%5d\t|%4d/%02d|%4s\t|%10s|%10.2f|%20s|\n",i+1,
  p->info.year,p->info.month,p->info.type==income?"收入":"支出",
  p->info.name,p->info.money,p->info.detail);
  printf("|\t\t|\t\t|\t\t|\t\t|\t\t|\t\t|\n");
  }
  //统计总收入、总支出
   void count_total()
   {
   float total_income=0.0;
   float total_payout=0.0;
   fi_data *p=head;
   while(p!=NULL)
   {
   if(p->info.type==income)
   {
   total_income+=p->info.money;
   }
   else
   {
   total_payout+=p->info.money;
   }
    p=p->next;
   }
    printf("\t\t+\t\t+\t\t+\n");
    printf("|合计收入\t|合计支出\t|结余\t|\n");
   //printf("\t\t+\t\t+\t\t+\n");
    printf("%12.2f|%12.2f|%12.2f|\n",total_income,total_payout,total_income-total_payout);
    printf("\t\t+\t\t+\t\t+\n");
    printf(">按任意键返回主菜单。。。");
    getchar();

   }
   //保存到文件
  void save_to_file()
  {
  FILE *fp=fopen("data.txt","wb" );
  fi_data *p=head;
  while(p!=NULL)
  {
  fwrite(&(p->info),sizeof(fi_info),1,fp);
  fseek(fp,0,SEEK_END);
  p=p->next;
  }
  fclose(fp);
  }
   //修改信息函数
  void update_data(fi_type type)
   {  int year=0;
   int month=0;
   fi_data *p=NULL;
   fi_data *pre=NULL;
   char input;
   int count=0;
   int i=0;
   while(1)
   {  printf(">请输入要查询的年月(例如:2009/1)");
   if(scanf("%d/%d",&year,&month)!=2)
   {
      printf(">输入有误\n");

   }
   else
   {
   p=head;
   count=0;
   while(p!=NULL)
   {
   if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type))
   {
    count++;
    show_info(p);
    input_info(&(p->info));
    printf("修改成功\n");
    p=get_previous(p);
   }

   p=p->next;
   }
   if(count==0)
    printf(">没有找到数据\n");
    printf(">继续查找其他数据?(y or n)");
   input=getchar();
   if(input=='y'||input=='Y')
   continue;
   else
   break;
   }
   }

   }
    void delete_data(fi_type type)//删除数据函数
   {
   int year=0;
   int month=0;
   fi_data *p=NULL;
   fi_data *pre=NULL;
   int count=0;
   char input=' ';
   int i=0;
   while(1)
   {  printf(">请输入要查询的年月(例如:2009/1)");
     if(scanf("%d/%d",&year,&month)!=2)
   {
      printf(">输入有误\n");

   }
   else
   {
   p=head;
   count=0;
   while(p!=NULL)
   {
   if((p->info.year==year)&&(p->info.month==month)&&(p->info.type==type))
   {
    count++;
    show_info(p);
    pre=get_previous(p);
    if(pre==NULL)
    head=head->next;
    else
    pre->next=p->next;
    free(p);
    printf(">删除成功\n");
    }
   p=p->next;
   }
   if(count==0)

   printf(">没有找到数据\n");
    printf(">继续查找其他数据?(y or n)");
   input=getchar();
   if(input=='y'||input=='Y')
   continue;
   else
   break;
   }

   }
   }
   void clear_data()//清空链表数据
  {
  fi_data *p=NULL;
  while(head!=NULL)
  {
  if(head->next!=NULL)
  {
  p=head;
  head=head->next;
  free(p);
  p=NULL;
  }
  else
  {
  free(head);
  head=NULL;
  }

  }
  }
  fi_data *get_last()
  {
  fi_data * p=head;
  if(p==NULL)
  return p;
  while((p!=NULL)&&(p->next!=NULL))
  p=p->next;
  return p;
  }
  fi_data *get_previous(fi_data *p)
  {
  fi_data *previous=head;
  while(previous!=NULL)
  {
  if(previous->next==p)
  break;
  previous=previous->next;
  }
  return previous;
  }
   void search_payout()
   {
   search_data(payout);
   }
   void delete_payout()
   {
   delete_data(payout);
   }
   void update_payout()
   {
   update_data(payout);
   }
    void search_income()
   {
   search_data(income);
   }
   void delete_income()
   {
   delete_data(income);
   }
   void update_income()
   {
     update_data(income);
   }
搜索更多相关主题的帖子: 不胜感激 财务管理 C语言 姓名 
2011-06-13 16:23
chenhongzhi
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2011-6-13
收藏
得分:0 
求高手帮忙啊,我真是百思不得其解,好像是指针错误导致内存错误,求高手给出解释并改正
2011-06-13 16:27
chenhongzhi
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2011-6-13
收藏
得分:0 
帖子要沉下去了
2011-06-13 16:38
chenhongzhi
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2011-6-13
收藏
得分:0 
回复 4楼 bccn_2012
语法没有任何错误啊,可以运行。添加和查询收入都可以,就是删除和修改会出现内存错误
2011-06-13 16:43
快速回复:大侠帮忙改错:用C语言编家庭财务管理系统问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016369 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved