Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
52 / 50 / 24
Регистрация: 10.05.2009
Сообщений: 216
1

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

10.06.2009, 23:09. Просмотров 1401. Ответов 13
Метки нет (Все метки)

Здравствуйте господа программисты. Помогите исправит ошибку в программе. Задание собственно следующее:Поменять местами наименьший и второй по величине элементы в каждой строке матрицы.Писал прогу с паскаля, где то закралась ошибка.. Ни как не могу ее найти.. Программа меняет местами наименьший и наибольший элементы. Вот собственно код:
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();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2009, 23:09
Ответы с готовыми решениями:

Поменять местами второй по величине элемент массива с последним
Помогите поменять получившийся элемент массива (он второй по величине) с последним. Спасибо ...

Динамика. Поменять местами наименьший и второй по величине элементы
Доброго времени суток господа программисты! Вот возникла проблема с решением задачи: Поменять...

Найти наибольший и наименьший по абсолютной величине элементы матрицы и поменять их местами
Дана целочисленная матрица {Aij}i=1..n,j=1..m (n,m&lt;=100). Найти наибольший и наименьший по...

Поменять местами второй по величине максимальный и минимальный элементы
Дан массив A, заполненный датчиком случайных чисел, целыми числами в диапазоне от -10 до +20....

13
49 / 49 / 4
Регистрация: 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;
          }
0
692 / 383 / 51
Регистрация: 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))
0
49 / 49 / 4
Регистрация: 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, Оно походу ничего недаст...
0
52 / 50 / 24
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 00:44  [ТС] 5
Неа, тоже не работает... Я уже 2 час думаю над условием... В паскале все работала хорошо, а вот в Си не хочет
0
49 / 49 / 4
Регистрация: 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;
          }
}
Можно воопше выкинуть...
0
52 / 50 / 24
Регистрация: 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;
          }
}
И все равно меняет максимальный и минимальный элементы...
0
692 / 383 / 51
Регистрация: 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();
}
0
49 / 49 / 4
Регистрация: 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% пойдет
1
52 / 50 / 24
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:01  [ТС] 10
2 FunDuck а у меня не пашет с таким условием... Проверял уже, до размещения сообщения здесь)))

Добавлено через 3 минуты 34 секунды
Верите нет, но так тоже не пашет... Попрежнему меняется минимальный и максимальный элементы...
0
49 / 49 / 4
Регистрация: 21.05.2009
Сообщений: 156
11.06.2009, 01:02 11
Вот так 100% пойдет
И void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1) Можно Выбросить...
1
52 / 50 / 24
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:05  [ТС] 12
Всё заработало... А не могли бы Вы пояснить эту функцию?
0
49 / 49 / 4
Регистрация: 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 секунду
Всё заработало... А не могли бы Вы пояснить эту функцию?
Это ко мне?
1
52 / 50 / 24
Регистрация: 10.05.2009
Сообщений: 216
11.06.2009, 01:16  [ТС] 14
Да это к Вам, спасибо!

Добавлено через 3 минуты 46 секунд
Спасибо еще раз!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2009, 01:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определить максимальный и второй по величине элементы в каждом столбце матрицы и поменять их местами
1) определить максимальный и второй по величине элементы в каждом столбце массива A(3,5) и поменять...

В текстовом файле определить второй максимальный и второй минимальный элементы, и поменять их местами
Создать текстовый файл, в который построчно записать прямоугольный массив massivnm, заполненный...

Поменять местами второй минимальный и второй максимальный элементы
Поменять местами второй минимальный и второй максимальный элементы! Заранее спасибо!

Создать одномерный массив, найти наименьший элемент 3-го столбца, поменять местами наименьший элемент элементы
Дана матрица А(5,3) 1 Создать новый одномерный массив,каждый элемент которого равен среднему...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.