Uwzględnienie żądanej dokładności podczas obliczania wartości funkcji

0

Witam
Mam do napisania pewien projekt na studiach i mam z nim kilka problemów.
Oto projekt.
http://csharp2012.cba.pl/images/ProgramyWyklad/SANProjektNr1.pdf
Dopiero zaczynam swoją przygodę z programowaniem więc nie znam jeszcze za dobrze c#'a.
Robię zadanie 1 i do tej pory napisałem to.

 static int ks_silnia(int ks_n_1)
        {
            //rekurencyjne wpisanie silni
            if (ks_n_1 == 0) return 1;
            else return ks_n_1 * ks_silnia(ks_n_1 - 1);
        }
        static void Main(string[] args)
        {
            //Przypisanie typu danych
            String ks_odp;
            float ks_X, ks_EPS, ks_Y, ks_b;
            int ks_n, ks_w, ks_index_1, ks_index_2;;
            float ks_Xd, ks_h, ks_Xg;
            float[,] ks_tab;

            do
            {
                //Wypisanie metryki programu
                Console.WriteLine("\n\t\tProgram dla zadania pierwszego. Wybierz jedną z opcji:" +
                                  "\n\t1.Określenie wartości funkcji w podanym punkcie wartości zmiennej" +
                                  "\n\tniezależnej X i przy określonej dokładności EPS " +
                                  "\n\t2.Tablicowanie funkcji w podanym przedziale [Xd,Xg] z krokiem h i" +
                                  "\n\tprzy określonej dokładności EPS.");
                start:
                Console.Write("\n\tWybierz 1 lub 2: ");
                ks_w = Convert.ToInt16(Console.ReadLine());
                switch (ks_w)
                {
                    case 1:
                        //Wczytywanie danych
                        Console.Write("\n\tPodaj wartość zmiennej niezależnej X: ");
                        ks_X = Convert.ToSingle(Console.ReadLine());

                        //Wczytanie dokładności obliczeń
                        do
                        {
                            Console.Write("\n\tPodaj dokładność obliczeń EPS: ");
                            ks_EPS = Convert.ToSingle(Console.ReadLine());
                            if ((ks_EPS <= 0) || (ks_EPS >= 1))
                            {
                                Console.Write("\n\tERROR: Dokładność obliczeń musi spełniać warunek: " +
                                              "\n\t0 < EPS < 1");
                                Console.Write("\n\tWprowadz dokładnośc obliczeń jeszcze raz.");
                            }
                        } while ((ks_EPS <= 0) || (ks_EPS >= 1));

                        //Sprawdzenie warunków funkcji
                        if (ks_X < -1)
                        {
                            ks_n = 0;
                            //do
                           // {
                                ks_Y = (float)Math.Pow(-1, ks_n) * (float)Math.Pow(ks_X, 2 * ks_n + 1) / ks_silnia(2 * ks_n + 1);
                                Console.Write("\n\tWartość dla podanego X wynosi: {0}", ks_Y);
                           //     ks_n++;
                           // } while (ks_n <= 15);
                        }
                        if ((ks_X <= 1) && (ks_X >= -1))
                        {
                            ks_n = 1;
                            //do
                            //{
                                ks_Y = (float)Math.Pow(-1, ks_n) * (float)Math.Pow(ks_X, ks_n) / ks_silnia(2 * ks_n);
                                Console.Write("\n\tWartość dla podanego X wynosi: {0}", ks_Y);
                            //    ks_n++;
                           // } while (ks_n <= 15);
                        }
                        if (ks_X > 1)
                        {
                            ks_n = 1;
                            do
                            {
                                //wczytanie zmiennej b
                                Console.Write("\n\tPodaj wartość zmiennej b(b>0): ");
                                ks_b = Convert.ToSingle(Console.ReadLine());
                                if (ks_b <= 0)
                                    Console.Write("\n\tERROR: b musi być większe od zera.");
                            } while (ks_b <= 0);
                           // do
                           // {
                                ks_Y = (float)Math.Pow(Math.Log(ks_b), ks_n) * (float)Math.Pow(ks_X, ks_n) / ks_silnia(ks_n);
                                Console.Write("\n\tWartość dla podanego X wynosi: {0}", ks_Y);
                             //   ks_n++;
                            //} while (ks_n <= 15);
                        }

                        break;
                    case 2:
                        //Wczytanie zmiennych
                        Console.Write("\n\tPodaj dolną wartość zmiennej niezależnej X: ");
                        ks_Xd = Convert.ToSingle(Console.ReadLine());
                        do
                        {
                            Console.Write("\n\tPodaj górną wartość zmiennej niezależnej X: ");
                            ks_Xg = Convert.ToSingle(Console.ReadLine());
                            if (ks_Xg <= ks_Xd)
                                Console.Write("\n\tGórna wartość X musi być większa od dolnej !! ");

                        } while (ks_Xg <= ks_Xd);

                        Console.Write("\n\tPodaj h: ");
                        ks_h = Convert.ToSingle(Console.ReadLine());

                        do
                        {
                            //wczytanie zmiennej b
                            Console.Write("\n\tPodaj wartość zmiennej b(b>0) dla x>0: ");
                            ks_b = Convert.ToSingle(Console.ReadLine());
                            if (ks_b <= 0)
                                Console.Write("\n\tERROR: b musi być większe od zera.");
                        } while (ks_b <= 0);

                        //Wczytanie dokładności obliczeń
                        do
                        {
                            Console.Write("\n\tPodaj dokładność obliczeń EPS: ");
                            ks_EPS = Convert.ToSingle(Console.ReadLine());
                            if ((ks_EPS <= 0) || (ks_EPS >= 1))
                            {
                                Console.Write("\n\tERROR: Dokładność obliczeń musi spełniać warunek: " +
                                              "\n\t0 < EPS < 1");
                                Console.Write("\n\tWprowadz dokładnośc obliczeń jeszcze raz.");
                            }
                        } while ((ks_EPS <= 0) || (ks_EPS >= 1));

                        //Obliczenia i dodawanie do tablicy
                        ks_index_1 = 0;
                        ks_index_2 = 0;
                        ks_tab = new float[ks_index_1, ks_index_2];

                        do
                        {
                            if (ks_Xd < -1)
                            {
                                ks_n = 0;
                                ks_Y = (float)Math.Pow(-1, ks_n) * (float)Math.Pow(ks_Xd, 2 * ks_n + 1) / ks_silnia(2 * ks_n + 1);
                                ks_tab[ks_index_1, ks_index_2]= ks_Xd;
                                ks_tab[ks_index_1, ks_index_2+1] = ks_Y;
                                ks_index_1++;
                                ks_index_2++;
                                ks_Xd = ks_Xd + ks_h;  
                            }
                            if ((ks_Xd <= 1) && (ks_Xd >= -1))
                            {
                                ks_n = 1;
                                ks_Y = (float)Math.Pow(-1, ks_n) * (float)Math.Pow(ks_Xd, ks_n) / ks_silnia(2 * ks_n);
                                ks_tab[ks_index_1, ks_index_2] = ks_Xd;
                                ks_tab[ks_index_1, ks_index_2 + 1] = ks_Y;
                                ks_index_1++;
                                ks_index_2++;
                                ks_Xd = ks_Xd + ks_h;
                            }
                            if (ks_Xd > 1)
                            {
                                ks_n = 1;
                                ks_Y = (float)Math.Pow(Math.Log(ks_b), ks_n) * (float)Math.Pow(ks_Xd, ks_n) / ks_silnia(ks_n);
                                ks_tab[ks_index_1, ks_index_2] = ks_Xd;
                                ks_tab[ks_index_1, ks_index_2 + 1] = ks_Y;
                                ks_index_1++;
                                ks_index_2++;
                                ks_Xd = ks_Xd + ks_h;
   
                            }
                        } while (ks_Xd <= ks_Xg);
                        break;

                    default:
                        Console.Write("\n\tERROR: wciśnij 1 lub 2!\n");
                        goto start;
                }
             Console.Write("\n\tCzy chcesz powtarzać szukanie liczby doskonałej? (T/N): ");
             ks_odp = Console.ReadLine().ToUpper();
            } while (ks_odp == "T");

Nie do końca wiem jak mam zrobić ten zapis z dokładnością Eps(próbowałem zrobić tak że iteracyjnie dodawać n a potem pętlą do while dopóki Eps nie będzie mniejsze od wartości bezwzględnej Y tylko wtedy ta wartość wychodzi bardzo mała albo wcale, wiec nie wiem). Mam również problem z tablicą, nie wiem jak przekonwertować float na string i wypisać tablicę(chciałem zrobić tak żeby wpisywać kolejne wartości x i y do tablicy).
Będę wdzięczny za szybką pomoc.

0
karol774 napisał(a):

nie wiem jak przekonwertować float na string

 tablica_stringow[index] = zmienna_typu_float.ToString();

btw. w związku z tym, że klasa object, po której dziedziczą wszystkie inne klasy posiada metodę ToString() to instancja każdej klasy w C# mniej lub bardziej użyteczną, ale zawsze ma metodę .ToString(), którą de facto można sobie nadpisać.

0

Dzięki zawsze to krok do przodu :D . Powie mi ktoś co robię źle przy tablicowaniu ? Wyskakuje mi błąd, że wykracza poza indeks(podałem początkowe wartości indeksu, potem próbowałem przypisać wartości x i y i zrobiłem iterację indeksów, znalazłem też na stronie jak ją wypisać).

0
                        ks_index_1 = 0;
                        ks_index_2 = 0;
                        ks_tab = new float[ks_index_1,ks_index_2];

A potem próbujesz coś wpisać do tablicy 0 na 0 elementów.

1

Przemyśl strukturę tego programu bo na chwilę obecną to jest masakra po prostu, nawet jak na osobę początkującą (ja bym się wstydził pokazać coś takiego prowadzącemu).
Już sam fakt że musiałeś użyć goto świadczy o tym że coś jest skopane. Poza tym, czemu cała logika zawarta jest w jednej instrukcji switch? Podziel to na metody bo teraz to się tego nawet czytać nie che.

0

Zdaję sobie z tego sprawę, chciałem najpierw sprawić aby to w ogóle działało i potem to jakoś ogarnąć. Ale gafa z tymi indeksami, już poprawiłem.Dzięki

0

Czy można wyjść z pętli foreach w momencie przekroczenia indexu zapisanych pól?

0

Sprawdzasz sobie w if'ie ten index, a żeby przerwać pętle używasz break
EDIT: Pętla foreach służy do wykonywania zestawu poleceń dla wszystkich elementów danego zbioru. Nie wiem o jaki kontekst dokładnie Ci chodzi, ale jeżeli robisz coś dla jakiejś ilości indeksów, to może lepiej zastosować zwykłe for?

0

tak właśnie zrobiłem,pozostaje ostatnia kwestia czyli tej dokładności. Z tego co zrozumiałem to wartość Y ma być zapisana z tą dokładnością Eps(chyba że się mylę bo nie ogarniam tego), tylko nie wiem jak to zrobić.

0

Ogólnie to ludzie by pewnie chętnie pomogli, ale mało komu chce się zbytnio wysilać. Nie wiem jak reszcie ale np. tajemny skrót Eps nic mi nie mówi. "Y ma być zapisana z tą dokładnością Eps", czyli co potrzebujesz wypisać na konsole float'a z dokładnością do n miejsc po przecinku? Biorąc pod uwagę, że zmienne ks_EPS, ks_Y to floaty, a uruchamiając twój kod podawałem np. Eps "0,8" to nie wiem o co pytasz ;)

0

Wczytanie Eps jest zrobione jednak nic ono nie daje bo nie wiem o co chodzi z ta dokładnością. W treści jest że 0<Eps<1 więc chyba chodzi o miejsca po przecinku. Jeśli tak to wydaje mi się że trzeba podać wynik Y z dokładnością ilości miejsc po przecinku, albo może być tak że dla n = 0,1,2 ... trzeba znaleźć taką wartość która zawiera się w Eps.

0

No to wyczerpałeś temat ;-) Skoro sam nie wiesz co ma liczyć twój program albo jak działać to ciężko pomagać.
Albo musisz się zapoznać z przeciążeniami metody .ToString(); albo ogarnąć temat albo wypolerować szklaną kulę albo...

0

Chyba znalazlem rozwiązanie swojego problemu. Można zamknąć temat. Dzięki za wszystko

0

Wypadało by podać rozwiązanie...

0

z tego co wyczytałem gdzieś w googlach to
"esp jest uzywane do ciagow...
np.
1/2 + 1/4 + 1/8 + ... itd
nalezy sprawdzić czy wartosc otrzymywana (wyraz ciagu) jest mniejsze niz esp, jesli tak to nie robisz" więc wychodzi na to że muszę znaleźć wartość y= F(x) które mieści się w 0<EPS<1 przy n=0,1,2....

1

Mi się wydaje, że Eps to po prostu epsilon, czyli wartość określającą dokładność obliczeń, która to jest powszechnie stosowana przy obliczeniach numerycznych, a nawet przy porównywaniu liczb zmiennoprzecinkowych.

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