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

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

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

Показать сообщение отдельно
Thirteen
 Аватар для 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");
    }
}
Вот... Конечно, тут тоже много косяков, но что-то менее тривиальное, чем брутфорс, сочинить я сейчас не смогу.
Смысл алгоритма, я думаю, понятен.
Вопросы пожалуйста.
 
Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru