Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
 Аватар для Кротяка
7 / 7 / 1
Регистрация: 20.12.2010
Сообщений: 392

Сортировка строк матрицы в порядке возрастания их средних арифметических значений

14.05.2014, 21:02. Показов 5847. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо строки матрицы переставить в порядке возрастания их средних арифметических значений. Вот что у меня получилось:
C++
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
    int n = A.getN();//строки матрицы
    int m = A.getM();//столбцы матрицы
    float* avg = new float[n];//массив средних арифметических значений строк матрицы
        
        //находим среднее арифметическое каждой строки
        for(int i = 0; i < n; i++)
        {
            float sum = 0;
            for(int j = 0; j < m; j++)
                sum += A.getMatrixElement(i, j);
            avg[i] = sum / m;
            cout<<avg[i]<<endl;
        }
 
        //сортируем строки матрицы
        for(int i = 0; i < n; i++)
            for(int j = i; j < n; j++)
                if(avg[i] > avg[j])
                {
                    for(int k = 0; k < m; k++)
                    {
                        int tmp = A.getMatrixElement(i, k);
                        A.setMatrixElement(i, k, A.getMatrixElement(j, k));
                        A.setMatrixElement(j, k, tmp);
                    }
                    
                    int tmp = avg[i];
                    avg[i] = avg[j];
                    avg[j] = tmp;
                }
Сортирует не совсем правильно, хотелось бы подправить
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2014, 21:02
Ответы с готовыми решениями:

Найти наибольшее среди средних арифметических значений строк матрицы
сформировать матрицу размером m*n и найти наибольшее среди арифметических ее строк

Составить одномерный массив из средних арифметических значений элементов строк матрицы
Вводятся две вещественные матрицы размером 20х30 и 30х40. Для той матрицы, у которой сумма положительных элементов матрицы меньше,...

Получить одномерный массив,состоящий из средних арифметических значений элементов строк матрицы.
Народ,помогите пожалуйста составить программу и блок-схему к ней. Дана квадратная матрица.Получить одномерный массив,состоящий из средних...

12
 Аватар для Кротяка
7 / 7 / 1
Регистрация: 20.12.2010
Сообщений: 392
16.05.2014, 05:06  [ТС]
нужно, насколько я понимаю, применить сортировку выбором, но сделать это для двумерного массива с данным условием у меня не получается

Добавлено через 5 часов 23 минуты
вот наработки, сортирует "вроде как" правильно, но не во всех случаях
хотелось бы узнать, где ошибка/ошибки
C++
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
template <class T> void PreobrMatrix(Matrix<T>& A)
{
    int num;
    int n = A.getN();
    int m = A.getM();
    double tmp, temp, min_avg;
    double* avg = new double[n];
    
    //находим среднее арифметическое каждой строки
    for(int i = 0; i < n; i++)
    {
        float sum = 0;
        for(int j = 0; j < m; j++)
            sum += A.getMatrixElement(i, j);
        avg[i] = sum / m;
    }       
        
    //преобразовываем матрицу
    min_avg = avg[0];
    for(int i = 0; i < n; i++)
    {
        if(min_avg > avg[i])
        {
            min_avg = avg[i];
            num = i;
            for(int j = 0; j < n; j++)
            {
                tmp = avg[num];
                avg[num] = avg[j];
                avg[j] = tmp;
                for (int k = 0; k < m; k++)
                {
                    temp = A.getMatrixElement(num, k);
                    A.setMatrixElement(num, k, A.getMatrixElement(j, k));
                    A.setMatrixElement(j, k, temp);
                }
            }               
        }
    }
 
    cout<<endl<<"Массив средних арифметических:"<<endl;
    for(int i = 0; i < n; i++)
        cout<<avg[i]<<"  ";
    cout<<endl;
 
    cout<<endl<<"Преобразованная матрица:"<<endl<<endl;   
}
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
16.05.2014, 06:32
Кротяка, для сортировки по среднему арифметическому достаточно иметь целое значение, делить не обязательно, можно по суме сортировать результат будет тем же.

