Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Работа с массивами и файлами


Автор: iVovan1996 08.11.20, 14:42
Добрый вечер! Нужно считать исходный массив из файла, составить массив с результатами и записать последний в файл.

Дана матрица А(5Х5). Определить массив Х из 5 элементов, каждый из которых равен 1, если произведение элементов соответствующего столбца больше нуля, и –1 в противном случае.

При тестировании кода возникли проблемы: второй и третий элемент массива результатов почему-то заминусились, а при записи результатов в файл указатель не перешёл на новую строку, хотя символ переноса был дважды добавлен с помощью append. Укажите ошибки и способы их устранения. Работаю в eclipse.

Код класса:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    package com.lab2;
     
    import java.util.InputMismatchException;
    import java.util.Scanner;
    import java.io.*;
     
    public class ReadWriteFile {
        private static int n;
        private static int m;
        
        public static int[][] inputSelect () {
            int[][] arr = null;
            int index = -1;
            Scanner scan = new Scanner(System.in);
            System.out.println("Выберите способ ввода массива:");
            System.out.println("0. Из файла");
            System.out.println("1. С клавиатуры");
            index = scan.nextInt();
            switch (index) {
            case 0:
                arr = inputFromFile("C:\\Users\\Владимир\\eclipse-workspace\\myMatrix.TXT");
                break;
            case 1:
                arr = inputFromKeyboard();
                break;
            default:
                System.out.println("Неверный ввод!");
            }
            scan.close();
            return arr;
        }
        
        public static int[][] inputFromFile(String path) {
            int[][] arr = null;
            try {
                try (Scanner in = new Scanner(new File(path))) {
                    n = in.nextInt();
                    m = in.nextInt();
                    arr = new int[n][m];
                    for (int i = 0; i < n; i++) {
                        for (int j = 0; j < m; j++) {
                            arr[i][j] = in.nextInt();
                        }
                    }
                    in.close();
                }
            } catch (FileNotFoundException e) {
            System.out.println("Ошибка " + e + "! файл " + path + " не найден!");
            } catch (InputMismatchException e) {
            System.out.println("Ошибка " + e + "! Несоответствие типов данных!");
            }
            return arr;
        }
        
        public static int[][] inputFromKeyboard() {
            int[][] arr = null;
            Scanner scan = new Scanner(System.in);
            System.out.println("Укажите количество строк массива:");
            n = scan.nextInt();
            System.out.println("Укажите количество столбцов массива:");
            m = scan.nextInt();
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    System.out.println("Введите элемент " + i + "-й строки " + j + "-го столбца:");
                    arr[i][j] = scan.nextInt();
                }
            }
            scan.close();
            return arr;
        }
        
        public static void outArray(int[][] array) {
            System.out.println("Вывод исходного массива:");
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if(j == m-1) {
                        System.out.print(array[i][j] + "\n");
                    } else {
                        System.out.print(array[i][j] + " ");
                    }
                }
            }
        }
        
        public static int[] getResult(int[][] array) {
            int count;
            int[] X = new int[m];
            for (int i = 0; i < m; i++) {
                count = 1;
                for (int j = 0; j < n; j++) {
                    count *= array[j][i];
                }
                X[i] = (count >= 0) ? 1 : -1;
            }
            return X;
        }
        
        public static void outResult(int[] X) {
            System.out.println("Вывод результата:");
            for (int i = 0; i < m; i++) {
                if (i == m-1) {
                    System.out.print(X[i] + "\n");
                } else {
                    System.out.print(X[i] + " ");
                }
            }
        }
        
        public static void writeResult(int[] X) throws Exception {
            System.out.println("Запись результата в файл");
            FileWriter writer = new FileWriter("C:\\Users\\Владимир\\eclipse-workspace\\myMatrix.TXT", true);
            writer.append('\n');
            writer.append('\n');
            for (int i = 0; i < m; i++) {
                if (i == m-1) {
                    writer.append(X[i] + "\n");
                } else {
                    writer.append(X[i] + " ");
                }
            }
            writer.close();
        }
    }


Код основной функции:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    package com.lab2;
     
    import java.util.Scanner;
     
    public class MainApp {
     
        public static void main(String[] args) throws Exception {
            ReadWriteFile myVar = new ReadWriteFile();
            int[][] myMatrix = myVar.inputSelect();
            myVar.outArray(myMatrix);
            int[] X = myVar.getResult(myMatrix);
            myVar.outResult(X);
            myVar.writeResult(X);
        }
     
    }


Добавлено
Результат работы программы:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Выберите способ ввода массива:
    0. Из файла
    1. С клавиатуры
    0
    Вывод исходного массива:
    11 24 323 7 2345
    42 53 6 234 4
    73 84 94 0 3432
    45 673 34 98 3245
    0 345 5546 4564 6565
    Вывод результата:
    1 -1 -1 1 1
    Запись результата в файл


Файл после записи результатов:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    5 5
    11 24 323 7 2345
    42 53 6 234 4
    73 84 94 0 3432
    45 673 34 98 3245
    0 345 5546 4564 65651 -1 -1 1 1

Автор: MBo 08.11.20, 15:16
1) "больше нуля" - это >,а не >=
2) Произведение нескольких int может дать значение, превышающее максимальное значение 2 147 483 647, и может рассматриваться как отрицательное (при единичном старшем бите)

Переход на long (64 бита) немного сгладит проблему, но не решит её, поэтому стоит использовать в произведении знак числа (sign в Java есть?)

Автор: korvin 09.11.20, 06:57
Цитата iVovan1996 @
а при записи результатов в файл указатель не перешёл на новую строку, хотя символ переноса был дважды добавлен с помощью append.

В Windows для переноса строк используется сочетание двух символов: "\r\n"

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)