| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1377 人关注过本帖
标题:[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!
只看楼主 加入收藏
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
结帖率:79.31%
收藏
已结贴  问题点数:20 回复次数:10 
[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!


大家好,下面代码是我用来实现两个稀疏矩阵的相加运算,
我先input()读入两个矩阵,然后再把这两个矩阵显示出来!
其中Status AddTSM是实现两个矩阵相加的,
但是调用不成功!!
还有怎么把相加后的矩阵c输出来呢!
还有我想把输出这个功能也单独提取出来,就是可以在输出举证a,b,c时分别调用,而不是每次都写一次!
我弄了很久也没有结果,
基础太差了!
希望大家帮帮!谢谢!

//#include "stdafx.h"
#include<stdio.h>
#define MAXSIZE 100

typedef int Status ;
typedef int ElemType;

typedef struct {
    int    i,j; // 行下标,列下标
    ElemType e; // 非零元素值
}Triple;

typedef struct  {
    Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
    int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
///三元组表示的稀疏矩阵加法: C=A+B
{
    int n=1,m=1,k=1;
    ElemType  temp;
    if(A.mu==B.mu&&A.nu==B.nu)
    {
        while(m<=A.tu&&n<=B.tu)
        {
            //若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
            //存入C中,如果列号也相等,则将对应的元素值相加后存入C中
            if(A.data[m].i==B.data[n].i)
            {
                if(A.data[m].j<B.data[n].j)
                {
                    C.data[k].i=A.data[m].i;
                    C.data[k].j=A.data[m].j;
                    C.data[k].e=A.data[m].e;
                    k++;
                    m++;               
                }
                else if(A.data[m].j>B.data[n].j)
                {
                    C.data[k].i=B.data[n].i;
                    C.data[k].j=B.data[n].j;
                    C.data[k].e=B.data[n].e;
                    k++;
                    n++;
                }
                else
                {
                    temp=A.data[m].e+B.data[n].e;
                    if(temp!=0)//不为0才添加到C中
                    {
                        C.data[k].i=A.data[m].i;
                        C.data[k].j=A.data[m].j;
                        C.data[k].e=temp;
                        k++;      
                    }
                    m++;
                    n++;
                }
            }
            //若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中
            else if(A.data[m].i<B.data[n].i)
            {
                C.data[k].i=A.data[m].i;
                C.data[k].j=A.data[m].j;
                C.data[k].e=A.data[m].e;
                k++;
                m++;
            }
            //若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中
            else
            {
                C.data[k].i=B.data[n].i;
                C.data[k].j=B.data[n].j;
                C.data[k].e=B.data[n].e;
                k++;
                n++;
            }
        }
        //把剩余部分元素存入C中
        if(m>A.tu&&n<=B.tu)
            for( ;n<=B.tu;n++)
            {
                C.data[k].i=B.data[n].i;
                C.data[k].j=B.data[n].j;
                C.data[k].e=B.data[n].e;
                k++;
            }
            if(n>B.tu&&m<=A.tu)
                for( ;m<=A.tu;m++)
                {
                    C.data[k].i=A.data[m].i;
                    C.data[k].j=A.data[m].j;
                    C.data[k].e=A.data[m].e;
                    k++;
                }      
                C.mu=A.mu;
                C.nu=A.nu;
                C.tu=k-1;
                return true;
    }
    else
        return false;
}


input()
{
    int k;
    TSMatrix A,B;
    int a[100][100]={0};
    int b[100][100]={0};
    printf("输入稀疏矩阵A的行数,列数和非零元个数:");
    scanf("%d %d %d",&A.mu,&A.nu,&A.tu);
    for(k=1;k<=A.tu;k++)
    {
        printf("输入第%d个非0元素的行数,列数和值:",k);
        scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].e);
    }
    printf("输入稀疏矩阵B的行数,列数和非零元个数:");
    scanf("%d %d %d",&B.mu,&B.nu,&B.tu);
    for(k=1;k<=B.tu;k++)
    {
        printf("输入第%d个非0元素的行数,列数和值:",k);
        scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].e);
    }
    /*
    if(A.mu!=B.mu||A.nu!=B.nu)
    {
        printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
        return;
    }*/
   
   
    for(k=1;k<=A.tu;k++)
    {
        a[A.data[k].i][A.data[k].j]=A.data[k].e;
    }
   
    printf("A输入为:\n");
    for(k=1;k<=A.mu;k++)
    {
        for(int l=1;l<=A.nu;l++)
            printf("%d ",a[k][l]);
        printf("\n");
    }
   
   
    for(k=1;k<=B.tu;k++)
    {
        b[B.data[k].i][B.data[k].j]=B.data[k].e;
    }
   
    printf("B输入为:\n");
    for(k=1;k<=B.mu;k++)
    {
        for(int l=1;l<=B.nu;l++)
            printf("%d ",b[k][l]);
        printf("\n");
    }
}



