Proste zadania z GitHuba

Hej!

Mam problem z zadaniami z tej strony:

a dokładnie z

Change Return Program - The user enters a cost and then the amount of money given. The program will figure out the change and the number of quarters, dimes, nickels, pennies needed for the change.

mój kod wygląda tak:

    puts "Please enter cost"
    cost = gets.chomp.to_f
    puts "Please enter money"
    money = gets.chomp.to_f
    rest = money - cost 
    
    while rest < 0
        puts "You still owe %.2f" % rest
    
    tw,te,f,o,q,d,n,p = 0,0,0,0,0,0,0,0
    
    dollars = (money- cost)
    change = (money - cost - dollar)*100
        
        if dollars >= 20
            tw = dollars/20
            dollars = dollars % 20
        if dollars >= 10
            te = dollars/10
            dollars = dollars % 10
        if dollars >= 5
            f = dollars/5
            dollars = dollars % 5
        if dollars >= 1
            o = dollars
        if change >= 25
            q = change/25
            change = change % 25
        if change >= 10
            d = change/10
            change = change % 10
        if change >= 5
            n = change/5
            change = change % 5
        if change >= 1
            p = change 
    
    final = (money - (cost,tw,te,f,o,q,d,n,p))
    print ("your change is $%.2f: \n
    %.0f twenties \n
    %.0f tens \n
    %.0f fives \n
    %.0f ones \n
    %.0f quarters \n
    %.0f dimes \n
    %.0f nickels \n
    %.0f pennies" % final)

Podpatrzyłem rozwiązanie tego problemu w innym języku. Jednak chciałem go napisać sam i do końca zrozumieć. W tym momencie podczas uruchamiania programu pojawiaja mi się dwa komunikaty:

Fibi.rb:42: syntax error, unexpected ‘)’, expecting ‘=’
final = (money - (cost, tw,te,f,o,q,d,n,p))
^
Fibi.rb:54: syntax error, unexpected end-of-input, expecting ‘)’

Jednak nie rozumiem do końca, dlaczego mam stawić znak równosi w linijce 42 oraz nawias zamknąć w linijce 54. Nie wiem też, czy ten ostatni zapis wyniku jest poprawny, czy mógł”y go ktoś sprawdzić?

Oprócz tgo czy mógłby mi ktoś wytłumaczyć, jak dokładnie działa kod który napisałem ? chodzi mi dokładnie o:

if dollars >= 5
f = dollars/5
dollars = dollars % 5
Ja to rozumiem tak: Jeżeli dollars (czyli różnica pomiędzy ceną a ilośćia gotówki) jest większa bądz równa liczbię pięć to zmienna f będzie wynosić wielokrotność tej liczby, a następnie zmienna dollars będzie wynosić dokładnie resztę z dzielenia przez 5 i zostaje przekazana do dalszych obliczeń, tak?

Oraz

tw,te,f,o,q,d,n,p = 0,0,0,0,0,0,0,0

Powoduje, że wszystkie zmienne są zdeklarowane na początku jako zero 9póżniej są one nadpisywane, jednak z takim zapisam się spotkałem przy jednym rozwiązaniu i sie zastanawiam czy jest on poprawny.

Z góry dziękuje za Waszą pomoc:)
Pozdrawiam!

Poprawiłem Ci kod. Jak mniemam o taki efekt CI chodziło. Tam gdzie masz operacje matematyczne i przypisanie do “final” to nie możesz podawać zmiennych po przecinku. W rubym “if” musi się kończyć “end”. Nie zapominaj o tym. Tak duą ilość “if” możesz zastąpić instrukcją warunkową “case”. Na końcu każdej pętli też musi być end(zapomniałeś zamknąć pętlę “while”).
Co do Twoich pytań to:

if dollars >= 5
f = dollars/5
dollars = dollars % 5
end
To co napisałeś się zgadza.

Jeżeli chodzi o zapis

