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

Сортировка массива, по возрастанию на главной диагонали - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ char* rev_str(char*); Как обратиться из main()? http://www.cyberforum.ru/cpp-beginners/thread619788.html
Подскажите пожалуйста: ниже приведе прототип функции. Как правильно обратиться к такой функции и что она вернет? По замыслу нужно вернуть строку(или адрес начала или указатель на 0 элемент.. Как то...
C++ Отсортировать масив методом пузырьковой сортировки 1). Создать 2 массива по 5 элементов. Заполнить их случайными числами и отсортировать первый в возрастающем порядке, а второй в убывающем. 2). Скопировать эти массивы в 3-й результирующий (размером... http://www.cyberforum.ru/cpp-beginners/thread619745.html
Конкатенация без <string> C++
Продемонстрируйте работу с указателями. Напишите полностью законченную функцию конкатенации (сложения) двух строк (char *). Использовать функции для работы со строками НЕЛЬЗЯ. С чего хоть...
C++ Построить график зависимости расстояния от водной поверхности до верхней точки плавающего на воде тела
Помогите,пожалуйста ) Построить график зависимости расстояния от водной поверхности до верхней точки плавающего на воде тела от плотности материала данного тела, если это шар диаметра А. ...
C++ Не выводиться последний символ файла http://www.cyberforum.ru/cpp-beginners/thread619726.html
файл содержит по числу на строке 123 456 789 0 на экран почему то выводит все кроме 0 #include <iostream> #include <istream> #include <fstream>
C++ Как првильно организовывать передачу значений (переменных, векторов) между функциями класса? Допустим есть класс. В классе есть одна публичная функция и две приватных. В публичной функции запускается сначала одна приватная, а затем вторая приватная. В первой приватной вычисляется, например,... подробнее

Показать сообщение отдельно
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
05.07.2012, 23:49
Ветка форума C++ так-то, а не C.
Я напишу решение в лучших традициях C.

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
85
86
87
88
89
90
91
#include <stdio.h>
#define N 4
 
int main()
{
    int Matrix[N][N], i, j, TheGreatestElement = 0, RestDiagonal = 0;
/*Matrix - матрица N на N; i, j - индексы; TheGreatrstElement - наибольший эл-т;
RestDiagonal - диагональные эл-ты.*/
    int temp = 0, IndexI = 0, IndexJ = 0, counter=1;
/*temp - временная переменная; IndexI, IndexJ - позиция наибольшего эл-та,
counter - счётчик итераций.*/
 
/*Задаём матрицу.*/
    Matrix[0][0]=1;  Matrix[0][1]=9;  Matrix[0][2]=7;  Matrix[0][3]=10;
    Matrix[1][0]=3;  Matrix[1][1]=5;  Matrix[1][2]=2;  Matrix[1][3]=16;
    Matrix[2][0]=6;  Matrix[2][1]=8;  Matrix[2][2]=4;  Matrix[2][3]=13;
    Matrix[3][0]=14; Matrix[3][1]=11; Matrix[3][2]=12; Matrix[3][3]=15;
 
/*Вывод.*/
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            printf("%d\t", Matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
 
/*Первый проход поместит на позицию [0][0] наибольший элемент.*/
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
             if(Matrix[i][j]>TheGreatestElement)
             {
/*Если текущий элемент больше наибольшего, то делаем его наибольшим.*/
                 TheGreatestElement = Matrix[i][j];
/*И запоминаем индексы.*/
                 IndexI = i;
                 IndexJ = j;
             }
        }
    }
/*Дальше меняем местами наибольший и [0][0].*/
    temp = Matrix[IndexI][IndexJ];
    Matrix[IndexI][IndexJ] = Matrix[0][0];
    Matrix[0][0] = temp;
    
/*Теперь заполняем остальную диагональ. Нам нужно заполнить 
оставшиеся три элемента: [1][1], [2][2] и [3][3].*/
    while(counter < N)
    {
        for(i = 0; i < N; i++)
        {
            for(j = 0; j < N; j++)
            {
/*Условие немного посложнее. Нам нужно, чтобы элемент был вторым по
большинству, то есть, меньше наибольшего.*/
                if(Matrix[i][j]>RestDiagonal&&Matrix[i][j]<TheGreatestElement)
                {
/*Запоминаем его и индексы.*/
                     RestDiagonal = Matrix[i][j];
                     IndexI = i;
                     IndexJ = j;
                }
            }
        }
/*Дальше меняем текущий элемент с диагональным.*/
        temp = Matrix[IndexI][IndexJ];
        Matrix[IndexI][IndexJ] = Matrix[counter][counter];
        Matrix[counter][counter] = temp;
/*А здесь наибольшим становится текущий элемент, постольку поскольку,
нам нужен будет уже третий по старшинству и т.д.*/
        TheGreatestElement = RestDiagonal;
/*Обнуляем то, с чем будем сравнивать. (Кстати, если в матрице только 
отрицательные эл-ты, то 0 нужно заменить на наименьшее отрицательное.*/
        RestDiagonal = 0;
        counter++;
    }
 
/*Здесь просто вывод.*/
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            printf("%d\t", Matrix[i][j]);
        }
        printf("\n");
    }
}
Вот... Конечно, тут тоже много косяков, но что-то менее тривиальное, чем брутфорс, сочинить я сейчас не смогу.
Смысл алгоритма, я думаю, понятен.
Вопросы пожалуйста.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.