Entendendo o diagrama de blocos
É a ferramenta que o profissional possui que tem como objetivo descrever o processo, entrada, processamento e saída de dados. O diagrama de blocos pode ser desenvolvido em qualquer nível de detalhamento. O diagrama de blocos utiliza-se de várias formas geométricas para representarmos as sequencias a serem efetuadas. Observe a imagem a seguir seria a representação em diagrama de blocos dos processos básicos a entrada, processamento e saída de dados.
O primeiro e o ultimo símbolo é o terminal representando respectivamente o inicio e o fim da aplicação. Este símbolo tem que estar sempre presente representando o início e o fim do diagrama de blocos. A seta indica a direção em que o processamento do programa deve seguir. O símbolo seguido do inicio representa o teclado, a entrada de dados, o seguinte representa o processamento de dados e o ultimo antes do terminal final representa o display, a saída de dados.
Exemplo simples com diagrama de blocos Problema 1. Ler dois valores, no caso às variáveis $a e $b 2. Realizar a soma das variáveis $a e $b e atribuir o resultado a variável $resultado 3. Exibir o valor da variável $resultado
Observe como ficaria a representação no diagrama de blocos do problema apresentado anteriormente.
Primeiro iniciamos o diagrama de blocos com o terminal para representarmos o inicio do código. Em seguida inserimos dois símbolos que representam a entrada de dados, pelo fato de nosso programa necessitar de dois valores $a e $b. No bloco de processamento definimos que a variável $resultado terá o valor da soma de $a com $b. Em seguida temos o display que representa a saída de dados que exibirá para nos a variável $resultado. E por ultimo inserimos o terminal de fim.
PHP Observe como ficaria a representação em PHP do diagrama de blocos do problema apresentado anteriormente. <?php // Entrada de dado $a $a = 10; // Entrada de dado $b $b = 7; * Processamento, somamos $a com $b * e atribuimos o valor a $resultado $resultado = $a + $b; // Saida de dados, o display echo $resultado; ?> No código anterior da transcrição do diagrama de blocos para o PHP. Iniciamos primeiramente criando as duas variáveis que serão à entrada de dados $a e $b. Em seguida criamos a variável $resultado que tem em seu valor o resultado da soma de $acom $b, que seria o processamento.E por ultimo exibimos o resultado em tela que seria a variável $resultado este sendo a nossa saída de dados. Como você pode observar fizemos um exemplo muito simples, pois a idéia é apenas você se acostumar com os símbolos apresentados no diagrama de blocos e como representar o mesmo no PHP.
Exercícios em php
1. Ler a entrada de 4 notas de um aluno 2. Obter sua média 3. Se a média for maior ou igual a 7 retornar aprovado menor que 7 retornar reprovado 4. Exibir a média do aluno e se foi aprovado ou reprovado Como você pode observar as partes 1 e 2 do problema poderíamos resolver facilmente com os operadores aritméticos. Veja o exemplo a seguir: <?php * Entrada das 4 notas do aluno $nota1 = 10; $nota2 = 9; $nota3 = 7; $nota4 = 5; * Obtendo a média do aluno $resultado = ($nota1 + $nota2 + $nota3 + $nota4) / 4; * Retornando a média echo $resultado; ?> No entanto a parte 3, não poderíamos desenvolver até aqui, pois necessitamos das estruturas de controle, que você irá ver agora.
If o desvio condicional simples no PHP O construtor If tem como objetivo executar todo o código que esteja entre o construtor caso o resultado da avaliação seja verdadeiro caso contrario nada será executado.
Continuando o problema anterior mais neste ponto apenas um fragmento para ilustrar.
Problema
Ler a entrada de 4 notas de um aluno Obter sua média Se a média for maior ou igual a 7 retornar aprovado Exibir a média do aluno e se foi aprovado O diagrama de blocos Observe como seria a representação do nosso problema no diagrama de blocos.
Diagrama de blocos do problema apresentado
Neste diagrama foi inserido um símbolo novo que é o losango pois ele é o nosso símbolo de decisão. Observe também a presença das letras S e N representando respectivamente sim e não. Caso a condição dentro do bloco de decisão seja verdadeira o que esta dentro do bloco do sim, S, será executado, caso seja falsa o que estiver dentro do bloco do não, N, será executado. Observe o uso das setas para indicar a direção do processamento. Ao final novamente um símbolo conhecido o display e para finalizar o terminal final.
No PHP Seguimos a mesma lógica do código anterior, no entanto observe que criamos a variável $mensagem, em seguida criamos a nossa estrutura de controle If com o operador de comparação >= se esta expressão for verdadeira a variável $mensagem terá uma valor dizendo que o aluno foi aprovado. Se a nota for menor que 7 apenas exibe a nota. Observe o código a seguir:
Veja abaixo como fica no código php a nossa estrutura condicional IF. <?php * Entrada das 4 notas do aluno $nota1 = 10; $nota2 = 9; $nota3 = 7; $nota4 = 5; * Obtendo a média do aluno $resultado = ($nota1 + $nota2 + $nota3 + $nota4) / 4; * Crio a mensagem $mensagem = ''; if( $resultado >= 7 ){ $mensagem = ' o aluno foi aprovado'; } * Retornando a média echo $resultado . $mensagem;?>
OBS: A variável $mensagem foi criada com um valor vazio antes do If pois independente da nota exibimos a variável $mensagem no nosso retorno, e se a nota for menor que 7 não teríamos a variável $mensagem, pois ela só seria criada se a média fosse maior ou igual a 7, o que geraria um erro de notice afinal o PHP estaria tentando exibir uma variável inexistente.
IMPORTANTE
As expressões são exibidas entre parêntesis logo após a declaração da estrutura Expressões são realizadas por operadores lógicos e operadores de comparação O bloco de código referente a estrutura de controle deve ser delimitado por chaves {} Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
Até aqui está legal nosso programa, se a nota for maior que 7 ele exibe que foi aprovado, no entanto ainda falta ele exibir também quando o aluno for reprovado, pois até o momento quando ele é reprovado apenas a nota é exibida, então é neste ponto que conheceremos outra estrutura de controle o else.
Else o desvio condicional composto no PHP
O else é a estrutura de controle que é executada quando o If, ou elseif, for retornado falso. Continuando o nosso primeiro problema apresentado agora poderemos exibir a média e se foi aprovado ou reprovado. Lembrando que com apenas o If conseguíamos exibir apenas o aprovad O diagrama de blocos Observe como seria a representação do nosso problema no diagrama de blocos.
Seguimos a mesma lógica do diagrama anterior. E como foi dito que o else é executado quando o if for retornado falso, apenas tivemos que criar um bloco de processamento seguindo para o bloco da letra N afinal é o else e só será executado se a condição for falsa.
No PHP Seguimos a mesma lógica do código anterior, no entanto observe que logo após o fechamento do if inserimos a nossa nova clausula else. O que poderia ser lido assim “se resultado for maior ou igual a 7 o aluno foi aprovado senão o aluno foi reprovado”. Lembrando que será executado o bloco if se a expressão, em nosso caso $resultado >= 7, for verdadeira senão será executado o else. Observe o código a seguir: <?php * Entrada das 4 notas do aluno $nota1 = 10; $nota2 = 2; $nota3 = 7; $nota4 = 5; * Obtendo a média do aluno $resultado = ($nota1 + $nota2 + $nota3 + $nota4) / 4; * Crio a mensagem $mensagem = ''; if( $resultado >= 7 ){ $mensagem = ' o aluno foi aprovado'; } else { $mensagem = ' o aluno foi reprovado'; } * Retornando a média echo $resultado . $mensagem; ?>
Em relação a estrutura de controle else:
Não possui expressões a ser avaliada é executado após um if, ou elseif, você aprenderá a seguir, ter retornado false(falso) O bloco de código referente à estrutura de controle deve ser delimitado por chaves {} Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
E se o aluno tirar 10? Ele foi aprovado, mais podemos exibir uma mensagem especial igual as que as professoras de primário exibem. Sendo assim se o aluno tirar 10 exibiremos uma mensagem especial e para exibir esta mensagem especial utilizaremos da estrutura de controle elseif.
Elseif outro desvio condicional composto no PHP
O elseif é a estrutura de controle que será avaliada após o if retornar falso, o elseif é inserido antes do else, e mais de um elseif pode ser inserido, lembrando que o elseifavalia expressões assim como o if. Ficando assim se um if retornar falso caíra no elseif, se o elseif retornar falso cairá no próximo elseif se houver, após todos os elseiffinaliza á lógica no else. Continuando nossa lógica da média do aluno, iremos exibir uma mensagem de sucesso quando ele tirar 10, e uma mensagem para ele estudar mais se tirar 0, pois como foi dito podemos ter mais de um elseif, além do que já esta sendo exibido o aprovado e reprovado.
O diagrama de blocos
Observe como seria a representação no diagrama de blocos com a inserção da nossa nova lógica.
Observe que adicionamos mais uma condição no if agora nosso resultado além de ser maior ou igual a 7 não pode ser 10, pois o 10 tem uma mensagem especial. Se esta condição for verdadeira exibe a mensagem de aprovado, até aqui tudo igual. Se a condição for falsa verificamos se a variável $resultado é igual a 0 se a condição for verdadeira retornamos uma mensagem, se for falsa, verificamos novamente o valor de $resultado se é igual a 10 se for verdadeira a expressão retornamos uma mensagem caso contrario caímos no nosso else que diz que o aluno foi reprovado. Observe que utilizamos o mesmo símbolo de condição, o losango, para representar o elseif. E um novo símbolo que é um pequeno circulo, o conector, foi utilizado para conectar as condições e todas levarem para um mesmo final.
No PHP Mantendo a mesma lógica do código anterior adicionamos 2 estruturas elseif antes doelse. Uma para quando a média do aluno for igual a 0 e outra para quando a média do aluno for igual a 10, assim retornando mensagens personalizadas para estas médias. Observe que adicionamos uma nova condição ao if com o operador lógico && e com o operador de comparação != pois aqui dissemos para retornar o resultado do if se a nota for maior ou igual a 7 e não igual a 10, afinal 10 tem um tratamento especial. Agora porque não colocamos o operador de negação no 0? Porque o if só é executado se o $resultadofor maior ou igual a 7 e como o 0 é menor ele não se encaixa no if e seguiria para o próximo elseif. Observe o código a seguir:
<?php * Entrada das 4 notas do aluno $nota1 = 10; $nota2 = 10; $nota3 = 10; $nota4 = 10; * Obtendo a média do aluno $resultado = ($nota1 + $nota2 + $nota3 + $nota4) / 4; * Crio a mensagem $mensagem = ''; if ( $resultado >= 7 && $resultado != 10 ) { $mensagem = ' o aluno foi aprovado.'; } elseif ( $resultado == 0 ) { $mensagem = ' estude mais, você não acertou nada.'; } elseif ( $resultado == 10 ) { $mensagem = ' parabéns! Aprovado com nota máxima.';
} else {
$mensagem = ' o aluno foi reprovado.';
} * Retornando a média
echo $resultado . $mensagem;
?> Agora que você entendeu bem como funciona o IF, else e elseif resolva com essas estruturas de controle pequenos problemas. Por exemplo entre com 3 valores um operador, a e b e de acordo com o operador o programa tem que executar uma operação matemática(soma, subtração, multiplicação e divisão) utilizando as estruturas de controle aprendidas aqui e os operadores de php.
O switch no PHP O switch funciona como uma série de if juntos, mais sobre as estruturas de controle if, else e elseif podem ser encontradas no artigo anterior, testando valores para uma variável ou expressão. No entanto o switch trabalha basicamente com o operador de igualdade. Então em casos que devemos testar se nossa variável, ou expressão, é igual a uma série de valores, o switch é uma boa saída. Vamos agora ver um problema para entendermos melhor o switch. Problema Em um programa de televisão o expectador deve escolher números de 1 a 5 para um sorteio de prêmios, em que cada número representa um prêmio. Então faremos: 1. Ler a entrada, o número que o expectador escolheu 2. De acordo com o número que o expectador escolheu retornar um prêmio 3. Se escolher um numero que não seja de 1 a 5 retornar uma mensagem de erro. 4. O diagrama de blocos 5. Observe como seria a representação do nosso problema no diagrama de blocos.
O símbolo de início e entrada de dados não são novidades afinal foram abordados no diagrama de blocos do PHP, no entanto o símbolo seguinte nos diz que iremos comparar o valor contido nele com os símbolos de decisões seguintes. E como já foi falado no artigo anterior utilizamos as setas para indicar a direção do processamento. Como você pode observar no diagrama será testado cada um dos valores se não for verdadeiro o próximo será testado até o último, chegando no ultimo se nem o último for verdadeiro executamos o default, equivalente a um else.
No PHP O nosso problema poderia ser resolvido apenas utilizando as estruturas de controle if, else e elseif que aprendemos anteriormente. Antes de ver o código abaixo tente resolver o nosso problema apenas com as estruturas de controle que aprendemos até este ponto. Conseguiu? Veja um exemplo de como poderia ser resolvido utilizando apenas if, else e elseif:
<?php * Entrada do número do expectador $numero = 3; if ( $numero == 1 ){ $mensagem = 'uma bicicleta'; } elseif ( $numero == 2 ) { $mensagem = '20 mil reais em barras de ouro'; } elseif ( $numero == 3 ) { $mensagem = 'uma casa'; } elseif ( $numero == 4 ) { $mensagem = 'um conjunto de panelas'; } elseif ( $numero == 5 ) { $mensagem = 'um carro zero'; } else { $mensagem = 'nada, infelizmente';
} * Retornando a mensagem echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?> Não foi muito difícil de resolver né? No entanto observe o código comparamos sempre a variável $numero a um valor de 1 a 5 e retornávamos uma $mensagem, e se não fosse de 1 a 5 retornaríamos que ele não ganhou nada. Se estamos sempre comparando uma variável, ou expressão se são iguais a uma série de valores talvez seja à hora de trocarmos de estrutura de controle. Ao utilizarmos o switch informamos a variável ou expressão que será testada em cada uma das cláusulas (case) até que seja encontrada uma cláusula em que seja verdadeira. Quando isto ocorre às instruções dentro do bloco de código da estrutura case é executado até encontrar a instrução break, falaremos mais sobre break quando chegarmos aos loops no PHP, se nenhuma cláusula for verdadeira a instrução default será executada. <?php * Entrada do número do expectador $numero = 3; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; break; case 2: $mensagem = '20 mil reais em barras de ouro'; break; case 3: $mensagem = 'uma casa'; break; case 4: $mensagem = 'um conjunto de panelas'; break;
case 5: $mensagem = 'um carro zero'; break; default: $mensagem = 'nada, infelizmente'; } * Retornando a mensagem echo "Parabéns o seu prêmio foi: {$mensagem}"; OBS: Voltaremos a falar sobre a instrução break posteriormente, no entanto até este momento você só deve ter em mente que se ela não for inserida seria como se não fechássemos a instrução case. Observe o exemplo abaixo mesmo passando um valor e ele for verdadeiro todas as expressões abaixo do valor escolhido são executadas e como atribuímos um valor a variável o que prevalece é da ultima, o default, por este motivo devemos sempre utilizar a instrução break.
?php * Entrada do número do expectador $numero = 3; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; case 2: $mensagem = '20 mil reais em barras de ouro'; case 3: $mensagem = 'uma casa'; case 4: $mensagem = 'um conjunto de panelas'; case 5: $mensagem = 'um carro zero'; default:
$mensagem = 'nada, infelizmente'; } * Retornando a mensagem echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?> Agora que sabemos o porquê do break, podemos o aproveitar de uma maneira, por exemplo, se em nosso problema caso a pessoa escolhesse 2 ou 3 o prêmio seria o mesmo. Poderíamos apenas mudar o valor da variável mensagem para eles ficarem iguais, no entanto estaríamos nos repetindo o que não é legal, pois sempre que tivéssemos que alterar em um teríamos que lembrar de alterar no outro por isso. O melhor mesmo é fazer da seguinte forma:
<?php * Entrada do número do expectador $numero = 2; switch ( $numero ){ case 1: $mensagem = 'uma bicicleta'; break; case 2: case 3: $mensagem = 'uma casa'; break; case 4: $mensagem = 'um conjunto de panelas'; break; case 5: $mensagem = 'um carro zero'; break;
default: $mensagem = 'nada, infelizmente'; } * Retornando a mensagem echo "Parabéns o seu prêmio foi: {$mensagem}" ; ?>
Como o valor que seria mantido era o da cláusula 3 apenas retiramos as instruções da 2 e não colocamos break na cláusula 2 sendo assim ela seria a mesma que a 3 esta sim tendo a instrução break como as demais. Em relação a estrutura de controle switch:
A variavel ou expressão a ser avaliada é declarada no inicio do switch Expressões são realizadas por operadores lógicos e operadores de comparação O bloco de código referente a estrutura de controle deve ser delimitado por chaves {} Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
Cada cláusula (case) possui um valor a ser comparado e logo após o valor são adicionado 2 pontos (:) dando inicio a clausula Após os 2 pontos o bloco de código que devera ser executado para aquela cláusula
Finalizamos a cláusula com o break Caso tenhamos 2 ou mais valores que executarão o mesmo bloco de código não definimos o break apenas no ultimo em que for inserido o bloco de código, ver o exemplo anterior Após todas as cláusulas podemos adicionar uma cláusula default que será executada caso todas as outras não tenham sido verdadeiras A cláusula default não necessita de break, afinal ela é inserida após todas as outras
Operador ternário O operador ternário basicamente é uma forma de escrever uma instrução if e else em uma única linha. Para utilizamos o operador ternário utilizamos o ? e o :. Observe um exemplo utilizando if e else:
<?php $resultado = 7.5; if ( $resultado > 7 ){
echo 'Aprovado'; } else { echo 'Reprovado'; } ?> Um exemplo bem simples apenas para ilustrar, afinal if e else já aprendemos. Agora o mesmo código poderia ser transcrito com o operador ternário. Observe: <?php $resultado = 7.5; echo $resultado > 7 ? 'Aprovado' : 'Reprovado'; ?> Resolvemos o mesmo problema em apenas uma linha. O que vem seguido do ? representa o if enquanto o : representa o else. Também podemos fazer atribuições utilizando o operador ternário. Observe: <?php $resultado = 7.5; $mensagem = $resultado > 7 ? 'Aprovado' : 'Reprovado'; echo $mensagem; ?> Agora a nossa variável $mensagem recebe o valor de acordo com o resultado utilizando do operador ternário. Não utilize o operador ternário para substituir sempre as estruturasif e else. O operador ternário deve ser utilizado quando o retorno e a lógica implementada for algo pequeno. Por isso cabe ao desenvolvedor analisar se vale a pena substituir uma instrução if e else por um operador ternário ou vice e versa. Pense na legibilidade, pois seu código pode ser lido futuramente por outra pessoa na situação o que seria mais fácil de ler?
Em relação ao operador ternário: Equivale a um if e else. No entanto seu uso deve ser ponderado como pode ser lido anteriormente. A expressão a ser avaliada é declarada no inicio do operador O ? inicia o bloco que pode ser lido como o if O : inicia o bloco que pode ser lido como else. O valor retornado pode ser atribuído a uma variável.
Laços de repetição while e do while no PHP Criado em: 24/06/2010
Introdução Quando for necessário efetuar a repetição de um trecho de um programa um determinado número de vezes o que você faria? Escreveria de novo? Copiaria e colaria? Bem feio né? Afinal estamos utilizando de maquinas que são feitas para trabalhar para nos e não o contrario. Quando encontrarmos um problema como o apresentado anteriormente temos os laços de repetição, também conhecidos como loopings ou laços malhas de repetição que poderão nos ajudar. Vamos a um problema para tentarmos resolver:
Problema Bart Simpson ficou novamente na detenção no final da aula. E como punição terá que escrever: “Estou aprendendo loopings no Aprender PHP” 100 vezes no quadro, ou no nosso caso na tela.
Com o conhecimento que aprendemos até aqui faríamos algo como:
<?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; echo $mensagem . '<br />' . PHP_EOL ; echo $mensagem . '<br />' . PHP_EOL ; echo $mensagem . '<br />' . PHP_EOL ; ?> Até repetirmos 100 vezes. O que não é muito inteligente né? Vamos conhecer agora a nossa primeira estrutura de repetição, o while. O while no PHP O while executa um teste lógico, que retorne verdadeiro ou falso, no inicio do looping para verificar se é permitido ou não executar as instruções. Traduzindo while para português obtemos “enquanto” sendo assim as instruções serão executadas enquanto o teste do looping for considerado verdadeiro. A estrutura while tem seu funcionamento controlado por decisões podendo executar um determinado conjunto de instruções enquanto a condição for verdadeira (True) e no momento em que a condição for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping. Se desde o inicio a condição for tratada como falsa o looping não será executado. Diagrama de blocos Observe como seria a representação do problema de Bart Simpson utilizando o while.
Não temos nenhum símbolo novo no nosso diagrama. Iniciamos com 2 blocos de processamento de dados, um para o criarmos a mensagem e outro para criar o contador, $i, saberá mais sobre o contador abaixo. Em seguida criamos um símbolo de decisão, o losango. Se contador for menor que 100 o bloco dentro do looping será executado que consiste em imprimir os dados na tela e incrementar em 1 o contador e voltar ao inicio do looping. Quando o contador for maior que 100 encerrasse o looping.
No PHP Observe como ficaria a representação em PHP da nossa estrutura while para resolver o problema de Bart Simpson. E como Bart demorou muito ele ainda teve que numerar para termos certeza que ele escreveu às 100 vezes. Observe o código: <?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 1; while( $i <= 100 ){ echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; $i++; } ?>
Iniciamos atribuindo um valor a variável mensagem em seguida criamos uma variável $i que é conhecida como contador ou sentinela. Logo abaixo de nosso contador iniciamos o while que avalia se $i é menor que 100, se for verdadeiro ele executa a instrução se não ele sai do looping. A primeira volta de nosso looping a instrução é verdadeira então dentro do looping escrevemos a mensagem e somamos mais 1 a variável $i com o operador de pós incremento. Após terminar isto o looping volta e avalia $i aqui com o valor de 2 e se for verdadeira a expressão do while inicia tudo novamente.
Você sabe o porquê do $i no nosso looping? A utilidade dele ali é fazer em um momento a expressão se tornar falsa senão teremos um looping infinito. Como o nosso while avalia se $i é menor que 100 se sempre ele for menor que 100 o
looping nunca parará, por isso que temos que incrementá-lo para poder uma hora ele chegar ao valor em que a instrução se tornará falsa. Observe o código em que não incrementamos o $i antes de sairmos do looping. Execute e rapidamente pause a execução do browser, pois como isto nunca terá fim seu browser vai ir ficando bem lento e podendo até travar. Se não quiser testar o resultado será “1 - Estou aprendendo loopings no Aprender PHP” infinitamente um por linha.
<?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 1; while( $i <= 100 ){ echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; } ?>
Observe agora o mesmo exemplo de Bart Simpson escrevendo de 1 a 100, no entanto agora ele escrevendo os números em ordem decrescente.
<?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 100; while( $i >= 1 ){ echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; $i--; } ?> Veja que alteramos apenas a lógica agora iniciamos o $i com 100 e executamos o looping enquanto $i for maior ou igual a 1 e a cada volta do
looping diminuímos um para que em um momento termos $i com o valor de 1 e encerrarmos o looping. Em relação à estrutura de controle while:
A expressão a ser avaliada é declarada no inicio do while Expressões são realizadas por operadores lógicos e operadores de comparação O looping é executado enquanto a condição da expressão for verdadeira (True) Quando a condição da expressão for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping O bloco de código referente ao looping deve ser delimitado por chaves {} Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços Utilizamos um contador para o looping não ficar um looping infinito Declara-se o contador fora do looping Não se esqueça de alterar o valor do contador para não cairmos em um looping infinito.
O do-while no PHP Bastante parecido com o while o do-while caracteriza-se por uma estrutura que executa um teste lógico no fim do looping. Tem seu funcionamento baseado em decisões assim como o while, no entanto pelo menos uma vez será executado o conjunto de instruções, pois a condição da validade, verdadeiro ou falso, é avaliado no final.
Problema Continuaremos o mesmo problema de Bart Simpson, no entanto agora utilizando o do-while.
Diagrama de blocos
Veja como seria a representação do mesmo problema de Bart, no entanto agora utilizando o do-while.
Basicamente o mesmo diagrama de blocos do feito anteriormente para o while, no entanto observe que a expressão é avaliada no final, se for verdadeira a expressão escrevemos a mensagem e incrementamos em 1 o contador se for falsa saímos do looping.
No PHP Observe como ficaria a representação em PHP da solução do problema de Bart Simpson agora com o uso do do-while. <?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 1; do { echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; $i++; } while( $i <= 100 ); ?> Você observou que temos todos os elementos que tínhamos no while né? O contador, incrementar o contador, uma expressão. No entanto agora temos o “do” que quer dizer que pelo menos uma vez será executado mesmo que a condição na expressão seja avaliada como falsa, lembrando que assim como o while o do-while é executado enquanto a expressão for verdadeira, observe abaixo onde Bart muito esperto alterou seu contador para dizer ao diretor que já havia escrito 150 vezes. <?php $mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 150; do { echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; $i++; } while( $i <= 100 ); ?> Veja que mesmo a expressão sendo falsa, 150 não é menor nem igual a 100, o looping foi executado pelo menos uma vez, pois a avaliação da expressão é feita no final. Agora veja com o while o que ocorreria.
<?php
$mensagem = "Estou aprendendo loopings no Aprender PHP"; $i = 150; while ( $i <= 100 ) { echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; $i++; } ?> Como no while a expressão é avaliada no começo, o looping não foi executado nenhuma vez. Já no do-while como a expressão só é avaliada no final pelo menos uma vez o looping será executado.
Em relação à estrutura de controle do- while:
A expressão a ser avaliada é declarada no final do do-while
É garantido que pelo menos uma vez o looping será executado devido à dica anterior
Expressões são realizadas por operadores lógicos e operadores de comparação O looping é executado enquanto a condição da expressão for verdadeira (True)
Quando a condição da expressão for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping
O bloco de código referente ao looping deve ser delimitado por chaves {}
Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
Utilizamos um contador para o looping não ficar um looping infinito
Declara-se o contador fora do looping Não se esqueça de alterar o valor do contador para não cairmos em um looping infinito.
O loop for, as estruturas de controle aninhadas, o break e o continue no PHP
Introdução No artigo anterior aprendemos como utilizar os laços de repetição while e do while no PHP para realizarmos rotinas que deviam ser executadas um certo numero de vezes. Porém existe uma possibilidade de facilitar o uso de contadores finitos, sem utilizarmos o uso do while e do do while. E está possibilidade é o que veremos agora com a estrutura de controle for. Problema Vamos continuar com o mesmo problema do artigo anterior sobre while e do while para quem não se lembra do problema: Bart Simpson ficou novamente na detenção no final da aula. E como punição terá que escrever: “Estou aprendendo loopings no Aprender PHP” 100 vezes no quadro, ou no nosso caso na tela.
Sabemos que com o while e o do while podemos resolver este problema facilmente, no entanto agora vamos ver uma abordagem diferente com o uso do looping for.
O looping for no PHP Assim como o while e o do-while o for é uma estrutura de controle responsável pela realização de loopings no PHP.
O comando for aceita 3 expressões na sua declaração sendo elas:
Expressão que é avaliada apenas uma vez na primeira iteração, volta, do looping. Geralmente a utilizamos para iniciar a nossa variável de controle, contador, como por exemplo $i = 1. Expressão que é avaliada no inicio de cada iteração do looping, e caso retorne falso, o looping for será encerrado. A segunda expressão como você pode ver pode ser considerada a condicional do nosso looping, assim como tínhamos no while e no do while. Um exemplo seria $i <= 100.
Expressão que é avaliada no final de cada iteração do looping, normalmente utilizada para alterar o valor da variável de controle. Como por exemplo utilizar o operador de incremento $i++.
Diagrama de bloco Observe como seria a representação do problema de Bart Simpson utilizando o for.
Iniciamos com o bloco de processamento de dados que já é conhecido nosso para criarmos a mensagem que vai ser exibida e atribuímos o valor a variável $mensagem. Em seguida para representarmos o loop utilizamos o símbolo denominado Processamento predefinido ou Preparação com os valores da expressão do for o inicio, meio e fim, que foram apresentados a você no tópico anterior. Também utilizamos as setas para indicar o processamento e as letras
S e N em que S representa o caminho a ser seguido caso a condição seja verdadeira e N caso a condição seja falsa.
No PHP Agora vejamos como seria a representação em PHP da nossa estrutura de controle for para resolvermos o problema de Bart Simpson.
<?php $mensagem = 'Estou aprendendo loopings no Aprender PHP'; for( $i = 1; $i <= 100; $i++ ){ echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ; } ?> Como você pode observar diferentemente do while e do do-while não necessitamos incrementar o contador dentro do nosso looping pois isto já fica implícito na própria declaração do for. E detalhe que o separador de instruções, expressões, no for é o ;(ponto e virgula). Em relação à estrutura de controle for:
Declara-se 3 expressões no inicio do for Sendo a 1ª expressão avaliada apenas uma vez. Normalmente utilizada para criação da variável de controle. 2ª expressão é avaliada no inicio de cada iteração, caso esta expressão retorne falso o looping é encerrado. Podendo ser considerada a condicional do for. 3ª Expressão é avaliada no final de cada iteração, normalmente utilizada para alterar o valor da variável de controle. Separa-se as expressões utilizando o ;(ponto e virgula). O looping é executado enquanto a condição da 2ª expressão for verdadeira (True) Quando a condição da 2ª expressão for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping O bloco de código referente ao looping deve ser delimitado por chaves {} Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços Utilizamos um contador para o looping não ficar um looping infinito, este declarado na 1ª expressão Não se esqueça de alterar o valor do contador, na 3ª expressão, para não cairmos em um looping infinito.
Estruturas de controle aninhadas Antes de continuarmos com as estruturas de controle break e continue devemos saber um conceito importante as estruturas de controle aninhadas.
Também conhecido como desvio condicional encadeado, as estruturas de controle aninhadas são utilizadas em casos em que é necessário estabelecer verificações de condições sucessivas, ou seja, condições dentro de condições. Este tipo de estrutura pode possuir diversos níveis de condições aninhadas. Vamos a um exemplo.
Problema Como acabamos de aprender o looping for utilizaremos ele neste exemplo. Nosso problema é o seguinte:
criar um programa que escreve de 1 a 100 imprimir todos os números ao lado de todos os número mostrar se o número é par ou impar Diagrama de bloco Observe como seria no diagrama de blocos a resolução do nosso problema.
Como você deve ter observado não possuímos nenhum símbolo novo no nosso diagrama de blocos. Iniciamos a resolução do nosso problema com o símbolo denominado Processamento predefinido ou Preparação para representarmos o looping for, onde inserimos a sua lógica. Caso o for retorne falso o processamento é encerrado e nada é exibido. Caso retorne verdadeiro iniciamos o looping e nos deparamos com uma estrutura aninha que é representada por um símbolo de decisão, o losango. No símbolo de decisão a lógica é avaliada, caso o valor retornado seja verdadeiro exibe o número e diz que é par, caso retorne falso o número é exibido e diz-se que é impar. Após exibirmos o valor utilizamos o pequeno circulo, o conector, que foi utilizado para conectar as condições e todas levarem para um mesmo destino, o inicio do looping for.
No PHP Agora vamos ver no PHP como ficaria no PHP a representação do diagrama de blocos anterior. <?php for( $i = 1; $i <= 100; $i++ ){ if ( $i % 2 == 0 ){ echo $i . ' é par ' . '<br />' . PHP_EOL; } else { echo $i . ' é impar ' . '<br />' . PHP_EOL; } } ?> Inicialmente o mesmo looping for que aprendemos, no entanto observe que dentro do looping surgiu uma condicional if que é a nossa estrutura de controle aninhada, pois se encontra dentro do looping for.
A nossa lógica do if é: se $i módulo de 2 for igual a zero retorna verdadeiro caso contrário falso. Ou seja se dividir $i por 2 e não houver resto significa que $i é par se não é impar.
No PHP aninhando um pouco mais Agora que já temos o conceito de estruturas de controle aninhadas mostrarei mais um exemplo prático no PHP, com mais de um nível de aninhamento. Mostrarei direto no PHP, no entanto ele também pode ser representado no diagrama de blocos, não o representarei no diagrama de blocos, pois o conceito no diagrama de blocos foi explicado no exemplo anterior.
Problema Definir um número premiado entre 1 e 100 criar um programa que escreve de 1 a 100 imprimir todos os números Se o número for o premiado mostrar ele com um destaque e escrever que é o premiado ao lado de todos os número mostar se o número é par ou impar, exceto do número premiado
Veja como poderíamos resolver este problema no PHP: <?php $premiado = 77; for( $i = 1; $i <= 100; $i++ ){ if( $i == $premiado ){ echo '<strong>' . $i . ' é o número premiado ' . '</strong><br />' . PHP_EOL; } else { if ( $i % 2 == 0 ){ echo $i . ' é par ' . '<br />' . PHP_EOL; } else { echo $i . ' é impar ' . '<br />' . PHP_EOL; } } }
?>
Como você deve ter observado o programa é bem parecido com o anterior a diferença é que agora criei uma variável com o nome de $premiado que armazenará o número premiado. E dentro do looping for antes de verificar se é par ou impar, verifico primeiro se o número é o premiado, se for o exibo e escrevo que ele é premiado dentro de uma tag strong se não faço a mesma verificação anterior para ver se ele é par ou impar. Sendo assim a verificação de par ou impar foi aninhada por uma verificação para ver se é o número premiado ou não.
Se observar bem temos uma falha. Nada nos diz que o número premiado deve estar entre 1 e 100 sendo assim se a pessoa colocar um número maior que 100 não teremos nenhum premiado veja só um exemplo. <?php $premiado = 700; for( $i = 1; $i <= 100; $i++ ){ if( $i == $premiado ){ echo '<strong>' . $i . ' é o número premiado ' . '</strong><br />' . PHP_EOL; } else { if ( $i % 2 == 0 ){ echo $i . ' é par ' . '<br />' . PHP_EOL; } else { echo $i . ' é impar ' . '<br />' . PHP_EOL; } } } ?> Mais em nosso jogo por política da casa sempre teremos um vencedor. Sendo assim temos que limitar a escolha dos números entre 1 e 100. Abaixo como
limitar a escolha entre 1 e 100 mais antes de olhar o código pare um pouco aqui e tente resolver por si só. <?php $premiado = 77; if( $premiado < 100 ){ for( $i = 1; $i <= 100; $i++ ){ if( $i == $premiado ){
echo '<strong>' . $i . ' é o número premiado ' . '</strong><br />' . PHP_EOL; } else {
if ( $i % 2 == 0 ){
echo $i . ' é par ' . '<br />' . PHP_EOL;
} else {
echo $i . ' é impar ' . '<br />' . PHP_EOL; } } } } else { echo 'O número deve ser menor que 100'; } ?> Como você deve ter imaginado apenas aninhamos toda a nossa estrutura anterior em uma condicional, ou seja, antes de iniciar o looping para dizer qual o premiado, primeiro verificamos se o $premiado que foi passado é menor que
100 se for iniciamos o mesmo processo anterior se não retornamos uma mensagem dizendo que o número deve ser menor que 100. Em relação as estruturas de controle aninhadas:
Podem ser aninhadas as estruturas de controle como também os laços de repetições, loopings Não a limite de condições que podemos aninhar
No entanto o bom senso conta, não crie um aninhamento de por exemplo 10 níveis será difícil de entender quando for ver o código novamente
Se as estruturas aninhadas estiverem com uma grande quantidade de níveis tente rever sua lógica
Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
Cada estrutura aninhada também deve ser endentada em 4 espaços onde a sua estrutura pai terminou, veja nos exemplos anteriores
Break A instrução break é utilizada para encerrar a execução dos comandos for, foreach, falaremos deste posteriormente, while, do-while e switch. Permitindo que encerremos a instrução a qualquer momento que desejarmos, sendo assim podemos avaliar uma expressão e de acordo com o seu resultado encerrar a instrução.
Problema Utilizar o código criado anteriormente, no entanto agora ao chegar ao número premiado o looping é encerrado. No PHP Para resolvermos o problema com o conhecimento que possuímos até aqui sem o uso do break poderíamos simplesmente fazer do seguinte modo:
<?php $premiado = 77; if( $premiado < 100 ){
for( $i = 1; $i <= 100; $i++ ){ if( $i == $premiado ){ echo '<strong>' . $i . ' é o número premiado ' . '</strong><br />' . PHP_EOL; $i = 100; } else { if ( $i % 2 == 0 ){ echo $i . ' é par ' . '<br />' . PHP_EOL; } else { echo $i . ' é impar ' . '<br />' . PHP_EOL; }
} } } else { echo 'O número deve ser menor que 100'; } ?>
Simplesmente fizemos a condição do looping retornar falso, para isso definimos $i com o valor de 100 pois a condição do looping dizia que ele operaria até $i for menor ou igual a 100.
Agora veja um exemplo de como podemos usar o break para resolver o mesmo problema. <?php $premiado = 77; if( $premiado < 100 ){ for( $i = 1; $i <= 100; $i++ ){ if( $i == $premiado ){ echo '<strong>' . $i . ' é o número premiado ' . '</strong><br />' . PHP_EOL; break;
} else { if ( $i % 2 == 0 ){ echo $i . ' é par ' . '<br />' . PHP_EOL; } else { echo $i . ' é impar ' . '<br />' . PHP_EOL; } } } } else { echo 'O número deve ser menor que 100'; }
?> Simplesmente substituímos à atribuição de um valor a $i para tornar a condição do looping falsa por uma instrução break. Sendo assim ao utilizar o break automaticamente o looping é encerrado e o processamento continua fora do looping.
Break e o seu valor opcional O break pode receber um valor opcional indicando quantos níveis devem ser encerrados, caso possua estruturas de controle aninhadas.
Problema Programa que escreva de 1 a 100 E abaixo de cada número exiba a frase “Contando...” e os 5 próximos números E quando o número da contagem for igual a 7 parar todo o processamento No PHP Veja como poderíamos resolver este problema
<?php for( $i = 1; $i <= 100; $i++ ){ echo '<br />' . $i . '<br />' . PHP_EOL; for( $j = $i + 1; $j <= $i + 5; $j++ ){ if( $j != $i + 5 ){ echo $j . ', '; } else { echo $j; } if($j == 7){ break 2; } } } ?>
Primeiro criamos um for para mostra os números de 1 a 100 e a frase “Contando...”, dentro deste looping criamos outro looping for, observe que neste utilizamos como contador $j que possui o valor de $i + 1 e como é para mostrar os 5 números próximos a partir do número antes do contando utilizamos o valor $i + 5 e incrementamos $j. Utilizamos $i para atribuir os valores a $j devido a $i ser trocado em toda volta sendo assim sempre teremos $j dinâmico de acordo com o valor de $i. Dentro do looping possuímos um if que verifica se não é a ultima volta do looping se não for coloca virgula quando for a ultima não coloca a virgula. E o outro if é quando verificamos se $j é igual a 7 se for utilizamos break 2. Utilizamos o break com o valor de 2 dizendo para ele encerrar 2 níveis, sendo primeiro o looping de $j e depois o looping de $i.
Observe como seria se utilizássemos apenas o break. <?php for( $i = 1; $i <= 100; $i++ ){ echo '<br />' . $i . '<br />' . PHP_EOL; echo 'Contando...'; for( $j = $i + 1; $j <= $i + 5; $j++ ){ if( $j != $i + 5 ){ echo $j . ', '; } else { echo $j; } if($j == 7){ break; } } } ?> Conseguimos encerrar o looping de $j quando fosse o valor 7 no entanto observe que o looping de $i é executado. Está é a utilidade de adicionar um
valor ao break, pois assim você consegue encerrar quantos níveis forem necessários passando o valor para o break. Continue Bastante parecido com o break, a instrução continue permite que a execução do looping seja alterada, no entanto não encerramos o looping, apenas encerramos a iteração, volta do looping, atual e iniciamos a próxima.
Problema Um looping for, predefinido terá que ser utilizado, este looping exibe os números de 1 a 100. Dentro deste looping exiba apenas os números pares No PHP Veja a nossa possível solução para este problema no PHP.
<?php for( $i = 1; $i <= 100; $i++ ){ if( $i % 2 != 0 ){ continue; } echo $i . '<br />' . PHP_EOL; } ?> Mantemos o looping do problema e dentro dele criamos um if em que se módulo de $i não for igual a 0, ou seja não é par, utilizamos o continue para irmos para próxima volta do looping.
Continue e o seu valor opcional Assim como o break o continue também pode receber um valor opcional indicando quantos níveis devem ser encerrados. Lembrando que deve possuir estruturas de controle aninhadas.
Problema Programa que escreva de 1 a 100 E abaixo de cada número exiba a frase “Contando...” e os 5 próximos números Quando o número da contagem for igual a sete ele deve ser ignorado, se houver mais números depois dele não deve ser exibido também No PHP:
Veja como poderíamos resolver este problema: <?php for( $i = 1; $i <= 100; $i++ ){ echo '<br />' . $i . '<br />' . PHP_EOL; echo 'Contando...'; for( $j = $i + 1; $j <= $i + 5; $j++ ){ if( $j == 7 ){ continue 2;
}
if( $j != $i + 5 ){
echo $j . ', ';
} else {
echo $j;
}
}
}
?>
Como você pode ver a lógica é a mesma que utilizamos no break 2, no entanto observe que usamos o continue com o valor 2. Sendo assim sempre que houver um 7 na contagem saímos do segundo looping e iniciamos no primeiro looping.
Observe como seria se utilizássemos apenas o continue:
<?php for( $i = 1; $i <= 100; $i++ ){ echo '<br />' . $i . '<br />' . PHP_EOL; echo 'Contando...'; for( $j = $i + 1; $j <= $i + 5; $j++ ){ if( $j == 7 ){ continue; } if( $j != $i + 5 ){ echo $j . ', '; } else { echo $j; }
} } ?> Encerramos a iteração, a volta, do looping de $j quando o valor fosse igual a 7 no entanto retornamos para o looping de $j já com o valor do continue conseguimos encerrar quantos níveis forem necessários. Em relação ao continue: É utilizado nos comandos for, foreach, falaremos deste posteriormente,while, dowhile e switch. Sua função é finalizar uma iteração, volta, das citadas anteriormente.
Pode receber um valor adicional indicando quantos níveis o continue deve considerar para encerrar a iteração. Para o continue receber um valor adicional o mesmo deve está dentro de uma estrutura aninhada