На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Работа с массивами и файлами , Поиск столбцов с отрицательными элементами
    Добрый вечер! Нужно считать исходный массив из файла, составить массив с результатами и записать последний в файл.

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

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

    Код класса:
    ExpandedWrap disabled
      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();
          }
      }


    Код основной функции:
    ExpandedWrap disabled
      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);
          }
       
      }


    Добавлено
    Результат работы программы:
    ExpandedWrap disabled
      Выберите способ ввода массива:
      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
      Запись результата в файл


    Файл после записи результатов:
    ExpandedWrap disabled
      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
      1) "больше нуля" - это >,а не >=
      2) Произведение нескольких int может дать значение, превышающее максимальное значение 2 147 483 647, и может рассматриваться как отрицательное (при единичном старшем бите)

      Переход на long (64 бита) немного сгладит проблему, но не решит её, поэтому стоит использовать в произведении знак числа (sign в Java есть?)
      Сообщение отредактировано: MBo -
        Цитата iVovan1996 @
        а при записи результатов в файл указатель не перешёл на новую строку, хотя символ переноса был дважды добавлен с помощью append.

        В Windows для переноса строк используется сочетание двух символов: "\r\n"
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0332 ]   [ 14 queries used ]   [ Generated: 9.11.24, 00:02 GMT ]