Вы находитесь на странице: 1из 17

Algoritmos e Estruturas de Dados

Captulo 04
Testes e Condies

Filipe Marques

Escola Superior de Tecnologia e Gesto


Instituto Politcnico de Viana do Castelo

Algoritmos e Estruturas de Dados

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

>=

Maior ou igual que

X >= Y

<

Menor que

X<Y

<=

Menor ou igual que

X <= Y

!=

Diferente de

X != Y

Todas as expresses que contenham um operador relacional devolvem sempre


como resultado o valor lgico verdadeiro ou falso.
De salientar que o operador = faz a atribuio de valores a variveis, ao
contrrio do operador == que verifica a igualdade de duas expresses.

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

Algoritmos e Estruturas de Dados

Testes e Condies

A condio avaliada

Se o resultado da condio for verdadeiro executada a instruo 1

Se o resultado da instruo for falso executada a instruo 2, caso


exista

O seguinte programa adiciona 3000$ ao salrio de um indivduo se o seu


salrio for inferior a 150 000$.

#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

Algoritmos e Estruturas de Dados

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.

Instrues if-else encadeadas


Existem situaes em que o teste de uma condio no suficiente para
tomar uma deciso, podendo ser necessrio testar mais de uma condio.
O programa solicita um salrio ao utilizador e mostra o imposto a pagar. Se o
salrio for negativo ou zero indica um erro, se o salrio for maior que 1000
paga 10% de imposto, seno paga apenas 5% de imposto.

# 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

Algoritmos e Estruturas de Dados

Testes e Condies

printf(Imposto = %.2f\n,salario*0.05);

Qual o problema deste programa?


Quando o valor negativo escreve a mensagem Valor invlido mas passa
prxima instruo, dando falso no if seguinte mas executando o clculo de
0.05 de imposto.
Depois de ser testado o primeiro if e caso seja verdadeiro deve ser escrita a
mensagem de erro mas no deve ser calculado qualquer imposto. O imposto
s deve ser calculado se o resultado do primeiro if for falso.

# 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

Algoritmos e Estruturas de Dados

Testes e Condies

Se desejarmos que o else pertena ao primeiro if temos de escrever o


programa da seguinte forma:

...
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)

x>=2 && x<=20

||

OR (Ou)

X==2 || x==3

NOT (Negao)

! x==0

Com estes operadores possvel combinar duas ou mais expresses lgicas


numa s expresso, devolvendo um nico valor.
O operador lgico && s devolve verdadeiro quando ambas as condies so
verdadeiras.
O operador lgico || devolve verdadeiro se alguma das condies for
verdadeira.
O operador lgico ! devolve falso se a condio for verdadeira e devolve
verdadeiro se a condio for falsa. Este operador aplicado unicamente a
uma expresso ou condio.
De salientar que a expresso (x==30 || 40) est informaticamente incorrecta
pois deve-se escrever (x==30 || x==40). Alis, a primeira condio devolveria
sempre verdadeiro.

Pgina 6

Filipe Marques

Algoritmos e Estruturas de Dados

Testes e Condies

Precedncia dos operadores


Para definir a ordem pela qual as operaes so executadas, existe uma
tabela de precedncias dos operadores:
1.

<, <=, >, >=

2.

==, !=

3.

&&

4.

||

5.

?:

Desta forma, os primeiros operadores tm mais precedncia, isto , quando o


compilador tem de decidir qual a ordem pela qual as operaes so realizadas
executa primeiro as operaes dos operdores com maior precedncia.
Suponhamos a seguinte expresso:

if (x != 10 || y > 1 && y < 10)


Como os operadores > e < tm maior precedncia, so realizadas em primeiro
as comparaes com a varivel y. Em seguida realizada a comparao com o
x. De seguida realizado o && e s depois que realizado o ||.

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

Algoritmos e Estruturas de Dados

Testes e Condies

Neste exemplo, o novo valor a atribuir depende de uma determinada


condio, podendo ser usado o operador condicional ?.
A sua sintaxe a seguinte:

Condio ? expresso1 : expresso2


Assim, se a condio for verdadeira, o resultado de toda a expresso o valor
devolvido por expresso1, seno o valor devolvido por expresso2.
Desta forma, o programa anterior poderia ser escrito da seguinte forma:

#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

Algoritmos e Estruturas de Dados

Testes e Condies

printf(Estado civil invlido);

Quando existem muitas condies diferentes para o mesmo valor, torna-se


confuso a utilizao de if-else encadeados. Para resolver este problema,
existe uma instruo que permite a seleco do cdigo a executar a partir de
um conjunto de valores possveis para uma determinada expresso.
A instruo switch interessante quando necessrio tomar muitas decises,
sendo bastante mais simples que utilizar o if-else encadeado.

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

