Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
#1

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

02.10.2011, 07:39. Просмотров 2542. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортировать диагонали матрицы,расположенные выше главной, по убыванию элементов, а диагонали матрицы, расположенные ниже главной, по возрастанию (C++):

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

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

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

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

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

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

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

Добавлено через 24 минуты
valeriikozlov, можете подсказать с еще одной программой?
0
valeriikozlov
Эксперт С++
4673 / 2499 / 321
Регистрация: 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
Эксперт С++
4673 / 2499 / 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, то удаляете этот элемент вектора.
0
aeshes
441 / 204 / 13
Регистрация: 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
Эксперт С++
4673 / 2499 / 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;
}
1
Ириска5
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 23:55  [ТС] #14
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами и я немного не поняла как работает bool
0
valeriikozlov
Эксперт С++
4673 / 2499 / 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
}
1
12.10.2011, 07:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2011, 07:20
Привет! Вот еще темы с ответами:

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

Отсортировать диагонали матрицы, параллельные главной, по убыванию элементов методом вставки - C++
Помогите исправить код, не могу доработать её. #include &lt;fstream&gt; #include &lt;iomanip&gt; #include &lt;iostream&gt; using namespace...

Вывести на экран значения тех эле-ментов, лежащих выше главной диагонали, которые больше всех элементов, лежащих ниже главной диагонали - C++
А кто-нибудь может помочь еще с этим: Дан вещественный массив А. Вывести на экран значения тех эле-ментов, лежащих выше главной...

Вычислить сумму тех из m элементов, которые превосходят по величине все элементы, расположенные ниже главной диагонали - C++
Дана действительная квадратная матрица порядка n. Вычислить сумму тех из m элементов, расположенных по главной диагонали выше неё, которые...


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

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

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