Почему я не могу присвоить функцию возврата элементу матрицы? - PullRequest
0 голосов
/ 21 января 2019

Хорошо, поэтому мне нужно ввести матрицу из 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;
}

Можете ли вы сказать мне, почему он не работает?

UPDATE

Я думаю, что решил это. При проверке, является ли матричное число простым, я также добавил условие, что оно должно отличаться от 1, потому что программа будет return 0 при проверке, является ли 1 простым числом, и должно return 1, поскольку 1 на самом деле простое число.

Спасибо за все советы!

1 Ответ

0 голосов
/ 21 января 2019

Думаю, я нашел проблему в вашем коде. Проблема заключается в вашей функции nearPrime. Он будет работать для большинства чисел, которые он принимает в качестве аргумента, но это не тот случай, если вы введете число 1 для этой функции. Подумайте, что произойдет, если это займет число 1.

Тогда ваша переменная lp = (1 - 1) = 0. Когда вы затем введете ее в простую функцию, она не вернет 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 (и, конечно, не возвращайте матрицу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...