最后小新 2022-10-28 22:13 采纳率: 80%
浏览 199
已结题

求补充残缺的代码(实在不会了)

#include <stdio.h>
#include <stdlib.h>

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("0.Exit\n");

}
不知为什么禁止重复输入%-s

img

img


int main()
{
int option,n,flag=1;
char s[N_NAME];
User *users=NULL;

PrintOptions();
while(flag)
{
    printf("\tPlease enter your choice:");
    scanf("%d",&option);
    switch(option)
    {
    case 1:
        printf("请输入用户人数:");
        scanf("%d",&n);
        users=ScanValues(n);
        break;
    case 2:
        SortByName(n,users);
        PrintValues(n,users);
        break;
    case 3:
        printf("Please input the user name:");
        scanf("%s",s);
        int index=FindUserByName(s,n,users);
        PrintValue(index,users);
        break;
    case 4:
        CalcAndPrintAverageNumber(n,users);
        break;
    case 5:
        PrintSpecificValues(n,users);
        break;
    case 6:
        SortByID(n,users);
        PrintValues(n,index);
        break;
    case 0:
        flag=0;
        printf("退出系统\n");
        break;
    default:
        printf("请输入正确的选项\n");
        break;
    }
}
for(int i=0;i<n;i++)
    free(users[i].name);
free(users);
return 0;

}

img

测试用例1:显示菜单项1.Input record2.Sort and list records in reverse order by user name3.Search records by user name4.Calculate and list per capita income and expenses5.List records which have more expenses than per capita expenses6.List all records0.Exit Please enter your choice:测试用例2:输入:选择菜单项1请输入用户人数:10001 zero 6000 150010023 Aef 10000 300020011 eric001 20000 1000020012 ffff 15000 030004 abc 8000 14000测试用例3:输入:选择菜单项2输出:ID UserName Income Expenses110001 zero 6000 150020012 ffff 15000 020011 eric001 20000 1000030004 abc 8000 1400010023 Aef 10000 3000测试用例4:输入:选择菜单项3输出:Please input the user name:输入:eric001输出:ID UserName Income Expenses20011 eric001 20000 10000测试用例5:输入:选择菜单项3输出:Please input the user name:输入:eric输出:Not Found测试用例6:输入:选择菜单项4输出:Per capita income: 11800Per capita expenses: 5700测试用例7:输入:选择菜单项5输出:ID UserName Income Expenses030004 abc 8000 1400020011 eric001 20000 10000

  • 写回答

