3

1

##### Java whileループ/数学ロジック

コードと説明は次のとおりです。 コンパイルはされますが、予想どおりに計算されません。 私はそれが数学的な論理エラー、ループレイアウトエラー、またはその両方であるかどうかは本当にわかりません。

コード：

```/*
This program uses a while loop to to request two numbers and output (inclusively) the odd numbers between them,
the sum of the even numbers between them, the numbers and their squares between 1 & 10, the sum of the squares
of odd numbers.
*/

import java.io.*;
import java.util.*;

public class SumOfaSquare
{
static Scanner console = new Scanner(System.in);

public static void main (String[] args)
{

int firstnum = 0, secondnum = 0, tempnum = 0;
int sum = 0,squaresum = 0, squarenum = 0;
int number = 1;

String oddOutputMessage = "The odd numbers between" + firstnum + " and " + secondnum + " inclusively are:";
String evenSumMessage = "The sum of all even numbers between " + firstnum + " and " + secondnum + "is: ";
String oddSquareMessage = "The odd numbers and their squares are : ";
String squareMessage = "The numbers and their squares from 1-10 are : ";

System.out.println ("Please enter 2 integers. The first number should be greater than the second: ");
firstnum = console.nextInt();
secondnum = console.nextInt();

//used to find out if first number is greater than the second. If not, inform user of error.
if (firstnum > secondnum)
{
tempnum = firstnum;
System.out.println ("You entered: " + firstnum + " and: " + secondnum);
}
else

//while the frist number is greater, do this....
while (tempnum <= secondnum)
{
//if it's odd....
if (tempnum %2 == 1)
{
oddOutputMessage = (oddOutputMessage + tempnum + " ");
squaresum = (squaresum + tempnum * tempnum);
}

//otherwise it's even..
else
{
sum = sum + tempnum;
evenSumMessage = (evenSumMessage + sum + " ");
tempnum++;
}
}
// figures squares from 1 - 10
while (number <=10)
{
squarenum = (squarenum + number * number);
squareMessage = (squareMessage + number + " " + squarenum);
number++;
}

oddSquareMessage = oddSquareMessage + squaresum;
System.out.println (oddOutputMessage);

System.out.println (oddOutputMessage);
System.out.println (squareMessage);
System.out.println (evenSumMessage);
System.out.println (oddSquareMessage);

}
}```

2

0

コードにはいくつかの問題があります。 自分で問題を解決したいです。 コードのデバッグ方法がわからない場合は、「println」デバッグを使用して、途中で変数を出力できます。

コードに関する一般的なコメントを次に示します。

• 異なる出力を異なるサブルーチンに分割することを検討してください。 `dumpOddNumbers（low、high）、sumEvenNumbers（low、high）、…​`

• 変数のスコープをできるだけ制限するようにしてください。 定義しないでください 上部の変数を使用し、後で使用します。 必要になる直前に定義してください。 これにより、意図しない結果が制限されます。 一時的なカウンターでない限り、変数を再利用しないようにしてください。

• while（tempnum ⇐ secondnum）これらの種類の行は「for」 ループします。 コードの問題の1つは、最初の数値が<で2番目（入力1 10など）の場合、数値が奇数の場合tempnumがインクリメントされないため、プログラムが永久にループすることです。

• ```while（tempnum ⇐ secondnum）`はおそらく `for（int tempnum = firstnum; tempnum ⇐ secondnum; tempnum ++）```

• ```while（number ⇐ 10）`は `for（int number = 1; number ⇐ 10; number ++）```

• プログラムの上部でメッセージを定義しますが、すべきではありません 後で結果に取り組む。 `println（msgString + resultValue）`のようなことをしてください。

• `msg = msg + …​`タイプの代わりに `StringBuilder（）`を見てください 論理。 はるかに効率的です。

• 番号が正しい順序で並んでいることを確認すると、 エラーメッセージ、続行しますか？ そこに「戻る」べきだと思います。

• 次のコードはコメントと一致しません。 どちらが正しい？

```// while the frist number is greater, do this
while (tempnum <= secondnum) {```

お役に立てれば。