Форум программистов, компьютерный форум CyberForum.ru

Переставить строки в порядке убывания сумм элементов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
samira di
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 16
11.03.2012, 20:48     Переставить строки в порядке убывания сумм элементов #1
здравствуйте! помогите пожалуйста решить задачу! очень нужно!


Дана целочисленная квадратная матрица порядка n. Переставить строки в порядке убывания сумм элементов. Суммы строк выводить вместе со строками. Матрицу сформировать из случайных чисел в диапазоне от –10 до 10.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 20:48     Переставить строки в порядке убывания сумм элементов
Посмотрите здесь:

Упорядочить строки матриц в порядке убывания наибольших элементов строк C++
C++ Отсортировать столбцы матрицы в порядке убывания сумм простых чисел столбцов
C++ На С++ Билдер 6 (Описать функцию, располагающую столбцы целочисленного двумерного массива в порядке убывания элементов k-ой строки)
В массиве переставить столбцы в порядке возрастания элементов первой строки C++
C++ Сортировать строки матрицы n * m в порядке убывания значений первых элементов строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FutureCome
102 / 102 / 6
Регистрация: 19.12.2010
Сообщений: 417
Завершенные тесты: 2
11.03.2012, 20:58     Переставить строки в порядке убывания сумм элементов #2
В чём проблема? Используйте массивы. Пытайтесь что-то делать, спрашивайте. Если не хотите писать сами, чтобы за вас написали - то вам в раздел "Фриланс", там сделают за вас, но не бесплатно.
Общий алгоритм:
1. Запрашиваем n;
2. Создаём двумерный массив n на n;
3. Заполняем.
4. Считаем суммы строк и пишем их в одномерный массив.
5. Сортируем массив сумм любым методом, попутно также меняя строки в исходном двумерном массиве.
Что-то не знаете? С чем из этого проблемы? Ищите в поиске или спрашивайте.
samira di
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 16
12.03.2012, 00:05  [ТС]     Переставить строки в порядке убывания сумм элементов #3
выводи то я вывожу, а как сумму посчитать,чтоб ее еще в матрице вывести я не знаю!


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
double n;
cin>>n;
cout<<endl;
double i,j,s,x[10][10];
for (i=0;i<n;i++)
{
  for (j=0;j<n;j++)
  {
    x[i][j]=(-10)+rand()%(10-(-10)+1);
    cout.width(4);
    cout<<x[i][j]<<"  ";
  }
  cout<<endl;
}
Добавлено через 8 минут
и еще вопрос!
Проверить, является ли заданный массив упорядоченным по возрастанию, или убыванию, или вообще не отсортирован.
почему когда я задаю например 5 чисел от 6 до 2, он пишет что не упорядочен, хотя должен убывать?

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
#include <iostream.h>
#include <math.h>
void main()
{
double m;
cout<<"m=";
cin>>m;
cout<<endl;
double k,n,i,x[30];
  {
  for(i=0;i<m;i++)
  cin>>x[i];
  }
  k=0;n=0;
{ for(i=0;i<m;i++)
   if(x[i]<=x[i+1])
    k++;
    else
    n++;
 
 if (n==m-1)
    cout<<"ubivaet";
    else
    if (k==m-1)
    cout<<"vozrastaet";
    else
    cout<<"ne uporyadozen";
 
       }
    cin.get();
   cin.get();
}
Добавлено через 56 секунд
в чем тут ошибка?
FutureCome
102 / 102 / 6
Регистрация: 19.12.2010
Сообщений: 417
Завершенные тесты: 2
12.03.2012, 03:23     Переставить строки в порядке убывания сумм элементов #4

Не по теме:

1. Это раздел по C# (Си-шарп), а не по C++ (Си-плюс-плюс). Тему, наверно, переместят;
2. Форматируйте свой код: Используйте отступы и пробелы между операндами;
3. При вставке своего кода сюда, используйте форматирование кода на форуме с помощью кнопочки C++;
4. Перед тем, как задать вопрос, поищите готовые ответы на этом форуме и в интернете.


