Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Amabile opus
14 / 12 / 2
Регистрация: 08.01.2019
Сообщений: 133
1

Сортировка массива. Ошибка вывода отсортированного массива

09.12.2019, 00:15. Показов 1160. Ответов 6
Метки нет (Все метки)

Задание: В произвольной матрице отсортировать по убыванию элементы последовательности, расположенные после второго отрицательного числа.

Что сделано?
- Заполнение матрицы случайного размера (от 2 до 10 строк/столбцов) случайными числами от -10 до 10
- Заполнение вектора всеми числами, что следуют после второго отрицательного числа. (Ошибок не замечено пока что).
- Сортировка вектора.

Где ошибка?
Ошибка в том, что при переносе значений вектора в матрицу, т.е. при перезаписи всех чисел после второго отрицательного, пишет некорректно - начинает перезапись после третьего отрицательного. Перепробовано много способов, но моей внимательности моих знаний не хватает, чтобы починить.

P.S.: Знаю, что не использую возможности языка на полную и (возможно) где-то изобретаю кривой велосипед. Если кто подскажет мои косяки и способы их устранения, то у меня совсем счастье наступит.

Сам код:
Кликните здесь для просмотра всего текста

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
package lab4;
 
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
 
public class Lab4_5 {
    public static void main(String[]args)
    {
        int min = -100, max = 100, tempCnt = 0, i, j, vecInd = 0;
        int m = ThreadLocalRandom.current().nextInt(2, 10 + 1);
        int n = ThreadLocalRandom.current().nextInt(2, 10 + 1);
        int[][] arr = new int [m][n];
        Vector<Integer> vec = new Vector<Integer>();
        
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                arr[i][j] = ThreadLocalRandom.current().nextInt(min, max + 1);
                if (arr[i][j]<0)
                    tempCnt++;
                if (tempCnt > 2)
                {
                    vec.add(arr[i][j]);
                }
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println("\n");
        }
        
        System.out.println("\n----------------------------------------------------------------");
        Collections.sort(vec, Collections.reverseOrder());
        tempCnt = 0;
        for (i = 0; i<m; i++)
        {
            for (j = 0; j<n; j++)
            {
                if ((arr[i][j]<0))
                    tempCnt++;
                if (tempCnt > 2)
                {
                    arr[i][j] = vec.get(vecInd);
                    vecInd++;
                }
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println("\n");
        }
        System.out.println("\n----------------------------------------------------------------");
 
        for(i=0; i<vec.size(); i++)
            System.out.print(vec.get(i) + "\t");
        
        vec.clear();
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2019, 00:15
Ответы с готовыми решениями:

Сортировка слиянием: выводит нули вместо отсортированного массива чисел
Ребят. Добрый вечер. Попытался написать код сортировки на основе этого псевдокода. Не дописал...

Сортировка массива и вывод половины отсортированного массива (Объясните код)
Нужно очень детальное описание кода (знаю что код сортирует массив и выводит половину...

Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива
//Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива...

Неполадки с копированием массива и выводом копии отсортированного массива
Шалом, говорит снова чайник, который пишет лабораторную. Итак, проблема состоит в том, что на...

__________________

Записывайтесь на профессиональные курсы Java-разработчиков
Обучение в Java Mentor с оплатой после трудоустройства
6
3041 / 2538 / 782
Регистрация: 05.07.2013
Сообщений: 12,287
09.12.2019, 11:34 2
Цитата Сообщение от 4eDo Посмотреть сообщение
В произвольной матрице отсортировать по убыванию элементы последовательности, расположенные после второго отрицательного числа.
это как, где в матрице последовательность?
0
Amabile opus
14 / 12 / 2
Регистрация: 08.01.2019
Сообщений: 133
09.12.2019, 11:45  [ТС] 3
xoraxax, А чёрт его знает - как мне задачу поставили, так и поставили. Я считаю это как все последующие элементы массива.
0
6 / 5 / 1
Регистрация: 22.11.2019
Сообщений: 60
09.12.2019, 11:51 4
Лучший ответ Сообщение было отмечено 4eDo как решение

Решение

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
        int min = -100, max = 100, tempCnt = 0, i, j, vecInd = 0;
        int m = ThreadLocalRandom.current().nextInt(2, 10 + 1);
        int n = ThreadLocalRandom.current().nextInt(2, 10 + 1);
        int[][] arr = new int[m][n];
        Vector<Integer> vec = new Vector<Integer>();
 
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                arr[i][j] = ThreadLocalRandom.current().nextInt(min, max + 1);
 
                /*
                в чем проблема вашего кода? в том, что когда находится 2ое отрицательное число, вы игнорируете положительные числа, пока не найдете 3е отрицательное
                условием "if (tempCnt > 2)". НО! если сделать условие "if (tempCnt >= 2)", то тогда второе отрицательное число попадет под сортировку.
                а нам надо СЛЕДУЮЩЕЕ после ВТОРОГО отрицательного.
                поэтому решение довольное просто:
                1) поменять условия "if (tempCnt > 2)" и "if ((arr[i][j]<0))"
                2) добавить знак равенства в "if (tempCnt > 2)"
                p.s. делаем в обоих местах!
                 */
 
                // меняем местами!
                if (tempCnt >= 2) { // незабываем добавить равенство!
                    vec.add(arr[i][j]);
                }
                if (arr[i][j] < 0)
                    tempCnt++;
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println("\n");
        }
 
        System.out.println("\n----------------------------------------------------------------");
        Collections.sort(vec, Collections.reverseOrder());
        tempCnt = 0;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                // точно так же и тут!
                if (tempCnt >= 2) {
                    arr[i][j] = vec.get(vecInd);
                    vecInd++;
                }
                if ((arr[i][j] < 0))
                    tempCnt++;
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println("\n");
        }
        System.out.println("\n----------------------------------------------------------------");
 
