Here’s my current code, and here’s my current output:
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.
Here’s the page with the specifications.
Bascically this program takes a string from a file that looks like:
1 2.5 8.5 8.0 8.5 9.5 9.0 7.5 6.5
where the 1 is the dive number, the 2.5 is the difficulty, and the rest are the scores. I add up all of the scores except for the highest and lowest, multiply by the difficulty, and multiply by 0.6 to get my score for the dive.
What I’m having problems with is this: My dive 2 score is correct but my dive 1 score is incorrect. I’m really not quite sure why.
I’d really appreciate help; I’ve racked my brain to find out why it is this way but I can’t seem to figure it out. Thank you for looking, I appreciate it.
Edit: Here’s the code for you guys:
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;
}
}
And the answer can be found here:
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;
}
}
As this is homework, the best way for you to learn would probably to read the entire string in, then create a scanner over the String, then iterate over it with getDouble().
So:
If you need any help on the specifics, feel free to ask.
Edit: woops, missed that link to your code. Ignore the ‘post your code’ bit.