Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
1

В заданной матрице поменять местами последнюю строку со строкой, содержащей минимальный элемент среди положительных

05.07.2018, 07:48. Просмотров 616. Ответов 8
Метки нет (Все метки)


Помогите найти и исправить ошибку в программе, пожалуйста.

В заданной матрице поменять местами последнюю строку со строкой, содержащей минимальный элемент среди элементов с положительным значением.

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

Датчики случайных чисел использовать запрещается.

Использовать стандартные потоковые объекты ввода/вывода cin и cout.

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
#include<iostream>
#include <locale.h>
using namespace std ;
const int RAZ = 10 ; //максимальный размер для каждого измерения массива
typedef int telem ;  //определение типа элементов массива
typedef telem tmatr[RAZ][RAZ] ; //определение типа массива
void inputmatr(tmatr a, int &str, int &sto) ;
telem poisk_str(tmatr a, int str, int sto, int &imin) ;
 
int main()
{tmatr a ;      //двумерный массив
 int imin ;     //номер строки с максимальной суммой значений элементов
 int str ;      //число строк матрицы
 int sto ;      //число столбцов матрицы
 setlocale(LC_ALL,"Russian") ;
 inputmatr(a, str, sto) ;
 imin = poisk_str(a,str, sto, imin) ;
 cout << " Минимальный элемент содержится в " << imin << "-й строке исходного массива\n" ;
 cout << " Для завершения нажмите <Enter>" ;
 return 0 ;
}
 
