|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
阅读下列“资金账户的管理”程序,对程序进行调试、改错,并增加函数,使之符合如下具体功能。
(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[11]; /*记录发生日期*/
char lognote[15]; /*记录事件说明*/
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("logid logdata 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); /*显示最后记录内容*/
}
else printf("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;
}
兄弟是做大生意的吧?那边保管箱还没有解决,这边资金账户的管理又来了
|
|