题7.15:要求输入一个职工号,用折半查找法查找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。按职工号由小到大顺序排序,姓名顺序也随之调整

题目

本题是谭浩强《C程序设计课后习题》题7.15。
题目:
写几个函数:
1.输入10个职工的姓名和职工号。
2.按职工号由小到大顺序排序,姓名顺序也随之调整
3.要求输入一个职工号,用折半查找法查找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。


以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj

一、解题思路

思路:
按题目给出思路:
1.定义职工号和姓名两个数组,职工号为整形int id[N],职工姓名为char name[N][NAME_SIZE];
2.使用冒泡排序进行职工号的排序,姓名用strcpy排序。
3.折半查找的核心方法具体看代码部分。

二、代码部分

1.引入库

代码如下(示例):

#include<stdio.h>
#include<string.h>
#define N 10
#define NAME_SIZE 10

2.函数部分

代码如下(示例):

void Input(int id[], char name[][NAME_SIZE])
{
	for (int i = 0; i < N; i++)
	{
		printf("输入职工号:");
		scanf("%d", &id[i]);
		getchar();//用于忽略所输入的回车符号。
		printf("输入职工的姓名:");
		gets(name[i]);
	}
}
void Output(int id[], char name[][NAME_SIZE])
{
	for (int i = 0; i < N; i++) {
		printf("[%d],[%s]\n", id[i],name[i]);
	}
}
//使用冒泡排序进行姓名与职工号同时排序
void Sort(int id[], char name[][NAME_SIZE])
{
	char tmp_name[NAME_SIZE];//定义临时字符串,用于存储临时变量
	for (int i = 0; i < N - 1; i++)
	{
		for (int j = 0; j < N - i - 1; j++)
		{
			if (id[j] > id[j + 1])
			{
				int tmp_id = id[j];
				strcpy(tmp_name, name[j]);
				id[j] = id[j + 1];
				strcpy( name[j],name[j+1]);
				id[j + 1] = tmp_id;
				strcpy( name[j + 1], tmp_name);
			}
		}
	}
}
//二分查找(折半查找)算法设计查找的规律
void Search(int id[], char name[][NAME_SIZE], int key)
{
	int low = 0;
	int high = N - 1;
	int mid;
	while (low <= high) 
	{
		mid = (low + high) / 2;
		if (key == id[mid])
			break;
		if (key < id[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}
	if (low <= high)
		printf("职工号为%d的职工姓名为:%s\n", key, name[mid]);
	else
		printf("要查找的职工号为%d的职工不存在。\n",key);
}

2.主函数部分

代码如下(示例):

int main() {
	int id[N];//职工号
	char name[N][NAME_SIZE];//职工号对应的职工姓名
	Input(id, name);
	Output(id,name);
	Sort(id, name);
	printf("\n");
	Output(id, name);
	int no;
	while (1)
	{
		printf("请输入要查找的职工号:");
		scanf("%d", &no);
		Search(id, name, no);
	}
	return 0;
}

三、执行结果

在这里插入图片描述

输出:

输入职工号:1
输入职工的姓名:李文杰
输入职工号:3
输入职工的姓名:葛新龙
输入职工号:2
输入职工的姓名:卓永超
[1],[李文杰]
[3],[葛新龙]
[2],[卓永超]

[1],[李文杰]
[2],[卓永超]
[3],[葛新龙]
请输入要查找的职工号:5
要查找的职工号为5的职工不存在。
请输入要查找的职工号:2
职工号为2的职工姓名为:卓永超
请输入要查找的职工号:1
职工号为1的职工姓名为:李文杰
请输入要查找的职工号:3
职工号为3的职工姓名为:葛新龙
  • 12
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志冲海大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值