0

レースの上位 5 位を表示するプログラムを作成しようとしています。コードはコンパイルされますが、実行すると明らかな論理エラーが発生します。5 か所すべてで同じファイナリストが繰り返されるため、1 位が 1 位、2 位、3 位…と続きます。

これが私のコードです:

import java.util.Scanner;

public class Assignment0
{
    public static void main (String [] args)
    {
        int numberOfLanes;
        int lane = 0;
        double first;
        double second;
        double third;
        double fourth;
        double fifth;
        double [] time = null;

        Scanner keyboard = new Scanner (System.in);

        System.out.println ("How many lanes hold competitors?");
        numberOfLanes = keyboard.nextInt();

        time = new double [numberOfLanes];
        for (int i = 0; i < numberOfLanes; i++)
        {
            System.out.println("Enter time for lane " + i);
            time [i] = keyboard.nextDouble();
        }

        System.out.println();
        System.out.println();

         first = time[0];

         for (int i = 0; i < time.length; i++)
         {
             if ( time[i] < first)
                {
                    first = time[i];
                    lane = i;
                }
         }

         System.out.println("First place = Lane " + lane + ". Time = " + first + " seconds.");

         second = time[0];

         for (int i = 0; i < time.length; i++)
         {
             if (time [i] > first)
                if (time [i] < second)
                {
                     second = time[i];
                     lane = i;
                } 
         }

         System.out.println("Second place = Lane " + lane + ". Time = " + second + " seconds.");

         third = time[0];

         for (int i = 0; i < time.length; i++)
         {
             if (time[i] > second)
                if (time[i] < third)
                {
                    third = time[i];
                    lane = i;
                }

         }

         System.out.println("Third place = Lane " + lane + ". Time = " + third + " seconds.");

         fourth = time[0];

         for (int i = 0; i < time.length; i++)
         {
             if (time[i] > third)
                if (time[i] < fourth)
                            {    
                              fourth = time[i];
                              lane = i;
                            }
         }


         System.out.println("Fourth place = Lane " + lane + ". Time = " + fourth + " seconds.");

         fifth = time[0];

         for (int i = 0; i < time.length; i++)
         {
           if (time [i] > fourth)
            if (time[i] < fifth)
              {
                fifth = time[i];
                lane = i;
              }
         }


         System.out.println("Fifth place = Lane " + lane + ". Time = " + fifth + " seconds.");
    }
}

出力は次のようになります。

How many lanes hold competitors?
5
Enter time for lane 0
9.72
Enter time for lane 1
9.8
Enter time for lane 2
9.82
Enter time for lane 3
9.86
Enter time for lane 4
9.9


First place = Lane 0. Time = 9.72 seconds.
Second place = Lane 0. Time = 9.72 seconds.
Third place = Lane 0. Time = 9.72 seconds.
Fourth place = Lane 0. Time = 9.72 seconds.
Fifth place = Lane 0. Time = 9.72 seconds.
4

7 に答える 7

1

second = time[0];各ループの前に、などを設定third = time[0]するため、各forループでifステートメントの条件が真になることはありません。したがって、変数、、secondなどthirdはから変更されることはなく、から変更されることもtime[0]ありlaneません0

代わりに、で初期化する必要がありますDouble.MAX_VALUE。具体的には、宣言時に次のコードを使用します。

    int numberOfLanes;
    int lane = 0;
    double first = Double.MAX_VALUE;
    double second = Double.MAX_VALUE;
    double third = Double.MAX_VALUE;
    double fourth = Double.MAX_VALUE;
    double fifth = Double.MAX_VALUE;
    double [] time = null;

second = time[0];、、などをすべて削除third = time[0]します。

于 2013-01-11T04:43:14.390 に答える
0

初期化は、設定first = time[0]などではなく、奇妙です。無限大に初期化して、個々の割り当て行を削除するだけです。

double first = Double.POSITIVE_INFINITY;
double second = Double.POSITIVE_INFINITY;
double third = Double.POSITIVE_INFINITY;
double fourth = Double.POSITIVE_INFINITY;
double fifth = Double.POSITIVE_INFINITY;
于 2013-01-11T04:43:47.800 に答える
0

これはどう :

    String[] data = new String[]{"First","Second","Third", "Forth", "Fifth"};
    int num[] = new int[]{0,1,2,3,4};
    //now we sort the array(time) and we note the index
    for(int a=0;a<numberOfLanes;a++){
        for(int b=a+1;b<numberOfLanes;b++){
            if(time[a]>time[b]){
                int temp=time[a];
                time[a] = time[b];
                time[b] = temp;

                temp = num[a];
                num[a] = num[b];
                num[b] = temp;
            }
        }
    }
    //--
    //print the output
    for(int a=0;a<numberOfLanes;a++){
        System.out.println(data[a]+" place = Lane "+num[a]+". Time = "+time[a]+" seconds.");
    }
    //-- done
于 2013-01-11T12:17:06.660 に答える
0
first = time[0];

それまで

fifth = time[0];
于 2013-01-11T04:44:15.343 に答える
0

second = time[0]; に変更second = time[1];

third = time[0];third = time[2];

fourth = time[0];fourth = time[3];

fifth = time[0];fifth = time[4];

于 2013-01-11T04:44:23.727 に答える
0

まず、これは問題にアプローチする良い方法ではありません。ただし、この方法に固執する場合、解決策は次のように、、、を初期化することsecondです。thirdfourthfifth

second = Double.MAX_VALUE;

3番目から5番目まで同様です。また、これをコードの先頭として配置する必要があります。

import java.lang.Double;

ただし、上記の修正を行っても、2 つのレーンの時間が同じ場合、2 番目のレーンはスキップされ、最後のレーンの時間はMAX_VALUEになるため、配列を使用して並べ替えるには、コードを完全に書き直す必要があることに注意してください。

于 2013-01-11T04:45:06.857 に答える
0

second時間を比較するループの前に、以降のすべてのランクを無条件に割り当てます。したがって、最速の時間を要素として配置[0]すると、観察された動作が得られます。について読む必要がありますsort

于 2013-01-11T04:45:48.730 に答える