用C打印一个钻石,带有镜像字母



我试图编写一个程序,打印一个带有镜像字母的钻石,如以下形状:

       a
      aba
     abcba
    abcdcba
   abcdedcba
  abcdefedcba
   abcdedcba
    abcdcba
     abcba
      aba
       a

以下是我已经做过的:

 #include <stdio.h>
int main()
{
  int n, c, k,f=0, space = 1;
  char ch='a';
  printf("enter the size of diamondn");
  scanf("%d", &n);
  space = n - 1;
  for (k = 1; k <= n; k++)
  {
    for (c = 1; c <= space; c++)
      printf(" ");
    space--;

    for (c = 1; c <= 2*k-1; c++)
     if (c <= f)
     printf("%c", ch);
     ch++;
     if (c>f)
     ch--;
     printf("%c", ch);
     printf("n");
  }



  space = 1;
  for (k = 1; k <= n - 1; k++)
  {
    for (c = 1; c <= space; c++)
      printf(" ");
    space++;
    for (c = 1 ; c <= 2*(n-k)-1; c++)
      printf("a");
    printf("n");
  }
  return 0;
}

但显然这个代码中有一些错误,有人能帮我检测吗?

如果更换此

for (c = 1 ; c <= 2*(n-k)-1; c++)
    printf("a");

用这个

for (c = 0 ; c < 2*(n-k)-1; c++)        // note the different conditions
    printf("%c", 'a' + c);              // print char instead of string

你应该得到每一行的正确长度,但增加字符像

abcde

但它不会从中点开始减少。我把它留给你!

将任务分开运行会更容易。因此,根据位置和行长度计算要打印的字符的函数为:

int getCharAtPos(int pos, int len)
{
    if (pos > len / 2)
    {
        return 'a' + len - pos;
    }
    else
    {
        return 'a' + pos - 1;
    }
}

然后你会使用而不是printf("a")

    for (c = 1; c <= 2*k-1; c++)
      printf("%c", getCharAtPos(c, 2*k-1));
.....
    for (c = 1 ; c <= 2*(n-k)-1; c++)
      printf("%c", getCharAtPos(c, 2*(n-k)-1));

这个问题还有第二个解决方案。您可以使用递归。我为你的任务写了一个例子。

//--------------
 // Recursive Out one Simbol
 void DamSimRec(char chOut ,int scnt)
  {
        printf("%c", chOut);

        if (scnt > 1)
        {
            DamSimRec(chOut + 1, scnt - 1);
            printf("%c", chOut);
        }
}// Print Space
//--------------
    void SpaceOut(int pSizeSpace)
    {
        int a_c;
        for (a_c = 0; a_c < pSizeSpace; a_c++)
            printf(" ");
    }
//--------------
 // Recursive Print One String Krylov E.A.
  void DamRec(int space, int sout)
    {
        SpaceOut(space);//space;
        DamSimRec('a', sout);//Simbols
        printf("n");
        if (space > 0)
            DamRec(space-1, sout+1);
        if (sout > 1)
            SpaceOut(space + 1);
            DamSimRec('a', sout - 1);
        }
        printf("n"); 
    }
main()
{
        int aSize;
        printf("enter the size of diamondn");
        scanf_s("%d", &aSize);
        DamRec(aSize , 1);
}

所以,你可以使用它,但要记住堆栈。

int n, c, k, space;
printf("enter the size of diamondn");
scanf("%d", &n);
char s[n+2];
s[0] = 'a';s[1] = '';
for(c = 0; c < n; ++c){
    space = n - c -1;
    printf("%*s", space, "");
    k = printf("%s", s) - 1;
    while(--k >=0)
        putchar(s[k]);
    puts("");
    s[c+1] = s[c] + 1;
    s[c+2] = '';
}
for(c = 1; c < n; ++c){
    space = c;
    printf("%*s", space, "");
    k = printf("%.*s", n - c, s) - 1;
    while(--k >=0)
        putchar(s[k]);
    puts("");
}

#include <stdio.h>
void print(char from, char to){
    putchar(from);
    if(from < to){
        print(from+1, to);
        putchar(from);
    }
}
int main(void){
    int c = 0, n, k = 1;
    printf("enter the size of diamondn");
    scanf("%d", &n);
    do{
        printf("%*s", n - c -1, "");
        print('a', 'a' + c);
        puts("");
        if(c + 1 == n)
            k = -k;
        c += k;
    }while(c>=0);
    return 0;
}

最新更新