4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
1

Работа с массивами и выводы значений с сортировкой

14.02.2016, 22:32. Показов 1135. Ответов 10
Метки нет (Все метки)

Всем доброго времени суток,
Начал изучать Java и в качестве IDE выбрал NetBeans 8.1.
Задали в универе (учусь на заочном и удалённо) лабораторную работу и практически со всеми пунктами справился,вот только 2 последних некорректно работают. Быть может знатоки могли бы пояснить, где я сделал ошибки?
Первая часть кода - это то, что работает корректно.
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
package labdva;
 
import java.util.Arrays;
 
public class LaboratorDva {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
 
        // Третье задание:
        int n = 4; // кол-во строк в массиве
        int m = 75; // кол-во столбцов в массиме
        //двумерный массив с 4 строками и 75 столбцами
        int [][]massiv = new int [n][m];
        
        // Четвёртое задание:
        System.out.println("Сгенерирован массив со случайными числами от 0 до 7: \n");
        int a =0; // наименьшее число
        int b = 7; // наибольшее число
        for(int i=0; i<n; i++){ // строки
            for(int j=0; j<m; j++){// столбы
                // Генерирование случайного числа от 0 до 7
                masssiv[i][j] = (int)(Math.random()*(b-a+1)+a);
                //Выводим значения массива на экран
                System.out.print("["+massiv[i][j]+"]");
                
            }
            System.out.print("\n");
        }
        
        // Пятое задание:
        System.out.println("Посчитано среднее число каждой строки массива: \n");
        //Создаём одномерный массив для подсчёта среднего числа каждой строки
        double[] sred  = new double[n];
        for(int i=0; i<n; i++){ // проходим строки
            int strokSum = 0; // начальное значение
            for(int j=0; j<m; j++){
                strokSum+=massiv[i][j]; // сложили всю строку
            }
            //Получаем double значения
            sred[i] = 1.0*strokSum/m; // m - кол-во членов, которые были в строке
            System.out.println("Среднее значение "+"["+i+"]"+" строки: "+"["+sred[i]+"]");
        }   
        
        // Шестое задание:
        int lastNumb = 5; // последнее число в 0475
        int skolkoCisel = 0; // начальное число
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                massiv[i][j] = (int)(Math.random()*(b-a+1)+a);
                if(lastNumb == masiv[i][j]){
                    skolkoCisel++; // увеличиваем на 1
                }
            }
        }
        //Выводим результат на экран: 
        System.out.print("В двумерном массиве ["+skolkoCisel+"] чисел, которые равны ["+ lastNumb+"]"+"\n");

Проблемы именно с этими 2 заданиями, что ниже:


Java
1
2
3
4
5
6
7
8
9
10
11
12
        //Задание 7 - 0:
   /*Найти и вывести на экран наибольшее значение одномерного массива, не включая "a" элемент (а - наименьшее из 4-х чисел 0475).*/
 
        int mensh = 0; // наименьшее число из 0475
        double maxVal = 0.0; //наибольшее значение,начальное
        for(int i=0; i<sred.length; i++){
            if(sred[i]>maxVal && i!= mensh){
               maxVal = sred[i];
               
            }
        System.out.println("Наибольшее значение: "+maxVal); 
        }
Вроде ведь должно выводить одну строку, ибо массив-то одномерный, а выводит 4 строки. Мне почему-то кажется,что задание я сделал некорректно.


Java
1
2
3
4
5
6
7
8
9
10
        // Задание 8-4:
/*Вывести на экран значения a-столбца  в порядке возрастания. (a - наименьшее число из чисел 0475).*/
        float sredStolb = 0.0f;
        int[] stolb = new int[massiv.length];
        for(int i=0; i<masiv.length; i++){
            sredStolb +=massivs[i][mensh];
            stolb[i] = massiv[i][mensh];
        }
        Arrays.sort(stolb);
        System.out.print(sredStolb);
Здесь я так и не смог додуматься,как же мне так отсортировать, чтоб вывело так,как должно по заданию.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2016, 22:32
Ответы с готовыми решениями:

Задача с массивами и их сортировкой в С++
Дана матрица (N+15)x(N+15), найти строки с максимальным и минимальным элементом и поменять их...

Найти наибольшее из значений в заштрихованной области, работа с многомерными массивами
Помогите сделать, в программировании очень плох, вот все что есть: #define _CRT_SECURE_NO_WARNINGS...

Работы с типами доступа/классами/массивами/методами/сортировкой/удаление
Здравствуйте, коллеги! Помогите пожалуйста решить вот такую вот задачку: - Создать базовый класс...