int main(int argc, char* argv[])
{
    input();
    Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C);



    return 0;
}



搜索更多相关主题的帖子: 优化 成功 include input 
2011-04-22 21:26
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:20 
程序代码:
#include<stdio.h>
#define MAXSIZE 100

typedef int Status ;
typedef int ElemType;

typedef struct {
    int    i,j; // 行下标,列下标
    ElemType e; // 非零元素值
}Triple;

typedef struct  {
    Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
    int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


int AddTSM(TSMatrix A,TSMatrix B,TSMatrix * C)
///三元组表示的稀疏矩阵加法: C=A+B 
{ 
    int n=1,m=1,k=1;
    ElemType  temp;
    if(A.mu==B.mu&&A.nu==B.nu)
    {
        while(m<=A.tu&&n<=B.tu)
        {
            //若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
            //存入C中,如果列号也相等,则将对应的元素值相加后存入C中
            if(A.data[m].i==B.data[n].i)
            { 
                if(A.data[m].j<B.data[n].j)
                {
                    C->data[k].i=A.data[m].i;
                    C->data[k].j=A.data[m].j;
                    C->data[k].e=A.data[m].e;
                    k++;
                    m++;               
                }
                else if(A.data[m].j>B.data[n].j)
                {
                    C->data[k].i=B.data[n].i;
                    C->data[k].j=B.data[n].j;
                    C->data[k].e=B.data[n].e; 
                    k++;
                    n++;
                } 
                else 
                {
                    temp=A.data[m].e+B.data[n].e;
                    if(temp!=0)//不为0才添加到C中
                    {
                        C->data[k].i=A.data[m].i; 
                        C->data[k].j=A.data[m].j;
                        C->data[k].e=temp; 
                        k++;      
                    }
                    m++;
                    n++;
                }
            }
            //若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中
            else if(A.data[m].i<B.data[n].i)
            {
                C->data[k].i=A.data[m].i;
                C->data[k].j=A.data[m].j;
                C->data[k].e=A.data[m].e;
                k++;
                m++;
            }
            //若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中
            else
            {
                C->data[k].i=B.data[n].i;
                C->data[k].j=B.data[n].j;
                C->data[k].e=B.data[n].e; 
                k++;
                n++;
            }
        }
        //把剩余部分元素存入C中
        if(m>A.tu&&n<=B.tu)
            for( ;n<=B.tu;n++)
            {
                C->data[k].i=B.data[n].i; 
                C->data[k].j=B.data[n].j;
                C->data[k].e=B.data[n].e; 
                k++;
            }
            if(n>B.tu&&m<=A.tu)
                for( ;m<=A.tu;m++)
                {
                    C->data[k].i=A.data[m].i; 
                    C->data[k].j=A.data[m].j;
                    C->data[k].e=A.data[m].e; 
                    k++;
                }      
                C->mu=A.mu; 
            C->nu=A.nu;
            C->tu=k-1;
            return 1;
    }
    else 
        return 0;
}


void get_matrix(TSMatrix * m) {
    int k, l;
    printf("输入稀疏矩阵的行数,列数和非零元个数:");
    scanf("%d %d %d",&m->mu,&m->nu,&m->tu);
    for(k=1;k<=m->tu;k++)
    {
        printf("输入第%d个非0元素的行数,列数和值:",k);
        scanf("%d %d %d",&m->data[k].i,&m->data[k].j,&m->data[k].e);
    }
}

void put_matrix(TSMatrix m) {
    int i, j, t;
    for (t = 1, i = 1, j = 1; t <= m.tu; t++) {
        for (; i < m.data[t].i; i++) {
            for (; j <= m.nu; j++) {
                printf("%8d", 0);
            }
            j = 1;
            printf("\n");
        }
        for (; j < m.data[t].j; j++) {
            printf("%8d", 0);
        }
        printf("%8d", m.data[t].e);
        j++;
    }
    for (; j <= m.nu; j++) {
        printf("%8d", 0);
    }
    printf("\n");
}



int main(int argc, char* argv[])
{
    TSMatrix A, B, C;
    get_matrix(&A);
    put_matrix(A);
    get_matrix(&B);
    put_matrix(B);
    AddTSM(A, B, &C);
    printf("Their sum is:\n");
    put_matrix(C);
    return 0;
}


你看看吧,全都弄好了

[ 本帖最后由 voidx 于 2011-4-23 00:30 编辑 ]
2011-04-22 22:10
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
谢谢,大哥我测试不成功,
你还能帮我测试一下吗
谢谢
2011-04-22 23:18
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
以下是引用voidx在2011-4-22 22:10:30的发言:

#include
#define MAXSIZE 100
 
typedef int Status ;
typedef int ElemType;
 
typedef struct {
    int    i,j; // 行下标,列下标
    ElemType e; // 非零元素值
}Triple;
 
typedef struct  {
    Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
    int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
 
 
int AddTSM(TSMatrix A,TSMatrix B,TSMatrix * C)
///三元组表示的稀疏矩阵加法: C=A+B  
{  
    int n=1,m=1,k=1;
    ElemType  temp;
    if(A.mu==B.mu&&A.nu==B.nu)
    {
        while(m<=A.tu&&n<=B.tu)
        {
            //若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素
            //存入C中,如果列号也相等,则将对应的元素值相加后存入C中
            if(A.data[m].i==B.data[n].i)
            {  
                if(A.data[m].j
非常谢谢,我去试一试
2011-04-23 08:45
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
还是不行呀!!

输出数组只有非零元素
我想其他的元素也输出呀!
是输出一个完整的数组!
而不是这样的:
输入稀疏矩阵的行数,列数和非零元个数:2
2
2
输入第1个非0元素的行数,列数和值:1
1
1
输入第2个非0元素的行数,列数和值:1
2
2
       1       2
输入稀疏矩阵的行数,列数和非零元个数:2
2
1
输入第1个非0元素的行数,列数和值:1
1
2
       2       0
Their sum is:
       3       2
Press any key to continue

谢谢
2011-04-23 08:49
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
不好意思,之前疏忽了

程序代码:
void put_matrix(TSMatrix m) {
    int i, j, t;
    for (t = 1, i = 1, j = 1; t <= m.tu; t++) {
        for (; i < m.data[t].i; i++) {
            for (; j <= m.nu; j++) {
                printf("%8d", 0);
            }
            j = 1;
            printf("\n");
        }
        for (; j < m.data[t].j; j++) {
            printf("%8d", 0);
        }
        printf("%8d", m.data[t].e);
        j++;
    }
    for (; i <= m.mu; i++) {
        for (; j <= m.nu; j++) {
            printf("%8d", 0);
        }
        j = 1;
        printf("\n");
    }
    printf("\n");
}
2011-04-23 09:48
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
还有一个问题,

如果两个稀疏矩阵不相等的话,就是不是行数和列数不一样,就不能进行相加!
但是运行的时候没有提示哦
2011-04-23 17:48
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 7楼 xiaxun
。。。那你自己加上不就好了。
难道你没发现实现加法的那个函数跟以前一模一样?
2011-04-23 18:59
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
以下是引用voidx在2011-4-23 18:59:28的发言:

。。。那你自己加上不就好了。
难道你没发现实现加法的那个函数跟以前一模一样?
这个知道了
我忘记我原来的函数就有的了
2011-04-23 19:06
xiaxun
Rank: 1
等 级:新手上路
帖 子:207
专家分:7
注 册:2009-8-30
收藏
得分:0 
现在还有一个问题

!!!!!!!!!
我想在输入矩阵的时候:
是这样输入的:
0  0  3
2  3  0
0  0  3
~~~~~~~
然后再由系统去判断哪些是不为0的行和列,然后再把这些列号和行号还有非零元素存起来

怎么改写代码呢

谢谢
2011-04-23 19:08
快速回复:[求助]怎么进行调用并输出矩阵c,代码还可以优化吗!
数据加载中...
 
   



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

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