问题 P : C语言8.27
题目描述
用函数分别实现下列的功能:
(1) 输入10个职工的姓名和职工号;
(2) 按照职工号由小到大的顺序排序,注意需要随之调整姓名顺序;
(3) 输入一个职工号,用折半查找法找出该职工的姓名,要求通过主函数输入要查找的职工号,同时从主函数输出该职工的姓名。
输入格式
共有11行。
前10行中的每一行包含了一个职工的姓名和职工号。姓名是一个不包含空格且长度不超过20的字符串,职工号是一个不小于0且不大于1000的整数。
最后一行包含一个职工号,表示需要查找姓名的职工。保证需要查找的职工号一定出现在已经输入的10个职工信息中。
输出
共有11行。
前10行每一行输出按照职工号从小到大排序后的职工信息,包括姓名和职工号,用一个空格隔开。
最后一行输出查找到的职工姓名。
请注意行尾输出换行。
样例输入
Zhao 10
Qian 23
Sun 9
Li 0
Zhou 88
Wu 43
Zheng 20
Wang 19
Jiang 26
Dai 79
20
样例输出
Li 0
Sun 9
Zhao 10
Wang 19
Zheng 20
Qian 23
Jiang 26
Wu 43
Dai 79
Zhou 88
Zheng
提示[+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
提示[-]
#include<stdio.h>
#define N 10
#include<string.h>
void input(int num[N],char name[N][21])//?
{
int i;
for(i=0;i<N;i++)
{
printf("\nInput NO&name:");
scanf("%d",&num[i]);
getchar();
gets(name[i]);
}
}
void output(int num[N],char name[N][21])
{
int i;
printf("\nresult:\n");
for(i=0;i<N;i++)
printf("\n%5d%10s",num[i],name[i]);
}
void sort(int num[N],char name[N][21])
{
int i,j,min,t;
char temp[21];
for(i=0;i<N-1;i++)
{min=i;
for(j=1+i;j<N;j++)
if(num[min]>num[j])
min=j;
if(min!=i)
{
t=num[i];
num[i]=num[min];
num[min]=t;
strcpy(temp,name[i]);
strcpy(name[i],name[min]);
strcpy(name[min],temp);
} }
}
void search(int n,int num[N],char name[N][21])
{
int top=0,bott=N-1,mid,flag=1;
while(flag&&top<=bott)
{
mid=(bott+top)/2;
if(n==num[mid])
{
printf("NO.%d,His name is%s.\n",n,name[mid]);
flag=0;
}
else if(n<num[mid])
bott=mid-1;
else top=mid+1;
}
if(flag)
printf("can't find %d.\n",n);
}
int main()
{
int num[N],number,c,n;
char name[N][21];
input(num,name);
sort(num,name);
output(num,name);
do
{
printf("\nInput number to look for:");
scanf("%d",&number);
search(number,num,name);
printf("Continue or not?(Y/N)?");
getchar();
c=getchar();
}
while(c=='y'||c=='Y');
}