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

そして、forループは3つではなく2つしかありません。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 に答える