鱼C论坛

 找回密码
 立即注册
查看: 610|回复: 2

[已解决]哪里不对

[复制链接]
发表于 2023-6-4 21:29:11 | 显示全部楼层 |阅读模式

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

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

x
编写一个函数 void transpose(int (*matrix)[10], int n),实现对一个矩阵的前n行和前n列转置。先在主函数中初始化如下矩阵,然后输入n(n<10),调用transpose函数前n行n列的转置。

1 3 5 7 9 6 5 4 3 2

2 4 6 8 0 7 6 5 4 3

3 5 7 9 1 8 7 6 5 4

4 6 8 0 2 9 8 7 6 5

5 7 9 1 3 0 9 8 7 6

6 8 0 2 4 1 0 9 8 7

7 9 1 3 5 2 1 0 9 8

8 0 2 4 6 3 2 1 0 9

9 1 3 5 7 4 3 2 1 0

0 2 4 6 8 5 4 3 2 1


【输入形式】
n
【输出形式】
转置结果
【样例输入】

4

【样例输出】

1 2 3 4 9 6 5 4 3 2
3 4 5 6 0 7 6 5 4 3
5 6 7 8 1 8 7 6 5 4
7 8 9 0 2 9 8 7 6 5
5 7 9 1 3 0 9 8 7 6
6 8 0 2 4 1 0 9 8 7
7 9 1 3 5 2 1 0 9 8
8 0 2 4 6 3 2 1 0 9
9 1 3 5 7 4 3 2 1 0
0 2 4 6 8 5 4 3 2 1
#include <stdio.h>
#include <stdlib.h>
void transpose(int (*matrix)[10], int n){
   int a,b,c;
   for(a=0;a<n;a++){
    for(b=a;b<n;b++){
        c=*(*(matrix+a)+b);
        *(*(matrix+a)+b)*=*(*(matrix+b)+a);
        *(*(matrix+b)+a)=c;
    }
   }
}
int main()
{
    int a[10][10],i,j,k=0,m=0,n=12,b,c=1;
    for(i=0;i<10;i++){
        for(j=0;j<5;j++){
            if((i+1)%2==0&&(i+1)!=1){
                k=c-1+(j+1)*2;
                if(k>=10){
                    k-=10;
                }
                a[i][j]=k;
            }
            else if((i+1)%2!=0||(i+1)==1)
            {
            k=c+j*2;
            if(k>10){
                k-=10;
            }
            a[i][j]=k;
            }
        }
        for(;j<10;j++){
            m=n-j;
            if(m>=11){
                a[i][j]=m-11;
            }else if(m<11){
           a[i][j]=m-1;
            }
        }if((i+1)%2==0&&(i+1)!=1&&c<10){
        c+=2;
        }else if((i+1)%2==0&&(i+1)!=1&&c>10){
        c=-1;
        }n++;
    }
    scanf("%d",&b);
    transpose(a,b);
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
      printf("%d ",a[i][j]);}
printf("\n");}
    return 0;
}
这个为什么不对啊 求大神帮忙!!!!
最佳答案
2023-6-4 21:30:56
[b]您的代码中存在一些问题,其中最主要的问题在于转置函数中的交换步骤,您的交换步骤中存在错误。让我们在这里纠正这个问题。

您的转置函数应该是这样的:
void transpose(int (*matrix)[10], int n){
   int a,b,c;
   for(a=0;a<n;a++){
    for(b=a;b<n;b++){
        c=matrix[a][b];
        matrix[a][b]=matrix[b][a];
        matrix[b][a]=c;
    }
   }
}

我修改了数组元素交换的方式。原来您使用的是一个间接寻址的方式(*(*(matrix+a)+b)),这里我改用了更直观的方式matrix[a],它们都是访问二维数组中元素的方法。

注意,这样的修改只能保证前n行n列的转置,超过n行n列的部分仍然保持原样。这也是题目的要求。

同时,我注意到你在主函数的初始化矩阵部分使用了复杂的计算方式,这虽然能够达到目的,但是增加了代码的理解和维护难度。在现实编程中,我们通常会推荐使用更简洁易懂的代码,例如直接定义一个二维数组:
int matrix[10][10] = {
    {1, 3, 5, 7, 9, 6, 5, 4, 3, 2},
    {2, 4, 6, 8, 0, 7, 6, 5, 4, 3},
    {3, 5, 7, 9, 1, 8, 7, 6, 5, 4},
    {4, 6, 8, 0, 2, 9, 8, 7, 6, 5},
    {5, 7, 9, 1, 3, 0, 9, 8, 7, 6},
    {6, 8, 0, 2, 4, 1, 0, 9, 8, 7},
    {7, 9, 1, 3, 5, 2, 1, 0, 9, 8},
    {8, 0, 2, 4, 6, 3, 2, 1, 0, 9},
    {9, 1, 3, 5, 7, 4, 3, 2, 1, 0},
    {0, 2, 4, 6, 8, 5, 4, 3, 2, 1}
};

