Exercícios Resolvidos de Membros estáticos: static

Ver Teoria

Enunciado

Um sistema canais enche um tanque. A vazão total nunca deve ser maior que 50   L / m i n . 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 M a x V a z a o T o t a l 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 v a z a o de cada canal deve ser ajustada de acordo com a vazão total do tanque, então vamos declarar um atributo v a z a o T o t a l que armazena a vazão total do tanque. Acontece que o valor de v a z a o T o t a l é composto pela soma de todos os canais, como gerenciar isso sem saber a quantidade de canais que serão utilizados? Simples, o atributo v a z a o T o t a l 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 g e t V a z a o ( ) e g e t V a z a o T o t a l ( ) para que a gente possa visualizar os atributos privados. Detalhe interessante é que o g e t V a z a o T o t a l 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 p r o p o r c a o 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 v a z a o T o t a l , pra isso a gente chama ele sem utilizar a palavra chave s t a t i c 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 v a z a o e em seguida atualiza o valor da v a z a o T o t a l do sistema.

Em seguida, a gente desenvolve os getters que simplesmente retornam o conteúdo dos atributos privados.

O ponto chave é o método a t u a l i z a V a z a o . 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 v a z a o T o t a l o valor atual de v a z a o deste canal. Em seguida, a vazão deste canal é atualizada de acordo com o valor de p r o p o r c a o . 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 C a n a l com valores quaisquer de vazão.

Vamos exibir a vazão total para o usuário.

Em seguida, vamos usar uma estrutura i f - e l s e 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:

t a x a   d e   r e d u ç ã o = V a z a o   m a x i m a   p e r m i t i d a V a z a o   a t u a l

Com o valor calculado, a gente passa a taxa de redução como parâmetro do método a t u a l i z a V a z a o ( ) 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!

Resposta