输入10个职工姓名和职工号
按职工号由小到大输出
输入职工号,按照折半法查找姓名;
#include <stdio.h>
char name[10][8]; //10个职工名称
unsigned short na[10], t; //10个职工序号
void s_r() //输入职工名称和序号
{
short i;
for (i = 0; i < 10; i++)
{
printf("请输入第%d个:\t", i + 1);
scanf("%s %d", name[i], &na[i]);
}
}
void s_c() //输出职工名称和序号
{
short i;
for (i = 0; i < 10; i++)
{
printf("%s\t%d\n", name[i], na[i]);
}
}
void P_X() //职工按照序号排序
{
short i, j;
for (i = 0; i < 10; i++)
for (j = i + 1; j < 10; j++)
if (na[i] > na[j])
t = na[i], na[i] = na[j], na[j] = t;
}
short C_Z(short na_CZ) //折中法找寻职工
{
short L = 0, H = 9, f; //L为最左边的,H为最右边的,f是中间;
while (L <= H) //当H>L时候结束
{
f = (L + H) / 2;//取中间值
if (na[f] > na_CZ) //当中间值大于找寻值
H = f - 1; //右边的等于中间值左边的值,中间值对比过了
else if (na[f] < na_CZ)
L = f + 1;
else
return f; //当中间值等于找寻值结束
}
return -1;
}
int main()
{
short i; //输入需要寻找的职工序号 输入0结束
s_r();
P_X();
s_c();
while (1)
{
printf("输入0结束,输入职工号返回名字:");
scanf("%d", &i);
if (i)
{
i = C_Z(i);
if (i >= 0) //判断是否找到
printf("%s\n", name[i]); //输出职工名称
else
printf("无该职工\n");
}
else
break; //结束
}
printf("结束");
return 0;
}
输入:
请输入第1个: a 15
请输入第2个: b 56
请输入第3个: c 97
请输入第4个: d 85
请输入第5个: e 54
请输入第6个: f 14
请输入第7个: s 64
请输入第8个: q 47
请输入第9个: r 66
请输入第10个: h 41
输出:
a 14
b 15
c 41
d 47
e 54
f 56
s 64
q 66
r 85
h 97
输入0结束,输入职工号返回名字:
继续输入:54
输出: e
或输入: 13
输出: 无
或输入: 0
输出: 结束