|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题·:每个人都可以有自己的资金账户,买东西时会花费资金,这是支出,获得奖学金、父母寄的生活费、压岁钱或者打工赚的钱等,这是收入。资金账户中的资金会不断变化,需要对其进行管理。试编写一个资金账户管理程序,用来记录每次的收支及最终余额利息,并提供查询功能。
具体要求如下:
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[11]; /*记录发生日期*/
char lognote[15]; /*记录事件说明*/
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("logid logdate 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这部分也就是最后那一部分的代码每一行是什么意思啊?有些看不懂,然后在写这样的题应该从什么入手?
|
|