8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,
从主函数输入要查找的职工号,输出该职工。
写的时候为方便输入,我设的是输入3名职工的信息。 #define N 3
#include <stdio.h> #define N 3 #define LEN 20 //定义一个结构体类型 struct student{ char name[LEN]; int num; }; int main(){ int no; void output(struct student stu[]); void input(struct student stu[]); void sortByNum(struct student stu[]); void binSearch(int no,struct student stu[]); struct student stu[N]; input(stu); output(stu); sortByNum(stu); output(stu); printf("请输入要查找的职工号no.:\n"); scanf("%d",&no); binSearch(no,stu); return 0; } //输入N 名职工的姓名和编号 void input(struct student stu[]){ printf("请输入%d职工的姓名和编号:\n",N); for(int i=0; i<N; i++){ scanf("%s %d",stu[i].name,&stu[i].num); } } //输出职工的姓名编号 void output(struct student stu[]){ for(int i=0; i<N; i++){ printf("name:%20s, no.:%5d\n",stu[i].name,stu[i].num); } } //按职工号从小到大排序,姓名也随之排序 //选择排序 void sortByNum(struct student stu[]){ int min,i,j; struct student t; for(i=0; i<N; i++){ min=i; for(j=i+1; j<N; j++){ if(stu[j].num < stu[min].num){min=j;} } if(min!=i){ t=stu[min]; stu[min]=stu[i]; stu[i]=t; } } printf("按职工号从小到大排序完毕.\n"); } //二分查找职工编号 void binSearch(int no,struct student stu[]){ //赋初始值 int low=0,high=N-1,mid; while(low<=high) { mid=(low+high)/2; if(no>stu[mid].num){low=mid+1;} else if(no<stu[mid].num){high=mid-1;} else if(no==stu[mid].num) {printf("name:%s\n",stu[mid].name); break; } } //循环结束有两个原因:1.break。2. low>high. 需要再次判断无解的原因。 if(low>high) printf("can‘t find the no.%d worker.",no); }
运行结果:
时间: 2024-10-05 06:17:37