Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2015, 18:52   #1
Julia1
Пользователь
 
Регистрация: 03.02.2014
Сообщений: 14
По умолчанию с++ Необходимо чтобы программа работала не только с целыми, но и с дробными числами, как это сделать? в чем моя ошибка?

Код:
#include <iostream>
#include <cmath>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{setlocale(0, "");
    
    cout << "Введите количество Х: ";
    int x;
    cin >> x;
    cout << "Введите количество Y: ";
    int y;
    cin >> y;
    
    double** P = new double*[x];
    for (int i = 0; i < x; i++)
        P[i] = new double[y];
    
    cout << "Введите Р[i][j]" << endl;
    for (int i = 0; i < x; i++)
        for (int j = 0; j < y; j++)
            cin >> P[i][j];
    
    double* p = new double[x];
    double* r = new double[y];
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            p[i] += P[j][i]; //p i-ое
 
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            r[i] += P[i][j];//r j-ое
 
    double** Pyx = new double*[x];
    for (int i = 0; i < x; i++)
        Pyx[i] = new double[y];
    
    for (int i = 0; i < x; i++)
        for (int j = 0; j < y; j++)
            Pyx[i][j] = P[i][j] / p[j]; //условные вероятности
        
    double** Pxy = new double*[x];
    for (int i = 0; i < x; i++)
        Pxy[i] = new double[y];
    
    for (int i = 0; i < x; i++)
        for (int j = 0; j < y; j++)
            Pxy[i][j] = P[i][j] / r[i]; 
        
    double Hyx = 0;
    double Hxy = 0;
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            if (Pyx[i][j] == 0)
                continue;
            Hyx += p[j] * Pyx[i][j] * log(Pyx[i][j]);
        }
    }
    
    cout << "Hyx" << (Hyx*(-1)) << endl;;
    
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            if (Pxy[i][j] == 0)
                continue;
            Hxy += r[i] * Pxy[i][j] * log(Pxy[i][j]);
        }
    }
    
    cout << "Hxy" << (Hxy * (-1)) << endl;
 
    for (int i = 0; i < x; i++)
        delete [] P[i];
    delete [] P;
    
    delete [] p;
    delete [] r;
 
    for (int i = 0; i < x; i++)
        delete [] Pyx[i];
    delete [] Pyx;
 
     for (int i = 0; i < x; i++)
        delete [] Pxy[i];
     delete [] Pxy;
    
    system("pause");
	return 0;
}
Julia1 вне форума Ответить с цитированием
Старый 20.04.2015, 19:27   #2
fygas1991
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 36
По умолчанию

Код:
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            p[i] += P[j][i]; //p i-ое
 
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            r[i] += P[i][j];//r j-ое
изначально твой код выдает ошибку у меня: при выводе значения -1.#IND
это возможно связано с тем, что получается слишком большое или маленькое значение. Проблема в указанном мной коде. У тебя p[i] и r[i] не присвоены какие-то значения. И в них находиться мусор. Если нам убрать операцию сложения.

Код:
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            p[i] = P[j][i]; //p i-ое
 
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            r[i] = P[i][j];//r j-ое
То код отрабатывает на ура. Или изначально присвой какое-либо значение. Скорее всего это будет как обычно ноль. Также в этом случае все ОК и с дробями.
fygas1991 вне форума Ответить с цитированием
Старый 20.04.2015, 19:41   #3
fygas1991
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 36
По умолчанию

Я конечно, не совсем понял, что вы тут хотели сделать!
Но возможно поможет такой результат. Если мы обнулим p[i] и r[i] в каждой строчке, путем установки условия:

Код:
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
       //     p[i] += P[j][i]; //p i-ое
	if(j==0)
	{
		p[i]=0; p[i] += P[j][i];
	}
	else {p[i] += P[j][i];}

 
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
    //        r[i] += P[i][j];//r j-ое

	if(j==0)
	{
		r[i]=0; r[i] += P[j][i];
	}
	else {r[i] += P[j][i];}
fygas1991 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтобы бд работала без установки Delphi Ol'ga БД в Delphi 7 05.06.2012 16:22
Как сделать, чтобы программа работала сразу через 20 сайтов? tima777 Работа с сетью в Delphi 4 13.08.2011 20:48
!!! Можно ли сделать так,чтобы программа в Delphi работала с самим компьютером?!!! kotaina Общие вопросы Delphi 19 07.04.2011 13:40
Как сделать,чтобы программа работала при низком разрешение монитора? RomanDemidov Общие вопросы Delphi 5 13.12.2010 19:10
Как сделать так чтобы моя программа при включении отображалась в панели задач, как например часы Window ? asked86 Win Api 1 15.12.2008 08:42