鱼C论坛

 找回密码
 立即注册
查看: 1248|回复: 5

[已解决]稀疏矩阵转化成转置矩阵错误

[复制链接]
发表于 2020-10-21 23:13:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
using namespace std;
#define m 100
typedef struct element
{
        int val;
        int row,col;
}elem;
elem b[m],c[m];
void create(int row,int col,int &i){
        int p,q,a;
        i = 0;
        printf("请输入稀疏矩阵:\n");
        for(p = 0;p<row;p++)
                for(q =0;q<col;q++){
                        scanf("%d",&a);
                        if(a !=0){
                                b[i].row = p;
                                b[i].col = q;
                                b[i].val = a;
                                i++;
                        }
                }
}
void print(elem a[],int i,int j){
        int k = 0;
        for(int p = 0;p<i;p++){
                for(int q =0;q<j;q++){
                        if(a[k].row == p&&a[k].col == q){
                                printf("%d",a[k].val);
                                k++;
                        }
                        else printf("0");
                }
                printf("\n");
        }
}
void transpose(elem b[],elem c[],int n,int t)
{
        int i,j,k;
        int *num = new int[n],*pot = new int [n];
        for(j = 0;j<n;j++)num[j] = 0;
        for(i = 0;i<t;i++)num[b[i].col]++;
        for(pot[0] = 0,j = 1;j<n;j++)pot[j] = pot[j-1]*num[j-1];
        for(i = 0;i<t;i++)
        {
                j = b[i].col;
                k = pot[j];
                c[k].row = j,c[k].col = b[i].row,c[k].val = b[i].val;
                pot[j]++;
        }
}
void main(){
        int ro,co,a;
        printf("请输入稀疏矩阵的行和列数:");
        scanf("%d%d",&ro,&co);
        create(ro,co,a);
        transpose(b,c,co,a);
        printf("转置矩阵:\n");
        print(c,co,ro);
}
我用的是C++,怎么改?
最佳答案
2020-10-22 08:41:33
//程序逻辑一时半会难以理顺,改了一下语法错误。
#include<iostream>
using namespace std;
#define m 100
typedef struct element
{
        int val;
        int row,col;
}elem;

elem b[m],c[m];

void create(int row,int col,int &i){
        int p,q,a;
        i = 0;
        printf("请输入稀疏矩阵:\n");
        for(p = 0;p<row;p++)
                for(q =0;q<col;q++)
                {
                        scanf("%d",&a);
                        if(a !=0)
                        {
                                //b是个全局数组,必须以数组下标的方式访问
                                b[i].row = p;
                                b[i].col = q;
                                b[i].val = a;
                                i++;
                        }
                }
}
void print(elem a[],int i,int j){
        int k = 0;
        for(int p = 0;p<i;p++){
                for(int q =0;q<j;q++){
                        if(a[k].row == p&&a[k].col == q){
                                printf("%d",a[k].val);
                                k++;
                        }
                        else printf("0");
                }
                printf("\n");
        }
}
void transpose(elem b[],elem c[],int n,int t)
{
        int i,j,k;
        int *num = new int[n],*pot = new int [n];

        for(j = 0;j<n;j++)num[j] = 0;
        //同样的错误
        for(i = 0;i<t;i++)num[b[i].col]++;

        for(pot[0] = 0,j = 1;j<n;j++)        pot[j] = pot[j-1]*num[j-1];

        for(i = 0;i<t;i++)
        {
                //同样的错误
                j = b[i].col;
                k = pot[j];
                c[k].row = j,c[k].col = b[i].row,c[k].val = b[i].val;
                pot[j]++;
        }
}

void main()
{
        int ro,co,a;
        printf("请输入稀疏矩阵的行和列数:");
        scanf("%d%d",&ro,&co);
        create(ro,co,a);
        transpose(b,c,co,a);
        printf("转置矩阵:\n");
        print(c,co,ro);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-22 08:41:33 | 显示全部楼层    本楼为最佳答案   
//程序逻辑一时半会难以理顺,改了一下语法错误。
#include<iostream>
using namespace std;
#define m 100
typedef struct element
{
        int val;
        int row,col;
}elem;

elem b[m],c[m];

void create(int row,int col,int &i){
        int p,q,a;
        i = 0;
        printf("请输入稀疏矩阵:\n");
        for(p = 0;p<row;p++)
                for(q =0;q<col;q++)
                {
                        scanf("%d",&a);
                        if(a !=0)
                        {
                                //b是个全局数组,必须以数组下标的方式访问
                                b[i].row = p;
                                b[i].col = q;
                                b[i].val = a;
                                i++;
                        }
                }
}
void print(elem a[],int i,int j){
        int k = 0;
        for(int p = 0;p<i;p++){
                for(int q =0;q<j;q++){
                        if(a[k].row == p&&a[k].col == q){
                                printf("%d",a[k].val);
                                k++;
                        }
                        else printf("0");
                }
                printf("\n");
        }
}
void transpose(elem b[],elem c[],int n,int t)
{
        int i,j,k;
        int *num = new int[n],*pot = new int [n];

        for(j = 0;j<n;j++)num[j] = 0;
        //同样的错误
        for(i = 0;i<t;i++)num[b[i].col]++;

        for(pot[0] = 0,j = 1;j<n;j++)        pot[j] = pot[j-1]*num[j-1];

        for(i = 0;i<t;i++)
        {
                //同样的错误
                j = b[i].col;
                k = pot[j];
                c[k].row = j,c[k].col = b[i].row,c[k].val = b[i].val;
                pot[j]++;
        }
}

void main()
{
        int ro,co,a;
        printf("请输入稀疏矩阵的行和列数:");
        scanf("%d%d",&ro,&co);
        create(ro,co,a);
        transpose(b,c,co,a);
        printf("转置矩阵:\n");
        print(c,co,ro);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-10-22 18:52:43 | 显示全部楼层
xieglt 发表于 2020-10-22 08:41
//程序逻辑一时半会难以理顺,改了一下语法错误。

改了还是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-22 18:57:58 | 显示全部楼层

它是显示有scanf那两行错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 19:21:54 | 显示全部楼层
本帖最后由 xieglt 于 2020-10-22 19:33 编辑
卡卡西曦 发表于 2020-10-22 18:57
它是显示有scanf那两行错了


是vc20xx吗?如果是的话
scanf 错了就用 scanf_s

我用的vc6.0,没法给你测。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-22 23:59:29 | 显示全部楼层
xieglt 发表于 2020-10-22 19:21
是vc20xx吗?如果是的话
scanf 错了就用 scanf_s

已找人解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表