Массив положительных значений с сортировкой
Доброе утро Форумчане! Очень нужна ваша помощь. Времени у меня мало. Желательно до 17.00 сегодня....

10
53 / 53 / 39
Регистрация: 05.12.2010
Сообщений: 261
15.02.2016, 10:08 2
Насчет первого задания: ты вывод максимального закинул в цикл, поэтому и выводит 4 раза. Если выводить (как в коде ниже) после цикла, все ок:

Java
1
2
3
4
5
6
7
8
9
10
11
    public static void main (String[] args) {
        int[] sred = {0, 4, 7, 5};
        int mensh = 0; // наименьшее число из 0475
        double maxVal = 0.0; //наибольшее значение,начальное
        for(int i=0; i<sred.length; i++){
            if(sred[i]>maxVal && i!= mensh){
               maxVal = sred[i];       
            }
        }
        System.out.println("Наибольшее значение: "+maxVal); 
    }
и maxValue замени лучше на:

Java
1
double maxVal = Double.MIN_VALUE;
Задание 8-4 непонятно. И мой тебе совет - не пиши русскими словами обозначения переменных. Вводи arr, a, array, arrtmp как названия, но ен massiv, masiv.
1
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
15.02.2016, 12:36  [ТС] 3
megastriker, Благодарю Вас за ответ Да, действительно, вынесение вывода за цикл - прекрасно решило проблему.
Что до обозначения переменных, то я сам никогда так не делаю, ибо во всех книгах написано, что обозначать их надо так, чтоб они были понятны на любом языке. Просто в универе преподы хотят, чтоб обозначались литовскими словами (знаю, что бред, но так есть), а потому задание было сделано на литовском языке, а выкладывая его сюда, я на скорую руку перевёл на русский, дабы было понятно, что, для чего и зачем.

