Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Массив, сумма элементов соприкасающихся углами с максимальным элементом. Java (http://www.tehnari.ru/f41/t106011/)

blazelott 24.12.2015 11:53

Массив, сумма элементов соприкасающихся углами с максимальным элементом. 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"); 
            }


Vladimir_S 24.12.2015 12:15

Цитата:

Сообщение от blazelott (Сообщение 1191904)
Написал под неё программу, но считает она не правильно. Помогите пожалуйста разобраться.

А в чем неправильность? Вроде так на первый взгляд должно работать.

blazelott 24.12.2015 12:30

Цитата:

Сообщение от Vladimir_S (Сообщение 1191915)
А в чем неправильность? Вроде так на первый взгляд должно работать.

Он не правильно считает. Берет какие то совсем левые цифры и складывает. Или вообще ноль выводит. И по идее он должен брать в расчет если макс значений несколько. Но он постоянно выводит 2 строки с подсчетом. Жаль я не могу скриншот привести.

blazelott 24.12.2015 12:31

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

Vladimir_S 24.12.2015 12:41

Цитата:

Сообщение от blazelott (Сообщение 1191918)
Он не правильно считает. Берет какие то совсем левые цифры и складывает. Или вообще ноль выводит. И по идее он должен брать в расчет если макс значений несколько. Но он постоянно выводит 2 строки с подсчетом. Жаль я не могу скриншот привести.

Так, ну, во-первых, несколько макс значений он, может быть, и должен брать в расчет. По идее. Жаль только, что идея не реализована: в программе дело ограничится первым из попавшихся. Далее. При подсчете суммы в условиях
i < imax + 1;
j < jmax + 1;
неравенства следует брать НЕСТРОГИЕ, т.е <=.

blazelott 24.12.2015 13:04

Все равно считает не правильно.
Массив:
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)


blazelott 24.12.2015 13:05

Забыл сказать, он теперь не правильно и макс значение определяет.

Vladimir_S 24.12.2015 13:09

Цитата:

Сообщение от blazelott (Сообщение 1191938)
Все равно считает не правильно.

Так, ну некоторый прогресс налицо. По крайней мере сумма чисел, окружающих 96, просчитана правильно. Вот только почему максимальное число определено неверно (должно быть 99), не знаю.
Выложите новый код - посмотрю. После обеда.

blazelott 24.12.2015 13:12

Код:

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");


Vladimir_S 24.12.2015 14:20

И сразу - вопрос:
Почему при поиске максимального элемента Вы индексируете массив с 1, в то время как при заполнении матрицы - с 0? Отсюда и ошибки при поиске максимума: во-первых, программа с считывает со второй строки и со второго столбца (отсюда пропущенные значения элементов), во-вторых, она не может найти строк и столбцов с максимальными индексами - отсюда эта простыня ошибок.
Поясняю на примере: допустим, Вы задаете матрицу 5х5. Но при вводе значений Вы гоняете i и j от 0 до 4, а при поиске максимума - от 1 до 5.
Приведите все части программы к единой индексации, и будет Вам счастье.


Часовой пояс GMT +4, время: 15:09.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.