在给出代码的基础上进行改进使其符合要求

img

img

img

img

img


记账系统的进阶问题,主要问题是第九点,第八点已经可以自己调试出来了。

我给你写的代码啊,代码修改如下:

img

#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;
}





第9点?退出系统?

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632