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

该博客展示了如何使用C语言实现职工信息管理,包括输入10个职工的姓名和职工号,使用冒泡排序按职工号从小到大排序,并通过折半查找法查找指定职工号对应的姓名。程序详细定义了结构体,实现了输入、排序和查找功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <stdio.h>

#define N 10

// 第7章/p216/15
struct Employee {  // 定义结构体
    int id;  // 职工号
    char name[10];  // 姓名
};

void input(struct Employee emp[]);

void sort(struct Employee emp[]);

void search(struct Employee emp[], int id);

int main() {
    struct Employee emp[N], *p = emp;  // 定义结构体数组和结构体指针
    int id;
    input(p);
    sort(p);
    printf("请输入查询职工号:");
    scanf("%d", &id);
    search(p, id);
    return 0;
}

// 输入10个职工的数据记录
void input(struct Employee emp[]) {
    for (int i = 0; i < N; i++) {
        printf("输入%d个职工姓名和职工号:", i + 1);
        scanf("%d %s", &emp[i].id, emp[i].name);
    }
}

// 按职工号由小到大排序,姓名顺序也随之调整(使用冒泡排序:从小到大)
void sort(struct Employee emp[]) {
    struct Employee temp;   // 交换时的临时变量
    for (int i = 0; i < N - 1; i++) {
        for (int j = 0; j < N - 1 - i; j++) {
            if (emp[j].id > emp[j + 1].id) {
                temp = emp[j];
                emp[j] = emp[j + 1];
                emp[j + 1] = temp;
            }
        }
    }
    printf("职工号由小到大顺序后:\n");
    for (int i = 0; i < N; i++) {
        printf("职工号:%d,姓名:%s", emp[i].id, emp[i].name);
        printf("\n");
    }
}

// 输入要查找的职工号,输出该职工姓名(折半查找法,前提已排好序)
void search(struct Employee emp[], int id) {
    int low = 0, high = N - 1, mid; // low:最低索引,high:最高索引,mid:中间项索引
    while (low <= high) {
        mid = (low + high) / 2; // 求出mid在low和high之间的位置
        if (id == emp[mid].id) break; // 若id等于emp[mid].id,则直接返回,结束循环
        else if (id > emp[mid].id) low = mid + 1; // 若id大于emp[mid].id,low从mid处开始加1,即下一轮循环从[mid+1,high]查找
        else high = mid - 1;  // 若id小于emp[mid].id,high从mid处开始减1,即下一轮循环从[low,mid-1]查找
    }
    if (low <= high)
        printf("职工号为%d的员工姓名为:%s", emp[mid].id, emp[mid].name);
    else
        printf("找不到或不存在该职工!");
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杼蛘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值