用c语言写出一段能满足这个要求的程序:资金账户的信息统一放在随机文件中,该随机文件包括的数据项有记录ID、发生日期、发生事件、发生金额(正的表示收入,负的表示支出)和金额。每发生一笔收支,文件要增加一条记录,并计算一次余额
时间: 2024-03-26 10:38:20 浏览: 53
好的,下面是一个简单的C语言程序,可以实现你所需的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME "account.dat" // 定义随机文件名
struct Record {
int id; // 记录ID
char date[11]; // 发生日期,格式为yyyy-mm-dd
char event[50]; // 发生事件,最长50个字符
double amount; // 发生金额
double balance; // 余额
};
void add_record() {
struct Record r;
FILE *fp;
// 打开文件,以二进制方式追加数据
fp = fopen(FILENAME, "ab");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输入新记录的数据
printf("Enter record ID: ");
scanf("%d", &r.id);
printf("Enter date (yyyy-mm-dd): ");
scanf("%s", r.date);
printf("Enter event: ");
scanf("%s", r.event);
printf("Enter amount: ");
scanf("%lf", &r.amount);
// 计算余额
if (fseek(fp, -sizeof(struct Record), SEEK_END) == 0) {
fread(&r, sizeof(struct Record), 1, fp);
r.balance += r.amount;
} else {
r.balance = r.amount;
}
// 保存新记录
fwrite(&r, sizeof(struct Record), 1, fp);
// 关闭文件
fclose(fp);
printf("Record added successfully!\n");
}
void display_records() {
struct Record r;
FILE *fp;
// 打开文件,以二进制方式读取数据
fp = fopen(FILENAME, "rb");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 读取文件中的每一条记录,并输出
printf("ID\tDate\t\tEvent\t\tAmount\t\tBalance\n");
printf("------------------------------------------------------------\n");
while (fread(&r, sizeof(struct Record), 1, fp) == 1) {
printf("%d\t%s\t%s\t\t%.2f\t\t%.2f\n", r.id, r.date, r.event, r.amount, r.balance);
}
// 关闭文件
fclose(fp);
}
int main() {
int choice;
// 显示菜单,让用户选择操作
while (1) {
printf("\n1. Add record\n");
printf("2. Display records\n");
printf("3. Quit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
add_record();
break;
case 2:
display_records();
break;
case 3:
printf("Goodbye!\n");
return 0;
default:
printf("Invalid choice!\n");
break;
}
}
}
```
这个程序定义了一个结构体`Record`,包含了你需要的所有数据项。程序提供了两个函数,`add_record()`和`display_records()`,分别用于添加记录和显示所有记录。
在`add_record()`函数中,程序首先打开文件,然后让用户输入新记录的数据。接着,程序计算余额:如果文件不为空,程序通过`fseek()`函数将文件指针定位到最后一条记录的位置,然后读取该记录,并计算余额;否则,余额就等于当前记录的金额。最后,程序将新记录写入文件,并关闭文件。
在`display_records()`函数中,程序打开文件,并读取文件中的每一条记录。然后,程序按照格式输出每一条记录的数据,包括记录ID、发生日期、发生事件、发生金额和余额。最后,程序关闭文件。
在主函数中,程序显示一个菜单,让用户选择操作。如果用户选择添加记录,则调用`add_record()`函数;如果用户选择显示所有记录,则调用`display_records()`函数;如果用户选择退出程序,则结束程序的运行。
希望这个程序可以帮助你实现你需要的功能。如果你有其他问题或需要更多帮助,请随时提问。
阅读全文