Zakończenie programu wciśnięciem klawisza "x"

0

Witam, napisałem poniższy program do liczenia sumy szeregu funkcyjnego. Skorzystałem z do...while i ConsoleKeyInfo, żeby zakończyć po naciśnięciu klawisza "x" przez użytkownika, ale nic takiego się nie dzieje i program działa w kółko niezależnie.

Prosiłbym o wskazanie błędu lub podpowiedzi, czy jest inna "metoda" na to co chciałbym osiągnąć.

  • Problem: Po naciśnięciu klawisza "x" program powinien zakończyć pracę, a tak się nie dzieje.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NN
{
    class Program
    {
        static void SumaSzereguFunkcyjnego(float x, float Eps, out float
        SumaSzeregu, out int LicznikWyrazówSzeregu)
        {
            float a;
            int k;
            a = 2 - x;
            k = 1;
            SumaSzeregu = a;
            do
            {
                k++;
                a *= (float)Math.Sqrt(1 - (1 / k)) * (2 - x);
                SumaSzeregu += a;
            } while (Math.Abs(a) > Eps);
            LicznikWyrazówSzeregu = k;
        }
        static void Main(string[] args)

        {
            ConsoleKeyInfo Wyjście;
            do
            {

                float x;
                float Eps;
                float SumaSzeregu;
                int LicznikZsumowanychWyrazów;
                Console.Write("\n\t\tProgram wyznacza sumę szeregu funkcyjnego: "
                    + "\n\n\t(-1)^k * 1/k^1/2 * (x -2)^k"
                    + "\n\n\t dla podanej niezależnej x oraz dokładności obliczeń Eps");
                Console.WriteLine("\n\n\tPodaj wartość zmiennej niezależnej x: ");
                Wyjście = Console.ReadKey();

                while (!float.TryParse(Console.ReadLine(), out x))
                //while(!TryParseFLOAT(Console.ReadLine(), out x))
                {
                    Console.Write("\n\tERROR: w podanym zapisie wartości"
                        + "zmiennej niezależnej x \n\twystąpił niedozwolony znak!");
                    Console.Write("\n\n\tWprowadz ponownie wartości zmiennej niezależnej x: ");

                }
                //wczytanie dokładności obliczeń
                do
                {
                    Console.WriteLine("\n\tPodaj dokładność obliczeń Eps: ");

                    while (!float.TryParse(Console.ReadLine(), out Eps))
                    {
                        Console.Write("\n\tERROR: w podanym zapisie wartości dokładności obliczeń Eps"
                            + "\n\twystąpił niedozwolony znak!");
                        Console.Write("\n\tWprowadz wartość dokładności obliczeń Eps jeszcze raz: ");
                    }
                    /*sprawdzenie warunku wejściowego, który musi być spełniony przez wartość Eps:
                     * 0<Eps<1*/
                    if ((Eps <= 0) || (Eps >= 1))
                        Console.Write("\n\tERROR: Dokładność obliczeń musi spełniać warunek wejściowy: "
                            + "\n\t 0 < Eps < 1; podaj dokładność obliczeń jeszcze raz!");
                } while ((Eps <= 0) || (Eps >= 1));
                /*wywołanie metody dla obliczenia sumy szeregu: na prawach instrukcji, gdyż nie zwraca
                 * żadnej wartości (jest typu void) w miejsce wywołanie metody: SumaSzereguFunkcyjnego,
                 * a wyniki obliczeń są przekazywane przez parametry wyjściowe (out)*/
                SumaSzereguFunkcyjnego(x, Eps, out SumaSzeregu, out LicznikZsumowanychWyrazów);
                //wyprowadzenie wyników obliczeń
                Console.WriteLine("\n\n\tWyniki obliczeń:");
                Console.WriteLine("\n\tSuma szeregu (zapis wykładniczy): {0,10:E}", SumaSzeregu);
                Console.WriteLine("\n\tSuma szeregu (zapis stałopozycyjny): {0,10:F}", SumaSzeregu);
                Console.WriteLine("\n\tSuma szeregu (zapis najbardziej zwięzły): {0,10:G}", SumaSzeregu);
                Console.WriteLine("\n\tLiczba zsumowanych wyrazów szeregu k = {0,3}", LicznikZsumowanychWyrazów);
                //wypisanie tych samych wyników w jednej instrukcji
                Console.WriteLine("\n\n\tWyniki obliczeń (jeszcze raz, ale zapisane w jednej"
                    + "instrukcji):");
                Console.WriteLine("\n\tSuma szeregu (zapis wykładniczy): {0,10:E}"
                    + "\n\tSuma szeregu (zapis stałopozycyjny): {0,10:F}"
                    + "\n\tSuma szeregu (zapis najbardziej zwięzły): {0,10:G}"
                    + "\n\t\t\t{0,10:G2} \n\n\tLiczba zsumowanych wyrazów szeregu "
                    + "k = {3,3}", SumaSzeregu, SumaSzeregu, SumaSzeregu, LicznikZsumowanychWyrazów);
                //autor programu

                Console.WriteLine("\n\n\tNaciśnij klawisz "X" dla zakończenia programu...");
                Console.ReadKey();

            } while (Wyjście.Key != ConsoleKey.X);
        }
    }

}
1

Kod jest koszmarny...

Ale jeśli działa, to chyba wystarczy na końcu przed Console.ReadKey(); dopisać Wyjście =

0

Dziękuję, teraz działa. Co do tego, że jest koszmarny. Sam go nie wymyśliłem, tak uczy nas Prof. na studiach a ja tylko wpisałem swój zadany szereg. Mógłbyś rozwinąć czemu jest to zły sposób pisania kodu?

1
daniel_b napisał(a):

Mógłbyś rozwinąć czemu jest to zły sposób pisania kodu?

Kod powinien mieć więcej enterów (jedna myśl ma być oddzielona od innej pustą linijką). Poza tym większość kodu znajduje się w metodzie Main. Jest to tylko punkt startowy programu, więc powinien zawierać właściwie tylko jedno wywołanie metody. Żeby kod sam się komentował i był czytelny trzeba unikać pętli w pętli - kolejne zagnieżdżenia pętli można nazwać, nadać im parametry i wsadzić do metody. Poczytaj książkę "Czysty Kod".

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