Christopher. 发表于 2020-8-23 18:00:07

各位大佬帮忙看一下这个吧

阅读下列“资金账户的管理”程序,对程序进行调试、改错,并增加函数,使之符合如下具体功能。
(1) 资金账户的信息统一放在随机文件中,该随机文件包括的数据项有记录ID、发生日期、发生事件、发生金额(正的表示收入,负的表示支出)和金额。每发生一笔收支,文件要增加一条记录,并计算一次余额。,
(2) 程序实现3个功能,包括:(1),能创建资金账户文件并添加收入或支出信息记录;(2),能显示所有记录,得知资金账户的收支流水账;(3),能查询最后一条记录,获知账户最后的余额。账户文件名命名为cashbox.dat,文件部分内容如下;
(3) 增加修改资金账户的功能。输入一个记录ID,如果文件中已存在该记录,则输入新的记录信息并更新资金账户文件中相应记录的信息。要求定义和调用函数UpdateLog(),其功能是修改资金账户记录。



这个题,源代码我已经改好了,但是增加的那个不是很会弄,我初学,不是很会用指针链表,有没有大佬有简单易懂的方法,谢谢啦


#include"stdio.h"
#include"stdlib.h"
long size;                     /*当前最近一次的流水号*/
struct LogData{               /*记录的结构*/
       long logid;                  /*记录ID*/
       char logdate;            /*记录发生日期*/
       char lognote;            /*记录事件说明*/
       double charge;               /*发生费用:负表示支出,正表示收入*/
       double balance;               /*余额*/
};

int inputchoice()         /*选择操作参数*/
{
       int mychoice;
       printf("\nEnter yourchoice:\n");
       printf("1-Add a newcash LOG.\n2-List All Cash LOG.\n");
       printf("3-Query LastCash LOG.\n");
       printf("4-Update a cash log.\n");
       printf("0-End program.\n");
       scanf("%d",&mychoice);
       return mychoice;
}

long getLogcount(FILE*cfptr)   /*获取文件记录总数*/
{
       long begin,end,logcount;
       fseek(cfptr,0L,SEEK_SET);
       begin=ftell(cfptr);
      fseek(cfptr,size,SEEK_END);
       end=ftell(cfptr);
      logcount=(end-begin)/size-1;
       return logcount;
}

void ListAllLog(FILE*cfptr)             /*列出所有收支流水帐*/
{
       struct LogData log;
       fseek(cfptr,0L,SEEK_SET);          /*定位指针到文件开始位置*/
      fread(&log,size,1,cfptr);
       printf("logidlogdata lognote charge balance\n");
       while(!feof(cfptr)){
             printf("%6ld%-11s%-15s%10.2lf%10.2lf\n",
                  log.logid,log.logdate,log.lognote,log.charge,log.balance);
             fread(&log,size,1,cfptr);
       };
}


void QueryLastLog(FILE*cfptr)            /*查询显示最后一条记录*/
{
       struct LogData log;
       long logcount;
      logcount=getLogcount(cfptr);
       if(logcount>0)             /*表示有记录存在*/
       {
             fseek(cfptr,size*(logcount-1),SEEK_SET);    /*定位最后记录*/
             fread(&log,size,1,cfptr);                   /*读取最后记录*/
            printf("The last log is:\n");
             printf("logid:%-6ld\nlogdata:%-11s\nlognote:%-15s\n",
                  log.logid,log.logdate,log.lognote);
             printf("charge:%-10.2lf\nbalance:%-10.2lf\n",
                  log.charge,log.balance);      /*显示最后记录内容*/
       }
       elseprintf("no logs in file!\n");
}


void AddNewLog(FILE*cfptr)                   /*添加新纪录*/
{
       struct LogData log,lastlog;
       long logcount;
       printf("Inputlogdate(format:2006-01-01):");
       scanf("%s",log.logdate);
       printf("Inputlognote:");
      scanf("%s",log.lognote);
       printf("InputCharge:Income+and expend-:");
      scanf("%lf",&log.charge);
      logcount=getLogcount(cfptr);      /*获取记录数*/


       if(logcount>0){
             fseek(cfptr,size*(logcount-1),SEEK_SET);
             fread(&lastlog,size,1,cfptr);       /*读入最后记录*/
             log.logid=lastlog.logid+1;      /*记录号按顺序是上次的+1*/
             log.balance=log.charge+lastlog.balance;
       }
       else{                      /*如果文件是初始状态,记录数为0*/
            log.logid=1;
             log.balance=log.charge;
       }
       rewind(cfptr);
      printf("logid=%ld\n",log.logid);
      fwrite(&log,sizeof(struct LogData),1,cfptr);      /*写入记录*/
}

FILE*openfile(char*openmode)                        /*打开文件*/
{
       FILE*fp;
      if((fp=fopen("cashbox.dat",openmode))==NULL){
            printf("cannot open file cashbox.dat!\n");
            exit(0);
       }
       return(fp);
}
//主函数
int main(void)
{
       FILE*fp;
       int choice;
       size=sizeof(struct LogData);
      while((choice=inputchoice())!=0){
            switch(choice){
case 1:
             fp=openfile("ab+");
            AddNewLog(fp);
            break;
case 2:                      /*列出所有的收入支出情况*/
             fp=openfile("rb");
            ListAllLog(fp);
            break;
case 3:                         /*查询最后记录及余额*/
             fp=openfile("rb");
            QueryLastLog(fp);
            break;
            default:
                  printf("Input Error.");
                     break;
case 4:
                       fp=fopen("cashbox.dat", "rb+");
                       Updatelog(fp);
                       break;                     
            }
       if(fclose(fp)){
            printf("Cannot close the file!\n");
            exit(0);
       }
   }
       return 0;
}

风过无痕1989 发表于 2020-8-24 14:32:37

兄弟是做大生意的吧?那边保管箱还没有解决,这边资金账户的管理又来了

Christopher. 发表于 2020-8-26 20:08:05

风过无痕1989 发表于 2020-8-24 14:32
兄弟是做大生意的吧?那边保管箱还没有解决,这边资金账户的管理又来了

两个都看到,学的比较少不会,哈哈哈
不过现在会了

风过无痕1989 发表于 2020-8-26 20:12:52

Christopher. 发表于 2020-8-26 20:08
两个都看到,学的比较少不会,哈哈哈
不过现在会了

谢谢了! 兄弟!!!
页: [1]
查看完整版本: 各位大佬帮忙看一下这个吧