3


1

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

私はJavaが初めてで、while、for、およびif / elseステートメントも初めてです。 私は本当にこの問題の獣と格闘してきました。

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

私はかなり長い間ギアを磨いてきましたが、見ることができません。 私は本当に近くにいるように感じます…​ それでもまだ遠い。

コード:

/*
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
  System.out.println ("Your first number was not greater than your second number. Please try again.");

 //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 Answer


2


最初のループでは、 `tempnum`をインクリメントする条件についてよく考えてください。 奇妙なときはどうなりますか? `tempnum`はインクリメントされますか?


0


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

入力3と1を受け取り、プログラムを1行ずつ調べて、頭の中で(または紙の上で)答えがどうなるかを考えます。 期待した結果と一致するかどうかを確認してください。

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

  • 異なる出力を異なるサブルーチンに分割することを検討してください。 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) {

お役に立てれば。