-1

私はJavaとプログラミング全般の初心者です。転職してJavaを学ぼうとしています。ループを実行し、さまざまなタスクを試しています。

大きな正方形の中に正方形を作りたいのですが、問題があります。これが私のコードです:

import java.util.Scanner;

public class SquareLoop {

private static Scanner input;

public static void main(String[] args) {

    input = new Scanner(System.in);
    System.out.println("Please enter your star value: ");
    int value = input.nextInt();
    System.out.println("Please enter the second square value: ");
    int value2 = input.nextInt();

    for (int i = 0; i <= value; i++) {
        for (int j = 0; j <= value; j++) {
            if(i != value2 || i != value && j != value2 || j != value)
                System.out.print(" ");
            if (i == 0 || i == value  || i == value - value2 || i == value2)
                System.out.print("*");
            else if (j == 0 || j == value || j == value - value2 || j == value2)
                System.out.print("*");

            else
                System.out.print(" ");
        }
        System.out.println();
    }
}
}

これが私の結果 です 私の結果

どんな助けでも感謝します。解決策は必要ありませんが、ガイドラインはもう少し具体的かもしれません。

4

1 に答える 1

1

問題は、使用している関係演算子と論理演算子にあると思います。http://www.tutorialspoint.com/java/java_basic_operators.htmで簡単な概要を確認できます。または、論理演算子の一般原則の詳細については、https ://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Operators/Logical_Operators を参照してください。

しかし、一般的に、いくつかの有用な一般情報、コードが現在行っていることの明確化、およびいくつかの提案を下部に配置しました。

OR 演算子 - ||

TRUE  || TRUE  = TRUE
TRUE  || FALSE = TRUE
FALSE || TRUE  = TRUE
FALSE || FALSE = FALSE

AND 演算子 - &&

TRUE  && TRUE  = TRUE
TRUE  && FALSE = FALSE
FALSE && TRUE  = FALSE
FALSE && FALSE = FALSE

関係演算子

== //Specific Equality (A == B = TRUE iff A has the same value as B)
<, > //Less Than / Greater Than (A < B or A > B -- excludes B)
<=, >= //Less Than / Greater Than *or Equal To* (A <= B or A >= B -- inclusive of B)
!= //Specific Inequality

上記を考えると、あなたの質問から、あなたはこれを持っていると思います

そして、あなたはこのようなものが欲しい

現在のコード:

それが要点である場合は、使用しているロジックをもう一度見てみることをお勧めします。ここで行うことは、取得したコードを明確にすることです。うまくいけば、この情報を使用して、それに応じてトラブルシューティングを行うことができます。

まず、for ループを見てみましょう。

for (int i = 0; i <= value; i++) {
    for (int j = 0; j <= value; j++) {

現在、0 から入力値までの for ループを使用しています。これは、印刷される星は、実際には入力された数値 (0, 1, 2 .. value-1, value) よりも 1 つ多い星を印刷することを意味します。

次の If ステートメント:

if(i != value2 || i != value && j != value2 || j != value)
    System.out.print(" ");

この if ステートメントは実際には、操作の順序により常に true になります (" " を "x" に置き換えて、結果を確認してください)。ここではifステートメントは必要ないと思いますが、次のリソースを使用して、演算子の優先順位/操作の順序の要点を取得できます: http://introcs.cs.princeton.edu/java/11precedence/ . if ステートメントで演算の順序を変更することは、代数と同じで、括弧を使用することに注意してください。すなわち

(Order of Operations: Left to Right)
False || True && True && True
    => True && True && True
    => True && True 
    => True


(False || True) && (True && False)
    => (True) && (True && False)
    => (True) && (False)
    => False

2 番目の if ステートメント:

if (i == 0 || i == value  || i == value - value2 || i == value2)
    System.out.print("*");

上記のコードは、i = 0、value、value-value2、または value2 の列全体に星を出力します。値 = 7、値 2 = 3 の例を見てみましょう

現在(そして私が 0 から 7 になることを覚えておいてください):

i == 0 grabs:
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -
// * - - - - - - -

i == value grabs:
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *
// - - - - - - - *

i == value - value2 (7 - 3 = 4) grabs:
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -
// - - - - * - - -

i == value2 (3) grabs:
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -
// - - - * - - - -

同様に、3 番目の if ステートメントを見てください。

else if (j == 0 || j == value || j == value - value2 || j == value2)
    System.out.print("*");

現在:

j == 0 grabs:
// * * * * * * * *
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -

j == value grabs:
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// * * * * * * * *

j == value - value2 (7 - 3 = 4) grabs:
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// * * * * * * * *
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -

and j == value2 (3) grabs:
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// * * * * * * * *
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -
// - - - - - - - -

そして最後に:

else
    System.out.print(" ");

予想どおり、コードに "*" がない場合、else は " " を出力します。

いくつかの推奨事項、考え、およびリソース

  • 論理演算子と関係演算子の組み合わせを使用して、必要な行/列の位置の範囲をターゲットにできるはずです。例えば:(j == upper_row || j == lower_row) && (i > left_column && i < right_column)
  • 変数をリファクタリングして、それぞれが何をしているかをより深く理解することができます。一般に、プログラミングでは次のような意見が唱えられます。「変数名は短くても意味のあるものにする必要があります」。http://www.oracle.com/technetwork/java/codeconventions-135099.html
  • さらに、値がより大きな数値を保持していることを確認することもできます (Math.min または Math.max がこれに役立ちます) http://docs.oracle.com/javase/7/docs/api/java/lang/ Math.html
  • 一般に、Java API - Oracle ドキュメントは、学習時に非常に役立ちます: http://docs.oracle.com/javase/7/docs/api/
于 2015-11-10T21:39:52.797 に答える