Я пытаюсь написать программу, которая имитирует бросание дротиков по стандартной кривой. Всякий раз, когда я подхожу к отладке всего, всплывает что-то еще. Пока что я получаю много ошибок, таких как:
Ошибка: переменная не объявлена в этой области
Также есть ошибка, я не знаю, как исправить, что связано с 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;
}
Эта строка:
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
это указатель на функцию)Вы имели в виду, что это будет прототип функции? Если нет, что вы имели в виду?
Ошибка error: y_max was not declared in this scope
это просто. y_max
нигде не объявлено.
Эта строка:
area*n(0)+0.5 = static_cast<double>(num_darts)/darts; //error: invalid Ivalue in assignment.
Ошибка error: invalid Ivalue in assignment
потому что вы не можете присвоить значение выражению. Что ты намеревался сделать здесь?
Кроме того, есть некоторые другие проблемы:
Эта строка:
while (again == 'y' || again == 'Y');
приведет к тому, что ваша программа войдет в бесконечный цикл, так как вы установили again = 'y'
как раз перед этим, и точка с запятой сообщает компилятору это:
while (again == 'y' || again == 'Y')
{
// do nothing
}
Чтобы исправить это, удалите точку с запятой и поставьте скобки вокруг кода, который должен находиться внутри цикла while. Такая же проблема существует и позже (while (x_max < 0);
).
Кто-то еще указал на это:
return 1/sqrt(2*pi)*exp(-pow(t,2)/2);
который происходит в середине функции. Это приведет к немедленному завершению этой функции и возврату вычисленного значения. Это то, что вы хотели? Код после этой строки никогда не запустится.
Больше проблем:
Этот код не обрабатывает случай 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: ";
Используйте фигурные скобки для управления циклами, а не пробелами. Вместо этого:
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;
}
Эта строка:
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??
Когда вы впервые учитесь программировать на 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
объявляется либо глобальной константой.)