注册 登录
编程论坛 C++教室

一个超级简单的问题求解

guchao2009 发布于 2009-12-25 19:58, 993 次点击
//编写一个函数,将一个3行4列矩阵转置,在主函数中对该矩阵进行输入输出
#include<iostream>

using namespace std;
void main()
{
    int a[3][4];
    int i,j,tmp;
    cout<<"请输入一个3行4列矩阵(输入一个数请按下回车键方便操作):"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cin>>a[i][j];
        }
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"您输入的3行4列矩阵:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cout<<a[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"转置后的3行4列矩阵:"<<endl;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4&&j<i;j++)
        {
            tmp=a[i][j];
            a[i][j]=a[j][i];
            a[j][i]=tmp;
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<a[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}

10 回复
#2
guchao20092009-12-25 20:00
补充说明:为什么会出现应用程序错误?
#3
英英2009-12-25 21:33
我也不太清楚,估计跟内存分配有关吧
以前写这个程序的时候声明了两个数组,一个是用来存储转置后的数组的
不过这个程序只要稍微改一下就可以了
将转置的循环语句改为:
 for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
           b[i][j]=a[j][i];
        }
    }
最后输出改为b[j][i]就可以了
#4
飘到心海2009-12-25 22:08
楼上的的确可以解决问题啊,可为什么楼主的会出现那种错误呢,期待高手
#5
shiyuehai2009-12-25 22:25
你定义的是一个int a[3][4]数组,数组最后一个数应该是a[2][3]
而你这里
for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<a[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}
又用到了a[i][j]数组,i的值你取0-3,这就超出了你定义的a数组的行下标的上限了。。。有点废话了,简单说就是下面那个循环出现了a[3][j]这些,而这些内存空间是不存在的,从新定义一个数组b[4][3]装装置的矩阵就没事了。。。。不好意思,我也刚学了2个月c++,总结起来有点乱,希望你看得懂
#6
ymzhaojian2009-12-26 08:45
楼上的说的似乎对啊!
#7
guchao20092009-12-26 13:01
//编写一个函数,将一个3行4列矩阵转置,在主函数中对该矩阵进行输入输出
#include<iostream>

using namespace std;
void main()
{
    int a[3][4],b[3][4];
    int i,j,tmp;
    cout<<"请输入一个3行4列矩阵(输入一个数请按下回车键方便操作):"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cin>>a[i][j];
        }
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"您输入的3行4列矩阵:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cout<<a[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"转置后的3行4列矩阵:"<<endl;
    for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
            b[i][j]=a[j][i];
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<b[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}



(根据3楼的)这个是正解,不过那个原因说不出来,只是感觉那样不对(正如5楼所说).
#8
guchao20092009-12-26 13:08
扩展程序/////////////////////////////////////////////////////////////////

//编写一个函数,将一个×行×列矩阵转置,在主函数中对该矩阵进行输入输出
#include<iostream>

using namespace std;
#define maxsize1 ×
#define maxsize2 ×
void main()
{
    int a[maxsize1][maxsize2],b[maxsize1][maxsize2];
    int i,j,tmp;
    cout<<"请输入一个×行×列矩阵(输入一个数请按下回车键方便操作):"<<endl;
    for(i=0;i<maxsize1;i++)
    {
        for(j=0;j<maxsize2;j++)
        {
            cin>>a[i][j];
        }
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"您输入的3行4列矩阵:"<<endl;
    for(i=0;i<maxsize1;i++)
    {
        for(j=0;j<maxsize2;j++)
        {
            cout<<a[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"//////////////////////////////////////////////////"<<endl;
    cout<<"转置后的3行4列矩阵:"<<endl;
    for(i=0;i<maxsize2;i++)
    {
        for(j=0;j<maxsize1;j++)
        {
            b[i][j]=a[j][i];
        }
    }
    for(i=0;i<maxsize2;i++)
    {
        for(j=0;j<maxsize1;j++)
        {
            cout<<b[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}

#9
编我的2009-12-26 13:10
数组越界问题额!!这问题模糊。。
#10
wlsj2009-12-26 21:45
5楼的正确
#11
yangliangbin2009-12-28 10:07
//编写一个函数,将一个3行4列矩阵转置,在主函数中对该矩阵进行输入输出
#include<iostream>
using namespace std;
void main()
{
    int a[3][4],b[4][3];//注意这里、别跟楼上的一样写错了
    int i,j;
    cout<<"请输入一个3行4列矩阵:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cin>>a[i][j];
        }
    }
    cout<<"-------------------------------"<<endl;
 
    cout<<"您输入的3行4列矩阵:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<"-------------------------------"<<endl;
    cout<<"转置后的3行4列矩阵:"<<endl;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            b[j][i]=a[i][j];
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<b[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}

还有楼主的代码:
   cout<<"转置后的3行4列矩阵:"<<endl;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4&&j<i;j++)
        {
            tmp=a[i][j];
            a[i][j]=a[j][i];
            a[j][i]=tmp;     
         }
    }
这个算法只适合方阵矩阵。。。

1