Я бы завел 2 массива размерностью n, оба заполнил бы сумами соответствующих строк с помощью std::accumulate и, отсортировав первый, прошелся бы по нему сравнивая значения со вторым, если не совпадают ищу первый индекс элемента с таким же значением и меняю его с текущим, также делая со строками матрицы.
0
4 / 4 / 7
Регистрация: 20.04.2014
Сообщений: 64
16.05.2014, 06:54
Вот исправь это min_avg = avg[0]; запиши в min_avg разность всех значений, чтобы оно точно было меньше всех средних арифметических, как я понял в этом и проблема. Ты сравниваешь с нулевым элементов, а он может оказаться минимальным
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
16.05.2014, 14:08
Цитата Сообщение от outoftime Посмотреть сообщение
для сортировки по среднему арифметическому ... делить не обязательно
Это да


C++
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
void    SwapString(double ** &A,int i,int k) // Такой метод сделай в классе
{
    if(i == k) return;
 
    double * p = A[i];
     A[i] = A[k];
     A[k] = p;
}
 
void SelectionSort(int * p,int n)
{
    for(int i = 0;i < n;i++)
    {
        int min = p[i]; 
        int index = i;
 
        for(int j = i + 1;j < n;j++)
        {
            if(min > p[j])
            {
                index = j;
                min = p[index];
            }
        }
 
        int t = p[i];
        p[i] = p[index];
        p[index] = t;
                // Здесь меняй строки
    }
}
0
 Аватар для Кротяка
7 / 7 / 1
Регистрация: 20.12.2010
Сообщений: 392
19.05.2014, 22:50  [ТС]
Qazan, что то мне не совсем понятно, как должен работать ваш код

Добавлено через 17 минут
outoftime, можете на примере кода показать? А то я ужасно путаюсь, когда пытаюсь всё это провернуть
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
20.05.2014, 01:49
Кротяка,
Кликните здесь для просмотра всего текста
C++
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
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
#include <iterator>
 
class matrix {
public:
    matrix(const size_t& width = 2, const size_t& height = 2) 
        : rows(height), cols(width) 
    {
        array = new int*[rows];
        for (size_t i = 0; i < rows; ++i) {
            array[i] = new int[cols];
            std::generate(array[i], array[i] + cols, 
                [](){ return rand() % 100; });
        }
    }
    
    void set(const size_t& row, const size_t& col, const int& value) {
        array[row][col] = value;
    }
    
    int& get(const size_t& row, const size_t& col) const { return array[row][col]; }
    
    const size_t& getRows() const { return rows; }
    
    const size_t& getCols() const { return cols; }
    
    void sortByAverangeValue() {
        int* sums = new int[rows];
        for (size_t i = 0; i < rows; ++i) {
            sums[i] = std::accumulate(array[i], array[i] + cols, 0);
        }
        
        std::sort(array, array + rows, [&](int* a, int* b) {
            size_t i = std::distance(array[1], a),
                j = std::distance(array[1], b);
            return sums[i] < sums[j];
        });
        
        delete sums;
    }
    
    friend std::ostream& operator<< (std::ostream& out, const matrix& m) {
        for (size_t i = 0; i < m.rows; ++i) {
            for (size_t j = 0; j < m.cols; ++j)
                out << m.array[i][j] << ' ';
            out << std::endl;
        }
        
        return out;
    }
    
private:
    const size_t rows, cols;
    int** array;
};
 
int main () {
    matrix m(2, 4);
    std::cout << "Before\n" << m;
    m.sortByAverangeValue();
    std::cout << "After\n" << m;
}

Сортировка не работает. Если кто скажет почему поставлю +1.
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
20.05.2014, 14:13
Добавлено через 4 минуты
outoftime, какая сортироовка ?

Добавлено через 3 минуты
Кротяка, что именно не ясно ?
код рабочий

сортировка выбором :
http://ru.wikipedia.org/wiki/%... 0%BE%D0%BC

