![](/img/trans.png)
[英]Writing to an array of arrays and displaying the seperate entities in the array of arrays in C
[英]Displaying pattern using arrays in C
我試圖在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();
}
我正在看你的代碼,必須說所有的i
, j
, k
等,真讓我感到困惑。 之所以會告訴您使用有意義的變量名,是因為這樣更容易閱讀代碼並理解每個變量的含義。 我敢肯定,一旦您更改了名副其實的名稱,您很快就會發現自己的錯誤。
話雖如此,請看一下您的代碼
for(j=n+i;j<=m;j++)
{
printf("%c",k);
k--;
}
您是從j=n+i
並做k--;
打印后,意味着您要打印的第一個字母與最高字母相同,這意味着您將打印“ ABCDDCBA” ...
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個循環,第一個放入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;
}
這樣就完成了。
如果您想出一種方法來說明(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;
}
我將提供此解決方案,該解決方案尊重使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.