c语言中的指针题

yangshizy 2009-12-19 02:31:22
输入8个整数,将其中最大的数与第一个交换,最小的数与最后一个交换。
以下是我敲的
#define N 8
main()
{int a[N],max,min,h,l,i,m;
printf("input array a:\n" );
for(i=0;i<N;i++)
scanf("%d",a+i);
max=min=*a;
h=l=0;
for(i=1;i<N;i++)
{if(max<*(a+i)){max=*(a+i);h=i;}
else if (min>*(a+i)){min=*(a+i);l=i;}
};
*(a+h)=*a;
*a=max;
*(a+l)=*(a+7);
*(a+7)=min;
printf("%d",a[N]);
}
貌似问题相当严重,好像没有得到想要的结果~
给小弟些意见吧~~
...全文
218 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmdt169 2009-12-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
#define N 8
main()
{
int a[N],max,min,h,l,i,m;
printf("input array a:\n" );
for(i=0;i <N;i++)
scanf("%d",a+i);
max=min=*a;
h=l=0;
for(i=1;i <N;i++)
{
if(max <*(a+i))
{max=*(a+i);h=i;}
if (min>*(a+i))
{min=*(a+i);l=i;}
}
if(abs(l-h)==7)
{
m=*a;
*a=*(a+7);
*(a+7)=m;
}
else
{
*(a+h)=*a;
*a=max;
*(a+l)=*(a+7);
*(a+7)=min;
}
for(i=0;i<N;i++)
printf("%d",a[i]);
}


去掉 else,要两个if同时进行。 还有就是要增加一个判断语言,当最小值和最大值位于末尾的时候。调换的方法又不同,呵呵,这个时候你的m就可以派上用场了。
还有LZ你的for循环}后加了;。
printf("%d",a[N]); 貌似数组这样输出是不行的吧?
yuiyuityuiyui 2009-12-19
  • 打赏
  • 举报
回复

jernymy 2009-12-19
  • 打赏
  • 举报
回复
楼主的代码基础上的一点小改动


#include "stdio.h"

#define N 8

int main(void)
{
int a[N],max,min,h,l,i;
printf("input array a: " );
for(i=0;i <N;i++)
scanf("%d",a+i);
max=min=*a;
h=l=0;
for(i=1;i <N;i++)
{
if (max <*(a+i))
{
max=*(a+i);
h=i;
continue;
}
if (min>*(a+i))
{
min=*(a+i);
l=i;
}
}
*(a+h)=*a;
*a=max;
*(a+l)=*(a+(N-1));
*(a+(N-1))=min;
printf("after switch : ");
for(i=0;i <N;i++)
{
printf("%d ", a[i]);
}
printf("\nmax is a[0]:%d, min a[%d]:%d\n", a[0], N-1, a[N-1]);
return 0;
}

miao5014 2009-12-19
  • 打赏
  • 举报
回复
if(h!=7&&k!=0||(h-k)==7)
{
a[h]=a[0];
a[k]=a[7];
a[0]=max;
a[7]=min;
}
else if(h==7)
{a[k]=a[0];
a[0]=max;
a[7]=min;}
else if(k==0)
{a[h]=a[7];
a[0]=max;
a[7]=min; }


楼上的简洁
  • 打赏
  • 举报
回复
顶上!
yangshizy 2009-12-19
  • 打赏
  • 举报
回复
谢谢了 我再跟踪下
凹哩凹哩 2009-12-19
  • 打赏
  • 举报
回复
#include<stdio.h>
#define N 4
main()
{

int a[N],max,min,h,l,i,t;
printf("input array a:\n" );
for(i=0;i<N;i++)
scanf("%d",a+i);
max=min=*a;
h=l=0;
for(i=1;i<N;i++)
{
if(max <*(a+i))
{
max=*(a+i);
h=i;
}
else if (min>*(a+i))
{
min=*(a+i);
l=i;
}
}
t=*a;
*a=*(a+h);
*(a+h)=t;
if(*(a+N-1)!=min)
{
t=*(a+N-1);
*(a+N-1)=*(a+l);
*(a+l)=t;
}
for(i=0;i<N;i++)
{
printf("%d\t",a[i]);

}
}

