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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
05.07.2012, 22:28     Сортировка массива, по возрастанию на главной диагонали #1
Условие программы которую нужно написать на с:
путем перестановки квадратной вещественной матрицы добиться того, чтобы ее максимальный элемент находился в левом верхнем углу, следующий по величине - в позиции (2,2), следующий по величине в (3,3) и т.д., заполнив таким образом всю главную диагональ.
Найти номер первой из строк, не содержащей ни одного положительного элемента.
Суть в том что на главной диагонали должны быть максимальные элементы в порядке убывания, а те элементы что стояли на главной диагонали переходят на их места.
------------------------
Со вторым пунктом задания я справился легко. А вот с первым сколько не бился не могу, спрашивал у одногрупника, который лучше понимает программирование, он тоже посидев пару часиков сказал мне что путь только на форум. Помогите плиз. Это задание из моей летней практики в учебнике ""Павловская Т.А., Щупак Ю.А. - С и С++. Структурное программирование"".
Или хотябы подскажите какой тип сортировки мне поможет сдесь....
текст на С:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
/*
* 
*/
int main(int argc, char** argv) {
float arr[100][100];
float nov[100][100];
int i, j, k, s, n, p, t, min, kr;
 
k=0;
float max;
float sred, lm;
FILE *fl;
printf("BBedite razmer kvadratnoy matrici n = ");
scanf("%d", &n);
printf("\n");
fl=fopen("text.txt", "r");
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
fscanf(fl, "%f", &arr[i][j]);
fscanf(fl, "%f", &nov[i][j]);
}
}
printf("\n");
 
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
printf("%1.f ", arr[i][j]);
}
printf("\n");
}
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(arr[i][j]<0){
k+=1;
}
}
if(k!=n){
k=0;
 
}
else{
s=i;
break;
}
}
 
printf("stroka pod nomerom %d imeet vse oricatelnye elementy\n", s);
float tmp=arr[1][1];
 
 
for(i=1; i<=n; i++){
for(j=1;j<=n;j++){
if(nov[i][j]>tmp){
lm=tmp;
tmp=nov[i][j];
nov[i][j]=lm;
}
}
}
 
 
 
 
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
printf("%1.f ", arr[i][j]);
}
printf("\n");
} 
return (EXIT_SUCCESS);
}
Знаю что косяков много, не судите строго программирую не давно так что, очень большое быдло....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2012, 22:28     Сортировка массива, по возрастанию на главной диагонали
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thirteen
 Аватар для Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
05.07.2012, 23:49     Сортировка массива, по возрастанию на главной диагонали #2
Ветка форума 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");
    }
}
Вот... Конечно, тут тоже много косяков, но что-то менее тривиальное, чем брутфорс, сочинить я сейчас не смогу.
Смысл алгоритма, я думаю, понятен.
Вопросы пожалуйста.
HarryPhomin
1 / 1 / 0
Регистрация: 05.07.2012
Сообщений: 34
06.07.2012, 10:10  [ТС]     Сортировка массива, по возрастанию на главной диагонали #3
Большое спасибо за такое подробное объяснение! Программа отлично работает!
Я изначально делал похоже такое же условие в if но дальше с переприсваиваниями я не смог раззобраться. TheGreatestElement = RestDiagonal; RestDiagonal = 0;
Вот про эти строчки я видимо забыл. Еще раз спасибо!
Yandex
Объявления
06.07.2012, 10:10     Сортировка массива, по возрастанию на главной диагонали
Ответ Создать тему
Опции темы

Текущее время: 01:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru