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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
m108
0 / 0 / 0
Регистрация: 03.10.2010
Сообщений: 6
#1

В каждой строке матрицы найти min и max, поменять местами - C++

03.10.2010, 16:50. Просмотров 2375. Ответов 12
Метки нет (Все метки)

Условие: В каждой строке матрицы A=(aij)mxn найти максимальный и минимальный элементы. Сформировать матрицу B=(bij)mxn, переставляя в каждой строке матрицы A=(aij)mxn максимальный элемент с минимальным.

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


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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
 
 
int m,n,imax, ch;
 
 
 
int posMax;                     //позиция максимального
int posMin;                     //позиция минимального
 
float **matrix1,**matrix2,,max,min;
 
void vvod1(void)  // ввожу первую матрицу, вывести ее кстати я ее так и не смог
{
for (int i=0;i<n;i++)
  for (int j=0;j<m;j++)
 {
 cout<<"vvedite A["<<i+1<<","<<j+1<<"]  ";
 cin>>*(*(matrix1+i)+j);
 }
}
 
 
void raschet(void)  // ищу минимальный, максимальный, потом меняю, насколько верно меняю не догадываюсь, 
    {
for (int i= 0;i<n;i++)
    //расматриваем массив: строку, эту часть я спер из соседнего топика       
    for(int j = 0;j<m;j++){
 
    //Проверяем на  максимальный------
    if(matrix1[i*m+j]>max){
        max=matrix1[i*m+j];  // это максимальный
        posMax = j;        // записываем позицию максимального
        }
 
    //Проверяем на  минимальный------
        if(matrix1[i*m+j]<min){
        min=matrix1[i*m+j];  // это минимальный
        posMin = j;        // записываем позицию минимального
        }
 
//Производим перстановку------
    //Если просмотр строки закончен
        if(j==m-1){
        
        matrix1[i*m+posMax]=min; // че творю без понятия
        matrix1[i*m+posMin]=max;
 
 
 
 
}
return;
 
 
for (int j=0;j<m;j++)
   {
   *(*(matrix2+i)+j)=*(*(matrix1+i)+j)} //короче не знаю куда это вставить
}
 
void main(void)  // хрен знает что делаю дальше
{
void vivod(void);
clrscr();
cout<<"Vvedite razmernost matric:\n";
cout<<"Chislo strok N= ";
cin>>n;
cout<<"Chislo stolbcov M= ";
cin>>m;
cout<<"\n";
matrix1=new float *[m];
  for (int i=0;i<n;i++)
   matrix1[i]=new float[m];
vvod1();
rascet();
vivod();
for (int k=0;k<m;k++)
 {
 delete matrix1[i];
 }
delete[] matrix1;
 
cout<<"\nNagmite lubuyu klavishu";
getch();
return;
 
 
void vivod(void)
{
cout<<"Matrica A:\n";
for (int i=0;i<n;i++)
  {
  for (int j=0;j<m;j++)
   cout<<*(*(matrix1+i)+j)<<" ";
  cout<<"\n";
 
 
}
}
Очень прошу помощи, ибо сам чую не справлюсь пока((

Добавлено через 36 минут
вот еще- та часть кода , которая с 33 строки- ругается, что что то не так с флоатом и не может сравнивать с мах(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2010, 16:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В каждой строке матрицы найти min и max, поменять местами (C++):

Массив: Найти в каждой строке max и min, поменять их местами. - C++
Вводится квадратная матрица порядка n. Найти в каждой строке max и min, поменять их местами. Помогите пожалуйста )

Найти min по каждой строке матрицы и max по каждому столбцу - C++
Вводится порядок квадратной матрицы n. Вводятся элементы квадратной матрицы построчно. Необходимо найти min по каждой строке и max по...

Поменять местами max и min четных строк матрицы (без функции) - C++
Сделать двумерный массив без функции на С++. Дана квадратная матрица. Размерность вводится. Поменять местами max и min четных строк. ...

Найти максимальный и минимальный элемент в каждой строке матрицы и поменять их местами - C++
Дана матрица вещественных чисел N х М. Количество строк N и столбцов М задается пользователем. Найти максимальный и минимальный элемент в...

Найти в каждой строке матрицы максимальный и минимальный элементы и поменять их местами с первым и последним - C++
Дана матрица B. Найти в каждой строке матрицы максимальный и минимальный элементы и поменять их местами первым и последним элементам строки...

Найти в каждой строке матрицы наибольший элемент и поменять его местами с элементом главной диагонали - C++
дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали....

12
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
03.10.2010, 18:03 #2
Предлагаю такой вариант:
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
#include <iomanip.h>
#include <iostream.h>
 
int main()
{
    int n,m,i,j;
    float min, max;
    int jMax, jMin;
 
    cout<<"Vvedite n: ";
    cin>>n;
    cout<<"Vvedite m: ";
    cin>>m;
 
    float **a=new float*[n];
    for(i=0;i<n;i++)
        a[i]=new float[m];
 
 
    float **b=new float*[n];
    for(i=0;i<n;i++)
        b[i]=new float[m];
 
 
    for(i=0; i<n; i++)      // Ввод a[]
        for(j=0; j<m; j++)
        {
            cout<<"Vvedite element ["<<i<<"]["<<j<<"] : ";
            cin>>a[i][j];
        }
 
    cout<<"Array a: "<<endl;
    for(i=0; i<n; i++)      // Вывод a[]
    {
        for(j=0; j<m; j++)
            cout<<setw(5)<<a[i][j];
        cout<<endl;
    }
 
    for(i=0; i<n; i++)      // Заполнение b[]
    {
        min=max=a[i][0];
        jMax=jMin=0;
 
        for(j=0; j<m; j++)
        {
            b[i][j]=a[i][j];
            if (a[i][j]<min) // Поиск мин
            {
                min=a[i][j];
                jMin=j;
            }
            else if (a[i][j]>max)  // Поиск макс
            {
                max=a[i][j];
                jMax=j;
            }
        }
        b[i][jMax]=a[i][jMin]; // Перестановка
        b[i][jMin]=a[i][jMax];
    }
 
    cout<<"Array b: "<<endl;
    for(i=0; i<n; i++)      // Вывод  b[]
    {
        for(j=0; j<m; j++)
            cout<<setw(5)<<b[i][j];
        cout<<endl;
    }
 
 
    for (i=0;i<n;i++)
        delete []a[i];
    delete []a;
 
    for (i=0;i<n;i++)
        delete []b[i];
    delete []b;
    ///////////
    cout<<endl;
    system("pause");
    return 0;
}
Если принципиально использовать функции и обращение к массивам через указатели, малость переделайте.
1
m108
0 / 0 / 0
Регистрация: 03.10.2010
Сообщений: 6
03.10.2010, 21:50  [ТС] #3
Спасибо большое!

но к сожалению при компиляции говорит, что в 81 строке функция систем должна иметь портатип(((
если ее убрать то при вводе матрицы выкидывает(

действительно надо сделать строго через указатели, но мне это ничего не говорит

Добавлено через 3 часа 29 минут
вот так?? просто не могу запустить совсем((( что делать с системом не знаю(

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
#include <iomanip.h>
#include <iostream.h>
 
        int n,m,i,j;
        float min, max;
        int jMax, jMin;
 
void vvod(void){
 
        
 
 
        for(i=0; i<n; i++)              // Ввод a[]
                for(j=0; j<m; j++)
                {
                        cout<<"Vvedite element ["<<i<<"]["<<j<<"] : ";
                        cin>>a[i][j];
                }
 
        cout<<"Array a: "<<endl;
        for(i=0; i<n; i++)              // Вывод a[]
        {
                for(j=0; j<m; j++)
                        cout<<setw(5)<<a[i][j];
                cout<<endl;
        }
 
void poisk(void)
 
      for(j=0; j<m; j++)
                {
                        b[i][j]=a[i][j];
                        if (a[i][j]<min) // Поиск мин
                        {
                                min=a[i][j];
                                jMin=j;
                        }
                        else if (a[i][j]>max)  // Поиск макс
                        {
                                max=a[i][j];
                                jMax=j;
                        }
                }
                b[i][jMax]=a[i][jMin]; // Перестановка
                b[i][jMin]=a[i][jMax];
        }
 
void main(void)
{
void vivod(void)
clrscr();
cout<<"Vvedite n: ";
        cin>>n;
        cout<<"Vvedite m: ";
        cin>>m;
 
        float **a=new float*[n];
        for(i=0;i<n;i++)
                a[i]=new float[m];
 
 
        float **b=new float*[n];
        for(i=0;i<n;i++)
                b[i]=new float[m];
 
vvod();
poisk();
vivod();
 
cout<<"Array b: "<<endl;
        for(i=0; i<n; i++)              // Вывод  b[]
        {
                for(j=0; j<m; j++)
                        cout<<setw(5)<<b[i][j];
                cout<<endl;
        }
 
 
        for (i=0;i<n;i++)
                delete []a[i];
        delete []a;
 
        for (i=0;i<n;i++)
                delete []b[i];
        delete []b;
        ///////////
        cout<<endl;
        system("pause");
        return 0;
}
Добавлено через 5 минут
в 17й строке говорит что не знает что за символ "а"
в 30й синтакс эрор после for
в 30й j<m неэффективный код
в конце 30й стайтмент миссин
в 45й не идентифицирован символ b
в 51й синтаксическая ошибка в скобках
в 67й функция поиск должна иметь портотип
67 мисмач ин декларейшн "поиск"
88 функция "систем" должна иметь портотип
0
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.10.2010, 21:59 #4
Есть два вектора с минимальными и максимальными элементами столбцов.... min_vec и max_vec....
А как вставить, скажем первый элемент вектора min_vec в buf_vec???
Я что-то совсем запутался в параметрах insert....

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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
    const int rows = 6; const int cols = 6;
    int matrix[rows][cols];  
    for(int i = 0;i < rows;++i){
        for(int j = 0;j < cols;++j){
matrix[j][i] = rand()%100;
cout << matrix[j][i] << " ";
        }
        cout << endl;
    }
 
    std::vector<int>min_vec;
    std::vector<int>max_vec;
    std::vector<int>buf_vec;
    for(int i = 0;i < cols;++i){
        min_vec.push_back(*std::min_element(matrix[i], matrix[i]+rows));
        max_vec.push_back(*std::max_element(matrix[i], matrix[i]+rows));
    }
    std::cout << endl << "Columns' min elements: " << endl;
    std::copy(min_vec.begin(), min_vec.end(), std::ostream_iterator<int>(cout, " "));
    std::cout << endl << "Columns' max elements: "  << endl;
    std::copy(max_vec.begin(), max_vec.end(), std::ostream_iterator<int>(cout, " "));
    
 
        system("pause");
}
1
m108
0 / 0 / 0
Регистрация: 03.10.2010
Сообщений: 6
03.10.2010, 22:21  [ТС] #5
не странно ли будет если студент еще на прошлой неделе не мог кое как написать по простому, а тут сразу через векторы написал

Добавлено через 15 минут
поэтому можете пожалуйста помочь доработать то, что уважаемый dihlofos написал?
0
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
04.10.2010, 00:48 #6
Вот так работает

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
#include <iostream>
using namespace std;
 
int main()
{
    const int rows = 5; const int cols = 5;
    int matrix[rows][cols];
    int mins[rows], maxs[rows];
    for(int i = 0;i < rows;++i){
        for(int j = 0;j < cols;++j){
            matrix[j][i] = rand()%100;
            cout << matrix[j][i] << " ";
        }
        cout << endl;
    }
    cout << endl;
int min; int max; int min_ind[rows]; int max_ind[cols];
    for(int i = 0;i < rows;i++){
        min = 99; max = 0;
        for(int j = 0;j < cols;j++){
            if(min > matrix[i][j]){
                min = matrix[i][j];
                min_ind[i] = j;
            }
            if(max < matrix[i][j]){
            max = matrix[i][j];
            max_ind[i] = j;
            }
    }
        mins[i] = min; 
        maxs[i] = max;
    }
    
    for(int i = 0;i < rows;i++)
        cout << mins[i] << " ";
cout << endl;
    for(int i = 0;i < rows;i++)
        cout << maxs[i] << " ";
    cout << endl;
int t;
    cout << "\n\n\n";
    
    for(int i = 0;i < rows;i++){
     matrix[i][min_ind[i]] = maxs[i];
     matrix[i][max_ind[i]] = mins[i];
    }
 
    for(int i = 0;i < rows;i++){
        for(int j = 0;j < cols;j++){
            cout << matrix[j][i] << " ";
        }
        cout << endl;
    }
    
 
        system("pause");
}
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 01:08 #7
NikolaWhite, Например так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
#include <iostream>
#include <algorithm>
 
int main()
{
    std::vector<int> Vec;
    for(int i=0; i<5; ++i)
        Vec.push_back(i+1);
    std::vector<int> Vec2;
    Vec2.insert(Vec2.begin(), Vec.begin(), ++Vec.begin());
    std::copy(Vec2.begin(), Vec2.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
А еще например так:
C++
1
Vec2.push_back(*Vec.begin());
И так:
C++
1
2
    std::vector<int>::const_iterator Iter=Vec.begin();
    Vec2.push_back(*Iter);
Вообщем вариантов много.
2
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
04.10.2010, 02:11 #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
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main(){
    const int ROWS = 3;
    const int COLUMNS = 5;
    
    int matrix[ROWS][COLUMNS] = {
        { 3, 6, 2, 7, 5 },
        { 1, 8, 3, 5, 2 },
        { 0, 4, 9, 2, 7 }
    };
    
    std::cout << "Origin:" << std::endl;
    for ( int i = 0; i < ROWS; ++i ){
        std::copy(matrix[i], matrix[i] + COLUMNS, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    }
    
    for ( int i = 0; i < ROWS; ++i )
        std::swap(*std::max_element(matrix[i], matrix[i] + COLUMNS), *std::min_element(matrix[i], matrix[i] + COLUMNS));
    
    std::cout << "Swap min and max elements in rows:" << std::endl;
    for ( int i = 0; i < ROWS; ++i ){
        std::copy(matrix[i], matrix[i] + COLUMNS, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    }
    
    return 0;
}
2
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
04.10.2010, 06:02 #9
m108, у вас просто почему то не определяется system("pause"). Какой у вас компилятор? Попробуйте подключить ещё #include <stdlib.h>, или используйте для паузы cin.get().
Переделал с использованием указателей:
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
#include <iomanip.h>
#include <iostream.h>
 
int main()
{
        int n,m,i,j;
        float min, max;
        int jMax, jMin;
 
        cout<<"Vvedite n: ";
        cin>>n;
        cout<<"Vvedite m: ";
        cin>>m;
 
        float **a=new float*[n];
        for(i=0;i<n;i++)
                a[i]=new float[m];
 
 
        float **b=new float*[n];
        for(i=0;i<n;i++)
                b[i]=new float[m];
 
 
        for(i=0; i<n; i++)              // Ввод a[]
                for(j=0; j<m; j++)
                {
            cout<<"Vvedite element ["<<i<<"]["<<j<<"] : ";
            cin>>*(*(a+i)+j);
        }
 
        cout<<"Array a: "<<endl;
        for(i=0; i<n; i++)              // Вывод a[]
        {
                for(j=0; j<m; j++)
            cout<<setw(5)<<*(*(a+i)+j);
                cout<<endl;
    }
 
        for(i=0; i<n; i++)              // Заполнение b[]
        {
        min=max=*(*(a+i)+j);
                jMax=jMin=0;
 
                for(j=0; j<m; j++)
                {
            *(*(b+i)+j)=*(*(a+i)+j);
                        if (a[i][j]<min) // Поиск мин
                        {
                min=*(*(a+i)+j);
                                jMin=j;
                        }
            else if (*(*(a+i)+j)>max)  // Поиск макс
                        {
                max=*(*(a+i)+j);
                                jMax=j;
                        }
                }
        *(*(b+i)+jMax)=*(*(a+i)+jMin); // Перестановка
        *(*(b+i)+jMin)=*(*(a+i)+jMax);
        }
 
        cout<<"Array b: "<<endl;
        for(i=0; i<n; i++)              // Вывод  b[]
        {
                for(j=0; j<m; j++)
            cout<<setw(5)<<*(*(b+i)+j);
                cout<<endl;
        }
 
 
        for (i=0;i<n;i++)
                delete []a[i];
        delete []a;
 
        for (i=0;i<n;i++)
                delete []b[i];
        delete []b;
    ///////////
    cout<<endl;
    cin.get(); cin.get();
        return 0;
}
Добавлено через 21 минуту
Ошибки в вашем примере:
1) Массив виден только в ф-ции main(), объявите его уж тогда глобально или передавайте его в функции.
2) Раз main возвращает значение то записывайте int main().
3) Не хватает несколько закрывающих скобок в функциях.
4) Вызываете неизвестные функцию vivod() и clrsqr(). Для последней подключите stdio.h. или замените на system("cls").
5) Если будут проблемы с глобальными переменными min и max - переименуйте.
1
m108
0 / 0 / 0
Регистрация: 03.10.2010
Сообщений: 6
04.10.2010, 09:14  [ТС] #10
Всем огроменное Спасибо)) теперь осталось немного понять все
0
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
04.10.2010, 22:33 #11
А как же в примере easybuddы поменять местами минимумы и максимумы в столбцах???
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.10.2010, 22:35 #12
NikolaWhite, Ну у него как-то и меняются в столбцах... или я не прав?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
04.10.2010, 23:47 #13
NikolaWhite, не, в столбцах так не получится. Эта фишка только в одномерных массивах/списках работает. Если только двухмерный массив не статический, элементы, находящиеся в одном столбце но в разных строках могут в памяти как угодно по отношению друг к другу располагаться, и связи, как в списках, между ними тоже никакой не будет.
0
04.10.2010, 23:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 23:47
Привет! Вот еще темы с ответами:

Найти в каждой строке матрицы максимальный и минимальный элементы и поменять их местами с первым и последним элементом - C++
Я решила задачку но что-то не так(ошибки никак не исправлю... помогите исправте ошибки,что не правильно я сделала /*Дана матрица B....

Найти в каждой строке матрицы наибольший элемент и поменять его местами с элементом главной диагонали - C++
Задание: Дана целочисленная квадратная матрица. Найти в каждой стро*ке наибольший элемент и поменять его местами с элементом глав*ной...

Найти в каждой строке матрицы наибольший элемент и поменять его местами с элементом главной диагонали - C++
Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали. ...

Найти наибольший элемент в каждой строке матрицы, после чего поменять его местами с диагональным - C++
Во входном файле in.txt задана квадратная матрица из целых чисел, например: 1 7 4 3 6 3 2 0 2 0 8 7 4 5 7 6


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

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

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