记账系统实验代码及实验报告
系统要求使用结构体存储记账信息,ID由五位数子组成,文件读写功能
部分运行截图如下:
代码如下(录入数据时,检测用户ID是否在10001-99999之间,如果异常会提示重新输入)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义文件名
const char* fileName = "record.txt";
//定义结构体
typedef struct _stuser
{
int id; //用户ID
char name[12]; //用户名
int income; //收入
int cost; //支出
}StUser;
//1 输入数据
void input(StUser a[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("请输入用户%d的用户ID、用户名、收入和支出:", i + 1);
scanf("%d %s %d %d", &a[i].id, a[i].name, &a[i].income, &a[i].cost);
//检测数据异常
if (a[i].id < 10001 || a[i].id > 99999)
{
printf("ID必须在10001-99999之间,请重新输入:");
i--;
}
}
}
//2 根据用户名字典序逆序排列后输出
void sort(StUser a[], int n)
{
int i, j;
StUser t;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (strcmp(a[j].name, a[j + 1].name) < 0)
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
//输出
printf("根据用户名字典序逆序排列后:\n");
for (i = 0; i < n; i++)
printf("%5d %10s %8d %8d\n", a[i].id, a[i].name, a[i].income, a[i].cost);
}
//3 查找
void search(StUser a[], int n)
{
char name[12];
int i = 0, flag = 0;
printf("请输入需要查找的用户名:");
scanf("%s", name);
for (i = 0; i < n; i++)
{
if (strcmp(a[i].name, name) == 0)
{
flag = 1;
printf("%5d %10s %8d %8d\n", a[i].id, a[i].name, a[i].income, a[i].cost);
}
}
if (flag == 0)
printf("查无此人\n");
}
//4 计算人均收入和支出
double calculate(StUser a[], int n)
{
double incoume = 0, cost = 0;
int i;
for (i = 0; i < n; i++)
{
incoume += a[i].income;
cost += a[i].cost;
}
incoume /= n;
cost /= n;
printf("人均收入:%.2f,人均支出:%.2f\n", incoume, cost); //保留两位小数
return cost; //返回平均支出
}
//5 显示所有支出大于平均支出的账户
void showBig(StUser a[], int n, double cost)
{
int i = 0;
printf("大于平均支出的用户记账信息:\n");
for (i = 0; i < n; i++)
{
if (a[i].cost > cost)
printf("%5d %10s %8d %8d\n", a[i].id, a[i].name, a[i].income, a[i].cost);
}
}
//6 输出系统中的所有记账信息
void showAll(StUser a[], int n)
{
int i = 0;
printf("系统中的所有记账信息:\n");
for (i = 0; i < n; i++)
{
printf("%5d %10s %8d %8d\n", a[i].id, a[i].name, a[i].income, a[i].cost);
}
}
//7 写入文件
void write2file(StUser a[], int n)
{
int i;
FILE* fp = fopen(fileName, "w");
for (i = 0; i < n; i++)
fprintf(fp, "%d %s %d %d\n", a[i].id, a[i].name, a[i].income, a[i].cost);
fclose(fp);
printf("数据已写入文件%s!\n", fileName);
}
//8 读文件
void readFile(StUser a[], int* n)
{
int i = 0;
FILE* fp = fopen(fileName, "r");
if (fp == 0)
{
printf("文件打开失败,请检查文件%s是否存在!", fileName);
return;
}
while (!feof(fp))
{
if (fscanf(fp, "%d %s %d %d", &a[i].id, a[i].name, &a[i].income, &a[i].cost))
i++;
}
*n = i;
fclose(fp);
printf("文件读取成功!\n");
}
int main()
{
int flag = 1;
StUser a[10];
int n = 0; //人数
double avecost = 0;
int choise;
while (flag)
{
system("cls"); //清屏
printf("1.Input record\n");
printf("2.Sort and list records in reverse order by user name\n");
printf("3.Search records by user name\n");
printf("4.Calculate and list per capita income and expenses\n");
printf("5.List records which have more expenses than per capita expenses\n");
printf("6.List all records\n");
printf("7.Write to a file\n");
printf("8.Read from file\n");
printf("0.Exit\n");
printf("Please enter you choise:");
scanf("%d", &choise);
switch (choise)
{
case 1:
printf("请输入用户数量:");
scanf("%d", &n);
input(a, n);
break;
case 2:
sort(a, n);
break;
case 3:
search(a, n);
break;
case 4:
avecost = calculate(a, n);
break;
case 5:
if (avecost == 0)
printf("请先计算平均支出\n");
else
showBig(a, n, avecost);
break;
case 6:
showAll(a, n);
break;
case 7:
write2file(a, n);
break;
case 8:
readFile(a, &n);
break;
case 0:
flag = 0;
break;
}
if (flag)
system("pause");
}
return 0;
}