Добавлено через 7 минут


void и возврат
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
20.05.2014, 14:49
Цитата Сообщение от Qazan Посмотреть сообщение
какая сортироовка ?
Сортировка строк матрицы в порядке возрастания их средних арифметических значений строка 36

Добавлено через 2 минуты
Qazan, индексы определяются неверно. Без понятия почему.
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
20.05.2014, 16:11
outoftime, Ага , а сортировка какая ?
всмысле (пузырек,простые вставки, быстрая сортировка, сортировка выбором ..)
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
20.05.2014, 18:10
Qazan, std::sort реализует qsort, причем без оптимизаций.
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
20.05.2014, 19:03
Добавлено через 36 минут
C++
1
2
3
4
5
 std::sort(array, array + rows, [&](int* a, int* b) {
            size_t i = std::distance(array[1], a),
                j = std::distance(array[1], b);
            return sums[i] < sums[j];
        });
Тут у вас сортировка массива указателей ,а в distance подается ,что ?
значение в канкретной точке массива ;
Функция должна брать итератор ,тобишь указатель .

По значению она не может определить расстояние между двумя элементами ,она думает ,что это адреса и выдает вообще говоря иное значение
0
 Аватар для Кротяка
7 / 7 / 1
Регистрация: 20.12.2010
Сообщений: 392
23.05.2014, 15:23  [ТС]
всем спасибо, решение найдено
C++
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
template <class T> void PreobrMatrix(Matrix<T>& A)
{
    int num;
    int n = A.getN();
    int m = A.getM();
    double tmp, temp;
    double* avg = new double[n];
    
    //находим среднее арифметическое каждой строки
    for(int i = 0; i < n; i++)
    {
        float sum = 0;
        for(int j = 0; j < m; j++)
            sum += A.getMatrixElement(i, j);
        avg[i] = sum /m;
    }       
        
    
       //сортируем строки матрицы
    for(int i = 0; i < n; i++)
    {
        int k;
        int p = i; 
        tmp = avg[i];
 
        for(int j = i + 1; j < n; j++)
        {
            if (avg[j] < tmp) 
            {
                p = j; 
                tmp = avg[j]; 
            }
        }
 
        avg[p] = avg[i];
        avg[i] = tmp;
 
        for(k = 0; k < m; k++)
        {
            tmp = A.getMatrixElement(i, k);
            A.setMatrixElement(i, k, A.getMatrixElement(p, k));
            A.setMatrixElement(p, k, tmp);
        }
    }
 
    cout<<endl<<"Массив средних арифметических:"<<endl;
    for(int i = 0; i < n; i++)
        cout<<avg[i]<<"  ";
    cout<<endl;
 
    cout<<endl<<"Преобразованная матрица:"<<endl<<endl;   
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2014, 15:23
Помогаю со студенческими работами здесь

Сортировка строк матрицы в порядке возрастания характеристик (Си + ассемблерная вставка)
Написать программу на языке СИ, которая в двумерном массиве сортирует строки в порядке возрастания их характеристик(в данном случае,...

Отсортировать элементы строк матрицы в порядке возрастания, а строки - в порядке возрастания сумм элементов
Задать с клавиатуры количество целочисленных матриц. Данные получить с помощью датчика случайных чисел RANDOM. Отсортировать элементы...

Из матрицы получить массив, состоящий из средних арифметических строк матрицы
Добрый день! Помогите найти ошибку в коде. Задание: Из заданной пользователем матрицы получить массив, состоящий из средних...

Сформировать вектор из средних арифметических значений по строкам матрицы
Доброго времени суток, подскажите пожалуйста есть задание: Дана действительная матрица размера m×n. Определить числа b1....bm...

Сформировать массив из средних арифметических соответствующих строк матрицы
Ввести двумерный массив A={aij}, i=\overline{1,m}, j=\overline{1,n}, m, n=20. Вывести на экран исходный двумерный массив. Сформировать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru