Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 24.12.2015, 11:53   #1 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Массив, сумма элементов соприкасающихся углами с максимальным элементом. 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");   
            }
blazelott вне форума   Ответить с цитированием

Старый 24.12.2015, 11:53
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

По содержанию ваша тема имеет сходства с данными обсуждениями

Какие языки были до Java? Точнее был же java или в точности java-подобный язык?
Массив. Pascal или Java
Дан одномерный целочисленный массив из N элементов
Дан массив A(n,m). Найти количество элементов в каждой строке, меньшего диагонального

Старый 24.12.2015, 12:15   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от blazelott Посмотреть сообщение
Написал под неё программу, но считает она не правильно. Помогите пожалуйста разобраться.
А в чем неправильность? Вроде так на первый взгляд должно работать.
Vladimir_S вне форума   Ответить с цитированием
Старый 24.12.2015, 12:30   #3 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
А в чем неправильность? Вроде так на первый взгляд должно работать.
Он не правильно считает. Берет какие то совсем левые цифры и складывает. Или вообще ноль выводит. И по идее он должен брать в расчет если макс значений несколько. Но он постоянно выводит 2 строки с подсчетом. Жаль я не могу скриншот привести.
blazelott вне форума   Ответить с цитированием
Старый 24.12.2015, 12:31   #4 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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
blazelott вне форума   Ответить с цитированием
Старый 24.12.2015, 12:41   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 24.12.2015, 13:04   #6 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Все равно считает не правильно.
Массив:
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   #7 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Забыл сказать, он теперь не правильно и макс значение определяет.
blazelott вне форума   Ответить с цитированием
Старый 24.12.2015, 13:09   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от blazelott Посмотреть сообщение
Все равно считает не правильно.
Так, ну некоторый прогресс налицо. По крайней мере сумма чисел, окружающих 96, просчитана правильно. Вот только почему максимальное число определено неверно (должно быть 99), не знаю.
Выложите новый код - посмотрю. После обеда.
Vladimir_S вне форума   Ответить с цитированием
Старый 24.12.2015, 13:12   #9 (permalink)
blazelott
Member
 
Регистрация: 03.02.2013
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
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");
blazelott вне форума   Ответить с цитированием
Старый 24.12.2015, 14:20   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.