Что до задания 8-4, то я создал двумерный массив со случайными числами от 0 до 7. Так же у данного массива 4 строки и 75 столбцов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        int n = 4; // кол-во строк в массиве
        int m = 75; // кол-во столбцов в массиме
        //двумерный массив с 4 строками и 75 столбцами
        int [][]massiv = new int [n][m];
        System.out.println("Сгенерирован массив со случайными числами от 0 до 7: \n");
        int a =0; // наименьшее число
        int b = 7; // наибольшее число
        for(int i=0; i<n; i++){ // строки
            for(int j=0; j<m; j++){// столбы
                // Генерирование случайного числа от 0 до 7
                masssiv[i][j] = (int)(Math.random()*(b-a+1)+a);
                //Выводим значения массива на экран
                System.out.print("["+massiv[i][j]+"]");
                
            }
            System.out.print("\n");
Мне нужно, чтоб на экран вывело этот мой массив, но значения нулевого (это и есть "a" столбец) столбца были отсортированы в порядке возрастания. То есть значения в нулевом столбце выводились не в случайном порядке (как получился сгеренированный массив со случайными числами), а от наименьшего в нём числа к наибольшему. То есть, если в нулевом столбце есть, допустим, такие числа: 2 5 0 7 то выводило бы в отсортированном виде: 0 2 5 7
П.С. В данном случае "a" столбец - это и есть самый первый столбец в массиве.
0
95 / 95 / 50
Регистрация: 07.07.2015
Сообщений: 208
15.02.2016, 14:27 4
есть пара вариантов:

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
package samples;
 
/**
 * 
 */
public class MatrixColumnBubbleSort {
    public static void main(String[] args) {
        doShiftAndPrint(generateAndPrint());
    }
 
    public static int[][] generateAndPrint() {
        int[][] mtrx = new int[20][4];
        for (int i = 0; i < mtrx.length; i++) {
            for (int j = 0; j < mtrx[i].length; j++) {
                mtrx[i][j] = (int) (Math.random() * 8);
            }
        }
 
        for (int i = 0; i < mtrx.length; i++) {
            for (int j = 0; j < mtrx[i].length; j++) {
                System.out.print(mtrx[i][j]);
            }
            System.out.println();
        }
 
        System.out.println();
        return mtrx;
    }
 
    // Sort left column values only
//    public static void doShiftAndPrint(int[][] mtrx) {
//        int temp;
//        for (int i = 0; i < mtrx.length; i++) {
//            for (int j = 1; j < mtrx.length - i; j++) {
//                if (mtrx[j-1][0] > mtrx[j][0]) {
//                    temp = mtrx[j-1][0];
//                    mtrx[j-1][0] = mtrx[j][0];
//                    mtrx[j][0] = temp;
//                }
//            }
//        }
//
//        for (int i = 0; i < mtrx.length; i++) {
//            for (int j = 0; j < mtrx[i].length; j++) {
//                System.out.print(mtrx[i][j]);
//            }
//            System.out.println();
//        }
//
//        System.out.println();
//    }
 
    // sort rows by left column value in the appearance order
    public static void doShiftAndPrint(int[][] mtrx) {
        int temp;
        for (int i = 0; i < mtrx.length; i++) {
            for (int j = 1; j < mtrx.length - i; j++) {
                if (mtrx[j - 1][0] > mtrx[j][0]) {
                    for (int k = 0; k < mtrx[j].length; k++) {
                        temp = mtrx[j - 1][k];
                        mtrx[j - 1][k] = mtrx[j][k];
                        mtrx[j][k] = temp;
                    }
                }
            }
        }
 
        for (int i = 0; i < mtrx.length; i++) {
            for (int j = 0; j < mtrx[i].length; j++) {
                System.out.print(mtrx[i][j]);
            }
            System.out.println();
        }
 
        System.out.println();
    }
}
1
5 / 5 / 2
Регистрация: 12.02.2016
Сообщений: 11
15.02.2016, 14:41 5
Дополнил ваш код задания 8-4.

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
public static void main (String[] args) {
    int n = 4; // кол-во строк в массиве
    int m = 75; // кол-во столбцов в массиме
    //двумерный массив с 4 строками и 75 столбцами
    int [][]massiv = new int [n][m];
    System.out.println("Сгенерирован массив со случайными числами от 0 до 7: \n");
    int a =0; // наименьшее число
    int b = 7; // наибольшее число
    for(int i=0; i<n; i++){ // строки
        for(int j=0; j<m; j++){// столбы
            // Генерирование случайного числа от 0 до 7
            massiv[i][j] = (int)(Math.random()*(b-a+1)+a);
            //Выводим значения массива на экран
            System.out.print(massiv[i][j]+" "); 
              
            }
 
            System.out.print("\n");
 
    }
 
    
    //Выше был ваш неполный код. Далее идет моё продолжение.
    
 
    System.out.println();
 
        
    for(int k=0; k<n; k++){
        int j=0;
        int min = massiv[k][j];
        for(int i=k; i<n; i++){
            if(massiv[i][j]< min){
                min=massiv[i][j];       
                massiv[i][j]=massiv[k][j];  
                massiv[k][j]= min;  
            }
        }
    }
 
 
    for(int i=0; i<n; i++){ // строки
        for(int j=0; j<m; j++){// столбы
            //Выводим значения массива на экран
            System.out.print(massiv[i][j]+" ");
            }   
            System.out.print("\n");
    }
        
    
}
1
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
15.02.2016, 15:34  [ТС] 6
Vardok, mocivan, Благодарю за помощь Оба метода рабочие

Vardok, Интересует такой вопрос, если я реализую сортировку массива с выводом на экран сразу, скажем так, после генерирования двумерного массива и вывода его на экран, то всё отлично. Сначала выводится сгенерированный массив, а сразу под ним - тот же самый массив, но с отсортированным нужным столбцом.
Если же я код для сортировки массива вставляю где-либо дальше в коде, то значения в отсортированном столбце не соответствуют значениям, которые есть в сгенерированном массиве не отсортированном столбце.

Вот пример:
Сгенерировался двумерный массив со значениями в нулевом столбце:

[1][4][5][7][7][2][2][7][6][7][1][1]
[0][5][5][3][1][6][5][6][6][3][1][7]
[4][7][7][2][3][4][6][0][5][1][0][6]
[5][6][5][1][0][5][4][0][2][0][6][5]

Если я вставляю код сортировки (без генерирования массива) где-либо дальше в коде, то получаю следующее:

[1][6][3][4][0][2][7][5][6][5][7][4]
[5][4][0][3][7][6][7][0][0][6][0][2]
[6][0][4][1][3][4][1][6][0][5][3][1]
[6][4][6][5][5][7][5][2][5][1][6][1]

Происходит сортировка, но получается, что генерируется новый массив и уже он сортируется.
Это не критично, но просто интересно понять, почему так происходит?
0
95 / 95 / 50
Регистрация: 07.07.2015
Сообщений: 208
15.02.2016, 15:58 7
Oxidous, а вы код сортировки от генерации отделите, и передавайте на вход массив для сортировки -> он и отсортируется.
пока, как я понял, вы выводите массив, потом генерируйте новый, сортируете его и выводите отсортированный.
1
5 / 5 / 2
Регистрация: 12.02.2016
Сообщений: 11
15.02.2016, 16:20 8
Цитата Сообщение от Oxidous Посмотреть сообщение
Vardok, Интересует такой вопрос, если я реализую сортировку массива с выводом на экран сразу, скажем так, после генерирования двумерного массива и вывода его на экран, то всё отлично. Сначала выводится сгенерированный массив, а сразу под ним - тот же самый массив, но с отсортированным нужным столбцом.
Если же я код для сортировки массива вставляю где-либо дальше в коде, то значения в отсортированном столбце не соответствуют значениям, которые есть в сгенерированном массиве не отсортированном столбце.

Вот пример:
Сгенерировался двумерный массив со значениями в нулевом столбце:

[1][4][5][7][7][2][2][7][6][7][1][1]
[0][5][5][3][1][6][5][6][6][3][1][7]
[4][7][7][2][3][4][6][0][5][1][0][6]
[5][6][5][1][0][5][4][0][2][0][6][5]

Если я вставляю код сортировки (без генерирования массива) где-либо дальше в коде, то получаю следующее:

[1][6][3][4][0][2][7][5][6][5][7][4]
[5][4][0][3][7][6][7][0][0][6][0][2]
[6][0][4][1][3][4][1][6][0][5][3][1]
[6][4][6][5][5][7][5][2][5][1][6][1]

Происходит сортировка, но получается, что генерируется новый массив и уже он сортируется.
Это не критично, но просто интересно понять, почему так происходит?
Oxidous, объясню ниже что делает мой код:
1) создаем двумерный массив;
2) меняем в созданном массиве в первом ряду значения так, чтобы они шли по порядку, т.е. получаем не новый массив, а тот же, просто в нем стали другие значения в первом столбце;
3) выводим начальный массив (единственно созданный на протяжении всего кода), но так как есть пункт 2, то массив выглядит уже иначе, с сортировкой в первом столбце.

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

