0

ポイントは、次のような二分木を出力することです。

-------x--------
---x-------x----
-x---x---x---x--
x-x-x-x-x-x-x-x-
xxxxxxxxxxxxxxxx

私のコードは次のとおりです。

#include <stdio.h>
#include <math.h>

#define LENGTH 16

void makeBranches(int left, int right, char a[][LENGTH], int);
void display(char a[][LENGTH], int);

void main(){
  int i, lines;
  double a;

  a = log10(LENGTH*2)/log10(2);
  lines = (int)a; 
  char array[lines][LENGTH];

  makeBranches(0, LENGTH-1, array, 0);
  display(array, lines);
}

void makeBranches(int left, int right, char a[][LENGTH], int line){

  if(left >= right){
    a[line][left] = 'X';
    return;
  } else{
    a[line][(right+left)/2] = 'X';
    makeBranches(left, (right+left)/2, a, line+1);
    makeBranches((right+left)/2+1, right, a, line+1); 
  }
}

void display(char a[][LENGTH], int lines){
  int i, j;

  for(i = 0; i < lines; i++){
    for(j = 0; j < LENGTH; j++){
      if(a[i][j] == 'X')
    printf("%c", a[i][j]);
      else
    printf("-");      
    }
    printf("\n");
  }
}

これは、LENGTH 値が 4、8、16 の場合は正常に機能しますが、32、64 などを試してみると、X がいくつかあります。例えば:

長さ 32

---------------X----X-------X---
-------X---------------X--------
---X-------X-------X-------X----
-X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

長さ 64

-------------------------------X--------------------------------
---------------X-------------------------------X----------------
-------X---------------X---------------X---------------X--------
---X-------X-------X-------X-------X-------X-------X-------X----
-X---X---X---X---X--XX---X--XX---X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

これはどこかで簡単に修正する必要がありますが、私はそれを見ることができません。うまくいけば、誰かができます。

4

2 に答える 2

3
char array[lines][LENGTH];

これにより空の配列が作成され、すべての値が現在メモリ内にあるものになります (0 の場合もありますが、0 であるとは限りません)。これは、ランダムに、メモリにすでに「X」バイトが含まれている場合があることを意味します。これは、配列を 0 でいっぱいになるように初期化することで解決できます (これは「0」ではなくヌル文字です)。

memset(array, 0, LENGTH * lines);

または:

for(size_t i = 0; i < lines; i++){
    for(size_t j = 0; j < LENGTH; j++){
        a[i][j] = 0;
    }
}
于 2012-11-08T23:39:25.203 に答える
2

Yourarrayは のローカル変数でmainあり、その値のほとんどを初期化することはありません。明示的に初期化されていないローカル変数は、最初は「ランダム ガベージ」を含んでいます。これは実際には「ランダム」ではありませんが、「ガベージ」であるため、一部の位置に誤って値「X」が含まれていないことを確認できません。最初に。

配列全体をループし、すべての位置を既知のものに初期化することから始めます。

(言語の専門家は、「ランダム ガベージ」は、ユニット化されたローカルで起こることを技術的に正確に表す用語ではないことを知っているでしょうが、実際のプログラミングでメンタル モデルとして機能するには十分に近いものです)。

于 2012-11-08T23:40:24.603 に答える