1、输入 (函数原型:int input_info(struct staff s[]); 返回输入的职工信息数,当输入的职工工资号为0时结束) 职工的工资号(5位整数字符串,可以编写函数进行输入有效性验证,不做强制要求。)、姓名、性别,年龄,单位。输入数据后输出职工信息列表 (函数原型:void print_info(struct staff s[],int num); ) 。
2、按工资号由小到大顺序排序(排序算法从交换、冒泡、选择、插入中任选一种),排序(函数原型:void sort_info(struct staff s[] ,int num);)后每个职工的其他信息保持不变;排序后输出职工信息列表。
3、从键盘输入一个职工的工资号,用二分查找法(函数原型:int search_info(struct staff s[],int num, char no[]); 找到则返回下标,未找到返回0。)。在主程序中,如果未找到,则提示“未找到”,如果找到,则打印输出职工的信息(可以编写函数,不做强制要求)。
#include<stdio.h>
#include<string.h>
#define N 3
struct staff
{
char no[6];
char name[20];
char gender;
int age;
char dept[30];
};
//输入信息,当工资号为0时结束输入
//返回输入的个数 (不包括0)
int input_info(struct staff s[])
{
int i;
for(i=0;;i++)
{
scanf("%s",&(s[i].no));
if(strcmp((s[i].no),"0")==0)break;
scanf("%s ",&(s[i].name));
scanf("%c",&(s[i].gender));
scanf("%d",&(s[i].age));
scanf("%s",&(s[i].dept));
}
return i;
}
void print_info(struct staff s[],int num)
{
int i;
for(i=0;strcmp((s[i].no),"0")!=0;i++)
{
printf("%s %s %c %d %s\n",s[i].no,s[i].name,s[i].gender,s[i].age,s[i].dept);
}
}
//按工资号由小到大插入排序 排序后输出职工信息列表
//与普通的插入排序基本一致 但需要用strcmp()比较大小
void sort_info(struct staff s[],int num)
{
int len,i,j;
struct staff temp;
for(i=1;i<num;i++)
{
for(j=i-1;j>=0;j--)
{
if(strcmp(s[j].no,s[j+1].no)==1)//s[j].no>s[j+1].no
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
printf("排序完成!\n");
print_info(s,num);
}
//二分查找
//找到了打印对应的信息并返回下标 找不到输出提示信息并返回-1
//与普通的二分查找基本一致 但需要用strcmp()比较大小
int search_info(struct staff s[],int num, char no[])
{
int left=0,right=num-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if(strcmp(no,s[mid].no)==1)//即no>s[mid].no
{
left=mid+1;
}
else if(strcmp(no,s[mid].no)==-1)
{
right=mid-1;
}
else
{
printf("%s %s %c %d %s\n",s[mid].no,s[mid].name,s[mid].gender,s[mid].age,s[mid].dept);
return mid;
}
}
printf("没找到!\n");
return -1;//为了防止与下标0混淆,返回-1,与题干的要求不同
}
int main()
{
struct staff ak[10];
char searchNo[6];
int n;
printf("请依次输入工资号 姓名 性别 年龄 部门:\n");
n=input_info(ak);
printf("一共输入了%d份数据\n",n);
print_info(ak,n);
sort_info(ak,n);
printf("请输入待查找的工资号:");
scanf("%s",searchNo);
search_info(ak,n,searchNo);
return 0;
}