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

Поменять местами наименьший и второй по величине элементы - C++

Войти
Регистрация
Восстановить пароль
 
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
10.06.2009, 23:09     Поменять местами наименьший и второй по величине элементы #1
Здравствуйте господа программисты. Помогите исправит ошибку в программе. Задание собственно следующее:Поменять местами наименьший и второй по величине элементы в каждой строке матрицы.Писал прогу с паскаля, где то закралась ошибка.. Ни как не могу ее найти.. Программа меняет местами наименьший и наибольший элементы. Вот собственно код:
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
void ReadMatrix(int Line, int Column, int** Matrix, FILE *FileIn)
{
        for (int i=0; i<Line; i++)
          for (int j=0; j<Column; j++)
            fscanf(FileIn,"%3d",&Matrix[i][j]);
}
 
void PrintMatrix(int Line, int Column, int** Matrix)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            printf("%3d",Matrix[i][j]);
          printf("\n");
        }
}
 
void FindMinElement(int** Matrix, int Column, int NumStr, int &JMin)
{
        int Min;
        Min=Matrix[NumStr][0];
        JMin=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]<Min)
          {
            Min=Matrix[NumStr][j];
            JMin=j;
          }
}
 
void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax1=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Max)
          {
            Max=Matrix[NumStr][j];
            JMax1=j;
          }
}
 
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) || (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
}
 
void Bubble(int** Matrix, int NumStr, int JMin, int JMax2)
{
        int Buf;
        Buf=Matrix[NumStr][JMin];
        Matrix[NumStr][JMin]=Matrix[NumStr][JMax2];
        Matrix[NumStr][JMax2]=Buf;
}
 
void ChargeByPlacesMinAndSecondMaxElements(int** Matrix, int Line, int Column)
{
        int JMin,JMax1,JMax2;
        for (int i=0; i<Line; i++)
        {
          FindMinElement(Matrix,Column,i,JMin);
          FindFirstMaxElement(Matrix,Column,i,JMax1);
          FindSecondMaxElement(Matrix,Column,i,JMax1,JMax2);
          Bubble(Matrix,i,JMin,JMax2);
        }
}
 
void WriteMatrixToFile(int** Matrix, int Line, int Column, FILE *FileOut)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            fprintf(FileOut,"%3d",Matrix[i][j]);
            fprintf(FileOut,"\n");
        }
}
 
