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

0

Nie chodzi o kopiuj wklej z książki, ale czy to rozumiesz? Bo jak na razie wygląda na to, że nie rozumiesz czym są klasy, po co one są, tak jak nie wiesz po co są zmienne składowe klasy i jak z nich korzystać. Radzę zabrać się za książkę jeszcze raz i powoli, bo nic z tego nie będzie, skoro nie rozumiesz co ludzie do Ciebie piszą.

0

Przeczytałem jeszcze raz post somekind i chyba najwazniejsze : "Zatem musi on być polem klasy MainClass.".
Dobra już rozumiem a teraz mam pytanie:
Czy można mieć np. zmienna int w klasie 'a' do której wartość jest przypisywana z readline i którą chcę wyświetlić w np. klasie 'b' ?
pozdrawiam

0

Tak, poczytaj o static.

7

Nikogo tutaj personalnie nie zaatakowałem, ani nie wyzwałem, pisałem od początku do końca merytoryczne posty, starając się w miarę moich "dydaktycznych" umiejętności wyjaśnić na czym polegał błąd, operowałem do tego prostym językiem, który powinien być zrozumiały dla początkującego, o ile zapoznał się on z podstawową terminologią. Komentarz merytoryczny być nie musi, ale nadal w nim nikogo nie obraziłem, ani nie zasugerowałem niczego złego na niczyj temat (no chyba, że swój).
W nagrodę, to ja zostałem wyzwany od debili, na dodatek w zdaniu, w którym autor jednocześnie chwali się kulturą osobistą wyniesioną z domu (ciekawe czy magnetowid i sztućce też stamtąd wyniósł). Myślę, że mamy do czynienia z impotencją intelektualną i powinniśmy wysłać mu paczkę orzechów włoskich (podobno fosfor w nich zawarty dobrze robi na mózg). Oczywiście, na wszelki wypadek obranych, bo leczenie krwawiących dziąseł nie jest niczym przyjemnym.

0

Dobra,przepraszam

EDIT:
"komentarz merytoryczny być nie musi, ale nadal w nim nikogo nie obraziłem, ani nie zasugerowałem niczego złego na niczyj temat (no chyba, że swój). "Chodziło mi o inne dyskusje.
"ani nie zasugerowałem niczego złego na niczyj temat" - W tym temacie oczywiście ,że nie.
"Oczywiście, na wszelki wypadek obranych, bo leczenie krwawiących dziąseł nie jest niczym przyjemnym. "-Współczuje pan ,że miał pan taką sytuację,ale cóż zrobić.
"W nagrodę, to ja zostałem wyzwany od debili,"-""Wbrew pozorom somekinda wypowiedzi bardzo wiele wniosły do tematu, zaironizował i wyjaśnił"-Racja ,teraz to docenia i dziękuję ( dobry krok na przód" ) " - komentarz pod postem aurel'a
pozdr.

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