Не могу понять, как создать эту программу - PullRequest
0 голосов
/ 21 апреля 2019

Разработка программы, которая будет читать по имени файла.Из этого файла программа будет читать список строк, разделенных пробелами.Эти строки будут преобразованы в их десятичный эквивалент и усреднены.Затем программа выведет результат в другой файл.

Программа также должна иметь возможность корректно обрабатывать ошибки ввода, такие как неверное имя файла или строковые данные, которые не содержат десятичного значения.

Невозможно понять, как это сделать ', программа будет читать список строк, разделенных пробелами.Эти строки будут преобразованы в их десятичный эквивалент и усреднены.Затем программа выведет результат в другой файл. '

и

' Программа также должна иметь возможность корректно обрабатывать ошибки ввода, такие как неверное имя файла или строковые данные, которые не содержатдесятичное значение. '

, если кто-нибудь может объяснить или указать мне, где можно найти примеры таких примеров, я был бы очень признателен.

public static void main (String [] args) throws Exception{

    //Create a Scanner object
    Scanner input = new Scanner (System.in);

    //prompt the user to enter a file name
    System.out.println("Enter a file name: ");
    File file = new File (input.nextLine());  

    // Read text from file and change oldString to newString 
    try ( 
        // Create input file 
        Scanner input = new Scanner(file); 
    ) { 
        while (input.hasNext()) { 
            String s1 = input.nextLine(); 
            list.add(s1.replaceAll(args[1], args[2])); 
        } 
    } 


    // Save the change into the original file 
    try ( 
        // Create output file 
        PrintWriter output = new PrintWriter(file); 
    ) { 
        for (int i = 0; i < list.size(); i++) { 
            output.println(list.get(i)); 
       } 
    } 
}

1 Ответ

0 голосов
/ 22 апреля 2019

Примеры, которые вы ищете, повсюду в StackOverflow. Вам просто нужно выбрать конкретную проблему и исследовать ее.

При создании консольного приложения вы должны попытаться сделать его максимально удобным для пользователя, поскольку консоль довольно ограничена практически во всем. При запросе ввода от пользователя разрешите пользователю более одной попытки в случае ошибки входа. Для такого рода вещей обычно используется цикл , в то время как , вот пример:

//Create a Scanner object
Scanner input = new Scanner(System.in);

System.out.println("This application will read the file name you supply and");
System.out.println("average the scores on each file line. It will then write");
System.out.println("the results to another file you also supply the name for:");
System.out.println("Hit the ENTER Key to continue (or q to quit)....");
String in = "";
while (in.equals("")) {
    in = input.nextLine();
    if (in.equalsIgnoreCase("q")) {
        System.out.println("Bye-Bye");
        System.exit(0);
    }
    break;
}

// Prompt the user to enter a file name
String fileName = "";
File file = null;
while (fileName.equals("")) {
    System.out.println("Enter a file name (q to quit): ");
    fileName = input.nextLine();
    if (fileName.equalsIgnoreCase("q")) {
        System.out.println("Bye-Bye");
        System.exit(0);  // Quit Application
    }
    // If just ENTER key was hit 
    if (fileName.equals(""))  {
        System.out.println("Invalid File Name Provided! Try Again.");
        continue;
    }
    file = new File(fileName);
    // Does the supplied file exist? 
    if (!file.exists()) {
        // Nope!
        System.out.println("Invalid File Name Provided! Can Not Locate File! Try Again.");
        fileName = ""; // Make fileName hold Null String ("") to continue loop
    }
}

Что касается запроса у пользователя имени файла, приведенный выше код является более дружественным подходом. Сначала это в основном объясняет, что делает приложение, затем позволяет Пользователю выйти из приложения, если он / она желает, и позволяет Пользователю предоставить правильную запись, если будет сделана ошибочная запись или если запись, которая кажется действительной, действительно обнаружены дефекты, например, когда определенный файл не может быть найден.

Эта же концепция должна применяться ко всем аспектам вашего консольного приложения. Суть в том, что вы создали приложение, так что вы знаете, что ожидается, однако этого нельзя сказать о ком-то, кто будет использовать ваше приложение. Они не имеют ни малейшего представления о том, что ожидается.

