1.17. Exercícios de Programação

  1. Implemente os métodos getNum e getDen para retornar o numerador e o denominador de uma fração.

  2. De muitas maneiras, seria melhor se todas as frações fossem mantidas em sua forma irredutível desde o início. Modifique o construtor da classe Fraction para que o MDC seja usado para reduzir as frações imediatamente. Note que isso significa que a função __add__ não mais precisa reduzir. Faça as modificações necessárias.

  3. Implemente os operadores aritméticos restantes (__sub__, __mul__ e __truediv__).

  4. Implemente os operadores relacionais restantes (__gt__, __ge__, __lt__, __le__ e __ne__).

  5. Modifique o construtor da classe Fraction para que seja verificado que tanto o numerador quanto o denominador sejam ambos inteiros. Caso algum não for inteiro, o construtor deve levantar uma exceção.

  6. Na definição de frações, assumimos que as frações negativas tem um numerador negativo e um denominador positivo. Usando um denominador negativo faria com que alguns dos operadores relacionais forneçam resultados incorretos. Em geral, essa é uma restrição desnecessária. Modifique o construtor para permitir que o usuário passe um denominador negativo para que todos os operadores continuem a funcionar devidamente.

  7. Pesquise o método __radd__. Qual a diferença para o __add__? Quando ele é usado? Implemente o método __radd__.

  8. Faça o mesmo para o método __iadd__.

  9. Pesquise o método __repr__. Qual a diferença para o __str__? Quando ele é usado? Implemente o método __repr__.

  10. Pesquise outros tipos de portas existentes (tal como NAND, NOR, e XOR). Inclua-os na hierarquia de circuitos. Quanto código a mais você precisou fazer?

  11. O circuito aritmético mais simples é conhecido como meio somador (half-adder). Pesquise sobre esse circuito e o implemente.

  12. Agora estenda o circuito e implemente um somador completo (full-adder) de 8 bits.

  13. A simulação de circuito mostrada neste capítulo trabalha o resultado na direção reversa (para trás). Em outras palavras, dado um circuito, a saída é produzida trabalhando da saída e voltando na direção dos valores de entrada, causando outras saídas a serem consultadas. Isso continua até que as linhas de entrada externas sejam encontradas. Nesse ponto os valores são solicitados ao usuário. Modifique o implementação de modo que a ação esteja na direção para frente; ao receber as entradas, o circuito produz uma saída.

  14. Escreva uma classe que represente uma carta de baralho. Agora escreva uma classe que represente um baralho completo. Usando essas duas classes, implemente o seu jogo favorito de cartas.

  15. Encontre um jogo de Sudoku (em um jornal, revista, online, etc). Escreva um programa para resolvê-lo.

Next Section - 2. Basic Data Structures