Официальный сайт студ.городка НГТУ
Программирование и БД » [С++] - ошибка в программе 

#1  06.04.11 00:38

[С++] - ошибка в программе

для сгенерированной случайной последовательности z[i] проводится проверка подчинения равномерному распределению, с помощью критерия согласия χ2-Пирсона.

Код::

Для проверки гипотезы о том, что сгенерированная последовательность подчиняется равно-мерному распределению, можно использовать критерий согласия χ2-Пирсона.
Сначала отрезок, содержащий числа, которые могут быть смоделированы, 
разбивают на K интервалов (интервалы обычно выбирают равной длины) и считают,
сколько элементов последо-вательности, длина которой N, попадает в каждый интервал (vi).Пусть M – максимально возмож-ный элемент в последовательности длиной N,
тогда если M < 10, то K = M, иначе K ≈ 5∙lg N.
Затем вычисляют статистику критерия по формуле:

S = N * сумма по K (((vi/N))-Pi)^2)/Pi

где Pi – теоретическая вероятность попадания в i-й интервал (для равномерного распределения Pi = 1 / K, если интервалы равной длины).

Код::

#include "stdafx.h"
#include <conio.h>
#include <math.h>


#define N 50 // мощность первого алфавита


double sqr(double x){
	return x*x;}

void main()
{
	int z[200];
	
	int Ki=(int)ceil(5*(log((double) N)/log(10.0))); //количество интервалов
	
	float M=N/Ki; //длина интервала
	
	int *v=new int[Ki]; //количество элементов в каждом интервале

	for (int i=0; i<Ki; i++)
	z[i]=M;

	double S=0;
	for(int i1=0; i1<Ki; ++i1)
	{
	S+=sqr((double)(v[i1]/N-1/Ki)/(1/Ki)); //вычисляем критерий 
	}
	
	printf ("\n" "S*=  %f", S);
	getch();
	}

выдает S*=  1.#INF00 ???

Исправлено Aguero (06.04.11 00:40)

Offline

#2  06.04.11 01:13

Re: [С++] - ошибка в программе

Aguero написал(а):

printf ("\n" "S*= %f", S);

а так можно? мб

Код::

printf ("\nS*=  %f", S);

Исправлено Fire Stream (06.04.11 01:14)

Offline

#3  06.04.11 01:31

Re: [С++] - ошибка в программе

неее.. вроде нашел проблему...

int *v = new int Ki[];

не правильно память выделяю...... а как иначе не знаю...

Offline

#4  06.04.11 18:04

Re: [С++] - ошибка в программе

память правильно выделяется. глянь какое значение у Ki

Offline

#5  06.04.11 18:15

Re: [С++] - ошибка в программе

Ну может дело в том тогда, что ты пользуешься массивом v в вычислении даже не инициализировав его? Зачем он вообще здесь нужен? Либо если предполагалось его заполнить значениями М, то зачем массив z?

Offline

#6  06.04.11 18:20

Re: [С++] - ошибка в программе

А ещё как знать, может 1/Ki будет равно нулю? Если возникает вопрос почему - Кернигана Ричи "Язык Си" в руки и вперёд.

Offline

#7  06.04.11 19:20

Re: [С++] - ошибка в программе

Ki = 9,

Offline

#8  06.04.11 20:07

Re: [С++] - ошибка в программе

А мои сообщения видимо проигнорировал? Я вот, например, продолжаю утверждать, что 1/Ki = 0 при Ki = 9. Хочешь проверить - исполни этот код и погляди чему будут равны k1 и k2:

Код::

double k1 = 1/Ki;
double k2 = 1.0/Ki;

Почувствуй разницу, что называется.

Исправлено Draloskop (06.04.11 20:19)

Offline

#9  06.04.11 20:10

Re: [С++] - ошибка в программе

Aguero,    

Код: cpp:

for (int i=0; i<Ki; i++)
	z[i]=M;

тут наверное вместо z - v ?

Offline

#10  06.04.11 22:25

Re: [С++] - ошибка в программе

Draloskop, да, все верно...))

только не помойму, почему делаю по шагаво, в строчке int *v=new int[Ki];
вот это показывает:   
v    0xcccccccc    int *
CXX0030: ошибка: невозможно вычислить выражение

Offline

#11  06.04.11 22:26

Re: [С++] - ошибка в программе

Banzzaj, да я вот не знаю... мне как бы мы мою сгенерированную последовательность z[i] надо проверить....)

это просто кусок кода, только вычисление самого критерия...

Offline

#12  07.04.11 12:36

Re: [С++] - ошибка в программе

Aguero написал(а):

только не помойму, почему делаю по шагаво, в строчке int *v=new int[Ki];
вот это показывает:   
v    0xcccccccc    int *

Ну так наверно надо смотреть на значение v после этой строчки, когда выполнится то, что в ней написано.

Offline

#13  08.04.11 17:24

Re: [С++] - ошибка в программе

int *v=new int[Ki]; //количество элементов в каждом интервале
for (int i=0; i<Ki; i++)
z[i]=M;

вот это заменяю на это

int *v=new int[Ki]; //количество элементов в каждом интервале
for (int i=0; i<Ki; i++)
pp = v[(((int)z[i]/(int)M))];
printf("%f", pp);

в чем может быть ошибка?...

Offline

#14  08.04.11 18:06

Re: [С++] - ошибка в программе

мало того что z[i]/M можеи быть > Ki, там еще и проинициализируй ты наконец массив v

Offline

#15  09.04.11 22:49

Re: [С++] - ошибка в программе

все разобрался, спасибо всем))

Offline

#16  30.04.11 20:57

Re: [С++] - ошибка в программе

Хм...может тоже свои тупые ошибки сюда писать...это жеж глупо, не проще 5 мин с дебагером посидеть?

Offline

Программирование и БД » [С++] - ошибка в программе 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.096 сек.
Выполнено 14 запросов.