第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)

copyright (c) 2016,烟台大学计算机学院 
 
All rights reserved. 
 
文件名称:1.cpp 
 
作者:孟令康
 
完成日期:2016年9月12日 
 
版本号:v1.0 
 
问题描述:采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法。


输入描述:两个稀疏矩阵 


程序输出:相加运算后的结果。  

代码

main.cpp:

#include <stdio.h>  
#include "tup.h"  
bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)  
{  
    int i,j;  
    ElemType va,vb,vc;  
    if (a.rows!=b.rows || a.cols!=b.cols)  
        return false;                        //行数或列数不等时不能进行相加运算  
    c.rows=a.rows;  
    c.cols=a.cols;       //c的行列数与a的相同  
    c.nums=0;  
    for(i=0; i<M; i++)  
        for(j=0; j<N; j++)  
        {  
            Assign(a,va,i,j);  
            Assign(b,vb,i,j);  
            vc=va+vb;  
            if(vc)  
                Value(c,vc,i,j);  
        }  
    return true;  
}  
  
int main()  
{  
    TSMatrix ta,tb,tc;  
    int A[M][N]=  
    {  
        {0,0,1,0,0,0,0},  
        {0,2,0,0,0,0,0},  
        {3,0,0,0,0,0,0},  
        {0,0,0,5,0,0,0},  
        {0,0,0,0,6,0,0},  
        {0,0,0,0,0,7,4}  
    };  
    int B[M][N]=  
    {  
        {0,0,10,0,0,0,0},  
        {0,0,0,20,0,0,0},  
        {0,0,0,0,0,0,0},  
        {0,0,0,50,0,0,0},  
        {0,0,20,0,0,0,0},  
        {0,0,0,10,0,0,4}  
    };  
    CreatMat(ta,A);  
    CreatMat(tb,B);  
    printf("A:\n");  
    DispMat(ta);  
    printf("B:\n");  
    DispMat(tb);  
    if(MatAdd(ta, tb, tc))  
    {  
        printf("A+B:\n");  
        DispMat(tc);  
    }  
    else  
    {  
        printf("相加失败\n");  
    }  
    return 0;  
}  
tup.h:

#include "stdio.h"    
#define M 6    
#define N 7    
#define MaxSize  100         //矩阵中非零元素最多个数    
typedef int ElemType;    
typedef struct    
{    
    int r;                  //行号    
    int c;                  //列号    
    ElemType d;             //元素值    
} TupNode;                  //三元组定义    
    
typedef struct    
{    
    int rows;               //行数    
    int cols;               //列数    
    int nums;               //非零元素个数    
    TupNode data[MaxSize];    
} TSMatrix;                 //三元组顺序表定义    
void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示    
bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值    
bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量    
void DispMat(TSMatrix t);//输出三元组    
void TranTat(TSMatrix t,TSMatrix &tb);//矩阵转置

tup.cpp:

#include <stdio.h>  
#include"tup.h"    
//TSMatrix储存行的个数、列的个数、及非0的个数、tupnode数组(包含每个元素的row,col和实际值)    
    
void CreatMat(TSMatrix &t,ElemType A[M][N])//从一个二维稀疏矩阵创建其三元组表示    
{    
    int i=0,j=0;    
    t.cols=N;    
    t.rows=M;    
    t.nums=0;    
    while(i<M)    
    {    
        while(j<N)    
        {    
            if(A[i][j]!=0)    
            {    
                t.data[t.nums].d=A[i][j];    
                t.data[t.nums].r=i;    
                t.data[t.nums].c=j;    
                t.nums++;    
            }    
            j++;    
        }    
        j=0;    
        i++;    
    }    
}    
    
bool Value(TSMatrix &t,ElemType x,int i,int j)    
{    
    if(i>t.rows||j>t.cols)    
    {    
        return false;    
    }    
    
    int k=0,k1;    
    while(k<t.nums&&i>t.data[k].r)    
    {    
        k++;    
    }    
    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)    
    {    
        k++;    
    }    
     if (t.data[k].r==i && t.data[k].c==j)   //存在这样的元素    
        t.data[k].d=x;    
    else    
    {    
        k1=t.nums-1;    
        while(k<=k1)    
        {    
            t.data[k1+1].r=t.data[k1].r;    
            t.data[k1+1].c=t.data[k1].c;    
            t.data[k1+1].d=t.data[k1].d;    
            k1--;    
        }    
        t.data[k].r=i;    
        t.data[k].c=j;    
        t.data[k].d=x;    
        t.nums++;    
        return true;    
    }    
}    
//三元组元素赋值    
bool Assign(TSMatrix t,ElemType &x,int i,int j)    
{    
    if(i>t.rows||j>t.cols)    
    {    
        return false;    
    }    
    
    int k=0;    
    while(k<t.nums&&i>t.data[k].r&&j>t.data[k].c)    
    {    
        if(t.data[k].r==i&&t.data[k].c==j)    
        {    
                
            break;    
        }    
        k++;    
    
    }    
    if(t.data[k].r==i&&t.data[k].c==j)    
    {    
        x=t.data[k].d;    
    }    
    else x=0;    
    return true;    
    
} //将指定位置的元素值赋给变量    
void DispMat(TSMatrix t)    
{    
    int i;    
    if (t.nums<=0)          //没有非零元素时返回    
        return;    
    printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);    
    printf("\t------------------\n");    
    for (i=0; i<t.nums; i++)    
        printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);    
    
    
}//输出三元组    
void TranTat(TSMatrix t,TSMatrix &tb)       //矩阵转置    
{    
    int p,q=0,v;                    //q为tb.data的下标    
    tb.rows=t.cols;    
    tb.cols=t.rows;    
    tb.nums=t.nums;    
    if (t.nums!=0)                  //当存在非零元素时执行转置    
    {    
        for (v=0; v<t.cols; v++)        //tb.data[q]中的记录以c域的次序排列    
            for (p=0; p<t.nums; p++)    //p为t.data的下标    
                if (t.data[p].c==v)    
                {    
                    tb.data[q].r=t.data[p].c;    
                    tb.data[q].c=t.data[p].r;    
                    tb.data[q].d=t.data[p].d;    
                    q++;    
                }    
    }    
}    

运行结果:



知识点总结:

        稀疏矩阵的三元组表示。

学习心得:

        用数组完成稀疏矩阵的三元组表示,并完成测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值