Na etapa inicial são tratados vários conceitos fundamentais (algoritmo, programa, sistema de linguagem de alto nível, ambiente de programação, variável, instruções de entrada e saída, primeiros tipos primitivos, instruções de atribuição, operadores aritméticos) que permitem o tratamento de problemas computacionais cujos métodos de resolução exijam apenas a constituição de fluxos de processamento seqüenciais, ou seja, os métodos de resolução são expressos por uma seqüência ordenada de instruções que devem ser executadas uma a uma, exatamente uma única vez, desde a primeira até a última. No próximo bloco da disciplina são introduzidas as estruturas de controle de seleção e de repetição, que permitem a constituição de fluxos de processamento alternativos e repetitivos.
Com os controles de seleção, torna-se possível condicionar a execução de um determinado bloco de instruções ao valor de uma expressão lógica ou numérica, por exemplo:
se a>b então tÅa; aÅb; bÅt;
nessa construção, a seqüência das três atribuições dispostas no interior da moldura retangular só será executada se o valor armazenado como conteúdo da variável a for maior do que o valor definido como conteúdo da variável b; caso isso não ocorra (caso a não seja maior do que b), o bloco com as três atribuições não será executado e o fluxo de processamento seguirá para a próxima instrução, aquela que estiver abaixo da instrução se ... então ....
Normalmente trabalha-se com duas ou três formas de estruturas de controle de seleção: controle de seleção de um ramo, controle de seleção de dois ramos e controle de seleção de vários ramos. Os dois primeiros tipos estabelecem o mecanismo de seleção a partir da avaliação de uma expressão lógica e o terceiro tipo realiza o processo de seleção com base em uma
40
expressão numérica de tipo inteiro. As formas gerais dessas estruturas de controle estão descritas no Quadro 4.
Quadro 4: Estruturas de controle de seleção
linguagem algorítmica linguagem C/C++ estrutura de controle de seleção de um ramo
se expressão então bloco;
próxima instrução;
if(expressão){
bloco;
}
próxima instrução;
estrutura de controle de seleção de dois ramos
se expressão então blocoA; senão blocoB; próxima instrução; if(expressão){ blocoA; } else{ blocoB; } próxima instrução;
estrutura de controle de seleção de vários ramos
caso expressão seja canal1: bloco1; canal2: bloco2; ... canalN: blocoN; senão blocoA; próxima instrução; switch(expressão){
case canal1: bloco1; break; case canal2: bloco2; break; ...
case canalN: blocoN; break; default: blocoA;
}
próxima instrução;
Nas duas primeiras formas (seleção de um ramo e seleção de dois ramos) a expressão, que se configura como o elemento chave do controle, é uma
expressão lógica (booleana) que pode ser obtida pela utilização de operadores relacionais (operadores de relação de ordem) ou operadores lógicos (conjunção, disjunção, negação); por exemplo:
41
se ladoA<ladoB ou ladoA<ladoC então ... if( ladoA<ladoB || ladoA<ladoC ) ...
Na terceira forma (seleção de vários ramos) a expressão de controle é
uma expressão de tipo inteiro ou de tipo ordinal e cada canal é uma constante
com o mesmo tipo da expressão. O sistema avalia a expressão e aciona o canal
cujo valor coincida com o valor da expressão, ou o canal alternativo (senão) se
não houver a coincidência, e assim executa o bloco de instruções
correspondente.
No Quadro 5 está descrito um exemplo de algoritmo com a utilização de estruturas de controle de seleção.
Quadro 5: Algoritmo ± exemplo de controles de seleção diasnomes( )
leia(mes); leia(ano); caso mes seja
2 : bstÅ ano mod 4=0 e ano mod 100z0 ou ano mod 400=0; se bst então quantdiasÅ 29; senão quantdiasÅ 28; 4 : 6 : 9 : 11 : quantdiasÅ 30; senão quantdiasÅ 31; imprima(quantdias);
As estruturas de controle de repetição permitem a elaboração de fluxos de processamento repetitivos, assim: um bloco de instruções descrito uma única vez no algoritmo ou no programa poderá ter sua execução repetida por várias vezes. Um exemplo clássico de aplicação dessa categoria de recursos é o processo de cálculo do máximo divisor comum entre dois inteiros maiores do que zero: a partir da entrada de dois valores calcula-se o resto da divisão de um pelo outro e enquanto o resto obtido for diferente de zero, toma-se o próximo dividendo como o divisor anterior; o resto obtido como próximo divisor e calcula-se o novo resto; quando for obtido o resto igual a zero encerra-se o processo e o máximo divisor comum será o valor do último divisor. A descrição do algoritmo encontra-se no Quadro 6.
42
Quadro 6: Algoritmo ± cálculo do máximo divisor comum maxdiv( )
leia(a); leia(b); restoÅ a mod b;
enquanto resto>0 faça aÅ b;
bÅ resto; restoÅ a mod b; imprima(b);
Nessa construção, as três atribuições dispostas no bloco sob a ação do controle enquanto ... faça ... poderão ser executadas por vezes repetidas; o
elemento chave do controle nesse caso é uma expressão lógica (resto>0), da
mesma forma já descrita para as duas primeiras estruturas de controle de seleção.
A dinâmica correspondente envolve a avaliação da expressão de controle (verdadeira ou falsa) e a execução do bloco disposto logo abaixo da instrução se a expressão de controle for verdadeira; nesse caso, ao final de cada execução do bloco, o sistema volta a avaliar automaticamente a expressão de controle e repete o processo; caso o valor lógico da expressão de controle seja falso, o bloco com as três atribuições não será executado e o fluxo de processamento, com a finalização do anel de repetição, seguirá para a próxima instrução registrada abaixo do bloco.
A instrução enquanto ... faça ... é denominada instrução de controle
de repetição por teste lógico a priori (a primeira avaliação da expressão de controle ocorre antes da primeira execução do bloco), e a instrução faça ... enquanto ..., que realiza um mecanismo semelhante, é denominada instrução
de controle de repetição por teste lógico a posteriori (a primeira avaliação da expressão de controle ocorre após a primeira execução do bloco).
Além dessas duas formas de controle, as linguagens de programação podem oferecer mais um tipo de instrução de repetição, que é denominado controle por variável contadora ou por contagem. Esse terceiro tipo de controle pode apresentar características particulares em cada linguagem de programação.
43
Esse controle corresponde essencialmente a especificar-se uma faixa de variação para a variável contadora (desde um valor inicial até um valor final com um determinado passo de variação) e ter o processo de repetição vinculado àquela variação, assim: para cada valor da variável contadora, desde o valor inicial até o valor final, executa-se uma vez o bloco de instruções.
Um exemplo de aplicação dessa terceira forma é obter a soma dos divisores próprios de um valor inteiro maior do que um, a descrição do algoritmo encontra-se no Quadro 7.
Quadro 7: Algoritmo ± soma dos divisores próprios somadivisores( )
leia(valor); somaÅ 0;
para d de 1 até (valor div 2) passo 1 faça restoÅ valor mod d;
se resto=0 então somaÅ soma+d; imprima(soma);
Observação: do ponto de vista lógico, bastariam a primeira forma de controle de seleção (se ... então ...) e a primeira forma de controle de
repetição (enquanto ... faça ...), as outras formas sempre podem ser
reduzidas a estas duas. O motivo que justifica a existência dessas várias formas é a busca da naturalidade nas formas de expressão das linguagens de programação.
As formas gerais das estruturas de repetição estão descritas no Quadro 8. Nas duas primeiras formas (repetição por teste lógico) a expressão, que
define o elemento chave do controle, é uma expressão lógica (booleana) que pode ser obtida pela utilização de operadores relacionais ou operadores lógicos.
Na terceira forma (repetição por contagem) os parâmetros inic, fim e p
44
Quadro 8: Estruturas de controle de repetição
linguagem algorítmica linguagem C/C++ estrutura de controle de repetição com teste lógico a priori
enquanto expressão faça bloco; próxima instrução; while(expressão){ bloco; } próxima instrução;
estrutura de controle de repetição com teste lógico a posteriori
faça bloco; enquanto expressão ; próxima instrução; do{ bloco; }while(expressão); próxima instrução;
estrutura de controle de repetição por variável contadora
para vc de inic até fim passo p faça
bloco; próxima instrução; for(vc=inic; vc<=fim; vc=vc+p){ bloco; } próxima instrução;
A instrução for ..., da linguagem C/C++, é mais flexível do que aquilo
que foi descrito: seu primeiro argumento, que na descrição foi colocado como
vc=inic, pode conter outras instruções; esse primeiro argumento será executado
uma única vez antes da primeira execução do bloco; seu segundo argumento (na
descrição: vc<=fim) é uma expressão lógica que será avaliada antes de cada
execução do bloco, seu valor lógico (verdadeiro ou falso) é que determina a
execução do bloco (verdadeiro) ou a finalização do processo de repetição (falso);
o terceiro argumento, que assim como o primeiro pode conter várias instruções, será executado após cada execução do bloco que constitui o anel de repetição.
O tratamento de um problema computacional, cujo método de resolução envolva o emprego das estruturas de controle de seleção, exige do estudante a combinação de modelos lógicos mais complexos: ao buscar a construção do processo de resolução do problema, o aluno deve perceber a necessidade de estabelecer diferentes seqüências de ações que ficarão subordinadas à
45
ocorrência de alguns elementos próprios do cenário do problema e que deverão ser traduzidos pelos respectivos controles; a construção exige, em um primeiro momento, o reconhecimento de elementos que serão responsáveis por acionar as respectivas seqüências de ações, e depois a organização e a vinculação dessas seqüências aos elementos que deverão constituir os controles de seleção.
Na resolução do problema:
O proprietário de um conjunto de salas comerciais fixou como vencimento de seus aluguéis o dia 15 de cada mês. Se o pagamento for efetuado antes do dia 9 é concedido um desconto de 8% mas se o pagamento ocorrer após o vencimento (dia 15) é cobrada multa de 20% e juros (simples) de 0,86% a cada dia de atraso. Conhecendo-se o valor original do aluguel e o dia (dentro do mês de vencimento) em que é feito o pagamento, como calcular o total a ser pago? (Adaptado de notas de aulas)
o aluno deve perceber o dia do pagamento como elemento que deverá compor os controles de seleção e estabelecer a vinculação entre as três alternativas ± pagamento antes dia 9 ou pagamento entre o dia 9 e o dia 15 ou pagamento depois do dia 15 ± e as ações correspondentes: realizar o desconto ou manter o valor original ou aplicar multa e juros. Já para a resolução do problema:
A montagem de uma determinada placa de circuito eletrônico exige a utilização de três tipos de componentes: dois componentes do tipo A, três componentes do tipo B e sete componentes do tipo C. Conhecendo-se as quantidades disponíveis de cada tipo de componente, como determinar a quantidade máxima de placas que podem ser montadas? (MARTINS; RODRIGUES, 2008, p.75)
os elementos que devem definir o processo de seleção não aparecem prontos na proposta; tais elementos deverão ser produzidos por operações aritméticas (cálculo de quocientes) e depois utilizados para compor as estruturas de controle de seleção; nessa situação, o estudante deverá pensar nas quantidades de agrupamentos de cada tipo de componente e na seleção da menor dessas quantidades. Nesse caso, uma estratégia que pode auxiliar na construção do método geral de resolução é propor que o aluno resolva um caso particular do problema, antes de buscar a solução geral, por exemplo:
46
A montagem de uma determinada placa de circuito eletrônico exige a utilização de três tipos de componentes: dois componentes do tipo A, três componentes do tipo B e sete componentes do tipo C. Se as quantidades disponíveis forem: 87 componentes de tipo A, 148 de tipo B e 315 componentes de tipo C, qual a quantidade máxima de placas que podem ser montadas?
O trabalho com um caso particular do problema pode sugerir ou favorecer a constituição do método de resolução geral.
A criação e organização de um processo que envolva o emprego das estruturas de controle de repetição também exigem do estudante a combinação de modelos lógicos complexos: ao buscar a construção do processo de resolução de um problema, o aluno tem que notar a necessidade de organizar uma determinada seqüência de ações que ficará sujeita a várias repetições e, ao mesmo tempo, configurar o controle desse processo. Por exemplo: ao tratar a resolução do problema, adaptado de Salvetti e Barbosa (1998, p.24):
Uma criação de coelhos é iniciada com um casal de recém-nascidos. Sabendo-se que um casal torna-se adulto depois de dois meses do seu nascimento e que, a partir de então (inclusive), gera um novo casal a cada mês, e supondo-se que não ocorra qualquer morte, quantos meses são necessários para que a criação supere uma determinada quantidade q de casais?
é necessário que o aluno estabeleça as relações aritméticas que representem a ³HYROXomR´ PrV D PrV GD FULDomR RUJDQL]H WDLV UHODo}HV FRPR XPD VHTrQFLD que terá sua execução repetida por várias vezes, e constitua o elemento que deverá realizar o controle do processo de repetição.
Uma estratégia que pode favorecer a construção do método de resolução desse problema é propor a construção de um quadro que represente a evolução da criação de coelhos até o mês 7, conforme a Figura 2.
47 Figura 2 ± Representação da evolução
Depois disso, propor que uma tabela com as quantidades de casais de coelhos seja completada, até o mês 10, conforme indicado na Figura 3.
Figura 3 ± Quantidades de casais
E ainda, explicitar e justificar as relações que foram empregadas para completar a tabela. Por exemplo:
x a quantidade de casais jovens num determinado mês é igual à quantidade de
casais recém-nascidos do mês anterior;
x a quantidade de casais recém-nascidos num determinado mês é igual à
quantidade de casais adultos do mesmo mês;
x a quantidade de casais adultos num determinado mês é igual à soma das
quantidades de casais jovens e casais adultos do mês anterior.
A partir dessas tarefas iniciais, o estudante deve perceber que o mecanismo utilizado para completar o segundo quadro poderá ser convertido numa seqüência de instruções que definem a composição do bloco de ações cuja execução deverá ser repetida várias vezes. O controle desse processo de repetição será constituído com base na questão colocada na proposta do problema: quantos meses são necessários para que a criação supere uma
determinada quantidade q de casais?
48
De forma geral, a elaboração de algoritmos ou programas com as estruturas de controle de seleção e de repetição depende, depois da compreensão da proposta do problema, da habilidade em combinar vários fatores: o estudante deve perceber a necessidade do uso das estruturas de controle, deve escolher ou construir os elementos que serão empregados como chaves nos controles, deve organizar os blocos de ações que ficarão sujeitos a esses controles e associar adequadamente controles e seqüências de instruções. Normalmente observa-se depois de concluído o esboço do método de resolução, já durante a elaboração do algoritmo ou programa, um processo de ajustes nessa construção, com alguns refinamentos ou mesmo modificações sobre o projeto esboçado, até que se obtenha o método pretendido.