Как поменять элементы массива на C языке и интегрировать его в код? - PullRequest
0 голосов
/ 19 марта 2020

У меня проблема с изменением массивов и интеграцией их в мой код, задача:

"При заданной вещественной квадратной матрице порядка n. Найти наименьшее из значений элементов расположен в затененной части матрицы и поменять их местами.

enter image description here "

Я выяснил первую половину кода, но я не могу понять это с вторая часть, это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

#define N 5

int main ()
{
    int a[N][N], min, i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            a[i][j] = rand () % 10;
    }
    printf ("n\n The generated matrix has the form");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf ("%d  ", a[i][j]);
        printf ("\n");
    }
    min = a[0][N - 1];
    for (i = 0; i < N; i++) {
        for (j = N / 2; j < N; j++)
            if ((j + i) > N && (i <= j) && (min > a[i][j]))
                min = a[i][j];
    }
    printf ("n\n Minimum element in the shaded area");
    printf ("\n\n min_element=%d ", min);
    getch ();
}

1 Ответ

1 голос
/ 19 марта 2020

Ваш лог c немного запутался. Вы должны заполнить генератор случайных чисел, позвонив srand() перед вызовом rand(), например,

#include <time.h>
...
int main (void) {

    int a[N][N], min = INT_MAX, i, j;

    srand (time(NULL));             /* seed random number generator */

( примечание: как min инициализируется INT_MAX)

Вы можете заполнить и вывести исходный массив за один l oop. Обратите внимание, что % 10 приводит к 0 во всех квадрантах регулярно, используйте % 100 для большего диапазона значений, например

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

( примечание: не используйте printf ("\n"); для вывода одного символа '\n', для этого putchar('\n'); - хотя хороший компилятор сделает эту оптимизацию за вас)

Вы можете сравнить значения в верхнем и нижнем треугольниках в один l oop, например:

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i-1 */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min)              /* test upper value */
                min = a[i][j];
            if (a[N-i-1][j] < min)          /* test lower value */
                min = a[N-i-1][j];
        }
    }

Вам нужен только один printf, чтобы вывести результат, независимо от того, делаете ли вы это как:

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);

или как

    printf ("\nMinimum element in the shaded area\n\n"
            "  min_element = %d\n", min);

Наконец, не используйте conio.h и getch();, чтобы держать окно терминала открытым. conio.h - это архивный c заголовок DOS, который на 100% непереносим. Просто используйте getchar(), что предусмотрено стандартом <stdio.h>.

В целом, вы получите:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

#define N 5

int main (void) {

    int a[N][N], min = INT_MAX, i, j;

    srand (time(NULL));             /* seed random number generator */

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i-1 */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min)              /* test upper value */
                min = a[i][j];
            if (a[N-i-1][j] < min)          /* test lower value */
                min = a[N-i-1][j];
        }
    }

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);
}

Пример использования / Вывод

$ ./bin/array_upper_lower_triangle

The generated matrix has the form:

  20  79  30  60  89
   2   5  38  15  33
  64  63  52  93  38
  77  89  54  38  89
  25  15  87  43  53

Minimum element in the shaded area

  min_element = 5

Редактировать - Менять местами верхние / нижние треугольники

После просмотра вашего комментария также стало ясно, что вы хотите поменять местами минимальные элементы из верхнего и нижнего треугольников. , Для этого вам нужно сохранить отдельные минимумы, такие как min_upper и min_lower, а также индексы массива, где они встречаются, например iu, ju (для i & j upper) и il, jl для понижения.

Затем, найдя минимумы в каждом, вы можете поменять их местами. Изменения будут следующими:

    int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;
    ...
    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min_upper) {      /* test upper value */
                min_upper = a[i][j];
                iu = i, ju = j;
            }
            if (a[N-i-1][j] < min_lower) {  /* test lower value */
                min_lower = a[N-i-1][j];
                il = N-i-1, jl = j;
            }
        }
    }
    i = a[iu][ju];              /* swap uppwer/lower triangle minimum values */
    a[iu][ju] = a[il][jl];
    a[il][jl] = i;

( примечание: i используется в качестве временной переменной в свопе, поскольку она доступна между циклами)

Завершено Пример со свопом:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

#define N 5

int main (void) {

    int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;

    srand (time(NULL));             /* seed random number generator */

    /* fill elements with random values 0-99, output array */
    puts ("\nThe generated matrix has the form:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = rand () % 100;
            printf ("  %2d", a[i][j]);
        }
        putchar ('\n');
    }

    for (i = 0; i < N - i; i++) {           /* loop rows 0 - N-i */
        for (j = i; j < N - i; j++) {       /* loop cols i - N-i-1 */
            if (a[i][j] < min_upper) {      /* test upper value */
                min_upper = a[i][j];
                iu = i, ju = j;
            }
            if (a[N-i-1][j] < min_lower) {  /* test lower value */
                min_lower = a[N-i-1][j];
                il = N-i-1, jl = j;
            }
        }
    }
    i = a[iu][ju];              /* swap uppwer/lower triangle minimum values */
    a[iu][ju] = a[il][jl];
    a[il][jl] = i;

    printf ("\nmin_upper : %d\nmin_lower : %d\n", min_upper, min_lower);

    puts("\nSwapped min from upper/lower triangles:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf ("  %2d", a[i][j]);
        putchar ('\n');
    }

    min = min_upper < min_lower ? min_upper : min_lower;

    printf ("\nMinimum element in the shaded area\n\n  min_element = %d\n", min);
}

Пример использования / Вывод

$ ./bin/array_upper_lower_triangle_swap

The generated matrix has the form:

  31  52  50  21  40
  48  63  65  15  48
  77  70  69  90  18
  56  22  36  71  14
  13  14  53  26  32

min_upper : 15
min_lower : 13

Swapped min from upper/lower triangles:

  31  52  50  21  40
  48  63  65  13  48
  77  70  69  90  18
  56  22  36  71  14
  15  14  53  26  32

Minimum element in the shaded area

  min_element = 13

Надеемся, что это соответствует всем вашим требованиям. Если вам нужна дополнительная помощь, просто спросите.

...