Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 02.03.2014
Сообщений: 11

Выход за пределы массива

20.02.2015, 15:31. Показов 8016. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи программисты! Была поставлена следующая задача:
"-Будем называть соседями элемента с индексами i,j некоторой матрицы такие элементы этой матрицы, соответствующие индексы которых отличаются от i,j не более чем на единицу. В методе main() объявить действительную квадратную матрицу А порядка n . Значение n и элементы матрицы передать из командной строки.

-Добавить в тот же класс метод, который для данной матрицы А формирует матрицу В из нулей и единиц, элемент которой равен единице, когда среди соседей соответствующего элемента матрицы А есть не менее двух совпадающих с ним самим, в противном случае элемент матрицы В равен нулю.

-Печать массива оформить в виде отдельного метода того же класса."

Программа компилируется, вывод А массива проходит успешно, но в методе neighbor(); возникают проблемы

Подскажите пожалуйста, что сделал не так? Как исправить?

Неделю прогаю на java, не судите строго

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Main{
    public static void main(String args[]){
    int n = Integer.parseInt(args[0]);
        int k=1;
    Double[][] A = new Double [n+1][n+1]; // двумерный массив A
    for(int i = 1; i <= n; i++)
       for(int j=1; j <= n; j++){
           A[i][j] = Double.parseDouble(args[k]);
           k++;
       }
        print(A, n);
        neighbor(A,n);
                
        }
        
        public static <Temp> void print(Temp new_A[][], int n){
                for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            System.out.println("A[" + i + "][" + j + "] = " + new_A[i][j]); 
        System.out.println();
    }
    
    public static void neighbor(Double new2_A[][], int n){ // метод преобразования A -> B
    Byte[][] B = new Byte [n+1][n+1]; // новый массив B из нулей и единиц
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
        {
            int d=0;
            for(int t = i-1; t<i+2; t++)
                for(int s = j-1; s<j+2; s++)
                {
                if((t!=i)&&(s!=j)) if(new2_A[i][j] == new2_A[t][s]) d++;
                }
                if(d>=2) B[i][j] =1;
                else B[i][j]=0;
                
        
        
        }
        print(B, n);
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2015, 15:31
Ответы с готовыми решениями:

Выход за пределы массива
Выдает ошибку &quot;Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException: 8&quot; в строке, подскажите пожалуйста, в чем может быть...

Выход за пределы массива
Выход за пределы массива, подскажите как исправить чтоб выводился список! package com.example.stracking; import...

Выход за пределы массива
Когда происходит упорядочивание четных элементов алгоритм выходит за пределы массива #include &lt;stdio.h&gt; #include...

4
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
21.02.2015, 13:44
У вас везде используется перебор i, j от 1 до n:
Java
1
for(int i = 1; i <= n; i++)
А элементы в массиве индексируются от 0 до n-1. В Java нельзя как в Pascal указать другие индексы отличные от от 0 до n-1. То есть либо написать так:
Java
1
for(int i = 0; i < n; i++)
либо при обращении к элементам массива писать, например, так:
Java
1
new_A[i-1][j-1]
P.S. не совсем понял зачем у вас в 24 строке создается массив размерностью n+1
1
0 / 0 / 0
Регистрация: 02.03.2014
Сообщений: 11
21.02.2015, 18:09  [ТС]
Спасибо вам за ответ! За день подправил код, за массив уже не выхожу, но алгоритм метода поиска соседей все еще неправильно работает, так и не смог разобраться, как лечить

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Main{
    public static void main(String args[]){
    int n = Integer.parseInt(args[0]);
        int k=1;
    Double[][] A = new Double [n][n]; // двумерный массив A  
    for(int i = 0; i < n; i++)  
       for(int j=0; j < n; j++){
           A[i][j] = Double.parseDouble(args[k]);  //заполняем массив значениями
           k++;
       }
                System.out.println("");
        System.out.println("Массив А:");
        print(A, n);
        neighbor(A,n);
                
        }
        
        public static <Temp> void print(Temp new_A[][], int n){
                for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            System.out.println("mas[" + i + "][" + j + "] = " + new_A[i][j]);   
        System.out.println();
    }
    
public static void neighbor(Double new2_A[][], int n){ // метод преобразования A -> B
    Integer[][] B = new Integer [n][n]; // новый массив B из нулей и единиц
    int d=0;
    for(int i = 0; i < n; i++) // циклы пробега по элементам
        for(int j = 0; j < n; j++){
            d=0;
            for(int t = i - 1; t < i + 2; t++) // циклы пробега по соседям элемента
                for(int s= j - 1; s < j + 2; s++){
                    if(t<0)t=0; if(s<0)s=0; if((t>n-1) || (s>n-1)) break; // ограниваем массив по краям
                if( ((t!=i) && (s!=j)) ) // не учитывать элемент собственным соседом
                    {if(new2_A[i][j] == new2_A[t][s]) d++;}
                }
                if(d>=2) B[i][j] = 1;
            else B[i][j] = 0;
        }
                System.out.println("Массив B:");
            print(B, n);                
    }
}
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
21.02.2015, 21:41
Лучший ответ Сообщение было отмечено stalker033 как решение

Решение

stalker033,

Решение
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
 * Created by reisal78 on 21.02.2015.
 */
public class Matrix{
 
    private Double[][] matrix;
    final int MATRIX_SIZE;
 
    /**
     * Инициализирует матрицу используя параметры командной строки.
     * @param args Массив строковых параметров, полученных из командной строки. args[0] - размерность матрицы,
     *             следующие параметры - элементы
     */
    public Matrix(String [] args) {
        this.matrix = createMatrix(args);
        MATRIX_SIZE = matrix.length;
    }
 
    /**
     * Задает основную матрицу
     * @param matrix инициализированный и заполненный массив
     */
    public Matrix(Double[][] matrix) {
        this.matrix = matrix;
        MATRIX_SIZE = matrix.length;
    }
 
    /**
     * Метод инициализирует матрицу используя параметры командной строки.
     *
     * @param args Массив строковых параметров, полученных из командной строки. args[0] - размерность матрицы,
     *             следующие параметры - элементы
     * @return Double[][] инициализированный и заполненный массив
     * @throws java.lang.NumberFormatException если в качестве парамерта строки передано "нечисло"
     */
    private Double[][] createMatrix(String[] args) {
        Double[][] matrix = null; // двумерный массив A
        try {
            final int MATRIX_SIZE = Integer.parseInt(args[0]);
 
            if (((args.length - 1) / MATRIX_SIZE) != MATRIX_SIZE) {
                System.out.println("Неверно задана размерность матрицы, или количество элементов");
                System.exit(-1);
            }
            int count = 1;
            matrix = new Double[MATRIX_SIZE][MATRIX_SIZE];
            for (int i = 0; i < MATRIX_SIZE; i++)
                for (int j = 0; j < MATRIX_SIZE; j++) {
                    matrix[i][j] = Double.parseDouble(args[count]);
                    count++;
                }
 
        } catch (NumberFormatException e) {
            System.out.println("Неверный формат элемента матрицы");
            System.exit(-1);
        }
        return matrix;
    }
 
    /**
     * Выводит значения элементов основной матрицы в консоль
     */
    public void printMatrix() {
        printMatrix(matrix);
    }
 
    /**
     * Выводит значения элементов матрицы в консоль
     */
    public static <T> void printMatrix(T [][] matrix) {
        final int MATRIX_SIZE = matrix.length;
        System.out.println("-------------------------");
        for (int i = 0; i < MATRIX_SIZE; i++) {
            System.out.print("|");
            for (int j = 0; j < MATRIX_SIZE; j++)
                System.out.print("\t" + matrix[i][j] + "\t");
            System.out.print("|");
            System.out.println();
        }
        System.out.println("-------------------------\n");
    }
 
    /**
     * Метод формирует матрицу из нулей и единиц, элемент которой равен единице, когда среди соседей
     * соответствующего элемента основной матрицы есть не менее двух совпадающих с ним самим,
     * в противном случае элемент матрицы В равен нулю.
     */
    public  Integer[][] getMatrixB() {
        Integer[][] matrixB = new Integer[MATRIX_SIZE][MATRIX_SIZE];
 
        for (int i = 0; i < MATRIX_SIZE; i++)
            for (int j = 0; j < MATRIX_SIZE; j++) {
                matrixB[i][j] = checkMatch(i, j) ? 1 : 0;
            }
        return matrixB;
    }
 
 
    /**
     * Метод проверяет наличие не менее двух соседних элементов совпадающих с проверяемым элементом
     * @param x номер элемента
     * @param y номер элемента
     * @return результат проверки
     */
    private boolean checkMatch(int x, int y) {
        int count = 0;
        for (int i = x - 1; i < x + 2; i++) {
            if (i >= 0 && i < MATRIX_SIZE) {
                for (int j = y - 1; j < y + 2; j++) {
                    if (j >= 0 && j < MATRIX_SIZE) {
                        if (matrix[x][y].equals(matrix[i][j])) {
                            if (++count > 2)
                                return true;
                        }
                    }
                }
            }
        }
        return false;
    }
 
    /**
     * Точка входа в класс и приложение
     *
     * @param args Массив строковых параметров
     */
    public static void main(String args[]) {
        Matrix matrix;
        if (args.length == 0) {
            Double[][] matrixA = {
                    {1.0, 2.0, 3.9},
                    {3.0, 1.0, 2.3},
                    {1.0, 2.3, 2.3}
            };
 
            matrix = new Matrix(matrixA);
        } else {
            matrix = new Matrix(args);
        }
 
        //Вывожу массив
        matrix.printMatrix();
 
        //Создаю массив B, на основе массива A
        Integer[][] matrixB = matrix.getMatrixB();
 
        //Вывожу массив B
        matrix.printMatrix(matrixB);
    }
 
 
}
2
0 / 0 / 0
Регистрация: 02.03.2014
Сообщений: 11
22.02.2015, 09:34  [ТС]
Спасибо за ваш ответ! Все понятно кроме строки 93, можете объяснить пожалуйста что там происходит?

Добавлено через 8 минут
Все, разобрался, спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2015, 09:34
Помогаю со студенческими работами здесь

Выход за пределы массива
в одном из обучающих видео уроков наткнулся на ТАКОЕ. алгоритм sort получает в себя начало и конец массива, далее просто выведится...

Выход за пределы массива
Заполняю динамический массив случайными числами и вывожу его на экран. Дебажная куча жалуется на использование чужой памяти. Не могу найти...

Выход за пределы массива
#include &lt;assert.h&gt; #include &lt;assert.h&gt; #include &lt;string.h&gt; #include &lt;stdint.h&gt; #include &lt;limits.h&gt; int get_bit(const void...

Выход за пределы массива
По мойму нарушение границ массива в c++ не допускается. Это будет выход за пределы массива и попытка записать элемент в какуюто другую...

Выход за пределы массива
В 7 строке выдает ошибку выхода за пределы массива. Никак не могу понять в чем ошибка def kvadrat(size): width=cell/(size*size*4) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru