icoding测试代码--矩阵加法

icoding的数据结构并没有一个测试代码,其都是直接编写一个函数的形式,因此很难知道自己的实际输出是什么。针对部分题目,我编写了一系列测试代码以供大家进行数据输出的测试。

bool add_matrix(const TSMatrix *pM, const TSMatrix *pN, TSMatrix *pQ){
    //TODO
}

请将您的函数代码复制到上述函数中,然后修改main函数的相关内容,完成测试样例的输入

矩阵加法内置了对输入的三元组数据的正确性判断,因此很冗长。

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>


typedef int ElemType;
#define MAXSIZE 100          //假设非零元个数的最大值为100
typedef struct {
    int i,j;									//非零元的行下标和列下标,i 和 j 从 1 开始计数,与数学中矩阵元素的编号一致
    ElemType e;						//非零元的值
}Triple;

typedef struct {
    Triple data[MAXSIZE];			// 非零元三元组表
    int    m, n, len;							// 矩阵的行数、列数和非零元个数
}TSMatrix;

bool add_matrix(const TSMatrix *pM, const TSMatrix *pN, TSMatrix *pQ){
    //TODO
}


void PrintfMatrix2(TSMatrix *M,char str) {
    int i, j, k = 1;
    Triple *t;

    printf(">>打印矩阵%c:\n", str);
    for (i = 1; i <= M->m; ++i) {
        for (j = 1; j <= M->n; ++j) {
            t = &M->data[k];
            printf("%4d", t->i == i && t->j == j ? (++k, t->e) : 0);
        }
        putchar('\n');
    }
    //putchar('\n');
}

//打印矩阵(相加后的矩阵)
void PrintfMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q) {
    int i, j, k1 = 1,k2=1,k3=1;
    Triple *t;
    Triple *s;
    Triple *r;


    for (i = 0; i <= M->m; ++i) {
        //从0开始是为了显示MN;从第一行开始是为了显示矩阵
        if(i==0){
            //打印一半矩阵长度的空格
            printf("%*c%*c%*c\n",2+4*(M->n)/2,'M',3+2+4*(M->n)/2+4*(N->n)/2,'N',3+2+4*(M->n)/2+4*(N->n)/2,'Q');
            
        }else{
        for (j = 1; j <= M->n; ++j) {
            t = &M->data[k1-1];
            printf("%4d", t->i == i && t->j == j ? (++k1, t->e) : 0);
        }

        if(i==M->m/2+1){
            printf("    +");
        }else{
            printf("     ");
        }
        

        for (j = 1; j <= N->n; ++j) {
            s = &N->data[k2-1];
            printf("%4d", s->i == i && s->j == j ? (++k2, s->e) : 0);
        }

        if(i==M->m/2+1){
            printf("    =");
        }else{
            printf("     ");
        }

        for (j = 1; j <= Q->n; ++j) {
            r = &Q->data[k3-1];
            printf("%4d", r->i == i && r->j == j ? (++k3, r->e) : 0);
        }
        putchar('\n');


        }
    }
    return ;
}


