Permalänk
Medlem

Enkel grej i Python

Hej,

Jag har efter mycket om och men bestämt mig för att lära mig programmering på egen hand. Börjat pilla lite med Python, men jag skulle behöva hjälp med en grej för att komma vidare.

Har satt upp ett program som kollar hur många satser pannkakssmet jag kan göra som ett exempel. Dock har jag fastnat på att kunna fastställa hur många fler satser jag kan göra om jag har mer än dubbelt så många ingredienser. Antar att det skall skrivas någon sorts loop, men inte säker på hur. Dvs istället för if x *2, if x * 3 osv.

Tack för hjälpen!

Här är vad jag har än så länge:

minEgg = 3 minMilk = 6 minFlour = 2.5 currentEgg = int(input("Hur många ägg finns det? ")) currentMilk = int(input("Hur många deciliter mjölk finns det? ")) currentFlour = int(input("Hur många deciliter mjöl finns det? ")) if currentEgg < minEgg or currentMilk < 6 or currentFlour < 2.5: print("Inga pannkakor för dig :(") else: print("Grattis, du kan göra pannkakor!") if currentEgg >= minEgg * 2 and currentMilk >= minMilk * 2 and currentFlour >= minFlour * 2: print("Du kan göra en dubbel sats! :)") else: print("Bara en enkel sats idag.")

Permalänk
Medlem

Låt oss säga att du har 20 av varje ingrediens.
Ägg -> 20/3 -> 6.67 -> 6 satser
Mjölk -> 20/6 -> 3.33 -> 3 satser
Mjöl -> 20/2.5 -> 8 -> 8 satser

Alltså så kan du som max få ut 3 satser med det innehållet, mjölken är det som begränsar i det här fallet. Något liknande det sättet borde du kunna använda dig av för att få fram en lösning på ditt problem.

Permalänk
Medlem

Hur många satser du kan göra bestäms väl av floor av minimum av currentIngrediens / minIngrediens. Med andra ord dividera ingredienserna med receptet vilket ger säg 3.5, 4.4, 2.6 så blir det minsta av dessa, d.v.s. 2.6 men avrundat nedåt d.v.s. 2. Vad dessa funktioner är i Python vet jag inte.

Edit: ToddTheOdd hann först

Permalänk
Medlem
Skrivet av ToddTheOdd:

Låt oss säga att du har 20 av varje ingrediens.
Ägg -> 20/3 -> 6.67 -> 6 satser
Mjölk -> 20/6 -> 3.33 -> 3 satser
Mjöl -> 20/2.5 -> 8 -> 8 satser

Alltså så kan du som max få ut 3 satser med det innehållet, mjölken är det som begränsar i det här fallet. Något liknande det sättet borde du kunna använda dig av för att få fram en lösning på ditt problem.

Ja, men detta borde ju and-satsen lösa i vilket fall. Jag vill alltså undvika att skriva ett nytt print-statement för varje gång jag kan göra ännu en sats - istället låta en loop av något slag lösa detta. Dvs att antalet gånger är dynamiskt sas.

Permalänk
Medlem

Tror inte du behöver en loop utan det räcker nog med division. Säg att du har 14 ägg och en sats kräver 3 ägg (om jag tolkat det rätt?). 14/3 = 4,66... d.v.s. det räcker till 4 satser. Gör samma sak med de andra ingredienserna så får du ut tre tal som representerar hur många satser dina olika ingredienser räcker till.

Du kommer då vara begänsad till den ingrediens som räcker till färst (tror det är ett ord) satser. Först vill du avrunda alla tal nedåt vilket du kan göra med funktionen floor() som finns i math-modulen.

När alla nummer är avrundade vill du hitta det lägsta av numren vilket du kan göra med den inbyggda funktionen min. Funktionen tar en iterable d.v.s. något som kan itereras (tänk "loopas") över, t.ex. en lista eller tupel. Lägg in dina avrundade nummer i valfri sådan och låt funktionen hitta det lägsta talet.

Lycka till!

Permalänk
Medlem

Jag kan inte Python men du kan använda heltalsdivision istället.

Exempel stulet från Tompin:
14/3 == 4.66...7
14//3 == 4 <-- det här är heltalsdivision i Python

Permalänk
Medlem

Division: / alltså: 14/3=4.666...
Heltalsdivision: // alltså: 14//3=4

if currentEgg / minEgg >= 2 and currentMilk / minMilk >= 2 and currentFlour / minFlour >= 2: print(".........")

Visa signatur

| Ryzen 3800XT | Corsair LPX 32GB | B550 Aorus Elite v2 | GTX 970 | Samsung 970 Evo | CM Masterbox 520 | RM750x | Windows 7

| Ryzen 2700 | Corsair LPX 16GB | Prime B450-Plus | GT 1030 | Samsung 970 Evo | Kolink Observatory | RM750x | EndeavourOS

| JDS Labs Atom | Khadas Tone Board | Fostex TX-X00 & HIFIMAN HE4XX |

Permalänk
Medlem

Är du fortfarande inne på att använda en loop kanske följande kod kan ge dig något att leka vidare med:

minEgg, minMilk, minFlour = 3, 6, 2.5 currentEgg, currentMilk, currentFlour = 8, 13, 25 numberOfBatches = 0 while(currentEgg >= minEgg and currentMilk >= minMilk and currentFlour >= minFlour): currentEgg = currentEgg - minEgg currentMilk = currentMilk - minMilk currentFlour = currentFlour - minFlour numberOfBatches+=1 print ("""Batches made: {0} Ingredients left: ----------------- Eggs({2}): {1} Milk({4}): {3} Flour({6}): {5} """.format(numberOfBatches, currentEgg, minEgg, currentMilk, minMilk, currentFlour, minFlour)) print ("Not enough ingredients left, you only had enough for {0} batches.".format(numberOfBatches))

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Skrivet av KARNOU:

Jag kan inte Python men du kan använda heltalsdivision istället.

Exempel stulet från Tompin:
14/3 == 4.66...7
14//3 == 4 <-- det här är heltalsdivision i Python

En liten kommentar:

x/y: x och y är int, men svaret blir en float (även om svaret inte har några decimaler).
x//y: Om x och y är int, blir svaret int. Är x eller y (eller båda) en float, blir svaret en float. Svaret har dock aldrig några decimaler.

En int är alltid ett heltal. En float kan ha decimaler och har talet inga decimaler står det ändå .0 på slutet så att man ska veta att det är en float.

Antag att du har 6 dl mjöl. Det går åt 2.5 dl mjöl till en sats. Skriver du 6//2.5, blir svaret alltså 2.0 och det ser lite fult ut med decimaler här.

min(2.0, 3, 4) blir 2.0, alltså en float.

---

En annan kommentar:

Du skriver "int(input("Hur många ägg finns det? "))" men detta kan ge felmeddelanden om användaren skriver in konstiga saker.

>>> int(input("Hur många ägg finns det? "))
Hur många ägg finns det? Fem stycken!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Fem stycken!'
>>> int(input("Hur många ägg finns det? "))
Hur många ägg finns det? 1.5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1.5'
>>> int(input("Hur många ägg finns det? "))
Hur många ägg finns det? 5.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(input("Hur många ägg finns det? "))
Hur många ägg finns det? 5
5

Tänk även att programmet accepterar att du skriver in negativa tal. T.ex. kan man ange att man har -5 ägg.

I och med att detta är ett av dina första program, kanske inte sådana här småsaker gör så mycket, bara du har koll på att det kan bli konstigt ibland.