忠诚的火恐龙 2022-06-29 00:54 采纳率: 0%
浏览 29
已结题

稀疏矩阵计算器,使用switch case语句出现问题,不知道如何解决。

在做稀疏矩阵计算器时,直接算两个矩阵的减法没有出现问题,但是尝试用switch case 语句时,稀疏矩阵减法运算出现问题
完整代码
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include <time.h>  //之前计算时间用到的,原函数删掉了
#define false 0
#define true 1
# define max 100

typedef struct {
int value;    //value为具体数值 
int row,col;  //row为行,col为列 
}Array;

typedef struct {
Array data[max+1];    
int rows,cols,nums;   //nums为非零元素个数 
}Arrays;

//创建稀疏矩阵 

int InitArray(Arrays *L,int rows,int cols,int nums){
int i,j;
   L->nums=nums;
L->cols=cols;
L->rows=rows;
assert(L->nums<max);
printf("-------------\n");
printf("请依次输入非零元素的行数,列数,值:\n");
for (int i = 1; i <= L->nums; i++) {
    scanf("%d %d %d", &L->data[i].row, &L->data[i].col, &L->data[i].value);
    }
    printf("创建成功!\n");
    return true;
  }

//遍历输出稀疏矩阵  三元组形式

void bianli1(Arrays *L) {
printf("-------------三元组形式形式遍历输出:\n");
for (int i = 1; i <= L->rows; i++) {
    printf("%d行%d列%d \n",L->data[i].row,L->data[i].col,L->data[i].value);
  }
}

//遍历输出稀疏矩阵  矩阵形式

void bianli2(Arrays *L) {
  int flag = 1;   //flag代表 
  for (int i = 1; i <= L->rows; i++) {
    for (int j = 1; j <=L->cols; j++) {
        if (L->data[flag].value!=0&&L->data[flag].row==i&&L->data[flag].col==j) {
            printf(" %d", L->data[flag].value);
            flag++;
        }
        else {
            printf(" 0");
        }
    }
    printf("\n");
  }
}

//矩阵普通转置(按列)

int Transform(Arrays a,Arrays *b){      //a为原矩阵,b为转置后的矩阵
b->rows=a.cols;
b->nums=a.nums;
b->cols=a.rows;
if(b->nums>0){
    int j=1;
    for(int k=1;k<=a.cols;k++){
        for(int i=1;i<=a.nums;i++){    //进入非零元素循环 
            if(a.data[i].col==k){        //如果在每一个列中有非零元素,则进行转置操作 
                b->data[j].row=a.data[i].col;      //j代表表B的非零元素个数值,它从1开始。 
                b->data[j].col=a.data[i].row;
                b->data[j].value=a.data[i].value;
                j++;
                if(j>a.nums) return false;
                }
            } 
        }
    }
} 


//矩阵加法

int ADD(Arrays a,Arrays b,Arrays *c){
int k=1,i,j;    //i为a的元素数目,j为b的元素数目,k为c的元素数目 

//同行同列的才能相加

    if(a.cols!=b.cols||a.rows!=b.rows){
    printf("矩阵A和B的行列不同,无法计算!!!");
    return false;
}

c->cols=a.cols;     //赋值总行数,总列数 
c->rows=a.rows;

//进行遍历赋值 
for(i=1,j=1;i<=a.nums&&j<=b.nums;){       
   //B的行号大于A直接将A中元素加入C矩阵 
    if(a.data[i].row<b.data[j].row){
        c->data[k].col=a.data[i].col;
        c->data[k].row=a.data[i].row;
        c->data[k].value=a.data[i].value;
        k++;       //C元素向后增一位 
        i++;       //a赋值则a元素向后增一位,如果时b则b元素向后增一位 
    }

    //B的行号小于A直接将B中元素加入C矩阵
    else if(a.data[i].row>b.data[j].row){
        c->data[k].col=b.data[j].col;
        c->data[k].row=b.data[j].row;
        c->data[k].value=b.data[j].value;
        k++;
        j++; 
    }else{  //行号相同 
        
        //B的列号小于A直接将B中元素加入C矩阵
        if(a.data[i].col>b.data[j].col) {
        c->data[k].col=b.data[j].col;
        c->data[k].row=b.data[j].row;
        c->data[k].value=b.data[j].value;
        k++;
        j++;
        }
        
        //B的列号大于A直接将A中元素加入C矩
        else if(a.data[i].col<b.data[j].col){
        c->data[k].col=a.data[i].col;
        c->data[k].row=a.data[i].row;
        c->data[k].value=a.data[i].value;
        k++;
        i++;
        }
        //相等 
        else {
             
            c->data[k].col=a.data[i].col;
            c->data[k].row=a.data[i].row;
            c->data[k].value=a.data[i].value+b.data[j].value;
            k++;
            i++;
            j++;
        }
    }
}
while(i<=a.nums){ //B取完A未取完

        //将A中所剩元素依次加入到C中
    c->data[k].col=a.data[i].col;
    c->data[k].row=a.data[i].row;
    c->data[k].value=a.data[i].value;
    k++;
    i++;
}   
while(j<=b.nums){  //A取完B未取完
        
        //将A中所剩元素依次加入到C中
    c->data[k].col=b.data[j].col;
    c->data[k].row=b.data[j].row;
    c->data[k].value=b.data[j].value;
    k++;
    j++;
    }
  }

