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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
02.10.2011, 07:39     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #1
дана матрица размерностью 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2011, 07:39     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию
Посмотрите здесь:

Массивы. подсчитать среднее арифметическое нечетных элементов расположенные выше главной диагонали C++
Матрицы. Отрицательные элементы матрицы, расположенные выше главной диагонали, заменить на квадраты их значений C++
C++ Отсортировать диагонали матрицы, параллельные главной, по убыванию элементов методом вставки
Вывести на экран значения тех эле-ментов, лежащих выше главной диагонали, которые больше всех элементов, лежащих ниже главной диагонали C++
Найти минимальный из элементов ниже главной и выше побочной диагонали и поменять его местами с первым элементом матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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];
        }}
это касается сортировок диагоналей расположенных и выше и ниже главной диагонали.
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
02.10.2011, 13:23  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #3
тогда почему для эл-в выше главной диагонали программа работает
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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, это не значит, что на другом компьютере или другом компиляторе будут такие же (даже не расчитывайте на это).
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 21:46  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #5
valeriikozlov, да действительно вы правы дело в этом, но никак не могу подобрать "n" чтобы все элементы попадали и числа были нормальными.....
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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;
}
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 23:13  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #7
valeriikozlov, работает идеально, спасибо большое

Добавлено через 24 минуты
valeriikozlov, можете подсказать с еще одной программой?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
10.10.2011, 23:23     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #8
Цитата Сообщение от Ириска5 Посмотреть сообщение
valeriikozlov, можете подсказать с еще одной программой?
давайте попробую
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 23:29  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #9
дана последовательность целых чисел. Удалить из массива все элементы,в записи которых все цифры различны.
при решении задачи нужно использовать библиотеку <vector> , <algorithm> и пользоваться итераторами ( не обязательно всё сразу )
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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, то удаляете этот элемент вектора.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 11:47     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #11
или можно использовать фунцию remove_if, раз у нас есть булевский предикат для определения удовлетворяет ли элемент условию

Не по теме:


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

Ириска5
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;
}
вот программа, но почему то она работает не верно,удаляет в каком то непонятном порядке
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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;
}
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 23:55  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #14
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами и я немного не поняла как работает bool
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 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 в винде)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2011, 16:04     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию
Еще ссылки по теме:

Верно ли, что среднее арифметическое элементов выше главной диагонали больше среднего арифметического элементов ниже главной диагонали C++
C++ Вычислить сумму тех из m элементов, которые превосходят по величине все элементы, расположенные ниже главной диагонали
Определить: сумма элементов выше главной диагонали меньше суммы элементов ниже главной диагонали? C++

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

Или воспользуйтесь поиском по форуму:
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
12.10.2011, 16:04  [ТС]     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию #17
valeriikozlov, как вы сложно описали....я сегодня с утречка посмотрела на свежую голову как бы и всё поняла,спасибо вам большое за помощь
Yandex
Объявления
12.10.2011, 16:04     Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию
Ответ Создать тему
Опции темы

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