Делегаты( немного подправить) C#

  • Автор темы develish15
  • Дата начала
D

develish15

Само задание тут ,

написала программу, но надо исправить 25строчку. (эту
Код:
for (int i = a; i < b; i++)
{
L += Math.Sqrt( ( f( i + 1 ) - f( i ) ) * ( f( i + 1 ) - f( i )) + ( (i + 1) - i ) * ( (i + 1) - i ) );
}
)


Сама прога:
Код:
class Program
{
//Объявление переменной функционального типа (делегата)
delegate double fun(double x);
//Функции, которые будут передаваться посредством делегата
static double F1(double x)
{
return x * x + 2 * Math.Log( 1 + x * x );
}
static double F2(double x)
{
return x * Math.Log( Math.Abs( x * x - 2 * x ) );
}
static double F3(double x)
{
return ( x * x + 2 * x - 3 ) * Math.Exp( -x );
}

//Вычисление длины дуги
static double Line(int a, int b, fun f)
{
double L = 0;
for (int i = a; i < b; i++)
{
L += Math.Sqrt( ( f( i + 1 ) - f( i ) ) * ( f( i + 1 ) - f( i )) + ( (i + 1) - i ) * ( (i + 1) - i ) );
}
return L;
}
//Основной модуль
static void Main(string[] args)
{
Console.Write("Введите a=");
int a = int.Parse(Console.ReadLine());

Console.Write("Введите b=");
int b = int.Parse(Console.ReadLine());
Console.Clear();
Console.WriteLine("Введенные значения:\n a={0:d}\n b={1:d}\n\n", a, b);
double res1 = 0, res2 = 0, res3 = 0, maxres = 0;
res1 = Line( a, b, F1 );
res2 = Line(a, b, F2);
res2 = Line(a, b, F3);
if (res1 > res2) maxres = res1;
else maxres = res2;
if (maxres < res3) maxres = res3;
Console.WriteLine("Длины дуг:");
Console.WriteLine(" при F1: {0:f4}", res1);
Console.WriteLine(" при F2: {0:f4}", res2);
Console.WriteLine(" при F3: {0:f4}\n", res3);
Console.WriteLine(" Наибольшая длина дуги: {0:f4}\n", maxres);
Console.ReadLine();
}

} 
}

Знаю что нужно создавать некий массив x[n] чисел в диапазоне a-b. затем в формулу подставлять x. так:

C++:
for (int i = 0; i < n-1; i++)
{
L += Math.Sqrt( ( f( x[i + 1] ) - f( x[i] ) ) * ( f( x[i + 1] ) - f( x[i] )) + ( (x[i + 1]) - x[i] ) * ( (x[i + 1]) - x[i] ) )
};

При этом нужно сделать метод заполнения массива x[n] числами от a до b. И в методы функций нужно передавать double[] x.
А как реализовать не могу понять...подскажите пожалуйста... ;)
 
A

artak

A chto imenno u tebja ne rabotajet...V tvojom kode net smisla ispolzovat delegat...mogu skazat chto nado objavit delegat vot tak ...

delegate double fun(double x);

static double F1(double x)
{...}

static double F2(double x)
{...}

static double F3(double x)
{...}


fun f=new fun(F1); //ili F2, F3
Line(a, b, f);
 
D

develish15

A chto imenno u tebja ne rabotajet...V tvojom kode net smisla ispolzovat delegat...mogu skazat chto nado objavit delegat vot tak ...

delegate double fun(double x);

static double F1(double x)
{...}

static double F2(double x)
{...}

static double F3(double x)
{...}


fun f=new fun(F1); //ili F2, F3
Line(a, b, f);

нет, с кодом все верно и все работает. преподаватели уже проверяли. есть смысл или нет использовать-к сожалению не мне решать.
а неверно то, что у меня по заданию L находится с помощью f(x), а у меня просто записано как f(i).
 
A

artak

poprobuj tak...

double [] x=new double[b-a]; //v diapazone a-b est b-a chisel, esli nado i b to ~+1

for(int i=0; i<x.Length; ++i)
x=a+i;

 
A

artak