int main(){
//--------您 可 以 修 改 以 下 代 码 ---------
    int m_rownum=3;//m的行数
    int m_colnum=3;//m的列数

    int m_row[]  ={1,2,3};
    int m_col[]  ={2,3,3};
    int m_value[]={1,2,4};
    //m的非零元三元组表
    //其中m_row,m_col,m_value的长度为分别表示一个非0元的行数、列数和值,其满足列相互对应
    //例如:
    // int m_row[]  ={1,2,2};
    // int m_col[]  ={2,2,3};
    // int m_value[]={1,2,4};
    //表示:在1行2列有值1,在2行2列有值2,在2行3列有值4

    //三元组表的排列应该满足一定规则,即:
    //三个数组的长度应该相等,且他们的长度应该大于等于1
    //且不应该有重复的行列。
    //m_row[0]表示第一个非0元的行数,m_row[1]表示第二个非0元的行数,以此类推
    //而且row必须满足单增,而在row相同的条件下,col也必须按照单增顺序排列
    //例如:
    // int m_row[]  ={3,1,2,2};
    // int m_col[]  ={3,3,3,2};
    // int m_value[]={9,5,2,4};
    //是错误的,因为
    //1. m_row[]  ={3,1,2,2}不满足单增
    //2. 在row都是2时 m_col[]  ={3,3,3,2}对应项目(最后两项)不满足单增
    //正确排序应该是:
    // int m_row[]  ={1,2,2,3};
    // int m_col[]  ={3,2,3,3};
    // int m_value[]={5,2,4,9};
    //别担心会在这里犯错,我们的程序会检测这个的。


    int n_rownum=3;// n的行数
    int n_colnum=3;// n的列数

    int n_row[]  ={1,1,2};
    int n_col[]  ={1,2,2};
    int n_value[]={1,8,4};
    //n的非零元三元组表
    //规则同上
//--------您 可 以 修 改 以 上 代 码 ---------


    printf("----icoding----\n");
    printf("矩阵加法\n");
    printf(">>初始化中...\n");
    printf("提示##当出现提示“程序自动终止”说明在main函数的三元组表初始错误,需要在main函数修改相关值\n\n");
    int m_row_len=sizeof(m_row)/sizeof(m_row[0]);
    int m_col_len=sizeof(m_col)/sizeof(m_col[0]);
    int n_row_len=sizeof(n_row)/sizeof(n_row[0]);
    int n_col_len=sizeof(n_col)/sizeof(n_col[0]);


    int m_len=sizeof(m_value)/sizeof(m_value[0]);
    int n_len=sizeof(n_value)/sizeof(n_value[0]);
    if(m_len<=0||n_len<=0){
        printf("三元组表的长度为非正数,请检查!\n程序自动终止\n");
        return 0;
    }
    if(m_row_len!=m_col_len||m_row_len!=m_len||n_row_len!=n_col_len||n_row_len!=n_len){
        printf("三元组表的长度不等,请检查!\n程序自动终止\n");
        return 0;
    }


    //检查数组是否超出界限
    for(int i=0;i<m_row_len;i++){
        if(m_row[i]<=0||m_row[i]>m_rownum){
            printf("三元组表的m_row[%d]超出界限(正确范围为[1,%d],含端点),请检查!\n程序自动终止\n",i,m_rownum);
            return 0;
        }
    }
    for(int i=0;i<m_col_len;i++){
        if(m_col[i]<=0||m_col[i]>m_colnum){
            printf("三元组表的m_col[%d]超出界限(正确范围为[1,%d],含端点),请检查!\n程序自动终止\n",i,m_colnum);
            return 0;
        }
    }
    for(int i=0;i<n_row_len;i++){
        if(n_row[i]<=0||n_row[i]>n_rownum){
            printf("三元组表的n_row[%d]超出界限(正确范围为[1,%d],含端点),请检查!\n程序自动终止\n",i,n_rownum);
            return 0;
        }
    }
    for(int i=0;i<n_col_len;i++){
        if(n_col[i]<=0||n_col[i]>n_colnum){
            printf("三元组表的n_col[%d]超出界限(正确范围为[1,%d],含端点),请检查!\n程序自动终止\n",i,n_colnum);
            return 0;
        }
    }
   
   


    //检查输入的合法性
    for(int a=0;a<m_len;a++){
        for(int b=a;b<m_len;b++){
        if(m_row[a]>m_row[b]){
            printf("输入数据不满足要求,m_row[]需要为不减数列\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        if(m_row[a]==m_row[b]&&m_col[a]>m_col[b]){
            printf("输入数据不满足要求,m_col[]在m_row相同时需要为单增数列\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        if(m_row[a]==m_row[b]&&m_col[a]==m_col[b]&&a!=b){
            printf("对于M矩阵,输入数据行列有相同\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        }
        }
    for(int a=0;a<n_len;a++){
        for(int b=a;b<n_len;b++){
        if(n_row[a]>n_row[b]){
            printf("输入数据不满足要求,n_row[]需要为不减数列\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        if(n_row[a]==n_row[b]&&n_col[a]>n_col[b]){
            printf("输入数据不满足要求,n_col[]在n_row相同时需要为单增数列\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        if(n_row[a]==n_row[b]&&n_col[a]==n_col[b]&&a!=b){
            printf("对于N矩阵,输入数据行列有相同\n程序自动终止,请修改后重新运行\n");
            return 0;
        }
        }
        }
    
    
    //初始化广义数组
    TSMatrix M,N,Q;
    M.m=m_rownum;
    M.n=m_colnum;
    M.len=m_len;
    N.m=n_rownum;
    N.n=n_colnum;
    N.len=n_len;
    Q.m=0;
    Q.n=0;
    Q.len=0;

    //初始化三元组
    for(int i=0;i<M.len;i++){
        M.data[i].i=m_row[i];
        M.data[i].j=m_col[i];
        M.data[i].e=m_value[i];
    }
    for(int i=0;i<N.len;i++){
        N.data[i].i=n_row[i];
        N.data[i].j=n_col[i];
        N.data[i].e=n_value[i];
    }
    printf(">>初始化成功\n>>矩阵相加中...\n");
    //打印矩阵
    bool flag=false;
    flag=add_matrix(&M,&N,&Q);
    
    if(flag==1){
    printf("函数返回true\nM矩阵长宽为%d*%d  |  N矩阵的长宽为%d*%d  |  Q矩阵的长宽为%d*%d\n程序按行打印,打印时以M的行数为标准\n",M.m,M.n,N.m,N.n,Q.m,Q.n);
    PrintfMatrix(&M,&N,&Q);
    if(Q.m==0||Q.n==0){
        printf("\n##您似乎没有对Q矩阵的长宽赋值,因而Q显示空白\n");
    }
    if(Q.len==0){
        printf("##请确认Q矩阵的len赋值是否完成(若两个矩阵相加确实全为0请忽略)\n");
    }

    }
    else{
        printf("函数返回false,矩阵不能相加\n这两个矩阵分别是\n");

        PrintfMatrix2(&M,'M');
        printf("M矩阵的长宽为%d*%d\n\n",M.m,M.n);
        PrintfMatrix2(&N,'N');
        printf("N矩阵的长宽为%d*%d\n\n",N.m,N.n);
    }
    printf("\n\n本程序仅输出结果,不对结果进行正误判断\n---测试完成---\n");
    
    return 0;
}

若不对main函数内置的测试样例进行修改,那么正确的输出结果为

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨慎谦虚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值