Estruturas de Controle controles de seleção fluxos alternativos controles de repetição fluxos repetitivos 1
Uma estrutura de controle é uma instrução de controle e sua coleção de comandos cuja execução ela controla. O exemplo ao lado ilustra um controle de seleção de fluxo de execução. verdadeiro instrução falso instrução 2
As computações em programas de linguagens imperativas são realizadas avaliando-se expressões e atribuindo-se os valores resultantes a variáveis. Entretanto, há somente alguns programas úteis que consistem inteiramente em seqüências simples instruções de atribuição. Pelo menos dois mecanismos lingüísticos adicionais são necessários para ampliar as possibilidades de computações em programas: Meios de selecionar entre caminhos de execução. Meios de provocar a execução repetida de certos conjuntos de instruções. 3
Estrutura Sequencial Estrutura seletiva Estrutura repetitiva 4
Um dos recursos de linguagem que facilita o projeto e a implementação de programas é um método para formar coleções de instruções. PASCAL begin end; <instrução 1>;... <instrução n>; C ou C++ ou Java { <instrução 1>;... <instrução n>; } 5
Estrutura de controle de seleção de um ramo Forma geral em JAVA... if(<expressão booleana>) <instrução 1>; <próxima instrução>;... Mecanismo: a <expressão booleana> é avaliada, se o valor lógico encontrado for true, a <instrução 1> será executada e depois o fluxo segue para a <próxima instrução>, se o valor lógico encontrado for false, a <instrução 1> não será executada e o fluxo segue para a próxima instrução. 6
Estrutura de controle de seleção de um ramo Uma forma de se vincular mais de uma instrução a um controle de seleção é utilizar instruções compostas: if(<expressão booleana>){ <instrução 1>; <instrução 2>;... <instrução n>; } <próxima instrução>; 7
Estrutura de controle de seleção de dois ramos Sintaxe para uma seleção de dois ramos em Java, com instruções compostas: Qual é o mecanismo associado? if(<expressão booleana>){ <instrução 1a>; <instrução 2a>;... <instrução na>; } else { <instrução 1b>; <instrução 2b>;... <instrução nb>; } <próxima instrução>; 8
exemplo de utilização de uma seleção de dois ramos e instruções compostas: public class Principal { public static void main(string[] args) { Aplicacao ap = new Aplicacao( ); ap.executar(); } } import javax.swing.joptionpane; class Aplicacao{ void executar( ){ int angulo1, angulo2, angulo3, soma; angulo1=integer.parseint(joptionpane.showinputdialog("medida do primeiro?")); angulo2=integer.parseint(joptionpane.showinputdialog("medida do segundo?")); soma=angulo1+angulo2; if(soma<180 && angulo1>0 && angulo2>0){ angulo3=180-soma; JOptionPane.showMessageDialog(null,"terceiro angulo: "+angulo3); } else{ JOptionPane.showMessageDialog(null," medidas incompativeis"+ "\n nao ha constituicao de um triangulo "); } } 9 }
Exercício Acrescente ao ramo que representa a alternativa positiva (existência do triângulo) as instruções necessárias para que, além de exibir a medida do terceiro ângulo, o programa produza como resultado mais uma mensagem: triângulo retângulo ou triângulo não retângulo Observação: um triângulo é retângulo se algum de seus ângulos for reto (medida de 90 0 ). 10
Tipo de dados booleano ( lógico ) Elementos: os valores lógicos: true e false (verdadeiro e falso) Operações não (! ) negação e ( && ) conjunção ou ( ) disjunção Definição das operações lógicas pela tabela verdade não e F T ou F T F T F F F F F T T F T F T T T T 11
Exemplos de expressões lógicas (a+x<0) ou (b=0) (a+x<0) (b==0) (a>0) e (b-6 a) (a>0) && (b-6>=a) não( (a=0) ou (a=1) )! ( (a==0) (a==1) ) 12
É possível colocar um seletor como instrução de um outro seletor. Isto pode gerar dúvidas dependendo da construção do programa. Pode haver duas interpretações deste programa: uma que a cláusula else é referente ao primeiro if e a outra é que ela seja referente ao segundo if (exemplo A). Muitas linguagens têm como padrão que o else estará vinculado ao comando if... não-emparelhado mais próximo, portanto, no exemplo seria ao segundo if. Porém pelo fato de este ser um fator que pode gerar dúvidas no momento da leitura do código, é recomendável que seja explicitado o vínculo da cláusula else com seu respectivo if... através da utilização de instruções compostas (exemplo B). 13
if(soma==0) if(cont!= 0) resultado=0; else resultado=1; if(soma==0){ if(cont!=0) resultado=0; } else resultado=1; 14
problema proposto A montagem de uma determinada placa de circuito eletrônico exige a utilização de dois tipos de componentes: três componentes do tipo A e cinco componentes do tipo B. Conhecendo-se as quantidades disponíveis de cada tipo de componente, como determinar a quantidade máxima de placas que podem ser montadas? Utilize variáveis de tipo int para representar as quantidades. Esboço do método de resolução: realizar as duas entradas (quantidades disponíveis de cada tipo de componente) obter o quociente do primeiro valor dividido por 3 e o quociente do segundo valor por 5 o menor dos dois quocientes será a quantidade máxima de placas realizar a saída Elabore a implementação do programa Java correspondente 15
problema proposto Uma determinada ração animal é obtida juntando-se farinha de soja, farinha de milho e farinha de ossos, na proporção 5:3:2 (proporção em massa, por exemplo em toneladas). Conhecendo-se as massas de cada tipo de farinha disponíveis em estoque, como determinar a quantidade máxima de ração possível de se obter? Utilize variáveis de tipo float para representar as massas. Esboço do método de resolução: realizar as três entradas (quantidades disponíveis de cada tipo de farinha) obter o quociente do primeiro valor dividido por 5, o quociente do segundo valor por 3 e o quociente do terceiro valor por 2 obter o menor dos três quocientes calculados a quantidade máxima de ração será esse menor quociente multiplicado por 9 realizar a saída Elabore a implementação do programa Java correspondente 16
problema proposto Conhecendo-se os valores correspondentes a dia, mês e ano de uma data, como determinar a quantidade de dias entre esta data e o final do mês dessa mesma data? Observações: - um ano é bissexto se for múltiplo de 4 mas não de 100, ou se for múltiplo de 400; - fevereiro tem 29 ou 28 dias conforme o ano seja bissexto ou não; - janeiro, março, maio, julho, agosto, outubro e dezembro têm 31 dias; - abril, junho, setembro e novembro têm 30 dias. 17
Instruções Iterativas controles de repetição Uma instrução iterativa faz com que uma ou mais instruções sejam executadas nenhuma, uma ou várias vezes. A iteração é a própria essência do poder dos computadores. Sem este recurso, programas úteis teriam um código-fonte muito grande e demorariam muito para serem escritos. Existem algumas formas de se implementar instruções iterativas, e estas formas podem ser classificadas segundo alguns aspectos: - Como a iteração é controlada, - Onde o mecanismo de controle aparece no laço. 18
Instruções Iterativas As formas de controle de repetição são: controle lógico ou controle por contagem ou a combinação dos dois. As possibilidades para a localização do mecanismo de controle são o topo ou a base do laço. O corpo de um laço é a coleção de instruções cuja instrução de iteração controla a execução. Utilizamos o termo pré-teste com o sentido de que o teste para a finalização do laço ocorre antes do corpo do laço ser executado. E pós-teste significa que ele ocorre depois que o corpo do laço é executado. A instrução de controle e o corpo do laço associado formam, juntos, uma estrutura de controle de repetição. 19
Instruções iterativas lógicas com pré-teste Préteste 20
Instruções iterativas lógicas com pós-teste Pósteste 21
Instruções iterativas com contagem inicia, controla e incrementa o contador 22
Laços Controlados por Contador Uma instrução iterativa de controle por contagem tem uma variável de laço, na qual o valor da contagem é mantido. Ela também possui alguns meios de especificar os valores inicial e final da variável de laço e a diferença entre seus valores seqüenciais, chamado passo de variação. As especificações valor inicial, valor final e passo de variação de um anel de repetição são chamados de parâmetros do laço. 23
Laços Controlados por Contador Muitas linguagens implementaram suas instruções iterativas de contagem com formatos distintos entre sí, porém o objetivo de todas elas é executar uma ou mais instruções um certo número de vezes. No caso da linguagem Pascal a instrução possui a seguinte sintaxe. for<variável>:=<valor inicial>(to downto)<valor final> do <instrução> A opção to downto define se a variação de contagem será crescente ou decrescente, o passo de variação é unitário. 24
Laços Controlados por Contador Na linguagem Java a forma geral é: for(<expressão1>;<expressão2>;<expressão3>){ <instrução 1>; <instrução 2>; corpo do laço... <instrução n>; } O corpo do laço pode ser: uma instrução única; uma instrução composta ou uma instrução nula. A primeira expressão é avaliada uma única vez quando se inicia o loop. Normalmente é utilizada para inicializações. A segunda expressão é o controle do laço, é avaliada antes de cada execução do corpo do mesmo. A terceira expressão é avaliada depois de cada execução do corpo do laço. Normalmente utilizada para incrementos de variáveis. 25
Exemplo típico da utilização do laço de contagem: for (dia = 1; dia < 15; dia=dia+1){ qtd=integer.parseint(joptionpane.showinputdialog( dia +dia+ quantas ocorrencias? ); tot=tot+qtd; } Pode-se utilizar expressões múltiplas no caso da linguagem Java. Veja o exemplo: for (cont1=0, cont2=0.0, soma=0; cont1<=10 && cont2<=100.0; soma=soma+cont1+cont2, cont2=cont2*2.5); 26
Laços Controlados Logicamente Em várias situações não se sabe exatamente a quantidade de vezes que um determinado laço deve ser executado, portanto, o processo de controle por contador não é o mais adequado. Nestes casos, são utilizados os laços controlados logicamente. A continuidade da repetição do laço depende de uma expressão lógica. 27
Laços controlados logicamente Forma geral (Java): pré-teste while(<expressão booleana>){ } <instrução 1>; <instrução 2>;... <instrução n>; pós-teste do{ <instrução 1>; <instrução 2>;... <instrução n>; }while(<expressão booleana>); 28
Laços Controlados Logicamente Localização do controle do laço Quando devemos colocar o controle do laço no topo ou na base do laço? Ao colocar o controle no topo, o teste será efetuado antes da primeira execução do corpo e, por isso mesmo, pode ocorrer de não ser executado nenhuma vez. No caso de colocar o controle na base, o corpo do laço será executado pelo menos uma vez, o teste será realizado pela primeira vez após a primeira execução do corpo. 29
Laços Controlados Logicamente Java possui o comando continue que desvia a execução do programa da sua localização dentro do corpo do laço até o final do corpo. Este comando não encerra a execução do loop. Possui também o comando break que provoca o desvio para o final do corpo do laço, porém, o laço será terminado. 30
Laços Controlados Logicamente Os exemplos abaixo ilustram a utilização do continue e do break. No primeiro caso um valor negativo que seja lido será ignorado e portanto, não acumulado na variável soma. No segundo caso, a entrada de um valor negativo encerra o loop. while(soma < 1000) { valor=integer.parseint(joptionpane.showinputdialog( valor? )); if (valor<0) continue; soma=soma+valor; } while(soma < 1000) { valor=integer.parseint(joptionpane.showinputdialog( valor? )); if (valor<0) break; soma=soma+valor; } 31
O método executar( ) descrito abaixo deve realizar a entrada do valor x, e obter o valor da seguinte soma: y = 1/x + 1/(x+1) + 1/(x+2) + 1/(x+3) supor que x seja maior do que zero Complete sua construção. void executar( ){ double x, y; x=double.parsedouble(joptionpane.showinputdialog("valor x?")); y= 1/x ; y= y + 1/(x+1); y= y + 1/(x+2) ; y=????????????? ; JOptionPane.showMessageDialog(null,"valor da soma y: "+y); } 32
O método executar( ) descrito abaixo deve realizar a entrada do valor x, e obter o valor da seguinte soma: y = 1/x + 1/(x+1) + 1/(x+2) + 1/(x+3) +... + 1/(x+100) supor que x seja maior do que zero Complete sua construção. void executar( ){ double x, y, denominador; int valor; x=double.parsedouble(joptionpane.showinputdialog("valor x?")); y= 1/x; //primeira parcela for(????????????????){ denominador= x + valor; y= y +??????????; } JOptionPane.showMessageDialog(null,"valor da soma y: "+y); } 33
problema proposto Como obter a soma dos algarismos que compõem a notação de um valor inteiro positivo conhecido? exemplo: se o valor é 3629 a soma dos algarismos vale 3+6+2+9=20 34
esboço do método de resolução: separar cada um dos dígitos (da direita para a esquerda) e paralelamente ao processo de separação, construir a soma dos algarismos. Veja o exemplo: valor inicial da soma: 0 (nehum dígito foi separado) primeiro dígito separado: 9 operação: soma=soma+9 dígito separado: 2 operação: soma=soma+2 dígito separado: 6 operação: soma=soma+6 dígito separado: 3 operação: soma=soma+3= 20 3629 10 9 362 10 2 36 10 6 3 10 3 0 quociente igual a 0 fim do processo 35
problema proposto Modifique o programa obtido na tarefa anterior para além da soma dos algarismos, determinar também quantos de seus algarismos são ímpares. 36
problema proposto Conhecendo-se o valor real x (não nulo) e o inteiro n (n>1), como obter o valor da soma descrita abaixo? 1 x 1 x 2 1 x 3... 1 x n Observe que em cada parcela o numerador é sempre igual a 1 e cada novo denominador é igual ao anterior multiplicado por x. 37
problema proposto Um policial rodoviário anota em sua ficha, a cada multa aplicada por excesso de velocidade, a velocidade autuada. Conhecendo-se a série de valores anotados num dia, como obter a maior das velocidades anotadas? Não é conhecida previamente a quantidade de multas aplicadas. Supor que após o último valor anotado será digitado o valor zero (o zero indica fim da entrada de dados). Supor que não ocorra empates. 38
problema proposto Um policial rodoviário anota em sua ficha, a cada multa aplicada por excesso de velocidade, a velocidade autuada. Conhecendo-se a série de valores anotados num dia, como obter a maior das velocidades anotadas e também a quantidade de vezes em que essa maior velocidade foi registrada? Não é conhecida previamente a quantidade de multas aplicadas. Supor que após o último valor anotado será digitado o valor zero (o zero indica fim da entrada de dados). 39
problema proposto Um policial rodoviário anota em sua ficha, a cada multa aplicada por excesso de velocidade, a velocidade autuada. Conhecendo-se a série de valores anotados num dia, como obter as duas maiores velocidades registradas? Não é conhecida previamente a quantidade de multas aplicadas. Supor que após o último valor anotado será digitado o valor zero (o zero indica fim da entrada de dados). Supor que não ocorra empates. 40
problema proposto O gerente de uma biblioteca virtual registrou, dia a dia durante o mês de junho, a quantidade de visitas recebidas. Conhecendo-se essa série de quantidades anotadas, em ordem cronológica, como determinar se a primeira ou a segunda quinzena do mês apresentou maior movimento de visitantes? 41