tw,te,f,o,q,d,n,p = 0,0,0,0,0,0,0,0

to jak sam zauważyłeś on zadziała, lecz jest nieładny. Jeżeli już chcesz tyle zmiennych użyć i ustawić tą samą wartość to lepiej jest:

tw = te = f = o = q = d = n = p = 0

Hej,

Bardzo dziękuje za okazaną pomoc. Rzeczywiście brakowało paru end’ów. Chciałem sobie ten kod sprawdzić i niestety otrzymuje error typu:

`%’: can’t convert nil into Float (TypeError) (na samym końcu, jedyn co zmieniłem to przerzuciłem ostatnią cześć “print…” poza end, tak abym mógł otrzymać wynik. Może w jakiś inny sposób należy napisać, aby mi program wypisał wynik?

Jak sobię z tym poradzić?
Pozdrawiam,

Zastanawia mnie ten fragment. W Rubim to raczej nie zadziała zgodnie z Twoją intencją. A jaka ona była?

To zadziała. Nie wiem co chciałeś osiągnąć tym zakomentowanym kodem. Poza tym zamieniona zostałą pętla while na instrukcje warunkową if, gdyż while wpadał w pętlę nieskończoną. Musisz na to uważać i zawsze zastanowić się nad warunkiem końca. Poprawiłem to tak aby Ci zadziałało. Resztą pobaw się sam;).
Instrukcje warunkowe(wykonają się tylko raz jeżeli warunek jest spełniony):

  1. if
  2. unless(odwrotność ifa)
  3. when xxx then yyy
    Pętle:
  4. for i in x…y
  5. while
  6. until(odwrotność while)
  7. loop {} <- ta pętla jest nieskończona z założenia. Trzeba ją przerwać inną instrukcją jak: break, return.

Jeszcze są bloki o których musisz sobie poczytać;)
Miłej edukacji.

Teraz widzę, że chyba nie nastąpi taki przypadek o który mi chodziło.

Moją intencją było, aby zmienna final wskazywała mi, ile jeszcze zostało się elementów, które nie pasują do mojego działania (tj. że mam np. rachunek na 23,45 płace 50 i moim wynikiem jest zbiór nominałów -> 20;5;1;0,5;0,05 i jeżeli coś jeszcze zostanie to bym to wypisał.)

Jak w takim razie wyświetlić odpowiedz, która będzie mi wypisywać to w jakich nominałach klient otrzyma resztę?

Pozdrawiam,

Nic nie zostanie - gwarantuje to ostani if:

Żeby to wyświetlić musisz do tego printa przekazać tablicę:

print "%i %i" % [1,2]

Czyli w twoim przypadku

print "...." % [tw,te,f,o,q,d,n,p]

Ale ogólnie ten kod można by mocno poprawić :slight_smile: Zwróć uwagę, że prawie we wszystkich ifach masz ten sam kod.

Gdyby ktoś mógł wytłumaczyć, dlaczego

puts "%.2f %.2f" % [0.005,0.015]

rzuca

0.01 0.01

Formatujesz liczbę do 2 miejsca po przecinku. Wygląda to tak, że jeśli liczba wynosi 0 następuje zaokrąglenie na podstawie 3 miejsca po przecinku, jeśli natomiast posiada wartość różną od 0 zaokrąglenie nie jest wykonywane.

Już mi się przypomniało: 5 po parzystej zaokrągla w górę, a 5 po nieparzystej w dół.

Faktycznie. Walnąłem babola. Przyznam, nie wiedziałem o tej bądź co bądź dziwnej zasadzie.

Ta reguła może wygląda specyficznie, ale w naukach matematycznych jest bardziej uznana niż sztywne zakrąglanie w jedną stronę. Nietrudno uświadomić sobie, że jest niezastąpiona, kiedy ma się przeprowadzać obliczenia na dużej ilości liczb, które wcześniej są zaokrąglane tylko o jedno lub dwa miejsca.