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

Минимальное произведение столбиков в матрице

07.09.2019, 15:10. Показов 1987. Ответов 16
Метки нет (Все метки)

Моя задача: среди столбцов заданной целочисленной матрицы, содержащих только такие
элементы, которые по модулю не больше 10 найти столбец с минимальным
произведением элементов.
Код написал,но имеются ошибки и недочёты.Не могу починить код,требуется помощь...
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstdlib>
using namespace std; 
int main(){
cout<<" n = ";
cin>>n;
int A[n][n];
int minP=1, i, j;
srand (time (0));
cout<<"Matrix: ";
for(i=0; i<n; i++){
    for(j=0; j<n; j++){
        A[i][j]=rand ()  %10 -1 ;
        cout<<"%3d", A[i][j];
        cout<<"  ";
}
cout"\n\n";
}
for(j=0; j<n; j++){
    for(i=0; i<n; i++){
      minP*=A[i][j];
}
}
cout<<"Minimal product "<< minP;
return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2019, 15:10
Ответы с готовыми решениями:

В матрице F(4,9) найти произведение элементов , что превышают заданное число B . Вывести матрицу и произведение .
В матрице F(4,9) найти произведение элементов , что превышают заданное число B . Вывести матрицу и...

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

В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество нулевых элементов в матрице
В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество...

Минимальное число в матрице
Здравствуйте помогите пожалуйста написать программу для поиска минимального числа в матрице (двумя...

16
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
07.09.2019, 15:24 2
1. оформи тему, используя теги кода
2. ты хоть пытался запустить ?
Цитата Сообщение от Storm2k18 Посмотреть сообщение
cout<<"%3d", A[i][j];
cout<<" ";
}
cout"\n\n"
столбиков !!! впервые слышу, чтобы именно так их называли
0
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
07.09.2019, 15:27  [ТС] 3
Я запускал код,не знаю как исправить ошибки.
Столбики или столбцы, не принципально же...
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
07.09.2019, 16:19 4
Цитата Сообщение от Storm2k18 Посмотреть сообщение
cout<<" n = ";
cin>>n;
n не объявлена

Добавлено через 50 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int minN = 999999;
    int id = 0;
 
    for (int j = 0;j < n;j++){
        for (int i = 0; i < n; i++){
            minP = minP*A[i][j];
        }
 
        cout << minP << " " << j << endl;
        
        if (minP < minN) {
            id = j;
            minN = minP;
        }
        
        minP = 1;
    }
 
    cout << "Minimal product " << minN << " " << id << endl;
1
6464 / 4397 / 2518
Регистрация: 18.12.2017
Сообщений: 13,744
07.09.2019, 17:02 5
Andrey B, условие читали ?
Цитата Сообщение от Storm2k18 Посмотреть сообщение
элементы, которые по модулю не больше 10

Storm2k18,
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, m, k;
    long long mult, min=9223372036854775807;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
    
      int **a = new int*[n]; 
    for (int i = 0; i < n; i++)
       a[i]=new int[m];
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
    {
    a[i][j]=rand()%25 - 12;
    cout << setw(3) << a[i][j] << " ";
    }
    cout << "\n";
    }   
    
    for (int j = 0; j < m; j++)
    { 
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;mult=9223372036854775807;break;}    
        mult*=a[i][j];      
        }
        cout << "col " << j+1; 
        if(!k) cout << ": mult=" << mult << "\n";
        else cout << " **********\n";
        if (!k && (j==0 || mult<min)) min=mult;
    }    
    
    cout << "Min multiplication has:\n";
    for (int j = 0; j < m; j++)
    {       
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {mult=9223372036854775807;break;}    
        mult*=a[i][j];      
        }        
        if (mult==min) cout << "col " << j+1 << "\n";
    }     
 
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
 
