当前位置: 代码迷 >> C语言 >> [求助]好像是循环+括号+指针的问题(请纠错,谢谢)
  详细解决方案

[求助]好像是循环+括号+指针的问题(请纠错,谢谢)

热度:332   发布时间:2006-09-04 00:08:14.0
[求助]好像是循环+括号+指针的问题(请纠错,谢谢)

将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从

左到右、从上到下的顺序 ,依次从小到大存放),写一个函数实现之,并用main数调用。

怎么调试都不成功,只能换最大的和最小的,(我怀疑是不是循环的时候括号括错了),谁能告诉一下原因? 多谢各位了

#include<stdio.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void change(int *p)
{
int i,j,*pmin,*pmax;
pmax=pmin=p;
for(i=0;i<5;i++)

for(j=0;j<5;j++)
{
if(*pmax<*(p+5*i+j))

pmax=p+5*i+j;

if(*pmin>*(p+5*i+j))

pmin=p+5*i+j;


pmin=p+1;

if((p+5*i+j)!=p && *pmin>*(p+5*i+j))

pmin=p+5*i+j;


pmin=p+1;

if((p+5*i+j)!=p && (p+5*i+j)!=(p+4) && *pmin>*(p+5*i+j))

pmin=p+5*i+j;


pmin=p+1;

if((p+5*i+j)!=p && (p+5*i+j)!=(p+4) && (p+5*i+j)!=(p+20) && *pmin>*(p+5*i+j))

pmin=p+5*i+j;
}

swap(pmax,p+12);
swap(pmin,p);
swap(pmin,p+4);
swap(pmin,p+20);
swap(pmin,p+24);
}
int main()
{
int i,j,*p,a[5][5]={{35,34,33,32,31},{30,29,28,27,26},{25,24,23,22,21},{20,19,18,17,16},{15,14,13,12,11}};

for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%d",a[i][j]);
printf("\n");
}
p=&a[0][0];
change(p);
printf("after changing:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%d",a[i][j]);
printf("\n");
}
return(0);
}
怎么调试都不成功,只能换最大的和最小的,(我怀疑是不是循环的时候括号括错了),谁能告诉一下原因? 多谢各位了

[此贴子已经被作者于2006-9-4 12:11:05编辑过]

搜索更多相关的解决方案: 括号  指针  纠错  

----------------解决方案--------------------------------------------------------

#include<stdio.h>
#define N 5

void zhuanhuan(int *a)
{
int *min,*max;
int i,j,t;
max=a;
min=a;

for(i=0;i<N;i++)
{
for(j=i;j<N;j++)
{
if(*min>*(a+N*i+j))
{
min=(a+N*i+j);
}
if(*max<*(a+N*i+j))
{
max=(a+N*i+j);
}
}
}
t=*(a+N/2*N+N/2);
*(a+N/2*N+N/2)=*max;
*max=t;
t=*a;
*a=*min;
*min=t;


min=a+1;//第二个
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if((a+N*i+j)!=a&&*min>*(a+N*i+j))
{
min=(a+N*i+j);
}
}
}
t=*(a+N-1);
*(a+N-1)=*min;
*min=t;

min=a+1;//第三个
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if((a+N*i+j)!=a&&(a+N*i+j)!=a+N-1&&*min>*(a+N*i+j))
{
min=(a+N*i+j);
}
}
}
t=*(a+N*(N-1));
*(a+N*(N-1))=*min;
*min=t;

min=a+1;//第四个
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if((a+N*i+j)!=a&&(a+N*i+j)!=a+N-1&&(a+N*i+j)!=a+N*(N-1)&&*min>*(a+N*i+j))
{
min=(a+N*i+j);
}
}
}
t=*(a+N*N-1);
*(a+N*N-1)=*min;
*min=t;
}

int main()
{
int data[N][N];
int i,j,*p;
p=&data[0][0];
printf("输入%d行%d列的数组\n",N,N);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&data[i][j]);
}
}
zhuanhuan(p);
printf("转换后的数组是\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%-3d",data[i][j]);
}
printf("\n");
}
return(0);
}


----------------解决方案--------------------------------------------------------

我就是不想多次的用for和一次一次的转换,才把他们写在一个for里,把转换编了一个函数,

能指出一下我的错误吗?


----------------解决方案--------------------------------------------------------
2楼给您的答案是对的,在您的程序中,只用一个for和一个pmin指针是完成不了的,因为在for循环里面的具体实现里,pmin的指向不断被改变,一会儿您要用它去查找最小的数,一会儿又让它去查找第二小的数,在查找的过程中,后来的指向不断覆盖掉前面的指向。所以这是错误的.
您可以考虑用多个指针,或者如2楼所说,改成多个for,先得到第一个pmin的正确指向后,进行交换,再查找下一个最小的数.
----------------解决方案--------------------------------------------------------

版主果然讲得明白,呵呵,不要您呀,您的,我可担待不起呀,

还得麻烦一下告诉我,用多个指针应该怎么写,因为最近主要在学指针,

我就多定义了几个*pmin1,*pmin2,*pmin3,用它们分别代替题中的*pmin,可是运行结果是一样的,不知道又是哪错了,

请指教,


----------------解决方案--------------------------------------------------------
哪一位给讲一讲呗,呵呵
----------------解决方案--------------------------------------------------------
举个例子,你要从一蓝苹果中取出最小的4个,先拿出一个,放在pointer[0]位置,再拿一个,如果比pointer[0]位置的苹果还小,则把原来的苹果替换,把原来的苹果放在pointer[1]位置,再拿一个,如果比pointer[0]还小,仍替换,pointer[0],pointer[1]位置的苹果都依次后移,如果比pointer[0]位置的苹果大,而比pointer[1]位置的苹果小,则把pointer[1]以后的后移,腾出pointer[1]的位置给这个苹果,依次继续下去。
你这个想法要比2楼给你的想法考虑的情况多了些,可读性也要比2楼的要差许多。
----------------解决方案--------------------------------------------------------
噢,原来这么复杂呀,我只是刚学指针,想多用用,呵呵,多谢了
----------------解决方案--------------------------------------------------------
  相关解决方案