7 – Testes e Condições Unesp – Campus de Guaratinguetá Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante 7 Seleção de Ações Alternativas Suponha que temos duas variáveis numéricas, A e B, cujos valores são diferentes, e desejamos imprimir a maior delas. Neste caso utilizamos uma construção chamada Se_Então_Senão SIM A >B? NÃO escreva (A) escreva (B) Testes e Condições 2 7 Seleção de Ações Alternativas Em Linguagem Algorítmica a construção Se_Então_Senão tem o seguinte formato: Se “condição” então “alternativa verdadeira” senão “alternativa falsa” Exemplo: Se A > B então Escreva ( A ) senão Escreva ( B ) Testes e Condições 3 7 Seleção de Ações Alternativas Um conjunto especial de operadores relacionais é solicitado para expressar condições. São eles: Operador em Operador em Linguagem Linguagem C Algorítmica Significado > > maior do que < < menor do que = == igual a ≥ >= maior do que ou igual a ≤ <= menor do que ou igual a ≠ != não igual ( diferente de ) Testes e Condições 4 7 Seleção de Ações Alternativas Exemplo 1: Fazer um algorítmo em que dadas as três notas individuais em três aspectos do ano escolar (Lab, Exame_inter, Exame_final) para um estudante chamado Nome. O algorítmo deve calcular a média final com pesos de 20%, 30% e 50%, respectivamente. O relatório de saída deve fornecer o nome do aluno, suas notas individuais,sua média final e uma mensagem caso o aluno esteja reprovado. A variável Média é real. Algoritmo Relatório Variáveis: Lab, Exame_inter, Exame_final, Média : reais Nome : cadeia de caractere Início 1. [Ler dados] Leia [Nome, Lab, Exame_inter, Exame_final] 2. [Calcular a média] Média 0.2 * Lab + 0.3 * Exame_inter + 0.5 * Exame_final Testes e Condições 5 7 Seleção de Ações Alternativas Exemplo 1: Continuação.... 3. [Imprimir resultados] Escreva (´Nome estudante:´, Nome) Escreva (´Nota Laboratório:`, Lab) Escreva (´Exame Intermediário:`, Exame_inter) Escreva (´Exame Final`, Exame_final) Escreva ( ´Média Final:`, Média) 4. [Verificar se tem aluno reprovado] Se Media < 5.0 então Escreva (´Reprovado`) Fim Testes e Condições 6 7 Seleção de Ações Alternativas Exemplo 2: Faça um algoritmo que leia dois valores, determine o maior deles e o imprima com uma mensagem de identificação. Assumir que todas as variáveis são inteiras. Algoritmo Mostre 3. [Imprimir o maior valor] Variáveis: Valor1, Valor2, Max : inteiras Escreva (´Maior Valor =`, Max) Início 4. [Terminar] 1. [Ler os valores] Fim Leia ( Valor1, Valor2 ) 2. [Determinar o maior] Se Valor1 > Valor2 então Max Valor1 Escreva (´O Primeiro valor é maior`) senão Max Valor2 Escreva (´O Segundo Valor é maior`) Testes e Condições 7 7.1 Diagrama de blocos - Fluxograma Como já foi dito anteriormente, antes de se fazer um programa, deve-se fazer um algoritmo de problema. Para tanto temos utilizado uma linguagem algorítmica que também chamamos de portugol. Uma outra maneira de se escrever algoritmos é através de fluxograma ou diagrama de bloco. No fluxograma, as ações a serem executadas são representadas de maneira gráfica. Embora a linguagem algorítmica seja mais utilizada, existem vários livros que utilizam o fluxograma para explicar partes do algoritmo, devido ao seu forte apelo visual A seguir mostramos rapidamente as ferramentas utilizadas para a 8 confecção de um fluxograma.Testes e Condições 7.1 Diagrama de blocos - Fluxograma Símbolo Descrição Inicio/Fim Delimita o início ou o final das instruções. Leitura Leitura de dados (através do teclado, pex). Cond Avaliação de uma condição. Resultados Apresentação de resultados. Operacoes Atribuição ou operação de processamento. Fluxo de execução. Conexão entre partes do algoritmo. Testes e Condições 9 7.1 Diagrama de blocos - Fluxograma Problema Maior Suponha duas variáveis numéricas, A e B, com valores diferentes, e deseja-se imprimir a maior delas. Algoritmo Maior Variaveis A, B; Inicio 1. Ler(A,B); 2. Se (A > B) entao imprimir A; Senao imprimir B; Fim Inicio Ler A,B; V Se A>B F Escreva(A); Testes e Condições Escreva(B); Final 10 7.2 Seleção de Ações Alternativas : Ses Encaixados 7.2 Seleção de Ações Alternativas : Ses Encaixados Em algumas aplicações, uma das alternativas de uma estrutura Se_Então_Senão pode envolver outras decisões Exemplo 3 : Faça um algoritmo que leia três números A, B e C e imprima o valor do maior. Assumir valores distintos e reais. Algorítmo Max_3 Variáveis A, B, C, Max : reais Início 1. [Ler dados] Leia (A, B, C) Testes e Condições 11 7.2 Seleção de Ações Alternativas : Ses Encaixados Inicio Exemplo 3: Continuação.... 2. [Determinar o maior valor, comparando pares] Se A > B Ler A,B,C; V F Se A > B Então Se A > C então Max A ( A > B,A > C ) senão Max C ( C > A > B ) V V Se B > C Se A > C Senão Se B > C F F então Max B ( B > A, B > C ) A; C; B; C; senão Max C ( C > B > A ) 3. [Imprimir o maior valor] Escreva (´Maior valor =`, Max) Escreva(Max); 4. [Terminar] Testes e Condições 12 Fim Final 7.2 Seleção de Ações Alternativas : Ses Encaixados Cuidado com a paragrafação (indentação) Ex1: Se C1 então Se C2 então S1 senão S2 onde: C1 e C2 significam condições e S1 e S2, comandos Em que condições S2 é executado? Isso não fica claro. Testes e Condições 13 7.2 Seleção de Ações Alternativas : Ses Encaixados Ex2: Se C1 então Se C2 então S1 senão S2 Neste exemplo, o comando Se C2 só será executado se a condição C1 for Verdadeira. Se C1 for falsa, nenhum comando será Executado. Se C1 então Se C2 então S1 senão S2 Neste exemplo, o comando Se C2 só será executado se a condição C1 for verdadeira. Se ela for falsa, o comando S2 será executado Testes e Condições 14 7.2 Seleção de Ações Alternativas : Ses Encaixados Exemplo 4: Uma empresa decidiu dar uma gratificação de Natal a seus funcionários. Esta gratificação é calculada com base no número de horas extras trabalhadas e o número de horas de falta. A fórmula para se calcular o prêmio é a seguinte: Extra – 2 /3 * Faltas. O prêmio é distribuído segundo a tabela a seguir: Extra – 2/3 * Faltas Prêmio (R$) > 40 horas 50 > 30 mas <= 40 horas 40 > 20 mas <= 30 horas 30 > 10 mas <= 20 horas 20 <= 10 horas 10 Pede-se um algoritmo e um programa em C, para ler informações de funcionários e calcular o prêmio a ser dado. Testes e Condições 15 Exemplo 4: continuação Algoritmo Bônus Variáveis: Extras, Faltas, Pagamentos : reais Se A > 40 Nome : cadeia F Início 1. [Ler informações de um funcionário] Leia (Nome, Extras, Faltas) Se A > 30 2. [Calcular o prêmio] Se Extras – (2/3.0) * Faltas > 40 F Então Pagamento 50 Senão Se Extras – (2/3.0) * Faltas >30 Se A > 20 Então Pagamento 40 Senão Se Extras – (2/3.0) * Faltas >20 F Então Pagamento 30 Senão Se Extras – (2/3.0)*Faltas>10 Se A > 10 Então Pagamento 20 Senão Pagamento 10 F 3. [Imprimir resultados] Escreva ( ´Prêmio para`, Nome,`=R$`, Pagamento) Testes e Condições P10; Fim V P50; V P40; V P30; V P20; 16 Exemplo 4: continuação Podemos melhorar este algorítmo, calculando o valor do teste (Extra – (2/3.0) * Faltas) somente uma vez. Para isto vamos introduzir uma variável temporária (Valor_teste). 2.1 [Calcular o valor teste] Valor_teste Extras – (2/3.0) * Faltas 2.2 [Calcular o prêmio] Se (Valor_teste > 40) Então Pagamento 50 Senão Se Valor_teste > 30 Então Pagamento 40 Senão Se Valor_teste > 20 Então Pagamento 30 Senão Se Valor_teste > 10 Então Pagamento 20 Testes e Condições Senão Pagamento 10 17 7.3 Seleção de Ações Alternativas: O Comando if Em linguagem C a construção Se – Então - Senão é feita através dos comandos if-else: Comando if Falso = 0 Verdadeiro 0 # Sintaxe: if (expressão é verdadeira) execute comando ou bloco de comandos # Exemplo: if (contador > 9) contador = 0; Testes e Condições 18 7.3 Seleção de Ações Alternativas: O Comando if OBS: Quando dentro do comando if, forem executados mais de um comando (bloco de comando) é necessário colocar chaves, {}, para marcar o início e o fim dos comandos a serem executados. Aqui tem duas ações sendo feitas dentro da condição verdadeira # Exemplo: Chave marcando o início da condição verdadeira Chave marcando o fim da condição verdadeira if (contador >9) { contador = 0; soma = 32 } Testes e Condições 19 7.3 Seleção de Ações Alternativas: O Comando if Exemplo 5 Fazer um programa em C que leia um número e imprima uma mensagem dizendo se ele é maior, menor ou igual a 10. Observe a chave { marcando o início do if #include <stdio.h> #include <stdlib.h> main () { /* Início do programa */ int num; printf ("Digite um numero: "); scanf ("%d",&num); if (num > 10) printf ("\n\n O numero digitado eh maior que 10"); if (num == 10) { /* Início do if */ printf ("\n\n Voce acertou!\n"); printf ("O numero digitado e igual a 10."); } /* fim do if*/ if (num < 10) printf ("\n\n O numero digitado eh menor que 10"); system("pause"); } Testes e Condições 20 7.4 Seleção de Ações Alternativas: O Comando else O Comando else pode ser considerado um complemento do comando if, cujos comandos serão executados SOMENTE SE a expressão, especificada após o comando if, for 0 (falsa). # Sintaxe: if (expressão é verdadeira) Falso = 0 Verdadeiro 0 execute comando1 ou bloco1 de comandos else execute comando2 ou bloco2 de comandos Testes e Condições 21 7.4 Seleção de Ações Alternativas: O Comando else #include <stdio.h> #include <stdlib.h> main ( ) { int num; printf ("Digite um numero: "); scanf ("%d", &num); if (num == 10) {//início então printf ("\n\n Voce acertou!\n"); printf ("O numero e igual a 10.\n"); }//fim então else {//início senão printf ("\n\n Voce errou!\n"); printf ("O numero eh diferente de 10.\\nn"); }//fim senão system("pause"); } Testes e Condições Exemplo 6 Refazer o programa em C do exemplo 5 anterior, utilizando o comando else 22 7.5 Seleção de Ações Alternativas: if-else encaixados É possível aninhar construções do tipo if-else em diversos níveis. if (cond1) if (cond2) comando if2 ; else comando else2 ; else if (cond3) if (cond4) comando if4 ; else comando else4 ; else comando else3 ; /* if1 */ /* if2 */ /* else2 */ /* else1 */ /* if3 */ /* if4 */ /* else4 */ /* else3 */ Testes e Condições 23 7.6- Exercícios resolvidos - Comando If-else Exercício 1: Colocar o Exemplo 1 em Linguagem C #include <stdlib.h> #include <stdio.h> main() { // declarar variáveis float lab,exame1, exame_final, media; char nome[30]; //1. [Ler dados] printf( "Digite o nome do aluno: " ); scanf("%s",&nome); printf("\n\n" ); printf("Digite as notas de: lab, exame1 e exame_final, do aluno:%d\n", nome); scanf("%f%f%f",&lab,&exame1,&exame_final); //2. [Calcular a média] continua na página seguinte media= 0.2*lab + 0.3 * exame1 + 0.5*exame_final; 24 7.6- Exercícios resolvidos - Comando If-else // 3. [imprimir resultados] Continuação do Exercício 1 printf ("\nNome. estudante:%s\n",nome); printf("\n"); printf("Nota Laboratorio: %f\n\n",lab); printf("Exame1: %f\n\n",exame1); printf("Exame Final: %f\n\n",exame_final); printf("Media Final: %f\n\n",media); if(media < 5.0 ) printf("Reprovado\n\n\n"); else printf("Aprovado\n\n"); system("PAUSE"); Testes e Condições 25 }// fim programa 7.6- Exercícios resolvidos - Comando If-else Exercício 2: Colocar o Exemplo 3 em Linguagem C #include <stdlib.h> #include <stdio.h> Exemplo 3 : Faça um programa main( ) que leia três números A, B e C e {// declarar variáveis imprima o valor do maior.Assumir float A, B, C, max; valores distintos e reais. //1. [Ler dados] printf( "Digite tres numeros A, B, C\n" ); scanf("%f%f%f",&A,&B,&C); // 2. [Determinar o maior valor, comparando pares] if (A > B) { if (A > C) { max = A ; //( A > B , A > C ) printf( "\nO maior valor eh o A\n" ); } else { max = C ; // (A > B e C >A ) continua na próxima printf( "\nO maior valor eh o C\n" ); página } Testes e Condições } 26 7.6- Exercícios resolvidos - Comando If- else else Continuação do Exercício 2 { if (B > C) // ( B > A, B > C ) { max = B; printf( "\nO maior valor eh o B\n" ); } else { max = C; // ( C > B > A ) printf( "\nO maior valor eh o C\n" ); } } // 3. [Imprimir o maior valor] printf ("\nMaior valor =%f\n\n", max); system("pause"); } //4. Fim do programa Testes e Condições 27 7.6- Exercícios resolvidos - Comando If- else #include <stdlib.h> Exercício 3: Refazer o programa do #include <stdio.h> Exercício 2 para imprimir os 3 main ( ) números na ordem crescente. { int a, b, c, maior, meio, menor ; // declaração de variáveis. // Leitura de dados printf(" Entre com tres numeros inteiros\n"); scanf("%d%d%d",&a,&b,&c); if ( a > b ) if ( a > c ) { maior = a; if ( b > c ) { meio = b; menor = c; } else { meio = c; menor = b; } } continua na próxima else { maior = c; meio = a; menor = b; } página Testes e Condições 28 7.6- Exercícios resolvidos - Comando If- else Continuação do Exercício 3 else if ( a > c ) { maior = b; meio = a; menor = c; } else { menor = a; if ( b > c ) { maior = b; meio = c; } else { maior = c; meio = b; } } printf("Em ordem crescente: %d %d %d\n\n", menor, meio, maior); system("pause"); } //fim programa Testes e Condições 29 7.7- Exercícios para Casa - Comando If-else 1) 2) 3) 4) Colocar em Linguagem C os algoritmos dos exemplos 2, e 4. Fazer um programa em C que leia 4 números (A, B, C, D) e encontre o maior deles. Imprima uma mensagem dizendo qual deles é o maior e o valor do maior. Faça um programa em C que calcule o aumento de salário para o corrente ano. Se salário >1000 o aumento é de 5%. Senão o aumento é de 7%. Preparar um algoritmo e um programa em C para ler os comprimentos dos três lados de um triângulo (S1, S2, e S3) e determinar que tipo de triângulo temos, com base nos seguintes casos. Sejam A o maior dos lados de S1, S2, e S3 e B e C os outros dois lados. Então: Se A ≥ B + C nenhum triangulo é formado Se A2 = B2 + C2 um triangulo retangulo é formado, Se A2 > B2 + C2 um triangulo obtusangulo é formado Se A2 < B2 + C2 um triangulo acutangulo é formado Testes e Condições 30 53 7.7- Exercícios para Casa - Comando If-else 5) Faça um programa que leia dois valores, o primeiro servindo de indicador de operação e o segundo correspondendo ao raio de uma circunferência. Caso o primeiro valor lido seja igual a 1, calcular e imprimir a área desta circunferência. Se o valor lido for 2, calcular e imprimir o perímetro da circunferência. E se o valor lido for diferente destes dois valores; imprimir uma mensagem dizendo que o indicador de operação foi mal fornecido. 6) Fazer um programa que: dada a altura e peso de uma pessoa, calcule seu índice de massa corporal. Fórmula: peso dividido por altura ao quadrado. Faixas: <= 18,5 - abaixo do peso normal; > 18,5 e <= 25 - peso normal; > 25 e <=30 - peso acima do normal; acima de 30 - peso excessivo. Testes e Condições 54 31 7.7- Exercícios para Casa - Comando If-else 7) Faça um programa que leia dois valores, o primeiro servindo de indicador de operação e o segundo correspondendo ao raio de uma circunferência. Caso o primeiro valor lido seja igual a 1, calcular e imprimir a área desta circunferência. Se o valor lido for 2, calcular e imprimir o perímetro da circunferência. E se o valor lido for diferente destes dois valores; imprimir uma mensagem dizendo que o indicador de operação foi mal fornecido. 8)Fazer um programa que resolva uma equação de segundo grau, realizando consistências dos valores do discriminante e do coeficiente "a". Caso o discriminante seja negativo, deverá apenas ser impressa a mensagem: " Esta equação não possui raízes reais" . Caso o coeficiente "a" seja igual à zero, deverá ser impressa a mensagem: " Esta não é uma equação de segundo grau" e deverá ser fornecido o valor da única raiz. Se o discriminante for maior ou igual a zero e o coeficiente "a" não for nulo, deverão ser impressas: "as raízes da equação: ax2 + bx + c = 0 são R1 = xxx e R2 = xxx". Testes e Condições 55 32 Resolução Exercícios para Casa (1) #include <stdlib.h> #include <stdio.h> // Programa: Mostre o maior de 2 números main() { int Valor1, Valor2, Max; //1. [Ler os valores] printf("Digite dois numeros \n"); scanf("%d%d",&Valor1,&Valor2 ); //2. [Determinar o maior] if (Valor1 > Valor2) { Max = Valor1; printf ("\nO Primeiro valor eh maior\n"); Testes e Condições } Ex casa 1: Colocar o exemplo 2 em C continua na próxima página 33 Resolução Exercício para Casa (1) else { Max = Valor2; printf ("\nO Segundo Valor eh maior\n"); } //3. [Imprimir o maior valor] printf("Maior Valor =%d\n\n", Max); //4. [Terminar] system("PAUSE"); } Testes e Condições 34 Resolução Exercício para Casa (8) #include <stdlib.h> #include <stdio.h> #include <math.h> main() { int a, b, c; float delta, raiz1, raiz2; printf("digite os coeficientes a, b, c da equacao\n"); scanf("%d%d%d",&a,&b,&c); if(a==0) { printf(" esta equacao eh de 1o. grau\n"); raiz1= -c/b; printf(" sua raiz eh: %f \n", raiz1); } else { delta=(pow(b,2)-4*a*c); if(delta >= 0) { raiz1=(b+sqrt(delta))/(2*a); raiz2=(b-sqrt(delta))/(2*a); printf("as raizes sao:R1= %f,R2=%f \n",raiz1,raiz2); } else printf("Esta equacao nao possui raizes reais\n"); } system("PAUSE"); Testes e Condições 35 } 7.8 Aplicação: O paradoxo da inovação Os dados do censo (que ocorre a cada 10 anos) de 1880 dos EUA levaram quase 8 anos para serem processados. Temia-se que os dados do censo de 1890 não estivessem processados em 1900. Herman Hollerith (estatístico): Foi encarregado pela Agência Estatística dos EUA de desenvolver uma técnica para acelerar o processamento dos dados do censo, levando apenas 3 anos. Testes e Condições 36 7.8 Aplicação: O paradoxo da inovação Lei de Moore: O fundador da Intel, Gordon Moore, constatou que a capacidade de processamento dos computadores dobra a cada 1 ano, enquanto os custos permanecem fixos. ? Problema: Imagine que uma tarefa deve ser processada e levará 8 anos e que não pode ser movida da máquina uma vez iniciada. De acordo com a Lei de Moore deve-se esperar a melhoria dos processadores ou deve-se começar hoje ? ! Solução: O senso comum diz que é melhor começar agora, mas antes de por a mão na massa é bom olhar a Tabela dada a seguir: Testes e Condições 37 7.8 Aplicação: O paradoxo da inovação Início Tempo de Desenvolvimento (anos) Tempo de Processamento (anos) Tempo Total (anos) Final 0º. ano 0 8 8 8º. ano 1º. ano 1 4 5 5º. ano 2º. ano 2 2 4 4º. ano 3º. ano 3 1 4 4º. ano 4º. ano 4 0,5 4,5 4º. ano ! Observação: É melhor começar no 2º. ou 3º. Ano, pois com isso pode-se terminar antes a tarefa. Esta análise também pode ser útil para dividir recursos entre produção e pesquisa. 38 7.8 Aplicação: O paradoxo da inovação Forma Geral: O paradoxo da inovação pode ser formulado de acordo com três parâmetros: tempo de desenvolvimento t, taxa de aperfeiçoamento a e tempo de processamento p. No caso anterior, os valores eram: p = 8 e a = 50% = 0.5. A fórmula para o caso geral será dada por: Considerando-se t variável, a e p fixos, para encontrar o menor tempo y, pode-se fazer dy/dt =Testes 0. e Condições 8 y t t 2 p y t t (1 / a ) Alternativa: Vale a pena esperar se 39 p/(1/a) > 1 7.8 Aplicação: O paradoxo da inovação No caso anterior: 8/(1/0.5) = 4 > 1 Início Tempo de Desenvolvimento (anos) Tempo de Processamento (anos) Tempo Total (anos) Final 0º. ano 0 8 8 8º. ano 1º. ano 1 4 5 5º. ano 2º. ano 2 2 4 4º. ano 3º. ano 3 1 4 4º. ano 4º. ano 4 0,5 4,5 4º. ano Testes e Condições 40 7.8 Aplicação: O paradoxo da inovação Exemplo 7 Algoritmo: Inovação variáveis: r,p,a: real; Inicio Escreva(“Forneça a e p”) Leia (a, p); r (p/(1/a)); Se (r > 1.0) Então Escreva(‘Espere’); Senão Escreva(‘Comece’); Fim Código C // Programa: paradoxo da inovação. #include <stdio.h> #include <stdlib.h> main() { float a, p, r; printf(“Forneça a e p:”); scanf(“%f %f”,&a,&p); r = p/(1/a); if (r > 1.0) printf(“Espere”); else printf(“Comece”); system(“pause”); Testes e Condições } 41 Unesp-Campus de Guaratinguetá 7 – Testes e Condições FIM Aula 7 Referências dos slides Curso de Programação de Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Prof. Décio Mourão Testes e Condições Prof. Galeno Sena 42