为什么我不能将函数返回分配给矩阵元素?

时间:2019-01-21 12:37:20

标签: c matrix

好,所以我需要输入n个元素的矩阵,并用最接近的质数替换每个复合数。我编写了一些函数来读取矩阵,显示矩阵,查找数字是否为质数,并找到与数字最接近的质数,然后它们起作用。

这是我所做的,问题是替换无法正常工作,并且出现错误:Process terminated with status -1073741510 (0 minute(s), 18 second(s))

#include <stdio.h>
#include <stdlib.h>
int n;

int readMatrix(int **matrix)
{
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("matrix[%d][%d]=", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
    return matrix;
}

void showMatrix(int **matrix)
{
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int prime(int a)
{
    int c = 0;
    for (int i=1; i<a; i++) {
        if (a % i == 0) {
            c++;
        }
    }
    if (c == 1) {
        return 1;
    } else return 0;
}

int nearPrime(int b)
{
    int lp, bp, ok = 0, p;
    lp = b - 1;
    bp = b + 1;
    while (ok != 1) {
        if (prime(lp) == 1) {
            ok = 1; break;
        }
        lp--;
    }
    ok = 0;
    while (ok != 1) {
        if (prime(bp) == 1) {
            ok = 1; break;
        }
        bp++;
    }
    if ((b-lp) < (bp-b)) {
        p = lp;
    } else p = bp;
    return p;
}

int main()
{
    int **matrix, aux;
    printf("n=");
    scanf("%d", &n);
    matrix = malloc(n*sizeof(int *));
    if (matrix == NULL) exit(1);
    for (int i=0; i<n; i++) {
        matrix[i] = malloc(n*sizeof(int));
        if (matrix[i] == NULL) exit(1);
    }
    readMatrix(matrix);
    showMatrix(matrix);
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            if (prime(matrix[i][j]) == 0 && matrix[i][j] != 1) {
                matrix[i][j] = nearPrime(matrix[i][j]);
            }
        }
    }
    showMatrix(matrix);
    for (int i=0; i<n; i++) free(matrix[i]);
    free(matrix);
    return 0;
}

您能告诉我为什么它不起作用吗?

更新

我想我解决了。在检查矩阵数是否为质数时,我还添加了一个条件,即它必须与1不同,因为程序在检查return 0是否为质数时需要1,并且需要{ {1}},因为return 1实际上是质数。

感谢所有提示!

1 个答案:

答案 0 :(得分:1)

我想我可能已经在您的代码中找到了问题。问题出在您的nearPrime函数上。它适用于作为参数输入的大多数数字,但是如果您为此函数输入数字1,则不是这种情况。考虑如果数字为1将会发生什么。

然后,您的变量lp =(1-1-1)=0。当您进一步将其输入到prime函数中时,由于其实现方式,它将不会返回1。然后,如果找不到素数,则继续减小该数,并且由于该数现在为负,因此它甚至不会在素数函数的for循环中输入,并且素数函数将始终返回0。因此,您将陷入困境while(ok!= 1)循环了很长时间,这就是您的进程终止的原因。要解决此问题,请确保在进入循环之前检查lp!= 0。由于还要检查最接近的素数,因此还需要在返回值之前检查lp是否为0。简而言之,请对您的代码进行以下更改。

int nearPrime(int b)
{
    int lp, bp, ok = 0, p;
    lp = b - 1;
    bp = b + 1;
    if (lp != 0)
    {
        while (ok != 1) {
            if (prime(lp) == 1) {
                ok = 1; break;
            }
            lp--;
        }
    }

    ok = 0;
    while (ok != 1) {
        if (prime(bp) == 1) {
            ok = 1; break;
        }
        bp++;
    }
    if (((b - lp) < (bp - b)) && lp != 0) {
        p = lp;
    }
    else p = bp;
    return p;
}

另一件事:您的readMatrix函数似乎期望返回int类型,但是您正在返回int **类型的参数矩阵。此外,在您的主代码中,您实际上没有对返回值做任何事情,因此很可能将readMatrix函数的返回类型更改为void(当然,不要返回矩阵)。