Advertisement
Alyks

Untitled

Mar 24th, 2020
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.54 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.io.RandomAccessFile;
  6. import java.util.ArrayList;
  7. import java.util.Scanner;
  8.  
  9. public class Main {
  10.     static double findMaxEl(ArrayList<Double> arr, double maxEl, int i) {
  11.         if(i < arr.size()) {
  12.             double el = arr.get(i);
  13.             if(el > maxEl)
  14.                 maxEl = el;
  15.             return findMaxEl(arr, maxEl, i+1);
  16.         }
  17.         return maxEl;
  18.     }
  19.  
  20.     static String chooseInputType(Scanner scan) {
  21.         String type = "";
  22.         boolean notCorrect = true;
  23.         System.out.println("Введите [c], если хотите произвести ввод из консоли, либо [f], если хотите произвести ввод из файла.");
  24.         while(notCorrect) {
  25.             type = scan.nextLine();
  26.             if(type.equals("c") || type.equals("f"))
  27.                 notCorrect = false;
  28.             else
  29.                 System.out.println("Введите либо [c], либо [f]");
  30.         }
  31.         return type;
  32.     }
  33.  
  34.     static ArrayList<Double> inputSequenceFromConsole(Scanner scan) {
  35.         ArrayList<Double> sequence = new ArrayList<>();
  36.         boolean continueCycle = true;
  37.         int i = 1;
  38.         System.out.println("Введите число, либо [стоп], чтобы прекратить ввод");
  39.         while(continueCycle) {
  40.             System.out.println("Введите " + i + "-й элемент последовательности.");
  41.             String input = scan.nextLine();
  42.             if(input.equals("стоп")) {
  43.                 if(sequence.size() > 1)
  44.                     continueCycle = false;
  45.                 else
  46.                     System.out.println("Введите хотя бы 2 элемента последовательности.");
  47.             } else if(input.length() > 0) {
  48.                 try {
  49.                     double el = Double.parseDouble(input);
  50.                     if(el == Double.POSITIVE_INFINITY || el == Double.NEGATIVE_INFINITY) {
  51.                         System.out.println("Вы ввели слишком большое число, повторите ввод.");
  52.                     } else {
  53.                         sequence.add(el);
  54.                         i++;
  55.                     }
  56.                 } catch (Exception err) {
  57.                     System.out.println("Вводимый элемент должен быть вещественным числом, повторите ввод.");
  58.                 }
  59.             } else
  60.                 System.out.println("Элемент не может быть пустым, повторите ввод.");
  61.         }
  62.         return sequence;
  63.     }
  64.  
  65.     static ArrayList<Double> inputSequenceFromFile(Scanner scan) {
  66.         RandomAccessFile raf = openFile(scan);
  67.         ArrayList<Double> sequence = new ArrayList<>();
  68.         try {
  69.             raf.seek(0);
  70.             String inputStr = raf.readLine();
  71.             inputStr = inputStr.trim();
  72.             String[] nums = inputStr.split("\\s+");
  73.             raf.close();
  74.             for(String num : nums) {
  75.                 double el = Double.parseDouble(num);
  76.                 sequence.add(el);
  77.             }
  78.         } catch (IOException err) {
  79.             System.out.println("Возникла ошибка при попытке считать массив из файла.");
  80.         }
  81.         return sequence;
  82.     }
  83.  
  84.     static boolean isFileCorrect(RandomAccessFile raf) {
  85.         boolean result = true;
  86.         try {
  87.             raf.seek(0);
  88.             String inputStr = raf.readLine();
  89.             inputStr = inputStr.trim();
  90.             String[] nums = inputStr.split("\\s+");
  91.             if(nums.length > 1) {
  92.                 int i = 0;
  93.                 while(result && i < nums.length) {
  94.                     String num = nums[i];
  95.                     double el = Double.parseDouble(num);
  96.                     if(el == Double.POSITIVE_INFINITY || el == Double.NEGATIVE_INFINITY)
  97.                         result = false;
  98.                     i++;
  99.                 }
  100.             } else
  101.                 result = false;
  102.         } catch (Exception err) {
  103.             result = false;
  104.         }
  105.         return result;
  106.     }
  107.  
  108.     static void showFileData(RandomAccessFile raf) throws IOException {
  109.         raf.seek(0);
  110.         String str = raf.readLine();
  111.         str = str.trim();
  112.         String[] arr = str.split("\\s+");
  113.         System.out.println("Массив, введенный в файл:");
  114.         for(String el : arr)
  115.             System.out.print(el + " ");
  116.         System.out.println("");
  117.     }
  118.  
  119.     static RandomAccessFile openFile(Scanner scan) {
  120.         String filePath;
  121.         boolean notCorrect = true;
  122.         RandomAccessFile raf = null;
  123.         while(notCorrect) {
  124.             System.out.println("Введите путь к файлу");
  125.             filePath = scan.nextLine();
  126.             try {
  127.                 raf = new RandomAccessFile(filePath, "r");
  128.                 if(isFileCorrect(raf)) {
  129.                     notCorrect = false;
  130.                     showFileData(raf);
  131.                 } else
  132.                     System.out.println("В файле должны присутствовать минимум два вещественных числа, разделенные одиночным пробелом и записанные в одну строку. Измените файл и повторите ввод.");
  133.             } catch (IOException err) {
  134.                 System.out.println("Произошла ошибка при чтении файла. Убедитесь, что такой файл существует и повторите ввод.");
  135.                 notCorrect = true;
  136.             }
  137.         }
  138.         return raf;
  139.     }
  140.  
  141.     static boolean isUserWantToSave(Scanner scan) {
  142.         System.out.println("Хотите сохранить результат в файл? [д/н]");
  143.         String choice = "";
  144.         boolean notCorrect = true;
  145.         while(notCorrect) {
  146.             choice = scan.nextLine();
  147.             if(choice.equals("д") || choice.equals("н"))
  148.                 notCorrect = false;
  149.             else
  150.                 System.out.println("Вы должны ввести либо [д], либо [н]");
  151.         }
  152.         return choice.equals("д");
  153.     }
  154.  
  155.     static void saveFile(Scanner scan, String result) {
  156.         if(isUserWantToSave(scan)) {
  157.             System.out.println("Введите имя файла");
  158.             String filePath = scan.nextLine();
  159.             try(FileWriter fw = new FileWriter(filePath)) {
  160.                 fw.write(result);
  161.                 System.out.print("Результат успешно сохранен.");
  162.             } catch (IOException err) {
  163.                 System.out.println("Произошла ошибка при попытке сохранить файл.");
  164.             }
  165.         }
  166.     }
  167.  
  168.     static boolean areValuesDifferent(ArrayList<Double> arr) {
  169.         boolean areDifferent = false;
  170.         double value = arr.get(0);
  171.         int i = 1;
  172.         while(!areDifferent && i < arr.size()) {
  173.             double el = arr.get(i);
  174.             if(el != value)
  175.                 areDifferent = true;
  176.             i++;
  177.         }
  178.         return areDifferent;
  179.     }
  180.  
  181.     static ArrayList<Double> inputSequence(Scanner scan, String inputType) {
  182.         if(inputType.equals("c"))
  183.             return inputSequenceFromConsole(scan);
  184.         return inputSequenceFromFile(scan);
  185.     }
  186.  
  187.     static void output(Scanner scan, ArrayList<Double> sequence) {
  188.         if(areValuesDifferent(sequence)) {
  189.             String maxEl = String.format("%.2f", findMaxEl(sequence, sequence.get(0), 0));
  190.             final String RESULT_MSG = "Максимальный элемент последовательности = " + maxEl;
  191.             System.out.println(RESULT_MSG);
  192.             saveFile(scan, RESULT_MSG);
  193.         } else
  194.             System.out.println("Массив состоит из одинаковых значений, найти максимальный элемент невозможно.");
  195.     }
  196.  
  197.     public static void main(String[] args) {
  198.         System.out.println("Данная программа находит максимальный элемент введенной последовательности.");
  199.         Scanner scan = new Scanner(System.in);
  200.         String inputType = chooseInputType(scan);
  201.         ArrayList<Double> sequence = inputSequence(scan, inputType);
  202.         output(scan, sequence);
  203.     }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement