c程序設計 8.15寫幾個函數:①輸個職工的姓名和職工號;②按職工號由小到大順序排序,姓名順序也隨之調整;③要求輸入一個職工號,用折半法找出該職工的姓名,從主函數輸入要查找的職工號,輸出該職工
阿新 • • 發佈:2017-07-29
xmx ebr ckey ros lbp loj ase vfk cu2
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); }
運行結果:
c程序設計 8.15寫幾個函數:①輸個職工的姓名和職工號;②按職工號由小到大順序排序,姓名順序也隨之調整;③要求輸入一個職工號,用折半法找出該職工的姓名,從主函數輸入要查找的職工號,輸出該職工