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

Сортировка выбором - C++

Восстановить пароль Регистрация
 
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
04.01.2013, 14:07     Сортировка выбором #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>
using namespace std;
#include <math.h>
#include <conio.h>
#include <windows.h>  
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    const int n=3;
    int mas[n][n],i,j,k,imax;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            cin>>mas[i][j];
    cout<<"Введите число";
    cin>>k;
    int s;
for(i=0;i<n;i++)
{   
s=0;
    for(j=0;j<n;j++)
    
        if(mas[i][j]==k)
        
            s++;
    
            if(s>1)
            {
                imax=i+1;
                cout<<imax;
            }
for(j=n-1, i=0; i<n; i++, j--)
{
 
    
 
 
 
 
 
}
_getch();
return 0;
}
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 14:07     Сортировка выбором
Посмотрите здесь:

C++ Сортировка выбором на с++
C++ Сортировка выбором
C++ сортировка выбором
Сортировка выбором C++
C++ Сортировка выбором
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 00:22     Сортировка выбором #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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <windows.h>  
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int const n = 3;
    int mas[n][n], k, imax;
 
    cout << "Введите матрицу: \n";
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элемент[" << i+1 << "][" << j+1 << "]: ";
            cin >> mas[i][j];
        }
    }
 
    cout << "\n";
 
    cout << "Исходная матрица: \n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
 
    cout << "\n\nВведите число: ";
        cin >> k;
 
    int s;
    bool flag;
    for(int i = 0; i < n; i++)
    {   
        s = 0;
        flag = false;
        for(int j = 0; j < n; j++)
        {
            if(mas[i][j] == k)
            {    
                s++;
                if(s > 1)
                {
                    imax = i + 1;
                    flag = true;
                }
            }
        }
 
        if(flag == true)
            cout << "\nНомер строки: " << imax;
 
    }
 
    int t, g = 1;
    for(int j = 0, f = n-g; j < n; j++, f--)
    {
 
        for(int i = j+1, l = n-(g+1); i < n; i++, l--)
        {
            if(mas[f][j] < mas[l][i])
            {
                t = mas[l][i];
                mas[l][i] = mas[f][j];
                mas[f][j] = t;
            }
        }
 
        g++;
    }
 
    cout << "\nОтсортированная матрица:\n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
        
    cout << "\n\n";
    return 0;
}
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
05.01.2013, 00:26     Сортировка выбором #3
Если тс, не знает где на форуме описаны сортировки, то они описаны здесь Алгоритмы сортировок
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
05.01.2013, 12:22  [ТС]     Сортировка выбором #4
Цитата Сообщение от David Sylva Посмотреть сообщение
Если тс, не знает где на форуме описаны сортировки, то они описаны здесь Алгоритмы сортировок
Поверь, знаю,смотрел, да и у меня есть такой материал. Я ж говорю, я понимаю сам процесс, но не могу его правильно реализовать(

Добавлено через 1 минуту
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Вот подправил твою программу, второе задание сделал методом пузырька, уже вечер, мозги думать не хотят, думаю там уже сам сможешь, если нет, то пиши, помогу чем смогу

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <windows.h>  
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int const n = 3;
    int mas[n][n], k, imax;
 
    cout << "Введите матрицу: \n";
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элемент[" << i+1 << "][" << j+1 << "]: ";
            cin >> mas[i][j];
        }
    }
 
    cout << "\n";
 
    cout << "Исходная матрица: \n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
 
    cout << "\n\nВведите число: ";
        cin >> k;
 
    int s;
    bool flag;
    for(int i = 0; i < n; i++)
    {   
        s = 0;
        flag = false;
        for(int j = 0; j < n; j++)
        {
            if(mas[i][j] == k)
            {    
                s++;
                if(s > 1)
                {
                    imax = i + 1;
                    flag = true;
                }
            }
        }
 
        if(flag == true)
            cout << "\nНомер строки: " << imax;
 
    }
 
    int t, g = 1;
    for(int j = 0, f = n-g; j < n; j++, f--)
    {
 
        for(int i = j+1, l = n-(g+1); i < n; i++, l--)
        {
            if(mas[f][j] < mas[l][i])
            {
                t = mas[l][i];
                mas[l][i] = mas[f][j];
                mas[f][j] = t;
            }
        }
 
        g++;
    }
 
    cout << "\nОтсортированная матрица:\n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
        
    cout << "\n\n";
    return 0;
}
В том то и печаль,что вид сортировки указан, так бы я тоже пузырьком делал(
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
05.01.2013, 12:24     Сортировка выбором #5
Lotus34 Что конкретно, не понятно, сортировка очень простая.Имею ввиду конкретно в процессе.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 12:47     Сортировка выбором #6
Lotus34, ну вот посмотри:

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <windows.h>  
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int const n = 3;
    int mas[n][n], k, imax;
 
    cout << "Введите матрицу: \n";
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элемент[" << i+1 << "][" << j+1 << "]: ";
            cin >> mas[i][j];
        }
    }
 
    cout << "\n";
 
    cout << "Исходная матрица: \n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
 
    cout << "\n\nВведите число: ";
        cin >> k;
 
    int s;
    bool flag;
    for(int i = 0; i < n; i++)
    {   
        s = 0;
        flag = false;
        for(int j = 0; j < n; j++)
        {
            if(mas[i][j] == k)
            {    
                s++;
                if(s > 1)
                {
                    imax = i + 1;
                    flag = true;
                }
            }
        }
 
        if(flag == true)
            cout << "\nНомер строки: " << imax;
 
    }
 
    int t, g = 1;
    for(int j = 0, f = n-g; j < n; j++, f--)
    {
        int pos_str = f, pos_stb = j; 
        t = mas[f][j];
        for(int i = j+1, l = n-(g+1); i < n; i++, l--)
        {
            if (mas[l][i] > t) 
            {
                 pos_str = l;
                 pos_stb = i;
                 t = mas[l][i]; 
            }
        }
 
        mas[pos_str][pos_stb] = mas[f][j]; 
        mas[f][j] = t; // меняем местами наименьший с a[i]
        g++;
    }
 
    cout << "\nОтсортированная матрица:\n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
        
    cout << "\n\n";
    return 0;
}
Croessmah
05.01.2013, 13:55
  #7

