最后小新 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 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么