void main()
{
        int** Matrix;
        int Line,Column,i;
        FILE *FileIn,*FileOut;
        char NameFileIn[30],NameFileOut[30];
        printf("Введите имя входного файла ");
        scanf("%s",NameFileIn);
        printf("Введите имя выходного файла ");
        scanf("%s",NameFileOut);
        FileIn=fopen(NameFileIn,"r");
        fscanf(FileIn,"%d",&Line);
        fscanf(FileIn,"%d",&Column);
        Matrix=(int**)malloc(Line*sizeof(int*));
        for (i=0; i<Column; i++)
          Matrix[i]=(int*)malloc(Column*sizeof(int*));
        printf("\nИсходная матрица имеет следующий вид:\n");
        ReadMatrix(Line,Column,Matrix,FileIn);
        fclose(FileIn);
        PrintMatrix(Line,Column,Matrix);
        ChargeByPlacesMinAndSecondMaxElements(Matrix,Line,Column);
        printf("\nМатрица после преобразований:\n");
        PrintMatrix(Line,Column,Matrix);
        FileOut=fopen(NameFileOut,"w");
        WriteMatrixToFile(Matrix,Line,Column,FileOut);
        for (i=0; i<Line; i++)
          free(Matrix[i]);
        free(Matrix);
        fclose(FileOut);
        getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2009, 23:09     Поменять местами наименьший и второй по величине элементы
Посмотрите здесь:

C++ Поменять местами наибольший и наименьший элементы
C++ Поменять местами наибольший и наименьший элементы?
C++ Массивы: наибольший и наименьший элементы прямоугольной матрицы и поменять их местами
Матрицы: найти наибольший и наименьший элементы и поменять их местами C++
C++ Найти наибольший и наименьший элементы и поменять их местами.
C++ Матрицы. Поменять местами наибольший и наименьший элементы
Поменять местами наибольший и наименьший элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 00:35     Поменять местами наименьший и второй по величине элементы #2
Эсли я правильно понял второй по велечине елемент в масиве например 1 2 3 4 - это 3, то ищиш максимальный а потом ищё раз но выключаешь максимальний елемент.
например:
if(a[i][j]!=max&& max2>a[i][j])...

Добавлено через 1 минуту 17 секунд
Оно походу максимальный ищет...
C++
1
2
3
4
5
6
7
8
9
10
11
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) || (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
11.06.2009, 00:38     Поменять местами наименьший и второй по величине элементы #3
Условие поменяй.... вместо:
C++
1
if ((Matrix[NumStr][j]>Max) || (j!=JMax1))
сделай так:
C++
1
if ((Matrix[NumStr][j]>Max) && (j!=JMax1))
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 00:40     Поменять местами наименьший и второй по величине элементы #4
Пробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max,Max2;
        Max=Matrix[NumStr][0];
        Max2=0;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Matrix[NumStr][Max]))
          {
            Max2=Max;
            Max=j;
          }
}
Добавлено через 1 минуту 21 секунду
Условие поменяй.... вместо:
FunDuck, Оно походу ничего недаст...
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 00:44  [ТС]     Поменять местами наименьший и второй по величине элементы #5
Неа, тоже не работает... Я уже 2 час думаю над условием... В паскале все работала хорошо, а вот в Си не хочет
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 00:45     Поменять местами наименьший и второй по величине элементы #6
S2dent, Попробуй стелать как я написал...

C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        
        int Max=Matrix[NumStr][0];
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Matrix[NumStr][Max]))
          {
            JMax2=Max;
            Max=j;
          }
}
Так должно работать... И Эсли так запишеш то

C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax1=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Max)
          {
            Max=Matrix[NumStr][j];
            JMax1=j;
          }
}
Можно воопше выкинуть...
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 00:54  [ТС]     Поменять местами наименьший и второй по величине элементы #7
Ну я изменил вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax2=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Matrix[NumStr][Max])
          {
            Max=j;
            JMax2=Max;
          }
}
И все равно меняет максимальный и минимальный элементы...
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
11.06.2009, 00:54     Поменять местами наименьший и второй по величине элементы #8
Мда.... говорю же поменяй условие... у меня так все норм..:
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
void ReadMatrix(int Line, int Column, int** Matrix, FILE *FileIn)
{
        for (int i=0; i<Line; i++)
          for (int j=0; j<Column; j++)
            fscanf(FileIn,"%3d",&Matrix[i][j]);
}
 
void PrintMatrix(int Line, int Column, int** Matrix)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            printf("%3d",Matrix[i][j]);
          printf("\n");
        }
}
 
void FindMinElement(int** Matrix, int Column, int NumStr, int &JMin)
{
        int Min;
        Min=Matrix[NumStr][0];
        JMin=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]<Min)
          {
            Min=Matrix[NumStr][j];
            JMin=j;
          }
}
 
void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax1=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Max)
          {
            Max=Matrix[NumStr][j];
            JMax1=j;
          }
}
 
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) && (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
}
 
void Bubble(int** Matrix, int NumStr, int JMin, int JMax2)
{
        int Buf;
        Buf=Matrix[NumStr][JMin];
        Matrix[NumStr][JMin]=Matrix[NumStr][JMax2];
        Matrix[NumStr][JMax2]=Buf;
}
 
void ChargeByPlacesMinAndSecondMaxElements(int** Matrix, int Line, int Column)
{
        int JMin,JMax1,JMax2;
        for (int i=0; i<Line; i++)
        {
          FindMinElement(Matrix,Column,i,JMin);
          FindFirstMaxElement(Matrix,Column,i,JMax1);
          FindSecondMaxElement(Matrix,Column,i,JMax1,JMax2);
          Bubble(Matrix,i,JMin,JMax2);
        }
}
 
