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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Передо мной появилась задача - разработать программу нахождения произведения положительных элементов матрицы, лежащих не на главной диагонали, причем программу нужно сделать через класс. Моя попытка оказалась неудачной - при разном размере матрицы в переменной 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?

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

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

1
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
04.10.2019, 03:41 2
Лучший ответ Сообщение было отмечено 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):
Код
Тип                  Все цифры результата    Отображение результата с количеством цифр по умолчанию
---------------------------------------------------------------------------------------------------
long long int        45873336806277120       45873336806277120
double               45873336806277120       4.58733e+16
float                45873334507798528       4.58733e+16
1
04.10.2019, 03:41
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2019, 03:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
Rust или Go? А может C++?
hw_wired 28.01.2025
С каждой новой технологией или методологией появляются новые языки программирования, призванные решать конкретные задачи либо улучшать аспекты производительности и безопасности. Среди множества. . .
Fortran и WinAPI: как создать приложение с графическим интерфейсом
hw_wired 28.01.2025
Fortran — это один из старейших высокоуровневых языков программирования, широко используемый в науке и инженерии уже несколько десятилетий. Его название происходит от "Formula Translation" (перевод. . .
Списки в Haskell
hw_wired 28.01.2025
Haskell является функциональным языком программирования, который отличается лаконичностью синтаксиса и мощными абстракциями. Важным концептом в Haskell являются списки — упорядоченные коллекции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru