Академический Документы
Профессиональный Документы
Культура Документы
Captulo 04
Testes e Condies
Filipe Marques
Testes e Condies
Valores Lgicos
Em C, s existem os quatro tipos bsicos anteriormente apresentados, no
havendo qualquer tipo que permita representar os valores lgicos de
verdadeiro e falso.
Assim, o valor lgico falso representado por 0 e tudo aquilo que for
diferente de 0 representa o valor lgico verdadeiro.
Os valores lgicos resultam de condies ou afirmaes que so analisadas e
cuja avaliao determina a sua veracidade ou falsidade.
Operadores Relacionais
Existem 6 operadores relacionais que podem ser utilizados na avaliao de
expresses, permitindo o estabelecimento de relaes entre os operandos.
Operador Significado
Exemplo
==
Igualdade
X == Y
>
Maior que
X>Y
>=
X >= Y
<
Menor que
X<Y
<=
X <= Y
!=
Diferente de
X != Y
Instruo if-else
A instruo de controlo if-else permite indicar quais as circunstncias em que
determinada instruo ou conjunto de instrues deve ser executada.
if (condio)
instruo1;
[else instruo2;]
O funcionamento desta instruo o seguinte:
Pgina 2
Filipe Marques
Testes e Condies
A condio avaliada
#include <stdio.h>
main()
{
float salario;
printf(Qual o salrio: );
scanf(%f, salario);
if (salario < 150000)
salario = salario + 3000;
printf(Salrio final: %.2f\n,salario);
}
Neste exemplo no h necessidade de utilizar o else, pois se o salrio for
superior ou igual a 150 000$ no adicionado qualquer valor.
Relativamente ltima linha do programa, utilizamos o %.2f de forma a evitar
que nos seja apresentado um elevado nmero de casas decimais, indicando
que a seguir ao ponto devem aparecer apenas as duas casas decimais mais
significativas da parte fraccionria.
Bloco de Instrues
Caso se deseje que um conjunto de instrues seja realizado quer no if quer
no else, estas devem ser escritas entre chavetas. Um bloco um conjunto de
duas ou mais instrues delimitadas por chavetas.
O programa seguinte l dois nmeros e apresenta-os por ordem crescente,
invocando o printf dos nmeros apenas uma vez.
#include <stdio.h>
main()
{
int x,y,tmp;
printf(Introduza dois numeros: );
scanf(%d %d, &x, &y);
if (x > y)
{
Pgina 3
Filipe Marques
Testes e Condies
tmp = x;
x = y;
y = tmp;
}
printf(%d %d\n,x,y);
}
A troca de dois valores sempre realizada em trs passos, necessitando de
uma varivel auxiliar.
Como a troca est dependente do if e composta por trs instrues, tm de
ser agrupadas num nico bloco atravs da utilizao de chavetas.
O ltimo printf deste programa sempre executado pois no depende do da
veracidade da condio efectuada.
De salientar que o bloco onde feita a troca do x com o y est indentado de
forma a ficar mais fcil de visualizar qual o cdigo que executado em
relao ao teste da condio x>y.
No entanto, o compilador ignora todos os espaos, linhas em branco e tabs
que encontrar no programa fonte, ficando ao critrio do programador.
Existe um utilitrio no Unix (indent file.c) que indenta automaticamente o
cdigo dos programas.
# include <stdio.h>
main()
{
float salario;
printf(Qual o salrio: );
scanf(%f, &salario);
if (salario <= 0)
printf(Valor invlido\n);
if (salario > 1000)
printf(Imposto = %.2f\n,salario*0.10);
else
Pgina 4
Filipe Marques
Testes e Condies
printf(Imposto = %.2f\n,salario*0.05);
# include <stdio.h>
main()
{
float salario;
printf(Qual o salrio: );
scanf(%f, &salario);
if (salario <= 0)
printf(Valor invlido\n);
else
if (salario > 1000)
printf(Imposto = %.2f\n,salario*0.10);
else
printf(Imposto = %.2f\n,salario*0.05);
}
Repare agora no exemplo seguinte.
...
if (x >= 20)
if (y >= 30)
printf(...);
else
printf(...);
...
Sempre que existam instrues if-else encadeadas, cada componente else
pertence sempre ao ltimo if que ainda no tenha um else associado.
No extracto do programa anterior, o else pertence ao if(y >= 30),
encontrando-se mal indentado.
Pgina 5
Filipe Marques
Testes e Condies
...
if (x >= 20)
{
if (y >= 30)
printf(...);
}
else
printf(...);
...
Se num conjunto de instrues if encadeadas, alguma delas no necessitar de
else, deve-se colocar esta instruo entre chavetas para que o else de algum
outro if no seja associado erradamente.
Operadores Lgicos
Por vezes uma simples condio no suficiente para tomar uma deciso,
sendo necessrio utilizar conjuntamente duas ou mais condies. Para isso
existe um conjunto de operadores lgicos:
Operador
Significado
Exemplo
&&
AND (E)
||
OR (Ou)
X==2 || x==3
NOT (Negao)
! x==0
Pgina 6
Filipe Marques
Testes e Condies
2.
==, !=
3.
&&
4.
||
5.
?:
O operador condicional ?
Suponhamos que pretendamos implementar um programa que calcule o
aumento de ordenado. Se o ordenado for maior que 1000 deve ser aumentado
5%, seno deve ser aumentado 7%.
#include <stdio.h>
main()
{
float salario;
printf(Qual o salrio: );
scanf(%f,&salario);
if (salario > 1000)
salario = salario * 1.05;
else
salario = salario * 1.07;
printf(Novo salrio: %.2f\n,salario);
}
Pgina 7
Filipe Marques
Testes e Condies
#include <stdio.h>
main()
{
float salario;
printf(Qual o salrio: );
scanf(%f,&salario);
salario = salario > 1000 ? salario*1.05 : salario*1.07;
printf(Novo salrio: %.2f\n,salario);
}
Embora parecendo semelhantes, a instruo if-else e o operador ? no so
iguais, pois o if-else indica quais as instrues a executar, enquanto que o
operador ? devolve sempre um resultado.
Switch
O seguinte programa l uma letra do utilizador e indica posteriormente qual o
estado civil respectivo.
#include <stdio.h>
main()
{
char est_civil;
printf(Qual o estado civil: );
est_civil = getchar();
if (est_civil == S)
printf(Solteiro);
else
if (est_civil == C)
printf(Casado);
else
if (est_civil == D)
printf(Divorciado);
else
Pgina 8
Filipe Marques
Testes e Condies
switch (expresso)
{
case constante1: instrues1;
case constante2: instrues2;
...
[default: instrues;]
}
A expresso deve devolver um valor do tipo char, int ou long.
Se o valor da expresso for igual a alguma das constantes que seguem cada
case, so executadas as instrues correspondentes.
Se o valor da expresso no for igual a nenhuma das constantes apresentadas,
so executadas as instrues que seguem o default, se existir.
O programa seguinte pretende escrever o estado civil correspondente a um
caractere introduzido pelo utilizador.
#include <stdio.h>
main()
{
char Est_Civil;
printf("Qual o estado Civil: "); scanf(" %c",&Est_Civil);
switch(Est_Civil)
{
case 'C': printf("Casado\n");
case 'S': printf("Solteiro\n");
case 'D': printf("Divorciado\n");
case 'V': printf("Vivo\n");
default : printf("Estado Civil Incorrecto\n");
}
}
Pgina 9
Filipe Marques
Testes e Condies
Break
A instruo break permite parar a execuo dentro de um switch, continuando
o prgrama na instruo imediatamente a seguir ao switch. Encontra-se a
seguir o programa correctamente escrito.
#include <stdio.h>
main()
{
char Est_Civil;
printf("Qual o estado Civil: ");
scanf(" %c",&Est_Civil);
switch(Est_Civil)
{
case 'C': printf("Casado\n"); break;
case 'S': printf("Solteiro\n"); break;
case 'D': printf("Divorciado\n"); break;
case 'V': printf("Vivo\n");
break;
default : printf("Estado Civil Incorrecto\n");
}
}
A seguir a um case no necessrio a criao de um bloco se existir apenas
uma instruo.
O default no necessita de break pois imediatamente terminada a instruo
switch.
O programa anterior foi alterado de forma a funcionar com maisculas e
minsculas.
#include <stdio.h>
main()
{
char Est_Civil;
printf("Qual o estado Civil: ");
scanf(" %c",&Est_Civil);
switch(Est_Civil)
Pgina 10
Filipe Marques
Testes e Condies
{
case 'c':
case 'C': printf("Casado\n"); break;
case 's':
case 'S': printf("Solteiro\n"); break;
case 'd':
case 'D': printf("Divorciado\n"); break;
case 'v':
case 'V': printf("Vivo\n"); break;
default : printf("Estado Civil Incorrecto\n");
}
Repare-se que se for escrita uma letra minuscula o programa entra no case
respectivo mas como no tem break continua a executar fazer a impresso da
maiuscula respectiva.
Pgina 11
Filipe Marques
Testes e Condies
Exerccios
Escreva um programa que solicite ao utilizador dois nmeros inteiros
e que em seguida aplique sobre esses inteiros todos os operadores
relacionais do C, mostrando o seu resultado.
#include <stdio.h>
main()
{
int x,y;
printf(introduza dois numeros inteiros: );
scanf(%d%d,&x,&y);
printf(O resultado de %d == %d %d\n,x,y,x==y);
printf(O resultado de %d > %d %d\n,x,y,x>y);
printf(O resultado de %d < %d %d\n,x,y,x<y);
printf(O resultado de %d >= %d %d\n,x,y,x>=y);
printf(O resultado de %d <= %d %d\n,x,y,x<=y);
printf(O resultado de %d != %d %d\n,x,y,x!=y);
}
Implemente um programa que indique se um nmero positivo ou
negativo.
#include <stdio.h>
main()
{
int x;
printf(Introduza um nmero: );
scanf(%d, &x);
if (x >= 0)
printf(Numero positivo\n);
else
printf(Numero negativo\n);
}
Pgina 12
Filipe Marques
Testes e Condies
Pgina 13
Filipe Marques
Testes e Condies
Filipe Marques
Testes e Condies
}
printf("Imposto de %.2f\n",salario*imposto);
Pgina 15
Filipe Marques
Testes e Condies
break;
case '-' : res = num1-num2;
break;
case 'x' : res = num1*num2;
break;
case ':' : res = num1/num2;
break;
}
printf("%d %c %d = %d\n",num1,op,num2,res);
}
Utilizando um switch, escreva um programa que indique o nmero de
dias que um determinado ms tem, considerando que o ms 2 tem 28
dias.
#include <stdio.h>
main()
{
int mes, n_dias;
printf("Introduza o mes 1..12: ");scanf("%d",&mes);
switch(mes)
{
case 2: n_dias = 28; break;
case 4:
case 6:
case 9:
case 11: n_dias = 30; break;
default: n_dias = 31;
}
printf("O mes %d tem %d dias\n",mes,n_dias);
}
Escreva um programa que leia uma data e imprima se a data lida
vlida ou no. Dever ler no formato dd mm aaaa.
#include <stdio.h>
main()
{
int dia,mes,ano;
printf("Data: dd mm aaaa: ");
scanf("%d %d %d",&dia,&mes,&ano);
switch(mes)
Pgina 16
Filipe Marques
{
case 2:
case 4:
case 6:
case 9:
case 11:
default:
Testes e Condies
}
/*De notar que ano%4==0 devolve o valor 1 ou 0 consoante o ano seja
mltiplo de 4 ou no. Esse valor ento adicionado a 28 de forma a
obter o valor 29 ou 28 conforme seja bissexto ou no.*/
Pgina 17
Filipe Marques