注册 登录
编程论坛 C++教室

[求助2]指针,看下错哪了。

a8451727 发布于 2007-07-27 02:28, 1352 次点击

输入10个数,找出最大数,放在第一,原来第一的在第二````依次类推。

怎么我的只是覆盖了第一个
并且最大数还存在上次位置,指到我晕了。

#include<iostream>
using namespace std;
int main()
{
const int max=10;
int a[max];
int *p=a;
int i,j,k,t;

cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>a[i];
}

for(i=0;i<max;i++){
for(j=0;j<max;j++)
k=j+1;
if(*(p+j)<*p+k)
*(p+j)=*(p+k);//这里为什么不是每次上一数覆盖下一个数?
*p=*(p+j);
}

for(i=0;i<max;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}

[此贴子已经被作者于2007-7-27 2:30:33编辑过]

26 回复
#2
福尔摩斯2007-07-27 07:22
*(p+j)=*(p+k);//这里为什么不是每次上一数覆盖下一个数?
*p=*(p+j);

错!
#3
wtyj1122007-07-27 08:16

首先你给的描述有歧义,然后你给的程序有错误和不清晰的地方。
我猜测你是想写个冒泡排序,将你的程序更改如下:输入1 2 3 4 5 得到 5 4 3 2 1。
#include<iostream>
using namespace std;
int main()
{
const int max=5;
int a[max];
int *p=a;
int i,j,k,t;

cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>a[i];
}

for(i=0;i<max;i++){
for(j=0;j<max-1-i;j++)
{
k=j+1;
if(*(p+j) < *(p+k))
{
t = *(p+j);
*(p+j) = *(p+k);
*(p+k) = t;

//*(p+i) = *(p+j);
}
}
}

for(i=0;i<max;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}

#4
wtyj1122007-07-27 08:20
这个是没for一趟就把最小的放在最后
如果要改成最大放第一 稍微改改就ok了
#5
a84517272007-07-27 12:57
回复:(wtyj112)首先你给的描述有歧义,然后你给的程...
不是写冒泡哦。

比如:8 6 1 2 9 3
只需 9 8 6 1 2 3
#6
a84517272007-07-27 12:59
以下是引用福尔摩斯在2007-7-27 7:22:07的发言:
*(p+j)=*(p+k);//这里为什么不是每次上一数覆盖下一个数?
*p=*(p+j);

错!

我知道错啊,指点下啊

#7
福尔摩斯2007-07-27 13:21
数据结构:冒泡算法
#8
jianweichief2007-07-27 15:48

#include<iostream>
using namespace std;
int main()
{
const int max=10;
int a[max];
int *p=a;
int i,t;

cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>a[i];

}

t= a[0];
for(i=1;i<max;i++)
{
if(t<*(p+i))
t=*(p+i);
}

while(a[i]=t)
{
i--;
}

for(;i>0;i--)
a[i]=a[i-1];
a[0]=t;


for(i=0;i<max;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}

不知对不对,我这没有编译器.你试一试吧.

#9
野比2007-07-27 18:48

最简单的方法:
另建一个数组..
先找最大数放到第一个..然后把剩下的数放过去(跳过原来最大的那个)...

#10
wtyj1122007-07-27 19:34

#include<iostream>
using namespace std;
int main()
{
const int max=6;
int a[max];
int *p=a;
int i,j,value;
int index = 0;

cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>a[i];
}
value = a[0];

for (j=1; j<max; j++)
{
//=j+1;
if(value < *(p+j))
{
value = *(p+j);
index = j;
}
}

while ( index > 0 )
{
a[index] = a[index - 1];
a[index - 1] = value;
index--;
}

for(i=0;i<max;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}

基本想法找到最大,记录最大值和索引号,然后移动数组元素。

#11
jianweichief2007-07-27 21:34
回复:(野比)最简单的方法:另建一个数组..先找最大数...
good idea!哈哈
#12
aipb20072007-07-27 22:01
输入10个数,找出最大数,放在第一,原来第一的在第二````依次类推。


