对于潜水比赛Java程序中的循环问题

时间:2014-11-26 19:51:09

标签: java arrays for-loop

以下是单词的赋值: 在跳水比赛中,每位参赛者的得分是通过降低最低和最高分数然后加上剩余分数来计算的。编写一个程序,读取提供的数据文件格式,如下表所示。对于每个潜水员使用上述评分规则输出潜水员的姓名和总分。将每个潜水员的总分数格式化为两位小数。例如,陈若琳的输出将是:陈若琳 - 56.90分。 您的程序必须从提供的数据文件中读取数据,并使用数组来存储该数据。一旦在程序中读取了所有数据,就需要计算每个潜水员的总分并输出潜水员的姓名和总分。总点数是根据上面定义的评分规则计算的。

到目前为止,我有一个程序可以读取.txt文件并输出潜水员的姓名和分数列表。对于我的生活,我无法弄清楚如何打印总分(当然没有最高分和最低分)。任何帮助将不胜感激,这项任务让我头疼!

import java.util.Vector;

public class Diver
{
private String firstName;
private String lastName;
private Vector scores;

public Diver()
{
    firstName = "";
    lastName = "";
    scores = new Vector();
}

public Diver(String firstName, String lastName, double... scores)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.scores = new Vector();

    for (double score : scores)
    {
        this.scores.add( score );
    }
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public String getLastName()
{
    return lastName;
}

public void setLastName(String lastName)
{
    this.lastName = lastName;
}



public String toString()
{
    return firstName + " " + lastName + scores.toString();
}
}

TestDiver计划:

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

class TestDiver
{
    public static void main(String[] args)
    {
        try {
            Scanner scanner = new Scanner(new File("diving_data.txt"));
            scanner.useLocale(Locale.US);

            double[] scores = new double[8];

            while (scanner.hasNext())
            {
                String firstName = scanner.next();
                String lastName  = scanner.next();

                System.out.println("Diver: " + firstName + " " + lastName);

                double min = Double.MIN_VALUE;
                double max = Double.MAX_VALUE;


                for (int i = 0; i < scores.length; i++)
                {
                    scores[i] = scanner.nextDouble();

                    System.out.println(" " + scores[i]);
                }

                Diver diver = new Diver(firstName, lastName, scores);
            }
            scanner.close();
        }
        catch (Exception e)
        {
            System.out.println("Problem: " + e.getMessage());
        }
    }
}

.txt文件: 陈若琳9.2 9.3 9 9.9 9.5 9.5 9.6 9.8
Emilie Heymans 9.2 9.2 9 9.9 9.5 9.5 9.7 9.6
王新9.2 9.2 9.1 9.9 9.5 9.6 9.4 9.8
Paola Espinosa 9.2 9.3 9.2 9 9.5 9.3 9.6 9.8
Tatiana Ortiz 9.2 9.3 9 9.4 9.1 9.5 9.6 9.8
Melissa Wu 9.2 9.3 9.3 9.7 9.2 9.2 9.6 9.8
Marie-Eve Marleau 9.2 9.2 9.2 9.9 9.5 9.2 9.3 9.8
Tonia Couch 9.2 9 9.1 9.5 9.2 9.3 9.4 9.6 Laura Wilkinson 9.7 9.1 9.3 9.4 9.5 9.4 9.6 9.2

3 个答案:

答案 0 :(得分:1)

我会跟踪所有分数的最小值,最大值和总和,然后执行以下操作:

    while (scanner.hasNext()) {
        String firstName = scanner.next();
        String lastName = scanner.next();

        System.out.println("Diver: " + firstName + " " + lastName);

        double min = 11d; //initialize the min value to a high value
        double max = 0d; //initialize the max value with a low value
        double total = 0d; //sum all scores
        double finalScore = 0d;

        for (int i = 0; i < scores.length; i++) {
            scores[i] = scanner.nextDouble();
            if(scores[i] > max) { //if scores[i] > max, we have found a new max score
                max = scores[i];
            }
            if(scores[i] < min) { //if scores[i] < min, we have found a new min score
                min = scores[i];
            }
            total += scores[i]; //sum of all scores
            System.out.println(" " + scores[i]);
        }
        finalScore = total - max - min; //final score, sum of all scores minus min and max
        Diver diver = new Diver(firstName, lastName, finalScore, scores);
        System.out.println(diver.getFinalScoreFormatted());// final score with two decimal places
    }

