我试图在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();
}
答案 0 :(得分:0)
我在看你的名字,并且必须说i
,j
,k
等所有人真的很困惑我。你被告知有一个有意义的变量名称是有原因的,因为它更容易以这种方式阅读代码并理解每个代码的含义。我很确定,一旦你改变名副其实的名字,你马上就会发现你的错误。
说完了,看看你的代码
for(j=n+i;j<=m;j++)
{
printf("%c",k);
k--;
}
你在j=n+i
说明并在打印后执行k--;
,这意味着您要打印的第一个字母与最高字母相同,这意味着您将打印“ABCDDCBA”......
答案 1 :(得分: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
答案 2 :(得分: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;
}
你已经完成了。
答案 3 :(得分:0)
如果你想办法说出(row,col)中的字符是什么,填充数组很简单。由于输出在第3列周围是对称的,因此考虑abs(col - 3)
是合乎逻辑的,因为这是与中心列的距离。称之为d
。后续行显示较少的中心列:我的观察是当d
小于行号时,省略了一列。最后,打印什么字符?好吧,中央栏是'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;
}
答案 4 :(得分:0)
我将提供这个解决方案,它尊重使用2D阵列的愿望。如上所述,它使用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