首页
社区
课程
招聘
C初级理解问题,请帮忙.
2006-12-7 08:26 5252

C初级理解问题,请帮忙.

2006-12-7 08:26
5252
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
#include"stdio.h"
main()
{int *z,i,p,t,a[10],min,max,x,y;
for(z=a;a<a+10;z++)
scanf("%d",z[i]);
min=z[0],max=z[0];
for(z=a;z<z+10;z++)
{ if(min>z[i]) min=z[i],x=i;
   if(max<z[i]) max=z[i],y=i;
}
t=z[0];z[0]=min;z[x]=t;
p=z[9];z[9]=max;z[y]=p;
for(z=a;z<z+10;z++)
printf("%d\n",*(z+i));
}
运行:10 9 8 7 6 5 4 3 2 1
结果:1 9 8 7 6 5 4 3 2 10

=======================
改成:for(z=a;z<z+10;z++)
{ if(min>z[i]) min=z[i];x=i;
   if(max<z[i]) max=z[i];y=i;
}
就是由逗号运算改马分号时,结果就会不正确

运行:78 9 1 91 6 5 4 3 2 5
结果:1  9 1 91 6 5 4 3 2 91
为什么会这样啊,,我觉得两种做法没什么改变啊,!

还指针来实现,:#include"stdio.h"
main()
{int *z,i,p,t,a[10],min,max,x,y;
for(i=0,z=a;i<10;i++)
scanf("%d",z+i);
min=z[0],max=z[0];
z=a;
for(i=0;i<10;i++)
{ if(min>z[i]) min=z[i],x=i;
   if(max<z[i]) max=z[i],y=i;
}
t=z[0];z[0]=min;z[x]=t;
p=z[9];z[9]=max;z[y]=p;
for(z=a,i=0;i<10;i++)
printf("%4d",*(z+i));
printf("\n");
}
结果一片混乱,看样子是z没指向正确的地址,而我确找不出来,还请大家多多指点,

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (9)
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-12-7 09:08
2
0
if的作用域只有一句,加上花括号就不会错了

{
if(min>z[i]) {min=z[i];x=i;}
if(max<z[i]) {max=z[i];y=i;}
}
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
llydd 9 2006-12-7 14:30
3
0
/*
感觉这个题问题还蛮多的,
#include"stdio.h"
main()
{int *z,i,p,t,a[10],min,max,x,y;
for(z=a;a<a+10;z++) //这里a<a+10始终成立,是一死循环
scanf("%d",z[i]);//这里的z[i]不是合法地址,不能这样用scanf函数,i也没赋值   
min=z[0],max=z[0];
for(z=a;z<z+10;z++)
{ if(min>z[i]) min=z[i],x=i;
   //i没有赋值就去给别的变量赋值
   //再者如果最小值就是第一个元素a[0],那么x也将是一个随机的数

   if(max<z[i]) max=z[i],y=i;
  //如果最大值就是第一个元素a[0],那么y也将是一个随机的数,那么下面的z[x]=t;z[y]=p;都会出现访问异常
}
//下面的交换也将出现问题
//当最大值就是第一个元素a[0]时,下面的语句将导致它与最小值交换,

t=z[0];z[0]=min;z[x]=t;
//当最大值就是第一个元素a[0]时,上面的交换错误也将导致下面的交换出现错误,最大值将重复出现在数组中
p=z[9];z[9]=max;z[y]=p;
for(z=a;z<z+10;z++)
printf("%d\n",*(z+i));
}
*/

//程序改为
#include"stdio.h"
main()
{int *z,i,p,t,a[10],min,max,x=0,y=0;
for(i=0,z=a;i<10;i++)
scanf("%d",z+i);
min=z[0],max=z[0];
z=a;
for(i=0;i<10;i++)
{ if(min>z[i]) min=z[i],x=i;
   if(max<z[i]) max=z[i],y=i;
}

if(y==0)
         y=x; //如果最大值在a[0]处,则记录最小值交换后最大值的真实位置
t=z[0];z[0]=min;z[x]=t;
p=z[9];z[9]=max;z[y]=p;
for(z=a,i=0;i<10;i++)
printf("%4d",*(z+i));
printf("\n");
}
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jueguzi 2006-12-8 10:53
4
0
多谢这么全面的指点,以后会注意提出的问题!
if(min>z[i]) min=z[i],x=i;

改成if(min>z[i]) min=z[i];x=i;逗号变为分号有什么不同吗?
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-12-8 15:08
5
0
if(min>z[i]) min=z[i],x=i;

等价于
if (min > z[i]) {
    min = z[i];
    x = i;
}

if(min>z[i]) min=z[i];x=i;

等价于
if (min > z[i] {
    min = z[i];
}
x = i;

建议楼主的代码按照一些常见的代码规范来写,可以避免很多问题
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qiannian 2007-1-7 10:51
6
0
可以运行?!!!!!
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
marcoak 2007-1-8 16:43
7
0
LZ C语言书第一章的语法.你十有八九是跳过吧!
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
骷髅x 1 2007-1-9 20:59
8
0
for(z=a;a<a+10;z++)
scanf("%d",z[i]); //这里都已经死循环了,怎么还能有结果
                   //输出?
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jueguzi 2007-1-10 10:15
9
0
我都改过来啊,,不要这样打击我啊,
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
firstrose 16 2007-1-10 19:53
10
0
逗号是运算符,分号表示语句分隔。在没有加{}的情况下两者当然有区别!
游客
登录 | 注册 方可回帖
返回