处理字符串中的数字并添加以查找平均分数

时间:2012-04-24 17:30:29

标签: java file-io

这是我当前的code,这是我目前的输出:

This program will calculate an overall score for a diver, based on individual dives.
The diver's score for dive 1 is 79.80. 
The diver's score for dive 2 is 49.80. 

The average score for these dives is 64.80. 

这是包含specifications的页面。

基本上,这个程序从一个看起来像这样的文件中获取一个字符串:

1 2.5 8.5 8.0 8.5 9.5 9.0 7.5 6.5

1是潜水号码,2.5是难度,其余是分数。我将除了最高和最低分数之外的所有分数相加,乘以难度,然后乘以0.6得到我的潜水分数。

我遇到的问题是:我的潜水2分是正确的,但我的潜水1分是不正确的。我真的不太清楚为什么。

我真的很感激帮助;我绞尽脑汁想知道为什么会这样,但我似乎无法弄明白。谢谢你的期待,我很感激。

编辑:这是你们的代码:

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

public class Dive {

    public static void main(String[] args) throws FileNotFoundException {
        printIntro();

        Scanner fileScanner = new Scanner(new File("DiveData.txt"));

        processDives(fileScanner);
    }

    public static void printIntro() {
        System.out
                .println("Welcome to the Diver Scoring program."
                        + "\nThis program will calculate an overall score for a diver, based on individual dives.");
    }

    public static void processDives(Scanner fileScanner) {
        double avg = 0;
        int count = 0;

        while (fileScanner.hasNext()) {
            int diveNumber = fileScanner.nextInt();
            String diveLine = fileScanner.nextLine();
            double score = calculateDiveScore(diveLine);
            avg += score;

            System.out.printf("The diver's score for dive " + diveNumber
                    + " is " + "%.2f. \n", score);

            count++;
            diveNumber = 0;
        }
        System.out.printf("\nThe average score for these dives is "
                + "%.2f. \n", avg / (double) count);
    }

    public static double calculateDiveScore(String diveLine) {
        double score = 0.0;
        String subNumbers = "";
        double difficulty = Double.parseDouble(diveLine.substring(1, 4));
        diveLine = diveLine.substring(5);
        double max = -500, min = 500;

        for (int i = 0; i < diveLine.length(); i++) {

            // if we're getting something other than a space, add it to the
            // string. We'll do the calculations while we have spaces.
            if (diveLine.charAt(i) != ' ') {
                subNumbers += diveLine.charAt(i);
            } else {
                double val = Double.parseDouble(subNumbers);
                // if the score is neither largest nor smallest, add it to total
                // score.
                if (Math.max(val, max) == max && Math.min(val, min) == min) {
                    score += val;
                }

                // if it is either largest or smallest, add previous largest or
                // smallest and set current to largest or smallest.
                if (Math.max(val, max) == val) {
                    if (max != -500)
                        score += max;
                    max = val;
                } else if (Math.min(val, min) == val) {
                    if (min != 500)
                        score += min;
                    min = val;
                }
                subNumbers = "";
            }
        }

        //check the last number to see if it's a max or a min
        if (Math.max(Double.parseDouble(subNumbers), max) == Double
                .parseDouble(subNumbers)) {
            score += max;
        } else if (Math.min(Double.parseDouble(subNumbers), min) == Double
                .parseDouble(subNumbers)) {
            score += min;
        }

        return score * difficulty * 0.6;
    }
}

答案可以在这里找到:

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

public class Dive {

    public static void main(String[] args) throws FileNotFoundException {
        printIntro();

        Scanner fileScanner = new Scanner(new File("DiveData.txt"));

        processDives(fileScanner);
    }

    public static void printIntro() {
        System.out
                .println("Welcome to the Diver Scoring program."
                        + "\nThis program will calculate an overall score for a diver, based on individual dives.");
    }

    public static void processDives(Scanner fileScanner) {
        double avg = 0;
        int count = 0;

        while (fileScanner.hasNext()) {
            int diveNumber = fileScanner.nextInt();
            String diveLine = fileScanner.nextLine();
            double score = calculateDiveScore(diveLine);
            avg += score;

            System.out.printf("The diver's score for dive " + diveNumber
                    + " is " + "%.2f. \n", score);

            count++;
            diveNumber = 0;
        }
        System.out.printf("\nThe average score for these dives is " + "%.2f.",
                avg / (double) count);
    }

    public static double calculateDiveScore(String diveLine) {

        diveLine = diveLine.substring(1);
        String[] fields = diveLine.split(" ");
        double difficulty = Double.parseDouble(fields[0]);
        double[] scores = new double[fields.length - 1];
        double max = -500.0, min = 500.0, score = 0;

        for (int i = 0; i < fields.length - 1; i++) {
            scores[i] = Double.parseDouble(fields[i + 1]);
        }

        for (int i = 0; i < scores.length; i++) {
            if (Math.max(scores[i], max) == scores[i])
                max = scores[i];
            if (Math.min(scores[i], min) == scores[i])
                min = scores[i];
            score += scores[i];
        }

        score -= max;
        score -= min;

        return score * difficulty * 0.6;
    }
}

Also found here on pastebin

2 个答案:

答案 0 :(得分:1)

使用String.split()。您解析分数线的方式极其复杂且容易出错。

以下是一行 提示 这只是伪代码,以显示方法

final String s = "1 2.5 8.5 8.0 8.5 9.5 9.0 7.5 6.5";
final String[] fields = s.split(" ");
// get the metadata
final int diveNumber = Integer.parseInt(fields[0]);
final double difficulty = Double.parseDouble(fields[1]);
// convert the scores 
final double[] scores = new double[fields.length - 2];
for (int i = 2; i < fields.length; i++ )
{
   scores[i] = Double.parseDouble(fields[i]);  
}

// the rest is left as an exercise to the reader

就个人而言,我会将所有原始数组转换为List个实例,以便更轻松地使用它们,但这是另一个教训。

答案 1 :(得分:0)

由于这是家庭作业,你学习的最好方法可能是读取整个字符串,然后在字符串上创建一个扫描程序,然后用getDouble()迭代它。

所以:

for(iterate over number of lines) {

    String yourString = "blah";

    ... create Scanner pointing to yourString...

    while(scanner has a double) {

        double nextNum = get next double from scanner;
        ... Do something with that double...
    }
}

如果您需要任何有关细节的帮助,请随时提出。

编辑:woops,错过了指向您代码的链接。忽略'发布你的代码'位。