| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 715 人关注过本帖, 1 人收藏
标题:关于求矩阵的乘的程序改错问题
只看楼主 加入收藏
z20315045z
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2013-4-14
结帖率:50%
收藏(1)
已结贴  问题点数:20 回复次数:8 
关于求矩阵的乘的程序改错问题
#include <stdio.h>
#define M 3
#define N 3
#define K 2
void main()
{
    int i,j,s;                               //i,j为矩阵相应位置的行、列数,s控制循环
    double a[M][N];
    double b[N][K];
    double c[M][K];
    printf("请为a矩阵输入数:\n");            
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=N-1;j++)
        {
            scanf("%ld",&a[i][j]);
            printf("   \n");
        }
        printf("\n");
    }
    printf("请为b矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=K-1;j++)
        {
            scanf("%ld",&b[i][j]);
            printf("   ");
        }
        printf("\n");
    }
    for(i=0;i<=M-1;i++)                       //计算C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            for(s=0;s<=N-1;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];
            }
        }
    }
    for(i=0;i<=M-1;i++)                       //输出C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            printf("%ld",c[i][j]);
            printf("   \n");
        }
        printf("\n");
    }
}



         程序的立意是可以通过对定义量的改变来求任意阶矩阵的乘,且稍加改动后可以作为子函数模块方便以后求任意个矩阵相乘及求矩阵的逆。
         问题:
        1:在为b矩阵输入数时,只在输入第一个数后会有退格,而按照循环结构的话应该在循环内输出的每一个数后都会有退格的,何解?(原来为a矩阵输入数时也有这种情况,我疑心是我的循环设置不对,所以将代码修改成如上形式,发现循环还是按规定执行了的,那么为什么就不能完成退格?)
        2:在构思时之所以加上退格的设计是希望能够使输入的数凑成个矩阵的样子,但后来调试时无奈的发现每次敲完回车送数据时都会自动垂直下降一行,有没有办法让程序执行到这时再自动上升一行?(在发问前有在网上搜索别人的这类程序,然后发现可以在后面再加个printf语句输出成形的矩阵,但还是想知道有没有办法在输入时就使其成形。另,本来在设计时还打算加上边框,但考虑到复杂性,就暂时没加了,有没有除了使用printf语句外的其他能让初学者理解的好方法?)
        3:在敲完数据时,命令框急速的闪过一些数据后便自动关掉了,这是这么回事?我都还来不及检验输出结果是否正确;
        4:输出的数据类型格式,如何给双精度类型限定?如我想要一个3位整数,两位小数的浮点型数据我可以使用 %3.2f,如果是对双精度类型应如何进行此类操作?
        5:我上面所写代码还有哪些可优化之处?


        烦请各位指点,拜谢!
搜索更多相关主题的帖子: 矩阵 include double 
2013-04-14 01:36
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:7 
3:在敲完数据时,命令框急速的闪过一些数据后便自动关掉了,这是这么回事?我都还来不及检验输出结果是否正确;
你用什么环境和编译器?最后面加个getchar();让程序停住

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-04-14 07:44
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:7 
输入时没必要换行,建议用code::blocks,编译
程序代码:
#include <stdio.h>
#define M 3
#define N 3
#define K 2
void main()
{
    int i,j,s;                               //i,j为矩阵相应位置的行、列数,s控制循环
    long long a[M][N];
    long long b[N][K];
    long long c[M][K];
    printf("请为a矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=N-1;j++)
        {
            scanf("%d",&a[i][j]);
         //   printf("   \n");
        }
       // printf("\n");
    }
    printf("请为b矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=K-1;j++)
        {
            scanf("%d",&b[i][j]);
         //   printf("   ");
        }
        //printf("\n");
    }
    for(i=0;i<=M-1;i++)                       //计算C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            for(s=0;s<=N-1;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];
            }
        }
    }
    for(i=0;i<=M-1;i++)                       //输出C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            printf(" %15d",c[i][j]);
        }
        printf("\n");
    }
}

www.qunxingw.wang
2013-04-14 11:54
不眠的夜
Rank: 2
等 级:论坛游民
帖 子:63
专家分:96
注 册:2013-3-12
收藏
得分:7 
根据你定义的a[3][3]*b[3][2]算的c矩阵应为c[3][2],而根据你的算法得出的不止这个结果。
  还有在输出数组时内循环不要有printf("   \n");这样输出的矩阵更美观。
for(i=0;i<=M-1;i++)                       //输出C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            printf("%ld",c[i][j]);
            printf("   \n");//应删去
        }
        printf("\n");
    }