da, no snachalo nado pered Main() objavit: static double []x (mozhno dazhe posle Class Program, chtobi ono bili globaljnim)
Potom v Main(), posle
Console.Write("Введите b=");
int b = int.Parse(Console.ReadLine());
Console.Clear();
Console.WriteLine("Введенные значения:\n a={0:d}\n b={1:d}\n\n", a, :discard:;

nado vstavit uzhe tot kod'
x=new double[b-a]; //v diapazone a-b est b-a chisel, esli nado i b to ~+1

for(int i=0; i<x.Length; ++i)
x=a+i;

i uzhe potom pozvat method Line().

Kstati v methode Line uzhe ne trebujetsja int a, int b. mozhno vot tak...


static double Line(double []x, fun f)
{
double L = 0;
for (int i = 0; i < x.Length; i++)
{
L += Math.Sqrt( ( f(x[ i + 1] ) - f(x[ i] ) ) * ( f(x[ i + 1] ) - f(x[ i] )) + ( (x[i + 1]) -x[ i] ) * ( (x[i + 1]) -x[ i] ) );
}
return L;
}

 
D

develish15

странно...сделала как Вы сказали.
теперь "Error Expected class, delegate, enum, interface, or struct".
Можете полностью скинуть код как у вас получился?
 
A

artak


class Program
{
//Объявление переменной функционального типа (делегата) + massiv q
static double [] q;
delegate double fun(double x);

//Функции, которые будут передаваться посредством делегата
static double F1(double x)
{
return x * x + 2 * Math.Log( 1 + x * x );
}

static double F2(double x)
{
return x * Math.Log( Math.Abs( x * x - 2 * x ) );
}

static double F3(double x)
{
return ( x * x + 2 * x - 3 ) * Math.Exp( -x );
}

//Вычисление длины дуги

static double Line(double [] q, fun f)
{
double L = 0;
for (int i = 0; i < q.Length; ++i)
{
L += Math.Sqrt( ( f(q[ i + 1] ) - f(q[ i] ) ) * ( f(q[ i + 1] ) - f(q )) + ( q[i + 1] -q[ i] ) * ( q[i + 1] - q ) );
}
return L;
}

//Основной модуль
static void Main(string[] args)
{
Console.Write("Введите a=");
int a = int.Parse(Console.ReadLine());

Console.Write("Введите b=");
int b = int.Parse(Console.ReadLine());
Console.Clear();
Console.WriteLine("Введенные значения:\n a={0:d}\n b={1:d}\n\n", a, B);

q=new double[b-a+1]; //v massive budut soderzhatsja cifri ot a do b
for(int i=0; i<q.Length; ++i)
q=a+i;

double res1 = 0, res2 = 0, res3 = 0, maxres = 0;

fun G=new fun(F1);
res1 = Line( q, G );

fun G=new fun(F2);
res2 = Line(q, G);

fun G=new fun(F3);
res2 = Line(q, G);

if (res1 > res2) maxres = res1;
else maxres = res2;
if (maxres < res3) maxres = res3;
Console.WriteLine("Длины дуг:");
Console.WriteLine(" при F1: {0:f4}", res1);
Console.WriteLine(" при F2: {0:f4}", res2);
Console.WriteLine(" при F3: {0:f4}\n", res3);
Console.WriteLine(" Наибольшая длина дуги: {0:f4}\n", maxres);
Console.ReadLine();
}

}
}

esli i tak ne zarabotaet to posmotri imenno na kakoj stroke vidajot oshibku i napishi oshibku
 
D

develish15

на 60 и 63
Error"A local variable named 'G' is already defined in this scope 60 5 1"
 
D

develish15

исправила на
Код:
fun G1=new fun(F1);
res1 = Line( q, G1 );

fun G2=new fun(F2);
res2 = Line(q, G2);

fun G3=new fun(F3);
res3 = Line(q, G3);

ничего не подчеркивает, но при запуске пишет теперь "Индекс находился вне границ массива." и подчеркивает эту строчку
Код:
{
L += Math.Sqrt( ( f( i + 1 ) - f( i ) ) * ( f( i + 1 ) - f( i )) + ( (i + 1) - i ) * ( (i + 1) - i ) );
}


А у вас нормально работает??
может скинете мне на почту Ваше?
 
A

artak

static double Line(double [] q, fun f)
{
double L = 0;
for (int i = 0; i < q.Length-1; ++i)
{
L += Math.Sqrt( ( f(q[ i + 1] ) - f(q[ i] ) ) * ( f(q[ i + 1] ) - f(q )) + ( q[i + 1] -q[ i] ) * ( q[i + 1] - q ) );
}
return L;
}
 
D

develish15

да, уже исправила. спасибо большое :(
 
A

artak

Vsegda gotov...
a ne podskazhete cho vzjat za diplomnuju :(
Budu ochen priznatelen...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!