Я пишу программу на C, которая:
- принимает
int k
(положительное целое число) - Позволяет пользователю вводить ak * k matrix
a[k][k]
- Запрос пользователя на дальнейшие действия
- Выполнение выбранной функции
В этом случае у меня возникают проблемы только с моей sort()
функцией, которая вызывается, когда пользователь выбираетp
. Она сортирует матрицу в порядке возрастания и сохраняет ее в файле s.txt
.
Я пытаюсь вот что:
- Превратить матрицу
x[k][k]
в массив arr[k*k]
- Использовать восходящую сортировку пузырьков в массиве
- Записать его в
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
с