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

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

02.10.2011, 07:39. Просмотров 2880. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2011, 07:39
Ответы с готовыми решениями:

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

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

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

Верно ли, что среднее арифметическое элементов выше главной диагонали больше среднего арифметического элементов ниже главной диагонали
Дана квадратная матрица натуральных чисел.Определить верно ли...

Найти максимум среди элементов матрицы ниже главной и выше побочной диагонали
Дана квадратная матрица целых чисел размером N&lt;=12. Заполнить матрицу...

16
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 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];
        }}
это касается сортировок диагоналей расположенных и выше и ниже главной диагонали.
0
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
02.10.2011, 13:23  [ТС] 3
тогда почему для эл-в выше главной диагонали программа работает
0
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 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, это не значит, что на другом компьютере или другом компиляторе будут такие же (даже не расчитывайте на это).
0
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 21:46  [ТС] 5
valeriikozlov, да действительно вы правы дело в этом, но никак не могу подобрать "n" чтобы все элементы попадали и числа были нормальными.....
0
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 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;
}
2
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
10.10.2011, 23:13  [ТС] 7
valeriikozlov, работает идеально, спасибо большое

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

Не по теме:


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

0
Ириска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;
}
вот программа, но почему то она работает не верно,удаляет в каком то непонятном порядке
0
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 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;
}
1
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 23:55  [ТС] 14
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами и я немного не поняла как работает bool
0
valeriikozlov
Эксперт С++
4686 / 2512 / 751
Регистрация: 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
}
1
diagon
Higher
1937 / 1203 / 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
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
12.10.2011, 16:04  [ТС] 17
valeriikozlov, как вы сложно описали....я сегодня с утречка посмотрела на свежую голову как бы и всё поняла,спасибо вам большое за помощь
0
12.10.2011, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2011, 16:04

Массивы. подсчитать среднее арифметическое нечетных элементов расположенные выше главной диагонали
дан массив n на m, элементы которого целый числа, подсчитать среднее...

Определить: сумма элементов выше главной диагонали меньше суммы элементов ниже главной диагонали?
Дана квадратная матрица натуральных чисел,( получаемая через rand())...

Найти сумму элементов матрицы ниже главной диагонали, и произведение элементов выше нее
Добрый день, помогите найти ошибку в коде, вот задание: В матрице размером n...


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

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

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