system("pause");
return 0;
}
2
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
07.09.2019, 17:17 6
1. Спасибо за замечание
2. Но автор наделал косяков , ещё до этапа поиска.
3. Если он смог бы сам разобраться (хотя бы потестил и понял, что тут что то не то) понять что я скинул не удовлетворяет условию, то это было действительно круто и цено
А так что Ваш рабочий код, что мой недоделанный не принесет ТС никакой пользы. Плюс сразу виден стиль так что я прошу автора оповестить в этой теме смог ли он сдать представленный здесь код
0
6464 / 4397 / 2518
Регистрация: 18.12.2017
Сообщений: 13,744
07.09.2019, 17:57 7
в предыдущем варианте обнаружены недочёты. исправленный вариант:
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>
#include <iomanip>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, m, k;
    long long mult, min=9223372036854775807LL;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
    
        int **a = new int*[n]; 
      for (int i = 0; i < n; i++)
         a[i]=new int[m];    
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
    {
    a[i][j]=rand()%25 - 12;
    cout << setw(3) << a[i][j] << " ";
    }
    cout << "\n";
    }   
    
    for (int j = 0; j < m; j++)
    { 
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;break;}    
        mult*=a[i][j];      
        }
        cout << "col " << j+1; 
        if(!k) cout << ": mult=" << mult << "\n";
        else cout << " **********\n";
        if (!k && mult<min) min=mult;
    }    
    
    cout << "Min multiplication has:\n";
    for (int j = 0; j < m; j++)
    {    
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;break;}    
        mult*=a[i][j];      
        }        
        if (!k && mult==min) cout << "col " << j+1 << "\n";
    }     
 
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
 
system("pause");
return 0;
}
1
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
07.09.2019, 21:37  [ТС] 8
1. Спасибо вам за код.
2.Код сложный,попробую упростить его,буду разбираться в нём и оповещу о сдаче)
0
6464 / 4397 / 2518
Регистрация: 18.12.2017
Сообщений: 13,744
07.09.2019, 22:03 9
Цитата Сообщение от Storm2k18 Посмотреть сообщение
Код сложный
это только на первый взгляд. упростить можно если не выводить произведения (вывел для наглядности). также можно отказаться от последнего блока, если достаточно выводить только один первый найденный столбец (код выведет все номера столбцов). например:
3 5 6
4 5 2
выведет:
col 1
col 3

массив не обязательно квадратный.
при вводе размера массива с клавиатуры по стандарту С++ применяется не статический, а динамический массив

спрашивайте, если есть вопросы
1
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
08.09.2019, 12:10  [ТС] 10
Доброе утро. Я разбирался в коде,но некоторые команды впервые вижу даже.
Вы бы не могли закоментировать этот участок,пожалуйста?

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
for (int j = 0; j < m; j++)
    { 
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;break;}    
        mult*=a[i][j];      
        }
        cout << "col " << j+1; 
        if(!k) cout << ": mult=" << mult << "\n";
        else cout << " **********\n";
        if (!k && mult<min) min=mult;
    }    
    
    cout << "Min multiplication has:\n";
    for (int j = 0; j < m; j++)
    {    
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;break;}    
        mult*=a[i][j];      
        }        
        if (!k && mult==min) cout << "col " << j+1 << "\n";
    }     
 
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
Команды abs,mult и !k не могу понять вообще,что они означают...
Заранее спасибо за понимание)
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
08.09.2019, 12:46 11
Однако ...
abs модуль числа
!k не (выполнение условий)

Если хотите действительно понять. Напишите сами по примеру Yetty
1
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
08.09.2019, 13:08  [ТС] 12
А что значит эта строка mult=1LL;?
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
08.09.2019, 13:09 13
LL делает целочисленный литерал типа long long.

So 2LL, является 2 типа long long.

Без LL литерал будет иметь тип int.
0
6464 / 4397 / 2518
Регистрация: 18.12.2017
Сообщений: 13,744
08.09.2019, 13:27 14
Лучший ответ Сообщение было отмечено Storm2k18 как решение

