Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Floozie

Sugestão com melhoria de algoritmo

Recommended Posts

OBS: Eu já resolvi o exercício, mas quero melhorar o código que criei pra aprimorar o meu conhecimento.

 

Galera, seguinte, to aprendendo PHP e me foi proposto o seguinte exercício:

 

 

Em um cinema, tinham 20 pessoas na fila para comprar o ingresso, de repente a gerente fala: "Apenas os 5 primeiros vão receber um desconto de 20% e mais 5 terão 10%".
O preço original do ingresso: R$ 28,00

Faça o script para tornar isso possível, em que o resultado seja algo parecido:

Pessoa 1 - R$ 22,40 (20% desconto)
Pessoa 2 - R$ 22,40 (20% desconto)
Pessoa 3 - R$ 22,40 (20% desconto)
Pessoa 4 - R$ 22,40 (20% desconto)
Pessoa 5 - R$ 22,40 (20% desconto)
Pessoa 6 - R$ 26,60 (10% desconto)
...
Pessoa 11 - R$ 28,00
...

Lembrando que o script deve funcionar para qualquer valor de ticket e qualquer valor de desconto, então se o gerente mudar o desconto pra 10%, o script vai funcionar também.

 

Queria saber a opnião de vocês se o algoritmo que desenvolvi está correto, e o que poderia ser melhorado ou otimizado. Tem certas coisas que não dá pra aprender só lendo, então to fazendo isso pra tentar me tornar um programador melhor.

 

Eu resolvi da seguinte forma:

<?php

// Função pra calcular o desconto
function calDeconto($valor, $desconto){
	$result = $valor -= ($valor * ($desconto / 100));
	return $result;
}

// Definindo valores dos descontos em %
$descontos = array( 20, 10, 5, 2 );
// Definindo quantidade de pessoas afetadas pelos descontos
$quantidade = array( 5, 5, 3, 2 );
// Total de pessoas afetadas pelo desconto
$total = 0;
foreach($quantidade as $valor){
	$total += $valor;
}
// Valor do ingresso
$ticket = 28;

// Número de pessoas na fila
$fila = 20;

for($i = 1; $i <= $fila; $i++){

	// Percorre o numero total de pessoas afetadas e aplica o calculo de desconto baseado nos arrays
	if($i <= $total){
		for($j = 0; $j < sizeof($descontos); $j++){
			for($k = 0; $k < $quantidade[$j]; $k++){
				echo 'Pessoa '.$i.' - R$ '.number_format(calDeconto($ticket, $descontos[$j]), 2, ",", ".").' ('.$descontos[$j].'% desconto)<br/>';
				$i++;
			}
		}
	$i--;
	// Mostra o resto das pessoas na fila
	} else {
		echo 'Pessoa '.$i.' - R$ '.number_format($ticket, 2, ",", ",").'<br/>';
	}
	
}

Também fiz orientado a objetos, ou pelo menos acho que sim

 

 

<?php

class Cinema {

	private $descontos = array();
	private $quantidade = array();
	private $preco;
	private $total;
	private $fila;

	public function setDesconto($desconto, $qnt){
		if($desconto > 0 && $desconto <= 100){
			array_push($this->descontos, $desconto);
			array_push($this->quantidade, $qnt);
		} else {
			echo 'O desconto precisa ser entre 1 e 100% - ('.$desconto.' informados)';
		}
	}

	public function getDesconto($key){
		return $this->descontos[$key];
	}

	public function setPreco($preco){
		$this->preco = $preco;
	}

	public function getPreco(){
		return $this->preco;
	}


	public function setFila($fila){
		$this->fila = $fila;
	}

	public function getFila(){
		return $this->fila;
	}

	private function totalDescontos(){
		return sizeof($this->descontos);
	}

	private function calcDesconto($desc){
		$preco = $this->getPreco();
		$desconto = $this->getDesconto($desc);
		$result = $preco -= $preco * ($desconto / 100);
		return $result;
	}

	private function toReal($valor){
		$real = 'R$ '.number_format($valor, 2, ",", ".");
		return $real;
	}

	private function getTotal(){
		$total = 0;
		foreach($this->quantidade as $value){
			$total += $value;
		}
		return $total;
	}

	public function listAll(){
		for($i = 1; $i <= $this->getFila(); $i++){
			
			if($i <= $this->getTotal()){
				for($j = 0; $j < $this->totalDescontos(); $j++){
					for($k = 0; $k < $this->quantidade[$j]; $k++){
						echo 'Pessoa '.$i.' - '.$this->toReal($this->calcDesconto($j)).' ('.$this->getDesconto($j).'% desconto)<br/>';
						$i++;
					}
				}
			} else {
				echo 'Pessoa '.$i.' - R$ '.$this->toReal($this->getPreco()).'<br/>';
			}
		}
	}
}


$cinema = new Cinema;
$cinema->setPreco(28.00);
$cinema->setFila(20);
$cinema->setDesconto(20, 5);
$cinema->setDesconto(10, 5);
$cinema->setDesconto(5, 3);

$cinema->listAll();

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.