С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40

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

02.10.2011, 07:39. Показов 6546. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2011, 07:39
Ответы с готовыми решениями:

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

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

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

16
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.10.2011, 11:28
Цитата Сообщение от Ириска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  [ТС]
тогда почему для эл-в выше главной диагонали программа работает
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.10.2011, 17:03
Цитата Сообщение от Ириска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  [ТС]
valeriikozlov, да действительно вы правы дело в этом, но никак не могу подобрать "n" чтобы все элементы попадали и числа были нормальными.....
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.10.2011, 22:23
Ириска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  [ТС]
valeriikozlov, работает идеально, спасибо большое

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

Не по теме:


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

0
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 40
11.10.2011, 22:34  [ТС]
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
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.10.2011, 23:23
Ириска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  [ТС]
valeriikozlov, только надо убрать "!" в func(*I) тогда она будет удалять с различными цифрами и я немного не поняла как работает bool
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.10.2011, 07:20
Цитата Сообщение от Ириска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
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.10.2011, 08:46
Примерно так(функцию готовую взял)
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  [ТС]
valeriikozlov, как вы сложно описали....я сегодня с утречка посмотрела на свежую голову как бы и всё поняла,спасибо вам большое за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2011, 16:04
Помогаю со студенческими работами здесь

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

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

Элементы матрицы выше главной диагонали отсортировать по возрастанию
Отсортировать элементы матрицы по возростанию, которые находятся выше главной диагонали. Сделал такой код: #include &lt;iostream&gt;...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru