• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Массив, сумма элементов соприкасающихся углами с максимальным элементом. Java

blazelott

Новые
Регистрация
3 Фев 2013
Сообщения
18
Реакции
0
Баллы
0
Массив, сумма элементов соприкасающихся углами с максимальным элементом. Java

Есть задача.
Создать функцию, определяющую в целочисленном прямоугольном массиве matrixnm сумму всех элементов, соприкасающихся углами с его максимальным элементом.
Написал под неё программу, но считает она не правильно. Помогите пожалуйста разобраться.
Код:
        int n, m, vector_min, vector_max, max, s;
        jTextArea1.setText(null);
        vector_min = Integer.parseInt(jTextField1.getText());
        vector_max = Integer.parseInt(jTextField2.getText());
        n = Integer.parseInt(jTextField3.getText());
        m = Integer.parseInt(jTextField4.getText());

        if (vector_min > vector_max) {
            JOptionPane.showMessageDialog(null, "максимальное должно быть больше минимального");
            return;
        }

        int vector[][] = new int[n][m];
        Random Rand = new Random();
        jTextArea1.append("Массив:" + "\n");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                vector[i][j] = Rand.nextInt(vector_max - vector_min + 1) + vector_min;
                jTextArea1.append(Integer.toString(vector[i][j]) + "  ");
            }
            jTextArea1.append("\n");
        }
        int jmax = 0,imax = 0,i,j;
        max = vector_min;
        for (i = 1; i < n; i++) {
            for (j = 1; j < m; j++) {
                if (max < vector[i][j]) {
                    max = vector[i][j];
                    imax = i;
                    jmax = j;
                }
            }
        }
            s = 0;
            //int imax, jmax;
            for (i = imax - 1; i < imax + 1; i++){
                for (j = jmax - 1; j < jmax + 1; j++){
                    if ((i > 0) && (i <= n) && (j > 0) && (j <= m) && !((i == imax) && (j == jmax))){
                    s = s + vector[i][j];
                }
                    
                }
                jTextArea1.append("max = " + Integer.toString(max));
            jTextArea1.append("sum = " + Integer.toString(s) + "\n");   
            }
 
Написал под неё программу, но считает она не правильно. Помогите пожалуйста разобраться.
А в чем неправильность? Вроде так на первый взгляд должно работать.
 
А в чем неправильность? Вроде так на первый взгляд должно работать.
Он не правильно считает. Берет какие то совсем левые цифры и складывает. Или вообще ноль выводит. И по идее он должен брать в расчет если макс значений несколько. Но он постоянно выводит 2 строки с подсчетом. Жаль я не могу скриншот привести.
 
min= 1 max= 9 n= 5
Массив:
3 8 9 8 9
1 1 7 5 8
1 8 3 2 9
4 2 8 8 4
1 8 7 2 9
max = 9sum = 15
 
Он не правильно считает. Берет какие то совсем левые цифры и складывает. Или вообще ноль выводит. И по идее он должен брать в расчет если макс значений несколько. Но он постоянно выводит 2 строки с подсчетом. Жаль я не могу скриншот привести.
Так, ну, во-первых, несколько макс значений он, может быть, и должен брать в расчет. По идее. Жаль только, что идея не реализована: в программе дело ограничится первым из попавшихся. Далее. При подсчете суммы в условиях
i < imax + 1;
j < jmax + 1;
неравенства следует брать НЕСТРОГИЕ, т.е <=.
 
Все равно считает не правильно.
Массив:
75 35 67 46 28
98 67 39 48 24
41 69 96 71 82
99 66 66 21 13
97 12 56 47 63
max = 96sum = 447
И иногда выскакивает ошибка:
Код:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 5
    at luch71.Luch71.jButton1ActionPerformed(Luch71.java:231)
    at luch71.Luch71.access$400(Luch71.java:16)
    at luch71.Luch71$5.actionPerformed(Luch71.java:84)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
 
Забыл сказать, он теперь не правильно и макс значение определяет.
 
Все равно считает не правильно.
Так, ну некоторый прогресс налицо. По крайней мере сумма чисел, окружающих 96, просчитана правильно. Вот только почему максимальное число определено неверно (должно быть 99), не знаю.
Выложите новый код - посмотрю. После обеда.
 
