ESTRUTURAS DE CONTROLE
As estruturas de controle de dados consistem nos comandos ou instruções que os computadores já conhecem e são acionadas por meio de palavras ou expressões reservadas ou chaves. Através destas instruções é possível esclarecer ao computador o que e como processar os dados relacionados a um problema computacional que partirá de uma situação inicial para outra desejada pelo seu usuário, denominada situação final.
Estas instruções programáveis possuem suas próprias lógicas de funcionamento e definem uma sequência de ações a serem executadas pelo computador, afim de sanar o problema computacional existente. Basicamente, estas estruturas de controle de dados correspondem a três lógicas de funcionamento principais, sendo estas:
Sequencial: conjunto de instruções que serão executadas em uma sequência linear, obedecendo a pontuação e o alinhamento (indentação) definido nas instruções envolvidas.
Este tipo de estrutura lógica de fluxo de dados no algoritmo é responsável pela sequência de execução das instruções contidas em seus blocos (Declarações e Instruções) principais, sendo ela a mais convencional entre todas as possíveis. Sua realização consiste na execução de uma instrução de cada vez, onde o encerramento da primeira instrução permite o acionamento da próxima instrução e assim sucessivamente até o encerramento do algoritmo (ordem de execução de cima para baixo).
Observe o exemplo do algoritmo em português estruturado a seguir:
algoritmo estrututaSequencial; // Síntese // Objetivo: armazenar e apresentar a distância entre duas cidades. // Entrada : distância em quilômetros. // Saída : distância entre Brasília e São Paulo. principal // Declarações // cria variável inteira denominada distancia inteiro distancia; // Instruções // mostra mensagem de orientação para interação com usuário escreva("Informe a distância entre Brasília e São Paulo:"); leia(distancia);// leitura e armazenamento do valor informado // mostra mensagem e o conteúdo de distancia escreval("Distância entre Brasília e São Paulo = ",distancia); fimPrincipal // encerra algoritmo que só executa em estrutura sequencial
Analisando o algoritmo anterior pode ser observado que todas as regras para sua criação e organização estão sendo respeitadas, mas qual seria sua primeira instrução a ser executada?
O bloco principal de Síntese corresponde ao aspecto mais importante no desenvolvimento de um algoritmo correto, porém o mesmo não é executado diretamente pelo computador. Ele inicia seu processamento sequencial após o // Declarações. Todas as instruções a seguir são executadas de cima para baixo, da esquerda para direita, sendo a próxima instrução executada somente depois da anterior ter sido completamente encerrada.
a declaração da variável distancia do tipo inteiro é a primeira execução
escrever a mensagem de orientação ao usuário é a segunda instrução
a terceira é a leitura e armazenamento do valor informado pelo usuário
a quarta e última instrução mostra mensagem e distancia armazenada
É importante ressaltar que na execução de qualquer algoritmo sempre será executado primeiro o bloco de declarações e na sequência o bloco de instruções, onde a execução da instrução definida pela palavra reservada fimPrincipal encerra o processamento do algoritmo.
Seleção: a partir de um teste condicional elaborado com operadores relacionais e até lógicos, uma instrução, ou um conjunto de instruções, podem ser executados ou não, dependendo exatamente do resultado do teste efetuado (lógica convencional - V = verdadeiro ou F = falso).
Nesta estrutura de controle o fluxo de processamento dos dados escolhe um caminho sequencial de execução baseado em uma verificação ou teste condicional que selecionará qual percurso de execução entre as possíveis instruções será realizado pelo algoritmo.
Estes testes condicionais ou verificações são fundamentadas na lógica convencional, aplicada sobre os resultados obtidos com operadores relacionais e lógicos durante o processamento do algoritmo. Estes testes podem ser efetuados sobre operações relacionais simples ou com expressões lógicas complexas que resultem em um valor lógico(verdadeiro ou falso).
Quatro são as possíveis organizações lógicas principais para um algoritmo que utiliza as estruturas condicionais ou de seleção, sendo estas elencadas a seguir:
Seleção Simples
Seleção Composta
Seleção Encadeada
Seleção de Múltipla Escolha
A seleção ou condicional simples é formada por uma verificação (teste condicional) que altera o caminho de execução do algoritmo caso seu resultado seja verdadeiro. Esta alteração do caminho de execução consiste na seleção do caminho adequado à situação detectada pelo teste condicional realizado, podendo executar uma ou várias instruções (bloco condicional) específicas à esta situação.
Forma Geral de Sintaxe:
se (<condição>) entao instrução 1 instrução 2 ... instrução n fimSe // continua as instruções do algoritmo em execução fimPrincipal
Na situação do teste condicional não ser verdadeiro, este bloco condicional é saltado e o algoritmo prossegue sua execução de maneira sequencial até o mesmo ser encerrado.
No intuito de também esclarecer melhor a organização exigida no uso de estruturas de seleção em português estruturado é apresentado o exemplo de um algoritmo usando uma seleção simples. Atente as regras de alinhamentos (indentação) e palavras reservadas existentes neste exemplo.
Exemplo:
algoritmo avaliarDistancia; // Síntese // Objetivo: avaliar a distância entre duas cidades. // Entrada : distância em quilômetros. // Saída : confirmação da distância ser considerável(longe). principal // Declarações // cria variável inteira denominada distancia inteiro distancia; // Instruções // mostra mensagem de orientação para interação com usuário escreva("Informe a distância entre duas cidades brasileiras:"); leia(distancia); se (distancia > 500) entao escreval("Distância considerável a ser percorrida."); fimSe fimPrincipal
O algoritmo avaliar distância é executado sequencialmente até o processamento da instrução se (palavra reservada se) que executará o teste condicional para verificar a veracidade do valor informado pelo usuário e armazenado na variável distancia.
Note que a palavra entao e a expressão fimSe também estão destacadas neste algoritmo, pois ambas são palavras reservadas na seleção simples. Atente a grafia correta da palavra entao, e não então, como parte da instrução se que não possui acento. Na expressão fimSe o cuidado é com a ausência de um espaço em branco para separar os dois termos (fim e se). Esta expressão só existe com a grafia exata e sem espaço, caso contrário o algoritmo não executará corretamente.
Analisando o algoritmo anterior, é possível verificar que se o teste condicional for verdadeiro, ou seja, for maior que 500, a mensagem "Distância considerável a ser percorrida." será mostrada na janela de execução (tela de interação do usuário com o algoritmo que está sendo executado pelo computador). Se o valor informado pelo usuário não atender ao teste condicional (resultado falso), a mensagem não será exibida e o bloco condicional não será executado.
Fluxograma:
Observe a seguir o mesmo problema sendo representado em algoritmo por meio da técnica do fluxograma (gráfica).
Este tipo de seleção sempre alterará o caminho de execução do algoritmo, após seu teste condicional ser executado. Se o resultado deste teste condicional for verdadeiro o bloco de instrução condicional será executado, onde todas as instruções que seguem mais à esquerda da palavra reservada se, e depois do entao (próxima linha), até a nova palavra reservada senao que surge na seleção composta, serão executadas. Se o resultado deste teste condicional não for verdadeiro, ou seja, se ele for falso, um outro conjunto de instruções, descritas após a palavra reservada senao, serão executadas, até a instrução fimSe que encerra o processamento deste bloco condicional.
Assim, a seleção composta possui a mesma lógica da simples, porém o resultado falso não prossegue com a execução do algoritmo somente, pois ele seleciona o bloco condicional iniciado pela palavra reservada senao para ser executado antes da continuidade do algoritmo, após o encerramento da instrução de seleção (após fimSe).
Forma Geral de Sintaxe
se (<condição>) entao instrução 1 instrução 2 instrução n senao instrução 20 instrução 21 instrução m fimSe // continua as instruções do algoritmo em execução
Procurando melhor esclarecer a organização exigida no uso desta nova estrutura de seleção em português estruturado é elaborado o exemplo a seguir como uma evolução do exemplo anterior. Atente também as regras de alinhamentos (indentação) que envolvem esta estrutura de seleção e todas as suas palavras reservadas.
Exemplo:
algoritmo avaliarDistancia; // Síntese // Objetivo: avaliar a distância entre duas cidades. // Entrada : distância em quilômetros. // Saída : confirmação da distância ser considerável(longe). principal // Declarações // cria variável inteira denominada distancia inteiro distancia; // Instruções // mostra mensagem de orientação para interação com usuário escreva("Informe a distância entre duas cidades brasileiras:"); leia(distancia); se (distancia > 500) entao escreval("Distância considerável a ser percorrida."); senao escreval("Distância peculiar a ser percorrida."); fimSe fimPrincipal
Neste portuguê estruturado elaborado acima a distância é analisada, sendo maior que 500 classificada como uma distância considerável para viagem (longe), senão a mensagem apresentada indicará que é uma distância peculiar para viagem entre duas cidades brasileiras.
Fluxograma:
Veja a seguir a representação gráfica em fluxograma do algoritmo anterior mostrado em português estruturado.
O encadeamento ou aninhamento das instruções de seleção se são possíveis e podem conter dentro de seus blocos, do entao quando o teste condicional for verdadeiro, ou do senao quando teste for falso, todas as instruções possíveis na elaboração de um algoritmo, além da própria instrução de seleção simples ou composta. A esta possibilidade de uma instrução condicional se estar dentro de outra condicional é que se denomina Seleção Encadeada.
Forma Geral de Sintaxe
se (<condição_1>) entao se (<condição_2>) entao primeiro bloco de instrução senao segundo bloco de instrução fimSe senao se (<condição_3>) entao se (<condição_4>) entao terceiro bloco de instrução fimSe instrução n senao se (<condição_5>) entao quarto bloco de instrução senao quinto bloco de instrução fimSe fimSe fimSe // continua as instruções do algoritmo em execução
A grafia <valor_1>, <valor_2> e <valor_3> correspondem aos possíveis valores inteiros ou caracter que serão comparados ao valor que está armazenado no <identificador> que será descrito no início desta instrução, logo após a palavra reservada escolha, estando o mesmo entre parênteses.
Assim, será realizada a operação relacional de igualdade sem que o símbolo da mesma esteja descrito, explicitamente, na instrução, conforme pode ser observado no exemplo a seguir.
Exemplo:
algoritmo avaliarDistancia; // Síntese // Objetivo: avaliar a distância entre duas cidades. // Entrada : distância em quilômetros. // Saída : classificação da distância a ser percorrida. principal // Declarações // cria variável inteira denominada distancia inteiro distancia; // Instruções // mostra mensagem de orientação para interação com usuário escreva("Informe a distância entre duas cidades brasileiras:"); leia(distancia); se (distancia > 500) entao escreval("Distância considerável a ser percorrida - longe."); senao se (distancia < 100) entao escreval("Distância pequena a ser percorrida - perto."); senao escreval("Distância peculiar a ser percorrida - mediana."); fimSe fimSe fimPrincipal
Fluxograma:
Acompanhe a representação gráfica, em fluxograma, elaborada para o algoritmo anterior que está usando a seleção encadeada mostrada no português estruturado.
Entre as quatro variações de instruções de seleção, a de Múltipla Escolha possui diferenças significativas em sua utilização, principalmente na sua sintaxe em português estruturado. As palavras reservadas desta instrução são escolha, caso e fimEscolha, sendo opcional o uso da outroCaso, como ocorre com a instrução se... entao que pode usar o senao (seleção composta) ou não (seleção simples).
É importante destacar que esta instrução de seleção já possui a sua operação relacional definida e não pode ser utilizada outra além da igualdade, que é implícita nesta instrução (nunca aparece o símbolo = na instrução). Por meio dela só é possível verificar se existe igualdade entre um valor inteiro ou caracter desejado que se queira avaliar, onde sua veracidade resultará somente na execução das outras instruções disponíveis no caso que corresponde ao valor igual ao avaliado.
Caso nenhum dos valores estejam especificados como um caso desta instrução de múltipla escolha será executada as instruções disponíveis no outroCaso, se o mesmo existir, ou o algoritmo continuará sua execução após o fimEscolha.
Forma Geral de Sintaxe
escolha (<identificador>) caso <valor_1> primeiro bloco de instrução caso <valor_2> segundo bloco de instrução caso <valor_3> terceiro bloco de instrução outroCaso bloco de instrução do outro caso (valor diferente de todos anteriores) fimEscolha // continua as instruções do algoritmo em execução
A grafia <valor_1>, <valor_2> e <valor_3> correspondem aos possíveis valores inteiros ou caracter que serão comparados ao valor que está armazenado no <identificador> que será descrito no início desta instrução, logo após a palavra reservada escolha, estando o mesmo entre parênteses.
Assim, será realizada a operação relacional de igualdade sem que o símbolo da mesma esteja descrito, explicitamente, na instrução, conforme pode ser observado no exemplo a seguir.
Exemplo:
algoritmo estadoCivil; // Síntese // Objetivo: Indicar a o estado Civil . // Entrada : Opção que indica o estado Civil. // Saída : Estado Civil . principal // Declarações inteiro opcao; // Instruções escreval("Escolha a opção do menu referente ao seu estado Civil:"); escreval("1 - Casado"); escreval("2 - Solteiro"); escreval("3 - Divorciado"); escreval("4 - Viúvo"); leia(opcao); escolha (opcao) // instrução de múltipla escolha sobre opcao caso 1 // testes de igualdades sobre opcao escreva("Casado"); interrompa; // termina o caso caso 2 escreva("Solteiro"); interrompa; caso 3 escreva("Divorciado"); interrompa; caso 4 escreva("Viúvo"); interrompa; outroCaso escreva ("Estado Civil incorreto"); fimEscolha fimPrincipal
Imagine que um usuário solicite a execução do algoritmo estação climática acima e digite o número 2 e aguarde a apresentação do resultado final em sua tela de execução. Esta situação está ilustrada na figura a seguir que representa a tela ou janela de execução deste algoritmo.
Uma situação importante no uso desta instrução na elaboração de algoritmos é seu teste condicional de igualdade usando o tipo de dado caracter. Apesar desta instrução permitir o uso de identificadores que armazenam vários caracteres juntos, ou seja, um conjunto de caracteres (também chamado de string no ambiente computacional), ela não pode ser traduzida literalmente para um programa de computador, pois esta manipulação de caracteres em um programa não possui um único caracter (um único valor), mas vários (conjunto de caracteres).
Dessa forma, é importante a análise através de opções de menu e não de conjunto de caracteres que não poderão ter sua lógica de solução traduzida realmente para um futuro programa de computador.
Fluxograma:
Note que a representação gráfica da instrução de múltipla escolha não possui nenhum diagrama novo em sua elaboração, mas uma organização lógica diferente para solução do problema em questão (algoritmo Estado Civil).
Repetição: conjunto de instruções, ou uma única instrução, que será executada repetidamente, de acordo com o resultado de um teste condicional, que compõem a instrução de repetição e permite o laço para a nova execução destas instruções que compõem o bloco de repetição.
Cada uma destas instruções básicas são fundamentais no desenvolvimento de lógicas coerentes nos algoritmos, sendo estas responsáveis pelo êxito no processamento de dados simples até o mais complexo, controlando o fluxo dos dados que serão processados pelo computador.
A importância no estudo das instruções de seleção e repetição conferem a esta abordagem inicial sobre as 4 possíveis seleções um momento de fixação dos conteúdos já abordados, para posterior continuidade sobre os conteúdos relacionados as instruções de repetição.
No intuito de fixar os conteúdos abordados neste módulo e verificar qual foi sua aprendizagem sobre os mesmos, são sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado e inicie a lista de exercícios coerente com o conteúdo estudado anteriormente.
Estrutura de Repetição
Entre as instruções de controle, as estruturas de repetição se destacam entre as principais, possibilitando que o processamento de algumas instruções do algoritmo seja executado repetidas vezes, conforme a necessidade da lógica envolvida para solução do problema computacional que se deseje resolver. Apesar das mesmas instruções serem repetidas em sua execução, geralmente, elas envolvem dados diferentes, o que ocasionará resultados distintos durante sua execução.
Um exemplo simples e didático ao início desta aprendizagem em Programação (instruções de repetição) é o cálculo da tabuada de um número, onde no período inicial de alfabetização e formação de jovens crianças, normalmente durante o ensino fundamental, são trabalhados e exercitados os aspectos cognitivos relacionados a este cálculo. Esta realização consiste na mesma operação aritmética (multiplicação) sobre valores numéricos inteiros diferentes e sequências, que geralmente variam entre um (1) e dez (10) sobre um outro valor inteiro desejado.
Almejando representar este conjunto de operações aritméticas de multiplicação sobre o número 5, efetuando o cálculo da maneira mais convencional ao momento de aprendizagem no ensino fundamental, ou seja, no intervalo de 1 até 10, acompanhe o exemplo a seguir.
Exemplo:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
Relembrando a sequência de operações necessárias para realização deste cálculo no intervalo sugerido ([1,10]), acompanhe a elaboração do algoritmo a seguir, em português estruturado, que solicita ao usuário o número positivo que ele deseje verificar o cálculo da tabuada.
algoritmo tabuada; // Síntese // Objetivo: calcular a tabuada de um número inteiro positivo. // Entrada : número inteiro positivo. // Saída : tabuada de 1 até 10 do número inteiro positivo informado. principal // Declarações inteiro numero; // Instruções escreva("Informe um número inteiro positivo para tabuada:"); leia(numero); escreval(numero," x 1 = ",(numero * 1)); escreval(numero, " x 2 = ",(numero * 2)); escreval(numero, " x 3 = ",(numero * 3)); escreval(numero, " x 4 = ",(numero * 4)); escreval(numero, " x 5 = ",(numero * 5)); escreval(numero, " x 6 = ",(numero * 6)); escreval(numero, " x 7 = ",(numero * 7)); escreval(numero, " x 8 = ",(numero * 8)); escreval(numero, " x 9 = ",(numero * 9)); escreval(numero, " x 10 = ",(numero * 10)); fimPrincipal
Para representação exemplificada anteriormente (tabuada do 5) o algoritmo acima resolveria a situação para vários números inteiros positivos que fossem informados, inclusive o próprio 5. Mas imagine o crescimento desta criança, em fase de formação, e sua necessidade de cálculos que envolvam valores maiores que o intervalo sugerido inicialmente. Suponha que os valores da tabuada tivessem que ser gerados até 1000, ao invés de simplesmente no intervalo [1,10]. Esta nova suposição não tornaria o algoritmo mais complexo para ser resolvido, pois a operação aritmética a ser realizada será a mesma, porém este algoritmo, em português estruturado, ficará enorme, com muitas linhas de instruções para realizar esta operação aritmética simples, envolvendo somente valores básicos diferentes para tal operação.
No intuito de evitar esta e outras situações comuns no processamento de dados e tornar os algoritmos mais eficientes e claros em sua representação é que são empregadas as estruturas de repetição. Elas colaboram no controle das manipulações necessárias sobre os dados armazenados, permitindo a repetição de uma operação, ou conjunto de instruções, quantas vezes forem necessárias, baseando esta repetição no resultado de um teste condicional.
Basicamente, as estruturas de repetição são formadas por um bloco de instrução e um teste condicional, responsável pela verificação de que este bloco, denominado bloco de repetição, será executado ou não repetidas vezes. Estas estruturas também denominam o teste condicional como expressão de controle, pois sendo que seu resultado lógico (verdadeiro ou falso) resultará na repetição ou não da execução do bloco de repetição.
As estruturas de repetição são definidas em três, atendendo as características lógicas diferentes que possam ser encontradas no processamento de dados. Estes três tipos de instruções de repetição, também chamados de instruções de laço ou looping, são:
para... faca
enquanto... faca
faca... enquanto
Estas três estruturas ainda podem envolver uma instrução de interrupção brusca na lógica de repetição elaborada em um algoritmo, demonstrando a fragilidade do raciocínio representado por este programador (pessoa que elabora algoritmos e programas de computador). Assim, o uso da instrução interrompa está condicionado ao fraco raciocínio estruturado do programador, não devendo ser usado na elaboração de algoritmos com lógica adequada na solução de um problema computacional.
A instrução de repetição para...faca repete a execução de seu bloco de repetição um número de vezes fixado em sua definição (repetição bem definida) sendo possível conhecer previamente a quantidade de vezes que isso ocorrerá durante a execução do algoritmo.
Esta instrução é definida em uma única linha de comando no português estruturado, porém torna implícita três instruções fundamentais a sua execução correta:
atribuição inicial a sua variável de controle;
teste condicional responsável pela repetição ou não de seu bloco;
definição do passo da repetição sobre a variável de controle.
A variável de controle consiste na definição de uma variável do tipo inteiro que será responsável pelo controle de quantas vezes esta repetição será executada, sendo a mesma utilizada pelas três instruções implícitas existentes em uma instrução para... faca.
Forma Geral de Sintaxe
para (<variável_controle> de <inicial> ate <final> passo <rep>) faca bloco de repetição fimPara fimPrincipal
onde:
para, de, ate, passo, faca e fimPara - são palavras reservadas;
<variável_controle> - variável inteira responsável pelo controle da repetição;
<inicial> - valor inteiro inicial que será atribuído a variável de controle no momento em que esta instrução for executada a primeira vez;
<final> - valor inteiro final que permitirá a execução do bloco de repetição pela última vez;
<rep> - valor inteiro que define o incremento ou decremento na variável de controle que será realizada a cada nova execução do bloco de repetição, antes da realização do teste condicional que definirá a execução ou não do bloco de repetição.
Com o conhecimento desta nova estrutura de controle é possível evoluir a solução apresentada anteriormente como solução do problema da tabuada. Uma solução mais adequada a este problema, que pode aumentar a quantidade de valores a serem calculados, saltando do convencional intervalo de 1 até 10 para até 1000 ou muito mais, é sugerido um algoritmo usando português estruturado com para... faca, que torna a lógica e a eficiência da solução mais coerentes ao processamento do computador.
Solução do problema da tabuada:
algoritmo tabuada; // Síntese // Objetivo: calcular a tabuada de um número inteiro positivo. // Entrada : número inteiro positivo. // Saída : tabuada de 1 até 10 do número inteiro positivo informado. principal // Declarações inteiro numero, controle; // Instruções escreva("Informe um número inteiro positivo para tabuada: "); leia(numero); para (controle de 1 ate 10 passo 1) faca escreval(numero, " x ",controle," = ", (numero * controle)); fimPara fimPrincipal
Compare os dois algoritmos para solução deste problema e analise a facilidade de compreensão da lógica envolvida na representação de ambos, além da agilidade para aumentar a solução para o processamento de 1000 valores ou mais. Veja que nesta solução com o para... faca só é necessário trocar o valor final da instrução de repetição para o mesmo gerar novos valores para tabuada desejada.
Apesar da instrução para... faca estar definida em uma única linha de código, esta linha possui as três instruções implícitas esclarecidas anteriormente, além da explicação a seguir sobre o momento de execução de cada uma delas.
inicialização da variável de controle, denominada controle neste último algoritmo tabuada
controle = 1
- instrução implícita da para... faca executada só na primeira repetição
teste condicional que define a repetição ou não da execução do bloco de repetição
controle <= 10
- instrução implícita da para... faca executada antes de repetir a execução do bloco de repetição, sendo seu resultado verdadeiro para execução do bloco de repetição, caso contrário, resultado falso, o bloco de repetição não é executado e o algoritmo continua sua execução sequencial após a instrução fimPara.
incremento ou decremento da variável de controle pelo valor do passo definido na instrução, sendo esta definição obrigatória em todas as instruções para... faca
controle = controle + 1
- instrução implícita da para... faca executada sempre que o bloco de repetição termina sua execução chegando na instrução fimPara. A execução do incremento (+ 1) ou decremento (-1) é realizada antes do teste condicional ser executado novamente, para verificar se o bloco de repetição será executado ou não.
Dessa forma, a instrução de repetição possibilitou uma representação fácil para compreensão da lógica envolvida, além de processo de correção e manutenção mais clara.
Fluxograma:
Observe a representação do algoritmo anterior, usando a para... faca, em fluxograma e note que nenhuma nova figura geométrica foi inserida nesta representação gráfica, sendo a lógica responsável pela organização do algoritmo gráfico elaborado corretamente.
A instrução de repetição enquanto... faca permite a execução de seu bloco de repetição um número de vezes fixado por uma lógica adequada a solução de um problema computacional ou ainda a quantidade de vezes que seu usuário desejar, sendo ele responsável pelo controle de quantas vezes este bloco de repetição poderá ser executado.
A execução desta repetição está condicionada ao resultado de seu teste condicional ser verdadeiro, podendo este teste realizar expressões relacionais com operadores lógicos e aritméticos que cheguem a um resultado sempre do tipo de dado lógico (verdadeiro ou falso). Enquanto este teste permanecer verdadeiro o bloco de repetição é executado continuamente, sendo encerrado somente quando o teste for falso.
Forma Geral de Sintaxe
enquanto (<teste_condicional>) faca bloco de repetição fimEnquanto
onde:
enquanto, faca e fimEnquanto - são palavras reservadas
<teste_condicional> - expressão relacional que resultará em um dado lógico (verdadeiro ou falso), indicando se o bloco de repetição será executado novamente (resultado verdadeiro) ou não (resultado falso).
Geralmente, esta instrução de repetição também usa uma ou mais variáveis de controle. Porém, todas as operações realizadas sobre a mesma devem ser explícitas e executadas conforme a lógica adequada a ser elaborada no algoritmo. Assim, a operação de inicialização da variável de controle deve ser realizada antes do teste condicional explícito nesta estrutura de repetição (enquanto... faca), pois só é possível uma verificação condicional se existirem valores a serem comparados em uma variável, caso contrário a mesma não possuirá valor, ou seja, em programação ela será vazia (sem valor), não podendo ser testada.
A operação de incremento ou decremento da instrução enquanto... faca também deverá ser explícita no bloco de repetição, caso contrário a variável de controle se manterá com o mesmo valor que resultou em sua entrada neste bloco (teste condicional verdadeiro) para execução, ocorrendo o processamento conhecido como laço infinito, ou seja, a repetição existente no algoritmo não alterará o valor da variável de controle e manterá o bloco de repetição em constante execução, pois seu teste condicional será sempre verdadeiro e o algoritmo nunca chegará ao final de seu processamento correto.
A representação do raciocínio lógico relacionado a instrução de repetição enquanto... faca em português estruturado é exemplificada no exemplo a seguir que procura encontrar a media de gols de um equipe de futebol que possui 11 jogadores em seu elenco.
Exemplo:
algoritmo mediaGols; // Síntese // Objetivo: calcular a média dos Gols de uma equipe de futebol // Entrada : quantidade de gols de cada jogador de uma equipe de futebol // Saída : média de Gols da equipe. principal // Declarações inteiro contador; real gols, soma, media; // Instruções contador = 1; // inicialização explícita da variável de controle soma = 0; enquanto (contador <= 11) faca escreva("Informe a quantidade de gols do jogador ", contador, ":"); leia(gols); soma = (soma + gols); // acumulando os gols informados contador = (contador + 1); // incremento explícito da repetição fimEnquanto media = (soma / 11); // calcula média dos gols acumulados escreva("Media do numero de Gols da equipe = ",media:2:2); fimPrincipal
A representação gráfica do algoritmo média de gols acima é elaborada no fluxograma a seguir.
Fluxograma:
É importante ressaltar que as instruções de repetição estudadas até o momento (para... faca e enquanto... faca) executam o bloco de repetição somente quando o resultado de seu teste condicional é verdadeiro, caso contrário, teste condicional falso, a repetição é encerrada e o algoritmo prossegue sua execução. Caso o teste condicional seja falso na primeira verificação, antes de executar o bloco de repetição pela primeira vez, a execução se desloca para instrução de encerramento da repetição sem executar nenhuma vez o bloco de repetição.
A terceira repetição é semelhante a repetição enquanto, com uma diferença: a condição é avaliada sempre após a execução do código. Isso significa que independente do resultado da expressão, o corpo da repetição irá executar pelo menos uma vez.
Forma Geral de Sintaxe
faca bloco de repetição enquanto (teste_condicional);
faca e enquanto - são as palavras reservadas desta estrutura de repetição
teste_condicional - expressão relacional que resultará em um dado lógico (verdadeiro ou falso), indicando se o bloco de repetição será executado novamente (resultado verdadeiro) ou não (resultado falso).
Similar a instrução enquanto...faca a faca... enquanto também usa variável de controle, sendo todas as operações sobre a mesma explícitas para o seu correto funcionamento lógico no algoritmo. Uma preocupação na elaboração desta instrução também é o laço infinito, devendo-se ter muito cuidado com a lógica representada nas três instruções de repetição (para... faca, enquanto... faca e faca... enquanto) para que isso não aconteça.
Um exemplo em português estruturado é elaborado a seguir sobre o mesmo problema explorado no exemplo anterior, usado na explicação da instrução de repetição enquanto... faca. Por meio do mesmo exemplo é possível efetuar uma análise comparativa sobre o emprego de uma ou outra lógica de repetição na solução do problema (calcular a media de gols de uma equipe de futebol que possui 11 jogadores).
Exemplo:
algoritmo mediaGols; // Síntese // Objetivo: calcular a média dos Gols de uma equipe de futebol // Entrada : quantidade de gols de cada jogador de uma equipe de futebol // Saída : média de Gols da equipe. principal // Declarações real gols, soma, media; inteiro contador; // declaração da variavel de controlhe // Instruções contador = 1; // inicialização explícita da variável de controle soma = 0; enquanto (contador <= 11) faca escreva("Informe a quantidade de gols do jogador ", contador, ":"); leia(gols); soma = (soma + gols); // acumulando os gols informados contador = (contador + 1); // incremento explícito da repetição fimEnquanto media = (soma / 11); // calcula média dos gols acumulados escreva("Media do numero de Gols da equipe = ",media:2:2); fimPrincipal
Acompanhe a seguir a representação do algoritmo em português estruturado acima, no fluxograma a seguir.
Fluxograma:
Observe que não existe nenhuma figura geométrica nova na representação do algoritmo que utiliza a instrução faca... enquanto, mas uma organização lógica de processamento diferente. Primeiramente, a repetição sendo executada quando seu teste condicional é falso e ainda a posição sequencial deste teste que se encontra no final desta instrução de repetição.
Formas de Controle nas Estruturas de Repetição
As estruturas de repetição propiciam uma organização lógica e de representação mais fácil na elaboração e compreensão dos algoritmos computacionais. Um aspecto importante na utilização destas estruturas está relacionada a sua forma de controle sobre a quantidade de vezes que um bloco de repetição será repetidas vezes executado até o encerramento da instrução de repetição envolvida. De maneira mais simples, a fim de colaborar no entendimento destes possíveis controles na repetição, é realizada uma classificação dos mesmos, podendo estes serem:
AUTOMÁTICO - emprega uma variável auxiliar (variável de controle) responsável pela quantidade de vezes que o bloco de repetição será executado, sem uma interferência direta do usuário sobre esta quantidade de repetições. Esta quantidade de vezes é coerente com a lógica de solução do problema, não podendo ser realizada a repetição um número de vezes maior ou menor do que a lógica exige, caso contrário o valor final processado pelo computador estará incorreto. Por exemplo, suponha o cálculo da potência de 2 elevado a 3, onde será realizada a multiplicação da base 2 somente 2 vezes (2 x 2), o que resultará em 4, sendo o resultado correto deste cálculo 8.
Assim, um controle automático não pode ter sua repetição livre ou podendo ter interferência direta sobre sua lógica para se alcançar um resultado esperado e correto.
CONTROLADO PELO USUÁRIO - este controle também emprega uma ou mais variáveis de controle para controlar a quantidade de execuções do bloco de repetição. Porém, este controle está sujeito a interferência do usuário do algoritmo e não somente a lógica de solução do problema computacional. Por exemplo, imagine o algoritmo que cadastra os dados pessoais de um funcionário de uma grande empresa, onde tal cadastro solicita a quantidade de dependentes deste funcionário e o nome e idade de cada um deles. Para realização deste cadastro por todos os funcionários existirá a variação na quantidade de dependentes de cada funcionário, podendo inclusive existirem funcionários que não tem dependentes.
Portanto, a repetição controlada pelo usuário depende, diretamente, da interferência do usuário, caso contrário ela não funcionará adequadamente às suas necessidades.
No intuito de esclarecer melhor as diferenças entre estes dois controles das repetições é exemplificada as abordagens automática e pelo usuário nos algoritmos em português estruturado a seguir.
Controle automático
algoritmo repeticaoAutomatica; // Síntese // Objetivo: confirma cadastro da altura dos jogadores titulares de uma
vôlei // Entrada : 6 alturas. // Saída : mensagem confirmando o cadastro da altura dos titulares. principal // Declarações inteiro contador; real altura; // Instruções contador = 1; // inicialização explícita da variável de controle enquanto (contador <= 6) faca // titulares em vôlei são 6 jogadores escreval("Informe a altura do ", contador, " jogador: "); leia(altura); contador = (contador + 1); // incrementando a variável de controle fimEnquanto escreva("Cadastro dos titulares realizado com sucesso."); fimPrincipal
O algoritmo anterior efetua a leitura das seis alturas dos jogadores titulares de uma equipe de vôlei, só sendo encerrado após a leitura destas seis alturas. Este tipo de repetição é classificada como automática, pois o algoritmo sempre lerá seis alturas, nunca lendo mais ou menos alturas.
Controle pelo usuário
algoritmo repeticaoControladaPeloUsuario; // Síntese // Objetivo: confirma a quantidade de alturas cadastradas // Entrada : alturas // Saída : quantidade de alturas cadastradas principal // Declarações inteiro contador; real altura; // Instruções altura =1; contador =0; enquanto (altura >0) faca escreval("Informe a altura a ser cadastrada: "); leia(altura); contador = (contador + 1); fimEnquanto escreva("Foi cadastrada ", contador -1, " altura(s)."); fimPrincipal
O algoritmo anterior lê quantas alturas o usuário desejar, respeitando a mesma lógica de cadastro para a quantidade que o usuário necessite. Repare que esta lógica pode cadastrar inclusive, nenhuma altura a ser contabilizada pelo algoritmo. Em diversas publicações literárias (livros, revistas, etc.) sobre algoritmo, este tipo de controle recebe várias denominações, estando entre as mais usadas a sentinela e o flag para interrupção da repetição.
Como abordado anteriormente, as soluções anteriores (algoritmos repetição automática e repetição controlada pelo usuário) também poderiam estar utilizando a instrução faca... enquanto, tendo o cuidado com as alterações coerentes com as lógicas desta outra repetição, assim como do problema que está sendo resolvido pelo algoritmo. Acompanhe, por exemplo, a solução em português estruturado elaborada para o problema anterior (cadastro de várias alturas).
algoritmo repeticaoControladaPeloUsuario; // Síntese // Objetivo: confirma a quantidade de alturas cadastradas // Entrada : alturas // Saída : quantidade de alturas cadastradas principal // Declarações inteiro contador; real altura; // Instruções altura =1; contador =0; faca escreval("Informe a altura a ser cadastrada: "); leia(altura); contador = (contador + 1); enquanto(altura > 0); escreva("Foi cadastrada ",contador -1," altura(s)."); fimPrincipal
Apesar deste estudo abordar estas duas formas de controle das estruturas de repetição, ainda é possível um controle que utilize os dois tipos (automático e pelo usuário) em conjunto, de acordo com a necessidade do problema a ser resolvido. Por exemplo, suponha a necessidade de realização de vários cálculos de potência em uma mesma execução de um algoritmo. O cálculo em si empregará uma repetição automática, conforme sua lógica exige, porém a quantidade de cálculos de potência a serem realizadas será definida pelo usuário, de acordo com sua necessidade pessoal naquele momento.
No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.