Не могу исправить ошибки в программе Монте-Карло

Я пытаюсь написать программу, которая имитирует бросание дротиков по стандартной кривой. Всякий раз, когда я подхожу к отладке всего, всплывает что-то еще. Пока что я получаю много ошибок, таких как:

Ошибка: переменная не объявлена ​​в этой области

Также есть ошибка, я не знаю, как исправить, что связано с C ++, сравнивая указатели и целые числа

Я довольно новичок в C ++, поэтому любые указатели будут с благодарностью.

Вот что я получил до сих пор.

примечание: ошибки в строках 67, 70, 72 и 75.

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

double seed(int darts, int x);

int main ()
{
int darts, x_max;
double area;

char again = 'y';
char giveDarts;
while (again == 'y' || again == 'Y');
cout << "Run program (y/n)?";
cin >> giveDarts;
switch (giveDarts) {
case 'y':
case 'Y':
cout << "Enter the ammount of darts to be thrown: "; //since we are simulating DARTS I will use the varible darts instead of "NumberOfSamples"cin >> darts;
srand(darts);
default:
break;
}
cout << "Enter maximum value of x: ";
cin >> x_max;

while (x_max < 0);
cout << "Please enter a positive value of x: ";
cin >> x_max;
cout << endl;

srand(time(NULL));

area = seed(darts, x_max);

cout << "Estimate of area under curve is: " << area << endl;
cout << "Go again? ";
cin >> again;
return 0;
}

double seed(int darts, int x_max)
{
int i, num_darts=0; //num_darts instead of SamplesInsideArea.
double area;

for(i=1; i<=darts; i++) // for loop
{
double x, y;
double pi = 3.14;
double n (double t);

return 1/sqrt(2*pi)*exp(-pow(t,2)/2); //error:'t' was not declared in this scope
x = rand() / static_cast<double>(RAND_MAX);
y = rand() / static_cast<double>(RAND_MAX);
n(0) = (x*x_max + y*y_max); //error: y_max was not declared in this scope

if(num_darts <= n) //error: ISO C++ forbids comparison between pointer and integer
num_darts++;

area*n(0)+0.5 = static_cast<double>(num_darts)/darts; //error: invalid Ivalue in assignment.
}

return area;
}

0

Решение

  1. Эта строка:

    double n (double t);
    

    прототипирование функции n это принимает один параметр double t, Это вызывает две ошибки:

    • error: 't' was not declared in this scope (потому что прототипы функций не объявляют переменные)
    • error: ISO C++ forbids comparison between pointer and integer (так как n это указатель на функцию)

    Вы имели в виду, что это будет прототип функции? Если нет, что вы имели в виду?

  2. Ошибка error: y_max was not declared in this scope это просто. y_max нигде не объявлено.

  3. Эта строка:

    area*n(0)+0.5 = static_cast<double>(num_darts)/darts; //error: invalid Ivalue in assignment.
    

    Ошибка error: invalid Ivalue in assignment потому что вы не можете присвоить значение выражению. Что ты намеревался сделать здесь?


Кроме того, есть некоторые другие проблемы:

  1. Эта строка:

    while (again == 'y' || again == 'Y');
    

    приведет к тому, что ваша программа войдет в бесконечный цикл, так как вы установили again = 'y' как раз перед этим, и точка с запятой сообщает компилятору это:

    while (again == 'y' || again == 'Y')
    {
    // do nothing
    }
    

    Чтобы исправить это, удалите точку с запятой и поставьте скобки вокруг кода, который должен находиться внутри цикла while. Такая же проблема существует и позже (while (x_max < 0);).

  2. Кто-то еще указал на это:

    return 1/sqrt(2*pi)*exp(-pow(t,2)/2);
    

    который происходит в середине функции. Это приведет к немедленному завершению этой функции и возврату вычисленного значения. Это то, что вы хотели? Код после этой строки никогда не запустится.


Больше проблем:

  1. Этот код не обрабатывает случай N / N. Программа не остановится, когда вы наберете ‘n’, и, вероятно, вылетит.

    switch (giveDarts) {
    case 'y':
    case 'Y':
    cout << "Enter the ammount of darts to be thrown: "; //since we are simulating DARTS I will use the varible darts instead of "NumberOfSamples"cin >> darts;
    srand(darts);
    default:
    break;
    }
    cout << "Enter maximum value of x: ";
    
  2. Используйте фигурные скобки для управления циклами, а не пробелами. Вместо этого:

    while (x_max < 0);
    cout << "Please enter a positive value of x: ";
    cin >> x_max;
    cout << endl;
    

    Вы хотите это:

    while (x_max < 0)
    {
    cout << "Please enter a positive value of x: ";
    cin >> x_max;
    cout << endl;
    }
    
  3. Эта строка:

    area*n(0)+0.5 = static_cast<double>(num_darts)/darts;
    

    Если вы пытаетесь установить area, это должно быть в форме:

    area = static_cast<double>(num_darts)/darts; // n(0)+0.5 goes where??
    
0

Другие решения

Когда вы впервые учитесь программировать на C ++, я предлагаю вам объявить и определить все свои функции на глобальном уровне. Это означает, что строки как double n (double t); никогда не должно появляться внутри скобок. Поэтому, чтобы исправить часть проблемы с вашим кодом, переместите эти две строки кода:

double n (double t);

return 1/sqrt(2*pi)*exp(-pow(t,2)/2);

за пределами seed() и сделайте несколько небольших изменений, чтобы это выглядело так:

double n (double t) {
return 1/sqrt(2*pi)*exp(-pow(t,2)/2)
}

Это должно помочь вам в правильном направлении. (Просто убедитесь, что pi объявляется либо глобальной константой.)

0

По вопросам рекламы [email protected]