kkate4ka
@kkate4ka
глупенькая девочка

Не могу понять, в чем ошибка?

В задании нужно посчитать частоту попадания в заданный интервал, который пользователь вводит сам. Преподаватель сказал, что нужно динамическое выделение памяти, но для начала я не уверена, что выделила и освободила все правильно. Также сказал, что здесь переполнение:
double temp = random(a, b);
		res[(int)(temp + b)]++;

Вот файлы полностью:
1. основная логика
// ввести интервал, найти частоту попадания
#include <stdio.h>
#include <stdlib.h>
#include "gen.h"


double random(double a, double b)										
{
	return (double) a + (double)rand() / RAND_MAX * (b - a); // a = -5; b = 5
}

void result(int num, double a, double b) 
{
	int i, n;
	double *res;
	res = (double*)malloc(((b - a ) + 1) * sizeof(double));// res[(b - a) + 1] = {0}; // 11

	for (i = 0; i < num; i++)
	{
		double temp = random(a, b);
		res[(int)(temp + b)]++; // 5
	}
	for (i = 0; i < (b - a) ; i++) // 10
	{
		printf("%d) - (%d) : %.4lf\n", i - b, (i - (b - 1)), ((double)res[i]/num)); // 5, 4
		
	}
	
	free(*res);
}

2. main
/*Написать генератор псевдослучайных чисел, распределенных на интервале[-5., 5.]
Подсчитать частоты попадания в каждый из интервалов длиной 1 при выборке 500000.
*/
#include <stdio.h>
#include "gen.h"

int main()
{
	double a, b;
	result( a, b, 500000);
	printf ("[a.; b.]");
	printf ("\na = ");
	scanf ("%ld", a);
	printf ("\nb = ");
	scanf ("%ld", b);
	result( a, b, 500000);

	getchar();
	return 0;
}
  • Вопрос задан
  • 252 просмотра
Пригласить эксперта
Ответы на вопрос 1
bogolt
@bogolt
Попробую объяснить путь к понимаю проблемы переполнения.
double temp = random(a, b);
Подставьте сюда сами разные значения ( напиример 0 5 или -5 и 3 ) подумайте какие возможные результаты может вернуть функция ( максимальный и минимальный ). Прибавьте граничные результаты к b ( у вас же temp + b ) вспомните какое максимальное количество элементов вы выделили.

2. Все-таки обнулите выдленный блок памяти. Можно руками в цикле а можно через www.cplusplus.com/reference/cstdlib/calloc например ( там и с параметрами запутаться сложнее ).

3. Ваша функция result ожидает количество итераций, а, б а вы ей передаете а, б, количество итераций. Как следствие все значения попадают не туда куда следует. Возможно компилятор пытался вам об этом сообщить ворнигнами - читайте их, они ваши друзья.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы