Найти - Пользователи
Полная версия: задание меню выбора
Начало » Центр помощи » задание меню выбора
1
zika
Добрый день уважаемые.
Так уж сложилось что помогаю подруге с заданиями по питону причем я в нем ничего не понимаю (сисадмин а не программист).
и есть задание посчитать площадь фигуры из списка с параметрами

те санчала надо выбрать какую фигуру мы считаем (треугольник, круг, элипс и тд) а потом ввести данные для ее расчета..
вот как реализовать первый этап, чтоб выдавалось типа менюшки – выберите фигуу :1 то 2 то и тд - и ты вводишь скажем 2 (круг) и второй вопрос вылезает - введите радиус, - раскидать я уже осилю по всем… мне бы базовый пример…
Огромное спасибо
Romissevd
блин, в гугле искал, меньше минуты заняло вот
zika
Спасибо… С хмлями мучались, вот решил попросить помощи у умных людей..

и еще вопрос там задача должна решаться с помощью классов и наследований… и я не понимаю как перенести из родительского класса в класс потомок данные..
пример вычисляю плозщадь прямоугольнка - роидтельский класс запрашивает длину и ширину и перемножает их.
потом делаю наследущий класс квадрат .. который должен использовать только длину одной стороны…
и вот тут я не понимаю как это должно переливаться..

class pryamougolnik ():
def __init__(self, w, h):
self.width = w
self.height = h

def square(self):
return self.width * self.height

class kvad (pryamougolnik):

что писать дальше - непонятно.
Заранее спасибо.
zika
Спасибо… С хмлями мучались, вот решил попросить помощи у умных людей..

и еще вопрос там задача должна решаться с помощью классов и наследований… и я не понимаю как перенести из родительского класса в класс потомок данные..
пример вычисляю плозщадь прямоугольнка - роидтельский класс запрашивает длину и ширину и перемножает их.
потом делаю наследущий класс квадрат .. который должен использовать только длину одной стороны…
и вот тут я не понимаю как это должно переливаться..

class pryamougolnik ():
def __init__(self, w, h):
self.width = w
self.height = h

def square(self):
return self.width * self.height

class kvad (pryamougolnik):

что писать дальше - непонятно.
Заранее спасибо.
Romissevd
Нет, ну вы точно прикалываетесь… Из вашего же поста беру и ввожу в гугл “как перенести из родительского класса в класс потомок данные” добавляю на конце python и вуаля… 3-я ссылкы все подробно описано…
zika
честное слово нет.. просмотрел ссслок 10 и везде было общими словами.. а здесь с комментариями понятно что какая строка значит
scidam
Ни разу не пробовал Spyder редактор, установил, и как-то просто так написал это, может поможет:
 # -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
class GeometryPrimitive:
    def __init__(self, **kwargs):
        self.parameters = {}
        for key in kwargs:
            self.parameters.update({key: {
                                 'value': kwargs[key],
                                 'validate': lambda x: True}
                                })
            
    @property
    def parnames(self):
        if 'parameters' in self.__dict__:   
            return self.__dict__['parameters'].keys()
        else:
            return tuple()
        
    def enter_parameters(self):
        done = False
        while not done:
            for par in self.parameters:
                status = False
                while not status:
                    value = input('Enter value of {}:'.format(par))
                    status, err_msg = self.parameters[par]['validate'](value)
                    if not status:
                        print('Illegal value of the <{}> parameter: {}. Try again.'.format(par, err_msg))
                    else:
                        self.parameters[par]['value'] = value
            done, err_msg = self.validate()
            if not done:
                print(err_msg)
    def validate(self):
        '''Parameter related validation '''        
        return False, ''
    
    def area(self):
        raise NotImplemented
    
    def __getattr__(self, attr):
        if attr in self.parnames:
            # one can define broadcast coercion to numeric -, e.g. float type    
            return self.parameters[attr]['value']
        else:
            return super().__getattr__(attr)
    
    def __setattr__(self, attr, value):
        if attr in self.parnames:
            self.parameters[attr] = value
        else:
            super().__setattr__(attr, value)
    @staticmethod
    def _is_positive_number(value):
        try:
            value = float(value)
        except ValueError:
            return (False, "the value isn't a numerical value")
        
        if value >= 0.0:
            return (True, "")
        else:
            return (False, "the value should be positive")
  
    
class Rectangle(GeometryPrimitive):
    
    def validate(self):
        return True, ''
    
    def __init__(self, width=0, height=0):
        super().__init__(width=width, height=height)
        
        # initialize validation values
        self.parameters['width']['validate'] = self._is_positive_number
        self.parameters['height']['validate'] = self._is_positive_number
        
    
    @property
    def area(self):
        return float(self.width) * float(self.height)
        
class Triangle(GeometryPrimitive):
    
    def validate(self):
        '''
        Related validation. Check if the entered values can be treated as 
        edge length's of a triangle.
        '''
        _test = sorted(map(float, [self.AB, self.AC, self.BC]))
        print('validation:', _test)
        if _test[0] + _test[1] >= _test[-1]:
            return True, ''
        else:
            return False, 'Impossible values. Try again.'
    
    def __init__(self, AB=0, AC=0, BC=0):
        super().__init__(AB=AB, AC=AC, BC=BC)
        
        # initialize validators
        self.parameters['AB']['validate'] = self._is_positive_number
        self.parameters['BC']['validate'] = self._is_positive_number
        self.parameters['AC']['validate'] = self._is_positive_number
    
    @property
    def area(self):
        print("It is too tricky to compute area of the triangle..."
              "Use Heron's formula to implement this."
              "Do you wait something*** Sorry, I can compute perimeter only...")
        return self.perimeter
    @property
    def perimeter(self):
        return float(self.AB) + float(self.BC) + float(self.AC)
        
        
        
menu = {1: Rectangle(),
        2: Triangle()
        }
done = False
while not done:
    ans = input("Make your choice (or `q` for quit): {}:".format(';'.join(map(lambda x: '%s -- %s' % (x, menu[x].__class__.__name__), menu))))
    err_msg = ''
    try:
        if int(ans) in menu:
            menu[int(ans)].enter_parameters()
            print('The area of the object is ', menu[int(ans)].area)
    except ValueError:
        err_msg = "Illegal input."
    if ans == 'q': done = True
    if err_msg and not done: print(err_msg)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB