#java #arrays #median #mode
Вопрос:
Эй, ребята, я недавно изучал кодирование и получил задание найти среднее, медиану и режим ряда целых чисел в целочисленном массиве. Проблема, с которой я сталкиваюсь, заключается в том, что моя медиана и режим отображают -1, и я не слишком уверен, как это исправить, мое «если пользователь вводит нет, выведите сообщение об ошибке» также не работает, и я был бы очень признателен, если бы кто-нибудь мог мне помочь. Это мой код:
package com.company; import java.io.File; import java.io.FileNotFoundException; import static com.company.ProjectConstants.*; import java.util.*; public class Main { public static void main(String[] args) { int[] a = new int[MAXDATA]; int counter = 0; boolean fileDone = false; boolean inputOk; String userInput; String theDataFile; Scanner s = new Scanner(System.in); genProgInfo(); userInput = s.nextLine(); userInput = userInput.toLowerCase(); while (!userInput.equals("yes") amp;amp; (!userInput.equals("no"))) { System.out.println("ERROR: Please input either yes or no: "); userInput = s.nextLine(); userInput = userInput.toLowerCase(); } inputOk = userInput.equals("yes"); initDataStorage(a); //do { try { // create file amp; scanner objects System.out.println("enter one of the file names:nData10File.txtnData30file.txtnData35file.txt"); theDataFile = s.next(); theDataFile = theDataFile.toLowerCase(); //fName = userInput; File f = new File(theDataFile); Scanner sc = new Scanner(f); // store file data in array, a for (int i = 0; i lt; MAXDATA; i ) { if (sc.hasNext()) { a[i] = sc.nextInt(); } else { fileDone = true; sc.close(); break; } } // print error message if file data exceeds the range of array if (!fileDone) { System.out.println("ntCAUTION: file has additional data, consider making array larger."); } } catch (FileNotFoundException e) { System.out.println(e); e.printStackTrace(); } //} while (inputOk); s.close(); for (int i=0; ilt;MAXDATA; i ) { if (a[i] != -1) { counter = a[i]; } } System.out.println("counter: " counter); displayResults(calcMean(a), calcMedian(a), calcMode(a)); } public static void initDataStorage(int[] data) { for (int i = 0; i lt; MAXDATA; i ) { data[i] = INVALID; } } public static double calcMean(int[] data) { int counter = 0; int mean; int sum = 0; for (int i = 0; i lt; MAXDATA; i ) { if (data[i] != -1) { sum = data[i]; counter ; } } mean = sum / counter; return mean; } public static double calcMedian(int[] data) { int middle = data.length / 2; if (data.length % 2 == 1) { return data[middle]; } else { return (data[middle -1] data[middle]) / 2.0; } } public static int calcMode(int[] data) { int mode = 0, maxCount = 0; for (int i = 0; i lt; data.length; i) { int count = 0; for (int j = 0; j lt; data.length; j) { if (data[j] == data[i]) { count ; } } if (count gt; maxCount) { maxCount = count; mode = data[i]; } } return mode; } public static void genProgInfo() { System.out.println("This program will calculate the mean, median, and mode of a number of integers stored in the array"); System.out.println("Would you like to continue?"); } public static void displayResults(double mean, double median, int mode) { System.out.println("mean: " mean); System.out.println("median: " median); System.out.println("mode: " mode); } }
Комментарии:
1. Просмотрите свой код с помощью отладчика и посмотрите, что он делает.
Ответ №1:
Я предполагаю, что значение INVALID равно -1, основываясь на другом коде, который я вижу, и на вашем описании того, что он выводит. Ваш массив имеет длину MAXDATA и изначально заполнен НЕДОПУСТИМЫМ значением во всех элементах. Затем вы заполняете его n значениями, где n может быть меньше MAXDATA, и в этом (вероятно, распространенном) случае многие или даже большинство значений в массиве являются НЕДОПУСТИМЫМИ.
Ваша функция calcMean правильно пропускает значения -1 (НЕДОПУСТИМЫЕ?) и не включает их в расчет. Однако обратите внимание, что все допустимые значения находятся в начале массива, и как только вы найдете недопустимое значение, вы можете выйти из цикла в calcMean.
Но функции calcMedian и calcMode не учитывают недопустимые значения. Если n значительно меньше, чем MAXDATA, то -1, вероятно, действительно является режимом. У вашей функции calcMedian также есть дополнительная проблема, заключающаяся в том, что (допустимые) данные необходимо отсортировать, чтобы «среднее» или медианное значение находилось в середине массива.
Бонусный вопрос для вашего задания: Что делать, если во входном файле встречается значение -1?