По делу:
1. В какой программе пишете код?
2.
Код программы с сортировкой по суммам [Нажмите это]
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream.h>
#include <time.h>
 
using namespace std;
 
//Создание массива
int** CreateArray(int n)
{
    int** new_arr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        new_arr[i] = new int[n];
        for (int j = 0; j < n; j++)
        {
            new_arr[i][j] = -10 + rand() % 21;
        }
    }
    return new_arr;
}
 
//Печать массива
void PrintArray(int** arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout.width(4);
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
 
//Печать массива
void PrintArrayWithSums(int** arr, int* sums, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout.width(4);
            cout << arr[i][j] << " ";
        }
        cout << "Sum: " << sums[i] << endl;
    }
}
 
//Удаление массива
void DeleteArray(int** arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
}
 
//Вычисление сумм
int* GetStrSums(int** arr, int n)
{
    int* sums = new int[n];
    for (int i = 0; i < n; i++)
    {
        int curSum = 0;
        for (int j = 0; j < n; j++)
        {
            curSum += arr[i][j];
        }
        sums[i] = curSum;
    }
    return sums;
}
 
//Сортировка по суммам строк (по убыванию). Метод сортировки пузырьком:
//http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC
void SortByStrSums(int** arr, int* sums, int n)
{
    bool t = true;
    while(t)
    {
        t = false;
        for (int i = 0; i < (n - 1); i++)
        {
            if (sums[i] < sums[i + 1])
            {
                int* tmpStr = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmpStr;
 
                int tmpSum = sums[i];
                sums[i] = sums[i + 1];
                sums[i + 1] = tmpSum;
 
                t = true;
            }
        }
    }
}
 
void main()
{
    int n;
    srand (time(NULL));
 
    cout << "Input N:" << endl;
    cin >> n;
    cout << endl;
 
    int** arr = CreateArray(n); //Создаём массив со случайными числами.
    cout << "Array:" << endl;
    PrintArray(arr, n);
 
    int* sums = GetStrSums(arr, n); //Получаем суммы
    cout << endl << "Array with sums: " << endl;
    PrintArrayWithSums(arr, sums, n); //Печатаем массив вместе с суммами.
 
    SortByStrSums(arr, sums, n); //Сортируем по суммам строк
    cout << endl << "Array sorted by string sums: " << endl;
    PrintArrayWithSums(arr, sums, n); //Печатаем массив после сортировки.
 
    DeleteArray(arr, n); //Удаляем массив
    cin.get(); //пауза до нажатия клавиши.
}

3. Используйте объявление массивов не в статической памяти, а динамической (ключевое слово new) как в моём примере.
4. double - вещественный тип, а вам нужен целый - используйте int.

Добавлено через 32 минуты
Цитата Сообщение от samira di Посмотреть сообщение
почему когда я задаю например 5 чисел от 6 до 2, он пишет что не упорядочен, хотя должен убывать?
Потому что второй цикл нужно делать не до m, а до (m - 1), тем самым Вы лезите не в свою память, читая случайные мусорные данные. Я бы по-другому сделал, но ладно, исправлю ваш код:
Исправленный и дополненный код [Нажмите здесь]
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void main()
{
    int m;
    cout << "m=";
    cin >> m;
    if (m > 1)
    {
        cout << endl;
        int k,n,i,x[30];
        {
            for(i = 0; i < m; i++)
            {
                cout << "x[" << i << "]=";
                cin >> x[i];
            }
        }
 
        k = 0; n = 0;
        {
                for(i = 0; i < (m - 1); i++)
                    if(x[i] <= x[i + 1])
                        k++;
                    else
                        n++;
 
                if (n == m - 1)
                    cout << "Decreases"; //Убывает
                else if (k == m - 1)
                    cout << "Increases"; //Возврастает
                else
                    cout << "Unsorted"; //Не отсортирован
        }
    }
    else
    {
        cout << "Wrong array length" << endl; //Неверная длина массива
    }
    getch();
}

