Quaddro + MacMagazine: programando em C — repetidores WHILE e DO WHILE – MacMagazine
26/05/2013 • 13:54
Após o trabalho com FOR no texto passado, agora vamos estudar outras duas estruturas de repetição: WHILE e DO WHILE. Elas complementam esse trabalho e em algumas situações são mais práticas do que o próprio FOR.
Conhecer a estrutura de repetição FOR.
♫ Dream is Collapsing, do álbum "Inception" ♪
O repetidor WHILE tem a mesma proposta do FOR, ou seja, executar um bloco de código com repetições controladas. A diferença é sua sintaxe e, consequentemente, a forma de definir a condição de limite.
Como já vimos boa parte dos conceitos de repetidores no último texto, vou passar os conceitos novos já em um exercício prático.
Prática – WHILE
Criem um novo projeto com o nome Repetidor_While e definam a sintaxe e implementação a seguir:
Ao analisar esse código, percebemos duas diferenças principais em relação ao FOR. A primeira é que a declaração do valor não é feita dentro do repetidor — notem a variável sendo declarada antes. A segunda diferença é que o incremento de valor também não faz parte da sintaxe de declaração, ele precisa ser definido em algum trecho do corpo do seu código.
Isso nos leva a um perigo imenso, pois, uma vez que o incremento não faz parte da declaradação, é muito fácil esquecer de defini-lo. O nosso código tem apenas dois comandos dentro do corpo do WHILE, mas em uma situação de sistema poderíamos ter dezenas.
Toda vez que ministro treinamentos na Quaddro eu passo uma dica que ajuda a minimizar essas chances: fechem "escopos" logo no começo. A ideia é que se você começa algo que precisa ser "fechado", faça isso logo. Por exemplo, em Objective-C teremos chamadas de métodos com colchetes, então, se você abrir colchetes, logo na sequência já os feche. Mesma ideia para um WHILE: se ele vai conter o incremento de limite, faça-o logo!
Por mais simples que essa dica pareça ela evita uma série de problemas, pois se você abre uma chamada de método ou um WHILE, "manda bala" no código e vai planejando a lógica ao mesmo tempo, esquecer de fechar ou incrementar alguma coisa é muito fácil!
Aí, você pensa: "Danilo, não deve ter problema esquecer o incremento no WHILE?" Minha resposta: "Abraça!" Lembra do texto passado, quando criamos um loop infinito alterando o incremento no FOR?! Pois bem, lá, essa ação é explicita porque a definição de incremento faz parte da sintaxe de declaração. Já no WHILE, como podemos fazê-lo em qualquer lugar, para ele se perder no meio do código é fácil — e assim fica simples criar um loop infinito, mesmo que sem querer.
Faça um teste de execução desse nosso código comentando ou apagando a linha do incremento do valor. Seu código rodará para sempre com a variável valendo 0 e, dessa forma, o limite do WHILE nunca chegará. *Cuidado*!
Após o alerta, fica a conclusão de que o WHILE tem uma proposta parecida com a do FOR, porém tem suas peculiaridades. Assim como IF e SWITCH podem se equivaler em alguns momentos, FOR e WHILE também podem ser usados em diversas situações parecidas. Em alguns casos o FOR é mais prático; em outros, é o WHILE. Mas lembrem-se sempre de analisar a necessidade antes de escrever o código. Se tem gente que prefere um IF e usa pouco o SWITCH, no caso de repetidores é pior ainda. Conheço gente que evita ao máximo um WHILE por preferir um FOR. Programação é lógica pessoal, não deixe a emoção te guiar (pelo menos não sempre…).
Prática – DO WHILE
Uma vez que nós tenhamos visto o WHILE, temos como mexer agora com o DO WHILE. E para separar estudos, códigos e comentários, vou a um novo projeto chamado Do_While, porém, deixem o projeto WHILE aberto para fazermos alguns testes e comparações.
A imagem abaixo ilustra a sintaxe e declaração de um DO WHILE:
A proposta do código é a mesma, porém um olhar atento em comparação ao WHILE de antes irá perceber a diferença entre as duas estruturas. Ajustem as telas de seus projetos do Xcode para tentar deixá-las lado a lado. Notem que no caso do WHILE o sistema primeiro verifica se a condição de limite é verdadeira e, caso seja, roda o código. Já no DO WHILE a proposta é inversa, pois o bloco de código roda uma vez antes de fazer a pergunta do limite.
Um teste para deixar isso claro é definir o limite como falso e, para isso, alterem a variável valor para 10 nos dois projetos. Rodem primeiro o WHILE e percebam que nada é exibido no console. Como ele pergunta primeiro e, nesse caso, a resposta é falsa, o bloco de códigos não roda nenhuma vez. Já no projeto DO WHILE, mesmo com a condição sendo falsa, o bloco de códigos roda pelo menos uma vez.
Essa diferença aos olhos dos iniciantes soa estranha, mas em algumas situações é prático ter o código executado antes da condição. Um bom exemplo é um menu de escolha de opções. Primeiro é exibida a listagem e, com base no que o usuário digitar, o caminho da execução é definido.
Poderíamos começar a mexer com funções de entrada de dados (scanf e afins), mas não quero esticar esse estudo de "C" para além do básico necessário — até porque imagino que vocês queiram entrar em "Objective-C" logo, não é?! 😛
Como sempre a melhor forma de fixar essas ideias é com prática e mais prática, então vamos aos desafios da semana.
» DESAFIO 1: 10 TABUADAS
Você deve criar uma estrutura que exiba as tabuadas de 1 ao 10. Isso quer dizer que será feita uma repetição para percorrer cada número e, dentro dessa repetição, teremos outra para calcular a tabuada em questão. A ideia é usar um repetidor dentro do outro. Mesclem mais de um tipo para potencializar o estudo.
» DESAFIO 2: TABELA ASCII
Antes, um conceito sobre código ASCII.
Você já parou para pensar como é que o computador consegue entender qual tecla você pressionou para exibir uma letra na tela? A resposta é o famoso código ASCII. Toda tecla do seu teclado possui um código numérico, o qual é enviado para o sistema traduzir o número em letra ou símbolo. Isso quer dizer, de maneira resumida, que toda letra na verdade é um numero dentro da tabela ASCII.
E esse é o gancho para esse segundo desafio. Vocês vão exibir uma tabela com todos os caracteres imprimíveis da tabela ASCII.
Link da Wikipédia com uma tabela ASCII onde vocês podem conferir os números e seus caracteres.
A faixa imprimível vai de 32 a 126.
Se você exibir em um printf do número 65 com %i, ele será exibido como número. Se você exibir o mesmo número 65 usando o %c, ele será exibido como o caractere A.
Depois destas dicas, você deve criar uma estrutura WHILE para exibir todos os caracteres dentro desse intervalo. Mas para temperar um pouco mais essa receita, eu quero que a exibição final seja feita com cinco colunas. Isso quer dizer que a cada cinco caracteres você deve implementar uma quebra de linha. 😛
Aos iniciantes, fica o comentário sincero de que, no começo, estruturas de repetições não são fáceis de entender logo de cara, por isso, quanto mais código e testes vocês fizerem, melhor!
O primeiro desafio é relativamente tranquilo, já o segundo é um pouco mais chato. Então tenham calma, rabisquem e testem o quanto precisar e lembrem-se de usar o post oficial no fórum da Quaddro para suas dúvidas e postagens de resultados.