为什么C++中这两种方法的字符串比较结果不一样?

#include <iostream.h>
#include <string.h>
void main()
{
void sort(char *name[],int n);
void out(char *name[],int n);
char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
int n=5;
sort(name,n);
out(name,n);
}
void sort(char *name[],int n)
{
char *t;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
if(strcmp(name[i],name[j])>0)
{
t=name[i];
name[i]=name[j];
name[j]=t;
}
}
}
void out(char *name[],int n)
{
for(int i=0;i<n;i++)
cout<<name[i]<<endl;
}
输出:BASIC C++ COLBOL FORTRAN Pascal

而老谭上的书上说的是
#include <iostream.h>
#include <string.h>
void main()
{
void sort(char *name[],int n);
void out(char *name[],int n);
char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
int n=5;
sort(name,n);
out(name,n);
}
void sort(char *name[],int n)
{
char *t;
int k;
for(int i=0;i<n;i++)
{
k=i;
for(int j=i+1;j<n;j++)
if(strcmp(name[i],name[j])>0)
k=j;
if(k!=i)
{
t=name[i];
name[i]=name[k];
name[k]=t;
}
}
}
void out(char *name[],int n)
{
for(int i=0;i<n;i++)
cout<<name[i]<<endl;
}

输出的结果是 basic colbol c++ fortran pascal
为什么?
高手请指点一下~~
if(strcmp(name[i],name[j])>0)k=j;
改为
if(strcmp(name[k],name[j])>0)k=j;
是我抄错了
不是书的错
我就是想问为什么一定要用k来代替j
为什么第一种方法不对???

将老谭上的书上的sort函数中的
if(strcmp(name[i],name[j])>0)k=j;
改为
if(strcmp(name[k],name[j])>0)k=j; 即可得到正确的排序结果。

原因:
由于原代码中的k=j中的这个k的值被覆盖了,没有起到作用,你这个算法是选择排序的算法,每次从数组中选出最小的,然后交换,只有将name[i]改为name[k]才能满足排序的要求,你仔细检查一下书上的代码,看是不是这样。如果不是这样那就是书的问题了。

对于补充的问题:
if(strcmp(name[i],name[j])>0)k=j; 在这种情况下,以i=1为例,在for循环执行后,第一个满足上述条件的j为2,此时k=2.但循环继续执行,第二个满足条件的j为4,此时的k=4,而k=2这个结果没有起到作用,它被覆盖了,你没有理解选择排序是要选择出最小的,既然这样它必然要用到k=2时的结果,而使用这种结果的方法就是将name[i]换成当前的最小值即name[k]。我的建议是你自己理解一下选择排序,然后自己想一下函数执行的流程就容易理解了。

我附上我改编的你的代码:这个代码可以看一看每次大循环执行后的结果。
#include <iostream.h>
#include <string.h>

void out(char *name[],int n)
{
for(int i=0;i<n-1;i++)
cout<<name[i]<<" ";
cout<<name[n-1]<<endl;
}

void sort1(char *name[],int n)
{
char *t;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
if(strcmp(name[i],name[j])>0)
{
t=name[i];
name[i]=name[j];
name[j]=t;
}
out(name,5);
}
}

void sort2(char *name[],int n)
{
char *t;
int k;
for(int i=0;i<n;i++)
{
k=i;
for(int j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)
//改成if(strcmp(name[i],name[j])>0)再试试
k=j;
if(k!=i)
{
t=name[i];
name[i]=name[k];
name[k]=t;
}
out(name,5);
}
}

void main()
{
//void sort(char *name[],int n);
//void out(char *name[],int n);
char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
char *namecpy[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
int n=5;
sort1(name,n);
out(name,n);
cout << "-------------------------"<<endl;
sort2(namecpy,n);
out(namecpy,n);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-12
对于这样的问题,处理方法是在程序段中添加语句观察运行一次后的变量值。当然也可以查看编译系统的watch窗口。
所以你可以在sort函数体中的for循环语句中添加cout<<i<<endl<<j<<endl;再跟正确的比较一下。
第2个回答  2008-06-13
关键是sort函数
仔细看了下子,发现第二个程序有问题。
第二个sort中表面上k的作用是记录比name[i]小的字符串的下标,
但注意下就会发现,k记录的总是比name[i]小的最后一字符串的下标,
问题就在这里
当char *name[]={"BASIC","FORTRAN","Pascal","C++","COBOL"};时,
输出BASIC COBOL FORTRAN C++ Pascal
而第一个程序依然正确。

如果你修该之后,程序是正确的。
相似回答