(C语言)职工信息管理

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; 
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值