/*
程序改错:
找出一个有序字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这样的条件,则返回其中序号最大的
程序中的错误:
1 midIndex = (minIndex + maxIndex)/2;这样可能会由于求和中间结果而溢出,应该改为midIndex = minIndex + (maxIndex - minIndex)/2;
2 循环的终止条件可能无法达到,比如minIndex = 2,maxIndex = 3,arr[minIndex] <= v的时候,程序将进入死循环
输入:
7
machao
anben bichao chaoge machao machao mayan naonu
2
machao
machao machao
1
machao
machao
输出:
4
1
0
*/
/*
关键:
1 midIndex = (minIndex + maxIndex)/2;这样可能会由于求和中间结果而溢出,应该改为midIndex = minIndex + (maxIndex - minIndex)/2;
2 循环的终止条件可能无法达到,比如minIndex = 2,maxIndex = 3,arr[minIndex] <= v的时候,程序将进入死循环
3 while(low < high - 1)//循环结束有两种情况:1若low为偶数,那么low = high 2 low = high -1
4 if(strcmp(arr[mid],v) <= 0)
{
low = mid;
}
5 else
{
high = mid;//不需要mid-1,防止low == high
6 if(!strcmp(arr[high],v))//先判断序号最大的值
{
return high;
}
else if(!strcmp(arr[low],v))
{
return low;
}
*/
#include <stdio.h>
#include <string.h>
const int MAXSIZE = 100;
int binarySearch(char arr[][MAXSIZE],int low,int high,char* v)
{
int mid;
while(low < high - 1)//循环结束有两种情况:1若low为偶数,那么low = high 2 low = high -1
{
mid = low + (high - low)/2;
if(strcmp(arr[mid],v) <= 0)
{
low = mid;
}
else
{
high = mid;//不需要mid-1,防止low == high
}
}
if(!strcmp(arr[high],v))//先判断序号最大的值
{
return high;
}
else if(!strcmp(arr[low],v))
{
return low;
}
else
{
return -1;
}
}
void process()
{
int n;
char strSea[MAXSIZE];
char strArr[MAXSIZE][MAXSIZE];
//char* strArr[MAXSIZE];//这里必须用二维数组,否则它不知道要分配多少内存
while(EOF != scanf("%d",&n))
{
if(n <= 0)
{
continue;
}
scanf("%s",strSea);
for(int i = 0 ; i < n ; i++)
{
scanf("%s",strArr[i]);
}
printf("%d\n",binarySearch(strArr,0,n-1,strSea));
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}
编程之美:第三章 结构之法 3.11程序改错
原文作者:天地一扁舟
原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47187737
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47187737
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。