5条回答 默认 最新

  • 叶落花枯 2022-10-28 23:09
    关注
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define N_NAME  10
    
    typedef struct {
        int id;         // 用户id
        char *name;     // 用户名
        int income;     // 收入
        int expenses;   // 支出
    } User;
    
    // 菜单
    void PrintOptions()
    {
        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("0.Exit\n");
    }
    
    // 录入信息
    User *ScanValues(int n)
    {
        User *users = (User *)malloc(sizeof(User) * n);
        for(int i=0; i<n; i++)
        {
            users[i].name = (char *)malloc(sizeof(char) * N_NAME);
        }
        for(int i=0; i<n; i++)
        {
            User *user = users + i;
            scanf("%d %s %d %d", &(user->id), user->name, &(user->income), &(user->expenses));
        }
        return  users;
    }
    
    // 按用户名字典序逆序排列
    void SortByName(int n, User *users)
    {
        User *user = (User *)malloc(sizeof(User));
        user->name = (char *)malloc(sizeof(char) * N_NAME);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n-i-1; j++)
            {
                if(strcmp(users[j].name, users[j + 1].name) < 0) // 字典序逆序
                {
                    user->id = users[j].id;
                    strcpy(user->name, users[j].name);
                    user->income = users[j].income;
                    user->expenses = users[j].expenses;
    
                    users[j].id = users[j + 1].id;
                    strcpy(users[j].name, users[j + 1].name);
                    users[j].income = users[j + 1].income;
                    users[j].expenses = users[j + 1].expenses;
    
                    users[j + 1].id = user->id;
                    strcpy(users[j + 1].name, user->name);
                    users[j + 1].income = user->income;
                    users[j + 1].expenses = user->expenses;
                }
            }
        }
        free(user->name);
        free(user);
    }
    
    // 打印输出所有记账信息
    void PrintValues(int n, User *users)
    {
        printf("%-10s%-15s%-10s%-10s\n", "ID", "UserName", "Income", "Expenses");
        for(int i=0; i<n; i++)
        {
            User *user = users + i;
            printf("%-10d%-15s%-10d%-10d\n", user->id, user->name, user->income, user->expenses);
        }
    }
    
    // 打印输出指定的记账信息
    void PrintValue(int index, User *users)
    {
        if(index == -1)
        {
            printf("Not Found\n");
            return;
        }
        User *user = users + index;
        printf("%-10s%-15s%-10s%-10s\n", "ID", "UserName", "Income", "Expenses");
        printf("%-10d%-15s%-10d%-10d\n", user->id, user->name, user->income, user->expenses);
    }
    
    // 按用户名查找记账信息列表索引
    int FindUserByName(char *name, int n, User *users)
    {
        int index = -1;
        for(int i=0; i<n; i++)
        {
            if(strcmp(users[i].name, name) == 0)
            {
                index = i;
                break;
            }
        }
        return index;
    }
    
    // 计算所有用户的平均收入
    double CalcAverageIncome(int n, User *users)
    {
        int sum = 0;
        for(int i=0; i<n; i++)
            sum += users[i].income;
        return (double)sum/n;
    }
    
    // 计算所有用户的平均支出
    double CalcAverageExpenses(int n, User *users)
    {
        int sum = 0;
        for(int i=0; i<n; i++)
            sum += users[i].expenses;
        return (double)sum/n;
    }
    
    // 计算并输出所有用户的平均收入和平均支出
    void CalcAndPrintAverageNumber(int n, User *users)
    {
        double averageIncome = CalcAverageIncome(n, users);
        double averageExpenses = CalcAverageExpenses(n, users);
        printf("Average Income : %.2f\n", averageIncome);
        printf("Average Expenses : %.2f\n", averageExpenses);
    }
    
    // 打印输出所有支出大于平均支出的记账信息
    void PrintSpecificValues(int n, User *users)
    {
        double averageExpenses = CalcAverageExpenses(n, users);
        printf("%-10s%-15s%-10s%-10s\n", "ID", "UserName", "Income", "Expenses");
        for(int i=0; i<n; i++)
        {
            User *user = users + i;
            if(user->expenses > averageExpenses)
                printf("%-10d%-15s%-10d%-10d\n", user->id, user->name, user->income, user->expenses);
        }
    }
    
    int main()
    {
        int option, n, index, flag=1;
        char s[N_NAME];
        User *users = NULL;
        while(flag)
        {
            PrintOptions();
            printf("\tPlease enter your choice:");
            scanf("%d",&option);
            switch(option)
            {
            case 1:
                printf("请输入用户人数:");
                scanf("%d",&n);
                users = ScanValues(n);
                break;
            case 2:
                SortByName(n, users);
                PrintValues(n, users);
                break;
            case 3:
                printf("Please input the user name:");
                scanf("%s", s);
                index = FindUserByName(s, n, users);
                PrintValue(index, users);
                break;
            case 4:
                CalcAndPrintAverageNumber(n, users);
                break;
            case 5:
                PrintSpecificValues(n,users);
                break;
            case 6:
                PrintValues(n, users);
                break;
            case 0:
                flag=0;
                printf("退出系统\n");
                break;
            default:
                printf("请输入正确的选项\n");
                break;
            }
        }
        for(int i=0;i<n;i++)
            free(users[i].name);
        free(users);
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题