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

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM