8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工

 

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);
}

运行结果:

 

posted @ 2017-07-29 17:38  Allen101  阅读(3349)  评论(0编辑  收藏  举报