1 概述
写几个函数。
- 输入10个职工的姓名和职工号
- 按职工号由小到大排序,姓名也随之调整
- 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名
2 解法
//C程序设计第五版(谭浩强)
//章节:第七章 用函数实现模块化程序设计
//练习7.15 写几个函数。
// 1)输入10个职工的姓名和职工号
// 2)按职工号由小到大排序,姓名也随之调整
// 3)要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名
#include <stdio.h>
#include <string.h>
int main()
{
void input_num_name(double num[], char name[][16], int n);
void sort_num_name(double num[], char name[][16], int n);
void seek_num_name(double num[], char name[][16], int n, int seek_num);
double num[100],seek_num;
int i,j,n;
char name[100][16];
printf("您公司有多少位员工:");
scanf("%d", &n);
input_num_name(num, name, n);
sort_num_name(num, name, n);
printf("请输入您要查找的员工工号:");
scanf("%lf", &seek_num);
seek_num_name(num, name, n, seek_num);
return 0;
}
void input_num_name(double num[], char name[][16], int n)
{
int i,j;
for(i=0;i<n;i++){
printf("请您输入第%d位员工的工号和姓名,空格隔开:\n",i+1);
scanf("%lf", &num[i]);
gets(name[i]);
}
printf("您的所有员工信息如下:\n");
for(i=0;i<n;i++){
printf("工号:%lf 姓名:%s\n", num[i], name[i]);
}
}
void sort_num_name(double num[], char name[][16], int n)
{
printf("按工号由小到大排序如下:\n");
int i,j;
double temp_num;
char temp_name[16];
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
if(num[j]>num[j+1]){
temp_num = num[j];
num[j] = num[j+1];
num[j+1] = temp_num;
strcpy(temp_name,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp_name);
// temp_name = name[j]; // 字符串数组不能直接赋值交换,必须要通过strcpy来进行
// name[j] = name[j+1];
// name[j+1] = temp_name;
}
}
}
for(i=0;i<n;i++){
printf("工号:%lf 姓名:%s\n", num[i], name[i]);
}
}
void seek_num_name(double num[], char name[][16], int n, int seek_num)
{
int low = 0;
int high = n-1;
int mid;
int i=1;
while(low<high){
mid = (high+low)/2;
if(num[mid]==seek_num){
printf("您要查找的员工信息如下:\n工号:%lf 姓名:%s", num[mid], name[mid]);
i = 0;
break;
}else if(num[mid]>seek_num){
high = mid-1;
}else{
low = mid+1;
}
}
if(i){
printf("本公司暂无此员工!");
}
}