问题遇到的现象和发生背景
代码编译以后无错误,但运行到一半就无法调用后面的两个查找函数。
问题相关代码,
#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"); //查找失败
}
运行结果及报错内容
我想要达到的结果
有n个学生信息(包括学号,姓名,成绩),按“学号升序”存储在一个结构体数组中,分别用两个函数完成完成按“学号”、“姓名”两个属性进行查找,找出其在数组中是第几个元素。如果不在数组中,则输出“查无此人”。其中学号的查找采用二分法查找,姓名的查找用顺序查找