Как выстроить числа, как фигуры в виде бабочек в с - PullRequest
1 голос
/ 25 мая 2019

enter image description here

Я пытаюсь расположить числа в матрице nxn (n - нечетное число) в форме галстука-бабочки.(как на рис.)

Попытка установить координаты матрицы 5x5, но безрезультатно.

мой код:

bowtie {
  int a[5][5] = {{
                     0,
                 },
                 {
                     0,
                 },
                 {
                     0,
                 },
                 {
                     0,
                 },
                 {
                     0,
                 }};

  int i, j;
  int num = 1;

  for (i = 0; i < 5; i++) {
    if (i <= 2)  // y>=0 - coordinate(2d)
    {
      for (j = i; j <= 2; j++)  // x<=0, y>=0 Quadrant 2
      {
        a[i][j] = num;
        num++;
      }
      for (j = 4 - i; j > i; j++)  // Quadrant 1

      {
        a[i][j] = num;
        num++;
      }
    } else                              // y<0
      for (j = 4 - i; j <= 4 - i; j++)  // Quadrant 3
      {
        a[i][j] = num;
        num++;
      }

    for (j = i; j >= i; j++)  // Quadrant 2
    {
      a[i][j] = num;
      num++;
    }
  }

  for (i = 0; i < 5; j++) {
    for (j = 0; j < 5; j++) {
      printf("%d\t", a[i][j]);
    }
    printf("\n");
  }
}

1 Ответ

2 голосов
/ 25 мая 2019

Цикл

       for (j = 4 - i; j > i; j++)  // Quadrant 1

неверен, поскольку j начинается с 4 ( i , оценивающий 0), являясь последним действительным индексом, тогданикогда не останавливаться, чтобы расти, производя неопределенное поведение, когда вы выходите из массива

Цикл

       for (j = 4 - i; j <= 4 - i; j++)  // Quadrant 3

странно, потому что последнее возможное значение является первым,так что это не цикл, а просто его тело, выполненное с j = 4 - i

цикл

    for (j = i; j >= i; j++)  // Quadrant 2

похож на первый и составляет j несовместим с размерами массива


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

#include <stdio.h>

