| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 459 人关注过本帖
标题:为什么得不到想要的结果
只看楼主 加入收藏
夏日清风
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:71
专家分:126
注 册:2010-4-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
为什么得不到想要的结果
为什么输出结果是
1 2 3
4 5 6
7 8 9
而不是
1 4 7
2 5 8
3 6 9

#include<stdio.h>
void main()
{
    void zz(int p[3][3]);
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int m,n,t=0;
    for(m=0;m<3;m++)
    {
        for(n=0;n<3;n++)     
        {
            printf("%d ",a[m][n]);
            t++;
            if(t%3==0)
                printf("\n");
        }
    }
    zz(a);另外为什么此处不能用zz(int a[3][3])?
}

void zz(int p[3][3])
{
    int i,j,s=0,temp;
    for(i=0;i<3;i++)
    {
        for(j=i;j<3;j++)
        {
            temp=*((*p+i)+j);
            *((*p+i)+j)=*((*p+j)+i);
            *((*p+j)+i)=temp;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {   
            printf("%d ",*(*(p+i)+j));
            s++;
            if(s%3==0)
                printf("\n");
        }
    }
}
搜索更多相关主题的帖子: 结果 得不到 
2010-05-25 13:22
源本英明C
Rank: 3Rank: 3
来 自:日本
等 级:论坛游侠
帖 子:113
专家分:154
注 册:2010-5-14
收藏
得分:5 
多了一次转置,在
for(i=0;i<3;i++)
    {
        for(j=i;j<3;j++)
        {
            temp=*((*p+i)+j);
            *((*p+i)+j)=*((*p+j)+i);
            *((*p+j)+i)=temp;
        }
    }
中,比如当i=1,j=2时你先将a[1][2]和a[2][1]互换了,但是当i=2,j=1,时又要执行该函数,所以又将a[2][1]和a[1][2]互换了。为什么呢?因为虽然你的j是从i开始取值的,但是,你的i始终是从0开始执行的。所以只能得到原来矩阵。应该改为
for(i=0;i<3;i++)
    {
        for(j=0;j<i;j++)
        {
            temp=*((*p+i)+j);
            *((*p+i)+j)=*((*p+j)+i);
            *((*p+j)+i)=temp;
        }
    }
您认为呢?可以相互交流一下!

柔术:打败对手的最好方法就是心狠手辣,因为对手不会给你太多机会,如果他够厉害!
2010-05-25 14:16
源本英明C
Rank: 3Rank: 3
来 自:日本
等 级:论坛游侠
帖 子:113
专家分:154
注 册:2010-5-14
收藏
得分:5 
还有,你的转置函数根本没有在主函数中调用过。完整的程序或许应该这样的,请看:
#include<stdio.h>
void main()
{
    void zz(int p[3][3]);
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int m,n,t=0;
    zz(a[3][3]);
    for(m=0;m<3;m++)
    {
        for(n=0;n<3;n++)     
        {
            printf("%d ",a[m][n]);
            t++;
            if(t%3==0)
                printf("\n");
        }
    }
  }
void zz(int p[3][3])
{
    int i,j,s=0,temp;
    for(i=0;i<3;i++)
    {
        for(j=0;j<i;j++)
        {
            temp=*((*p+i)+j);
            *((*p+i)+j)=*((*p+j)+i);
            *((*p+j)+i)=temp;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {   
            printf("%d ",*(*(p+i)+j));
            s++;
            if(s%3==0)
                printf("\n");
        }
    }
}
您觉得呢?

柔术:打败对手的最好方法就是心狠手辣,因为对手不会给你太多机会,如果他够厉害!
2010-05-25 14:24
源本英明C
Rank: 3Rank: 3
来 自:日本
等 级:论坛游侠
帖 子:113
专家分:154
注 册:2010-5-14
收藏
得分:5 
#include<stdio.h>
void main()
{
    void zz(int p[3][3]);
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int m,n,t=0;
    zz(a[3][3]);
    for(m=0;m<3;m++)
    {
        for(n=0;n<3;n++)     
        {
            printf("%d ",a[m][n]);
            t++;
            if(t%3==0)
                printf("\n");
        }
    }
  }
void zz(int p[3][3])
{
    int i,j,s=0,temp;
    for(i=0;i<3;i++)
    {
        for(j=0;j<i;j++)
        {
            temp=*((*p+i)+j);
            *((*p+i)+j)=*((*p+j)+i);
            *((*p+j)+i)=temp;
        }
    }
}

柔术:打败对手的最好方法就是心狠手辣,因为对手不会给你太多机会,如果他够厉害!
2010-05-25 14:25
夏日清风
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:71
专家分:126
注 册:2010-4-16
收藏
得分:0 
回复 2楼 源本英明C
i=2时j不能等于1呀,它是>=i的,这是怎么回事呀?
2010-05-25 17:27
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:5 
temp=*((*p+i)+j);
*((*p+i)+j)=*((*p+j)+i);
*((*p+j)+i)=temp;

问题出在这几句,LZ不觉得第二句的赋值语句等号左右指的是同一个内存地址吗?
我觉得应该为:
temp=*((*p+i*3)+j);
*((*p+i*3)+j)=*((*p+j*3)+i);
*((*p+j*3)+i)=temp;

第i行,第j列的内容是:*((*p+i*列数)+j),i,j从0开始记
2010-05-25 18:05
夏日清风
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:71
专家分:126
注 册:2010-4-16
收藏
得分:0 
回复 6楼 Kid_X
呵呵,6楼挺幽默的,的确错了。
2010-05-25 19:45
快速回复:为什么得不到想要的结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027409 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved