Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
1

Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию

02.10.2011, 07:39. Показов 4593. Ответов 16
Метки нет (Все метки)

дана матрица размерностью nxn, содержащая целые числа. Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию элементов методом выбора

моя исходная матрица :
4 4
0 1 -3 3
2 2 9 4
5 10 6 8
0 2 9 4

программа выводит следующее:

4 4
0 9 4 3
-858993460 2 8 -3
-858993460-858993460 6 1
-858993460-858993460-858993460 4

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

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
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
 
void sort(int *a,int n)
{
    int temp;
    int lowindex,lowkey,i,j;
    for (i=0; i<n-1; ++i)
    {
        lowindex=i;
        lowkey=a[i];
        for (j=i+1; j<n; ++j)
            if (a[j]>lowkey) 
            {lowkey=a[j];
             lowindex=j;}
        temp=a[i];
        a[i]=a[lowindex];
        a[lowindex]=temp;
    }
}
void sort1(int *a,int n)
{
    int temp;
    int lowindex,lowkey,i,j;
    for (i=0; i<n-1; ++i)
    {
        lowindex=i;
        lowkey=a[i];
        for (j=i+1; j<n; ++j)
            if (a[j]<lowkey) 
            {lowkey=a[j];
             lowindex=j;}
        temp=a[i];
        a[i]=a[lowindex];
        a[lowindex]=temp;
    }
}
 