PS: попробуйте в "где-либо дальше в коде" перед сортировкой поставить еще один вывод массива, чтобы убедиться, что он идентичен стартовому.
1
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
17.02.2016, 12:27  [ТС] 9
mocivan, Vardok, Благодарю за ответы. Вот то, что написала преподша:

"Мне не нравится, что выводя значения в порядке возрастания, Вы меняете двумерный массив. Поскольку нужно только вывести, но не менять другие данные, то сперва нужно сделать копию этих сортировочных данных, а только затем сортировать и выводить. Плюс, не нужно было писать алгоритм сортирования, можно просто использовать Arrays.sort(massiv); ."
0
95 / 95 / 50
Регистрация: 07.07.2015
Сообщений: 208
17.02.2016, 13:52 10
видимо второй раз матрица уже не нужна. вариант с поиском наименьшего числа в первой строке (столбца а), вместо крайнего левого и сортировка всех значений этого столбца в отдельном одномерном массиве:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public static void doShiftAndPrint(int[][] mtrx) {
        int temp = mtrx[0][0];
        int columnNumber = 0;
        for (int i = 0; i < mtrx[0].length; i++) {
            if (mtrx[0][i] < temp) {
                temp = mtrx[0][i];
                columnNumber = i;
            }
        }
 
        int[] output = new int[mtrx.length];
 
        for (int i = 0; i < output.length; i++) {
            output[i] = mtrx[i][columnNumber];
        }
 
        Arrays.sort(output);
 
        for (int i = 0; i < output.length; i++) {
            System.out.print(output[i]);
        }
        System.out.println();
    }
1
4 / 4 / 1
Регистрация: 03.09.2014
Сообщений: 156
17.02.2016, 16:02  [ТС] 11
Благодарю за пример,взял на заметку. Я сделал проще, буду надеятся, что преподше подойдёт

Java
1
2
3
4
5
6
7
8
int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i]=masiv[i][a]; // здесь а - наименьшее число из 0 4 7 5, а значит будет нулевой столбец.
        }
        Arrays.sort(arr); // сортируем по возрастанию
        for (int i=0; i<arr.length; i++){
           System.out.println("["+arr[i]+"] "); // вывод на экран ввиде столбца.
        }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2016, 16:02
Помогаю со студенческими работами здесь

Запрос по двум датам с условием и сортировкой повторяющихся значений
Здравствуйте уважаемые форумчане. Помогите пожалуйста. Я если честно в программировании очень плохо...

Memo и работа с сортировкой текста
парни пол дня сижу и не нашел в интернете ничего толкового на эту тему, мне надо сделать программу...

Работа с одномерным массивом и сортировкой
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1. Произведение...

Отсортировать одномерный массив, заполненный случайными числами, сортировкой Шелла и сортировкой выбором
Отсортировать одномерный массив, заполненный случайными числами, сортировкой Шелла и сортировкой...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru