`## C语言练习题
- 写几个函数:
1、输入职工姓名和职工号
2、按职工号从小到大排序
3、输入职工号,用折半查找法找出姓名并输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 10
int main()
{
void input_s(int s[],char [][8]);//函数声明
void sort_sno(int s[],char [][8]);//函数声明
void search_sno(int key,int s[],char [][8]);//函数声明
int c,number;//定义查找关键字
int s[M];//全局数组
char name[M][8];//全局数组
while(1)
{
printf("*****************MENU******************\n");
printf("0:录入职工信息\n");
printf("1:按职工号排序\n");
printf("2:查找职工\n");
printf("3:退出\n");
printf("please choose:");
scanf("%d",&c);
switch(c)
{
case 0:
input_s(s,name);//函数调用
break;
case 1:
sort_sno(s,name);//函数调用
break;
case 2:
printf("input sno you wnat to search:");
scanf("%d",&number);
search_sno(number,s,name);//函数调用
break;
case 3:
exit(1);//退出系统
default:
break;
}
}
return 0;
}
void input_s(int s[M],char name[][8])//录入职工信息
{
int i;
for(i=0; i<M; i++)
{
printf("input sno:");
scanf("%d",&s[i]);
printf("input name:");
getchar();//
gets(name[i]);
}
}
void sort_sno(int s[M],char name[][8])//
{
int i,j,temp;
char tem[8];
for(i=0; i<M; i++)//冒泡排序
for(j=0; j<M-i; j++)
if(s[j]>s[j+1])
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
strcpy(tem,name[j]);//字符串赋值,等号赋值只适用于单个字符(用'='需要for循环)
strcpy(name[j],name[j+1]);//同上
strcpy(name[j+1],tem);//同上
}
printf("staff sorted by sno:\n");
for(i=0; i<M; i++)
printf("%4d %5s\n",s[i],name[i]);
}
void search_sno(int key,int s[M],char name[][8])//找职工
{
int top,bot,mid,loca,flag;
bot=0;
top=M-1;
loca=0;//定义位置
flag=1;//标记
if((key<s[0])||(key>s[M-1]));//看关键字是否在范围内,不在可直接判断出答案
loca=-1;
while((bot<=top)&&(flag==1))//折半查找法
{
mid=(bot+top)/2;
if(key==s[mid])
{
loca=mid;
printf("sno.%d,his name is %s\n",key,name[loca]);
flag=-1;
}
else
{
if(key>s[mid])//取右半区间
bot=mid+1;
else
top=mid-1;//取左半区间
}
}
if(flag==1||loca==-1)
printf("查无此人\n");
}