Код:
int n, m, vector_min, vector_max, max, s;
        jTextArea1.setText(null);
        vector_min = Integer.parseInt(jTextField1.getText());
        vector_max = Integer.parseInt(jTextField2.getText());
        n = Integer.parseInt(jTextField3.getText());
        m = Integer.parseInt(jTextField4.getText());

        if (vector_min > vector_max) {
            JOptionPane.showMessageDialog(null, "максимальное должно быть больше минимального");
            return;
        }

        int vector[][] = new int[n][m];
        Random Rand = new Random();
        jTextArea1.append("Массив:" + "\n");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                vector[i][j] = Rand.nextInt(vector_max - vector_min + 1) + vector_min;
                jTextArea1.append(Integer.toString(vector[i][j]) + "  ");
            }
            jTextArea1.append("\n");
        }
        int jmax = 0,imax = 0,i,j;
        max = vector_min;
        for (i = 1; i < n; i++) {
            for (j = 1; j < m; j++) {
                if (max < vector[i][j]) {
                    max = vector[i][j];
                    imax = i;
                    jmax = j;
                }
            }
        }
            s = 0;
            //int imax, jmax;
            for (i = imax - 1; i <= imax + 1; i++){
                for (j = jmax - 1; j <= jmax + 1; j++){
                    if ((i > 0) && (i <= n) && (j > 0) && (j <= m) && !((i == imax) && (j == jmax))){
                    s = s + vector[i][j];
                }
                    
                }
                 
            }
            jTextArea1.append("max = " + Integer.toString(max));
            jTextArea1.append("sum = " + Integer.toString(s) + "\n");
 
И сразу - вопрос:
Почему при поиске максимального элемента Вы индексируете массив с 1, в то время как при заполнении матрицы - с 0? Отсюда и ошибки при поиске максимума: во-первых, программа с считывает со второй строки и со второго столбца (отсюда пропущенные значения элементов), во-вторых, она не может найти строк и столбцов с максимальными индексами - отсюда эта простыня ошибок.
Поясняю на примере: допустим, Вы задаете матрицу 5х5. Но при вводе значений Вы гоняете i и j от 0 до 4, а при поиске максимума - от 1 до 5.
Приведите все части программы к единой индексации, и будет Вам счастье.
 
Исправил:
Код:
for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                vector[i][j] = Rand.nextInt(vector_max - vector_min + 1) + vector_min;
                jTextArea1.append(Integer.toString(vector[i][j]) + "  ");
            }
            jTextArea1.append("\n");
        }
        int jmax = 0,imax = 0,i,j;
        max = vector_min;
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= m; j++) {
                if (max < vector[i][j]) {
                    max = vector[i][j];
                    imax = i;
                    jmax = j;
                }
            }
        }
            s = 0;
            //int imax, jmax;
            for (i = imax - 1; i <= imax + 1; i++){
                for (j = jmax - 1; j <= jmax + 1; j++){
                    if ((i > 0) && (i <= n) && (j > 0) && (j <= m) && !((i == imax) && (j == jmax))){
                    s = s + vector[i][j];
                }
                    
                }
Но появился новый набор ошибок.
Вывод
Массив:
92 19 79 33

И сразу ошибки:
Код:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 5
    at luch71.Luch71.jButton1ActionPerformed(Luch71.java:210)
    at luch71.Luch71.access$400(Luch71.java:16)
    at luch71.Luch71$5.actionPerformed(Luch71.java:84)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Вот это 210 строка
Код:
vector[i][j] = Rand.nextInt(vector_max - vector_min + 1) + vector_min;
 
Исправил:
Но появился новый набор ошибок.
Вывод Массив: 92 19 79 33 И сразу ошибки:
К сожалению, тут я вряд ли смогу Вам помочь: я пишу только на Паскале, а на СИ да Яве могу только читать, и тонкостей этих языков и трансляторов не знаю. Единственное, что могу посоветовать - попробуйте нумерацию не с 1 по n, а с 0 по n-1. Только всюду исправьте. Помнится, в СИ положено с нуля нумеровать, может быть и в Яве также?
 
Благодарю за помощь. Все исправил, теперь работает.
Код:
 int vector[][] = new int[n][m];
        Random Rand = new Random();
        jTextArea1.append("Массив:" + "\n");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                vector[i][j] = Rand.nextInt(vector_max - vector_min + 1) + vector_min;
                jTextArea1.append(Integer.toString(vector[i][j]) + "  ");
            }
            jTextArea1.append("\n");
        }
        int jmax = 0,imax = 0,i,j;
        max = vector_min;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                if (max < vector[i][j]) {
                    max = vector[i][j];
                    imax = i;
                    jmax = j;
                }
            }
        }
            s = 0;
            //int imax, jmax;
            for (i = imax - 1; i <= imax + 1; i++){
                for (j = jmax - 1; j <= jmax + 1; j++){
                    if ((i >= 0) && (i < n) && (j >= 0) && (j < m) && !((i == imax) && (j == jmax))){
                    s = s + vector[i][j];
                }
                    
                }
 
Назад
Сверху