根据这个描述,不是冒泡,而是类似选择排序,不过较之选择排序多了很多无用功:
原来第一的在第二````依次类推。
上面这个不是多余吗?不要求未排序过程有特定序,何不直接交换当前最大数和n(索引)位置数。
这样以来就是个完整的选择排序了。
#13
wtyj1122007-07-28 00:28
楼主就是要求为排序过程有特定序
#14
aipb20072007-07-28 08:56
以下是引用wtyj112在2007-7-28 0:28:14的发言:
楼主就是要求为排序过程有特定序

[a1,a2,a3..an,b1,b2..bn](a1-an已排序)

我指的是b1-bn这部分未排序子数组。

#15
a84517272007-07-28 10:18

哈哈,大家辛苦了。
多谢。

#16
a84517272007-07-29 16:18

[CODE]#include<iostream>
using namespace std;
int main()
{
const int max=10;
int a[max];
int *p=a;
int i,j,value1,value2;
int index1=0,index2;
cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>*(p+i);
}
value1=*p;
value2=*p;
for(i=1;i<max;i++){
if(value1<*(p+i)){
value1=*(p+i);
index1=i;
}
}
for(j=1;j<max;j++){
if(value2>*(p+j)){
value2=*(p+j);
index2=j;
}
}
cout<<value1<<' '<<value2<<endl;
for(i=index1;i>0;i--){
*(p+i)=*(p+i-1);
*(p+i-1)=value1;
}
for(j=index2;j<max;j++){
*(p+j)=*(p+j+1);
*(p+j+1)=value2;
}


for(p=a;p<(a+max);p++)
cout<<*p<<' ';
cout<<endl;
return 0;
}[/CODE]

我自己又加了个提取最小数的,但为什么最小数最后会变成10呢?无论最小那个是什么,都变成10的

[IMG]http://photo.store.qq.com/http_imgload.cgi?/rurl2=7e4fd5d9a063c878ddccf31b06203d6cbf487e558384baa859dd17418cce3ce8a0dc1b030821d5beaf5255c296c6f6ca3ce1808feefbb6c31f85f298f8d7c2333c11144b5a71965802da668b5d13816d39baf6e0[/IMG]

[IMG]http://photo.store.qq.com/http_imgload.cgi?/rurl2=51709e058777c92ca8f74543d893fa5f79c92705000621e185e6e8ed5e8170ddc8197797558dbd84b44147430070b18c9a5f5d1ac1b964a56b74a2759be86127acbaf97db97d3bbc66830ff3a635df47fa3f807c[/IMG]
#17
virusswb2007-07-29 21:44

兄弟啊
你的这个地方有问题
你忘了大括号了
for(i=0;i<max;i++)
{
for(j=0;j<max;j++)

k=j+1;
if(*(p+j)<*p+k)
*(p+j)=*(p+k);//这里为什么不是每次上一数覆盖下一个数?
*p=*(p+j);

}

#18
a84517272007-07-29 23:18

前面的可以了,帮我看下后面那个问题啊

#19
wtyj1122007-07-30 09:45
我喜欢你的想法,可以加我qq吗?170439097
你怎么会想做这样的程序呢??挺有意思的呵呵!!
#20
wtyj1122007-07-30 09:46

随便把你程序修改好了 你先自己看下 如果还不明白你那里做错了 再说

#include<iostream>
using namespace std;
int main()
{
const int max=10;
int a[max];
int *p=a;
int i,j,value1,value2;
int index1=0,index2;
cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>*(p+i);
}
value1=*p;
value2=*p;
for(i=1;i<max;i++){
if(value1<*(p+i)){
value1=*(p+i);
index1=i;
}
}

for(i=index1;i>0;i--){
*(p+i)=*(p+i-1);
*(p+i-1)=value1;
}

for(j=1;j<max;j++){
if(value2>*(p+j)){
value2=*(p+j);
index2=j;
}
}
cout<<value1<<' '<<value2<<endl;

for(j=index2;j<max-1;j++){
*(p+j)=*(p+j+1);
*(p+j+1)=value2;
}