Что касается поставленной задачи, вы должны использовать код и концепции, которые вы уже изучили, и те, которые вы еще не изучили, проводя исследования и экспериментируя с другими концепциями алгоритмического кода. По ходу дела вы, вероятно, приобретете некоторую степень «мышления из коробки», и эта черта станет естественной с большим количеством кода и концепций, которые вы в конечном итоге изучите.

Запишите методический план атаки для выполнения задачи. Это может сэкономить вам огромное количество горя по ходу вашего кода, например:

  • Объяснить заявку;
  • Запросить у пользователя имя файла;
    • Убедитесь, что указано имя файла;
      • Если нет, то запросите имя файла снова;
    • Убедитесь, что файл существует;
      • Если нет, то запросите имя файла снова;
  • Запросить у пользователя имя выходного файла;
    • Проверьте, существует ли файл уже;
      • Попросить перезаписать, если это так;
      • Если не перезаписать, запросите другое имя выходного файла;
  • Откройте Reader, чтобы прочитать предоставленное имя файла;
  • Открыть Writer для записи результатов в указанное имя файла;
  • Прочитать каждую строку файла, используя цикл , в то время как ;
    • Разделить каждое чтение в строке на String Array с помощью метода String.split ("\\s+");
    • Объявите переменную totalSum как double тип данных;
    • Объявите среднюю переменную как double тип данных;
    • Итерация по массиву строк с для цикла ;
      • Убедитесь, что каждый элемент Array является десятичным значением, используя Метод String # соответствует ("-?\\d+(\\.\\d+)");
      • Преобразовать каждый элемент массива в удвоение и добавить к ** totalSum *;
    • После для деления цикла totalSum на количество элементов в массив для получения среднего, поместите эту сумму в переменную medium ;
    • Запись в файл: "Среднее значение для:" + fileLine + "равно:" + среднее значение. Также вывод на консоль;
  • После обработки всего файла закройте Reader и закройте Writer.
  • DONE.

Теперь это будет ваше основное руководство по созданию приложения.

При чтении файлов данных с помощью Сканера, я чувствую, что лучше использовать метод Scanner # hasNextLine () в условии цикла , тогда как , а не Scanner # hasNext () метод, поскольку этот метод больше ориентирован на получение токенов, чем на строки файла. Так что, на мой взгляд, это был бы лучший подход:

String outFile = "";
// Write code to get the File Name to write to and place 
// it into the the variable outFile ....
File outputFile = new File(outFile); // True file name is acquired from User input
if (outputFile.exists()) {
    // Ask User if he/she wants to overwrite if file exists....and so on
}

// 'Try With Resourses' on reader
try (Scanner reader = new Scanner(file)) {
    // 'Try With Resourses' on writer
    try (PrintWriter writer = new PrintWriter(outputFile)) {
        String line = "";
        while (reader.hasNextLine()) {
            line = reader.nextLine().trim();
            // Skip blank lines (if any)
            if (line.equals("")) {
                continue;
            }
            // Split the data line into a String Array
            String[] data = line.split("\\s+"); // split data on one or more whitespaces
            double totalSum = 0.0d;  // Hold total of all values in data line
            double average = 0.0d;   // To hold the calculated avarage for data line
            int validCount = 0;      // The amount of valid data values on data line (used as divisor)
            // Iterate through data Line values String Array
            for (int i = 0; i < data.length; i++) {
                // Is current array element a string representation of
                // a decimal value (signed or unsigned)
                if (data[i].matches("-?\\d+(\\.\\d+)")) {
                    // YES!...add to totalSum
                    validCount++;
                    // Convert Array element to double then add to totalSum.
                    totalSum += Double.parseDouble(data[i]); 
                }
                else {
                    // NO! Kindly Inform User and don't add to totalSum.
                    System.out.println("An invalid value (" + data[i] + ") was detected within "
                            + "the file line: " + line);
                    System.out.println("This invalid value was ignored during                                   + "averaging calculations!" + System.lineSeparator());
                }
            }
            // Calculate Data Line Average
            average = totalSum / validCount;
            // Write the current Data Line and its' determined Average
            // to the desired file (delimited with the Pipe (|) character.
            writer.append(line + " | Average: " + String.valueOf(average) + System.lineSeparator());
            writer.flush();
        }
    }
    System.out.println("DONE! See the results file.");
}
// Catch the fileNotFound exception
catch (FileNotFoundException ex) {
    ex.printStackTrace();
}
...