c++数组问题

一个从大到小排好的数组,插入一个数,保持数组长度不变,挤出最大数。
请指点我在输入最大数时得不到正确的结果,比如,输入100时,100将替换数组最后一个,而不是把100挤掉。
#include<iostream.h>
void fun(int a[],int len,int k)
{
int j=len-1,x=a[j];
while(a[j-1]>k&&j>0)
{
a[j]=a[j-1];
j--;
}
a[j]=k;
if(a[len-1]<k) a[j]=x;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void main()
{
int arr[]={12,16,22,31,32,55,65,76,89};
int l=sizeof(arr)/sizeof(int);
int b;
while(9)
{
for(int i=0;i<l;i++)
cout<<arr[i]<<" ";
cout<<endl;
cout<<"enter the b:";
cin>>b;
fun(arr,l,b);
}
}
只有输入最大数时有问题,请各位指点指点
不是,如果输入的是最大数,则把刚输入的这个数挤掉,保持原来的数组

#include<iostream.h>

void fun(int a[],int len,int k)

{

 int j=len-1,x=a[j];//错误之处在于,如果你输入的数大于89,下面的while循环不执行,但a[j]=k;这句却照样执行,即相当于把k的值赋给最后一个元素,接下来 if(a[len-1]<k)a[j]=x;这句就不执行了。即本程序相当于你没写这个if语句,把这个if语句放到while之前也不行。

 while(a[j-1]>k&&j>0)

  { 

   a[j]=a[j-1];

   j--;

  }

  a[j]=k; 

   if(a[len-1]<k)a[j]=x; 

 for(int i=0;i<len;i++)

  cout<<a[i]<<"  ";

 cout<<endl;

}

void main()

{

 int arr[]={12,16,22,31,32,55,65,76,89};

 int l=sizeof(arr)/sizeof(int);

 int b;

 while(1)//

 {

 for(int i=0;i<l;i++)

  cout<<arr[i]<<"  ";

 cout<<endl;

 cout<<"enter the b:";

 cin>>b;

 //调用函数之前加这个语句也可以达到你的目的if(b<=arr[8])

 fun(arr,l,b);

 }

修改后:

#include<iostream.h>

void fun(int a[],int len,int k)

{

 int j=len-1,x=a[j];//错误之处在于,如果你输入的数大于89,下面的while循环不执行,但a[j]=k;这句却照样执行,即相当于把k的值赋给最后一个元素,接下来 if(a[len-1]<k)a[j]=x;这句就不执行了。即本程序相当于你没写这个if语句,把这个if语句放到while之前也不行。

 while(a[j-1]>k&&j>0)

  { 

   a[j]=a[j-1];

   j--;

  }

  if(j<len-1)a[j]=k; //修改之处

   if(a[len-1]<k)a[j]=x; 

 for(int i=0;i<len;i++)

  cout<<a[i]<<"  ";

 cout<<endl;

}

void main()

{

 int arr[]={12,16,22,31,32,55,65,76,89};

 int l=sizeof(arr)/sizeof(int);

 int b;

 while(1)//

 {

 for(int i=0;i<l;i++)

  cout<<arr[i]<<"  ";

 cout<<endl;

 cout<<"enter the b:";

 cin>>b;

 //调用函数之前加这个语句也可以达到你的目的if(b<=arr[8])

 fun(arr,l,b);

 }

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-27
思路错误:
我们一点点的来,不要以为你错的只是一点点。

void fun(int a[],int len,int k)
//接收数组地扯,长度(含结束符长度),和一个要放进去的数。
{
int j=len-1,x=a[j];
//定义新变量j为临时存放数组长度变量,将传进来的数组中最后个数据放进变量X
//问题语句:x=a[j];
while(a[j-1]>k&&j>0)
//排出最大数循环,
//问题语句:a[j-1]>k意思为,将传进来的数组的倒数第二个数据和k比较。
//根据题意,应该是将本数组内的数据比较。如果K较大,也就你说的,a[j-1]>k为假,这个循环就不能得以执行。
{
a[j]=a[j-1];
//数据在数组内向后移,如第8位放到第9位,和你题目意思完全不一样。
j--;
//循环控制
}
a[j]=k;
//k放最后一位;这是你的真实相法吧,但你可想过上面控制语句会执行几次?j的值在上面的控制语中被改变了,如果因为第二次在执行a[j-1]>k为假时候,j的值实际只为原来j-2.

if(a[len-1]<k) a[j]=x;
//问题语句:判断传进来的K值和最后一位原数组数据比较,将大的放进去,完全和题意不同,题意是保证新输入的值一定被放进数组。

//后面我不看了,在这一题上,完全错误。还有下面的while(9)循环中没有退出语句,我无语,这不死循环吗?
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void main()
{
int arr[]={12,16,22,31,32,55,65,76,89};
int l=sizeof(arr)/sizeof(int);
int b;
while(9)
{
for(int i=0;i<l;i++)
cout<<arr[i]<<" ";
cout<<endl;
cout<<"enter the b:";
cin>>b;
fun(arr,l,b);
}
}

我没给你写出答案,是希望自己再练,每人都有你这过程,记着,如果你现在像写这程序水平,你千万不要自得,但要保持兴趣。你处在半懂半不懂中,现在的学习兴趣一定丰常好,一定要加油。如果感觉有什么不太明白的,可以Hi我,相互学习
第2个回答  2009-12-27

你的意思是新输入的书挤掉原来最大的数? 

我运行了,运行如下,不明白你说什么

第3个回答  2009-12-27
最简单的改法是把第11行的 if(a[len-1]<k) a[j]=x;改成 if(x<k) a[j]=x;

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网