#include <stdio.h>
#include <stdlib.h>
typedef struct {
int month; // 月份
float income; // 收入
float food; // 伙食消费
float daily; // 日常用品费用
float utilities; // 水电费
float medical; // 医疗费
float entertainment; // 娱乐费用
float total; // 总开支
} Expense;
//声明函数
void inputExpense(Expense expenses[]);//初始输入函数
void modifyExpense(Expense expenses[]);//修改函数
void sortExpenses(Expense expenses[]);//排序函数
void queryExpense(Expense expenses[]);//查询函数
void printExpenses(Expense expenses[]);//排列后开支情况总表打印函数
void saveExpensesToFile(Expense expenses[]);//文件写入
void loadExpensesFromFile(Expense expenses[]);//文件读取
void initExpenses(Expense expenses[])
{
int i;
for (i = 0; i < 12; i++)
{
expenses[i].month = i + 1; // 初始化月份为1到12
expenses[i].income = 0.0f; // 初始化收入为0
expenses[i].food = 0.0f; // 初始化伙食消费为0
expenses[i].daily = 0.0f; // 初始化日常用品费用为0
expenses[i].utilities = 0.0f; // 初始化水电费为0
expenses[i].medical = 0.0f; // 初始化医疗费为0
expenses[i].entertainment = 0.0f; // 初始化娱乐费用为0
expenses[i].total = 0.0f; // 初始化总开支为0
}
}
void saveExpensesToFile(Expense expenses[])
{
FILE *file = fopen("expenses.txt", "w"); // 打开文件用于写入
if (file == NULL)
{
perror("无法打开文件");
return;
}
int i;
for (i = 0; i < 12; i++) {
fprintf(file, "%d %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n",
expenses[i].month, expenses[i].income, expenses[i].food, expenses[i].daily,
expenses[i].utilities, expenses[i].medical, expenses[i].entertainment, expenses[i].total);
}
fclose(file); // 关闭文件
printf("数据已保存到文件\n");
}
void loadExpensesFromFile(Expense expenses[])
{
FILE *file = fopen("expenses.txt", "r"); // 打开文件用于读取
if (file == NULL) {
perror("无法打开文件");
printf("将创建一个新文件\n");
return;
}
int i;
for (i = 0; i < 12; i++) {
if (fscanf(file, "%d %f %f %f %f %f %f %f",
&expenses[i].month, &expenses[i].income, &expenses[i].food, &expenses[i].daily,
&expenses[i].utilities, &expenses[i].medical, &expenses[i].entertainment, &expenses[i].total) != 8) {
fprintf(stderr, "文件格式错误或数据不完整\n");
fclose(file);
return;
}
}
fclose(file); // 关闭文件
}
void inputExpense(Expense expenses[])
{
int month = 0;
printf("请输入月份(1-12):");
scanf("%d", &month);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入收入:");
scanf("%f", &expenses[month - 1].income);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入伙食消费:");
scanf("%f", &expenses[month - 1].food);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入日常用品费用:");
scanf("%f", &expenses[month - 1].daily);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入水电费:");
scanf("%f", &expenses[month - 1].utilities);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入医疗费:");
scanf("%f", &expenses[month - 1].medical);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入娱乐费用:");
scanf("%f", &expenses[month - 1].entertainment);
while (getchar() != '\n'); // 清除输入缓冲区
expenses[month - 1].month = month;
expenses[month - 1].total = expenses[month - 1].food + expenses[month - 1].daily + expenses[month - 1].utilities + expenses[month - 1].medical + expenses[month - 1].entertainment;
}
void modifyExpense(Expense expenses[])
{
int month = 0;
printf("请输入要修改的月份(1-12):");
scanf("%d", &month);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的收入:");
scanf("%f", &expenses[month - 1].income);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的伙食消费:");
scanf("%f", &expenses[month - 1].food);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的日常用品费用:");
scanf("%f", &expenses[month - 1].daily);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的水电费:");
scanf("%f", &expenses[month - 1].utilities);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的医疗费:");
scanf("%f", &expenses[month - 1].medical);
while (getchar() != '\n'); // 清除输入缓冲区
printf("请输入新的娱乐费用:");
scanf("%f", &expenses[month - 1].entertainment);
while (getchar() != '\n'); // 清除输入缓冲区
expenses[month - 1].total = expenses[month - 1].food + expenses[month - 1].daily + expenses[month - 1].utilities + expenses[month - 1].medical + expenses[month - 1].entertainment;
}
void sortExpenses(Expense expenses[])
{
int i, j, maxIndex;//选排
Expense temp;
for (i = 0; i < 11; i++)
{
// 找到未排序部分的最小元素的索引
maxIndex = i;
for (j = i + 1; j < 12; j++)
{
if (expenses[j].total > expenses[maxIndex].total)
{
maxIndex = j;
}
}
// 将找到的最小元素与未排序部分的第一个元素交换
if (maxIndex != i)
{
temp = expenses[i];
expenses[i] = expenses[maxIndex];
expenses[maxIndex] = temp;
}
}
}
void queryExpense(Expense expenses[])
{
int month = 0;
printf("请输入要查询的月份(1-12):");
scanf("%d", &month);
while (getchar() != '\n'); // 清除输入缓冲区
if (month < 1 || month > 12)
{
printf("无效的月份\n");
return;
}
printf("月份:%d\n", expenses[month - 1].month);
printf("收入:%.2f\n", expenses[month - 1].income);
printf("伙食消费:%.2f\n", expenses[month - 1].food);
printf("日常用品费用:%.2f\n", expenses[month - 1].daily);
printf("水电费:%.2f\n", expenses[month - 1].utilities);
printf("医疗费:%.2f\n", expenses[month - 1].medical);
printf("娱乐费用:%.2f\n", expenses[month - 1].entertainment);
printf("总开支:%.2f\n", expenses[month - 1].total);
}
void printExpenses(Expense expenses[])
{
printf("排序后的开支情况:\n");
int i;
for (i = 0; i < 12; i++)
{
printf("月份:%d, 收入:%.2f, 伙食消费:%.2f, 日常用品费用:%.2f, 水电费:%.2f, 医疗费:%.2f, 娱乐费用:%.2f, 总开支:%.2f\n",
expenses[i].month, expenses[i].income, expenses[i].food, expenses[i].daily,
expenses[i].utilities, expenses[i].medical, expenses[i].entertainment, expenses[i].total);
}
}
int main()
{
Expense expenses[12]; //假设一年有12个月
int j;
for (j = 0;j <= 11;j++)
{
expenses[j].month= 0 ;
}
initExpenses(expenses);
int choice;
// 从文件加载数据
loadExpensesFromFile(expenses);
do {
printf("\n");
printf("1. 输入收支情况\n");
printf("2. 修改收支情况\n");
printf("3. 排序开支\n");
printf("4. 查询收支情况\n");
printf("5. 保存并退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
while (getchar() != '\n'); // 清除输入缓冲区
switch (choice)
{
case 1:
inputExpense(expenses);
break;
case 2:
modifyExpense(expenses);
break;
case 3:
sortExpenses(expenses);
printf("开支已排序\n");
printExpenses(expenses);//打印排序后的结果
break;
case 4:
queryExpense(expenses);
break;
case 5:
saveExpensesToFile(expenses);
printf("退出系统\n");
return 0;
default:
printf("无效的选择,请重新输入\n");
}
} while (choice != 5);
return 0;
}修改成按照天去统计收支,但是最后按照月的总计去显示