void inputmatr(tmatr a, int &str, int &sto)
{cout << " Введите число строк в массиве <= " << RAZ << " " ;
 cin >> str ;
 cout << " Введите число столбцов в массиве <= " << RAZ << " " ;
 cin >> sto ;
 cout << " Введите построчно через пробел значения элементов\n" ;
 cout << " двумерного массива размера " << str << "x" << sto ;
 cout << "\n После ввода каждой строки нажимайте <Enter>\n" ;
 for(int i = 0 ; i < str ; i++)
    for(int j = 0 ; j < sto ; j++)
      cin >> a[i][j] ;
}
telem poisk_str(tmatr a, tmatr b, int str, int sto, int &imin)
{ int i, j;
  a[i][j] = a[0][0];
  double min = a[0][0];   //минимальный элемент
  for(int j = 0 ; j < sto ; j++)
        {for(int i = 0 ; i < str ; i++)
            if (a[i][j] < min && a[i][j]>=0)
               {min = a[i][j];
                imin = i;
                for (int j = 0; j < sto; j++)
                      { int b = a[i][j];
                        a[i][j] = a[str][j];
                        a[str][j] = b;
                       }            
                 for (int i = 0; i < str; i++)
                  { for (int j = 0; j < sto; j++)
                    { cout << a[i][j] << " ";
                    }
                    cout << '\n';
                  }
                }
        }
return imin ; 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2018, 07:48
Ответы с готовыми решениями:

В заданной матрице поменять местами строку, содержащую максимальный элемент со строкой, содержащей минимальный
Надо сделать к понедельнику. Задание по ПЯВУ, состоит из двух частей. Если первую часть я понимаю,...

Поменять местами последнюю строку со строкой, содержащей минимальный элемент матрицы
Дан вещественный массив а1, а2,…, аn. Если в этом массиве есть хотя бы один элемент, принадлежащий...

Поменять местами последнюю строку со строкой, содержащей минимальный элемент матрицы
В заданной матрице поменять местами последнюю строку со строкой, содержащей минимальный элемент...

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

8
Shiningemerald
383 / 116 / 22
Регистрация: 05.01.2012
Сообщений: 908
05.07.2018, 11:53 2
Студент_прогер, первое что бросается в глаза это неинициализированные переменные i и j:

Цитата Сообщение от Студент_прогер Посмотреть сообщение
telem poisk_str(tmatr a, tmatr b, int str, int sto, int &imin)
{ int i, j;
a[i][j] = a[0][0];
double min = a[0][0]; //минимальный элемент
тут нужно
C++
1
2
3
int i, j;
i =  j = 0;
double min = a[i][j];   //минимальный элемент
Добавлено через 21 минуту
Студент_прогер, потом в main что-то непонятное происходит..
Вы объявляете(строка 12):
Цитата Сообщение от Студент_прогер Посмотреть сообщение
C++
1
int imin ;  //номер строки с максимальной суммой значений элементов
Потом следующий юзинг этой переменной происходит тут(строка 17):
Цитата Сообщение от Студент_прогер Посмотреть сообщение
C++
1
imin = poisk_str(a,str, sto, imin) ;
но imin у вас не инициализирована

Добавлено через 15 минут
Студент_прогер,
Если здесь (строка 8):
Цитата Сообщение от Студент_прогер Посмотреть сообщение
C++
1
telem poisk_str(tmatr a, int str, int sto, int &imin) ;
и тут(строка 35):
Цитата Сообщение от Студент_прогер Посмотреть сообщение
telem poisk_str(tmatr a, tmatr b, int str, int sto, int &imin)
вы имели ввиду одну функцию. то посмотрите внимательно- количество входящих параметров разное, а значит это уже будет восприниматься как перегрузка функции при чем перегрузка первой объявленной функции, реализация которой не прописана, то есть компилятор не поймет вас

Добавлено через 12 минут
В строке 38 зачем вам double, если у вас int-овый массив, не так критично но все ж в два раза больше памяти и вообще лучше придерживаться единого стиля..
Цитата Сообщение от Студент_прогер Посмотреть сообщение
double min = a[0][0];
Добавлено через 7 минут
строка 8 (и в дальнейшем) я бы убрала imin из входящих параметров, зачем ему входить-выходить в функцию, лучше внутри функции объявите переменную какую-то и делайте rturn да и все.
Цитата Сообщение от Студент_прогер Посмотреть сообщение
telem poisk_str(tmatr a, int str, int sto, int &imin) ;
Добавлено через 10 минут
Далее соответственно надо смотреть процедуру поиска вашего минимального положительного, вернее строки где таковой содержится.

Добавлено через 7 минут
Например вы пишете:
C++
1
int min = a[i][j];
а если оно отрицательно? Тогда следующее условие вообще никогда не выполнится, т.к. там прописаны два противоречивых условия, которые при отрицательном значении min вообще противоречат как-то :
C++
1
if (a[i][j] < min && a[i][j] >= 0)
Добавлено через 1 час 33 минуты
Нашла свободное время на работе и вот с учетом замечаний написанных мной выше:
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
#include<iostream>
#include <locale.h>
using namespace std;
const int RAZ = 10; //максимальный размер для каждого измерения массива
typedef int telem;  //определение типа элементов массива
typedef telem tmatr[RAZ][RAZ]; //определение типа массива
void inputmatr(tmatr a, int &str, int &sto);
telem poisk_str(tmatr a, int str, int sto);
 
int main()
{
    tmatr a;      //двумерный массив
    int result;     //переменная которая будет принимать номер строки с минимальным элементом
    int str;      //число строк матрицы
    int sto;      //число столбцов матрицы
    setlocale(LC_ALL, "Russian");
    inputmatr(a, str, sto);
    result = poisk_str(a, str, sto);
    cout << " Минимальный элемент содержится в " << result << "-й строке исходного массива\n";
    cout << " Для завершения нажмите <Enter>";
    return 0;
}
 
void inputmatr(tmatr a, int &str, int &sto)
{
    cout << " Введите число строк в массиве <= " << RAZ << " ";
    cin >> str;
    cout << " Введите число столбцов в массиве <= " << RAZ << " ";
    cin >> sto;
    cout << " Введите построчно через пробел значения элементов\n";
    cout << " двумерного массива размера " << str << "x" << sto;
    cout << "\n После ввода каждой строки нажимайте <Enter>\n";
    for (int i = 0; i < str; i++)
        for (int j = 0; j < sto; j++)
            cin >> a[i][j];
 
}
 
telem poisk_str(tmatr a, int str, int sto)
{
    int min, strnumber;   //минимальный элемент
 
    //находим любой положительный элемент в матрице и принимаем за минимум   
    for (int i = 0; i < str; i++) {
        for (int j = 0; j < sto; j++) { if (a[i][j] > 0) { min = a[i][j]; strnumber = i; break; } }
        
        }
 
    //ищем минимальный элемент и индекс строки в которой он содержися(если надо номер строки, соответственно надо делать return strnumber++;)
    for (int i = 0; i < str; i++) {
        for (int j = 0; j < sto; j++) {
                                        if (a[i][j] < min && a[i][j] > 0) { min = a[i][j]; strnumber = i;} 
                                        }       
    }
 
    return strnumber;
    
}
Но тут оптимизировано только то что у вас, соответственно нет той части кода где меняет строки по условию задачи.
1
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
05.07.2018, 12:50  [ТС] 3
Спасибо, а как менять строки местами?
0
Shiningemerald
383 / 116 / 22
Регистрация: 05.01.2012
Сообщений: 908
05.07.2018, 16:25 4
Студент_прогер, нужно создать временный одномерный массив, куда нужно записать строку, содержащую минимальный положительный. Потом в цикле в нашей многомерной матрице, записываем последнюю строку на место той где обнаружился наименьший положительный. Теперь нужно последнюю строку переписать из временного массива. Временный массив чтоб не потерять одну из строк. Для простоты понимания можно разобрать на переменных.
Например есть две переменных int a = 1 и int b = 2 которые нужно поменять местами, реализация будет такая:
C++
1
2
3
4
5
int a = 1;
int  b = 2;
int temp = a;
a = b;
b = temp;
0
470 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
05.07.2018, 16:46 5
Electroflower, Это зачем так сложно? Ни уж то нельзя просто свапнуть (псевдокод):
C++
1
2
for (int i =0; i<m; i++)
    swap(matrix[imin][i],matrix[n-1][i])
Swap можно ручками:
C++
1
2
3
4
5
6
for (int i =0; i<m; i++)
{
    MatrixType temp = matrix[imin][i];
    matrix[imin][i] = matrix[n-1][i];
    matrix[n-1][i] = temp;
}
1
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
05.07.2018, 16:58  [ТС] 6
Спасибо, попробую вставить в программу
0
Shiningemerald
383 / 116 / 22
Регистрация: 05.01.2012
Сообщений: 908
05.07.2018, 17:13 7
SuperKir, слишком очевидно)
0
5886 / 4001 / 2317
Регистрация: 18.12.2017
Сообщений: 12,532
05.07.2018, 17:20 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
#include <iostream>
using namespace std;
 
void Set (double **x, int N, int M)
{
    cout <<"Enter "<<N*M<<" elements:\n";
    for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) 
      cin >>x[i][j];
}
 