//矩阵减法

int reduce(Arrays a,Arrays b,Arrays *c){   //调用加法操作,在b矩阵基础上乘 -1 在加 a矩阵 
for(int i=1;i<=b.nums;i++){
    b.data[i].value=b.data[i].value*-1;
    }
ADD(a,b,c);
 } 

//矩阵乘法

int multipe(Arrays a,Arrays b,Arrays *c){
int m=1,n=1,k=1;      //m为a的元素数目,n为b的元素数目,k为c的元素数目 
if(a.cols!=b.rows||a.rows!=b.cols){
    printf("矩阵A和B之间无法做乘法!!!"); 
    return false;
    }
c->cols=a.cols;
c->rows=a.rows;
while(m<=a.nums&&n<=b.nums){
    if(a.data[m].col==b.data[n].col&&a.data[m].row==b.data[n].row){
        c->data[k].col=a.data[m].col;
        c->data[k].row=a.data[m].row;
        c->data[k].value=a.data[m].value*b.data[n].value;
    }
    m++;n++;k++;
    }
}

void showMenu()
{
printf("___________________________________________\n");
printf("         欢迎使用稀疏矩阵运算器\n");
printf("\t    【1】稀疏矩阵加法\n");
printf("\t    【2】稀疏矩阵减法\n");
printf("\t    【3】稀疏矩阵乘法\n");
printf("\t    【4】稀疏矩阵转置\n");
printf("\t    【5】退出系统\n");
printf("___________________________________________\n");
return;
}

int main(){
Arrays s;
Arrays s1;
Arrays s2;
Arrays s3;
Arrays s4;
Arrays s5;
Arrays s6;
int choice; 
int row, col, num;
printf("请依次输入稀疏矩阵A的行数,列数,非零元个数(用空格隔开):\n");
scanf("%d %d %d", &row, &col, &num);
InitArray(&s,row,col,num);
bianli2(&s);
printf("请依次输入稀疏矩阵B的行数,列数,非零元个数(用空格隔开):\n");
scanf("%d %d %d", &row, &col, &num);
InitArray(&s1,row,col,num);
bianli2(&s1);
reduce(s,s1,&s3);
bianli2(&s3);
//    while(true)
//    {
//        showMenu();
//        printf("请输入您的选择:");
//        scanf("%d",&choice);
//        switch(choice)
//        {
//            case 1:
//                    ADD(s,s1,&s2);
//                    bianli2(&s2);
//                    break;
//            case 2: 
//                    reduce(s,s1,&s3);
//                    bianli2(&s3);
//                    break;
//            case 3:
//                    multipe(s,s1,&s4);
//                    bianli2(&s4);
//                    break;
//            case 4: 
//                    Transform(s,&s5);
//                    bianli2(&s5);
//                    printf("\n");
//                    Transform(s1,&s6);
//                    bianli2(&s6);
//                    break;
//            case 5: exit(0);
//            default:
//                    return 0;
//        printf("\n");
//    }

}
尝试直接计算时

img

尝试使用switch case 语句时

img

没有任何结果,前面全是空

img

当我把矩阵加法中
if(a.cols!=b.cols||a.rows!=b.rows){
    printf("矩阵A和B的行列不同,无法计算!!!");
    return false;
}

return false;删除时

img

我想要达到的结果,是和直接计算的接果相同,没有全是空,也不会出现有A矩阵的数字。
  • 写回答

2条回答 默认 最新

  • 「已注销」 2022-06-29 08:35
    关注

    有没有报错信息

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月13日
  • 修改了问题 6月29日
  • 创建了问题 6月29日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现