Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# Program do obsługi kasy

sylwekb 15 Sty 2012 23:27 1536 10
  • #1 15 Sty 2012 23:27
    sylwekb
    Poziom 9  

    Mam napisać program do obsługi kasy. Poniżej metody:
    • metoda pobierająca od użytkownika cenę netto, kwotę wpłaconą przez klienta i obliczającą cenę brutto
    • metoda wypisująca cenę netto, kwotę podatku, cenę brutto, kwotę wpłaconą przez klienta
    • metoda wypisująca ile banknotów/monet o poszczególnych nominałach należy wydać jako resztę klientowi

    Zacząłem od końca bo wydawało mi się to najłatwiejsze, jednak nie chce działać.
    Proszę o wyrozumiałość jestem początkujący w programowaniu C#

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0 10
  • #2 16 Sty 2012 00:02
    walek33
    Poziom 28  

    Tak na moje oko to do obliczenia reszty użyłbym dwóch działań: dzielenie całkowite i modulo przez nominały w stronę malejących wartości.

    0
  • #3 16 Sty 2012 00:15
    sylwekb
    Poziom 9  

    Jak zdefiniować te 2 pierwsze metody programu?
    Czy ta postać będzie poprawna, jak to zagnieździć w moim kodzie?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #4 16 Sty 2012 00:26
    walek33
    Poziom 28  

    Jeżeli myślisz o skorzystaniu z działań podpowiedzianych przeze mnie to pętla powinna mieć maks. ilość przebiegów równą ilości nominałów w tablicy. Może zakończyć się wcześniej po dojściu wyniku modulo do zera.

    0
  • #5 16 Sty 2012 00:37
    marcinj12
    Poziom 40  

    Ja tylko się wtrącę, że do działań na liczbach z przecinkiem należy wykorzystać odpowiedni typ - tu bym widział decimal, a nie wszystko do integera pakować (vide: tablica nominal czy ta dziwna pętla która się tylko raz wykona.).

    Do oznaczenia liczby typu decimal stosujemy suffix m lub M, np. 0.01m
    To tak na na przyszłość bo pewnie się przyda.

    0
  • #6 16 Sty 2012 07:41
    walek33
    Poziom 28  

    Co do typu danych zgadzam się. Kolega autor nie zwraca na niego żadnej uwagi a to bardzo nie ładnie i zemści się w przyszłości. Deklarując int należy konsekwentnie stosować całkowite. I osobiście przy takowych bym w nominałach pozostał mnożąc od odpowiedniego przebiegu pętli wynik modulo przez 10. Myślę (chyba że się mylę), że zajętość pamięci będzie w tym przypadku mniejsza.

    1
  • #7 16 Sty 2012 10:21
    sylwekb
    Poziom 9  

    Czyli Waszym zdaniem, zrezygnować w tablicy wogóle z groszy 0.50, 0.20, 0.10, 0.05, 0.02, 0.01 bo powoduje to duże obciążenie i trudności w wykonaniu programu?

    0
  • #8 16 Sty 2012 10:33
    walek33
    Poziom 28  

    Moim nie. Będzie łatwiej zamienić te grosze na całkowite i zastosować odpowiedni mnożnik dla reszty z dzielenia. Wynik musisz i tak dostać integer z prostej przyczyny: monety są całkowite. Nie dasz klientowi połowy. :D

    Edit:

    Przy banknotach jest to możliwe ale klient chyba nie weźmie. :D

    0
  • #9 16 Sty 2012 10:40
    marcinj12
    Poziom 40  

    sylwekb napisał:
    Czyli Waszym zdaniem, zrezygnować w tablicy wogóle z groszy 0.50, 0.20, 0.10, 0.05, 0.02, 0.01 bo powoduje to duże obciążenie i trudności w wykonaniu programu?
    Nie.
    Zmienić typ tablicy na decimal, a deklarując ją pamiętać, żeby przy groszach dodać suffix m.
    Program z tablica w tej postaci w jakiej masz teraz nawet się poprawnie nie kompiluje z powodu błędów:
    Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)
    Jeżeli nawet jakimś cudem Ci się przekompilował, to niemal połowę tablicy masz wypełnioną zerami.

    Pamiętaj, że jak dzielisz dwie liczby typu integer, wynik też jest całkowity, czyli (int)5 / (int)2 = 2
    Jeżeli jeden z argumentów będzie decimalem, tego problemu nie będzie.

    O obciążenie programu czy zajętość pamięci się nie martw.

    0
  • #10 16 Sty 2012 11:12
    walek33
    Poziom 28  

    :arrow: marcinj12
    Nie to, żebym upierał się jak osioł przy swoim ale w tym przypadku wynik integer jest jak najbardziej trafiony.

    0
  • #11 16 Sty 2012 11:42
    marcinj12
    Poziom 40  

    walek33 napisał:
    :arrow: marcinj12
    Nie to, żebym upierał się jak osioł przy swoim ale w tym przypadku wynik integer jest jak najbardziej trafiony.

    Wynik - owszem, będzie liczbami typu integer, więc tablicy liczba, która jak przypuszczam zawiera wynik, się nie czepiam :) w końcu liczba monet czy banknotów nie może być ułamkiem...

    Jednak chcąc wykonać dzielenie na liczbach z tej tablicy:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    jest ono niemożliwe.
    Musiałbyś albo zadeklarować wszystkie wartości tej tablicy jako "grosze", czyli:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    a potem, wyświetlając użytkownikowi odpowiedź albo wyświetlać ją w groszach, na powrót podzielić wartości przez 100, albo zrobić z nich decimal, co wydaje mi się bardziej "naturalne" w przypadku prezentacji drobnych monet.

    Podsumowując: wynik: TAK, integer, ale tablica monet: DO WYBORU.

    PS. Algorytm wydawania reszty jest opisany np. na wikipedii. Nie sprawdzałem go, ale przerobienie kodu z C++ na C# nie powinno stanowić problemu.

    0