while和break和for的麻烦

最终代码如下,编译成功并得到想要的结果。不过在成功之前,出现了几个问题。

编译成功,运行。无任何结果,只有空格符。在调用函数之前插入printf函数,运行得到printf后的结果,但是之后还是跳动的字符。一直在运行。在return 0之前插入printf,不能被输出,说明错误出在调用函数上。compare函数是没有问题的,然后想是不是原理出错了呢。但是原理从理论上来说是对的。然后纠结到break的问题上,多方查资料百度,清楚知道break是跳出一层for while 或者switch 循环,那么是没有问题的。于是想当然的也在return -1前也打入printf ,当然也没有输出。纠结return 0 1 -1的问题,后来百度这只是个区别的问题,没有什么大的不同。

最后在网上问了别人。细节决定成功。while后面忘记大括号了。。。但是这编译器不会发现。还有list【4】本来写成了list【5】,编译器也不会发现。left+right/2  忘记打大括号了。通常for在没有大括号的时候只执行到下一个分号为止,无论中间有其他什么,比如if,比如嵌套。这些都是语义错误,需要引起注意,一不小心就会让你纠结很久。解决方法是:

1.把自己想象成计算机,跟着程序的步骤一步一步走,这是最好的方法。用变量,每一步画些小盒子当作寄存器。等等。对于迭代很多次的程序,可以跟踪其中一小部分来看看是不是按照所期望的方式执行。

2.查找语义的方法,在程序的几个关键点处加入printf监听关键的变量。

3.使用调试器。目前还没学会,不过这学会了,感觉很强大。摆弄了一阵,没弄懂调试器。

#include "stdio.h"
int binsearch(int list[],int,int,int);
int compare(int,int);
int main(void)
{
    int list[4]={1,3,5,7,9};
    int searchnum=7;
    printf("%d",binsearch(list,searchnum,1,9));
    return 0;
}
int binsearch(int list[],int searchnum,int left,int right)
{
    int middle;
    while(left<=right)
    {
        middle=(left+right)/2;
    switch(compare(list[middle],searchnum))
    {
        case -1:left=middle+1;
                 break;
        case 0:return middle;
        case 1:right=middle-1;
    }
    }
    return -1;
}
int compare(int x,int y)
{
    if(x<y) return -1;
    else if(x==y) return 0;
        else return 1;
}

转载于:https://www.cnblogs.com/tianxiajingse/archive/2013/04/20/3031848.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值