根据题目,我们可以先来想一想思路:题目要求我们写三个函数,要输入10个职工的工号和姓名,那肯定用数组来储存这些信息,每个职工都有不同的姓名和工号,所以这时候结构体几乎是一个完美的选择,因为它在一定程度上可以将相应的姓名和工号“绑在一起”,从而来实现我们的代码。
第二,排序我们很熟悉了,那结构体里面交换就不能单纯的定义一个普通变量,需要一个结构体变量作为交换值,记住访问结构体变量要用'.'操作符。
三,我们要知道折半法的原理,看代码大概是可以看出来它是怎么回事,如果没有这个员工的话,最后的low>high。所以加上if-else语句更符合习惯。
#include<stdio.h>
struct stuff//定义一个结构体,这里面包括职员的工号和姓名
{
int id;
char name[10];//储存人的名字,不能写成name,要不然每个人的名字只能是一个字符
};
void input(struct stuff stu[]);
void sort(struct stuff stu[]);
void find(struct stuff stu[],int id);
int main()
{
struct stuff stu[10];//定义结构体数组和指针
int id;
input(stu);
sort(stu);
printf("请输入你要查询的职工号:\n");
scanf("%d",&id);
find(stu,id);
return 0;
}
void input(struct stuff stu[])
{
int i,j;
for(i=0;i<10;i++)
{
printf("输入%d个职工的姓名和职工号\n",i+1);
scanf("%s %d",stu[i].name,&stu[i].id);
}
}
void sort(struct stuff stu[])
{
struct stuff t;//定义一个结构体变量作为交换值
int i,j;
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(stu[i].id>stu[j].id)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
}
printf("职工号由小到大顺序后:\n");
for(i=0;i<10;i++)
{
printf("职工号:%d,姓名:%s\n",stu[i].id,stu[i].name);
}
}
void find(struct stuff stu[],int id)
{
int low=0,high=9,mid;
while (low<=high)
{
mid=(low+high)/2;
if(id==stu[mid].id)
break;
else if(id>stu[mid].id)
{
low=mid+1;
}
else high=mid-1;
}
if(low<=high)
{
printf("该员工的名字为:%s\n工号为:%d",stu[mid].name,stu[mid].id);
}
else printf("找不到该员工");
}
//typedef struct stuff S;//typedef可以将类型和变量名换成别的东西,更简单
// 也可以在定义的时候写
// typedef struct stuff
// {
// }S;