①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
采用结构体数组
代码:
#include <stdio.h>
#include <string.h>
#define N 5
struct Employee{
int id;
char name[10];
};
int main(){
void input(struct Employee st[]);
void sort(struct Employee st[]);
void search(struct Employee st[],int num);
struct Employee st[N];
input(st);
sort(st);
printf("----------------------------\n");
int num;
printf("请输入您要查询的员工的id号\n");
scanf("%d",&num);
search(st,num);
return 0;
}
void input(struct Employee st[]){
for(int i=0;i<N;i++){
printf("请输入第%d个员工的id号: ",i+1);
scanf("%d",&st[i].id);
printf("请输入第%d个员工的姓名: ",i+1);
scanf("%s",st[i].name);
// printf("%d --> %s\n",st[i].id,st[i].name);
}
printf("----------------------------\n");
printf("您输入的员工信息如下:\n");
for(int i=0;i<N;i++){
printf("%d ",st[i].id);
printf("%s\n",st[i].name);
}
printf("\n");
}
void sort(struct Employee st[]){
printf("----------------------------\n");
struct Employee min,temp;
for(int i=0;i<N-1;i++){
min=st[i];
for(int j=i+1;j<N;j++){
if(min.id>st[j].id){
temp=min;
min=st[j];
st[j]=temp;
}
}
//本次结构体变量之间用的值传递的方式
st[i]=min;
}
printf("按员工号,从小到大排序后的结果如下:\n");
for(int i=0;i<N;i++){
printf("%d ",st[i].id);
printf("%s\n",st[i].name);
}
printf("\n");
}
void search(struct Employee st[],int num){
printf("查询后的结果如下:\n");
/*
for(int i=0;i<N;i++){
if(num==st[i].id){
printf("该员工id为: %d, 姓名为: %s\n",st[i].id,st[i].name);
}
}
*/
//折半查找,数组折半下标,对比下标对应的数值
int start=0,end=N-1,mid,flag=1;
while(flag){
mid=(start+end)/2;
if(num==st[mid].id){
printf("该员工id为: %d, 姓名为: %s\n",st[mid].id,st[mid].name);
flag=0;
}
else if(num<st[mid].id){
end=mid-1;
}
else{
//num>st[mid].id
start=mid+1;
}
if(mid>end||mid<start){
printf("没有这个员工!\n");
flag=0;
}
}
}
运行结果: