1.17. Exercícios de Programação¶
Implemente os métodos
getNum
egetDen
para retornar o numerador e o denominador de uma fração.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 oMDC
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.Implemente os operadores aritméticos restantes (
__sub__
,__mul__
e__truediv__
).Implemente os operadores relacionais restantes (
__gt__
,__ge__
,__lt__
,__le__
e__ne__
).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.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.
Pesquise o método
__radd__
. Qual a diferença para o__add__
? Quando ele é usado? Implemente o método__radd__
.Faça o mesmo para o método
__iadd__
.Pesquise o método
__repr__
. Qual a diferença para o__str__
? Quando ele é usado? Implemente o método__repr__
.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?
O circuito aritmético mais simples é conhecido como meio somador (half-adder). Pesquise sobre esse circuito e o implemente.
Agora estenda o circuito e implemente um somador completo (full-adder) de 8 bits.
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.
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.
Encontre um jogo de Sudoku (em um jornal, revista, online, etc). Escreva um programa para resolvê-lo.