返回信息流题目的大意是:程序循环20次,
1.先输入一个数字N,N<=1000,
2.输入N个数字
3.找出这N个数字中的最大值和次大值,次大值严格小于最大值
4.输出最大值和次大值,并且中间用一个空格隔开
我尝试写了一个代码,结果总是异常运行,求学长解答原因[ema23]
[ema23]
这是一条镜像帖。来源:北邮人论坛 / cpp / #96477同步于 2017/10/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】Re: 萌新求助\(//?//)\
hanxiangxing
2017/10/2镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1.printf()的位置不对吧,应该在for(T=1,T->20)这个循环里边
2.if(p[num]>=max),这个条件不对吧,不是说最大值严格大于次大值吗,如果等于的话次大值就等于最大值了
3.max=*u,*u=*v,*v=max;不要把几行代码写在一行里
电脑上没有c开发环境,就看出来这两个
好的,谢谢了,我试试吧
【 在 sungxuyan (不拉不拉) 的大作中提到: 】
: 1.printf()的位置不对吧,应该在for(T=1,T->20)这个循环里边
: 2.if(p[num]>=max),这个条件不对吧,不是说最大值严格大于次大值吗,如果等于的话次大值就等于最大值了
: 3.max=*u,*u=*v,*v=max;不要把几行代码写在一行里
: ...................
【 在 shan10211865 的大作中提到: 】
: 为何不直接贴代码?附件别人看起来也不方便
#include<stdio.h>
void change(int *u,int*v);
int main(void)
{int num,p[1000],T,N,max,smax;
for(T=1;T<=20;T++) //规定循环次数
{scanf("%d",&N); //确定数字个数
for(num=0;N<=1000&&num<N;num++)
{scanf("%d",&p[num]); //对数组赋值
printf("what"); //检测是否退出该循环
}
change(&p[0],&p[1]); //交换p[0]和p[1]的值,使p[0]为两数中的较大值。
max=p[0],smax=p[1];
for(num=2;N<=1000&&num<N;num++)
{if(p[num]>=max)
smax=max,max=p[num];
else if(p[num]>=smax)
smax=p[num];
} //将数组内的值与保存值比较,并最终确定已输入值中的最大值和次大值
printf("%d %d\n",max,smax);
}
return 0;
}
void change(int *u,int*v)
{ int max;
if(*u<*v)
{max=*u;
*u=*v;
*v=max;
}
}
这个代码最大的问题是跳不出给数组赋值的循环,下面的步骤根本没有运行。
for(num=2;N<=1000&&num<N;num++)
内存越界,判断的等号去了
【 在 hanxiangxing 的大作中提到: 】
:
: #include<stdio.h>
: void change(int *u,int*v);
: ...................
【 在 shan10211865 的大作中提到: 】
: for(num=2;N<=1000&&num<N;num++)
: 内存越界,判断的等号去了
后面是num<N,也就是说num最多到999,而数组最后一项是p[999],没越界啊
噢,刚刚没看完...
如果确定N不能大于1000前面输入不合法直接退出得了,for这里没必要判断两次
对了smax=max,max=p[num];这里最好分开两句,这么写的话,运行顺序是否能得到保证?
【 在 hanxiangxing 的大作中提到: 】
:
: 后面是num<N,也就是说num最多到999,而数组最后一项是p[999],没越界啊