Problem z przeliczniem walut

0

Witam,nie bardzo wiedziałem jak nazwać post ale mam nadzieję,iż Admin to zrobi ;)
Dobra.Próbuję napisać program który zawiera 1.Przeliczanie 2.Opcje .Kiedy wybieram 1 odpala mi metodę z opcje i analogicznie z przeliczenie.Chciałem zrobić program w którym za pomocą strzałek ( góra/dół ) będę wybierał walutę ( tz. kursor będzie mi przeskakiwał na odpowiednią linijkę ) i po "przeskoczeniu" na tę linijkę wciskam enter i wpisuję kurs takowej waluty.Problem jest taki ,że podczas przeliczania zawsze wychodzi zero.Oto kod

 using System;
class MainClass
{
    static void wrl(string tekst)
    {
        Console.WriteLine(tekst);
    }
    static void Switch()
    {
        Options O = new Options();

        ConsoleKeyInfo S = Console.ReadKey();
        switch (S.KeyChar)
        {
            case '2':
                {
                    Console.Clear();
                    O.options();
                    break;
                }
            case '1':
                {
                    convert();
                    break;
                }
        }
    }

    static void convert()
    {
        Options O = new Options();
        wrl("Podaj wartość w zł ");
        double zł = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine(O.EUR * zł);
        Console.WriteLine(O.GBR * zł);
        Console.WriteLine(O.SEK * zł);
        Console.WriteLine(O.USD * zł);
        Console.ReadLine();
    }

    public static void Main()
    {
        wrl("1.Przelicznik");
        wrl("2.Opcje");
        wrl("3.Zakończ");
        Switch();

    }

}

class Options
{
    static void wrl(string tekst)
    {
        Console.WriteLine(tekst);
    }
    public double GBR, USD, EUR, SEK;
    public void options()
    {

        wrl("SEK:");
        wrl("GBR:");
        wrl("USD:");
        wrl("EUR:");
        Console.SetCursorPosition(4, 0);
        int X = 0;

        while (true)
        {

            ConsoleKeyInfo W;
            W = Console.ReadKey(true);
            if (W.Key == ConsoleKey.UpArrow)//Wpisywanie wartości do walut (w górę)
            {
                X--;
                if (X < 0)
                {
                    Console.SetCursorPosition(3, 4);
                    X = 3;
                }
                Console.SetCursorPosition(4, X);
            }
            if (W.Key == ConsoleKey.DownArrow) //w dół
            {
                X++;
                if (X > 3)
                {
                    Console.SetCursorPosition(4, 0);
                    X = 0;
                }
                Console.SetCursorPosition(4, X);
            }
            if (W.Key == ConsoleKey.Escape)
            {
                MainClass.Main();
                break;
            }
            if (W.Key == ConsoleKey.Enter)
            {

                switch (X)
                {
                    case 0:
                        {
                            GBR = Convert.ToDouble(Console.ReadLine());

                            break;
                        }
                    case 1:
                        {
                            USD = double.Parse(Console.ReadLine());

                            break;
                        }
                    case 2:
                        {
                            EUR = double.Parse(Console.ReadLine());

                            break;
                        }
                    case 3:
                        {
                            SEK = double.Parse(Console.ReadLine());

                            break;
                        }
                }
            }
        }
    }
}

Proszę o pomoc
pozdrawiam
Marek

0
maroo123321 napisał(a)

Witam,nie bardzo wiedziałem jak nazwać post ale mam nadzieję,iż Admin to zrobi ;)

Obawiam się, że Admin wywali tak nazwany wątek do kosza.

Wynik wynosi 0, bo wartości zmiennych:

O.EUR
O.GBR
O.SEK
O.USD

w metodzie convert wynoszą 0, a z podstaw matematyki wiemy, że x * 0 == 0.

Zmienna O, która jak rozumiem ma zawierać te wszystkie przeliczniki powinna być polem klasy, a nie lokalną zmienna metody.

Metoda wrl to po prostu WTF. Usuń tego śmiecia z kodu natychmiast.

0

Nie.

Ty chcesz:
1) ustawić wartości przeliczników z klasy Options.
2) na podstawie tych wartości dokonać obliczeń w metodzie MainClass.convert.

Ty natomiast za pomocą tej linijki: Options O = new Options(); najpierw tworzysz sobie w metodzie Switch lokalny obiekt, któremu ustawiasz wartości przeliczników. Gdy metoda Switch się kończy, ten obiekt ten znika. Potem w metodzie convert, za pomocą tej samej linijki, tworzysz sobie NOWY obiekt Options, który nie ma pojęcia o tym, co wcześniej ustawiłeś, bo jest zupełnie innym obiektem, więc wszystkie jego wartości to zera.
Ty potrzebujesz, aby obiekt Options w metodach Switch i convert był tym samym obiektem. Zatem musi on być polem klasy MainClass.

0

Aaaa chyba już rozumiem.A gdybym ( teoretycznie ) chciał zostawić to tak jak ( z klasą options) i żeby działało to jak mogę to zrobić?
pozdrawiam

0

Nie możesz, no chyba że w jednej metodzie pobierzesz wartości przeliczników, a potem przeliczysz waluty.
I nikt Ci nie każe usuwać klasy Options - ona ma zostać, po prostu masz ją użyć inaczej.

A zamiast wrl napisz w kodzie cw i wciśnij 2 x TAB, zobaczysz pewną magię. ;)

0
 public void przelicznik(double walutapolska)
    {
        Console.WriteLine(GBR * walutapolska);
        Console.WriteLine(USD * walutapolska);
        Console.WriteLine(USD * EUR);
        Console.WriteLine(SEK * walutapolska);
    }

takie coś stworzyłem w klasie options i wywołuje to w convert dalej nie działa Ech........tragedia

2

JEZU, ziom, SKUP SIĘ:

  1. Usuń wszystkie linijki: Options O = new Options();
  2. Zadeklaruj O jako pole klasy MainClass.
    Czy rozumiesz ten punkt? Jeśli nie, to nie idź do punktu 3, tylko do kursu programowania obiektowego.
  3. Zainicjuj zadeklarowany obiekt (możesz od razu przy jego deklaracji to zrobić).

KONIEC

0

Czyli 'O' muszę zadeklarować w 'Options' ?
Pozdrawiam

0
  1. Zadeklaruj O jako pole klasy MainClass.

Czyli 'O' muszę zadeklarować w 'Options' ?

Musisz mi wyjaśnić, jak doszedłeś do takiego wniosku na podstawie tego co napisałam. Jestem niezmiernie ciekawa.
Powiedz szczerze, czy wiesz co to jest klasa, i co to jest pole klasy?

0

Pola
Pojęcie zmiennych poznałeś już dawno. Zmienne w języku C# mogą być umieszczone jedynie w klasach lub w ich metodach. Jeżeli zmienna jest umieszczona w klasie (nie wewnątrz metody), mówimy wówczas o polu klasy.

Pola po prostu są zmiennymi lub stałymi, deklarowanymi na użytek klasy lub udostępnionymi na zewnątrz od niej do użytku programisty. Dostęp do zawartości pól możliwy jest dzięki operatorowi odwołania (.):

 class Foo
{
    public String About = "Klasa v. 1.0";
}

class Program
{
    static void Main(string[] args)
    {
        Foo MyFoo; 

        MyFoo = new Foo();

        Console.Write(MyFoo.About);           

        Console.Read();
    }
}

A ja dalej nie rozumiem co mam zrobić .
Pozdrawiam

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