медиана и режим отображения -1

#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?