Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.88.141] |
|
Сообщ.
#1
,
|
|
|
Добрый вечер! Нужно считать исходный массив из файла, составить массив с результатами и записать последний в файл.
Дана матрица А(5Х5). Определить массив Х из 5 элементов, каждый из которых равен 1, если произведение элементов соответствующего столбца больше нуля, и –1 в противном случае. При тестировании кода возникли проблемы: второй и третий элемент массива результатов почему-то заминусились, а при записи результатов в файл указатель не перешёл на новую строку, хотя символ переноса был дважды добавлен с помощью append. Укажите ошибки и способы их устранения. Работаю в eclipse. Код класса: 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(); } } Код основной функции: 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); } } Добавлено Результат работы программы: Выберите способ ввода массива: 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 Запись результата в файл Файл после записи результатов: 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 |
Сообщ.
#2
,
|
|
|
1) "больше нуля" - это >,а не >=
2) Произведение нескольких int может дать значение, превышающее максимальное значение 2 147 483 647, и может рассматриваться как отрицательное (при единичном старшем бите) Переход на long (64 бита) немного сгладит проблему, но не решит её, поэтому стоит использовать в произведении знак числа (sign в Java есть?) |
Сообщ.
#3
,
|
|
|
Цитата iVovan1996 @ а при записи результатов в файл указатель не перешёл на новую строку, хотя символ переноса был дважды добавлен с помощью append. В Windows для переноса строк используется сочетание двух символов: "\r\n" |