coxixixixny 发表于 2020-3-31 14:58:33

小菜鸟求助!!!!

问题·:每个人都可以有自己的资金账户,买东西时会花费资金,这是支出,获得奖学金、父母寄的生活费、压岁钱或者打工赚的钱等,这是收入。资金账户中的资金会不断变化,需要对其进行管理。试编写一个资金账户管理程序,用来记录每次的收支及最终余额利息,并提供查询功能。

具体要求如下:

1、个人资金账户的信息统一放在随机文件中,该随机文件包括的数据项有记录ID、发生日期、发生事件、发生金额(正+的表示收入,负-表示支出)和余额。每记录一次收支,文件要增加一条记录,并计算一次余额。

2、程序实现3个功能,包括:1)可以创建该文件并添加新收入或支出信息;2)可以显示所有记录列表,得知资金账户的收支流水帐;3)查询最后一条记录,获知账户最后的余额。
/* crashbox.dat是随机文件,记录资金账户消费流水帐记录信息 */
/* 程序的功能:添加新流水帐记录,查询资金账户最后余额 */

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

int inputchoice()                                        /*选择操作参数*/
{
        int mychoice;
       
        printf("\nEnter your choice:\n");
        printf("1 - Add a new cash LOG.\n2 - List All Cash LOG.\n");
        printf("3 - Query Last Cash LOG.\n4 - 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("logidlogdate   lognote             charge    balance\n");
        while(!feof(cfptr)){
//feof是一个c语言函数,既可用以判断二进制文件又可用以判断文本文件。feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0。
                printf("%6ld %-11s %-15s %10.2lf %10.2lf\n",
                log.logid,log.logdate,log.lognote,log.charge,log.balance);
                fread(&log,size,1,cfptr);//从给定输入流stream读取最多count个对象到数组buffer中(相当于以对每个对象调用size次fgetc),把buffer当作unsigned char数组并顺序保存结果。流的文件位置指示器前进读取的字节数。
若出现错误,则流的文件位置指示器的位置不确定。若没有完整地读入最后一个元素,则其值不确定。

        };
}

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\nlogdate:%-11s\nlognote:%-15s\n",log.logid,log.logdate,log.lognote);
                printf("charge:%-10.2lf\nbalance:%-10.2lf\n",
                log.charge,log.balance);   /*显示最后记录内容*/
        }
        else
                printf("no logs in file!\n");       
}

void AddNewLog(FILE *cfptr)                         /*添加新记录*/
{
                struct LogData log,lastlog;
                long logcount;

      printf("Input logdate(format:2020-01-01):");
                scanf("%s",log.logdate);
                printf("Input lognote:");scanf("%s",log.lognote);
                printf("Input Charge: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);/*写入记录*/
}
void UpdateLog(FILE *cfptr)
{
                struct LogData chargelog,log;
                long logcount,i=0,j=0;
                printf("Input logid:");
                scanf("%ld",&chargelog.logid);
                fseek(cfptr,0L,SEEK_SET);
                fread(&log,size,1,cfptr);
                logcount=getLogcount(cfptr);
                if(logcount>0)
                {
                        while(i<=logcount){
                                if(log.logid==chargelog.logid)
                                {
                                        printf("Input logdate(format:2020-01-01):");
                                        scanf("%s",chargelog.logdate);
                                        printf("Input lognote:");scanf("%s",chargelog.lognote);
                                        printf("Input Charge:Income+ and expend-:");
                                        scanf("%lf",&chargelog.charge);                                                                               
                                        chargelog.balance=chargelog.charge+log.balance-log.charge;
                                        rewind(cfptr);
                                        fseek(cfptr,size*(i-1),SEEK_SET);
                                        fwrite(&chargelog,sizeof(struct LogData),1,cfptr);
                                        j+=1;
                                        break;       
                                }
                                fseek(cfptr,size*i,SEEK_SET);
                                fread(&log,size,1,cfptr);
                                i++;
                        }
                }       
                if(j)
                        printf("charge logdata succeed.\n");
                else
                        printf("Can't find this logdata!\n");
}

int main(void)
{
        FILE *fp; int choice;
        if((fp=fopen("cashbox.dat", "rb+")) == NULL){
                printf("can not open file cashbox.dat!\n");
                exit(0);
    }       
        fclose(fp);
        size = sizeof(struct LogData);
        while((choice=inputchoice())!=0){
                switch(choice){
                        case 1:
                                fp=fopen("cashbox.dat", "ab+");
                                AddNewLog(fp);
                                fclose(fp);break;
                        case 2:
                                fp=fopen("cashbox.dat", "rb");
                                ListAllLog(fp);/*列出所有的收入支出情况*/
                                fclose(fp);break;
                        case 3:
                                fp=fopen("cashbox.dat", "rb");
                                QueryLastLog(fp);/*查询最后的余额*/
                                fclose(fp);break;
                        case 4:       
                                fp=fopen("cashbox.dat", "rb+");
                                UpdateLog (fp);/*修改账户记录*/
                                fclose(fp);break;
                        default:
                                printf("Input Error.");break;
                }
        }
    if(fclose(fp)){       
                printf( "Can not close the file!\n" );
      exit(0);
    }
        return 0;
}
疑问·:updatelog这部分也就是最后那一部分的代码每一行是什么意思啊?有些看不懂,然后在写这样的题应该从什么入手?

coxixixixny 发表于 2020-3-31 15:26:52

救命!!!!有没有人能够帮我解答,哭了{:5_100:}
页: [1]
查看完整版本: 小菜鸟求助!!!!