for(p=a;p<(a+max);p++)
cout<<*p<<' ';
cout<<endl;
return 0;
}

#21
wtyj1122007-07-30 09:49
你这个程序能扩展到几个有点趣问题 我喜欢
你怎么会想到做这个程序的啊??
你能不能再从一些老的程序上再想点有趣的新问题出来 。。
#22
a84517272007-07-30 12:05
for(j=index2;j<max-1;j++){
*(p+j)=*(p+j+1);
*(p+j+1)=value2;
}


我说我想了这么久,原来错这了。
#23
a84517272007-07-30 12:06
以下是引用wtyj112在2007-7-30 9:49:32的发言:
你这个程序能扩展到几个有点趣问题 我喜欢
你怎么会想到做这个程序的啊??
你能不能再从一些老的程序上再想点有趣的新问题出来 。。

对程序挑剔点就行了
我初学的,加你Q了。

#24
wtyj1122007-07-30 12:43
不只错那里 还有就是 你的程序流程是 找出最大 -> 找出最小 -> 把最大放最前 -> 把最小放最后
这个流程是有问题的 你自己仔细想想为什么那里有问题!!

还有一个有点趣的地方 不知道你注意了没有 出错的时候为什么 最后一个老是10 而不是别的?
#25
a84517272007-07-30 13:51
以下是引用wtyj112在2007-7-30 12:43:30的发言:
不只错那里 还有就是 你的程序流程是 找出最大 -> 找出最小 -> 把最大放最前 -> 把最小放最后
这个流程是有问题的 你自己仔细想想为什么那里有问题!!

还有一个有点趣的地方 不知道你注意了没有 出错的时候为什么 最后一个老是10 而不是别的?
最后一个老是10 而不是别的?

你说下看看

你不说我还没考虑过这个问题呢

[此贴子已经被作者于2007-7-30 14:05:18编辑过]

#26
wtyj1122007-07-30 16:47
刚开始我猜想在数组后面应该是乱码可是每次都固定是10就奇怪了,只有一种可能就是10就是固定分配的变量值,这样就不难想到这个10就是数组长度max,然后做试验把max改成5 果然最后一个结果是5了
#27
wtyj1122007-07-30 18:08

这个是我做试验的代码,注意在给数组赋值的时候 最小值必须要在最大的后面,不然程序出错 你运行下看看 主意
const int test和 const int max 的先后初始化次序 与他们的地址前后关系很有趣

#include<iostream>
using namespace std;
//#define max 10
int main()
{
const int test = 99;
const int max=10;

int a[max];
int *p=a;
int i,j,value1,value2;
int index1=0,index2;

int *p2=&i, *p3=&j, *p4=&value1, *p5=&value2, *p6=&index1, *p7=&index2;
const int *p1 = &max;
const int *p9 = &test;
int *p8 = a;


cout<<"Enter the array number:";
for(i=0;i<max;i++)
{
cin>>*(p+i);
}
value1=*p;
value2=*p;
for(i=1;i<max;i++){
if(value1<*(p+i)){
value1=*(p+i);
index1=i;
}
}
for(j=1;j<max;j++){
if(value2>*(p+j)){
value2=*(p+j);
index2=j;
}
}
cout<<value1<<' '<<value2<<endl;
for(i=index1;i>0;i--){
*(p+i)=*(p+i-1);
*(p+i-1)=value1;
}
for(j=index2;j<max-1;j++){
*(p+j)=*(p+j+1);
*(p+j+1)=value2;
}

for(p=a;p<(a+max);p++)
cout<<*p<<' ';
cout<<endl;
cout <<p8+9<<' '<<p1<<' '<<p9<<' '<<p2<<' '<<p3<<' '<<p4<<' '<<p5<<' '<<p6<<' '<<p7;
cout<<endl;
cout <<*(p8+9)<<' '<<*p1<<' '<<*p9<<' '<<*p2<<' '<<*p3<<' '<<*p4<<' '<<*p5<<' '<<*p6<<' '<<*p7;
return 0;
}

1