Question

# Use Python 3.8: Problem Description Many recipes tend to be rather small, producing the fewest number...

Use Python 3.8:

Problem Description

Many recipes tend to be rather small, producing the fewest number of servings that are really possible with the included ingredients. Sometimes one will want to be able to scale those recipes upwards for serving larger groups.

This program's task is to determine how much of each ingredient in a recipe will be required for a target party size. The first inputs to the program will be the recipe itself.

Here is an example recipe that comes from the story "Chitty Chitty Bang Bang", written by Ian Fleming, who is much better known for introducing the world to James Bond:

`This is a recipe scaler for serving large crowds!`
```Enter one ingredient per line, with a numeric value first.
Indicate the end of input with an empty line.
4 tbsp cocoa
1/4 pound butter
2 tsp corn syrup
1 can evaporated milk
1 tsp water

Here is the recipe that has been recorded
4    tbsp     cocoa
1/4  pound    butter
2    tsp      corn syrup
1    can      evaporated milk
1    tsp      water

How many does this recipe serve? 16
How many people must be served? 25
Multiplying the recipe by 2

8    tbsp     cocoa
2/4  pound    butter
4    tsp      corn syrup
2    can      evaporated milk
2    tsp      water

Serves 32```

NOTE: The recipe rounds upwards, since it is usually not practical to obtain fractional cans or fractional eggs, etc.

Your program must obtain a complete recipe (not necessarily this one), echo it with good formatting, and then scale it up as shown above.

Program Hints:

Attractive user-friendly output is rather straightforward, with the help of Python's string formatting features. User-friendly input is a little trickier, but the split function from Unit 2 can be very helpful:

First hint:

The name of an ingredient might be more than one word. This will place all of the extra words into a single string variable 'item':

`quant, unit, item = line.split(' ',2)      # pull off at most 2 words from the front`

Second hint:

Sometimes the measure will be fractional. We can recognize that if the number contains a slash.

```if '/' in quant:
numer, denom = quant.split('/')        # get the parts of the fraction
```

The rest is left up to the student -- since this is a string operation and this fraction represents a number.

Second Part:

No doubt the output seems to be a little strange to ask for 2/4 pounds of butter. One might think it would be better to ask for 1/2.

Modify the program so that all fractions are reduced to their lowest terms. There is a function in the Python math module named gcd that can help with this. (You can email course personnel if you need help accessing the math features.)

Also, express all improper fractions (where the numerator exceeds the denominator) as mixed fractions. Scaling this recipe by a factor of 10 would ask for 2 1/2 pounds of butter.

And of course, the resulting output should still be easy to read.

Search

Your account usage is unusually high.

Need your own subscription? Subscribe now

home / study / engineering / computer science / computer science questions and answers / use python 3.8: problem description many recipes tend to be rather small, producing the fewest ...

Question: Use Python 3.8: Problem Description Many recipes tend to be rather small, producing the few...

Edit question

Use Python 3.8:

Problem Description

Many recipes tend to be rather small, producing the fewest number of servings that are really possible with the included ingredients. Sometimes one will want to be able to scale those recipes upwards for serving larger groups.

This program's task is to determine how much of each ingredient in a recipe will be required for a target party size. The first inputs to the program will be the recipe itself.

Here is an example recipe that comes from the story "Chitty Chitty Bang Bang", written by Ian Fleming, who is much better known for introducing the world to James Bond:

```This is a recipe scaler for serving large crowds!

Enter one ingredient per line, with a numeric value first.
Indicate the end of input with an empty line.
4 tbsp cocoa
1/4 pound butter
2 tsp corn syrup
1 can evaporated milk
1 tsp water

Here is the recipe that has been recorded
4    tbsp     cocoa
1/4  pound    butter
2    tsp      corn syrup
1    can      evaporated milk
1    tsp      water

How many does this recipe serve? 16
How many people must be served? 25
Multiplying the recipe by 2

8    tbsp     cocoa
2/4  pound    butter
4    tsp      corn syrup
2    can      evaporated milk
2    tsp      water

Serves 32```

