| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1583 人关注过本帖
标题:数组二分查找 求高手解答 哪里错了
只看楼主 加入收藏
lwy2019
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2019-10-11
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:4 
数组二分查找 求高手解答 哪里错了
/*编译通过也可以运行 就是 查找哪里 好像只能查到中间那个数
如果是因为插入一个数使数组长度变化了 我就把 chazao() 中的 high=a 还是不行
还直接把插入那段代码注释掉 还是不行
请教高手 到底哪里错了 要怎么改正*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int chazao(int x, int str[], int a)
{
    int low, high, mid;
    low = 0;
    high = a - 1;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (x < str[mid])
        {
            high = mid - 1;
        }else
            if (x > str[mid])
            {
                low = mid + 1;
            }
            else if (x = str[mid])
            {
                printf("查到成功过,查找了!str[%d]=%d", mid, x);
               
                break;
            }
            //printf("\n查找失败");
            //return 0;
    }
    printf("\n查找失败");
    return 0;
}

void main()
{
    int str[100], a;
    int h;
    A: printf("输入数组个数:");
    scanf("%d", &a);
    printf("输入数组:");
    for (int i = 0; i < a; i++)
    {
        scanf("%d", &str[i]);
        //printf("% d", str[i]);
    }
    for (int i = 0; i < a - 1; i++)
    {
        for ( int j = i+1; j < a; j++)
        {
            if (str[i] < str[j])
            {
                h = str[i];
                str[i] = str[j];
                str[j] = h;
            }
        }
    }
    printf("\n排序后\n");
    for (int i = 0; i < a; i++)
    {
        printf("%  d",str[i]);
    }

    printf("\n输入要插入的数:");
    int b,c;
    int a1, a2;
    scanf("%d", &b);
    c = str[a];
    if (b > c)
    {
        str[a] = b;
    }
    else
    for (int i = 0; i < a; i++)
    {
        if (str[i]>b)
        {
            a1 = str[i];
            str[i] = b;
            for (int j = i + 1; j < a; j++)
            {
                a2 = str[j];
                str[j] = a1;
                a1 = a2;
            }
            break;
        }
        
    }
    for (int i = 0; i < a ; i++)
    {
        for (int j = i + 1; j < a+1; j++)
        {
            if (str[i] < str[j])
            {
                h = str[i];
                str[i] = str[j];
                str[j] = h;
            }
        }
    }
    for (int k = 0; k < a + 1; k++)
    {
        printf("%  d", str[k]);
    }
    printf("\n");
    B: printf("输入要查找的数:");
    int x;
    scanf("%d", &x);
    chazao(x, str, a);
    goto B;
    ////goto A;
    system("pause");
}
图片附件: 游客没有浏览图片的权限,请 登录注册


搜索更多相关主题的帖子: mid str printf int for 
2019-10-17 12:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
先看 main 函数
c = str[a]; 中 str[a] 还没初始化吧,我猜可能你想要的是 c = str[a-1]
当下一句 if (b > c) 又令人迷糊了,既然你倒着排序,难道不应该是 if( b <= c )
chazao(x, str, a); 既然你插入了一个数,难道 a 不需要加一

再看 chazao 函数
if (x < str[mid])
{
    high = mid - 1;
}
else if (x > str[mid])
{
    low = mid + 1;
}
你知道不知道自己是倒着排序的?x比str[mid]小时,应当增大low;反之应当减小high。
2019-10-17 14:03
lwy2019
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2019-10-11
收藏
得分:0 
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int chazao(int x, int str[], int a)
{
    int low, high, mid;
    low = 0;
    high = a - 1;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (x < str[mid])
        {
            //high = mid - 1;
            low = mid + 1;
        }
        else
            if (x > str[mid])
            {
                //low = mid + 1;
                high = mid - 1;
            }
            else if (x = str[mid])
            {
                printf("查到成功过,查找了!str[%d]=%d", mid, x);

                break;
            }
//这查找失败 放这里也不对 放下面也不对 不要else 也不对  附件图片 找到数字也要显示一遍 查找失败
           // else
        //printf("\n查找失败");
        //return 0;
    }
//------------------------------------------------------------------------------------
//这  查找失败应该怎么弄 放什么位置
    printf("\n查找失败");
    return 0;
}

void main()
{
    int str[100], a;
    int h;
A: printf("输入数组个数:");
    scanf("%d", &a);
    printf("输入数组:");
    for (int i = 0; i < a; i++)
    {
        scanf("%d", &str[i]);
        //printf("% d", str[i]);
    }
    for (int i = 0; i < a - 1; i++)
    {
        for (int j = i + 1; j < a; j++)
        {
            if (str[i] < str[j])
            {
                h = str[i];
                str[i] = str[j];
                str[j] = h;
            }
        }
    }
    printf("\n排序后\n");
    for (int i = 0; i < a; i++)
    {
        printf("%  d", str[i]);
    }

    printf("\n输入要插入的数:");
    int b, c;
    int a1, a2;
    scanf("%d", &b);
    c = str[a];
    if (b > c)
    {
        str[a] = b;
    }
    else
        for (int i = 0; i < a; i++)
        {
            if (str[i] > b)
            {
                a1 = str[i];
                str[i] = b;
                for (int j = i + 1; j < a; j++)
                {
                    a2 = str[j];
                    str[j] = a1;
                    a1 = a2;
                }
                break;
            }

        }
    for (int i = 0; i < a; i++)
    {
        for (int j = i + 1; j < a + 1; j++)
        {
            if (str[i] < str[j])
            {
                h = str[i];
                str[i] = str[j];
                str[j] = h;
            }
        }
    }
    for (int k = 0; k < a + 1; k++)
    {
        printf("%  d", str[k]);
    }
    printf("\n");
B: printf("输入要查找的数:");
    int x;
    scanf("%d", &x);
    chazao(x, str, a + 1);
    printf("\n");
//-------------------------
//上面OK了 再插入一段 替换的代码  麻烦看看哪里又错了  运行结果 直接在第一个位置换 不是把查找的更换
    printf("把刚查找的数替换成:");
    int t;
    scanf("%d", &t);
    printf("\n");

    for (int i = 0; i < a + 1; i++)
    {
        if (str[i] == x);
        {
            printf("找到了%d", x);
            str[i] = t;
            break;
        }
        
    }
    printf("\n");
    for (int i = 0; i < a + 1; i++)
    {

        printf("%  d", str[i]);
    }


    //goto B;
    ////goto A;
    system("pause");
}
图片附件: 游客没有浏览图片的权限,请 登录注册
2019-10-22 10:21
tthbgg
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-10-26
收藏
得分:0 
2019-10-26 18:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
首先就不能无警告地编译通过,当然,如果你不愿意理会警告信息,那神仙也帮不了你
if (str[i] == x);
VC 报错信息:warning C4390: ';' : empty controlled statement found; is this the intent?
2019-10-28 08:56
快速回复:数组二分查找 求高手解答 哪里错了
数据加载中...
 
   



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

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