Comando While em C
Nesta aula nós vamos aprender uma nova estrutura de repetição muito utilizada na programação que é a estrutura de repetição “while”, e essa estrutura, se nós traduzimos literalmente do inglês para o português, ela significa enquanto, ou seja, enquanto alguma coisa acontecer, ou enquanto algum teste for verdadeiro, a gente vai repetir um determinado trecho de código.
Então é exatamente isso que a estrutura while faz, perceba, ela repete um determinado trecho de código enquanto uma condição for verdadeira.
Então perceba, a gente vai ter um teste, enquanto esse teste for verdadeiro a gente vai executar um determinado trecho de código.
Vamos entender em mais detalhes o que isso significa; olha só, a estrutura while, ela é representada, ela escrita dessa forma; observe, temos aqui a palavra reservada while, que significa enquanto, nós abrimos aqui um par de parênteses e aqui nós colocamos então o nosso teste.
Perceba que esse teste, eu posso utilizar aqui dentro os meus operadores, tanto relacionais quanto lógicos, olha só, eu posso ter o sinal de maior, eu posso ter o maior ou igual, eu posso ter o menor, eu posso ter o menor ou igual; eu também posso usar os operadores lógicos, o operador OU e operador lógico E.
Então nós podemos utilizar todos esses operadores aqui dentro para fazermos vários testes, não precisa ser apenas um; então eu posso ter, por exemplo, algo desse tipo, olha só, eu posso ter aqui teste um ou posso ter aqui teste dois, e eu posso ter aqui agora um E, então perceba, eu posso ir juntando vários testes aqui dentro, e aí eu tenho que olhar sempre para o resultado final; lembra da nossa tabelinha Verdade para os operadores OU e E, verdadeiro com verdadeiro no OU ou, se um deles for verdadeiro no OU, o resultado desses dois testes será verdadeiro e aí junta com E, então eu tenho que ir juntando esses resultados para ver qual vai ser o meu resultado final.
Feito isso eu abro aqui um par de chaves, fecho esse par de chaves aqui abaixo, e aqui dentro vem o trecho de código que será repetido.
Então, enquanto esse teste for verdadeiro, eu vou repetir o trecho de código que nós temos aqui.
Vamos ver um exemplo prático para a gente realmente entender esse funcionamento.
Eu tenho aqui agora um exemplo já em código C, e aí vamos observar alguns detalhes.
Olha só, tenho aqui uma variável do tipo
inteiro, chamada valor que recebe menos um, eu estou inicializando a minha variável com esse valor menos um.
Perceba que aqui, neste trecho, nós temos a nossa estrutura while, ou seja, enquanto valor for menor ou igual a zero, eu quero fazer isso aqui, olha só, eu tenho aqui dentro duas instruções, eu quero fazer um printf “digite um valor maior que zero” e eu quero ler esse valor para a nossa variável valor.
Quando executa essa linha aqui o que acontece?
A gente volta para cima, porque eu acabei de ler um valor para a nossa variável valor; então eu preciso testar novamente se esse valor satisfaz essa condição.
Se novamente o usuário digitar um valor menor ou igual a zero, novamente ele vai fazer isso aqui, vai pedir um valor, vai ler um valor e vai voltar para instrução while e aí, quando o usuário digita um valor que não satisfaz essa condição, por exemplo, o valor cinco, cinco é menor ou igual a zero?
Dá falso, se deu falso ele finaliza, ele quebra a nossa repetição e vai fazer o que está após a repetição que, nesse caso aqui, é imprimir o valor que foi lido, que foi digitado para variável valor.
Tem dois pontos extremamente importantes aqui que a gente precisa prestar muita atenção, olha só, primeiro por que eu inicializei a minha variável valor com menos um?
Porque aqui para o meu contexto, o menos um é um valor inválido, o que significa isso, significa que esse teste vai ser verdadeiro na primeira vez, olha só, menos um vem para ele, menos um é menor ou igual a zero?
verdadeiro, ele é menor do que zero, então eu sei que ele vai entrar aqui na instrução while pelo menos uma vez.
Se eu inicializasse a minha variável, por exemplo, com dez, ele já ia passar direto, por quê?
Dez é menor ou igual a zero?
Falso, e aí ele não ia pedir para o usuário digitar um valor maior que zero ele já ia passar direto, então nesse caso eu inicializo a variável com o valor inválido para garantir que ele vai entrar aqui pelo menos uma vez.
O segundo ponto extremamente importante é este aqui, olha só, perceba que eu peço para o usuário o valor e eu leio esse valor para minha variável valor, por que para minha variável valor?
É a variável que estou testando, é ela que está aqui; se eu não alterar aqui dentro do while, se eu não alterar em nenhum momento o valor, o conteúdo dessa variável, nós teremos um loop infinito.
Imagine, por exemplo, que não fosse lido aqui para a variável valor, imagine que fosse lido para variável num e que a gente tivesse aqui a criação de uma variável chamada num, que não recebeu nenhum valor.
Olha o que acontece, valor é menor igual zero?
Verdadeiro porque foi inicializada com menos um; então ele vai pedir para o usuário digitar um valor maior que zero, eu leio esse valor e salvo na variável num.
Quando eu volto para testar novamente, olha só, eu estou testando a variável valor e em nenhum momento a variável valor sofreu alteração, então a gente vai ter um loop infinito, então eu testo valor, mas leio para num, isso aqui vai gerar um loop infinito.
Peste bastante atenção nestes detalhes, ok?!?
A variável que você testa, ela precisa sofrer alguma alteração aqui dentro para voltar, testar novamente e em algum momento quebrar a nossa repetição.
Agora, para a gente realmente entender esse funcionamento e ver esse funcionamento na prática, vamos no Code Blocks testar esse exemplo aqui?
Eu estou aqui no Code Blocks, eu tenho aqui exatamente aquele exemplo, a diferença é que eu não inicializei a variável valor com menos um, eu inicializei com zero, por quê?
Porque o zero, neste contexto, também é um valor inválido, olha só, o valor é menor ou igual a zero?
Sim, igual a zero, então ele vai entrar, observe que a gente tem aqui um par de chaves, ele vai entrar na nossa estrutura de repetição while, vai executar a função printf pedindo para o usuário digitar um valor maior que zero, vai ler esse valor e salvar na nossa variável valor, e em seguida da linha dez, ele vai voltar para a linha sete e vai testar de novo, valor é menor ou igual a zero?
Enquanto ele for menor ou igual a zero, ele vai ficar nesse laço, nessa repetição aqui, ou nesse loop, como normalmente dizemos em programação.
Somente quando o usuário digitar um valor que não satisfaça, que não seja menor ou igual a zero, então esse while vai ser quebrado e ele vai executar então o que está após a repetição.
Vamos testar aqui o nosso programa?
Eu vou compilar e executar aqui o programa; pronto!
Temos aqui a mensagem “digite um valor maior que zero” olha o que vai acontecer, eu vou digitar zero e vou pressionar entre.
Ele pediu novamente, por quê?
Ele imprimiu essa frase, Eu digitei o valor zero e pressione enter, ele voltou e testou, zero é menor ou igual a zero?
Verdadeiro, então ele entrou e fez esse trecho de novo.
Se eu digitar menos dois, perceba, enquanto eu digitar valores que satisfaçam essa condição, ele vai continuar na repetição.
Então agora a gente consegue garantir que o usuário vai digitar um valor válido, por quê?
Essa repetição apenas será quebrada quando eu digitar um valor maior que zero.
Olha só, eu vou digitar um, vou pressionar enter, e agora o nosso programa finalizou, porque eu digitei o valor um, e um não satisfaz a condição.
Um é menor ou igual a zero?
Falso, então ele quebra a nossa repetição e faz o que está a seguir, ele continua a execução do nosso programa.
Nesse caso, ele apenas imprime aqui o valor digitado e finaliza o nosso programa.