Número variable de bucles for

Estoy tratando de escribir un código que podría imprimir algo como esto

-xv
-xvv
-xvvv
-xvvvv
-xvvvvv

-xxv
-xxvv
-xxvvv
-xxvvvv
-xxvvvvv

-xxxv
-xxxvv
-xxxvvv
-xxxvvvv
-xxxvvvvv

El espacio adicional entre los 3 "grupos" es solo para mayor claridad. El número máximo de '-' es 1, 'x' es 3, 'v' es 5 y el número de cada símbolo aumenta.

Para dibujar este diagrama, tengo el siguiente código

for (k = 1 ; k <= num_dash ; k++)
{
   for (i = 1 ; i <= num_x ; i++)
   {
      for (j = 1 ; j <= num_v ; j+++)
      {
         for (k1 = 0 ; k1 < k ; k++)
            printf("-");
         for (i1 = 0 ; i1 < i ; i++)
            printf("x");
         for (j1 = 0 ; j1 < j ; j++)
            printf("v");
         printf("\n");
      }
   }
}

Aquí es cuando sé que hay 3 tipos diferentes de símbolos. ¿Es posible hacer lo mismo si la cantidad de símbolos solo se conoce en tiempo de ejecución? Por ejemplo, ¿qué pasa si quiero que el mismo programa también pueda imprimir

xv
xvv
xvvv
xvvvv
xvvvvv

xxv
xxvv
xxvvv
xxvvvv
xxvvvvv

xxxv
xxxvv
xxxvvv
xxxvvvv
xxxvvvvv

En este caso, mi código solo sería

   for (i = 1 ; i <= num_x ; i++)
   {
      for (j = 1 ; j <= num_v ; j+++)
      {
         for (i1 = 0 ; i1 < i ; i++)
            printf("x");
         for (j1 = 0 ; j1 < j ; j++)
            printf("v");
         printf("\n");
      }
   }

Y solo hay 2 bucles for en lugar de 3. ¿Puedo escribir mi código de manera que varíe el número de bucles for?

preguntado el 12 de junio de 12 a las 11:06

2 Respuestas

Use funciones en lugar de los bucles for más internos y pase los caracteres y el número de iteraciones como parámetros a esa función.

Respondido el 12 de junio de 12 a las 11:06

P.ej

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

void print_aux(char **symbols, int *times, int len, int pos, char *acc){
    int i;
    char *p;

    if(pos == len){
        printf("%s\n", acc);
        return;
    }
    p = malloc(sizeof(char)*strlen(symbols[pos])*times[pos]+strlen(acc)+1);
    for(i=0;i<times[pos];++i){
        int j;
        *p='\0';
        strcpy(p, acc);
        for(j=0;j<=i;++j){
            strcat(p, symbols[pos]);
        }
        print_aux(symbols, times, len, pos + 1, p);
    }
    if(pos + 1 == len)// when last symbol
        printf("\n",pos);
    free(p);
}

//wrap function
void print(char **symbols, int *times, int len){
    print_aux(symbols, times, len, 0, "");
}

int main() {
    int i,n;
    char **symbols;
    int  *times;

    fprintf(stderr,"number of symbols :");
    scanf("%d", &n);
    symbols=(char**)malloc(sizeof(char*)*n);
    times = (int*)malloc(sizeof(int)*n);
    for(i=0;i<n;++i){
        char wk[128];
        fprintf(stderr,"input symbol [%d]:", i+1);
        scanf(" %s", wk);
        symbols[i] = strdup(wk);
        fprintf(stderr,"maximum number of \"%s\":",wk);
        scanf(" %d", &times[i]);
    }

    print(symbols, times, n);

    {   //release the allocated area
        for(i=0;i<n;++i){
            free(symbols[i]);
        }
        free(symbols);
        free(times);
    }
    return 0;
}

Respondido el 12 de junio de 12 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.