Решение

Цитата Сообщение от Storm2k18 Посмотреть сообщение
Команды abs,mult и !k не могу понять вообще,что они означают...
abs() - функция (находит модуль числа)

mult - переменная. название может быть любым. написал mult просто как сокращение слова multiplication (произведение). тип для неё объявил long long учитывая что произведение растёт быстро и типа int может не хватить для результата (максимальное значение типа int число 2147483647). конечно типа long long тоже не хватит если результат превысит число 9223372036854775807 максимальное значение типа long long). буквы LL около числа обозначают что это число типа long long. переменная mult первоначально инициализируется числом 1.

k - переменная, ! - логическое НЕ. например при k=0 в if(!k) истина (не ноль) и выражение при этом условии выполняется, например выводится сообщение. можете вместо !k записать k==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
for (int j = 0; j < m; j++) // цикл по столбцам
    { 
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) // цикл по строкам
        {
        if (abs(a[i][j])>10) {k=1;break;}  // если модуль элемента больше 10, присваиваем k значение 1 и по break выходим из внутреннего цикла  
        mult*=a[i][j]; // mult=mult*a[i][j]; находим текущее значение произведения    
        }
        cout << "col " << j+1; 
        if(!k) cout << ": mult=" << mult << "\n"; // если k=0 выводим значение mult
        else cout << " **********\n"; // в противном случае (если k=1) выводим какую-нибудь 
// строку или сообщение, например "этот столбец нам не нужен"
        if (!k && mult<min) min=mult; // если k=0 находим значение текущего минимума
    }    
 
// этот блок нужен, чтобы найти все столбцы - если столбцов с минимальным произведением (одинаковым) несколько. 
// если хотите находить только один столбец, можно чуть подправить предыдущий блок, а этот блок удалить.    
    cout << "Min multiplication has:\n";
    for (int j = 0; j < m; j++)
    {    
        k=0;
        mult=1LL;    
        for (int i = 0; i < n; i++) 
        {
        if (abs(a[i][j])>10) {k=1;break;}    
        mult*=a[i][j];      
        }        
        if (!k && mult==min) cout << "col " << j+1 << "\n"; // если k=0 и mult==min выводим результат
// (col - сокращение от слова column - столбец. кстати лучше будет везде заменить col на column. 
    }     
    // освобождение памяти динамического массива
    for (int i = 0; i < n; i++) 
    delete[]a[i];
    delete[]a;
1
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
08.09.2019, 13:28  [ТС] 15
Спасибо большое!Я всё понял и очень благодарен вам!
0
6464 / 4397 / 2518
Регистрация: 18.12.2017
Сообщений: 13,744
08.09.2019, 14:12 16
Storm2k18, пишите больше сами. например в предложенном коде 2 примерно одинаковых блока, поэтому все произведения вычисляются дважды (повторно), а это конечно далеко не оптимально. что можно сделать ? можно объявить ещё один массив для результатов произведений и тогда от повторных вычислений можно будет отказаться. понимаете о чём я ? сделаете ?
1
1 / 1 / 0
Регистрация: 09.12.2018
Сообщений: 44
15.09.2019, 13:36  [ТС] 17
Я так и сделал). Код сдал и задача успешно выполнена!Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2019, 13:36

Найти минимальное значение в матрице
Ввести в матрицу размером 3 на 4 числа.Найти минимальный элемент матрицы

Найти максимальное и минимальное значения в матрице
Здраствуйте, помогите пожалуйста, просто не понимаю как это сделать. Суть задания, нужно сделать...

Определить в матрице минимальное и максимальное значение и их позиции
помогите написать код...я просто в этом не очень разбираюсь...буду очень благодарен за помощь ...

Не могу поменять в матрице максимальное значение на минимальное.С++
Не судите строго, я только учусь.Надо найти максимальное и минимальное значение.Это работает, а вот...


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

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

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