NOTE: The recipe rounds upwards, since it is usually not practical to obtain fractional cans or fractional eggs, etc.

Your program must obtain a complete recipe (not necessarily this one), echo it with good formatting, and then scale it up as shown above.

Program Hints:

Attractive user-friendly output is rather straightforward, with the help of Python's string formatting features. User-friendly input is a little trickier, but the split function from Unit 2 can be very helpful:

First hint:

The name of an ingredient might be more than one word. This will place all of the extra words into a single string variable 'item':

```quant, unit, item = line.split(' ',2)      # pull off at most 2 words from the front
```

Second hint:

Sometimes the measure will be fractional. We can recognize that if the number contains a slash.

```if '/' in quant:
numer, denom = quant.split('/')        # get the parts of the fraction
```

The rest is left up to the student -- since this is a string operation and this fraction represents a number.

Second Part:

No doubt the output seems to be a little strange to ask for 2/4 pounds of butter. One might think it would be better to ask for 1/2.

Modify the program so that all fractions are reduced to their lowest terms. There is a function in the Python math module named gcd that can help with this. (You can email course personnel if you need help accessing the math features.)

Also, express all improper fractions (where the numerator exceeds the denominator) as mixed fractions. Scaling this recipe by a factor of 10 would ask for 2 1/2 pounds of butter.

And of course, the resulting output should still be easy to read.

Other Guidelines:

Clarity of code is still important here -- and clear code is less likely to have bugs.

In particular, there should be very good and clear decisions in the code.

And there will be a penalty for usage of break or continue statements.

Planning out the design of the solution before diving into code will help!

The simplest solutions would use a list, but without any indexing on that list
(or use of range() to get those indexes).  Let Python help you fill and traverse the recipe.

Storing the entire recipe in a single list before splitting things up often produces much simpler programs than trying to store everything into multiple separate lists!

IMPORTANT NOTE: As above, the recipe is provided as input to the program -- it is not part of the program itself. The program may not assume it knows what the ingredients are, or how many there are, or which ingredients have fractions and which ones do not. It must work for any number of valid input lines.

Recipe Data Structure: Effectively uses list (either parallel lists or lists of structures)

Input Recipe: Clearly reads input until blank line encountered

Serving Inputs: Correctly inputs two values: how many recipe serves, and how many will be served

Computing the Scale: math.ciel; if/else to round up; or anything else equivalent

Parsing the ingredients: Correctly parses ingredients (using given 'tricks') May be done at any point in the program

Scaling the recipe: Multiplies whole numbers and numerators by chosen scaling factor

Reduced fraction: Reduces using gcd; denominator 1 reported as whole numbers

Output presentation: Uses string formatting to present output recipe

Compilation: Program runs fully without change (with valid inputs of 3+ words separated with single spaces)

Correctness: Program behaves as expected (accounting for known errors above)

Program can handle "1 egg" as an ingredient (with only once space)

Only Python 3.8 will be allowed.

``````from math import *
from fractions import Fraction
recipe = []
while(True):
temp = input("Enter amount and ingredient; enter empty line to exit : ")
if(temp == ''):
break
recipe.append(list(temp.split()))
print("\nHere is the recipe that has been recorded\n")
for i in recipe:
print(' '.join(i))
print()
num = int(input("How many does this recipe serve? "))
req = int(input("How many people must be served? "))
mult = ceil(req/num)
print("Multiplying the recipe by ",mult)
print()
for i in recipe:
if('/' in i[0]):
temp = Fraction(*list(map(int,i[0].split('/'))))
temp *= mult
print(str(temp.numerator)+"/"+str(temp.denominator),end=' ')
else:
temp = int(i[0])*mult
print(str(temp),end = ' ')
print(' '.join(i[1:]))
print("\nThis recipe serves",(mult*num))``````

#### Earn Coins

Coins can be redeemed for fabulous gifts.