[c#, silverlight] obliczenie procentu


(Surmapiotr) #1

Witam

mam zdefiniowany znak %

i teraz mam problem z case

case Type.procent:

                            cal %= double.Parse(Block.Text);

                            break;

i nie działa mi to poprawnie.

Jak to można naprawić


(Tomek Matz) #2
cal %=

co to jest?


(Surmapiotr) #3
private double cal

    Member of kalkulator.MainPage

(Tomek Matz) #4

Rozumiem. A co dokładnie się dzieje ... Nie wykonuje się instrukcja z case? Wartość przypisana do cal jest niepoprawna?


(Surmapiotr) #5

no więc ciężko mi powiedzieć co jest nie tak. kombinuje jeszcze zamiast double użyć sign ale to już w ogóle nie gra.

albo robi mi 0 albo jakieś dziwne wyniki z kosmosu


(Tomek Matz) #6

A jakieś przykładowe liczby i jaki dostajesz dla nich wynik?

I jeszcze jakbyś mógł podać jak wygląda u Ciebie deklaracja tego operatora % (może tu masz błąd).


(Surmapiotr) #7
private void procent_klik(object sender, RoutedEventArgs e)

        {

            Operator(Type.procent);

        }

próbowałem już:

private void procent_klik(object sender, RoutedEventArgs e)

        {

            Operator(sign);


            Block.Text = cal.ToString();

            sign = Type.procent;

        }

public partial class MainPage : UserControl

    {

        enum Type

        {

            None = 0,

            rownosc,

            dodawanie,

            odejmowanie,

            mnozenie,

            dzielenie,

            procent

        }


        private double cal = 0.0d;

        private Type sign = Type.None;


        private void Operator(Type type)

        {

            if (sign != Type.rownosc)

            {

                if (sign == Type.None)

                    cal = double.Parse(Block.Text);

                else

                {

                    switch (type)

                    {

                        case Type.dodawanie:

                            cal += double.Parse(Block.Text);

                            break;

                        case Type.odejmowanie:

                            cal -= double.Parse(Block.Text);

                            break;

                        case Type.mnozenie:

                            cal *= double.Parse(Block.Text);

                            break;

                        case Type.dzielenie:

                            cal /= double.Parse(Block.Text);

                            break;

                        case Type.procent:

                            cal %= double.Parse(Block.Text);

                            break;

                    }

                }

            }


            Block.Text = string.Empty;

            sign = type;

        }

100*10%= nic

i tak za każdym razem


(Tomek Matz) #8

% oznacza resztę z dzielenia dwóch liczb. Czyli jak robisz 100 % 10 to wynik dostajesz 0, bo reszta z dzielenia 100 przez 10 jest równa 0.

Da się zrobić, żeby % oznaczał taki matematyczny procent, ale wówczas musiałbyś napisać własną implementację dla tego operatora.

EDIT: To nie będzie miało wpływu na działanie programu, ale mógłbyś zmienić nazwę tego enuma na inną niż Type. Bo ta klasa jest już zdefiniowana w przestrzeni nazw System.


(Surmapiotr) #9

tylko że 78*40% też mi nic nie pokazuje


(Tomek Matz) #10

No powinno pokazać 38. Ale jesteś pewien, że wykonywane jest działanie 78 % 40? Mam wrażenie, że tak się nie dzieje. Puść ten kod przez debugger.

IMO wersja z użyciem tej zmiennej sign jest troszkę bez sensu (chyba, że ja czegoś tu nie łapię). Lepiej użyj tej wersji, gdzie jest tylko

Operator(Type.procent);

w procedurze obsługi zdarzenia. Ale w takiej sytuacji musisz zadbać o to, aby przypisać wartość do zmiennej calc (przed wykonaniem operacji %), bo nie widzę, żebyś gdziekolwiek to robił. Wartość calc też powinna być wczytywana z jakiegoś textbox-a.


(Surmapiotr) #11

tylko że dodawanie, dzielenie, mnożenie, odejmowanie działa bez problemu.

właśnie też myślę że to jest ok

Operator(Type.procent);

ale już nie wiedziałem czego próbować.

zero uwag, zero problemów wg debuggera


(Tomek Matz) #12

A to ciekawe, że to działa dla innych operacji. Ponawiam pytanie. Gdzie przypisujesz wartość początkową calc (gdy nie jest użyta ta zmienna sign)?


(Surmapiotr) #13
sign = type;

tu nadaje ją parametrowi


(Tomek Matz) #14

* Miałem oczywiście na myśli zmienną cal.


(Surmapiotr) #15
private double cal = 0.0d;

tu zaczynam


(Tomek Matz) #16

W porządku, a gdzie przypisujesz wspomniane wyżej 78 i 100 :slight_smile:


(Surmapiotr) #17

w pole Block

private void Block_TextChanged(object sender, TextChangedEventArgs e)

(Tomek Matz) #18

No to musisz to zmienić. Wartość cal musi być wczytywana z innego pola. Pole Blok posłuży wówczas do wczytania wartości 10 i 40 (i aktualnie do tego służy), a to nowe pole do wczytania wartości 100 i 78.

Nie wiem jakim cudem działa Ci dodawanie i pozostałe operacje. Przecież to nie ma prawa działać :slight_smile:


(Surmapiotr) #19

no a co za różnica czy on wczyta 10 i 40 czy 100 i 78? kurczę coś skopałem i teraz mi nie działa . , czyli liczba po przecinku;/ robię 1.33 i zamiast znaku * zawiesza się i nie reaguje, tak jak by case zrobił break i miał to gdzieś.


(somekind) #20

Mógłbyś pokazać jak teraz wygląda Twój kod wraz z kodem odpowiedzialnym za obliczanie tego Twojego procenta?