5. Вместо cin.get() подключайте conio.h:
C++
1
#include <conio.h>
и вызывайте в конце программы функцию:
C++
1
getch();
samira di
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 16
13.03.2012, 01:11  [ТС]     Переставить строки в порядке убывания сумм элементов #5
скажите пожалуйста, почему когда я в программе прописываю bool t=true, выходит ошибка "неопределенный символ bool"?
FutureCome
102 / 102 / 6
Регистрация: 19.12.2010
Сообщений: 417
Завершенные тесты: 2
13.03.2012, 09:15     Переставить строки в порядке убывания сумм элементов #6
Покажите весь код... Это в моём коде?
И всё-таки, в чём Вы пишете?
samira di
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 16
13.03.2012, 10:23  [ТС]     Переставить строки в порядке убывания сумм элементов #7
это в вашем коде.
начали изучать С++, пишу на нем наверное)
nio
13.03.2012, 10:45
  #8
 Комментарий модератора 
перенесено в С++
FutureCome
102 / 102 / 6
Регистрация: 19.12.2010
Сообщений: 417
Завершенные тесты: 2
13.03.2012, 17:09     Переставить строки в порядке убывания сумм элементов #9
Цитата Сообщение от samira di Посмотреть сообщение
это в вашем коде.
У меня всё работает на Visual Studio 2010...
Цитата Сообщение от samira di Посмотреть сообщение
начали изучать С++, пишу на нем наверное)
В какой системе (среде) программирования (IDE), в какой программе?
Может быть, вы не всё скопировали...?
Покажите снимок экрана (скриншот):

Не по теме:

Нажать кнопку PrintScreen, вставить в Paint, сохранить как JPEG.

samira di
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 16
17.03.2012, 23:37  [ТС]     Переставить строки в порядке убывания сумм элементов #10
Здравствуйте еще раз ))

порылась в литературе и насобирала кое-что, но все равно не совсем что нужно((
посмотрите пожалуйста!

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
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
void main()
{
int n,i,j,s,w,k;
int a[100][100];
cin>>n;
cout<<endl;
for (i=0;i<n;i++)
{
  for (j=0;j<n;j++)
  {
    a[i][j]=(-10)+rand()%(10-(-10)+1);
    cout.width(5);
    cout<<a[i][j]<<"  ";
  }
  cout<<endl;}
{
for (int i=0;i<n;i++)
{s=0;
for(int j=0;j<n;j++)
s+=a[i][j];
a[i][j]=s;
cout.width(5);
cout<<endl<<s<<"  ";
}
cout<<endl;
for(i=0;i<n;i++)
for(k=0;k<n;k++)
if (a[i][j]>a[i+1][j])
{ w=a[i][j];
a[i][j]=a[i+1][j];
a[i+1][j]=w;
for (j=0;j<n;j++)
{w=a[i][j];
a[i][j]=a[i+1][j];
a[i+1][j]=w; }
}
for (i=0;i<n;i++)
{ for (j=0;j<n;j++)
{cout.width(3);
cout<<a[i][j];}
cout<<endl;}
cin.get();
cin.get();
}      }
Добавлено через 1 минуту
Работаю в Turbo C++ IDE
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 15:02     Переставить строки в порядке убывания сумм элементов
Еще ссылки по теме:

Действительная матрица n * m. Сортировать строки в порядке убывания значений первых элементов C++
Переставить слова в строке в порядке убывания количества цифр в них C++
Удалить из массива числа из одинаковых цифр и упорядочить в порядке убывания их сумм C++

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

Или воспользуйтесь поиском по форуму:
FutureCome
102 / 102 / 6
Регистрация: 19.12.2010
Сообщений: 417
Завершенные тесты: 2
18.03.2012, 15:02     Переставить строки в порядке убывания сумм элементов #11
Turbo C++ 3.0 или 3.1...? Господи, что ж у вас за преподаватели демоны. Этой IDE лет 20, не меньше. В ней нет поддержки многих вещей. Исправил свой код под Turbo C++ 3.0:
Код программы с сортировкой по суммам [Нажмите это]
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
 
//Создание массива
int** CreateArray(int n)
{
    int** new_arr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        new_arr[i] = new int[n];
        for (int j = 0; j < n; j++)
        {
            new_arr[i][j] = -10 + rand() % 21;
        }
    }
    return new_arr;
}
 
//Печать массива
void PrintArray(int** arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout.width(4);
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
 
//Печать массива
void PrintArrayWithSums(int** arr, int* sums, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout.width(4);
            cout << arr[i][j] << " ";
        }
        cout << "Sum: " << sums[i] << endl;
    }
}
 
