标题:此处折半咋找为何失效,输入职工号却无法打印出对应工号的名字。
只看楼主
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
结帖率:100%
已结贴  问题点数:10 回复次数:8 
此处折半咋找为何失效,输入职工号却无法打印出对应工号的名字。
/* 11、写几个函数:
1、输入10个职工的姓名和职工号;
2、按职工号由小到大顺序排序,姓名跟随顺序也随之调整;
3、要求输入一个职工号,用折半查找法找出该职工的姓名,并输出该姓名。从主函数输入要查找的职工号。
*/
#include"stdio.h"
#include "string.h"
#define M 50
#define size 10
int input(int num[],char name[10][8])
{
    int i;
    for(i=0;i<10;i++)
    {
        printf("input NO.:");
        scanf("%d",&num[i]);
        printf("Input name:");
        getchar();//(清空缓冲区里关于No.的数值)等用户按下回车后从从键盘缓冲区中逐个读取姓名类的字符*/
        gets(name[i]);
    }
}
/*按职工号由小到大顺序排序,姓名顺序也随之调整*/
void sort(int num[],char name[10][8])
{
    int i,j,temp;
    char s[M];
    for(i=0;i<10;i++)
        for(j=0;j<10-i;j++)
        {
            if(num[j]>num[j+1])
            {
                temp=num[j];
                strcpy(s,name[j]);
                num[j]=num[j+1];
                strcpy(name[j],name[j+1]);
                num[j+1]=temp;
                strcpy(name[j+1],s);
            }
        }
    printf("After sorted:\n");
    for(i=0;i<10;i++)
        printf("\n%d     %s",num[i],name[i]);
}
/*升序的折半查找(查找职工号)*/
int search(int num[size],char name[10][8],int n)
{
    int low=0,high=size-1,mid;
    int flag,sign;
    if(n<num[0]||n>num[size-1])
        sign=0;//所查找的数不存在
    while(low<high)
    {
        mid=(low+high)/2;
        if(n<num[mid])
            high=mid-1;
        else if(n>num[mid])
            low=mid+1;
        else
        {
            return mid;
            flag=1;//折半查找成功的标志
        }
    }
    if(flag==1)
        printf("No.:%d,his name:%s\n",n,name[mid]);
    if(sign==0||flag==0)//查找的数不存在
        printf("Error!%d can not be found!",n);
}
int main()
{
    int num[10],number;
    char name[10][8];
    input(num,name);
    sort(num,name);
    printf("\ninput a number you want to refer:\n");
    scanf("%d",&number);
    search(num,name,number);
    return 0;
}






搜索更多相关主题的帖子: include 缓冲区 姓名 
2016-06-13 18:36
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
题目要求使用函数,所以没有使用struct结构。(C6.0++运行)若输入的职工号不存在则有提示。
2016-06-13 18:38
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:10 
#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#define M 10
int input(int num[],char name[M][8])
{
    int i;
    for(i=0;i<M;i++)
    {
        printf("input NO.:");
        scanf("%d",&num[i]);
        printf("Input name:");
        getchar();//(清空缓冲区里关于No.的数值)等用户按下回车后从从键盘缓冲区中逐个读取姓名类的字符*/
        gets(name[i]);
    }
}
/*按职工号由小到大顺序排序,姓名顺序也随之调整*/
void sort(int num[],char name[M][8])
{
    int i,j,temp;
    char s[8];
    for(i=0;i<M;i++)
        for(j=i;j<M;j++)
        {
            if(num[i]>num[j])
            {
                temp=num[i];
                strcpy(s,name[i]);
                num[i]=num[j];
                strcpy(name[i],name[j]);
                num[j]=temp;
                strcpy(name[j],s);
            }
        }
    printf("After sorted:\n");
    for(i=0;i<M;i++)
        printf("\n%d     %s",num[i],name[i]);
}
/*升序的折半查找(查找职工号)*/
void search(int num[],char name[M][8],int n)
{
    int low=0,high=M-1,mid;
    int flag,sign;
    if(n<num[0]||n>num[M-1])
    {
        printf("所查找的数不存在\n");
        exit(0);
    }
    while(low<high)
    {
        mid=(low+high)/2;
        if(n==num[mid])
        {
            printf("%d  %s",num[mid],name[mid]);
            exit(0);
        }
        else if(n<num[mid]) high=mid-1;
            else if(n>num[mid]) low=mid+1;      
    }
    printf("所查找的数不存在");
}
int main()
{
    int fl,num[M],number;
    char name[M][8];
    input(num,name);
    sort(num,name);
    printf("\ninput a number you want to refer:\n");
    scanf("%d",&number);
    search(num,name,number);
    return 0;
}
2016-06-13 23:20
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
我调试谢谢~~
2016-06-15 09:15
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
一直查不出来,语法没错。逻辑一直绕不过去。。
2016-06-15 09:15
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
谢谢,已经通过。就是stdlib.h的函数没有去看,不知道两个exit(0)无条件退出是直接退出循环还是退出了。。?
2016-06-15 09:38
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
for(i=0;i<M;i++)
         for(j=i;j<M;j++)
         {
             if(num[i]>num[j])//此处if(num[j]>num[j+1])相等
             {
                 temp=num[i];
                 strcpy(s,name[i]);
                 num[i]=num[j];
                 strcpy(name[i],name[j]);
                 num[j]=temp;
                 strcpy(name[j],s);
             }
2016-06-15 09:51
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
不一样,细节果然很重要。
2016-06-15 09:55
乔奇CO
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2016-3-21
得分:0 
void sort(int num[],char name[N][8])
{
    int i,j,temp;
    char s[20];
    for(i=0;i<N;i++)
        for(j=i;j<N;j++)
        {
            if(num[j]>num[j+1])//还是可以,冒泡排序的。
            {
                temp=num[j];
                strcpy(s,name[j]);
                num[j]=num[j+1];
                strcpy(name[j],name[j+1]);
                num[j+1]=temp;
                strcpy(name[j+1],s);
            }
        }
    printf("After sorted:\n");
    for(i=0;i<N;i++)
        printf("\n%d     %s",num[i],name[i]);
}
2016-06-15 09:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465920-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.274645 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved