Program liczący całke ;-)

0

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');
        }
    }
}
1

Po pierwsze wiesz co oznacza słowo static??

static MetodyCalkowania.Metody metoda = MetodyCalkowania.Metody.Prostokatow;

Jak nie wiesz to nie używaj... To po pierwsze. A konkretnie to aby funkcja do wyboru metody całkowania Ci działała to zmienna metoda nie może być statyczna, no i musisz pod nią podstawić odpowiednią wartość jaką wybrał użytkownik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1