C - все комбинации чисел из входного номера пользователя - PullRequest
0 голосов
/ 19 января 2019

У меня есть следующий код, но он работает неправильно:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string>

#define MAXN 100
const unsigned n=4;
const unsigned k=2;
int taken[MAXN];

void print(unsigned i)
{
    unsigned l;
    printf(" ( ");
    for (l=0; l<=i-1; l++) printf("%u ", taken[l] + 1);
    printf(")\n");
}

void variate(unsigned i) 
{
    unsigned j;
    if (i>=k) 
    {
        print(i);
        return;
    }
    for (j=0;j<n;j++)
        {
        taken[i]=j;
        variate(i+1);
        }    
}

void condition(unsigned number) 
{
    unsigned j;
    if (number>=k) 
    {
        print(number);
        return;
    }
    for (j=0;j<n;j++)
        {
        taken[number]=j;
        variate(number+1);
        }

}

int main(void)
{
    variate(0);

      int number;
      printf("Enter number from 1 to 4: \n", number);
      scanf("%d", &number);

      printf("All varians of the combinations with your number are: \n");
    condition(0);

 system ("pause");
  return 0;
}

Программа печатает все возможные комбинации цифр 1, 2, 3 и 4 и работает правильно.Но void condition не работает нормально.После печати всех возможных комбинаций из четырех чисел пользователь должен ввести число от 1 до 4, и все комбинации с номером пользователя должны появиться, и ни одна из остальных комбинаций.

1 Ответ

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

Больше замечаний уже сделано, в вашей программе есть несколько странных вещей

  • число чтения никогда не используется, поэтому нет способа дать результат в зависимости от него
  • Вы изменяете взятый , чтобы дать всем парам, но не сбрасываете его прежде, чем давать пары с прочитанным числом, предполагая, что взятый полезно, как это может работать в этом случае?
  • и глобально, почему так сложно?

Вы можете сделать это двумя способами:

#include <stdio.h>

#define MIN 1
#define MAX 4

int main()
{
  /* print all couples */
  for (unsigned i = MIN; i <= MAX; ++i) {
    for (unsigned j = MIN; j <= MAX; ++j) {
      printf("(%u %u)\n", i, j);
    }
  }

  unsigned number;
  printf("Enter number from %d to %d\n", MIN, MAX);
  scanf("%u", &number);

  /* first way following the same order as before */
  puts("same order");

  if ((number >= MIN) && (number <= MAX)) {
    for (unsigned i = MIN; i <= MAX; ++i) {
      for (unsigned j = MIN; j <= MAX; ++j) {
        if ((i == number) || (j == number))
          printf("(%u %u)\n", i, j);
      }
    }
  }

  /* an other way, faster but not in the same order */
  puts("different order");

  printf("(%u %u)\n", number, number);
  for (unsigned i = MIN; i < number; ++i) {
    printf("(%u %u)\n(%u %u)\n", number, i, i, number);
  }
  for (unsigned i = number + 1; i <= MAX; ++i) {
    printf("(%u %u)\n(%u %u)\n", number, i, i, number);
  }

  return 0;
}

Выполнение:

(1 1)
(1 2)
(1 3)
(1 4)
(2 1)
(2 2)
(2 3)
(2 4)
(3 1)
(3 2)
(3 3)
(3 4)
(4 1)
(4 2)
(4 3)
(4 4)
Enter number from 1 to 4
2
same order
(1 2)
(2 1)
(2 2)
(2 3)
(2 4)
(3 2)
(4 2)
different order
(2 2)
(2 1)
(1 2)
(2 3)
(3 2)
(2 4)
(4 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...