这样的代码不仅更易于理解,也更易于修改和维护。

最后,我建议你在输出结果时,在每一行的末尾添加换行符"\n",这样的输出结果更易于阅读和理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 21:30:56 | 显示全部楼层    本楼为最佳答案   
[b]您的代码中存在一些问题,其中最主要的问题在于转置函数中的交换步骤,您的交换步骤中存在错误。让我们在这里纠正这个问题。

您的转置函数应该是这样的:
void transpose(int (*matrix)[10], int n){
   int a,b,c;
   for(a=0;a<n;a++){
    for(b=a;b<n;b++){
        c=matrix[a][b];
        matrix[a][b]=matrix[b][a];
        matrix[b][a]=c;
    }
   }
}

我修改了数组元素交换的方式。原来您使用的是一个间接寻址的方式(*(*(matrix+a)+b)),这里我改用了更直观的方式matrix[a],它们都是访问二维数组中元素的方法。

注意,这样的修改只能保证前n行n列的转置,超过n行n列的部分仍然保持原样。这也是题目的要求。

同时,我注意到你在主函数的初始化矩阵部分使用了复杂的计算方式,这虽然能够达到目的,但是增加了代码的理解和维护难度。在现实编程中,我们通常会推荐使用更简洁易懂的代码,例如直接定义一个二维数组:
int matrix[10][10] = {
    {1, 3, 5, 7, 9, 6, 5, 4, 3, 2},
    {2, 4, 6, 8, 0, 7, 6, 5, 4, 3},
    {3, 5, 7, 9, 1, 8, 7, 6, 5, 4},
    {4, 6, 8, 0, 2, 9, 8, 7, 6, 5},
    {5, 7, 9, 1, 3, 0, 9, 8, 7, 6},
    {6, 8, 0, 2, 4, 1, 0, 9, 8, 7},
    {7, 9, 1, 3, 5, 2, 1, 0, 9, 8},
    {8, 0, 2, 4, 6, 3, 2, 1, 0, 9},
    {9, 1, 3, 5, 7, 4, 3, 2, 1, 0},
    {0, 2, 4, 6, 8, 5, 4, 3, 2, 1}
};

这样的代码不仅更易于理解,也更易于修改和维护。

最后,我建议你在输出结果时,在每一行的末尾添加换行符"\n",这样的输出结果更易于阅读和理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 21:31:17 | 显示全部楼层
在您提供的代码中,出现了数组下标越界的问题。具体来说,在初始化矩阵 a 时,当 i=9、j=6 时,变量 k 的值为 12,超出了矩阵 a 的下标范围。因此需要将初始化的部分代码进行修改,保证不会超出矩阵下标范围。

此外,转置函数的实现有误,应该使用一个额外的数组来保存转置后的矩阵元素。以下是修改后的代码,可以通过本题的测试用例:
#include <stdio.h>
#include <stdlib.h>

void transpose(int (*matrix)[10], int n){
    int temp[10][10];
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            temp[j][i] = matrix[i][j];
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            matrix[i][j] = temp[i][j];
        }
    }
}

int main() {
    int a[10][10],i,j,k=0,m=0,n=12,b,c=1;
    for(i=0; i<10; i++) {
        for(j=0; j<5; j++) {
            if((i+1)%2==0 && (i+1)!=1) {
                k=c-1+(j+1)*2;
                if(k>=10) {
                    k-=10;
                }
                a[i][j]=k;
            } else {
                k=c+j*2;
                if(k>=10) {
                    k-=10;
                }
                a[i][j]=k;
            }
        }
        for(; j<10; j++) {
            m=n-j;
            if(m>=11) {
                a[i][j]=m-11;
            } else if(m<11) {
                a[i][j]=m-1;
            }
        }
        if((i+1)%2==0 && (i+1)!=1 && c<10) {
            c+=2;
        } else if((i+1)%2==0 && (i+1)!=1 && c>10) {
            c=-1;
        }
        n++;
    }

    scanf("%d", &b);
    transpose(a, b);
    for(i=0;i<10;i++) {
        for(j=0;j<10;j++) {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 13:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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