Witam,
Uczę się jezyka c# z pewnego kursu. I jest tam zadanie do napisania - napisac program do liczenia calki z funkcji f(x) = x4 * x3 +2 (x4 - chodzi o potęge;)) . W programie mam miec wybór wielkosci przedziału, liczby podziałów oraz metody całkowania - trapezowa i prostokatami. problem polega na tym,ze nie działa mi wybor metody ! a rozwiązanie tego przepisałem z kursu;/ Drugim Problemem jest tez to,że przy każdej metodzie wychodzi inny wynik.
a oto kod,niestety dosc dlugi: ( !!!!! - tak zaznaczyłem meijsce,gdzie recznie w kodzie moge zmienic metode);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class MetodyCalkowania
{
public enum Metody { Prostokatow = 1, Trapezow = 2 }
public static double PoczatekPrzedzialu = 0;
public static double KoniecPrzedzialu = 1;
public static uint LiczbaPodzialow = 10;
static double x;
static double f()
{
return x * x * x * (x + 1) + 2;
}
public static double Trapezow()
{
double suma = 0;
double dx = (KoniecPrzedzialu - PoczatekPrzedzialu) / LiczbaPodzialow;
x = PoczatekPrzedzialu;
for (int i = 1; i < LiczbaPodzialow; i++)
{
x += dx;
suma += f();
}
x = PoczatekPrzedzialu;
double tmp = f();
x = KoniecPrzedzialu;
tmp += f();
suma += tmp / 2;
suma *= dx;
return suma;
}
public static double Prostokatow()
{
double suma = 0;
double dx = (KoniecPrzedzialu - PoczatekPrzedzialu) / LiczbaPodzialow;
x = PoczatekPrzedzialu;
for (int i = 0; i < LiczbaPodzialow; i++)
{
x += dx;
suma += f();
}
suma *= dx;
return suma;
}
public static void UstawPrzedzial()
{
do
{
if (PoczatekPrzedzialu > KoniecPrzedzialu)
Console.Write("poczatek musi byc mniejszy");
Console.Write("\nPodaj poczatek przedzialu: ");
PoczatekPrzedzialu = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj koniec przedzialu: ");
KoniecPrzedzialu = Convert.ToDouble(Console.ReadLine());
}
while (PoczatekPrzedzialu > KoniecPrzedzialu);
}
public static void UstawLiczbePodzialow()
{
Console.Write("\nPodaj Liczbe podzialow: ");
LiczbaPodzialow = Convert.ToUInt32(Console.ReadLine());
if (LiczbaPodzialow == 0)
throw new Exception("liczba podzialow musi byc wieksza od 0");
}
}
class Program
{
!!!!!!!!!!!!!static MetodyCalkowania.Metody metoda = MetodyCalkowania.Metody.Prostokatow; !!!!!!!!
static char Menu()
{
Console.WriteLine("\nPrzedzial calkowania: <{0},{1}>", MetodyCalkowania.PoczatekPrzedzialu, MetodyCalkowania.KoniecPrzedzialu);
Console.WriteLine("Liczba podzialow: {0}", MetodyCalkowania.LiczbaPodzialow);
Console.WriteLine("Metoda calkowania: {0}", metoda);
Console.WriteLine("\t\t\tA - Zmiana przedzialu");
Console.WriteLine("\t\t\tB - Zmiana liczby podzialow");
Console.WriteLine("\t\t\tC - Zmiana metody calkowania");
Console.WriteLine("\t\t\tD - oblicz calke");
Console.WriteLine("\t\t\tK - Koniec");
return Console.ReadKey(true).KeyChar;
}
static MetodyCalkowania.Metody UstawMetodeCalkowania()
{
int m = 1;
do
{
if (m != 1)
{
Console.WriteLine("\nNacisnij 1 lub 2");
}
Console.WriteLine("podaj metode liczenia calki");
Console.WriteLine("\t1 - Metoda prostokatow");
Console.WriteLine("\t2 - Metoda trapezow");
m = Convert.ToInt32(Console.ReadLine());
}
while (!(m == 1 || m == 2));
return (MetodyCalkowania.Metody)m;
}
static void ObliczCalke()
{
double calka = 0;
switch (metoda)
{
case MetodyCalkowania.Metody.Prostokatow:
calka = MetodyCalkowania.Prostokatow();
break;
case MetodyCalkowania.Metody.Trapezow:
calka = MetodyCalkowania.Trapezow();
break;
}
Console.Write("\nPrzyblizona wartosc calki funkcji f(x) w przedziale <{0};{1}> wynosi {2}", MetodyCalkowania.PoczatekPrzedzialu, MetodyCalkowania.KoniecPrzedzialu, calka);
Console.ReadKey(true);
}
static void Main(string[] args)
{
char c;
do
{
c = Menu();
switch (c)
{
case 'a': MetodyCalkowania.UstawPrzedzial(); break;
case 'b': MetodyCalkowania.UstawLiczbePodzialow(); break;
case 'c': UstawMetodeCalkowania(); break;
case 'd': ObliczCalke();
break;
}
}
while (c != 'k');
}
}
}