Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для C0V6N
1 / 1 / 0
Регистрация: 11.11.2015
Сообщений: 92

Нахождение произведения элементов матрицы через класс

03.10.2019, 23:44. Показов 1595. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Передо мной появилась задача - разработать программу нахождения произведения положительных элементов матрицы, лежащих не на главной диагонали, причем программу нужно сделать через класс. Моя попытка оказалась неудачной - при разном размере матрицы в переменной Pa может быть как и искомое произведение, так и нецелое число с e (1.234е5). Прошу подсказать - в чём может быть моя ошибка?

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
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
 
class matr 
{
    private:
        float **a;
        int n, m;
        char c;
    public:
        matr(int n1, int m1, char c1)
        {
            n = n1; m = m1; c = c1;
            a = new float*[n];
            int i, j;
            for (i = 0; i < n; i++)
            {
                a[i] = new float[m];
                for (j = 0; j < m; j++)
                    a[i][j] = 0;
            }
        }
 
        void massIn() //Ввод массива
        {
            int i, j;
            printf("Input matrix  %c  size of %d*%d \n", c, n, m);
            for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
                    scanf_s("%f", &a[i][j]);
        }
 
        float massMulti() //Нахождение произведения
        {
            int i, j;
            float Pn = 1;
            bool positive = false;
            for (i = 0; i < n; i++) {
                for (j = 0; j < m; j++) {
                    if (i != j && a[i][j] > 0) {
                        Pn *= a[i][j];
                        positive = true;
                    }
                }
            }
            if (positive == true) {
                return Pn;
            }
            else {
                return 0;
            }
        }
};
 
int main()
{
    matr *A;
    float Pa;
    A = new matr(5, 5, 'A');
    A->massIn(); 
    Pa = A->massMulti();
    cout << Pa << endl;
    delete A; 
    _getch();
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2019, 23:44
Ответы с готовыми решениями:

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

Нахождение произведения нечётных элементов матрицы
Как определить произведение нечётных элементов матрицы через цикл for?

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

1
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.10.2019, 03:41
Лучший ответ Сообщение было отмечено C0V6N как решение

Решение

Цитата Сообщение от C0V6N Посмотреть сообщение
Моя попытка оказалась неудачной - при разном размере матрицы в переменной Pa может быть как и искомое произведение, так и нецелое число с e (1.234е5)
А чего вы так шарахнулись от "нецелого числа с e"? И, кстати, почему вы решили, что число 1.234е5 нецелое? Очень даже целое: это 123400 (https://www.cyberforum.ru/cgi-bin/latex.cgi?\small 1.234 \cdot   {10}^{5} -- школьная программа). Это с одной стороны.

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

Другой вопрос, что при использовании типа с плавающей точкой в какой-то момент будет появляться погрешность вычисления произведения, поскольку для float количество значащих цифр мантиссы, если не ошибаюсь, 6 (для double - 15). Поэтому результат будет округляться.

Так что программа ваша работает правильно. Другое дело, что по ней сильно напильничком надо пройтись. Основные огрехи:
  1. Отсутствует деструктор, освобождающий память.
  2. Не выполняется "Правило пяти" (или хотя бы "Правило трёх"). Если писать лень, то хотя бы обозначьте с = delete.
  3. Хранить и использовать второе измерение (m) не нужно: главная диагональ бывает только у квадратных матриц.
  4. В main() не обязательно динамически создавать матрицу. Достаточно написать matr A(5, 'A');. Сщщтветственно обращения к методам будут через точку.

Добавлено через 19 минут
Вот демонстрация погрешности вычислений для разных типов для вашей программы (для матрицы 8х8 с одинаковым набором рандомных чисел в диапазоне -10..10):
Code
1
2
3
4
5
Тип                  Все цифры результата    Отображение результата с количеством цифр по умолчанию
---------------------------------------------------------------------------------------------------
long long int        45873336806277120       45873336806277120
double               45873336806277120       4.58733e+16
float                45873334507798528       4.58733e+16
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2019, 03:41
Помогаю со студенческими работами здесь

Нахождение произведения элементов первого столбца матрицы
Составьте алгоритм и программу нахождения произведения элементов первого столбца матрицы размером 2 столбца на 2 строки. Матрица вводится...

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

Нахождение произведения элементов 6-го столбца матрицы x, больших, чем элемент (1, 1)
Помогите мне пожалуйста решать. Составить программу для нахождения произведения элементов 6-го столбца матрицы x(4,7), больших чем...

Нахождение скалярного произведения матрицы и вектора
Дана матрица А(nxn) и вектор х = (х1, х2, ...,х n). Написать программу нахождения скалярного произведения (х * Ах) program matrix; var...

Нахождение части от деления произведения элементов массива на сумму элементов
помогите ето зделать, а то у меня совсем не виходит сложить ету программу Условие: для одномерного числового массива A(N), длиной N...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru