写几个函数:
①输人10个职工的姓名和职工号; ②按职工号由小到大顺序排序,姓名顺序也随之调整; ③要求输人一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。
#include<stdio.h>
#define N 10
void input(int num[], char name[N][8])
{
int i;
for (i = 0; i < N; i++)
printf("input NO.: ");
scanf("%d", &num[i]);
printf("input name: ");
getchar();
gets(name[i]);
}
void sort(int num[], char name[N][8])
int i, j, min, templ;
char temp2[8];
for (i = 0; i < N - 1; i++)
min = i;
for (j = i; j<N; j++)
if (num[min]>num[j]) min = j;
templ = num[i];
strcpy(temp2, name[i]);
num[i] = num[min];
strcpy(name[i], name[min]);
num[min] = templ;
strcpy(name[min], temp2);
printf("\n result:\n");
printf("\n %5d%10s", num[i], name[i]);
void search(int n, int num[], char name[N][8])
int top, bott, mid, loca, sign;
top = 0;
bott = N - 1;
loca = 0;
sign = 1;
if ((n<num[0]) || (n>num[N - 1]))
loca = -1;
while ((sign == 1) && (top <= bott))
mid = (bott + top) / 2;
if (n == num[mid])
loca = mid;
printf("NO. %d , his name is %s.\n", n, name[loca]);
sign = -1;
else if (n < num[mid])
bott = mid - 1;
else
top = mid + 1;
if (sign == 1 || loca == -1)
printf("%d not been found.\n", n);
int main()
int num[N], number, flag = 1, c;
char name[N][8];
input(num, name);
sort(num, name);
while (flag == 1)
printf("\ninput number to look for:");
scanf("%d", &number);
search(number, num, name);
printf("continue ot not(Y/N)?");
c = getchar();
if (c == 'N' || c == 'n')
flag = 0;
return 0;
typedef struct work{ char name[20]; int num; }worker; void print(worker *arr) { for (int i = 0; i < 10; i++) { printf("职工%d号:",i+1); scanf("%19s %d", arr[i].name, &(arr[i].num)); printf("\n"); } } void sort(worker* arr) { for (int i = 0; i < 9;i++) { int swapped = 0; for (int j = 0; j < 9 - i;j++) { if (arr[j].num > arr[j + 1].num) { worker temp = arr[j]; arr[j] = arr[j+ 1]; arr[j + 1] = temp; swapped = 1; } } if (!swapped) { break; } } } int search(int num1, worker* arr) { int left = 0; int right = 9; int i = 0; int mid = 0; while (left<=right) { mid = (right - left) / 2 + left; if (num1 > arr[mid].num) { left = mid + 1; } else if (num1 < arr[mid].num) { right = mid - 1; } else return mid; } return -1; } int main() { worker arr[10] = {0}; print(arr);//输入10个职工的姓名和职工号 sort(arr);//排序 int num1 = 0; scanf("%d",&num1); int index = search(num1,arr);//查找 if (index != -1) { printf("职工姓名: %s\n", arr[index].name); } else { printf("未找到该职工!\n"); } return 0; }
#include <stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define N 5 struct emp { char name[20]; int id; }; int find(struct emp* p, int id); int main(void) { int id; struct emp e[N] = {{"Nature",20210104},{"Ocean",20210105}, {"张三",20210107},{"贺强",20210108},{ "李茜",20210109 } }; puts("请输入职工号:"); scanf("%d", &id); int i = find(e, id); if (i == -1) { puts("查无此人"); } else { printf("%d:%s ", id,e[i].name); } printf("\n"); return 0;
int find(struct emp* p, int id) { int begin = 0, end = N - 1, mid; while (end >= begin) { mid = (begin + end) / 2; printf("mid %d\n",mid);
if (p[mid].id == id) { //折半查找 return mid; break; } else if (p[mid].id > id) { end = mid-1; //mid已经不能是了 } else { begin = mid+1; } } return -1; // 如果未找到,返回 -1 }
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> struct zhigong { char xingming[20]; char zhigonghao[20]; }gongren[10]; int compare(const void *a,const void *b) { return strcmp((*(struct zhigong *)a).zhigonghao,(*(struct zhigong *)b).zhigonghao); } int main() { for(int i=0;i<10;i++) { scanf("%s%s",gongren[i].xingming,gongren[i].zhigonghao); } qsort(gongren,10,sizeof(struct zhigong),compare); char chazhao[20]; scanf("%s",chazhao); int low=0; int high=9; while(low<=high) { int mid=(low+high)/2; if(strcmp(gongren[mid].zhigonghao,chazhao)!=0) { if(strcmp(gongren[mid].zhigonghao,chazhao)>0) { high=mid-1; } else if(strcmp(gongren[mid].zhigonghao,chazhao)<0) { low=mid+1; } } if(strcmp(gongren[mid].zhigonghao,chazhao)==0) break; } printf("%s",gongren[(low+high)/2].xingming); }
题目解析及答案:
利用二分查...
登录后提交答案