想问问我的代码问题在哪

#运行时中断
#想求多个人的本息和并排序
#
#

#include<stdio.h>
struct bank
{
    char name[20];
    int num;
    int year;
    float score;
};

int main()
{
    int i, j;
    struct bank dd[5];
    struct bank middle;
    float G;
    printf("请输入年利率(用小数形式表示)");
    scanf_s("%.2f", &G);
    printf("\n");
    for (i = 0; i < 5; i++)
    {
        printf("请输入人名:");
        scanf_s("%s", &dd[i].name);
        printf("请输入等额本金:");
        scanf_s("%d", &dd[i].num);
        printf("请输入存放年份:");
        scanf_s("%f", &dd[i].year);
        printf("\n");
        int A,x;
        float sum = 1;
        float he,y;
        A = dd[i].num;
        x = dd[i].year;
        y = A * (1 + G);
        for (j = 1; j < x + 1; j++)
        {
            sum = sum * (1 + G);
        }
        he = y * (sum - 1) / G;
        dd[i].score = he;
        sum = 1;
        he = 0;
    }

    for (i = 0; i < 4; i++)
    {
        for (j = i + 1; j < 5; j++)
        {
            if (dd[i].score < dd[j].score)
            {
                middle = dd[i];
                dd[i] = dd[j];
                dd[j] = middle;
            }
        }
    }
    for (i = 0; i < 5; i++)
    {
        printf("\t\t%s\t%0.2f\n", dd[i].name,dd[i].score);
    }

    return 0;
}

printf("请输入存放年份:");
scanf_s("%f", &dd[i].year);
这里改成 %d

printf("请输入人名:");
scanf_s("%s", &dd[i].name);
这里少了一个参数,是
scanf_s("%s", &dd[i].name, 20);

he += y * (sum - 1) / G; 这里是+=

#include<stdio.h>

struct bank
{
    char name[20];
    int num;
    int year;
    float score;
};

int main()
{
    int i, j;
    struct bank dd[5];
    struct bank middle;
    float G;

    printf("请输入年利率(用小数形式表示): ");
    scanf_s("%f", &G);

    printf("\n");

    for (i = 0; i < 5; i++)
    {
        printf("请输入人名: ");
        scanf_s("%s", dd[i].name, 20);

        printf("请输入等额本金: ");
        scanf_s("%d", &dd[i].num);

        printf("请输入存放年份: ");
        scanf_s("%d", &dd[i].year);

        printf("\n");

        float A, x;
        float sum = 1;
        float he, y;
        A = (float)dd[i].num;
        x = (float)dd[i].year;
        y = A * (1 + G);
        for (j = 1; j < x + 1; j++)
        {
            sum *= (1 + G);
        }
        he += y * (sum - 1) / G;
        dd[i].score = he;
        sum = 1;
        he = 0;
    }

    for (i = 0; i < 4; i++)
    {
        for (j = i + 1; j < 5; j++)
        {
            if (dd[i].score < dd[j].score)
            {
                middle = dd[i];
                dd[i] = dd[j];
                dd[j] = middle;
            }
        }
    }

    for (i = 0; i < 5; i++)
    {
        printf("\t    %s    %.2f", dd[i].name, dd[i].score);
    }

    return 0;
}

第17行scanf_s()里的%.2f改为%f,因为%.2f是错误的,使用%f即可读取浮点数。

第22行&取址符去掉,然后scanf_s输入字符串时,还需要指定字符串长度。

第26行%f改为%d,因为年份是整数。

下面代码在Dev_c++测试,所以scanf_s()改为了scanf(),具体修改可参照下注释。

修改如下:

参考链接:


scanf_s()读入字符串和数字_scanf获取一行中的字符串和数字_Lmikic的博客-CSDN博客 scanf_s函数同时读入字符串和数字时访问冲突的问题 https://blog.csdn.net/Lmikic/article/details/77338171

C 库函数 – scanf() | 菜鸟教程 C 库函数 - scanf() C 标准库 - <stdio.h> 描述 C 库函数 int scanf(const char *format, ...) 从标准输入 stdin 读取格式化输入。 声明 下面是 scanf() 函数的声明。 int scanf(const char *format, ...) 参数 format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空.. https://www.runoob.com/cprogramming/c-function-scanf.html


#include<stdio.h>
struct bank
{
    char name[20];
    int num;
    int year;
    float score;
};
 
int main()
{
    int i, j;
    struct bank dd[5];
    struct bank middle;
    float G;
    printf("请输入年利率(用小数形式表示)");
    
    // https://baike.baidu.com/item/scanf/10773316
    // scanf里面的%.2f是错误,的改为%f即可读取浮点数 
    scanf("%f", &G); 
    printf("\n");
    for (i = 0; i < 5; i++)
    {
        printf("请输入人名:");
        
        // https://blog.csdn.net/Lmikic/article/details/77338171
        // scanf_s() 读取字符串到字符数组,取址符&需要去掉, 因为dd[i].name已经是一个地址了
        // 然后 scanf_s() 读取字符串,还需要第二个参数,指定限制字符串的长度 
        scanf("%s", dd[i].name);
        printf("请输入等额本金:");
        
        // https://www.runoob.com/cprogramming/c-function-scanf.html 
        // 年份是整数,所以%f改为%d 
        scanf("%d", &dd[i].num);
        printf("请输入存放年份:");
        scanf("%d", &dd[i].year);
        printf("\n");
        int A,x;
        float sum = 1;
        float he,y;
        A = dd[i].num;
        x = dd[i].year;
        y = A * (1 + G);
        for (j = 1; j < x + 1; j++)
        {
            sum = sum * (1 + G);
        }
        he = y * (sum - 1) / G;
        dd[i].score = he;
        sum = 1;
        he = 0;
    }
 
    for (i = 0; i < 4; i++)
    {
        for (j = i + 1; j < 5; j++)
        {
            if (dd[i].score < dd[j].score)
            {
                middle = dd[i];
                dd[i] = dd[j];
                dd[j] = middle;
            }
        }
    }
    for (i = 0; i < 5; i++)
    {
        printf("\t\t%s\t%0.2f\n", dd[i].name,dd[i].score);
    }
 
    return 0;
}

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/210379
  • 你也可以参考下这篇文章:多种寻址方式的总结
  • 除此之外, 这篇博客: 这个编程技巧别说我没告诉你中的 总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    本文代码较多,建议在实际环境中运行调试。完整可运行代码也可以

    阅读原文。

    推荐阅读:

    工作中几乎用不到算法,为何要学算法?

    为何优先选用unique_ptr而不是裸指针?

    拥抱智能指针,告别内存泄露

    为什么执行自己的程序要在前面加./

    关注公众号【编程珠玑】,获取更多Linux/C/C++/算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源

     

  • 您还可以看一下 张新老师的投标方法论课程中的 综述小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^