{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bb55da3a",
   "metadata": {},
   "source": [
    "# Aula 07: Exercícios"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "379100ed",
   "metadata": {},
   "source": [
    "### Exercício 1\n",
    "Adicione atributos tamanho e marca à classe `Televisão`. Crie dois objetos `Televisão`  e atribua  tamanhos e marcas diferentes. Aí imprima  os atribuitos para ver a diferença.\n",
    "\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c44012b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Televisão: # Definição de uma classe\n",
    "    def __init__(self):  # Método especial - construtor\n",
    "        self.ligada = False # atributo \n",
    "        self.canal = 2 # outro atributo\n",
    "        self.marca = \"Phillips\"\n",
    "        self.tamanho = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "18dea4d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "tv1 = Televisão()\n",
    "tv2 = Televisão()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "925a1abf",
   "metadata": {},
   "outputs": [],
   "source": [
    "tv1.marca = \"Sony\"\n",
    "tv1.tamanho = 56\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ed38238a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def descrever_tv(tv):\n",
    "    \"\"\"\n",
    "    Esta função retorna uma string que descreve as características da tv\n",
    "    \"\"\"\n",
    "    \n",
    "    return f\"Televisão {tv.marca} com {tv.tamanho} polegadas\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3a29c370",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Televisão Sony com 56 polegadas\n"
     ]
    }
   ],
   "source": [
    "print(descrever_tv(tv1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4ab1a146",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Televisão Phillips com 32 polegadas\n"
     ]
    }
   ],
   "source": [
    "print(descrever_tv(tv2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a730bfc2",
   "metadata": {},
   "source": [
    "### Exercício 2\n",
    "\n",
    "Atualmente a classe `Televisão` inicializa o canal com 2. Modifique a classe de forma a receber o canal inicial em seu construtor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a0043b82",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Televisão:\n",
    "    def __init__(self, canal=2, min=2, max=13):\n",
    "        self.ligada = False\n",
    "        self.canal = canal\n",
    "        self.cmin = min\n",
    "        self.cmax = max\n",
    "        \n",
    "    def muda_canal_para_baixo(self):\n",
    "        if self.canal -1 >= self.cmin:\n",
    "            self.canal -= 1\n",
    "    \n",
    "    def muda_canal_para_cima(self):\n",
    "        if self.canal +1 <= self.cmax:\n",
    "            self.canal += 1\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a078ed96",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tv = Televisão(7)\n",
    "tv.canal"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eacac00a",
   "metadata": {},
   "source": [
    "### Exercício 3\n",
    "Modifique a classe `Televisão` de modo que se pedirmos para mudar o canal para baixo, além do mínimo, ele vái para o máximo e vice e versa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "69fa0d57",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Televisão:\n",
    "    def __init__(self, canal=2, min=2, max=13):\n",
    "        self.ligada = False\n",
    "        self.canal = canal\n",
    "        self.cmin = min\n",
    "        self.cmax = max\n",
    "        \n",
    "    def muda_canal_para_baixo(self):\n",
    "        if self.canal - 1 >= self.cmin:\n",
    "            self.canal -= 1\n",
    "        else:\n",
    "            self.canal = self.cmax\n",
    "    \n",
    "    def muda_canal_para_cima(self):\n",
    "        if self.canal +1 <= self.cmax:\n",
    "            self.canal += 1\n",
    "        else:\n",
    "            self.canal = self.cmin\n",
    "                \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "abd230c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Canal: 11\n",
      "Canal: 12\n",
      "Canal: 13\n",
      "Canal: 2\n",
      "Canal: 3\n",
      "Canal: 2\n",
      "Canal: 13\n",
      "Canal: 12\n"
     ]
    }
   ],
   "source": [
    "tv = Televisão(11)\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_cima()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_cima()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_cima()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_cima()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "\n",
    "tv.muda_canal_para_baixo()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_baixo()\n",
    "print(f\"Canal: {tv.canal}\")\n",
    "tv.muda_canal_para_baixo()\n",
    "print(f\"Canal: {tv.canal}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb8576cb",
   "metadata": {},
   "source": [
    "### Exercício 4\n",
    "Utilizando o que aprendemos com funções modifique o construtor de classe `Telefisão` de forma que `min` e `max` sejam parâmetros opcionais em que `min` vale 2 e `max` vale 13 caso outros valores não sejam passados\n",
    "\n",
    "Já fiz isso nos exercícios acima!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2510fce1",
   "metadata": {},
   "source": [
    "### Exercício 5\n",
    "Utilizando a classe modificada no exercício anterior (4), crie duas instâncias (objetos) especificando `min` e `max` por nome."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "384f4d59",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Min: 2, Max: 69\n"
     ]
    }
   ],
   "source": [
    "tv1 = Televisão(min=2, max=69)\n",
    "print(f\"Min: {tv1.cmin}, Max: {tv1.cmax}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "a1a7aff9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Min: 14, Max: 50\n"
     ]
    }
   ],
   "source": [
    "tv2 = Televisão(min=14, max=50)\n",
    "print(f\"Min: {tv2.cmin}, Max: {tv2.cmax}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "edc7222f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "9756c048",
   "metadata": {},
   "source": [
    "### Exercício 6\n",
    "\n",
    "Altere o programa de forma que a mensagem saldo insuficiente seja exibida caso haja tentativa de sacar mais dinheiro que o saldo disponível"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "fd8afa4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Cliente:\n",
    "    def __init__(self, nome, telefone):\n",
    "        self.nome = nome\n",
    "        self.telefone = telefone\n",
    "\n",
    "class Conta:\n",
    "    def __init__(self, clientes, número, saldo=0):\n",
    "        self.saldo = saldo\n",
    "        self.clientes = clientes\n",
    "        self.número = número\n",
    "    def resumo(self):\n",
    "        print(f\"CC Número: {self.número}. Saldo: {self.saldo:10.2f}\")\n",
    "    def saque(self, valor):\n",
    "        if self.saldo >= valor:\n",
    "            self.saldo -= valor\n",
    "        else:\n",
    "            print(f\"Conta com saldo {self.saldo:10.2f}. Insuficiente para sque de {valor:10.2f}\")\n",
    "    def deposito(self, valor):\n",
    "        self.saldo += valor\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "b069b67c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CC Número: 01.00011. Saldo:      60.00\n",
      "Conta com saldo      60.00. Insuficiente para sque de      70.00\n",
      "CC Número: 01.00011. Saldo:      60.00\n"
     ]
    }
   ],
   "source": [
    "joão = Cliente(\"João de Barros\", \"555-2604\")\n",
    "conta = Conta([joão], \"01.00011\", saldo=100)\n",
    "\n",
    "conta.saque(40)\n",
    "conta.resumo()\n",
    "conta.saque(70)\n",
    "conta.resumo()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23ef1f2b",
   "metadata": {},
   "source": [
    "### Exercício 7\n",
    "Modifique o método `resumo` da class `Conta` para exibir o nome e o telefone de cada cliente"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "734e1e48",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "class Conta:\n",
    "    def __init__(self, clientes, número, saldo=0):\n",
    "        self.saldo = saldo\n",
    "        self.clientes = clientes\n",
    "        self.número = número\n",
    "    def resumo(self):\n",
    "        print(f\"CC Número: {self.número}. Saldo: {self.saldo:10.2f}\")\n",
    "        for cliente in self.clientes:\n",
    "            print(f\"   Cliente: {cliente.nome}, tel. {cliente.telefone}\")\n",
    "    def saque(self, valor):\n",
    "        if self.saldo >= valor:\n",
    "            self.saldo -= valor\n",
    "        else:\n",
    "            print(f\"Conta com saldo {self.saldo:10.2f}. Insuficiente para sque de {valor:10.2f}\")\n",
    "    def deposito(self, valor):\n",
    "        self.saldo += valor\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "42894ae4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CC Número: 01.00011. Saldo:      60.00\n",
      "   Cliente: João de Barros, tel. 555-2604\n",
      "   Cliente: Maria de Barros, tel. 555-2604\n",
      "Conta com saldo      60.00. Insuficiente para sque de      70.00\n",
      "CC Número: 01.00011. Saldo:      60.00\n",
      "   Cliente: João de Barros, tel. 555-2604\n",
      "   Cliente: Maria de Barros, tel. 555-2604\n"
     ]
    }
   ],
   "source": [
    "joão = Cliente(\"João de Barros\", \"555-2604\")\n",
    "maria = Cliente(\"Maria de Barros\", \"555-2604\")\n",
    "\n",
    "conta = Conta([joão,maria], \"01.00011\", saldo=100)\n",
    "\n",
    "conta.saque(40)\n",
    "conta.resumo()\n",
    "conta.saque(70)\n",
    "conta.resumo()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9c5782c5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "015b1aa9",
   "metadata": {},
   "source": [
    "### Exercício 8\n",
    "Modofique as classes `Conta` e `ContaEspecial` para que a operação de saque retorne verdadeiro se o saque foi realizado e false caso contrário"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "4afb1af8",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Conta:\n",
    "    def __init__(self, clientes, número, saldo=0):\n",
    "        self.saldo = 0\n",
    "        self.clientes = clientes\n",
    "        self.número = número\n",
    "        self.operações = []\n",
    "        self.deposito(saldo)\n",
    "    def resumo(self):\n",
    "        print(f\"CC Número: {self.número}. Saldo: {self.saldo:10.2f}\")\n",
    "    def saque(self, valor):\n",
    "        if self.saldo >= valor:\n",
    "            self.saldo -= valor\n",
    "            self.operações.append([\"SAQUE\", valor])\n",
    "            return True\n",
    "        else:\n",
    "            return False\n",
    "    def deposito(self, valor):\n",
    "        self.saldo += valor\n",
    "        self.operações.append([\"DEPÓSITO\", valor])\n",
    "    def extrato(self):\n",
    "        print(f\"Extrato CC No {self.número}\\n\")\n",
    "        for o in self.operações:\n",
    "            print(f\"{o[0]:10s} {o[1]:10.2f}\")\n",
    "        print(f\"\\n    Saldo: {self.saldo:10.2f}\\n\")\n",
    "\n",
    "class ContaEspecial(Conta):\n",
    "    def __init__(self, clientes, número, saldo=0, limite=0):\n",
    "        Conta.__init__(self, clientes, número, saldo)\n",
    "        self.limite = limite\n",
    "\n",
    "    def saque(self, valor):\n",
    "        if self.saldo + self.limite >= valor:\n",
    "            self.saldo -= valor\n",
    "            self.operações.append([\"SAQUE\", valor])\n",
    "            return True\n",
    "        else:\n",
    "            return False\n",
    "\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "dea652ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "bozo = Cliente(\"Bozo Palhaço\", \"236-0873\")\n",
    "vovó = Cliente(\"Vovó Mafalda\", \"236-0873\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad2ce268",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "9d7b6058",
   "metadata": {},
   "outputs": [],
   "source": [
    "conta1 = Conta([\"bozo\"], 1, 1000)\n",
    "conta2 = ContaEspecial([vovó, bozo], 2, 500, 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "7649c7e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conta1.saque(23)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "61171777",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conta1.saque(100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "556ab709",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conta2.saque(23)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "a9031504",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conta2.saque(23000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "2336629a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<super: __main__.ContaEspecial, None>"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "super(ContaEspecial)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87c89e19",
   "metadata": {},
   "source": [
    "\n",
    "### Exercício 9\n",
    "Modifique a classe `ContaEspecial` de forma que seu extrato exiba o limite e o total disponível para saque."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "9b6f4126",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ContaEspecial(Conta):\n",
    "    def __init__(self, clientes, número, saldo=0, limite=0):\n",
    "        Conta.__init__(self, clientes, número, saldo)\n",
    "        self.limite = limite\n",
    "\n",
    "    def saque(self, valor):\n",
    "        if self.saldo + self.limite >= valor:\n",
    "            self.saldo -= valor\n",
    "            self.operações.append([\"SAQUE\", valor])\n",
    "            return True\n",
    "        else:\n",
    "            return False\n",
    "    def extrato(self):\n",
    "        # Vamos aproveitar O que já foi implementado\n",
    "        # na classe rConta\n",
    "        Conta.extrato(self)\n",
    "        # Vamos colocar a informação adicional:\n",
    "        print(f\"Limite: {self.limite:10.2f}\")\n",
    "        print(f\"Total disponível: {self.limite+self.saldo:10.2f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "1b528061",
   "metadata": {},
   "outputs": [],
   "source": [
    "conta2 = ContaEspecial([vovó, bozo], 2, 500, 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "15e46789",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extrato CC No 2\n",
      "\n",
      "DEPÓSITO       500.00\n",
      "\n",
      "    Saldo:     500.00\n",
      "\n",
      "Limite:    1000.00\n",
      "Total disponível:    1500.00\n"
     ]
    }
   ],
   "source": [
    "conta2.extrato()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b03b9fc5",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