        for (i = 0; i < vec.size(); i++)
            System.out.print(vec.get(i) + "\t");
 
        vec.clear();
1
Amabile opus
14 / 12 / 2
Регистрация: 08.01.2019
Сообщений: 133
09.12.2019, 12:01  [ТС] 5
Цитата Сообщение от XaXoLOL Посмотреть сообщение
в чем проблема вашего кода? в том, что когда находится 2ое отрицательное число, вы игнорируете положительные числа, пока не найдете 3е отрицательное
                условием "if (tempCnt > 2)". НО! если сделать условие "if (tempCnt >= 2)", то тогда второе отрицательное число попадет под сортировку.
                а нам надо СЛЕДУЮЩЕЕ после ВТОРОГО отрицательного.
                поэтому решение довольное просто:
                1) поменять условия "if (tempCnt > 2)" и "if ((arr[i][j]<0))"
                2) добавить знак равенства в "if (tempCnt > 2)"
                p.s. делаем в обоих местах!
Благодарю! Нижайший поклон вам за ответ и пояснения!
0
3041 / 2538 / 782
Регистрация: 05.07.2013
Сообщений: 12,287
09.12.2019, 12:12 6
4eDo, т.е. ты не понимаешь задание, но пытаешься его решить?
0
Amabile opus
14 / 12 / 2
Регистрация: 08.01.2019
Сообщений: 133
09.12.2019, 14:53  [ТС] 7
xoraxax, Да нет, в целом само задание понятно. Смутила именно "последовательность". А там уж как решу, так решу - преподаватель смотрит на работу, а не на задание. Обычно всё формулируется чётче и подобных проблем не возникает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2019, 14:53

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

Ошибка вывода или ввода массива символов из массива структур
#define _CRT_SECURE_NO_WARNINGS #define _UNICODE // тестовая программа. #include &lt;iostream&gt;...

Быстрая сортировка, ошибка:индекс массива является недопустимым для этого массива
как можно представить индексы массива (first_n, last_n), что бы избежать ошибку:индекс массива...

Сортировка массива. Ошибка после ввода размерности массива
подскажите почему после ввода размерности массива выдает ошибку #include&lt;iostream&gt;...

Сортировка массива для правильного вывода в ListView
Здравствуйте. Есть массив, который заполнен числами от 1 до 31 по возрастанию. Они выводятся в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.