应用二分法

 利用二分法和自定义函数做题

1.输入员工的名字和编号

2.将员工按编号进行排序,姓名也要显示

3.只用输入编号,就能查询该员工

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    void input(int num[10], char name[10][10]);
    void swap(int num[10], char name[10][10]);
    void search(int n, int num[10], char name[10][10]);
    int num[10],n,c;
    int flag = 1;          //循环终止的条件
    char name[10][10];
    input(num, name);
    swap(num, name);
    while (flag == 1)
    {
        printf("请输入要查找人的编号:");
        scanf_s("%d", &n);
        search(n, num, name);
        printf("请问是否要继续,输入Y\N:");
        getchar();
        c= getchar();
        if (c == 'N'||c=='n')
            flag = 0;
    }
    system("pause");
    return 0;
}
void input(int num[10], char name[10][10])
{
    int i;
    for (i = 0; i < 10; i++)
    {
        printf("编号为:");
        scanf_s("%d", &num[i]);
        printf("名字为:");
        getchar();
        gets_s(name[i]);
    }                                                             //这里的输入就可以将一个人的姓名和编号连在一起
}
void swap(int num[10], char name[10][10])
{
    int i, j, t1, k;
    char c[10];
    for (i = 0; i < 9; i++)
    {
        k = i;
        for (j = i + 1; j < 10; j++)
            if (num[k] > num[j])
                k = j;
        t1 = num[k]; num[k] = num[i]; num[i] = t1;
        strcmp(c, name[k]); strcmp(name[k], name[i]); strcmp(name[i], c);
    }
    for (i = 0; i < 10; i++)
    {
        printf("编号为:%d",num[i]);
        printf("名字为:%s",name[i]);
    }
}

//二分法
void search(int n, int num[10], char name[10][10])
{
    int mid;
    int top = 0;
    int bottom = 9,p = 0,q=1;
    if(n<num[0]||n>num[9])
    {
        p = -1;
    }
    while (q == 1 && bottom > top)
    {
        mid = (top + bottom)/2;
        if(num[mid]==n)
        {
            printf("编号:%d名字:%s", n, name[mid]);
            q = -1;
        }
        else if (n < num[mid])
        {
            bottom = bottom - 1;
        }
        else
        {
            top = top + 1;
        }
    }
    if (p == -1 || q == -1)
    {
        printf("输入的数据有误");
    }
    
    

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值