Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот слоев в матрице 
:(
    Опции темы
Merhaba
Дата 23.4.2011, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Доброе Утро!
Помогите Пожалуйста доработать программу:
Назовем 1-слоем (целочисленного) двумерного массива размером n*m элементы, 
составляющие (последовательно) его первую строку, крайний правый столбец, 
последнюю строку, крайний левый столбец. Назовём 2-слоем массива 1-слой
подмассива, получающегося в результате удаления 1-слоя из исходного массива.
Аналогичным образом определим 3-слой, 4-слой,... к-слой (k <=min (n/2, m/2)).
Напишите программу, которая в массиве, имеющем р слоев, выполняет поворот по часовой стрелке 1-слоя на р элементов, 2-слоя на р-1 элементов и т.д.

Мой код: 
Код

import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;
 
 
public class WorkWithMatrix {
 
 
   public static void main(String[] args) throws Exception {
       Matrix mt = new Matrix();
       mt.printShiftedMatrix();
   }
}
 
class Matrix { // Класс, в котором содержаться методы, решающие поставленную задачу
  double[][] array; // Двумерный массив вещественных чисел
  int n; // количество строк в массиве
  int m; // количество столбцов в массиве
  int k; // количество слоев в матрице
  public Matrix() throws IOException { // Конструктор, чтение из файла размера
                                       // массива
     // и его элементов
     FileReader fin = new FileReader("input.txt"); // Чтение из файла. fin -
                                                   // file input
     Scanner scr = new Scanner(fin); // Чтение из файла
     n = scr.nextInt(); // строка массива
     m = scr.nextInt(); // столбец массива
     array = new double[n][m]; // вещественный элемент массива
 
     scr.useLocale(Locale.US); // использование точки в качестве разделителя
 
     for (int i = 1; i < n; i++) { // цикл, считывающий элементы массива
        for (int j = 1; j < m; j++) {
           array[i][j] = scr.nextDouble();
        } // for (int j... )
     } // for (int i... )
 
     fin.close(); // Метод, который закрывает файл
 
  } // constructor Matrix()
 
   double ShearLayersInTheMatrix(){
     double b;
     int i, j;
     double result = 0;
     if(n < m) {k = n;} else {k = m;}
     k = k/2;//количество слоев
     while (k > 0){//цикл с уменьшением числа слоев дает нужный сдвиг каждого слоя
     for(i = 1; i< k; i++){//цикл по слоям, от внешнего к внутреннему
     b = array [i][i]; //сохраняем левый верхний элемент
     for (j =i; j< n-i; j++){ array[j][i] = array[j+1][i];} //поэлементно двигаем левую сторону слоя вверх на одну позицию
     for (j =i; j > m-i; j++) {array[n-i+1][j]= array[n-i+1][j+1];}//двигаем нижнюю сторону влево
     for (j =n-i; j>= i; j--){ array[j+1][m-i+1]= array[j][m-i+1];}//двигаем правую сторону вниз
     for (j =m-i;j >= i+1; j--){ array[i][j+1]= array[i][j];}//двигаем верхнюю сторону вправо кроме последнего элемента
     array[i][i+1]= b;//кладем сохраненный элемент во вторую позицию верхней стороны слоя
      result = array[i][j];  }
     k--; //уменьшаем количество сдвигаемых слоев
      }
     return result;
      }
 
   void printShiftedMatrix() throws IOException, Exception { // Метод, создающий файл и записывающий туда результаты
   PrintWriter fout = new PrintWriter("a.txt"); // Запись вычисленное суммы в файл. Класс - PrintWriter
   fout.println(ShearLayersInTheMatrix()); // Метод, который выводит в файл полученные результаты
   fout.flush(); // Метод, который выполняет очистку буфера
   fout.close(); // Метод, который закрывает файл
} // print...
} 

Выдаёт:
Код

Exception in thread "main" java.util.InputMismatchException
       at java.util.Scanner.throwFor(Scanner.java:840)
       at java.util.Scanner.next(Scanner.java:1461)
       at java.util.Scanner.nextInt(Scanner.java:2091)
       at java.util.Scanner.nextInt(Scanner.java:2050)
       at laba3_121.Matrix.<init>(WorkWithMatrix.java:39)
       at laba3_121.WorkWithMatrix.main(WorkWithMatrix.java:22)
Java Result: 1

PM MAIL   Вверх
_Y_
Дата 23.4.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Чтобы без большого напряга воспроизвести ошибку хотелось бы еще и файл данных.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Stolzen
Дата 23.4.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Вам самому-то понятен код? 


Так понятнее
Код


import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;


public class WorkWithMatrix {
    public static void main(String[] args) throws Exception {
        Matrix mt = new Matrix("input.txt");
        
        //OutputStream os = new FileOutputStream("a.txt");
        OutputStream os = System.out;
        mt.printShiftedMatrix(os);
    }
}

//Класс, в котором содержаться методы, решающие поставленную задачу
class Matrix { 
    double[][] array; // Двумерный массив вещественных чисел
    int n; // количество строк в массиве
    int m; // количество столбцов в массиве
    int k; // количество слоев в матрице

    // Конструктор, чтение из файла размера
    // массива
    public Matrix(String filename) throws IOException {
        // и его элементов
        FileReader fin = new FileReader(filename); 
        Scanner scr = new Scanner(fin); // Чтение из файла
        n = scr.nextInt(); // строка массива
        m = scr.nextInt(); // столбец массива
        array = new double[n][m]; // вещественный элемент массива

        scr.useLocale(Locale.US); // использование точки в качестве разделителя

        for (int i = 1; i < n; i++) { // цикл, считывающий элементы массива
            for (int j = 1; j < m; j++) {
                array[i][j] = scr.nextDouble();
            } // for (int j... )
        } // for (int i... )

        fin.close(); // Метод, который закрывает файл

    } // constructor Matrix()

    double shearLayersInTheMatrix() {
        double b;
        int i, j;
        double result = 0;
        
        if (n < m) {
            k = n;
        } else {
            k = m;
        }
        
        k = k / 2;// количество слоев
        
        // цикл с уменьшением числа слоев дает нужный сдвиг
        // каждого слоя
        while (k > 0) {
            
            // цикл по слоям, от внешнего к внутреннему
            for (i = 1; i < k; i++) {
                
                b = array[i][i]; // сохраняем левый верхний элемент
                
                // поэлементно двигаем левую сторону слоя вверх на одну
                // позицию
                for (j = i; j < n - i; j++) {
                    array[j][i] = array[j + 1][i];
                } 
                
                // двигаем нижнюю сторону влево
                for (j = i; j > m - i; j++) {
                    array[n - i + 1][j] = array[n - i + 1][j + 1];
                }
                
                // двигаем правую сторону вниз
                for (j = n - i; j >= i; j--) {
                    array[j + 1][m - i + 1] = array[j][m - i + 1];
                }
                
                // двигаем верхнюю сторону вправо кроме последнего элемента
                for (j = m - i; j >= i + 1; j--) {
                    array[i][j + 1] = array[i][j];
                }
                // кладем сохраненный элемент во вторую
                // позицию верхней стороны слоя
                array[i][i + 1] = b;
                result = array[i][j];
            }
            
            k--; // уменьшаем количество сдвигаемых слоев
        }
        return result;
    }

    // Метод, создающий файл и записывающий туда результаты
    void printShiftedMatrix(OutputStream os) throws IOException, Exception {
        // Запись вычисленное суммы в файл. Класс - PrintWriter
        PrintWriter fout = new PrintWriter(os); 
        // Метод, который выводит в файл полученные результаты
        fout.println(shearLayersInTheMatrix()); 
        fout.flush(); 
        fout.close(); 
    } 
}


Ввел в файл следующие данные:
Код

3 3
1 1 1 
1 1 1
1 1 1


Выдало 0.0. Это правильный ответ? 

Да, определенно нужны входные данные.

Добавлено @ 11:05
http://download.oracle.com/javase/1.5.0/do...hException.html
InputMismatchException
Цитата
Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected type, or that the token is out of range for the expected type. 


Это сообщение отредактировал(а) Stolzen - 23.4.2011, 11:06


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Merhaba
Дата 23.4.2011, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



_Y_, 
5 6
8.2    15.7   -3.14   12      -4.8    -7.2
-1.08  2.15   -11.04  -8.465  -9.0    23.44
7.41   25.3   0.01    2.26    -14.72  5.6
6.28   7.90   0.001   2.2     2.21    -1.8
2.14   16.24  -2.2    2.3     -9.01   -6.58

PM MAIL   Вверх
Stolzen
Дата 24.4.2011, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



У меня нормально данные считываются.

Но ошибка все равно есть:
Код

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at matr.Matrix.shearLayersInTheMatrix(WorkWithMatrix.java:86)
    at matr.Matrix.printShiftedMatrix(WorkWithMatrix.java:109)
    at matr.WorkWithMatrix.main(WorkWithMatrix.java:18)


Вот тут происходит выход за пределы массива:
Код

    // двигаем правую сторону вниз
    for (j = n - i; j >= i; j--) {
        array[j + 1][m - i + 1] = array[j][m - i + 1];
    }


Это сообщение отредактировал(а) Stolzen - 24.4.2011, 08:30


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.