Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação LP: Laboratório de Programação Apontamento 7 Prof. ISVega Março de 2004 Controle de Execução: Seleção Simples CONTEÚDO 7.1 Representação de Condições............ 2 7.2 Seleção de Uma Rota................ 4 Exercícios.......................... 5 Objetivos Estudar a representação de condições lógicas. Apresentar e estudar a estrutura de controle simples. As estruturas que controlam a realização de computações podem ser classificadas em estruturas de seleção e estruturas de repetição. As estruturas de seleção são utilizadas para descrever a realização de computações mutuamente exclusivas. Isto é, de um conjunto de computações que podem ser realizadas, apenas uma delas será selecionada pela estrutura de controle. A seleção é feita com base no valor produzido pela avaliação de uma condição. Estruturas de Seleção são caracterizadas pelo uso de uma condição para selecionar uma computação. Em termos de mapas de execução, este efeito é descrito por uma bifurcação na rota normal de uma computação. As estruturas de repetição, por outro lado, são utilizadas para descrever situações onde uma computação é repetida diversas vezes. A quantidade de repetições depende do valor produzido pela avaliação de uma condição. 1
Estruturas de Repetição são caracterizadas pelo uso de uma condição para repetir uma computação. Em termos de mapas de execução, este efeito é descrito por uma bifurcação na rota normal de uma computação, conduzindo a um trecho anterior da rota no mapa. 7.1 Representação de Condições O controle nas estruturas de seleção e de repetição é feito com base no valor lógico de uma condição. Ou seja, condições são utilizadas para selecionar rotas alternativas ou para decidir a continuação repetida de computações. Condição é representada por uma expressão que, ao ser avaliada, produz um valor do tipo boolean: true ou false. As expressões que representam condições podem ser classificadas em expressões relacionais e expressões lógicas. Expressões Relacionais Expressões relacionais são construídas com operadores relacionais. Tais expressões são utilizadas para representar condições que comparam um valor com outro, através de um operador relacional. Os operadores relacionais mais comuns são: Operador Símbolo Ordem Exemplo Significado Maior > 2 x > y x é maior do que y? Maior ou igual >= 2 x >= y x é maior ou igual à y? Menor < 2 x < y x é menor do que y? Menor ou igual <= 2 x <= y x é menor ou igual à y? Igualdade == 3 x == y x é igual à y? Desigualdade!= 3 x!= y x é diferente de y? Os operadores com menor ordem são avaliados antes dos operadores com maior ordem. Quando as ordens de avaliação dos operadores envolvidos forem iguais, far-se-á a avaliação da esquerda para a direita. Expressões Lógicas Expressões lógicas são construídas com operadores lógicos. Tais expressões podem ser utilizadas para representar condições complexas a partir de expressões-condição mais simples. Os seguintes operadores lógicos são normalmente definidos: Copyright c 1998-2004, Dr. Italo S. Vega 7-2
Operador Símbolo Ordem Exemplo Significado Negação! 1! x negação de x Conjunção && 4 x && y conjunção de x e y Disjunção 5 x y disjunção de x e y Os operadores com menor ordem são avaliados antes dos operadores com maior ordem. Quando as ordens de avaliação dos operadores envolvidos forem iguais, far-se-á a avaliação da esquerda para a direita. Cada operador lógico, ao ser avaliado, produz um valor do tipo boolean obedecendo uma tabela-verdade. A tabela verdade para o operador! é: Tabela-verdade do Operador de Negação Expressão! Expressão false true true false A tabela verdade para o operador é: Tabela-verdade do Operador de Disjunção Expressão 1 Expressão 2 Expressão 1 Expressão 2 false false false false true true true false true true true true A tabela verdade para o operador && é: Tabela-verdade do Operador de Conjunção Expressão 1 Expressão 2 Expressão 1 && Expressão 2 false false false false true false true false false true true true Condições Complexas Condições complexas podem ser representadas combinando-se expressões relacionais e expressões lógicas. Exemplo 7.1 Considerando-se que um aluno esteja aprovado somente quando sua média for maior ou igual a 7, e sua presença em aula tenha sido, no mínimo, 75%, a seguinte expressão poderia ser utilizada para representar esta condição: ( media >= 7 )&&( frequencia >= 0.75 ) Esta expressão, quando avaliada com media assumindo o valor 8 e frequencia o valor 0.95, produzirá o valor true. Interpreta-se este valor como condição válida. Copyright c 1998-2004, Dr. Italo S. Vega 7-3
7.2 Seleção de Uma Rota A bifurcação de uma rota pode ser utilizada para representar o caso onde o trecho que deve ser percorrido está subordinado a uma determinada condição. Este padrão estrutural de mapas é mostrado na Figura 7.1. Representada por uma expressão lógica ou relacional. [ condição = true ] a [ condição = false ] A avaliação da condição produz um valor do tipo boolean. Figura 7.1: Estrutura de um mapa de execução representando uma seleção simples de rota. Os ramos de rota da bifurcação encontram-se associados a uma condição. Condições podem ser representadas por uma expressões lógicas ou expressões relacionais e, quando avaliadas, produzem valores do tipo boolean. No caso do mapa da Figura 7.1, se o valor produzido pela avaliação da expressão que representa a condição for o valor true, a rota cruza o passo a. Entretanto, se a expressão produzir o valor false, a computação segue um desvio que não cruza o passo a. O diagrama sintático para a descrição de computações com seleção simples é: CmdSelecao if ( Condicao ) Comando Tais estruturas podem ser codificadas segundo o padrão: if( <condição> == true ) { // seqüência de passos da computação quando a condição for true Copyright c 1998-2004, Dr. Italo S. Vega 7-4
EXERCÍCIOS 7.1 CONDIÇÕES SIMPLES Considere a seguinte a classe CondicaoSimples do projeto ex7.1: public class CondicaoSimples { public int a; public int b; public void obterab( int novoa, int novob ) { a = novoa; b = novob; public void avaliar() { System.out.println( "a>b == " + ( a > b ) ); System.out.println( "a>=b == " + ( a >= b ) ); System.out.println( "a<b == " + ( a < b ) ); System.out.println( "a<=b == " + ( a <= b ) ); System.out.println( "a==b == " + ( a == b ) ); System.out.println( "a!=b == " + ( a!= b ) ); Tarefa 7.1.1 Preencha a tabela: a b a > b a >= b a < b a <= b a == b a! = b 4 7 4 4 3 4 Tarefa 7.1.2 Altere a descrição da classe de modo que as variáveis a e b sejam declaradas do tipo double. Preencha a tabela: a b a > b a >= b a < b a <= b a == b a! = b 4.0 7.0 4.0 3.99999 3.99999 4.0 7.2 CONDIÇÕES COMPLEXAS Considere a seguinte a classe CondicaoComplexa do projeto ex7.2: public class CondicaoComplexa { public int a; public int b; public void obterab( int novoa, int novob ) { a = novoa; b = novob; public void avaliar() { System.out.println( "a>b == " + ( a > b ) ); System.out.println( "!(a>b) == " + (! ( a > b ) ) ); System.out.println( "(a>=b)&&(a<b) == " + (( a >= b )&&( a < b )) ); System.out.println( "(a>=b) (a<b) == " + (( a >= b ) ( a < b )) ); System.out.println( "a==b == " + (a == b) ); System.out.println( "!(a==b) == " + (!( a == b ))); System.out.println( "a!=b == " + (a!= b) ); Tarefa 7.2.1 Preencha as tabelas: Copyright c 1998-2004, Dr. Italo S. Vega 7-5
Tarefa 7.2.2 a b a > b!(a > b) (a < b)&&(a < b) (a >= b) (a < b) 4 7 4 4 3 4 a b a == b!(a == b) a! = b 4 7 4 4 3 4 Acrescente o seguinte comando no final do método avaliar(): System.out.println( "Resultado= " + (! a == b )); O que acontece como resultado da compilação da aplicação alterada? Porquê? 7.3 SELEÇÃO DE UMA ROTA Tarefa 7.3.1 Crie um novo projeto denominado ex7.3. Digite e salve a seguinte classe em um arquivo denominado Detetor.java: public class Detetor { public Entrada entrada; public Saida saida; public Detetor() { entrada = new Entrada(); saida = new Saida(); public void determinarlimite() { String limite = "Normal"; int nivel = entrada.nivel; if( nivel > 5 ) { limite = "Acima do limite"; saida.mostrar( limite ); Tarefa 7.3.2 Entrada.java: Digite e salve a seguinte classe em um arquivo denominado public class Entrada { public int nivel; public void obternivel( int novo ) { nivel = novo; Tarefa 7.3.3 Saida.java: Digite e salve a seguinte classe em um arquivo denominado public class Saida { public void mostrar( String resultado ) { System.out.println( resultado ); Tarefa 7.3.4 Crie o objeto d:detetor e recupere o objeto entrada. Altere o nível de entrada de acordo com a tabela a seguir, e anote os resultados apresentados na saida: nivel saida 4 5 6 Copyright c 1998-2004, Dr. Italo S. Vega 7-6
Tarefa 7.3.5 O mapa de execução mostrado na Figura 7.1 procura descrever a computação realizada pela execução do código da aplicação. limite:string = Normal Acima do limite [ nível > 5 ] determinarlimite( ) obternivel( ) nivel:int = 5 mostrar( limite ) Figura 7.2: Mapa de execução para a computação descrita pela aplicação Java. A seqüência de responsabilidades do mapa corresponde à seqüência de ações descrita pelo código da aplicação? Justifique a sua resposta. Tarefa 7.3.6 Refaça o mapa anterior acrescentando os contextos d:detetor, entrada e saida. 7.4 MÁXIMO DE DOIS INTEIROS Tarefa 7.4.1 Crie um novo projeto denominado ex7.4. Descreva a classe Teto de modo a ser possível obter dois inteiros e mostrar o maior deles seguido das palavras " é maior". (A computação deve envolver, também, as classes Entrada e Saida, convenientemente elaboradas.) As variáveis que armazenam os números digitados devem ser chamadas de numero1 e numero2. A variável que armazena o valor a ser mostrado deve ser chamada de resultado. Tarefa 7.4.2 as rotas de execução, Faça um mapa de execução destacando: os passos onde ocorrem as alterações das variáveis numero1, resultado, numero2, o ponto onde ocorre a condição que verifica qual dos números é o maior. o ponto onde o valor da variável resultado é apresentado para o usuário. Tarefa 7.4.3 Execute a aplicação e preencha a seguinte tabela: numero1 numero2 saida 4 3 4 4 4 5 7.5 NÚMEROS PARES Números pares têm a propriedade de serem divisíveis por 2. Copyright c 1998-2004, Dr. Italo S. Vega 7-7
Tarefa 7.5.1 Proponha um mapa de execução que descreva a obtenção de um número seguida da determinação se ele é ou não um número par. (Use o operador %. Faça uso dos contextos Par, entrada e saida.) Tarefa 7.5.2 Crie um novo projeto denominado ex7.5. Escreva as classes que implementam o mapa elaborado na tarefa anterior. 7.6 SITUAÇÃO DE UM ALUNO A situação final de um aluno depende das notas obtidas nas provas P1 e P2. Com base nestas notas, a sua média é calculada pela fórmula: MF = (P1 + P2)/2 A situação final do aluno será APROVADO, caso o valor de MF seja maior do que 5. A situação do aluno, no entanto, será REPROVADO, no caso de MF não superar 5. Proponha um mapa de execução onde se garanta a seguinte seqüên- Tarefa 7.6.1 cia de passos: a) Digitar a nota P1. b) Digitar a nota P2. c) Calcular MF. d) Apresentar a situação final. Tarefa 7.6.2 Refine o mapa anterior com os contextos de execução professor responsável por calcular a média final de um aluno, aluno responsável por obter as notas P1 e P2 e mostrar o valor da média final. Tarefa 7.6.3 Crie um novo projeto denominado ex7.6. Escreva as classes que implementam o mapa elaborado na tarefa anterior. Copyright c 1998-2004, Dr. Italo S. Vega 7-8