嗨,别那么说 2016-04-30 02:37 采纳率: 100%
浏览 1771
已采纳

C语言--折半法的问题,求大神指点

对于某公司的职工进行工资排序,且用折半法找到指定的职工

#include<string.h>
#define M 3
void inputName(char name[][121],double money[]);
void ouput(char name[][121],double money[]);
void sortPay(char name[][121],double money[]);
void sortName(char name[][121],double money[]);
int zhe(char name[][121],double money[]);
void main()
{
    char name[M][121];
    double money[M]={0};
    char m[121];
    int g;
    inputName(name,money);
    printf("输出原样:\n");
    ouput(name,money);
    sortPay(name,money);
    printf("按工资输出:\n");
    ouput(name,money);
    sortName(name,money);
    printf("按姓名输出:\n");
    ouput(name,money);
    printf("请输入要查找的职工姓名:");
    gets(m);
    g=zhe(name,money,m);
    if(g!=-1)
    {
        printf("输出该职工%s\n",m);
    }
    else
    {
        printf("没有此人\n");
    }

}
//写一个函数,输入m个职工的姓名和工资
void inputName(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("输出职工姓名:");
        scanf("%s",&name[i]);
        printf("输入职工工资:");
        scanf("%lf",&money[i]);
        getchar();
    }
    printf("\n");
}
//写一个函数,输出m个职工的姓名和工资
void ouput(char name[][121],double money[])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("%s   %g\n",name[i],money[i]);
    }
}
//写一个函数,对m个职工的工资进行升序排列,姓名也随着调整
void sortPay(char name[][121],double money[])
{
    int i,j;
    double t;
    char x[121];
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(money[j]<money[j+1])
            {
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
                strcpy(x,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],x);
            }
        }
    }
}
//写一个函数,对m个职工的姓名进行升序排列,工资也随着调整
void sortName(char name[][121],double money[])
{
    int i,j;
    char xm[121];
    double t;
    for(i=1;i<M;i++)
    {
        for(j=0;j<M-i;j++)
        {
            if(strcmp(name[j],name[j+1])<0)
            {
                strcpy(xm,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],xm);
                t=money[j];
                money[j]=money[j+1];
                money[j+1]=t;
            }
        }
    }
}
//写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1
int zhe(char name[][121],double money[],char m[])
{
    int top,bottom,mid;
    top=0;
    bottom=M-1;
    mid=(top+bottom)/2;
    while(top<=bottom)
    {
        mid=(top+bottom)/2;
        if(strcmp(m,name[mid][121])<0)
        {
            top=mid+1;
        }
        else if(strcmp(m,name[mid][121])>0)
        {
            bottom=mid-1;
        }
        else
        {
            return mid;
        }

    }
    return -1;
}


  • 写回答

3条回答

  • 小灸舞 2016-04-30 02:53
    关注

    zhe函数里两个strcmp应该都改为strcmp(m,name[mid])<0

     #include<string.h>
    #include<stdio.h>
    #define M 3
    void inputName(char name[][121],double money[]);
    void ouput(char name[][121],double money[]);
    void sortPay(char name[][121],double money[]);
    void sortName(char name[][121],double money[]);
    int zhe(char name[][121],double money[],char m[]);
    void main()
    {
        char name[M][121];
        double money[M]={0};
        char m[121];
        int g;
        inputName(name,money);
        printf("输出原样:\n");
        ouput(name,money);
        sortPay(name,money);
        printf("按工资输出:\n");
        ouput(name,money);
        sortName(name,money);
        printf("按姓名输出:\n");
        ouput(name,money);
        printf("请输入要查找的职工姓名:");
        gets(m);
        g=zhe(name,money,m);
        if(g!=-1)
        {
            printf("输出该职工%s\n",m);
        }
        else
        {
            printf("没有此人\n");
        }
    
    }
    //写一个函数,输入m个职工的姓名和工资
    void inputName(char name[][121],double money[])
    {
        int i;
        for(i=0;i<M;i++)
        {
            printf("输出职工姓名:");
            scanf("%s",&name[i]);
            printf("输入职工工资:");
            scanf("%lf",&money[i]);
            getchar();
        }
        printf("\n");
    }
    //写一个函数,输出m个职工的姓名和工资
    void ouput(char name[][121],double money[])
    {
        int i;
        for(i=0;i<M;i++)
        {
            printf("%s   %g\n",name[i],money[i]);
        }
    }
    //写一个函数,对m个职工的工资进行升序排列,姓名也随着调整
    void sortPay(char name[][121],double money[])
    {
        int i,j;
        double t;
        char x[121];
        for(i=1;i<M;i++)
        {
            for(j=0;j<M-i;j++)
            {
                if(money[j]<money[j+1])
                {
                    t=money[j];
                    money[j]=money[j+1];
                    money[j+1]=t;
                    strcpy(x,name[j]);
                    strcpy(name[j],name[j+1]);
                    strcpy(name[j+1],x);
                }
            }
        }
    }
    //写一个函数,对m个职工的姓名进行升序排列,工资也随着调整
    void sortName(char name[][121],double money[])
    {
        int i,j;
        char xm[121];
        double t;
        for(i=1;i<M;i++)
        {
            for(j=0;j<M-i;j++)
            {
                if(strcmp(name[j],name[j+1])<0)
                {
                    strcpy(xm,name[j]);
                    strcpy(name[j],name[j+1]);
                    strcpy(name[j+1],xm);
                    t=money[j];
                    money[j]=money[j+1];
                    money[j+1]=t;
                }
            }
        }
    }
    //写一个函数,findByName,用折半法按姓名查找指定的职工,找到返回数组下标,找不到返回-1
    int zhe(char name[][121],double money[],char m[])
    {
        int top,bottom,mid;
        top=0;
        bottom=M-1;
        mid=(top+bottom)/2;
        while(top<=bottom)
        {
            mid=(top+bottom)/2;
            if(strcmp(m,name[mid])<0)
            {
                top=mid+1;
            }
            else if(strcmp(m,name[mid])>0)
            {
                bottom=mid-1;
            }
            else
            {
                return mid;
            }
    
        }
        return -1;
    }
    
    

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R