//Удаление массива
void DeleteArray(int** arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
}
 
//Вычисление сумм
int* GetStrSums(int** arr, int n)
{
    int* sums = new int[n];
    for (int i = 0; i < n; i++)
    {
        int curSum = 0;
        for (int j = 0; j < n; j++)
        {
            curSum += arr[i][j];
        }
        sums[i] = curSum;
    }
    return sums;
}
 
//Сортировка по суммам строк (по убыванию). Метод сортировки пузырьком:
//http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC
void SortByStrSums(int** arr, int* sums, int n)
{
    int t = 1;
    while(t)
    {
        t = 0;
        for (int i = 0; i < (n - 1); i++)
        {
            if (sums[i] < sums[i + 1])
            {
                int* tmpStr = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmpStr;
 
                int tmpSum = sums[i];
                sums[i] = sums[i + 1];
                sums[i + 1] = tmpSum;
 
                t = 1;
            }
        }
    }
}
 
void main()
{
    int n;
    srand (time(NULL));
 
    cout << "Input N:" << endl;
    cin >> n;
    cout << endl;
 
    int** arr = CreateArray(n); //Создаём массив со случайными числами.
    cout << "Array:" << endl;
    PrintArray(arr, n);
 
    int* sums = GetStrSums(arr, n); //Получаем суммы
    cout << endl << "Array with sums: " << endl;
    PrintArrayWithSums(arr, sums, n); //Печатаем массив вместе с суммами.
 
    SortByStrSums(arr, sums, n); //Сортируем по суммам строк
    cout << endl << "Array sorted by string sums: " << endl;
    PrintArrayWithSums(arr, sums, n); //Печатаем массив после сортировки.
 
    DeleteArray(arr, n); //Удаляем массив
    getch(); //пауза до нажатия клавиши.
}

Исправленный и дополненный код по сортировке [Нажмите здесь]
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
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
 
void main()
{
    int m;
    cout << "m=";
    cin >> m;
    if (m > 1)
    {
        cout << endl;
        int k,n,i,x[30];
        {
            for(i = 0; i < m; i++)
            {
                cout << "x[" << i << "]=";
                cin >> x[i];
            }
        }
 
        k = 0; n = 0;
        {
                for(i = 0; i < (m - 1); i++)
                    if(x[i] <= x[i + 1])
                        k++;
                    else
                        n++;
 
                if (n == m - 1)
                    cout << "Decreases"; //Убывает
                else if (k == m - 1)
                    cout << "Increases"; //Возврастает
                else
                    cout << "Unsorted"; //Не отсортирован
        }
    }
    else
    {
        cout << "Wrong array length" << endl; //Неверная длина массива
    }
    getch();
}

Теперь всё работает.
Цитата Сообщение от samira di Посмотреть сообщение
порылась в литературе и насобирала кое-что, но все равно не совсем что нужно((
посмотрите пожалуйста!
Используйте мой код, разберитесь в нём.
Yandex
Объявления
18.03.2012, 15:02     Переставить строки в порядке убывания сумм элементов
Ответ Создать тему
Опции темы

Текущее время: 12:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru