fpga696 2022-04-14 16:44 采纳率: 50%
浏览 36
已结题

函数建立成功,但主函数运行调用失败

问题遇到的现象和发生背景
代码编译以后无错误,但运行到一半就无法调用后面的两个查找函数。

问题相关代码,

#include <stdio.h>
#include <stdlib.h>
#include<algorithm>
#include<string.h>
struct Student {                                   //定义结构体类型Student
    int num;
    char name[20];
    float score;
};
void input(Student* st, int n);                    //定义输入函数
void print(Student* st, int n);                    //定义输出函数
void sort(Student* st, int n);                     //定义排序函数
void find_EFF(Student* st, int n);                 //定义二分法查找函数
void find_SX(Student* st, int n);                  //定义顺序查找函数
int main()
{
    Student* stu;                                  //定义结构体指针stu
    int n;
    printf("请输入学生总人数: ");                  //输入学生个数
    scanf("%d", &n);
    stu = (Student*)malloc(n * sizeof(Student));   //为stu分配内存空间
    input(stu, n);                                 //调用输入函数
    sort(stu, n);                                  //调用排序函数
    print(stu, n);                                 //调用输出函数
    find_EFF(stu, n);
    find_SX(stu, n);
    system("pause");
    return 0;
}
//输入函数
void input(Student* st, int n)
{
    int i;
    for (i = 0; i < n; i++) {
        printf("请填写 No.%d 学生信息: ", i + 1);
        scanf("%d %s %f", &st[i].num, st[i].name, &st[i].score);
    }
}
//输出函数
void print(Student* st, int n)
{
    Student* p;
    for (p = st, printf("以学号进行升序排列:\n"); p < st + n; printf("%d %-7s %.2f\n", p->num, p->name, p->score), p++);
}
//升序排序函数
void sort(Student* st, int n)
{
    int i, j;
    Student temp;
    for (i = 0; i < n; i++)
        for (j = i + 1; j < n; j++)
            if (st[i].num > st[j].num) {
                temp = st[i], st[i] = st[j], st[j] = temp;
            }
}
//二分法查找学号
void find_EFF(Student* st, int n)
{
        int i=0;
        int ans = -1;                            //目标元素下标,初始化为-1
        int x=0;
        scanf("%d",&x);                            //待查找的学号
        int top = st[i].num;
        int base = 0;
        while (top >= base) {                    //查找自己不为空集时重复二分查找
            int mid = (top + base) / 2;            //中间点学号
            int tmp;                            //比较中间点学号与目标学号
            if (st[mid].num > x)
            {
                tmp = 1;
            }
            else if (st[mid].num == x) {
                tmp = 0;
            }
            else {
                tmp = -1;
            }
            if (tmp == 0) {
                ans = mid;
                break;                            //若相等,查找成功跳出
            }
            else if (tmp > 0) top = mid - 1;
            else base = mid + 1;
        }
        if (ans == -1) {
            printf("查无此人!\n");                //查找失败
        }
        else 
            printf("ans");                      //查找成功
    
}
//顺序查找姓名
void find_SX(Student* st, int n)
{
    char key_name[20] = {};
    int i=0;
    int value;
    printf("请输入要查找的学生姓名: ");
    scanf("%s", &key_name);
    value = strcmp(st[i].name, key_name);
    for(i=0;i<n;i++)
        if (value == 0) {                       //查找成功 
            printf("i");
        }
        else 
            printf("查无此人!\n");             //查找失败 
}

运行结果及报错内容

img

我想要达到的结果
有n个学生信息(包括学号,姓名,成绩),按“学号升序”存储在一个结构体数组中,分别用两个函数完成完成按“学号”、“姓名”两个属性进行查找,找出其在数组中是第几个元素。如果不在数组中,则输出“查无此人”。其中学号的查找采用二分法查找,姓名的查找用顺序查找

  • 写回答

2条回答 默认 最新

  • kinghero123456 2022-04-14 16:59
    关注

    等待你输入学生编号

    img

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

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?