为什么当我放入偶数个元素时我的程序不工作
Why my program doesn't work when I put an Even Number of Elements
我正在尝试制作一个二进制搜索程序,我的代码如下,但是当我给出偶数个元素时,它不会给出任何输出,而当我给出奇数个元素时,程序运行良好! !程序首先比较中间值如果为假然后比较小于或大于中间值
int main()
{
int n,a[50] ;
int i, j, temp,counter,searchv,f,l,mid;
cout<<"Enter no. of elements: ";
cin>>n;
f=0;
l=n-1;
mid=(f+l)/2;
cout<<"l= "<<l<<" mid= "<<mid<<"\n";
cout<<"Enter "<<n <<" values \n";
for(counter=0;counter<n;counter++)
{
cin>>a[counter];
}
for(j=0; j<n; j++)
{
for (int i=(n-1); i>j ;i--)
{
if (a[i]<a[i-1])
{
int temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
}
}
}
cout<<"SORTED ARRAY!!\n";
for(counter=f;counter<n;counter++)
{
cout<<"Value at Element "<<counter <<" is "<<a[counter];
cout<<endl;
}
cout<<"Enter number to search: ";
cin>>searchv;
if(a[mid]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<<mid;
}
else if(searchv>a[mid])
{
for(counter=l;counter>mid;counter--)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else if(searchv<a[mid])
{
for(counter=0;counter<mid;counter++)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else
{
cout<<"Value not found\n";
}
getch();
return 0;
}
您的错误与数组的元素个数是偶数还是奇数没有任何关系。在你的两个线性搜索循环中,例如:
for (counter = l; counter > mid; counter--) {
if (a[counter] == searchv)
cout << "searched value " << searchv <<
" founded at position " << counter << '\n';
break;
}
你break
无条件跳出循环。这意味着您只测试范围的第一个元素。当然,您只想在找到匹配项后才中断,因此您应该使用大括号:
for (counter = l; counter > mid; counter--) {
if (a[counter] == searchv) {
cout << "searched value " << searchv <<
" founded at position " << counter << '\n';
break;
}
}
如果您养成一致缩进和使用大括号的习惯,则更容易发现此类错误,也许除了没有 else
的最基本 if
之外。
通过此修复,您的程序将仅报告匹配项,而不会报告错误,因为逻辑上 else
永远不会发生,因为前三个 if
/else
涵盖了所有可能的情况。 (对于整数,a == b
、a < b
和 a > b
涵盖所有情况。)
您可以通过保留一个额外的变量来修复此问题,该变量告诉您是否已找到匹配项,或者通过将搜索重构为一个单独的函数来修复此问题,无论如何这是可取的。
根据上面的回答,可以加上这个
而不是
if(a[mid]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<<mid;
}
else if(searchv>a[mid])
{
for(counter=l;counter>mid;counter--)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else if(searchv<a[mid])
{
for(counter=0;counter<mid;counter++)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else
{
cout<<"Value not found\n";
}
你可以试试这个:
bool isFound = false;
for(counter=0;counter<l;counter++)
{
if(a[counter]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<< counter << endl;
isFound = true;
}
}
if (isFound == false)
{
cout << "No result found." << endl;
}
我正在尝试制作一个二进制搜索程序,我的代码如下,但是当我给出偶数个元素时,它不会给出任何输出,而当我给出奇数个元素时,程序运行良好! !程序首先比较中间值如果为假然后比较小于或大于中间值
int main()
{
int n,a[50] ;
int i, j, temp,counter,searchv,f,l,mid;
cout<<"Enter no. of elements: ";
cin>>n;
f=0;
l=n-1;
mid=(f+l)/2;
cout<<"l= "<<l<<" mid= "<<mid<<"\n";
cout<<"Enter "<<n <<" values \n";
for(counter=0;counter<n;counter++)
{
cin>>a[counter];
}
for(j=0; j<n; j++)
{
for (int i=(n-1); i>j ;i--)
{
if (a[i]<a[i-1])
{
int temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
}
}
}
cout<<"SORTED ARRAY!!\n";
for(counter=f;counter<n;counter++)
{
cout<<"Value at Element "<<counter <<" is "<<a[counter];
cout<<endl;
}
cout<<"Enter number to search: ";
cin>>searchv;
if(a[mid]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<<mid;
}
else if(searchv>a[mid])
{
for(counter=l;counter>mid;counter--)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else if(searchv<a[mid])
{
for(counter=0;counter<mid;counter++)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else
{
cout<<"Value not found\n";
}
getch();
return 0;
}
您的错误与数组的元素个数是偶数还是奇数没有任何关系。在你的两个线性搜索循环中,例如:
for (counter = l; counter > mid; counter--) {
if (a[counter] == searchv)
cout << "searched value " << searchv <<
" founded at position " << counter << '\n';
break;
}
你break
无条件跳出循环。这意味着您只测试范围的第一个元素。当然,您只想在找到匹配项后才中断,因此您应该使用大括号:
for (counter = l; counter > mid; counter--) {
if (a[counter] == searchv) {
cout << "searched value " << searchv <<
" founded at position " << counter << '\n';
break;
}
}
如果您养成一致缩进和使用大括号的习惯,则更容易发现此类错误,也许除了没有 else
的最基本 if
之外。
通过此修复,您的程序将仅报告匹配项,而不会报告错误,因为逻辑上 else
永远不会发生,因为前三个 if
/else
涵盖了所有可能的情况。 (对于整数,a == b
、a < b
和 a > b
涵盖所有情况。)
您可以通过保留一个额外的变量来修复此问题,该变量告诉您是否已找到匹配项,或者通过将搜索重构为一个单独的函数来修复此问题,无论如何这是可取的。
根据上面的回答,可以加上这个
而不是
if(a[mid]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<<mid;
}
else if(searchv>a[mid])
{
for(counter=l;counter>mid;counter--)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else if(searchv<a[mid])
{
for(counter=0;counter<mid;counter++)
{
if(a[counter]==searchv)
cout<<"searched value "<<searchv<<" founded at position "<<counter;
break;
}
}
else
{
cout<<"Value not found\n";
}
你可以试试这个:
bool isFound = false;
for(counter=0;counter<l;counter++)
{
if(a[counter]==searchv)
{
cout<<"searched value "<<searchv<<" founded at position "<< counter << endl;
isFound = true;
}
}
if (isFound == false)
{
cout << "No result found." << endl;
}