2013-05-01 5 views
0

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

Error: variable is not declared in this scope

Также есть ошибка, я понятия не имею, как исправить, которая имеет отношение к 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

Кроме того, мой инструктор попросил настроить максимальное значение x и y на x_max и y_max, но я не знаю, что делать с y_max. –

+1

Не могли бы вы пояснить свой исходный код строками, которые дают ошибки? Это избавляет нас от необходимости подсчитывать их или вставлять их в другой редактор. – MatthewD

+0

Вы, кажется, возвращаетесь из петли. Вы уверены, что хотите этого? – emsr

ответ

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» и, вероятно, сработаете.

    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

Я не знаю, что вы подразумеваете под функцией «прототип», но то, что я пытаюсь сделать, было задано как переменная N как функция (например, n (t)), так что для любого входа t программа вводит это значение в ** ** ** (t). ... Я понимаю ошибку y_max, но мое задание попросит меня настроить максимальные значения, найденные для x и y, и умножить их. Чтобы быть более конкретным: «скорректируйте ваши случайные x и y на x_max и n (0) соответственно, как упомянуто в лаборатории, а затем скорректируйте оценку итоговой площади на« x_max * n (0) + 0,5 », что также упомянутый в лаборатории .... Я пытался размножить и добавить в область видимости. –

+0

«Функция прототипа» означает, что вы сообщаете компилятору, что есть функция где-то, называемая 'n', это то, что она выглядит так, и не волноваться, потому что определение 'n' будет доступно, когда компоновщик создает исполняемый файл. – MatthewD

+0

Ahh, я думаю, что получаю то, что вы пытаетесь сделать. Оператор return - это определение вашей функции ' n '. – MatthewD

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 объявлен как глобальная константа.)

Смежные вопросы