3

これが私の自習の宿題の1つです。

実際に実行せずに、このプログラムの出力を書き留めることになっています。私はここですべての構文と変数の受け渡しを理解しています (そして私は答えを持っています) が、何らかの理由で、紙の上でそれをトレースすることはうまくいきません。

すべてを整理しておくための秘密の作図テクニックはありますか?

手でこれを理解することは、経験豊富なプログラマーにとって単なる子供の遊びですか?

ありがとう

public class Mystery extends ConsoleProgram {
public void run() {
    ghost(13);
}

private void ghost(int x) {
    int y = 0;
    for (int i = 1; i < x; i *= 2) {
        y = witch(y, skeleton(x, i));
    }
    println("ghost: x = " + x + ", y = " + y);
}

private int witch(int x, int y) {
    x = 10 * x + y;
    println("witch: x = " + x + ", y = " + y);
    return x;
}

private int skeleton(int x, int y) {
    return x / y % 2;
}
}
4

5 に答える 5

3

渡された番号を使用して、メソッド呼び出しのスタックを書き留めてみてください。例:

run()
ghost(13)
skeleton(13,1)

各メソッド呼び出しで、スクラッチ スペースを見つけて変数を書き出し、戻り値を取得するまでコードが何をするかを調べてみます。次に、その戻り値を取得し、そのメソッド スタックの最後のポイントに戻り、そのメソッドを削除します。

たとえば、上記の例のスタックの一番上 (一番下) はskeleton(13,1)であるため、x が 13 で y が 1 の場合に何skeleton()が返されるかを考えてみます。簡単に、それは です1。次に、スタックに戻り、その戻り値がどうなるかを確認します。この場合witch()は であるため、スタックは次のようになります。

run()
ghost(13)
witch(0,1)

run() が終了するまで続けます。

于 2012-08-05T05:12:09.823 に答える
3

通常、次のように 2 つの列 (メモリとモニター) を持つテーブルを使用します。

====================
| Memory | Monitor |
====================
|        |         |
|        |         |
|        |         |
|        |         |
====================

メモリはデバッグにおける時計のようなものです。モニターはモニターに出力するものです

たとえば、次のようになります。

int x; // Declare X (Memory)
x=10; // fill with 10 (Memory)
System.out.println(x); // print it (Monitor)

そのテーブルを使用してトレースする場合:

====================
| Memory | Monitor |
====================
| x=10   | 10      |
|        |         |
|        |         |
|        |         |
====================

これがお役に立てば幸いです

更新: 詳細を説明したい:

以前に作成したコードを見てみましょう

1. int x; // Declare X (Memory)
2. x=10; // fill with 10 (Memory)
3. System.out.println(x); // print it (Monitor)

ステップ 1: X を宣言します。テーブルは次のようになります。

====================
| Memory | Monitor |
====================
| x      |         |
|        |         |
|        |         |
|        |         |
====================

ステップ 2: x に 10 を入力すると、次のようになります。

====================
| Memory | Monitor |
====================
| x=10   |         |
|        |         |
|        |         |
|        |         |
====================

ステップ 3: x を出力します

====================
| Memory | Monitor |
====================
| x=10   | 10      |
|        |         |
|        |         |
|        |         |
====================
于 2012-08-05T05:13:46.390 に答える
2

あなたができることは、すべての変数を書き留める紙の上にすべてのスコープ (メソッドと考えてください) を実際にエミュレートすることです。

メソッドを呼び出す場合は、新しい紙を取り、既存の紙のスタックに置きます。メソッドから戻る場合は、一番上のピースを投げます。クラスがある場合は、それら用に別のシートが必要になります。

それがあなたにできることです。しかし、本物のプログラマーはそれをしません。

代わりに行うことは次のとおりです。

  • コードを見て基本構造を理解する。次のようなもの:「ゴースト」を出力する前に、「魔女」を数回呼び出します。

  • あなたがガイドする詳細を理解し、ロギング/システムアウトステートメントおよび/またはデバッガーであなたの考えを再確認し、実際にコードを実行するために。

では、運動は無駄ですか?そうは思わないでください。単独で行うことはありませんが、コードについて考える作業の一部であり、常に何らかの方法で行っています。

于 2012-08-05T05:10:51.407 に答える
0

からrun()見えるmain()(したがって呼び出すことができる) 唯一のメソッドであるため、変数から値への置換を実行するだけで済みます。変数が生成されたときに変数の値を配置します。

変数値を代入するこつをつかめば、難しいことではありません。これは非常に貴重なデバッグ戦術です。

于 2012-08-05T05:09:59.117 に答える
0

ループを展開できます:

for (int i = 1; i < 13; i *= 2) {
    E[i]
}

になる

E[1]; E[2]; E[4]; E[8];

ここには再帰がないので、残りは簡単です。

于 2012-08-05T05:11:11.820 に答える