鱼C论坛

 找回密码
 立即注册
查看: 2665|回复: 10

[已解决]求助

[复制链接]
发表于 2021-11-24 16:52:19 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
int main()
{
        int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} }, i, j, b[3][3] ;
        int change(int x[3][3],int y[3][3]);
        for (j = 0; j < 3; j++)
        {
                for (i = 0; i < 3; i++)
                        printf("%d ",change(a,b));
        }
        return 0;
}
int change(int x[][3],int y[][3] )
{
        int i, j;
        for (j = 0; j < 3; j++)
        {
                for (i = 0; i < 3; i++)
                        y[i][j] = x[j][i];
                return y[i][j];
        }
}
要将数组行列互换,为什么这个代码输出奇怪的数
最佳答案
2021-11-24 18:50:09
本帖最后由 傻眼貓咪 于 2021-11-24 18:53 编辑

代码:
  1. #include <stdio.h>

  2. /*函数:行列交换*/
  3. void exchange(int row, int col, int arr[row][col]){
  4.     for(size_t i = 0; i < row; i++){
  5.         for(size_t j = i+1; j < col; j++){
  6.             arr[i][j] ^= arr[j][i];
  7.             arr[j][i] ^= arr[i][j];
  8.             arr[i][j] ^= arr[j][i];
  9.         }
  10.     }
  11. }

  12. int main()
  13. {
  14.     /*样例矩阵*/
  15.     int arr[3][3] = {
  16.         {1, 2, 3},
  17.         {4, 5, 6},
  18.         {7, 8, 9}};
  19.    
  20.     /*输出初始矩阵*/
  21.     printf("输入:\n");
  22.     for(size_t i = 0; i < 3; i++){
  23.         for(size_t j = 0; j < 3; j++) printf("%d ", arr[i][j]);
  24.         printf("\n");
  25.     }   
  26.    
  27.     /*调用函数*/
  28.     exchange(3, 3, arr);
  29.    
  30.     /*输出改变后的矩阵*/
  31.     printf("\n输出:\n");
  32.     for(size_t i = 0; i < 3; i++){
  33.         for(size_t j = 0; j < 3; j++) printf("%d ", arr[i][j]);
  34.         printf("\n");
  35.     }

  36.     return 0;
  37. }
复制代码
输出:
  1. 输入:
  2. 1 2 3
  3. 4 5 6
  4. 7 8 9

  5. 输出:
  6. 1 4 7
  7. 2 5 8
  8. 3 6 9
复制代码
注:行列交换和 90 度旋转矩阵结果完全不同
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-24 17:15:48 | 显示全部楼层
         行列互换是什么意思,矩阵左转右转 90 度?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-24 17:23:53 | 显示全部楼层
jackz007 发表于 2021-11-24 17:15
行列互换是什么意思,矩阵左转右转 90 度?

就是a[i][j]变成a[j][i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-24 17:24:37 | 显示全部楼层
jackz007 发表于 2021-11-24 17:15
行列互换是什么意思,矩阵左转右转 90 度?

a[i] [j]变成a[j] [i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-24 17:25:29 | 显示全部楼层
jackz007 发表于 2021-11-24 17:15
行列互换是什么意思,矩阵左转右转 90 度?

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-24 17:38:05 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-24 17:51 编辑
  1. #include <stdio.h>

  2. void show(int d[][3])
  3. {
  4.         int i , j                                                                               ;
  5.         for(i = 0 ; i < 3 ; i ++) {
  6.                 printf("%d" , d[i][0])                                                          ;
  7.                 for(j = 1 ; j < 3 ; j ++) printf(" , %d" , d[i][j])                             ;
  8.                 printf("\n")                                                                    ;
  9.         }
  10. }

  11. int main(void)
  12. {
  13.         int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}} , b[3][3] , c[3][3] , i , j                     ;
  14.         for(i = 0 ; i < 3 ; i ++) for(j = 0 ; j < 3 ; j ++) b[2 - j][i] = c[j][2 - i] = a[i][j] ;
  15.         show(a)                                                                                 ;
  16.         printf("\n")                                                                            ;
  17.         show(b)                                                                                 ;
  18.         printf("\n")                                                                            ;
  19.         show(c)                                                                                 ;
  20. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 1 , 2 , 3
  4. 4 , 5 , 6
  5. 7 , 8 , 9

  6. 3 , 6 , 9
  7. 2 , 5 , 8
  8. 1 , 4 , 7

  9. 7 , 4 , 1
  10. 8 , 5 , 2
  11. 9 , 6 , 3

  12. D:\0002.Exercise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-24 18:19:04 | 显示全部楼层
楼主要的函数应该是互换位置不是打印吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-24 18:50:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2021-11-24 18:53 编辑

代码:
  1. #include <stdio.h>

  2. /*函数:行列交换*/
  3. void exchange(int row, int col, int arr[row][col]){
  4.     for(size_t i = 0; i < row; i++){
  5.         for(size_t j = i+1; j < col; j++){
  6.             arr[i][j] ^= arr[j][i];
  7.             arr[j][i] ^= arr[i][j];
  8.             arr[i][j] ^= arr[j][i];
  9.         }
  10.     }
  11. }

  12. int main()
  13. {
  14.     /*样例矩阵*/
  15.     int arr[3][3] = {
  16.         {1, 2, 3},
  17.         {4, 5, 6},
  18.         {7, 8, 9}};
  19.    
  20.     /*输出初始矩阵*/
  21.     printf("输入:\n");
  22.     for(size_t i = 0; i < 3; i++){
  23.         for(size_t j = 0; j < 3; j++) printf("%d ", arr[i][j]);
  24.         printf("\n");
  25.     }   
  26.    
  27.     /*调用函数*/
  28.     exchange(3, 3, arr);
  29.    
  30.     /*输出改变后的矩阵*/
  31.     printf("\n输出:\n");
  32.     for(size_t i = 0; i < 3; i++){
  33.         for(size_t j = 0; j < 3; j++) printf("%d ", arr[i][j]);
  34.         printf("\n");
  35.     }

  36.     return 0;
  37. }
复制代码
输出:
  1. 输入:
  2. 1 2 3
  3. 4 5 6
  4. 7 8 9

  5. 输出:
  6. 1 4 7
  7. 2 5 8
  8. 3 6 9
复制代码
注:行列交换和 90 度旋转矩阵结果完全不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-24 20:58:40 | 显示全部楼层
傻眼貓咪 发表于 2021-11-24 18:50
代码:输出:注:行列交换和 90 度旋转矩阵结果完全不同

arr[i][j] ^= arr[j][i];
            arr[j][i] ^= arr[i][j];
            arr[i][j] ^= arr[j][i];
这个是什么意思啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-25 18:15:04 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-11-25 18:17 编辑
夜蚀天 发表于 2021-11-24 20:58
arr[j] ^= arr[j];
            arr[j] ^= arr[j];
            arr[j] ^= arr[j];
  1. 意思是 arr[i] 变成 arr[j],arr[j] 变成 arr[i]

  2. 一般会用变量,如:
  3. int temp;
  4. temp = arr[i];
  5. arr[i] = arr[j];
  6. arr[j] = temp;

  7. 而我的代码精简化,直接用位元运算符,直接换便可。

  8. a^a^b = b
  9. a^0 = a

  10. 举例:
  11. int a = 13, b = 5;
  12. a ^= b;
  13. b ^= a;
  14. a ^= b;
  15. // 最终会变成 a = 5, b = 13(两者交换)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-25 20:54:37 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 23:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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