int main()
{
    int n,m,i,j;
    int a[10][10];
    in>>n>>m;
    for (i=0; i<n; ++i)
        for (j=0; j<m; ++j)
            in>>a[i][j];
    int b[10];
    {for( j=1; j<m; j++)
        {
            for ( i=0; i<n; i++)
            b[i]=a[i][j+i];
    sort(b,n);
    for ( i=0; i<n; i++)
        a[i][j+i]=b[i];
    }}
 
 
    int c[10];
    for ( j=1; j<n; j++)
    {
        for( i=0; i<m; i++)
            c[i]=a[i+j][i];
        sort(c,n);
        for( i=0; i<m; i++)
            a[i+j][i]=c[i];
    }
 
        out<<n<<'\t'<<m<<'\n';
    for ( i=0; i<n; i++)
    {
        for( j=0; j<m; j++)
            out<< setw(5)<<a[i][j];
        out<<'\n';
    }
    
    in.close();
    out.close();
    system ("pause");
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2011, 07:39
Ответы с готовыми решениями:

Матрицы. Отрицательные элементы матрицы, расположенные выше главной диагонали, заменить на квадраты их значений
Отрицательные элементы матрицы (n=6; m=6), расположенные выше главной диагонали, заменить на...

Все элементы матрицы, расположенные на главной диагонали и ниже ее, расположить в начале массива E
Помогите на с++ написать эту программу:Все элементы, расположенные на главной диагонали и ниже ее,...

Найти сумму элементов матрицы, расположенных выше главной диагонали и ниже побочной диагонали
не соображу В среде MS Visual C++ разработать программу, которая формирует матрицу размером n х n...

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

16
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.10.2011, 11:28 2
Цитата Сообщение от Ириска5 Посмотреть сообщение
подскажите в чем моя ошибка
Ошибка здесь:
C++
1
2
3
4
5
6
7
8
        {for( j=1; j<m; j++)
                {
                        for ( i=0; i<n; i++)
                        b[i]=a[i][j+i];// подумайте какое значение имеет a[i][j+i] например при i==n-1 и при j==m-1
        sort(b,n);// всегда ли нужно будет сортировать n элементов, или это количество будет уменьшаться при удалении от главной диагонали
        for ( i=0; i<n; i++)
                a[i][j+i]=b[i];
        }}
это касается сортировок диагоналей расположенных и выше и ниже главной диагонали.
0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
02.10.2011, 13:23  [ТС] 3
тогда почему для эл-в выше главной диагонали программа работает
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.10.2011, 17:03 4
Цитата Сообщение от Ириска5 Посмотреть сообщение
тогда почему для эл-в выше главной диагонали программа работает
Вам просто повезло...
На самом деле, судя по этим результатам:

Цитата Сообщение от Ириска5 Посмотреть сообщение
программа выводит следующее:
4 4
0 9 4 3
-858993460 2 8 -3
-858993460-858993460 6 1
-858993460-858993460-858993460 4
неинициализированные элементы массива имеют у Вас значения -858993460. А диагонали выше главной Вы сортируете по убыванию. Поэтому эти неициализированные значения у Вас и не попадают на экран (но в самой сортировке они участвуют).
Кстати, то что у Вас неинициализированные элементы массива имеют у Вас значения -858993460, это не значит, что на другом компьютере или другом компиляторе будут такие же (даже не расчитывайте на это).
0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 21:46  [ТС] 5
valeriikozlov, да действительно вы правы дело в этом, но никак не могу подобрать "n" чтобы все элементы попадали и числа были нормальными.....
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.10.2011, 22:23 6
Ириска5, проверяйте:
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
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
 
void sort(int a[10][10],int n, int m)
{
    int i, j, tmp, m1, y;
    for(i=1; i<m-1; i++)
    {
        for(j=0; j<n && j+i<m; j++)
        {
            m1=j;
            for(y=j+1; y<n && y+i<m; y++)
                if(a[m1][i+m1]<a[y][y+i])
                    m1=y;
            tmp=a[j][i+j];
            a[j][i+j]=a[m1][i+m1];
            a[m1][i+m1]=tmp;
        }
    }
    for(i=1; i<n-1; i++)
    {
        for(j=0; j<n && j+i<m; j++)
        {
            m1=j;
            for(y=j+1; y<n && y+i<m; y++)
                if(a[m1+i][m1]>a[y+i][y])
                    m1=y;
            tmp=a[j+i][j];
            a[j+i][j]=a[m1+i][m1];
            a[m1+i][m1]=tmp;
        }
    }
 
}
 
int main()
{
        int n,m,i,j;
        int a[10][10];
        in>>n>>m;
        for (i=0; i<n; ++i)
                for (j=0; j<m; ++j)
                        in>>a[i][j];
        sort(a,n, m);
        out<<n<<'\t'<<m<<'\n';
        for ( i=0; i<n; i++)
        {
                for( j=0; j<m; j++)
                        out<< setw(5)<<a[i][j];
                out<<'\n';
        }
        
        in.close();
        out.close();
        system ("pause");
        return 0;
}
2
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 23:13  [ТС] 7
valeriikozlov, работает идеально, спасибо большое

Добавлено через 24 минуты
valeriikozlov, можете подсказать с еще одной программой?
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.10.2011, 23:23 8
Цитата Сообщение от Ириска5 Посмотреть сообщение
valeriikozlov, можете подсказать с еще одной программой?
давайте попробую
0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 23:29  [ТС] 9
дана последовательность целых чисел. Удалить из массива все элементы,в записи которых все цифры различны.
при решении задачи нужно использовать библиотеку <vector> , <algorithm> и пользоваться итераторами ( не обязательно всё сразу )
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.10.2011, 07:24 10
Ириска5, Вот Вам функция в помощь, которая возвращает true, если в числе все цифры различны. И возвращает false когда наоборот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool func(int a)
{
    bool mas[10]={0};
    while(a>0)
    {
        if(mas[a%10])
            return false;
        mas[a%10]=!mas[a%10];
        a/=10;
    }
    return true;
}
Вам осталось самую малость:
- создать vector
- ввести в него данные
- затем пройтись по вектору и вызывать для каждого элемента вышенаписанную функцию. Если функция возвращает false, то удаляете этот элемент вектора.
0
446 / 209 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 11:47 11
или можно использовать фунцию remove_if, раз у нас есть булевский предикат для определения удовлетворяет ли элемент условию

Не по теме:


Помню, в учебнике Павловской был похожий пример. Может, это и не самый лучший учебник по С++. но кое-что можно оттуда взять

0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 22:34  [ТС] 12
valeriikozlov,
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>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
 
bool func(int a)
{
        bool mas[10]={0};
        while(a>0)
        {
                if(mas[a%10])
                        return false;
                mas[a%10]=!mas[a%10];
                a/=10;
        }
        return true;
}
 
int main(void)
{ 
    vector <int> iVec;
    vector <int>::iterator iEnd;
    int n,x;
    cout<<"n=";
    cin>>n;
    for (int i=0; i<n; i++)
    {
        cout<<"enter element with nomber"<<i<<endl;
        cin>>x;
        iVec.push_back(x);
        cout<<endl;
    }
    for(vector <int>::iterator iter=iVec.begin(); iter<iVec.end(); iter++)
    {
        if( func(*iter)== false ) 
        iEnd=remove(iter,iter,*iter);
    }
    for(vector <int>::iterator iter=iVec.begin(); iter<iEnd; iter++)
      cout<<*iter<<endl;
    system("PAUSE");
    return 0;
}
вот программа, но почему то она работает не верно,удаляет в каком то непонятном порядке
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.10.2011, 23:23 13
Ириска5, честно скажу что с stl пока не до конца разобрался (чаще всего обхожусь без stl). Но Вам могу пояснить Ваши ошибки - при удалении элемента вектора вот здесь:
C++
1
2
3
4
5
        for(vector <int>::iterator iter=iVec.begin(); iter<iVec.end(); iter++)
        {
                if( func(*iter)== false ) 
                iEnd=remove(iter,iter,*iter);
        }
iter может указывать уже даже и не на элемент вектора iVec. Вам нужно почитать про перераспределение памяти при удалении элементов вектора.
Вот Вам рабочий вариант (можно и лучше написать, но это буду не я):
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
 
bool func(int a)
{
        bool mas[10]={0};
        while(a>0)
        {
                if(mas[a%10])
                        return false;
                mas[a%10]=!mas[a%10];
                a/=10;
        }
        return true;
}
 
int main(void)
{ 
        vector <int> iVec;
 
        int n,x;
        cout<<"n=";
        cin>>n;
        for (int i=0; i<n; i++)
        {
                cout<<"enter element with nomber"<<i<<endl;
                cin>>x;
                iVec.push_back(x);
                cout<<endl;
        }
        vector <int>::iterator I=iVec.begin();
        while(I!=iVec.end())
        {
            for(I=iVec.begin(); I!=iVec.end(); I++)
                if(!func(*I))
                {
                    iVec.erase(I);
                    I=iVec.begin();
                    break;
                }               
        }
 
        for(vector <int>::iterator iter=iVec.begin(); iter!=iVec.end(); iter++)
          cout<<*iter<<endl;
        system("PAUSE");
        return 0;
}
1
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 23:55  [ТС] 14
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами и я немного не поняла как работает bool
0
Эксперт С++
4717 / 2538 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.10.2011, 07:20 15
Цитата Сообщение от Ириска5 Посмотреть сообщение
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами
да тут Вы правы - я не внимательно прочитал задание.

Цитата Сообщение от Ириска5 Посмотреть сообщение
не поняла как работает bool
см комментарии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool func(int a)
{
        bool mas[10]={0}; // изначально в mas[10] все элементы равны false
        while(a>0)
        {
                if(mas[a%10])// если элемент массива с индексом равным последней цифре числа a уже равен true (значит такая цифра уже встречалась в числе a)
                        return false;// сразу же выходим из функции и возвращаем значение false (значит в числе a есть одинаковые цифры)
                mas[a%10]=!mas[a%10];// меняем значение элемента массива с индексом равным последней цифре числа a на противоположное (на самом деле меняться будут только элементы равные false на значение true. Наоборот никогда не будет - для этого предусмотрен случай описанный выше)
                a/=10;// убираем последнюю цифру числа a
        }
        return true;// если мы дошли сюда, значит одинаковых цифр в числе a не было и мы возвращаем true
}
1
Higher
1948 / 1214 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.10.2011, 08:46 16
Примерно так(функцию готовую взял)
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
bool func(int a)
{
        bool mas[10]={0};
        while(a>0)
        {
                if(mas[a%10])
                        return false;
                mas[a%10]=!mas[a%10];
                a/=10;
        }
        return true;
}
 
int main()
{
    std::cout << "Enter array(EOF to terminate): ";
    std::vector<int> vec( std::istream_iterator<int> ( std::cin ), 
                            std::istream_iterator<int> () );
    vec.erase( std::remove_if( vec.begin(), vec.end(), func), vec.end() );
    std::cout << "Result: ";
    std::copy( vec.begin(), vec.end(), 
                std::ostream_iterator<int> (std::cout, " ") );                          
}
Для окончания ввода надо ввести EOF(Ctrl+Z в винде)
0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
12.10.2011, 16:04  [ТС] 17
valeriikozlov, как вы сложно описали....я сегодня с утречка посмотрела на свежую голову как бы и всё поняла,спасибо вам большое за помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2011, 16:04

Отсортировать по убыванию элементы матрицы ниже главной диагонали
Необходимо. Создать квадратную матрицу размера MxM, где M является целым числом из диапазона ....

Элементы матрицы выше главной диагонали отсортировать по возрастанию
Отсортировать элементы матрицы по возростанию, которые находятся выше главной диагонали. Сделал...

Отсортировать элементы выше главной диагонали матрицы по возрастанию, а ниже главной диагонали по убыванию
1) Вводится массив 6*6. Отсортировать элементы выше главной диагонали по возрастанию, а ниже...

Найти количество нулевых элементов матрицы, стоящих: выше главной диагонали; ниже главной диагонали
Дана квадратная вещественная матрица размерности n. Найти количество нулевых элементов, стоящих:...


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

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

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