经该可执行程序如下:
#include <stdio.h>
//#define M 3
//#define N 3
//#define K 2
void main()
{
    int i,j,s=1;                               //i,j为矩阵相应位置的行、列数,s控制循环
    int a[3][3];
    int b[3][2];
    int c[3][2];
    printf("请为a矩阵输入数:\n");            
    for(i=0;i<3;i++)
    {  for(j=0;j<3;j++)
        {
            scanf("%ld",&a[i][j]);
        }
        printf("\n");
    }
   
    printf("请为b矩阵输入数:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
        {
            scanf("%ld",&b[i][j]);
        }
        printf("\n");
    }
   
   
    for(i=0;i<3;i++)                       //计算C矩阵
    {
            for(j=0;j<2;j++)
            {c[i][j]=a[i][0]*b[0][j]+a[i][s]*b[s][j]+a[i][s+1]*b[s+1][j] ;
                //c[i][j]+=a[i][s]*b[s][j];
            }
        
    }
   
    for(i=0;i<3;i++)                       //输出C矩阵
    {
        for(j=0;j<2;j++)
        {
            printf("%5d",c[i][j]);
        }
        printf("\n");
    }
}
2013-04-14 11:58
不眠的夜
Rank: 2
等 级:论坛游民
帖 子:63
专家分:96
注 册:2013-3-12
收藏
得分:0 
回复 3楼 qunxingw
在此定义数组不该用long long型吧?还有算法有错误。。。
2013-04-14 12:09
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
回复 5楼 不眠的夜
初始化C应该可以
程序代码:
#include <stdio.h>
#define M 3
#define N 3
#define K 2
void main()
{
    int i,j,s;                               //i,j为矩阵相应位置的行、列数,s控制循环
    long a[M][N];
    long b[N][K];
    long c[M][K]={0};
    printf("请为a矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=N-1;j++)
        {
            scanf("%ld",&a[i][j]);
         //   printf("   \n");
        }
       // printf("\n");
    }
    printf("请为b矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=K-1;j++)
        {
            scanf("%ld",&b[i][j]);
         //   printf("   ");
        }
        //printf("\n");
    }
    for(i=0;i<=M-1;i++)                       //计算C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            for(s=0;s<=N-1;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];
            }
        }
    }
    for(i=0;i<=M-1;i++)                       //输出C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            printf(" %3ld",c[i][j]);
        }
        printf("\n");
    }
}

www.qunxingw.wang
2013-04-14 18:54
z20315045z
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2013-4-14
收藏
得分:0 
回复 2楼 pauljames
XP下的VC++6.0
加了个getchar()果然是个好办法,但出来的结果怎么还是不对?
#include <stdio.h>
#define M 3
#define N 3
#define K 2
void main()
{
    int i,j,s;                               //i,j为矩阵相应位置的行、列数,s控制循环
    long long a[M][N];
    long long b[N][K];
    long long c[M][K];
    printf("请为a矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=N-1;j++)
        {
            scanf("%d",&a[i][j]);
         //   printf("   \n");
        }
       // printf("\n");
    }
    printf("请为b矩阵输入数:\n");
    for(i=0;i<=M-1;i++)
    {
        for(j=0;j<=K-1;j++)
        {
            scanf("%d",&b[i][j]);
         //   printf("   ");
        }
        //printf("\n");
    }
    for(i=0;i<=M-1;i++)                       //计算C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            for(s=0;s<=N-1;s++)
            {
                c[i][j]+=a[i][s]*b[s][j];
            }
        }
    }
    for(i=0;i<=M-1;i++)                       //输出C矩阵
    {
        for(j=0;j<=K-1;j++)
        {
            printf(" %15d",c[i][j]);
        }
        printf("\n");
    }
}


使用3楼改进后的如上代码在VC上运行后命令提示框倒是不马上消失了(为什么只是删去了几个printf语句命令提示框就稳定了下来呢?),但输出的数字好奇怪,都是-8589934XX,本来想贴图的,没找到这个功能,顺带请问下如何贴图?
2013-04-14 22:12
z20315045z
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2013-4-14
收藏
得分:0 
回复 4楼 不眠的夜
谢谢!
这个算法的设计目标是要求能计算任意阶矩阵相乘,只是因为为了检验调试方便,所以定义了一些较小的数字。定义的s和第三重循环也是为了能计算任意阶矩阵而准备的。在输入a矩阵中数时加的内循环printf语句本来只是用来输出空格的,完成内循环后再输出换行,我希望达到输出的效果是这样的,
1    3    3
2    2    4
5    6    3
但因为程序在运行时一是敲了回车后光标会自动下降一行,二是内循环中的输出空格只输出一次,为了检验是否是我设置的循环出错,所以我改成了换行,发现没错,接着我又把它改成空格加换行,发现每次都有输出换行,但仍然只有第一次有输出空格,我越发搞不明白了。
朋友,你的代码和版主后发的代码都能正常运行,我看了下除了删了几个输出语句外只是改动了数据类型,是我原来设置的数据类型不对吗?

[ 本帖最后由 z20315045z 于 2013-4-14 22:40 编辑 ]
2013-04-14 22:30
z20315045z
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2013-4-14
收藏
得分:0 
回复 6楼 qunxingw
版主谢了!
code block呀。。。
我现在用得是VC++6.0,在网上看了下code block,发现貌似不是刚学C两个月的我能掌控的。。。以后会去尝试的。
long long在VC中好像是非法的。
我原来的数据类型为什么会导致错误呢?我知道我原来设置的数据类型会有些问题,但我用来调试的数据都是很小的,应该不至于溢出啊。为什么输出的结果会是错的?

我懂了,我没有给C矩阵赋初值0,所以结果会乱七八糟。


[ 本帖最后由 z20315045z 于 2013-4-17 17:31 编辑 ]
2013-04-14 22:35
快速回复:关于求矩阵的乘的程序改错问题
数据加载中...
 
   



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

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