double Change (double **x, int N, int M)
{
    int k=0, ipos=0, jpos=0, imin_pos=0;
    double min_pos, eps=0.0000000001;
    for (int i = 0; i < N; i++)
    {
    for (int j = 0; j < M; j++)
    if (x[i][j]>eps) {k++;ipos=i;jpos=j;break;}
    if (k==1) break;
    }
    
    min_pos=x[ipos][jpos];
    for (int i = 0; i < N; i++)
    {
    for (int j = 0; j < M; j++)
    if (x[i][j]>eps && x[i][j]<min_pos) {min_pos=x[i][j],imin_pos=i;}   
    }   
        
    swap(x[imin_pos],x[N-1]);
    return **x;
}
 
void Print (double **x, int N, int M)
{
    cout <<"OUTPUT:\n";
    for (int i = 0; i < N; i++)
    {
    for (int j = 0; j < M; j++)
    cout <<x[i][j]<<" ";
    cout <<"\n";
    }
}
 
int main()
{
    int n, m;
    cout <<"n="; cin >>n;
    cout <<"m="; cin >>m;
    
      double **a = new double*[n];   
    for (int i = 0; i < n; i++)
      a[i] = new double[m]; 
    
    Set (a, n, m);  
    Change (a, n, m);
    Print(a, n, m);
    
    for (int i = 0; i < n; i++)
    delete [] a[i];
    delete [] a;
system("pause");
return 0;
}
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
05.07.2018, 22:24  [ТС] 9
Спасибо, отлично работает
0
Миниатюры
В заданной матрице поменять местами последнюю строку со строкой, содержащей минимальный элемент среди  положительных  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2018, 22:24

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

В заданной матрице поменять строку, содержащую максимальный элемент со строкой, содержащей минимальный элемент
В данной действительной квадратной матрице размера m x n поменять строку, содержащую элемент с...

В заданной матрице поменять местами первую строку со строкой, содержащей максимальный отрицательный элемент матрицы
Помогите, кто может! Нигде помощи не нашла, хотя подобные темы есть; не получается, а скоро...

В заданной матрице поменять местами последнюю строку со строкой, содержащей наименьший элемент матрицы
Задание на программирование: используя технологию структурного программирования, разработать...

В заданной матрице поменять местами последнюю строку со строкой , содержащий минимальный элемент матрицы
1.Дан вещественный массив а1,а2,...аn. Если в этом массиве есть хотя бы один элемент, принадлежащий...


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

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

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