RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1414829
Accepted
qqueeez
qqueeez
Asked:2022-07-29 18:06:37 +0000 UTC2022-07-29 18:06:37 +0000 UTC 2022-07-29 18:06:37 +0000 UTC

指向二维数组的指针

  • 772

任务是:开发一个函数 int is_tridiagonal (int *mat,int n); mat 是一个 nxn 方阵。如果 mat 是三对角矩阵,该函数应返回 1,否则返回 0。

三对角矩阵(除了“三个主要”对角线之外的所有地方都是 0)

使用基本方法完成任务,使用循环遍历第 i 行,第 j 列的元素

但是您需要以某种方式不使用这些 i、j 并使用指针解决问题

一般来说,值得将我的周期转换成这样的东西,我不明白该怎么做

诠释* p; ... for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)

    #include <stdio.h>

#define cols 6

void user_matrix(int matrix[cols][cols]);
void matrix_outp(int matrix[cols][cols]);
int is_tridiagonal(int matrix[cols][cols]);

int main() {
    int matrix[cols][cols];


    user_matrix(matrix);
    matrix_outp(matrix);
    printf("%d", is_tridiagonal(matrix));
}


void user_matrix(int matrix[cols][cols]) {
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Enter matrix[%d][%d]: ", i + 1, j + 1);
            scanf_s("%d", &matrix[i][j]);
        }
        printf("\n");
    }
}

void matrix_outp(int matrix[cols][cols])
{
    for (int i = 0; i < cols; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%6d", matrix[i][j]);
        }
        printf("\n");
    }
}
// перебор элементов матрицы и проверка на 0
int is_tridiagonal(int matrix[cols][cols]) {

int schet = 0;

// выше главной и следующей после нее
for (int i = 0; i < cols - 1; i++) 
{
    for (int j = i + 2; j < cols; j++) {
        if (matrix[i][j] != 0)
            schet++;
    }

}
// ниже главной и следующей после нее
for (int i = 1; i < cols; i++)
{
    for (int j = 0; j < i - 1; j++)
    {
        if (matrix[i][j] != 0)
            schet++;
    }
}
// 3 главные по центру
for (int i = 0; i < cols; i++) {
    for (int j = 0; j < cols; j++) {
        if (i == j || i == (j - 1) || i == (j + 1)) {
            if (matrix[i][j] == 0) {
                schet++;
            }

        }

    }
}


            

if (schet == 0)
    printf("Trexdiagonal");
else
    printf("NETrexdiagonal");

}

c указатели
  • 2 2 个回答
  • 78 Views

2 个回答

  • Voted
  1. Best Answer
    Be3y4uu_K0T
    2022-07-29T20:34:36Z2022-07-29T20:34:36Z

    我们可以将矩阵转换为点int* pointer = &matrix[0][0];并像一维数组一样工作。

    如果我们有一个 5x5 矩阵,N=5:

    |1 1 0 0 0|
    |1 1 1 0 0|
    |0 1 1 1 0|
    |0 0 1 1 1|
    |0 0 0 1 1|
    

    那是一个一维数组:

    |1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1|
    

    如果我们分析其他大小的矩阵,我们会注意到一个模式:

    2xA, 3xB, 3xA, 3xB, 3xA, 3xB, 3xA, 3xB, 2xA,其中 A 为 1,B 为 0,2xA 是连续的两个 A,依此类推。

    我们可以注意到 A 重复了 3 次,除了开头和结尾,因为有三个对角线。还有 3 次 B,考虑其他示例后,我们得到 - N-2 次连续(在第一行和最后一行)。

    因此,我们知道从哪里开始 - 从 3 个元素(2 个索引)开始,要采取多少步 - 检查 N-2 个元素,它们是 0,并跳过 3 个元素(总共 N + 1 个),我们也知道从哪里开始停止——这取决于倒数第二个元素&matrix[N-1][N-2]!

    编辑:

    @DmitryK注意到我没有正确构建条件,这仅适用于 N=5,并且我没有立即将指向矩阵的指针传递给函数。

    我已经更改了我的代码。现在该函数立即获取一个指向矩阵的指针,但不再使用任何其他指针。我检查了 4,5,6 个方阵,“3xA”从索引开始size,然后递增size+1.

    这个想法是我们现在如何遍历扩展数组,++i只需遍历一个单元格,如果满足条件,则另外跳过三个对角线 (3xA) i += 3。

    (++i + 1)%(size+1)?:(i += 3)-- 在(++i + 1)我增加 i 以转到下一个单元格。然后我将它增加 1,以便索引变得尽可能多size+1。然后是诀窍?:,即 如果增加1的单元格个数是 的倍数size+1,则除法的余数为0。条件中的0为假,所以后面的部分将在三元运算符中执行:,如果有另一个数字other比零,即 是的,那么之后?和之前的部分将被执行:,但是那里什么都没有,所以那里什么也不会发生。

    在循环体中,我们简单地获取元素并检查它是否不为零。

    是的,代码没有以您想要的方式使用指针。为此我深表歉意。

    编码:

    #include <stdio.h>
    #include <stdbool.h>
    
    #define N 5
    
    /* Old answer, works only for N = 5
    bool is_tridiagonal(int size, int matrix[size][size])
    {
        for (int* pointer = &matrix[0][2]; pointer < &matrix[size-1][size-2]; pointer += size + 1)
            if (pointer[0] || pointer[1] || pointer[2])
                return false;
        return true;
    }
    */
    
    bool is_tridiagonal(int size, int* matrix)
    {
        for (int i = 2; i < size*size-2; (++i + 1)%(size + 1) ?: (i += 3))
            if (matrix[i])
                return false;
        return true;
    }
    
    int main(void)
    {
        int matrix[N][N] = {
            {1,  2,  0,  0,  0},
            {3,  4,  5,  0,  0},
            {0,  6,  7,  8,  0},
            {0,  0,  9, 10, 11},
            {0,  0,  0, 12, 13},
        };
        printf("%d", is_tridiagonal(N, (int*) matrix));
        return 0;
    }
    

    PS如果我的逻辑错误,请纠正我!

    • 0
  2. DmitryK
    2022-07-31T17:27:49Z2022-07-31T17:27:49Z

    带有指针传递、矩阵复制位置的代码:

    bool is_tridiagonal(int size, int* matrix)
     {
        for (int* pointer = matrix + 2; pointer < (matrix + size*size-3); pointer += size + 1)
        {   // вот здесь должен быть цикл до size-2 - иначе при размере матрицы отличным от 5 - будет неправильная работа
            // сами же в описании написали - "B повторяется N-2 раза"
            if (*pointer != 0 || *(pointer + 1) != 0 || *(pointer + 2) != 0) // вот это работает только для N==5
                return false;
        }
        return true;
    }
    

    此外,您只检查对角线上是否有零。但是您没有检查对角线中是否没有零。
    还有一点,循环条件中的比较-您需要计算要比较的内容,以免出现错误,因为 有一个非标准的增量pointer += size + 1
    。而且你还需要检查矩阵的大小是不是\u200b\u200b大于2

    • 0

相关问题

  • free 出于某种原因不会从内存中删除数组

  • 请帮助代码

  • 为什么 masm 对字符串或文本文字太长发誓,为什么在结构中设置 db 或 dw?

  • 如何将数字拆分为位并将其写入 C 中的数组?

  • 如何以给定的角度移动物体?

  • 解决“子集和问题”的时效算法

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5