Super500000 2021-10-22 23:48 采纳率: 100%
浏览 14
已结题

蒟蒻实在看不出来哪里错了

这是一个矩阵朴素转置的代码,但是最后一个元素老是显示为0,求指示,谢谢了


```c++
#include <stdio.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define ELEMTYPE int

typedef struct {
    int i;   //行
    int j;   //列
    ELEMTYPE e; //元素
}Triple;
typedef struct {
    Triple data[MAXSIZE+1];
    int mu, nu, tu;
}TSmatrix;
void display(TSmatrix *s);
void trans(TSmatrix *s,TSmatrix *x);
int main(void)
{
    TSmatrix s,x;
    s.mu = 3;
    s.nu = 3;
    s.tu = 3;
    s.data[0].i = 3;
    s.data[0].j = 3;
    s.data[0].e = 6;
    s.data[1].i = 2;
    s.data[1].j = 3;
    s.data[1].e = 8;
    s.data[2].i = 2;
    s.data[2].j = 1;
    s.data[2].e = 4;
    display(&s);
    trans(&s,&x);
    display(&x);
    return 0;
}

void display(TSmatrix *s)
{
    for (int i = 1; i <= s->mu; i++)
    {
        for (int j = 1; j <= s->nu; j++)
        {
            int value = 0;            //用来判断是否到了指定的(i,j)位置
            for (int k = 0; k < s->tu; k++)//遍历数组中的三元表值
            {
                if (s->data[k].i == i && s->data[k].j == j) //若遍历至指定(i,j)就打印元素值
                {
                    value = 1;
                    printf("%d ", s->data[k].e);
                    break;
                }
            }
            if(value==0)  //若不为三元表中存储的值就打印0
            printf("%d ", 0);
        }
        printf("\n");
    }
}
void trans(TSmatrix *s,TSmatrix *x)
{
    int p, q, col;
    x->mu=s->nu;
    x->nu=s->mu;
    x->tu=s->tu;
    if (x->tu)
    {
        q = 1;
        for (col = 1; col <= s->nu; ++col)
            for (p = 1; p <= s->tu; ++p)
                if (s->data[p].j == col)
                {
                    x->data[q].i = s->data[p].j;
                    x->data[q].j = s->data[p].i;
                    x->data[q].e = s->data[p].e;
                    ++q;
                }
    }
    return;
}

```

  • 写回答

1条回答 默认 最新

  • Autumn0923 2021-10-23 14:17
    关注

    这个问题是你的代码逻辑有问题,

     for (col = 1; col <= s->nu; ++col)
                for (p = 1; p <= s->tu; ++p)
                    if (s->data[p].j == col)
                    {
                        x->data[q].i = s->data[p].j;
                        x->data[q].j = s->data[p].i;
                        x->data[q].e = s->data[p].e;
                        ++q;
                    }
    

    img

    你这个代码在转换的时候,你看前两个for是为了遍历你的矩阵,矩阵遍历完了之后,你写了个if (s->data[p].j == col) 这个,这个的意思是当你第p个数据的列等于你遍历的行数时,你就把他们转换
    你看你第一个数据是4,他是data[1],那就是说你遍历矩阵的时候遍历到(2,2)这个位置的时候才能发现这个数据等于你遍历的行数,这个时候你把他们一转,没问题,然后再看你第二个数据8,这个所处的位置是data[2],也就是说你遍历到(3,3)他才能换
    知道为啥你的 6 没了吗,因为他是data[0],而你的p值只能从1到3,所以只有这两个数据换了,data[0]、data[4]以及后面的数据都是遍历不到的,
    所以改进方法就是你要像你构建矩阵的时候那样,写三个循环,两个用来遍历矩阵,一个用来遍历数据域

    for (col = 1; col <= s->nu; ++col)
                for (p = 1; p <= s->tu; ++p)
                    for (int k = 0; k < s->tu; k++)
                     if (s->data[k].i == col && s->data[k].j == p) 
                    {
                        x->data[k].i = s->data[k].j;
                        x->data[k].j = s->data[k].i;
                        x->data[k].e = s->data[k].e;
                        ++q;
                    }
    

    img

    当然我这里给你提个小建议,就是你的数据在输入矩阵的时候,你就应该把他们按位放好,意思就是你的data[0],一定要是遍历数组的第一个数据,data[1],是第二个以此类推,这样你就不用每次遍历到一个位置的时候就再判断一次他是不是数据域里面的内容了,直接定义一个变量k = 0;然后每次遍历的时候判断一下data[k]的行列是不是当前行列,如果是就k++,这样不就少一个循环了吗,你想,你现在输入的这个矩阵还小,你只用遍历九遍,然后判断数据三遍,一共27遍,那今天在是一个100×100的矩阵呢,本身10000遍,然后每一遍再循环三遍,一共就是三万遍,这样这个方法不就为你节省了不少时间吗?

    以上就是我个人的观点,如果你还有什么不了解的可以继续私信我

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含