0

我试图在 C 中显示一个模式。它看起来像这样:

目标:

ABCDCBA
ABC CBA
AB   BA
A     A

我知道如何使用更传统的模式方法获得大致相同的输出。这是使用传统方式显示的内容(使用 for 循环和换行符):

获取输出:

ABCDDCBA
ABC  CBA
AB    BA
A      A

我想使用数组而不是传统方式来实现确切的目标模式。我试图将所有内容存储在一个数组中,然后只显示数组元素。

这是我的代码:

#include<stdio.h>
#include<conio.h>

void main()
{
    int k,n=6,m;
    int i=0,j=0;
    int arr[10][10];
    clrscr();
    while(i<=n)
    {
        j=0;
        k=65;
        m=2*n;
        while(j<=m)
        {    
            while(j<=n-i)
            {
                arr[i][j]=k;
                k++;
                j++;
            }
            for(j=n-i;j<=n+i;j++)
            {
                printf(" ");
            }
            for(j=n+i;j<=m;j++)
            {
                printf("%c",k);
                k--;
            }
        }
        i++;
    }
    i=0;
    while(i<=n)
    {
        j=0;
        while(j<=m)
        {
            printf("%c",arr[i][j]);
            j++;

        }
        printf("\n");
        i++;
    }

    getch();
}
4

5 回答 5

0

我在看你的代码,必须说所有的i,jk真的让我很困惑。有人告诉您使用有意义的变量名是有原因的,因为这样更容易阅读代码并理解每个变量的含义。我敢肯定,一旦你改变了名副其实的名字,你很快就会发现你的错误。

话虽如此,请查看您的代码

        for(j=n+i;j<=m;j++)
        {
            printf("%c",k);
            k--;
        }

你在打印后声明j=n+i和执行k--;,这意味着你打印的第一个字母与最高的相同,这意味着你将打印“ABCDDCBA”......

于 2013-09-01T06:21:37.830 回答
0
void print(const char* pStr)
{
    if(pStr == NULL)
        return;

    int len = strlen(pStr);
    printf("%s\n", pStr);
    int mid = len / 2 ;
    for (int i=1; i<= mid; i++)
    {
        for (int j =0; j<len; j++)
        {
            if ((j >= (mid-i+1)) && (j <= (mid+i-1)))
                printf(" ");
            else
                printf("%c", pStr[j]);
        }
        printf("\n");
    }
}

这是我的回答,对于输入ABCDCBA,输出是正确的:

ABCDCBA
ABC CBA
AB   BA
A     A.

但是对于 的输入ABCDDCBA,输出是错误的:

ABCDDCBA
ABCD CBA
ABC   BA
AB     A
A
于 2013-09-01T06:41:50.370 回答
0

我的第一个想法是:做 2 个循环,第一个将 A.. 中的字母放入数组中?和 2 放入从 ?-1 到 A 的数组字母。

#include <stdio.h>

int main(void)
{
  int no_ofrows;
  char array[26][51];
  int row_no;
  int index;
  int i,j;

  printf("No of rows: ");
  scanf("%d", &no_ofrows);

  for(row_no=0;row_no<no_ofrows;row_no++)
  {
    for(index=0;index<no_ofrows;index++)
    {
      if(index<no_ofrows-row_no)
        array[row_no][index]='A'+index;
      else
        array[row_no][index]=' ';
    }
    for(index=0;index<no_ofrows-1;index++)
    {
      if(index<row_no-1)
        array[row_no][no_ofrows+index]=' ';
      else
        array[row_no][no_ofrows+index]='A' + no_ofrows-2 - index;
    }
  }

  for(i=0;i<no_ofrows;i++)
  {
    for(j=0;j<no_ofrows*2-1;j++)
      printf("%c", array[i][j]);
    putchar('\n');
  }


  return 0;
}

你完成了。

于 2013-09-01T06:42:14.047 回答
0

如果您想办法说出 (row, col) 处的字符是什么,则填充数组很简单。由于输出围绕第 3 列对称,因此考虑 是合乎逻辑的abs(col - 3),因为这是与中心列的距离。叫那个dd随后的行显示较少的中心列:我的观察是当小于行号时会省略一列。最后,要打印什么字符?好吧,中心列是“D”,当您从中心移出时,字母会减少。

把它们放在一起,你会得到几行代码来填充数组。我用一个循环来打印构造为字符串的数组。putc您也可以像原始代码一样遍历每个字符串和字符。

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

int main(int argc, char *argv[]) {
    char arr[4][8] = {'\0'};
    for (int row = 0; row < 4; row++) {
        for (int col = 0; col < 7; col++) {
            int d = abs(col - 3);
            arr[row][col] = d < row ? ' ' : 'D' - d;
        }
    }
    for (int row = 0; row < 4; row++) {
        puts(arr[row]);
    }
    return 0;
}
于 2013-09-01T07:41:58.847 回答
0

我会提供这个解决方案,它尊重使用二维数组的愿望。正如所写,它使用了 C99 特性——即bridge()函数中的 VLA。(该bridge()函数之所以如此命名,是因为输出看起来有点像一座桥。)您可以使用合适的最大大小来固定数组的大小(最大char lines[9][18];为 9)。

#include <stdio.h>

enum { FirstLetter = 'A' };

static void bridge(int n)
{
    int len = n*2 - 1;
    char lines[n][len+1];

    for (int i = 0; i < n; i++)
    {
        char c = FirstLetter;
        char LastLetter = c + n - i - 1;
        for (int j = 0; j < n; j++)
        {
            lines[i][len-1-j] = c;
            lines[i][j] = c;
            if (c >= FirstLetter && c < LastLetter)
                c++;
            else
                c = ' ';
        }
        lines[i][len] = '\0';
    }
    for (int i = 0; i < n; i++)
        printf("%s\n", lines[i]);
}

int main(void)
{
    for (int i = 1; i < 10; i++)
        bridge(i);
    return 0;
}

样本输出:

A
ABA
A A
ABCBA
AB BA
A   A
ABCDCBA
ABC CBA
AB   BA
A     A
ABCDEDCBA
ABCD DCBA
ABC   CBA
AB     BA
A       A
ABCDEFEDCBA
ABCDE EDCBA
ABCD   DCBA
ABC     CBA
AB       BA
A         A
ABCDEFGFEDCBA
ABCDEF FEDCBA
ABCDE   EDCBA
ABCD     DCBA
ABC       CBA
AB         BA
A           A
ABCDEFGHGFEDCBA
ABCDEFG GFEDCBA
ABCDEF   FEDCBA
ABCDE     EDCBA
ABCD       DCBA
ABC         CBA
AB           BA
A             A
ABCDEFGHIHGFEDCBA
ABCDEFGH HGFEDCBA
ABCDEFG   GFEDCBA
ABCDEF     FEDCBA
ABCDE       EDCBA
ABCD         DCBA
ABC           CBA
AB             BA
A               A
于 2013-09-01T07:49:50.870 回答