Есть ли способ создания циклов на основе пользовательского ввода? - PullRequest
0 голосов
/ 03 мая 2020

Я хочу создать все возможные 5 di git чисел, которые могут быть созданы из чисел (0-7). Код ниже достигает этого, но есть ли способ сделать это зависимым от пользовательского ввода? Количество циклов равно числу цифр, которое я хочу, и каждый отдельный l oop должен быть:

for(1st number;condition<=last number;1st number++)

Итак, для пяти цифр у меня есть:

for(i=0;i<8;i++){
    for(j=0;j<8;j++){
        for(k=0;k<8;k++){
            for(m=0;m<8;m++){
                for(n=0;n<8;n++){
                    printf("%d %d %d %d %d\n",i,j,k,m,n);                   
                }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Храните итераторы в массиве и увеличивайте их вручную.

#include <assert.h>
#include <stdio.h>
#include <string.h>

void callback(unsigned n, int i[n]) {
     assert(n == 5);
     printf("%d %d %d %d %d\n", i[0], i[1], i[2], i[3], i[4]);
}

void iterate(unsigned n, unsigned max, void (*callback)(unsigned n, int i[n])) {
   // VLA, use *alloc in real code
   int i[n];
   memset(i, 0, sizeof(i));
   while (1) {
      for (int j = 0; j < n; ++j) {
         // increment first number, from the back
         ++i[n - j - 1];
         // if it didn't reach max, we end incrementing
         if (i[n - j - 1] < max) {
             break;
         }
         // if i[0] reached max, return
         if (j == n - 1) {
             return;
         }
         // if the number reaches max, it has to be zeroed
         i[n - j - 1] = 0;
      }
      // call the callback
      callback(n, i);
   }
}


int main() {
   // iterate with 5 numbers to max 8
   iterate(5, 8, callback);
}

Начало и конец того, что печатает код:

0 0 0 0 0
0 0 0 0 1
...
...
7 7 7 7 6
7 7 7 7 7
1 голос
/ 03 мая 2020

Если вам нужно переменное число циклов, вам обычно нужно использовать рекурсию. Скажем, если вы хотите, чтобы n цифр с i th di git находился в диапазоне a[i], b[i], то вы будете делать следующее:

/* whatever */

int n;
int *a,*b,*number;

void recursion(int whichdigit){
    if (whichdigit==n){
        /* Say you managed to output number */
        return;
    }
    for (int i=a[whichdigit];i<=b[whichdigit];i++){
        number[whichdigit]=i;
        recursion(whichdigit+1);
    }
    return;
}

int main(){
    /* Say somehow you managed to obtain n */
    a=malloc(n*sizeof(int));
    b=malloc(n*sizeof(int));
    number=malloc(n*sizeof(int))
    if (!a||!b||!number){
        /* unable to allocate memory */
    }
    /* Say somehow you managed to read a[i],b[i] for all i in 0..n-1 */
    recursion(0);
    return 0;
}

Предупреждение: если вы попытаетесь использовать слишком много цифр, вы, скорее всего, получите ошибку сегментации или переполнения стека.

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