int main(int argc, char ** argv)
{
  if (argc != 2)
    printf("Usage %s <size>\n", *argv);
  else {
    int n;

    if ((sscanf(argv[1], "%d", &n) != 1) || (n < 1))
      fprintf(stderr, "invalid size %s\n", argv[1]);
    else {
      int a[n][n];
      int v = 0; /* the value 1.. to put in the cells */
      int empty; /* the empty height */
      int i,j;

      /* first half and may be center */
      empty = -1;

      for (j = 0; j <= (n-1)/2; ++j) {
        empty += 1;

        for (i = 0; i != empty; ++i)
          a[i][j] = a[n - i - 1][j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++][j] = ++v;
      }

      if ((n & 1) == 0)
        empty += 1;

      /* second half */
      for (; j < n; ++j) {
        empty -= 1;

        for (i = 0; i != empty; ++i)
          a[i][j] = a[n - i - 1][j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++][j] = ++v;
      }

      /* show result */
      for (i = 0; i != n; ++i) {
        for (j = 0; j != n; ++j) {
          if (a[i][j] == 0)
            fputs("    ", stdout); /* witdh = 4 compatible with a size up to 43 */
          else
            printf("% 4d", a[i][j]); /* width = 4 compatible with a size up to 43 */
        }
        putchar('\n');
      }
    }
  }

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall b.c
pi@raspberrypi:/tmp $ ./a.out 1
   1
pi@raspberrypi:/tmp $ ./a.out 2
   1   3
   2   4
pi@raspberrypi:/tmp $ ./a.out 3
   1       5
   2   4   6
   3       7
pi@raspberrypi:/tmp $ ./a.out 4
   1           9
   2   5   7  10
   3   6   8  11
   4          12
pi@raspberrypi:/tmp $ ./a.out 5
   1              13
   2   6      10  14
   3   7   9  11  15
   4   8      12  16
   5              17
pi@raspberrypi:/tmp $ ./a.out 6
   1                  19
   2   7          15  20
   3   8  11  13  16  21
   4   9  12  14  17  22
   5  10          18  23
   6                  24
pi@raspberrypi:/tmp $ ./a.out 7
   1                      25
   2   8              20  26
   3   9  13      17  21  27
   4  10  14  16  18  22  28
   5  11  15      19  23  29
   6  12              24  30
   7                      31

Если вы не принимаете даже размер

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

int main(int argc, char ** argv)
{
  if (argc != 2)
    printf("Usage %s <size>\n", *argv);
  else {
    int n;

    if ((sscanf(argv[1], "%d", &n) != 1) || (n < 1) || ((n & 1) == 0))
      fprintf(stderr, "invalid size %s\n", argv[1]);
    else {
      int a[n][n];
      int v = 1; /* the value 1.. to put in the cells */
      int empty; /* the empty height */

      /* first half more center */
      empty = -1;

      for (int j = 0; j <= n/2; ++j) {
        int i;

        empty += 1;

        for (i = 0; i != empty; ++i)
          a[i][j] = a[n - i - 1][j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++][j] = v++;
      }

      /* second half */
      for (int j = n/2 + 1; j < n; ++j) {
        int i;

        empty -= 1;

        for (i = 0; i != empty; ++i)
          a[i][j] = a[n - i - 1][j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++][j] = v++;
      }

      /* show result */
      for (int i = 0; i != n; ++i) {
        for (int j = 0; j != n; ++j) {
          if (a[i][j] == 0)
            fputs("    ", stdout);
          else
            printf("% 4d", a[i][j]);
        }
        putchar('\n');
      }
    }
  }

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall o.c
pi@raspberrypi:/tmp $ ./a.out
Usage ./a.out <size>
pi@raspberrypi:/tmp $ ./a.out 1
   1
pi@raspberrypi:/tmp $ ./a.out 2
invalid size 2
pi@raspberrypi:/tmp $ ./a.out 3
   1       5
   2   4   6
   3       7
pi@raspberrypi:/tmp $ ./a.out 5
   1              13
   2   6      10  14
   3   7   9  11  15
   4   8      12  16
   5              17
pi@raspberrypi:/tmp $ ./a.out 17
   1                                                             145
   2  18                                                     130 146
   3  19  33                                             117 131 147
   4  20  34  46                                     106 118 132 148
   5  21  35  47  57                              97 107 119 133 149
   6  22  36  48  58  66                      90  98 108 120 134 150
   7  23  37  49  59  67  73              85  91  99 109 121 135 151
   8  24  38  50  60  68  74  78      82  86  92 100 110 122 136 152
   9  25  39  51  61  69  75  79  81  83  87  93 101 111 123 137 153
  10  26  40  52  62  70  76  80      84  88  94 102 112 124 138 154
  11  27  41  53  63  71  77              89  95 103 113 125 139 155
  12  28  42  54  64  72                      96 104 114 126 140 156
  13  29  43  55  65                             105 115 127 141 157
  14  30  44  56                                     116 128 142 158
  15  31  45                                             129 143 159
  16  32                                                     144 160
  17                                                             161
pi@raspberrypi:/tmp $ 

От вас замечание

'int a [n] [n];'есть проблема.

возможно, вы скомпилировали в C ++, а не в C, но это легко изменить:

  • заменить int a[n][n]; на int * a = malloc(n*n*sizeof(int));
  • заменить каждую форму a[x][y] на a[(x)*n+y]
  • добавить free(a); в конце

Например, если я сделаю это в предложении, принимаю только нечетный размер:

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

int main(int argc, char ** argv)
{
  if (argc != 2)
    printf("Usage %s <size>\n", *argv);
  else {
    int n;

    if ((sscanf(argv[1], "%d", &n) != 1) || (n < 1) || ((n & 1) == 0))
      fprintf(stderr, "invalid size %s\n", argv[1]);
    else {
      int * a = malloc(n*n*sizeof(int));
      int v = 1; /* the value 1.. to put in the cells */
      int empty; /* the empty height */

      /* first half more center */
      empty = -1;

      for (int j = 0; j <= n/2; ++j) {
        int i;

        empty += 1;

        for (i = 0; i != empty; ++i)
          a[i*n+j] = a[(n - i - 1)*n+j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++*n+j] = v++;
      }

      /* second half */
      for (int j = n/2 + 1; j < n; ++j) {
        int i;

        empty -= 1;

        for (i = 0; i != empty; ++i)
          a[i*n+j] = a[(n - i - 1)*n+j] = 0;
        for (int k = n - empty*2; k; --k)
          a[i++*n+j] = v++;
      }

      /* show result */
      for (int i = 0; i != n; ++i) {
        for (int j = 0; j != n; ++j) {
          if (a[i*n+j] == 0)
            fputs("    ", stdout);
          else
            printf("% 4d", a[i*n+j]);
        }
        putchar('\n');
      }

      free(a);
    }
  }

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