在Divers类中创建一个变量来保存最终得分,然后使用getter方法以指定的格式打印它。

import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;
import java.util.Vector;

public class Diver {

    private String firstName;
    private String lastName;
    private Vector scores;
    private double finalScore;

    public Diver() {
        firstName = "";
        lastName = "";
        finalScore = 0;
        scores = new Vector();
    }

    public Diver(String firstName, String lastName, double finalScore, double... scores) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.scores = new Vector();
        this.finalScore = finalScore;

        for (double score : scores) {
            this.scores.add(score);
        }
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String toString() {
        return firstName + " " + lastName + scores.toString();
    }
    // getter method, method that returns the value of the instance variable finalScore
    public double getFinalScore() {
        return finalScore;
    }
    // getter method that returns the final score with two decimal places
    public String getFinalScoreFormatted() {
        DecimalFormat f = new DecimalFormat("##.00");
        return f.format(this.finalScore);
    }
}

希望它有所帮助。

答案 1 :(得分:1)

由于分数的计算仅对Diver类的属性起作用,因此它应该是Diver类的方法,而不是类的外部。您的main方法应包含的唯一逻辑是数据的输入和输出,包括格式。因此,将计算逻辑移到Diver类中。

此外,如果您将分数存储在已排序的数据结构中,例如TreeSet,那么您不需要任何特殊逻辑来确定哪些分数是最高和最低的。您需要做的就是按排序顺序迭代分数并将它们相加 - 当然省略第一个和最后一个分数。这最终会使您的代码更具可读性。

您的所有Diver课程需求如下。 Diver最初创建时没有分数,然后会将分数添加到其中。这样您就不必在main方法中缓存数据。

注意我是如何使用计数器的,因为我增加了Set加总得分。如果我们查看第一个元素(counter == 0)或最后一个元素(counter == scores.size() - 1),我不会向总和添加任何内容。

import java.util.SortedSet;
import java.util.TreeSet;

public class Diver {
    private String firstName;
    private String lastName;
    private SortedSet<Double> scores;

    public Diver(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName  = lastName;
        scores = new TreeSet<>();
    }

    public void addScore(double score) {
        scores.add(score);
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public double getFinalScore() {
        if (scores.size() < 3) {
            return 0.0;
        }
        else {
            double sum = 0.0;
            int counter = 0;
            for(double score : scores) {
                if (counter != 0 && counter != scores.size() - 1) {
                    sum += score;
                }
                counter++;
            }
            return sum;
        }
    }
}

如果您愿意,可以使用这些方法来查找最低和最高分数,尽管分配实际上并没有要求您。当您使用JDK为您提供的类时,看它是多么容易,而不是尝试编写自己的逻辑!

    public double getLowestScore() {
        return scores.first();
    }

    public double getHighestScore() {
        return scores.last();
    }

最后,测试类。这有输入,输出和格式。此外,分配会在您读取输入文件时要求您存储所有Diver个对象,然后在读完文件后输出它们。执行此操作的最简单结构是ArrayList,因为您可以继续向其添加更多对象,而无需知道有多少对象可以开始。最重要的是,测试类中没有计算逻辑。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestDiver {

    public static void main(String[] args) {
        Scanner in = new Scanner("diving_data.txt");
        List<Diver> divers = new ArrayList<>();
        while (in.hasNext()) {
            String firstName = in.next();
            String lastName  = in.next();

            Diver diver = new Diver(firstName, lastName);
            while(in.hasNextDouble()) {
                diver.addScore(in.nextDouble());
            }
            divers.add(diver);
        }
        in.close();

        for (Diver eachDiver : divers) {
            System.out.format(
                    "%s %s - %.2f points%n", 
                    eachDiver.getFirstName(), 
                    eachDiver.getLastName(), 
                    eachDiver.getFinalScore());
        }
    }
}

答案 2 :(得分:0)

scores.length更改为公共变量。因为此代码scores.length中的scores.length返回0

在循环内找到MAX和MIN。

if(scores[i]>MAX){
  MAX=scores[i];
}
if(scores[i]<MIN){
  MIN=scores[i];
}

然后将MAX+MIN传递给潜水员级别并减去MAX+MIN,这将是总分。