小白本白~ 2023-10-07 19:47 采纳率: 100%
浏览 10
已结题

结构体数组联合冒泡排序与二分查找法

**要求使用结构体数组(包含学生班级,学生成绩,学生名字),冒泡排序与二分查找法,在排序后利用二分查找法找到目标学生成绩
**

所写的代码如下,但无法运行,也没有报错,求各位帮忙看看,感激不尽


#include<stdio.h>
struct stu
{
    int banji;
    int score;
    char name[10];
};                                                          //学生结构体

int main()
{
    struct stu s[] = { {05,12,"j"}, {05,2,"k"}, {051,3,"l"} };
    struct stu t;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3 - i; j++)
        {
            if (s[j].score > s[j + 1].score)
            {
                t = s[j];
                s[j] = s[j + 1];
                s[j + 1] = t;
            }
        }                                                //到此为冒泡排序
        
        int left = 1;
        int right = 3;
        int x;
        printf("请输入你想要寻找的成绩:");
        scanf("%d",&x);
        while (left < right)
        {
            int mid = (left + right) / 2;
            if (x == s[mid].score)
            {
                printf("您要寻找的成绩位于第  %d  位", mid);
                return mid;
            }
            else if (s[mid].score < x)
                left = mid + 1;
            else if (s[mid].score > x)
                right = mid - 1;
        }
        if (left >= right)
            printf("无此成绩存在");
    return 0;                                                                            //此为二分查找
}
  • 写回答

2条回答 默认 最新

  • 摆烂的程序员阿轩. 2023-10-07 20:08
    关注

    参考gpt
    您的代码存在一些问题,主要是在冒泡排序后,没有使用花括号包含 while 循环和 if 语句中需要执行的多行代码,导致程序执行结果不正确,不能找到目标学生成绩。同时,在二分查找的过程中,if 的条件判断出现了一定的问题,会导致程序执行结果不正确。

    下面是修改后的代码,您可以参考一下:

    #include <stdio.h>
    #include <string.h>
    
    struct stu {
        int banji;
        int score;
        char name[10];
    };
    
    int main() {
        struct stu s[] = { {05,12,"j"}, {05,2,"k"}, {051,3,"l"} };
        struct stu t;
        int n = sizeof(s) / sizeof(s[0]); // 数组长度
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (s[j].score > s[j + 1].score) {
                    t = s[j];
                    s[j] = s[j + 1];
                    s[j + 1] = t;
                }
            }
        } // 冒泡排序结束
        int left = 0;
        int right = n - 1;
        int x;
        printf("请输入你想要寻找的成绩:");
        scanf("%d", &x);
        while (left <= right) {
            int mid = (left + right) / 2;
            if (s[mid].score == x) {
                printf("您要寻找的成绩位于第 %d 位,姓名为%s,班级为%d\n", mid, s[mid].name, s[mid].banji);
                break;
            } else if (s[mid].score < x) {
                left = mid + 1;
            } else if (s[mid].score > x) {
                right = mid - 1;
            }
        } // 二分查找结束
        if (left > right) {
            printf("无此成绩存在\n");
        }
        return 0;
    }
    

    在修改后的代码中,先对学生成绩进行冒泡排序,然后使用二分查找法查找目标学生成绩,如果找到了就输出该学生的名字和班级,如果没有找到,则输出“无此成绩存在”。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 修改了问题 10月7日
  • 创建了问题 10月7日