{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Respostas dos exerc\u00edcios IV\n", "=============================\n", "_____________________________\n", "1\\. Crie uma classe que modele um quadrado, com um atributo lado e os m\u00e9todos: mudar valor do lado, retornar valor do lado e calcular \u00e1rea.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Square(object):\n", " \"\"\"\n", " Classe que modela um quadrado.\n", " \"\"\"\n", "\n", " def __init__(self, side=1):\n", "\n", " self.side = side\n", "\n", " def get_side(self):\n", "\n", " return self.side\n", " \n", " def set_side(self, side):\n", "\n", " self.side = side\n", " \n", " def get_area(self):\n", "\n", " # A \u00e1rea \u00e9 o quadrado do lado\n", " return self.side ** 2\n", "\n", "# Testes\n", "square = Square(2)\n", "square.set_side(3)\n", "print square.get_area()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "9\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "2\\. Crie uma classe derivada de lista com um m\u00e9todo retorne os elementos da lista sem repeti\u00e7\u00e3o.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class List(list):\n", "\n", " def unique(self):\n", " \"\"\"\n", " Retorna a lista sem repeti\u00e7\u00f5es.\n", " \"\"\"\n", "\n", " res = []\n", " for item in self:\n", "\n", " if item not in res:\n", " res.append(item)\n", "\n", " return res\n", "\n", "# Teste\n", "l = List([1, 1, 2, 2, 2, 3, 3])\n", "\n", "print l.unique()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[1, 2, 3]\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "3\\. Implemente uma classe *Carro* com as seguintes propriedades:\n", "\n", "+ Um ve\u00edculo tem um certo consumo de combust\u00edvel (medidos em km / litro) e uma certa quantidade de combust\u00edvel no tanque.\n", "+ O consumo \u00e9 especificado no construtor e o n\u00edvel de combust\u00edvel inicial \u00e9 0.\n", "+ Forne\u00e7a um m\u00e9todo `mover(km)` que receba a dist\u00e2ncia em quil\u00f4metros e reduza o n\u00edvel de combust\u00edvel no tanque de gasolina.\n", "+ Forne\u00e7a um m\u00e9todo `gasolina()`, que retorna o n\u00edvel atual de combust\u00edvel.\n", "+ Forne\u00e7a um m\u00e9todo `abastecer(litros)`, para abastecer o tanque.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Carro(object):\n", " \"\"\"\n", " Classe que calcula o consumo de um carro.\n", " \"\"\"\n", "\n", " tanque = 0\n", "\n", " def __init__(self, consumo):\n", "\n", " self.consumo = consumo\n", "\n", " def mover(self, km):\n", "\n", " gasto = self.consumo * km\n", "\n", " if self.tanque > gasto:\n", " self.tanque = self.tanque - gasto\n", " else:\n", " self.tanque = 0\n", "\n", " def abastecer(self, litros):\n", "\n", " self.tanque = self.tanque + litros\n", "\n", " def gasolina(self):\n", "\n", " return self.tanque\n", "\n", "# Teste\n", "carro = Carro(consumo=5)\n", "carro.abastecer(litros=220)\n", "carro.mover(km=20)\n", "print carro.gasolina()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "120\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "4\\. Implementar uma classe *Vetor*:\n", "\n", "+ Com coordenadas x, y e z.\n", "+ Que suporte soma, subtra\u00e7\u00e3o, produto escalar e produto vetorial.\n", "+ Que calcule o m\u00f3dulo (valor absoluto) do vetor.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import math\n", "\n", "class Vetor(object):\n", "\n", " def __init__(self, x, y, z):\n", "\n", " self.x = float(x)\n", " self.y = float(y)\n", " self.z = float(z)\n", "\n", " def __repr__(self):\n", "\n", " return 'Vetor(x=%.1f, y=%.1f, z=%.1f)' % (self.x, self.y, self.z)\n", " \n", " def __add__(self, v):\n", "\n", " x = self.x + v.x\n", " y = self.y + v.y\n", " z = self.z + v.z\n", " return Vetor(x, y, z)\n", "\n", " def __sub__(self, v):\n", "\n", " x = self.x - v.x\n", " y = self.y - v.y\n", " z = self.z - v.z\n", " return Vetor(x, y, z)\n", "\n", " def __abs__(self):\n", "\n", " tmp = self.x ** 2 + self.y ** 2 + self.z ** 2\n", " return math.sqrt(tmp)\n", "\n", " def __mul__(self, v):\n", "\n", " if isinstance(v, Vetor):\n", " x = self.y * v.z - v.y * self.z\n", " y = self.z * v.x - v.z * self.x\n", " z = self.x * v.y - v.x * self.y\n", " else:\n", " x = self.x * float(v)\n", " y = self.y * float(v)\n", " z = self.z * float(v)\n", " return Vetor(x, y, z)\n", "\n", "vetor = Vetor(1, 2, 3)\n", "\n", "print abs(vetor)\n", "print Vetor(4.5, 5, 6) + vetor\n", "print Vetor(4.5, 5, 6) - vetor\n", "print Vetor(4.5, 5, 6) * vetor\n", "print Vetor(4.5, 5, 6) * 5" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "3.74165738677\n", "Vetor(x=5.5, y=7.0, z=9.0)\n", "Vetor(x=3.5, y=3.0, z=3.0)\n", "Vetor(x=3.0, y=-7.5, z=4.0)\n", "Vetor(x=22.5, y=25.0, z=30.0)\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "5\\. Implemente um m\u00f3dulo com:\n", "\n", "+ Uma classe Ponto, com coordenadas x, y e z.\n", "+ Uma classe Linha, com dois pontos A e B, e que calcule o comprimento da linha.\n", "+ Uma classe Triangulo, com dois pontos A, B e C, que calcule o comprimento dos lados e a \u00e1rea.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Ponto(object):\n", "\n", " def __init__(self, x, y, z):\n", "\n", " # Coordenadas\n", " self.x = float(x)\n", " self.y = float(y)\n", " self.z = float(z)\n", " \n", " def __repr__(self):\n", " \n", " return '(%2.1f, %2.1f, %2.1f)' % \\\n", " (self.x, self.y, self.z)\n", "\n", "class Linha(object):\n", " \n", " def __init__(self, a, b):\n", "\n", " # Pontos\n", " self.a = a\n", " self.b = b\n", "\n", " def comp(self):\n", "\n", " x = self.b.x - self.a.x\n", " y = self.b.y - self.a.y\n", " z = self.b.z - self.a.z\n", " \n", " return round((x ** 2 + y ** 2 + z ** 2)\\\n", " ** .5, 1)\n", "\n", " def __repr__(self):\n", " \n", " return '%s => %s' % \\\n", " (self.a, self.b)\n", "\n", "class Triangulo(object):\n", "\n", " def __init__(self, a, b, c):\n", "\n", " # Vertices\n", " self.a = a\n", " self.b = b\n", " self.c = c\n", "\n", " # Lados\n", " self.ab = Linha(a, b)\n", " self.bc = Linha(b, c)\n", " self.ca = Linha(c, a)\n", "\n", " def area(self):\n", "\n", " # Comprimento dos lados\n", " ab = self.ab.comp()\n", " bc = self.bc.comp()\n", " ca = self.ca.comp()\n", "\n", " # Semiperimetro\n", " p = (ab + bc + ca) / 2.\n", "\n", " # Teorema de Heron\n", " return round((p * (p - ab) * (p - bc) \\\n", " * (p - ca)) ** .5, 1)\n", "\n", " def __repr__(self):\n", "\n", " return '%s => %s => %s)' % \\\n", " (self.a, self.b, self.c)\n", "\n", "# Testes\n", "a = Ponto(2, 3, 1)\n", "b = Ponto(5, 1, 4)\n", "c = Ponto(4, 2, 5)\n", "l = Linha(a, b)\n", "t = Triangulo(a, b, c)\n", "\n", "print 'Ponto A:', a\n", "print 'Ponto B:', b\n", "print 'Ponto C:', c\n", "print 'Linha:', l\n", "print 'Comprimento:', l.comp()\n", "print 'Triangulo:', t\n", "print 'Area:', t.area()\n", "\n", "# Mostra:\n", "# Ponto A: (2.0, 3.0, 1.0)\n", "# Ponto B: (5.0, 1.0, 4.0)\n", "# Ponto C: (4.0, 2.0, 5.0)\n", "# Linha: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0)\n", "# Comprimento: 4.7\n", "# Triangulo: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0) => (4.0, 2.0, 5.0))\n", "# Area: 3.9" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Ponto A: (2.0, 3.0, 1.0)\n", "Ponto B: (5.0, 1.0, 4.0)\n", "Ponto C: (4.0, 2.0, 5.0)\n", "Linha: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0)\n", "Comprimento: 4.7\n", "Triangulo: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0) => (4.0, 2.0, 5.0))\n", "Area: 3.9\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }