陈桉777 2022-11-04 14:56 采纳率: 100%
浏览 75
已结题

关于c语言的问题:记账系统v2

img

img

img


记账系统实验代码及实验报告
系统要求使用结构体存储记账信息,ID由五位数子组成,文件读写功能

  • 写回答

2条回答 默认 最新

  • 关注

    部分运行截图如下:

    img

    img

    img

    img

    img

    代码如下(录入数据时,检测用户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;
    }
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 对于这个问题的解释说明
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。