0

我正在尝试编写一个可以打印这样的代码

-xv
-xvv
-xvvv
-xvvvv
-xvvvvv

-xxv
-xxvv
-xxvvv
-xxvvvv
-xxvvvvv

-xxxv
-xxxvv
-xxxvvv
-xxxvvvv
-xxxvvvvv

3 个“组”之间的额外间距只是为了清楚起见。'-' 的最大个数是 1,'x' 是 3,'v' 是 5,每个符号的个数递增。

要绘制此图,我有以下代码

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");
      }
   }
}

这是我知道有 3 种不同类型的符号的时候。如果仅在运行时知道符号的数量,是否可以这样做?例如,如果我希望相同的程序也能够打印怎么办

xv
xvv
xvvv
xvvvv
xvvvvv

xxv
xxvv
xxvvv
xxvvvv
xxvvvvv

xxxv
xxxvv
xxxvvv
xxxvvvv
xxxvvvvv

在这种情况下,我的代码只会是

   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");
      }
   }

而且只有 2 个 for 循环而不是 3 个。我可以编写代码以使 for 循环的数量发生变化吗?

4

2 回答 2

2

使用函数而不是最内层的 for 循环,并将字符和迭代次数作为参数传递给该函数。

于 2012-06-12T10:31:32.203 回答
1

例如

#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;
}
于 2012-06-12T16:10:18.707 回答