Algoritmos e Estruturas de Dados

Testes e Condies

S que este programa apresenta um problema. Por exemplo, se for


introduzida a letra D vai imprimir Divorciado, Vivo e Estado Civil Incorrecto.
No switch quando a expresso igual a uma das constantes do case, as
instrues associadas a esse case so executadas bem como todos as
instrues de todos os cases que se encontrem a seguir.

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

Algoritmos e Estruturas de Dados

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

Algoritmos e Estruturas de Dados

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

Algoritmos e Estruturas de Dados

Testes e Condies

Implemente um programa que indique ao utilizador se um


determinado nmero lido igual a zero ou no, utilizando o operador
!=.
#include <stdio.h>
main()
{
int x;
printf(Introduza um numero: );
scanf(%d, &x);
if (x != 0)
printf(%d no zero\n,x);
else
printf(%d zero\n,x);
}
Escreva um programa que dado o salrio bruto, calcule o salrio
lquido e imposto a pagar, de acordo com a seguinte regra: Se o
salrio bruto for inferior a 1000 a taxa de 5%, se o salrio bruto for
maior ou igual que 1000 e menor que 5000 a taxa de 11%, e se o
salrio bruto for maior ou igual a 5000 a taxa de 35%.
#include <stdio.h>
main()
{
float salario, taxa;
printf(Qual o salrio: );
scanf(%f, &salario);
if (salario < 1000)
taxa = .05;
else
if(salario < 5000)
taxa = .11;
else
taxa = .35;
printf(Bruto: %f Imposto: %f Lquido:
%f\n,salario,salario*taxa,salario*(1.0 taxa));
}

Pgina 13

Filipe Marques

Algoritmos e Estruturas de Dados

Testes e Condies

Escreva um programa que leia o salrio e o estado civil de uma


pessoa. Dever depois aplicar uma taxa de imposto aos solteiros de
15% e de 20% aos casados, mostrando o imposto respectivo.
#include <stdio.h>
main()
{
float salario;
char est_civil;
printf(Qual o salrio: );
scanf(%f,&salario);
printf(Qual o estado civil? );
scanf(%c,&est_civil);
if (est_civil == C || est_civil == c)
printf(Imposto: %.2f\n,salario*0.2);
else
if (est_civil == S || est_civil == s)
printf(Imposto: %.2f\n,salario*0.15);
else
printf(Estado Civil Inexistente\n);
}
Escreva um programa usando um switch, que dado o salrio e o sexo
calcule o imposto respectivo. Se for mulher paga 10% de imposto, se
for homem paga 15% de imposto.
#include <stdio.h>
main()
{
float salario, imposto = 0.0;
char sexo;
printf("Introduza o Salrio: "); scanf("%f",&salario);
printf("Qual o Sexo: "); scanf(" %c",&sexo);
switch (sexo)
{
case 'f':
case 'F': imposto = 0.10;
break;
case 'm':
Pgina 14

Filipe Marques

Algoritmos e Estruturas de Dados

Testes e Condies

case 'M': imposto = 0.15;


break;
}

}
printf("Imposto de %.2f\n",salario*imposto);

Resolva o problema anterior sem utilizar break.


#include <stdio.h>
main()
{
float salario, imposto = 0.0;
char sexo;
printf("Introduza o Salrio: "); scanf("%f",&salario);
printf("Qual o Sexo: "); scanf(" %c",&sexo);
switch (sexo)
{
case 'm':
case 'M': imposto = imposto + 0.05;
case 'f':
case 'F': imposto = imposto + 0.10;
}
printf("Imposto de %.2f\n",salario*imposto);
}

Escreva um programa que leia uma operao binria entre dois


inteiros e apresente de seguida o resultado dessa operao. Por
exemplo, se o utilizador escrever 2+3 o programa dever
escrever 2+3=5.
#include <stdio.h>
main()
{
int num1,num2,res=0;
char op;
printf("Escreva uma Expresso: ");
scanf("%d %c %d",&num1,&op,&num2);
switch(op)
{
case '+' : res = num1+num2;

Pgina 15

Filipe Marques

Algoritmos e Estruturas de Dados

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

Algoritmos e Estruturas de Dados

{
case 2:

case 4:
case 6:
case 9:
case 11:

default:

Testes e Condies

if (dia >=1 && dia <= 28 + (ano%4==0))


printf("Data Valida");
else
printf("Data Invalida");
break;

if (dia >=1 && dia <= 30)


printf("Data Valida");
else
printf("Data Invalida");
break;
if (mes <1 || mes > 12)
printf("Data Invalida");
else
if (dia >=1 && dia <= 31)
printf("Data Valida");
else
printf("Data Invalida");

}
/*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

Вам также может понравиться