Не по теме:

Цитата Сообщение от Lotus34 Посмотреть сообщение
Я ж говорю, я понимаю сам процесс, но не могу его правильно реализовать(
Значит не да конца понимаете. Листочек, ручку и вперед прогонять.

Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
06.01.2013, 16:40  [ТС]     Сортировка выбором #8
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Вот подправил твою программу, второе задание сделал методом пузырька, уже вечер, мозги думать не хотят, думаю там уже сам сможешь, если нет, то пиши, помогу чем смогу

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <windows.h>  
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int const n = 3;
    int mas[n][n], k, imax;
 
    cout << "Введите матрицу: \n";
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элемент[" << i+1 << "][" << j+1 << "]: ";
            cin >> mas[i][j];
        }
    }
 
    cout << "\n";
 
    cout << "Исходная матрица: \n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
 
    cout << "\n\nВведите число: ";
        cin >> k;
 
    int s;
    bool flag;
    for(int i = 0; i < n; i++)
    {   
        s = 0;
        flag = false;
        for(int j = 0; j < n; j++)
        {
            if(mas[i][j] == k)
            {    
                s++;
                if(s > 1)
                {
                    imax = i + 1;
                    flag = true;
                }
            }
        }
 
        if(flag == true)
            cout << "\nНомер строки: " << imax;
 
    }
 
    int t, g = 1;
    for(int j = 0, f = n-g; j < n; j++, f--)
    {
 
        for(int i = j+1, l = n-(g+1); i < n; i++, l--)
        {
            if(mas[f][j] < mas[l][i])
            {
                t = mas[l][i];
                mas[l][i] = mas[f][j];
                mas[f][j] = t;
            }
        }
 
        g++;
    }
 
    cout << "\nОтсортированная матрица:\n";
    for(int i = 0; i < n; i++)
    {
        cout << "\n" << "\t";
        for(int j = 0; j < n; j++)
        {
            cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
        }
    }
        
    cout << "\n\n";
    return 0;
}
Все более чем прекрасно выполнено, но можно ли использовать мой код просто вставив сортировку, и реально ли её реализовать без флагов? Или мой код изначально ошибочен?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
06.01.2013, 17:35     Сортировка выбором #9
Lotus34, в этом коде сделано пузырьком, метод выбора реализован в посте 6. Ну мне кажется, что мой код понятней, а флаги для того, чтобы знать какое выводить сообщение, можно конечно было сделать переменную(целочисленную), сделать ее равной 0, а при не выполнении условия увеличивать на единицу, после проверять, если эта переменная равна количеству элементов матрицы, то совпадающих элементов нет Но все же, с флагами лучше.
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
07.01.2013, 17:25  [ТС]     Сортировка выбором #10
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Lotus34, в этом коде сделано пузырьком, метод выбора реализован в посте 6. Ну мне кажется, что мой код понятней, а флаги для того, чтобы знать какое выводить сообщение, можно конечно было сделать переменную(целочисленную), сделать ее равной 0, а при не выполнении условия увеличивать на единицу, после проверять, если эта переменная равна количеству элементов матрицы, то совпадающих элементов нет Но все же, с флагами лучше.
Огромное спасибо, я разобрался с флагом, реально понятней, но до меня туго доходит смысл этой строки
cout << setw(3) << setiosflags(ios::left) << mas[i][j] << " ";
Я поинмаю, что это вывод эл-в массива , но что нам дает это "setw(3) << setiosflags(ios::left)"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 17:33     Сортировка выбором
Еще ссылки по теме:

Сортировка выбором C++
C++ Сортировка выбором
C++ Сортировка выбором

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

Или воспользуйтесь поиском по форуму:
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
07.01.2013, 17:33     Сортировка выбором #11
Lotus34, setw задает ширину столбца а setiosflags(ios::left) выравнивает по левому краю, это параметризованные манипуляторы, чтобы вывод был красивым
Yandex
Объявления
07.01.2013, 17:33     Сортировка выбором
Ответ Создать тему
Опции темы

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