Um sistema canais enche um tanque. A vazão total nunca deve ser maior que . Quando esse limite é superado, a vazão de todos os dutos ativos é reduzida proporcionalmente para atingir o limite máximo.
Utilizando orientação a objetos em C++, crie um programa que simule esta situação utilizando três canais.
Passo 1
E aí, galera! Vamos desenvolver mais um exercício de fixação.
A questão fala que um tanque é alimentado por canais que fornecem um certo valor de vazão individual cada um, e que somados oferecem uma vazão total para o tanque. Então uma boa solução é criar uma classe que represente canais e depois instanciar a quantidade de objetos necessários.
Mas antes, vamos começar com o cabeçalho da questão. Vamos aproveitar para declarar uma constante global que guarda o valor da vazão máxima permitida:
Passo 2
Vamos desenvolver a classe que representa os canais.
No encapsulamento privado, vamos criar um tributo que represente a vazão desse canal:
A de cada canal deve ser ajustada de acordo com a vazão total do tanque, então vamos declarar um atributo que armazena a vazão total do tanque. Acontece que o valor de é composto pela soma de todos os canais, como gerenciar isso sem saber a quantidade de canais que serão utilizados? Simples, o atributo deve ser estático:
Belezinha! Agora vamos pro encapsulamento público onde vamos definir alguns métodos importantes.
Primeiro o construtor, que recebe como parâmetro o valor da vazão individual de cada canal.
Depois criamos métodos e para que a gente possa visualizar os atributos privados. Detalhe interessante é que o pode ser do tipo estático, pois ele acessa apenas atributos estáticos.
E também vamos declarar um método que irá atualizar o valor da vazão quando necessário. Esse método recebe um parâmetro pois o ajuste de vazão será proporcional a um determinado fator.
E com isso podemos fechar a classe.
Passo 3
Show. Agora que o esqueleto da classe foi desenvolvido, a gente pode desenvolver os detalhes.
Primeiro, vamos inicializar o atributo estático , pra isso a gente chama ele sem utilizar a palavra chave e inicializa com valor zerado.
Em seguida, vamos desenvolver o construtor da classe. O construtor receberá o parâmetro vazão (que tem valor padrão zero), o parâmetro recebido será usado para inicializar o atributo e em seguida atualiza o valor da do sistema.
Em seguida, a gente desenvolve os getters que simplesmente retornam o conteúdo dos atributos privados.
O ponto chave é o método . Esse método recebe um valor de proporção que é calculado de acordo com o excedente de vazão.
Então, para evitar que a vazão de um mesmo canal seja contabilizada duas vezes, primeiro removemos de o valor atual de deste canal. Em seguida, a vazão deste canal é atualizada de acordo com o valor de . E por fim, adicionamos a vazão atualizada deste canal na vazão total do sistema.
E pronto! Todos os métodos e atributos da classe estão definidos.
Passo 4
Agora vamos testar.
Primeiro, vamos criar três instâncias de com valores quaisquer de vazão.
Vamos exibir a vazão total para o usuário.
Em seguida, vamos usar uma estrutura para verificar se a vazão total excede a máxima permitida.
Caso a vazão seja excedente, nós informamos isso ao usuário e calculamos um valor proporcional de redução que deve ser aplicada nos canais para atingir o valor permitido:
Com o valor calculado, a gente passa a taxa de redução como parâmetro do método de cada um dos canais. E depois informamos isso ao usuário.
E pra finalizar, é só a gente imprimir o valor de vazão total e de cada um dos canais.
E o resultado é:
E é isso! Até a próxima!