void WriteMatrixToFile(int** Matrix, int Line, int Column, FILE *FileOut)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            fprintf(FileOut,"%3d",Matrix[i][j]);
            fprintf(FileOut,"\n");
        }
}
 
void main()
{
        int** Matrix;
        int Line,Column,i;
        FILE *FileIn,*FileOut;
        char NameFileIn[30],NameFileOut[30];
        printf("Vxodnoi file ");
        scanf("%s",NameFileIn);
        printf("Output file ");
        scanf("%s",NameFileOut);
        FileIn=fopen(NameFileIn,"r");
        fscanf(FileIn,"%d",&Line);
        fscanf(FileIn,"%d",&Column);
        Matrix=(int**)malloc(Line*sizeof(int*));
        for (i=0; i<Column; i++)
          Matrix[i]=(int*)malloc(Column*sizeof(int*));
        printf("\nMatrix 1:\n");
        ReadMatrix(Line,Column,Matrix,FileIn);
        fclose(FileIn);
        PrintMatrix(Line,Column,Matrix);
        ChargeByPlacesMinAndSecondMaxElements(Matrix,Line,Column);
        printf("\nMatrix2:\n");
        PrintMatrix(Line,Column,Matrix);
        FileOut=fopen(NameFileOut,"w");
        WriteMatrixToFile(Matrix,Line,Column,FileOut);
        for (i=0; i<Line; i++)
          free(Matrix[i]);
        free(Matrix);
        fclose(FileOut);
        getch();
}
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 00:57     Поменять местами наименьший и второй по величине элементы #9
И все равно меняет максимальный и минимальный элементы...
\
C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax2=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Matrix[NumStr][Max])
          {
            JMax2=Max;
            Max=j;
          }
}
Вот так 100% пойдет
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:01  [ТС]     Поменять местами наименьший и второй по величине элементы #10
2 FunDuck а у меня не пашет с таким условием... Проверял уже, до размещения сообщения здесь)))

Добавлено через 3 минуты 34 секунды
Верите нет, но так тоже не пашет... Попрежнему меняется минимальный и максимальный элементы...
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 01:02     Поменять местами наименьший и второй по величине элементы #11
Вот так 100% пойдет
И void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1) Можно Выбросить...
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:05  [ТС]     Поменять местами наименьший и второй по величине элементы #12
Всё заработало... А не могли бы Вы пояснить эту функцию?
ZVolodumur
49 / 49 / 3
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 01:10     Поменять местами наименьший и второй по величине элементы #13
Вот так правельней будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;//максимальный елемент
        Max=0;//Сначала присваиваится индекс первого елемента
        JMax2=-1;//Второй по размеру
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Matrix[NumStr][Max]) //если находит елемент больше, то макимальний который бил
          {                             //присваивает второму по размееру. А тот что больше максимальному... и т д...
            JMax2=Max;            //В конце остаеться максимальный...и Второй по размеру...
            Max=j;
          }
}
Добавлено через 31 секунду
Всё заработало... А не могли бы Вы пояснить эту функцию?
Это ко мне?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2009, 01:16     Поменять местами наименьший и второй по величине элементы
Еще ссылки по теме:

C++ Поменять местами наибольший и наименьший элементы
Поменять местами наибольший и наименьший элементы массива C++
C++ Поменять местами наибольший и наименьший элементы
Поменять местами наибольший и наименьший элементы массива C++
C++ Поменять местами наибольший и наименьший элементы последовательности

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

Или воспользуйтесь поиском по форуму:
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:16  [ТС]     Поменять местами наименьший и второй по величине элементы #14
Да это к Вам, спасибо!

Добавлено через 3 минуты 46 секунд
Спасибо еще раз!
Yandex
Объявления
11.06.2009, 01:16     Поменять местами наименьший и второй по величине элементы
Ответ Создать тему
Опции темы

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