Матрица / массив сортировки задач: ошибки индексации и значений - PullRequest
0 голосов
/ 01 ноября 2019

Я пишу программу на C, которая:

  1. принимает int k (положительное целое число)
  2. Позволяет пользователю вводить ak * k matrix a[k][k]
  3. Запрос пользователя на дальнейшие действия
  4. Выполнение выбранной функции

В этом случае у меня возникают проблемы только с моей sort() функцией, которая вызывается, когда пользователь выбираетp. Она сортирует матрицу в порядке возрастания и сохраняет ее в файле s.txt.

Я пытаюсь вот что:

  1. Превратить матрицу x[k][k] в массив arr[k*k]
  2. Использовать восходящую сортировку пузырьков в массиве
  3. Записать его в s.txt в качестве 2D-матрицы.

Полный код:

#include <stdio.h>
#include <stdbool.h>

// Declaring variables

static int k;
static int *ptr;

// Declaring functions

void sum(int x[k][k]);
void prime(int x[k][k]);
void sort(int x[k][k]);
void r(int x[k][k]);

bool isprime(int *x);
bool sorted(int x[]);

// The main function

int main()
{
    char c = ' ';
    printf("Enter a value for k: ");
    scanf("%d", &k);
    int a[k][k];
    int arr[k*k];
    int t = 0;

    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            printf("i[%d][%d] : ", i, j);
            scanf("%d", &a[i][j]);
        }
    }

    printf("What do you wanna do with that?\n[e|a|p|s|r]\n");
    scanf(" %c", &c);

    switch (c)
    {
        case 'e':
        // do nothing
            break;

        case 'a':
        // sum all
            printf("Doing 'a'...\n");
            sum(a);
            break;

        case 'p': 
        // sum primes
            printf("Doing 'p'...\n");
            prime(a);
            break;

        case 's': 
        // sort ascending and print
            printf("Doing 's'...\n");
            sort(a);
            break;

        case 'r':
        // read from file and multiply
            printf("Doing 'r'...\n");
            r(a);
            for(int i = 0; i < k; i++)
            {
                for(int j = 0; j < k; j++)
                {
                    printf("%d\t", a[i][j]);
                }
                printf("\n");
            }
            break;

        default: 
            printf("You got defaulted! Did you do something wrong?\n");
            break;
    }

    return 0;
}

// Defining the functions

void sum(int x[k][k])
{
    int sum = 0;
    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            sum += x[i][j];
        }
    }
    FILE *fp;
    fp = fopen("a.txt", "w");
    fprintf(fp, "%d\n", sum);
    fclose(fp);
}

void prime(int x[k][k])
{
    int sum = 0;
    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            if(isprime(&x[i][j]))
            {
                sum += x[i][j];
            }
        }
    }
    FILE *fp;
    fp = fopen("p.txt", "w");
    fprintf(fp, "%d\n", sum);
    fclose(fp);
}

void sort(int x[k][k])
{
    int tmp;

    int arr[k*k];

    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            printf("x[%d][%d] : %d\n", i, j, x[i][j]);
            arr[(i*k)+j] = x[i][j];
            printf("arr[%d][%d] : %d\n", i, j, arr[(i*k)+j]);
        }
    }

    printf("\nStill debugging...\n\n");

    // sorting
    while(!sorted(arr))
    {
        for(int l = 0; l < k*k; l++)
        {
            if(arr[l] > arr[l+1])
            {
                printf("arr[%d] : %d\n", l, arr[l]);
                printf("arr[%d+1] : %d\n", l, arr[l+1]);
                tmp = arr[l+1];
                arr[l+1] = arr[l];
                arr[l] = tmp;
            }
        }
    }

    FILE *fp;
    fp = fopen("s.txt", "w");

    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            fprintf(fp, "%d\t", arr[i]);
        }
        fprintf(fp, "\n");
    }

    fclose(fp);
}

void r(int x[k][k])
{
    int mul;
    FILE *fp;
    fp = fopen("r.txt", "r");
    fscanf(fp, "%d", &mul);
    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            x[i][j] = x[i][j] * mul;
        }
    }
}

bool isprime(int *x)
{
    if(*x == 2)
    {
        return 1;
    }
    for(int i = 2; i < *x; i++)
    {
        if(!(*x%i))
        {
            return 0;
        }
    }
    return 1;
}

bool sorted(int x[])
{
    for(int i = 0; i < k*k-1; i++)
    {
        if(x[i] > x[i+1])
        {
            return 0;
        }
    }
    return 1;
}

Просто функция sort() (обновляется, когда я пытаюсь решить эту проблему с помощью SO):


void sort(int x[k][k])
{
    int tmp;

    int arr[k*k];

    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            printf("x[%d][%d] : %d\n", i, j, x[i][j]);
            arr[(i*j)+j] = x[i][j];
            printf("arr[%d][%d] : %d\n", i, j, arr[(i*j)+j]);
        }
    }

    printf("\nStill debugging...\n\n");

    // sorting
    while(!sorted(arr))
    {
        for(int m = 0; m < k*k - 1; m++)
        {
            if(arr[m] > arr[m+1])
            {
                printf("arr[%d] : %d\n", m, arr[m]);
                printf("arr[%d+1] : %d\n", m, arr[m+1]);
                tmp = arr[m+1];
                arr[m+1] = arr[m];
                arr[m] = tmp;
            }
        }
    }

    FILE *fp;
    fp = fopen("s.txt", "w");

    for(int i = 0; i < k; i++)
    {
        for(int j = 0; j < k; j++)
        {
            fprintf(fp, "%d\t", arr[i]);
        }
        fprintf(fp, "\n");
    }

    fclose(fp);
}

Я добавил printf строк для отладки. Когда я запускаю код со следующими входами:

Enter a value for k: 3
i[0][0] : 9
i[0][1] : 8
i[0][2] : 7
i[1][0] : 6
i[1][1] : 5
i[1][2] : 4
i[2][0] : 3
i[2][1] : 2
i[2][2] : 1
What do you wanna do with that?
[e|a|p|s|r]
s

, я получил этот файл:

$ cat s.txt 
1   1   1   
2   2   2   
3   3   3

... и вот мой вывод отладки:

Doing 's'...
x[0][0] : 9
arr[0][0] : 9
x[0][1] : 8
arr[0][1] : 8
x[0][2] : 7
arr[0][2] : 7
x[1][0] : 6
arr[1][0] : 6
x[1][1] : 5
arr[1][1] : 5
x[1][2] : 4
arr[1][2] : 4
x[2][0] : 3
arr[2][0] : 3
x[2][1] : 2
arr[2][1] : 2
x[2][2] : 1
arr[2][2] : 1

Still debugging...

arr[0] : 9
arr[0+1] : 8
arr[1] : 9
arr[1+1] : 7
arr[2] : 9
arr[2+1] : 6
arr[3] : 9
arr[3+1] : 5
arr[4] : 9
arr[4+1] : 4
arr[5] : 9
arr[5+1] : 3
arr[6] : 9
arr[6+1] : 2
arr[7] : 9
arr[7+1] : 1
arr[0] : 8
arr[0+1] : 7
arr[1] : 8
arr[1+1] : 6
arr[2] : 8
arr[2+1] : 5
arr[3] : 8
arr[3+1] : 4
arr[4] : 8
arr[4+1] : 3
arr[5] : 8
arr[5+1] : 2
arr[6] : 8
arr[6+1] : 1
arr[0] : 7
arr[0+1] : 6
arr[1] : 7
arr[1+1] : 5
arr[2] : 7
arr[2+1] : 4
arr[3] : 7
arr[3+1] : 3
arr[4] : 7
arr[4+1] : 2
arr[5] : 7
arr[5+1] : 1
arr[0] : 6
arr[0+1] : 5
arr[1] : 6
arr[1+1] : 4
arr[2] : 6
arr[2+1] : 3
arr[3] : 6
arr[3+1] : 2
arr[4] : 6
arr[4+1] : 1
arr[0] : 5
arr[0+1] : 4
arr[1] : 5
arr[1+1] : 3
arr[2] : 5
arr[2+1] : 2
arr[3] : 5
arr[3+1] : 1
arr[0] : 4
arr[0+1] : 3
arr[1] : 4
arr[1+1] : 2
arr[2] : 4
arr[2+1] : 1
arr[0] : 3
arr[0+1] : 2
arr[1] : 3
arr[1+1] : 1
arr[0] : 2
arr[0+1] : 1

Я немного смущен тем, почему он дает мне 0 с, 1 с и 2 с

...