Baixe o app para aproveitar ainda mais
Prévia do material em texto
17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 1/27 Disciplina: Linguagem de Programação I Aula 5: Os códigos vão ficar menores - chegaram as estruturas de repetição Introdução Em muitas situações de nossas vidas, repetimos, com frequência, certas rotinas. Às vezes, elas são tão importantes que algumas pessoas as descrevem para que possam ser executadas, igualmente, por outros. Algumas rotinas têm um número de repetições conhecido, mas outras não. Por exemplo, imagine que dois amigos tomaram a decisão de viajar no final do ano para Florianópolis (SC). Cada um escolheu uma forma de guardar dinheiro: o primeiro depositou, todo mês, R$ 500,00 na caderneta de poupança, e o segundo, o valor que sobrou no final do mês. Assim, cumprindo com sua palavra, o primeiro fez 12 depósitos e guardou R$ 6.000,00 ao final de um ano. Mas não podemos afirmar quantos depósitos o segundo realizou nem o total que guardou. O fato é que, se ele também cumpriu com sua palavra, poupou dinheiro continuamente. Essas são duas formas diferentes de repetição. Nesta aula, estudaremos as rotinas de repetição e aprenderemos a escolher a mais adequada para cada situação. Vamos lá? Objetivos Reconhecer as três estruturas de repetição usadas para construir programas; Construir programas usando as estruturas de repetição; 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 2/27 Aninhar estruturas de repetição. 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 3/27 Abordagens Iniciais Falar sobre as estruturas de repetição é algo apaixonante, principalmente, para quem começou a programar usando o lendário goto que combinado, principalmente, com o if simulava todas as estruturas de repetição que iremos estudar nesta aula. A paixão por uma estrutura de repetição se assemelha com a de um time de futebol. Tem programadores que são fiéis a uma estrutura e como não desejamos criar polêmica, não iremos aqui defender nem uma das 3, mas mostraremos as vantagens/desvantagens de cada uma e você, temos certeza, saberá fazer a escolha certa no momento certo. As 3 estruturas de repetição Como já mencionamos, existem 3 tipos. São eles: For Estrutura ideal para quando o número de repetições for conhecido durante a elaboração do programa ou quando o usuário puder fornecê-lo durante a execução. Na linguagem C, essa estrutura recebe o nome de for e, diferentemente de outras linguagens, simula com facilidade as estruturas while e do... while como veremos mais adiante. Sua lógica é: repete enquanto a variável contadora não tiver ultrapassado seu valor final estipulado na estrutura. Como ela testa antes de executar o bloco, pode ser que nem execute o bloco se a condição, de início, for falsa. While 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 4/27 Estrutura que testa no início e é usada quando o número de repetições for desconhecido. Simula, com facilidade a estrutura do... while e a estrutura do for (desde que criemos uma variável que terá seu valor incrementado/decrementado dentro da estrutura de repetição). Sua lógica é: repete enquanto a condição for verdadeira. Como ela testa antes de executar o bloco, pode ser que nem execute o bloco se a condição, de início, for falsa. Do... while Estrutura usada quando o número de repetições for desconhecido. Sua diferença em relação à estrutura while é que ela testa ao final, significando que executa o bloco de comandos pelo menos uma vez. Essa estrutura também precisa de um teste para interromper a repetição. É muito usada em programas que funcionam através de um menu. Sua lógica é: repete enquanto a condição for verdadeira, mas, como ela testa ao final, executa pelo menos uma vez o bloco, diferenciando-a da estrutura while. A lógica de construção de um trecho, usando nessa estrutura, é mais parecida com a estrutura do for, não precisando de leitura/atribuição antecedendo o do para entrar na estrutura, pois como já dissemos, testa ao final. Sintaxes For 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 5/27 for ( valor inicial ; expressão de teste ; incremento ) { Bloco de comandos } Você poderá usar sem nenhum parâmetro, mas os ; são obrigatórios. As chaves só serão obrigatórias se o bloco tiver mais de um comando. While while (condição) { Bloco de comandos } Na prática, a sintaxe é um pouco mais complexa e veremos isso mais adiante. Esse é o "lema" que você deve já começar a decorar: 1 2 3 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 6/27 Uma das funções de entrada de dados (ou um comando de atribuição) antes do... while para entrar na repetição e uma das funções de entrada de dados (ou um comando de atribuição antes de }, para repetir ou sair da repetição. O teste (condição) é uma expressão relacional/lógica semelhante as que nós usamos no comando if(){...}else{...}. As chaves só serão obrigatórias se o bloco tiver mais de um comando. Do... While do { Bloco de comandos } while (condição); Talvez seja a estrutura mais simples de se construir. O teste (condição) é uma expressão relacional/lógica semelhante as que nós usamos na estrutura if() {...}else{...}. Dica 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 7/27 Essas estruturas já foram ensinadas em outra disciplina com a linguagem C++ e, por essa linguagem ter compatibilidade com a linguagem C, você não terá nenhuma dificuldade em usá-las, pois elas são idênticas. Aprofundando o estudo sobre a estrutura de repetição for Começamos pela estrutura do for por achar que ela seja a de mais fácil compreensão e por ter muito mais recursos na linguagem C do que em suas antecessoras. Agora, vamos analisar o exemplo: #include <stdio.h> int main () { long long int matric; float media; printf(“\nMatricula: ”); scanf(“%Ld”, &matric); printf(“\Media: ”); scanf(“%f”, &media); printf(“\n%Ld\t%.1f ”, matric, media); printf(“\nMatricula: ”); scanf(“%Ld”, &matric); printf(“\Media: ”); scanf(“%f”, &media); printf(“\n%Ld\t%.1f ”, matric, media); printf(“\nMatricula: ”); scanf(“%Ld”, &matric); printf(“\Media: ”); scanf(“%f”, &media); 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 8/27 printf(“\n%Ld\t%.1f“, matric, media); printf(“\n”); } Observando o código, podemos pensar sobre a necessidade de utilizar uma estrutura de repetição. Claro que poderíamos copiar o grupo de 5 comandos e colá-lo mais 3 vezes, forçando uma repetição. Mas se tivéssemos que repetir 1000 vezes, você teria paciência para colar 999 vezes, mesmo agrupando? O código cresceria em tamanho, mas estaria fazendo pouca coisa, concorda? Observe na próxima tela, o uso da estrutura de repetição for envolvendo o bloco que se repete com um par de chaves e colocando a linha do for antes. Se precisarmos aumentar o número de repetições, teremos apenas que alterar o valor final do for. Simples assim: #include <stdio.h> int main () { long long int matric; float media; int c; for( c = 1; c <= 4; c++) { printf(“\n\nMatricula: ”); scanf(“%Ld”, &matric); printf(“\Media: ”); 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 9/27 scanf(“%f”, &media); printf(“\n\n%Ld\t%.1f”, matric, media); } printf(“\n”); Veja a saída:Essa saída você a obteria sem ou com a estrutura for. Experimente, digitando os códigos. Não se esqueça de pausar com system(“pause>NULL” ); No Ensino Médio, você aprendeu a construir Progressões Aritméticas de Progressões Geométricas. Pense nessa estrutura como uma PA ou uma PG. Atenção Observe que não existe ; depois dos parênteses da estrutura de repetição for. Fique atento porque isso acontece muitas vezes. Não há mensagem de erro, porque a repetição é finalizada ao encontrar o primeiro ; ou uma }. 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 10/27 Observe algumas linhas com essa estrutura: Linguagem C Equivalência for (c=1; c <=100; c++) PA com a1 = 1, an = 100 e r = 1 for (c=10; c >=1; c--) PA com a1 = 10, an = 1 e r = -1 for (c=10; c >=2; c=c-2) for (c=10; c >=2; c-=2) PA com a1 = 10, an = 2 e r = -2 for (c=2; c <=1024; c=c*2) for (c=5; c <=500; c*=2) PG com a1 = 2, an = 1024 e r = 2 Veja outro exemplo: #include <stdio.h> int main () { int num, c; for ( c = -2140547000; c <= 2140547000; c++); printf(“\n%d”, c); printf(“\n”); } O que houve? 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 11/27 1 A variável do for(c) assumiu valores desde –2140547000 até 2140547000; 2 Por ter um ponto e vírgula logo depois do ), as únicas operações foram a de incrementar a variável c e testá-la para verificar se o valor dela continuava menor, ou igual, ao valor final; 3 Ao atingir o valor 2140547001, a repetição é interrompida e o fluxo é desviado para o primeiro comando depois do ponto e vírgula. Nesse caso, a função printf() que a princípio seria o bloco que deveria ser repetido; 4 A estrutura do for funcionou como um temporizador que variará de acordo com a frequência da sua máquina. Atividade 1 - Construa um programa que exiba 10 vezes a frase: Se praticar, aprende a programar. 2 - Construa um programa que gere a seguinte PA: 4 : 8 : 12 : ... : 32: 36: 40 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 12/27 3 - Construa um programa que deixe o usuário entrar com um número 3 vezes e, para cada entrada, exibir a raiz quadrada do número. Nesse exercício, precisaremos usar uma função que seja capaz de extrair a raiz quadrada. Essa função faz parte da biblioteca math.h. Lembre-se de que, no conjunto dos reais, não se pode extrair raiz de número negativo. Aprofundando o estudo sobre a estrutura de repetição while As estruturas de repetição while e do...while são parecidas em sua concepção e ousamos dizer que poderíamos programar sem a estrutura do...while, mas quando entramos em contato com ela, perceberemos que as soluções seriam maiores se usássemos a estrutura while para simulá-la. Consideramos a estrutura while a mais difícil de ser compreendida em um primeiro momento e, por essa razão, procuramos seguir sempre 3 passos para que você consiga ter tempo para assimilar sua sintaxe na prática. Saiba mais Essa estrutura é muito usada para construção de trechos de proteção da entrada de dados. Tanto a estrutura while quanto a estrutura do...while repetem o bloco de comandos enquanto o teste retornar um resultado verdadeiro. Teste 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 13/27 O teste (condição) é uma expressão relacional/lógica semelhante as que nós usamos na estrutura do if(...) ... else ... Costumamos dizer que o demonstrado a seguir é muito comum acontecer na primeira vez que se constrói um código usando a estrutura while. Isso se justifica pela sintaxe apresentada no início desta aula. Por essa razão, em qualquer disciplina de Linguagem, é importante seguir o mesmo procedimento que possibilita uma melhor compreensão do funcionamento da estrutura while. Atenção Nunca force a entrada dessa estrutura atribuindo um valor inicial à variável que fará parte do teste, visto que se retira o maior trunfo da estrutura: não executar o bloco se não for verdadeiro o teste. Agora, vamos analisar a construção de um programa que deixe entrar números inteiros enquanto forem maiores do que zero e, para cada número, exibir seu dobro. Solução 1 Em um primeiro momento, já que vimos a sintaxe dessa estrutura, somos induzidos a construir o código da forma a seguir: 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 14/27 #include <stdio.h> int main () { int num; while (num > 0) { printf(“\nNúmero: ”); scanf(“%d”&num); printf(“\n%d”, num*2); } printf(“\n”); } Mas o fato de não repetir o bloco, não deveria ser estranho, visto que a variável num, como não foi inicializada, terá um “lixo” que, no caso, foi um número negativo. O mesmo programa foi compilado no Visual Studio-2005 e foi exibida uma mensagem de erro: “The variable 'num' is being used without being initialized”. No Dev-C++, o “lixo” foi um número positivo. Logo, executou, mas quando se digitava um número menor, ou igual a zero, primeiro, exibia o dobro e depois parava. Conclusão: embora tenha sido usada a sintaxe correta, o programa não funcionou corretamente, visto que deveria sair da estrutura quando a condição não fosse satisfeita. Solução 2 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 15/27 Se estava sinalizando que não precisava ser inicializada então, deveria se colocada a função de leitura antes da estrutura de repetição while. Nesse raciocínio que surgiu a segunda solução. #include <stdio.h> int main () { int num; printf(“\nNúmero: ”); scanf("%d", &num); while (num > 0) { printf(“\n%d", num*2); } printf(“\n”); } Bem, a situação tinha melhorado, uma vez que foi permitido entrar com um valor, mas como a função scanf não estava dentro da estrutura, o programa entrou em loop e foi preciso pressionar as teclas CTRL e C para interromper. Solução 3 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 16/27 Após uma análise dos resultados das duas soluções, chegou-se a conclusão de que era preciso juntá-las e surgiu, o que chamamos de “sintaxe na prática”. Scanf ( ) / getchar ( ) / atribuição While (condição) { Bloco de comandos Scanf ( ) / getchar ( ) / atribuição } Observe a solução final: #include <stdio.h> int main () { int num; printf(“\nNúmero: ”); scanf("%d", &num); while (num > 0) { printf(“\n, num*2); printf(“\nNúmero: ”); scanf("%d", &num); 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 17/27 } printf(“\n”); } Atenção Percebemos que essa estrutura de repetição testa uma condição no início e só executa o bloco se o teste for verdadeiro. Sendo assim, se construirmos um programa que execute um comando quando o resultado do teste for falso, tenha certeza de que algo está errado no seu programa como aconteceu na primeira solução. Duas funções de leitura, ou comando de atribuição? Vamos lhe responder em tópicos para simplificar: 1 Dentro da repetição, só há uma função de leitura ou comando de atribuição; 2 A função de leitura ou comando de atribuição, que aparece antes da estrutura while, possibilita a entrada do primeiro valor que, se não passar pelo teste, não executará o bloco, mas se o valor passar então, a execuçãodo programa ficará nesse bloco até que se digite um valor que não satisfaça mais à condição; 3 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 18/27 Se dentro desse bloco não estiver presente uma função de leitura ou comando de atribuição, como os valores, a partir do segundo até o último, poderão ser lidos? Isso implicaria que o primeiro valor lido, se maior do que zero, ficaria armazenado para sempre na variável num e o programa entraria em loop como ficou a segunda solução. Atividade 4 - Construa um programa que deixe o usuário entrar com um número e exiba o número invertido. 5 - Construa um programa que deixe o usuário entrar vários números e para cada entrada, exibir o quadrado e a raiz quadrada do número. 6 - Construa um programa que deixe o usuário entrar 2 números inteiros e exiba o MDC (Máximo Divisor Comum). Aprofundando o estudo sobre a estrutura de repetição do...while Chegamos à terceira estrutura de repetição: do... while e já vimos que a única diferença para a estrutura while é que essa repete o bloco pelo menos uma vez. 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 19/27 A lógica da estrutura é simples, visto que executa o bloco de comandos, testando a condição ao final e, enquanto for verdadeira, repete a execução do bloco. É, sem dúvida a estrutura mais indicada para a construção de um programa que funciona através de um menu. Assemelha-se à estrutura repeat... until de outras linguagens. Simulando outras estruturas É muito comum encontrarmos nos livros de programação esse tópico, mas se existem 3 estruturas é porque cada uma tem sua finalidade como já vimos anteriormente. Apresentaremos algumas simulações e teceremos comentários sobre elas. for simular while Essa simulação é muito simples, uma vez que usamos a linha do for sem nenhum parâmetro, mas com os pontos e vírgulas combinado com um if. Observe o código a seguir. Para o principiante é de mais fácil construção, mas reforçamos que são duas estruturas para simular uma. #include <stdio.h> int main () { 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 20/27 int num; for (;;) { printf(“\nNúmero: ”); scanf(“%d”, &num); if(num <= 0) break; printf(“\n%d, num*2); } printf(“\n”); } for simular do... while Essa simulação é muito parecida com a anterior, exceto pela na posição do if. Observe: { #include <stdio.h> int main () { int num; for (;;) { printf(“\nNúmero: ”); scanf(“%d”, &num); 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 21/27 if(num <= 0) break; printf(“\n%d, num*2); } printf(“\n”); } while simular for Embora a estrutura do for seja a mais indicada quando o número de repetições for conhecido, nada impede que usemos a estrutura while combinada com um contador para simular a estrutura do para. #include <stdio.h> int main () { int num, cont; cont = 1; while(cont <=3) { printf(“\nNúmero: ”); scanf(“%d”, &num); printf(“\n%d”num*2); cont++; } printf(“\n”); 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 22/27 } Atenção A simulação de while para do... while não será apresentada, uma vez que se faz necessário “forçar” a entrada na estrutura while, atribuindo um valor à variável que vai ser testada e não desejamos que você crie esse hábito. do... while simular for Veja o código: #include <stdio.h> int main () { int num, cont; cont = 1; do { printf(“\nNúmero: ”); scanf(“%d”, &num); printf(“\n%d”num*2); cont++; 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 23/27 } while(cont <=3); printf(“\n”); } Atenção Também não apresentaremos a simulação de do... while para while não será apresentada, visto que será preciso dobrar o número de testes e não desejamos que você crie esse hábito. Aninhando as estruturas Uma estrutura dentro de outra estrutura de repetição é algo muito comum. Seja para proteger a entrada de dados ou para muitas outras finalidades como poderemos constatar nos exemplos que serão mostrados a seguir. for dentro do for Veremos, agora, o exemplo de código para letreiro. Nesse código, trabalharemos com um for mais externo que assumirá os valores das colunas e um for mais interno, como um temporizador, visto que o objetivo é montar um letreiro. Algo que fazíamos muito, antigamente. O objetivo é fixar que o ; ao final da linha do for, só gerará uma PA ou PG internamente, mas não repete o bloco.É necessário ter a biblioteca conio2.h(Borland). Esse programa deve ser executado no Dev-C++. 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 24/27 #include <stdio.h> #include <conio2.h> int main () { int cont, p; for (cont = 1; cont <=70; cont++) { gotoxy(cont, 5); /* cont (coluna, 5 (linha) */ printf(“ LPI - EAD"); for (p =1 ; p<= 100000000; p++); /*pode aumentar até 2147000000*/ } printf("\n\n"); system(“pause”); } 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 25/27 Atividade 7 - Escreva um código que exiba as posições de todos os elementos de uma matriz bidimensional com dimensão 10 (matriz quadrada). Saiba mais Veja outros dois exemplos de estrutura aninhada do for dentro for <galeria/aula5/anexo/a05_doc1.pdf> . Notas Valor inicial nomeVariavel = valor inicial ; Na maioria das vezes, o tipo de variável é enumerável (inteira ou caracter de um caracter). É um comando de atribuição. O valor atribuído pode ser: constante, variável ou expressão. Exemplos X = 0; X = strlen(pal); X = a + 1; Expressão de teste 1 2 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 26/27 nomeVariavel operadorRelacional expressão nomeVariavel < ou> ou < ou>= ou <=o u !=v alor; Na verdade, é uma expressão relacional como as usadas na estrutura do if. Exemplos X > 0; X < strlen(pal); X <=a + 1; Incremento nomeVariavel = nomeVariavel operador valor nomeVariavel operador=valor nomeVariavel ++ ou nomeVariavel -- Na verdade, é uma expressão relacional como as usadas na estrutura do if. Exemplos X = x + 1; X = x *2 / x*=2; X ++ X-- Referências DA MATTA, Roberto. Uma introdução à antropologia social. Rio de Janeiro: Rocco, 1993. DURHAM, Eunice. “Apresentação”. In: MALINOWSKI, Bronislaw. Argonautas do pacífico ocidental: um relato do empreendimento e da aventura dos nativos nos arquipélagos de Nova Guiné Melanésia. São Paulo: Abril Cultura, 1978. LAPLANTINE, François. Aprender antropologia. São Paulo: Brasiliense, 2006. 3 17/10/2018 Estácio file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 27/27 MALINOWSKI, Bronislaw. Argonautas do pacífico ocidental: um relato do empreendimento e da aventura dos nativos nos arquipélagos de Nova Guiné Melanésia. São Paulo: Abril Cultura, 1978. KUPER, Adam. Antropólogos e Antropologia. Rio de Janeiro: Francisco Alves, 1978. VELHO, Gilberto.“Observando o familiar”. In: NUNES, Edson de Oliveira. A aventura sociológica. Rio de Janeiro: Zahar, 1978. Próximos Passos Armazenamento em matrizes unidimensionais (vetores); Construção de trechos de saída, busca, entre outros; Programas usando matrizes unidimensionais (vetores) de char. Explore mais Exercite o conteúdo estudado com as listas de exercícios que separamos para você: Exercícios para o for; <galeria/aula5/anexo/a05_doc2.pdf> Gabarito; <galeria/aula5/anexo/a05_doc3.pdf> Exercícios para o while; <galeria/aula5/anexo/a05_doc4.pdf> Gabarito; <galeria/aula5/anexo/a05_doc5.pdf>
Compartilhar