改好的
你之前的printf("%d",a[N]); 越界访问了
没有考虑到如果第一个是最小的最后一个是最大时交换两次等于没交换的情况,有个地方还多了个分号
selooloo 2009-12-19
  • 打赏
  • 举报
回复
上面的后半部分错了,应该这样

{if(max <*(a+i)){max=*(a+i);h=i;}
if (min>*(a+i)){min=*(a+i);l=i;}
};

printf("%d %d\n",max,min);
if(*a==min) l=h;//最小值在首位的情况
*(a+h)=*a;
*a=max;
*(a+l)=*(a+N-1);
*(a+N-1)=min;
for(i=0;i <N;i++)
printf("%d ",a[i]);
yuan0716 2009-12-19
  • 打赏
  • 举报
回复
路过
mstlq 2009-12-19
  • 打赏
  • 举报
回复
正确,但是绝对欠揍的代码,楼主请勿学……

#include <stdio.h>
#define N 8
void myswap(int *a, int *b){int tmp=*a; *a=*b;*b=tmp;}
int main()
{
int a[N],maxi=0,mini=0,i;
printf("input array a:\n");
for (i=0;i<N;i++) scanf("%d",a+i);
for (i=1;i<N;(*(a+maxi)<*(a+i))?(maxi=i++):i++);
myswap(a,a+maxi);
for (i=1;i<N;(*(a+mini)>*(a+i))?(mini=i++):i++);
myswap(a+N-1,a+mini);
for (i=0;i<N;i++) printf("%d ",a[i]);
return 0;
}
selooloo 2009-12-19
  • 打赏
  • 举报
回复
几个地方改下
max=min=*a;
h=l=0;
for(i=1;i <N;i++)
{if(max <*(a+i)){max=*(a+i);h=i;}
if (min>*(a+i)){min=*(a+i);l=i;}
//else去掉
};
m=*(a+h);
*(a+h)=*a;
*a=max;
m=*(a+l);//m既然定义了就要用啊,交换两个值起码要个中间变量吧
*(a+l)=*(a+N-1);
*(a+N-1)=min;
for(i=0;i <N;i++)
printf("%d ",a[i]);
mstlq 2009-12-19
  • 打赏
  • 举报
回复
分开算不就得了吗>_<
看3楼……
yangshizy 2009-12-19
  • 打赏
  • 举报
回复
老师也有说个这个可能~但是不知道该用啥语句来判断
mstlq 2009-12-19
  • 打赏
  • 举报
回复
#define N 8
int main()
{
int a[N],maxi,mini,tmp,i;
printf("input array a:\n");
for (i=0;i <N;i++)
scanf("%d",a+i);
maxi=mini=0;
for (i=1;i <N;i++)
{
if (*(a+maxi) <*(a+i))
maxi=i;
};
tmp=*a;
*a=*(a+maxi);
*(a+maxi)=tmp;

for (i=1;i <N;i++)
{
if (*(a+mini) >*(a+i))
mini=i;
};
tmp=*(a+N-1);
*(a+N-1)=*(a+mini);
*(a+mini)=tmp;

for (i=0;i <N;i++)
printf("%d ",a[i]);
return 0;
}
mstlq 2009-12-19
  • 打赏
  • 举报
回复
首先是这个……
for (i=0;i <N;i++)
printf("%d ",a[i]);


其次,最大和最小数的下标不能一起算……
万一最小数的下标就是1,程序逻辑就有问题了……
晨星 2009-12-19
  • 打赏
  • 举报
回复
if(max <*(a+i)){max=*(a+i);h=i;}
else if (min>*(a+i)){min=*(a+i);l=i;}
——这两个if应该是完全并列的,其间不该有“else”的互斥关系。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