我正在尝试编写可以打印此类内容的代码
-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循环的数量变化吗?
答案 0 :(得分:2)
使用函数而不是innermost for循环,并将字符和迭代次数作为参数传递给该函数。
答案 1 :(得分:1)
E.g。
#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", ×[i]);
}
print(symbols, times, n);
{ //release the allocated area
for(i=0;i<n;++i){
free(symbols[i]);
}
free(symbols);
free(times);
}
return 0;
}