Python Forum
User input to calculate Area or Radius of Circle
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
User input to calculate Area or Radius of Circle
#1
I'm writing a practice script to prompt the user to input "Area" or "Radius", then input the area or radius of a circle to calculate the other.

I wanted to use functions to do it.

Here's what I've got so far:

import math
from math import pi

def area():
    radius = float(input("To calculate the Area enter the Radius of the circle: "))
    area = float(pi)*pow(radius,2)
    print("The Area is " + str(area))

def radius():
    area = float(input("To calculate the Radius enter the Area of the circle: "))/pi
    radius = str(math.sqrt(area))
    print("The Radius is " + radius)

choice = {'Radius': radius, 'Area': area}

action = input("Calculate Area or Radius? ")
action = action.capitalize()

choice[action]()
Is there a superior way to do this? Are there any lines I can cut or condense?
Reply
#2
Superior would be functions with parameters and return values, which are far more versatile. I also like if __name__ blocks. There are very often lines to cut, but that doesn't mean you want to cut them. You could do:

import math

def area(radius):
    return math.pi * radius ** 2

def radius(area):
    return math.sqrt(area / math.pi)

if __name__ == '__main__':
    choices = {'Radius': (radius, 'Radius', 'Area'), 'Area': (area, 'Area', 'Radius')}
    action, calculate, given = choices[input("Calculate Area or Radius? ").capitalize()]
    result = action(float(input('To calculate the {}, input the {}: '.format(calculate, given))))
    print('The {} is {:.2f}.'.format(calculate, result))
But that is perhaps excessive.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
Thank you.
Reply
#4
Here is a variation on the same concept. It is longer but there a richer parsing of user input and an extended functionality
from math import pi, sqrt

class Interaction:
    def ask_parameter(self):
        prompt = """\
Please enter one of the circle's parameter. You may enter
"radius <number>" or "circumference <number>"
or "diameter <number>" or "area  <number>". You may also
use r, c, d, a to abbreviate these words.

Your choice: """
        while True:
            reply = input(prompt).strip().split()
            if len(reply) != 2:
                self.say_invalid_input()
                continue
            param = reply[0].lower()
            if not param in [
                'radius', 'circumference', 'diameter', 'area',
                'r', 'c', 'd', 'a']:
                self.say_invalid_input()
                continue
            param = param[0]
            try:
                value = float(reply[1])
            except ValueError:
                self.say_invalid_input()
                continue
            else:
                if value < 0:
                    print('ERROR: value must be non negative, try again.')
                    continue
            if param == 'd':
                self.r = value / 2
            elif param == 'a':
                self.r = sqrt(value / pi)
            elif param == 'c':
                self.r = value / (2 * pi)
            else:
                self.r = value
            return
                
    def display_results(self):
        print("""\
area = {a}
circumference = {c}
diameter = {d}
radius = {r}""".format(
            r = repr(self.r),
            a = repr(pi * self.r ** 2),
            c = repr(self.r * 2 * pi),
            d = repr(self.r * 2)
        ))

    def say_invalid_input(self):
        print('ERROR: invalid input, try again.')

    def run(self):
        self.ask_parameter()
        self.display_results()
        
if __name__ == '__main__':
    Interaction().run()
Example in a console
Output:
λ python3 paillasse/circle.py Please enter one of the circle's parameter. You may enter "radius <number>" or "circumference <number>" or "diameter <number>" or "area <number>". You may also use r, c, d, a to abbreviate these words. Your choice: diameter 23 area = 415.4756284372501 circumference = 72.25663103256524 diameter = 23.0 radius = 11.5
Possible improvements could be to enter parameter by an option on the command line instead of prompting user, or on the contrary to start an interactive interpreter allowing the user to analyse several circles in a session for example with module cmd, or use a GUI.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  WHILE LOOP NOT RETURNING USER INPUT AFTER ZerroDivisionError! HELP! ayodele_martins1 7 990 Oct-01-2023, 07:36 PM
Last Post: ayodele_martins1
  restrict user input to numerical values MCL169 2 869 Apr-08-2023, 05:40 PM
Last Post: MCL169
  user input values into list of lists tauros73 3 1,023 Dec-29-2022, 05:54 PM
Last Post: deanhystad
Information How to take url in telegram bot user input and put it as an argument in a function? askfriends 0 1,026 Dec-25-2022, 03:00 PM
Last Post: askfriends
Question Take user input and split files using 7z in python askfriends 2 1,027 Dec-11-2022, 07:39 PM
Last Post: snippsat
Sad how to validate user input from database johnconar 3 1,836 Sep-11-2022, 12:36 PM
Last Post: ndc85430
  How to split the input taken from user into a single character? mHosseinDS86 3 1,137 Aug-17-2022, 12:43 PM
Last Post: Pedroski55
  How to plot seaborn heatmap on top of a background circle SriRajesh 0 1,368 Jul-09-2022, 04:00 AM
Last Post: SriRajesh
  Use pexpect to send user input alisha17 0 1,826 May-10-2022, 02:44 AM
Last Post: alisha17
  WHILE Loop - constant variables NOT working with user input boundaries C0D3R 4 1,434 Apr-05-2022, 06:18 AM
Last Post: C0D3R

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020