2013-09-01 34 views
2

我想顯示下一個模式它看起來像這樣:顯示模式

目標:

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

是否有一個初始*輸入*對於這一點,或者是它始終只是' 「ABCDCBA」'你對工作的? – WhozCraig

+1

請注意,標準C或微軟官方不支持void main(),請不要使用它。對於不帶命令行參數的程序使用'int main(void)',並在末尾返回一個狀態 - 'return 0;'如果沒有其他的話。 MS編譯器不符合C99,所以省略返回是不正確的。 –

+0

用戶將輸入no。的行和基於ABC的值... A顯示,變量k正在存儲字符.. – Divyang

回答

2

我看你ACODE和必須說所有的ijk等真的讓我困惑。有一個原因告訴你有一個有意義的變量名,因爲這樣更容易閱讀代碼並理解每個代碼的含義。我很確定,一旦你改變了名副其實的名字,你很快就會發現你的錯誤。

話說回來,看看你的代碼在

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

你從j=n+i指出,做k--;打印後,這意味着你要打印的第一個字母是一樣的最高的,這意味着你將打印「ABCDDCBA」 ......

+0

i,j是我的數組索引變量,k是for打印ascii值和n是用戶將輸入的行總數..問題是與我的邏輯.. – Divyang

+1

@Divyang當然是,我沒有說如果你改變變量名稱,問題將被修復,只是如果我的回答幫助你,請接受它,如果不是,我會很容易遵循代碼 –

+0

@Divyang前往您的問題 –

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"); 
    } 
} 

這是我answser,對於輸入ABCDCBA,輸出是正確的:

ABCDCBA 
ABC CBA 
AB BA 
A  A. 

但對於ABCDDCBA輸入,輸出是錯誤的:

ABCDDCBA 
ABCD CBA 
ABC BA 
AB  A 
A 
+0

但我想用數組來做到這一點.. – Divyang

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; 
} 

然後你就完成了。

0

如果你想出一個方法來說出(row,col)中的字符是什麼,填充數組很簡單。由於輸出在第3列周圍是對稱的,因此考慮abs(col - 3)是合理的,因爲那是距中央列的距離。致電d。隨後的行顯示較少的中央列:我的觀察結果是當d小於行號時省略了一列。最後,打印什麼字符?那麼中央的列是'D',而且當你從中心移出時,這些字母會減少。

放在一起,你會得到幾行代碼來填充數組。我用一個循環來打印構建爲字符串的數組。你也可以遍歷每個字符串,並且像原始代碼那樣的字符。

#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; 
} 
1

我會提供這個解決方案,它尊重使用二維數組的願望。正如所寫,它使用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