Você está na página 1de 77

Linguagens de Programao I

Tema 3: Operadores e estruturas de controle em C

Prof. Dany S. Dominguez


dsdominguez@gmail.com Sala 1 NBCGIB (73) 3680 5212 ramal 30

Roteiro
Operador de atribuio Operadores aritmticos Operadores lgicos e relacionais Precedncia de operadores Introduo a estruturas de controle Estrutura sequencial Estruturas condicionais Estruturas de repetio Desvios incondicionais Tipos de erros Exerccios

Famlias de operadores
Atribuio Aritmticos Relacionais Lgicos

Operador de atribuio
Operador (=) , pode ser utilizado dentro de qualquer expresso vlida da linguagem, Sintaxe:
identificador_de_variavel = expresso;

O destino, ou lvalue tem que ser uma varivel ou um ponteiro, A origem ou rvalue pode ser uma varivel ou qualquer expresso vlida da linguagem.

Operador de atribuio
Converso de tipos Situao em que variveis de tipos diferentes so misturadas em uma nica instruo. A maioria das linguagens probem converso automtica de tipos. O C, permite converso automtica de tipos, nenhuma mensagem de erro ou aviso tem lugar quando uma converso de tipos acontece.

Operador de atribuio
Regra de converso de tipos Nos comandos de atribuio o valor do rvalue convertido no tipo do lvalue, antes de fazer a atribuio. Hierarquia de dados
P R O M O C O D E G R A D A O

char int float double

Operador de atribuio
Converso de tipos Exemplos
int x; char ch; float f; void func1(){ ... ch = x; x = f; f = ch; f = x; ...}

Quando temos perda de informao?

Operador de atribuio
Converso de tipos Converso de tipos explcita: ocorre quando o programador indica como deve ocorrer a converso. Exemplos. Atribuio mltipla em C:
x = y = z = 0

Operadores aritmticos
Os operadores +,
-

funcionam em C com

seu significado matemtico, eles so classificados como operadores binrios, o operador - pode ser unrio (troca de sinal) Tipos em operaes aritmticas: Soma, subtrao e multiplicao Operandos do mesmo tipo Operandos de tipos diferentes (promoo)

Operadores aritmticos
Tipos em operaes aritmticas: Diviso Operandos inteiros ou caractere obtemos diviso inteira Pelo menos um dos operandos ponto flutuante obtemos diviso convencional Operandos de tipos diferentes (promoo) Resto da diviso inteira (%) Ambos operandos devem ser inteiros

Operadores aritmticos
Tipos em operaes aritmticas: Exemplo
int a=5, b=2, c; float f=2.0 d; c c d d c c = = = = = = a+b; a+f; a*b; a*f; a/b; a/f; d d c c d d = = = = = = a/b; a/f; a%b; a%f; a%b; a%f;

Qual o resultado de cada operao?

Operadores aritmticos
O C inclui dois operadores que geralmente no aparecem na notao matemtica, operador de incremento ++ operador de decremento - x = x + 1

o mesmo que x++

os operadores decremento incremento so unrios o operador incremento (decremento) pode aparecer em notao pre-fixa ou ps-fixa,

Operadores aritmticos
Pre-fixa ou ps-fixa? Caso 1
a = 100; b = a++;

Caso 2
a = 100; b = ++a;

Quais os valores a e b? Porque foram criados os operadores de

incremento?

Operadores aritmticos
O C inclui operadores aritmticos compostos. Considere: int a=1, b=2, c=3, d=4, e=5;
Operador += -= *= /= %= Exemplo a += 7 b -= 2 c *= 5 d /= 2 e %= 2 Operao a = a + 7 b = b - 2 c = c * 5 d = d / 2 e = e % 2 Resultado 8 0 15 2 1

Operadores aritmticos
Qual a diferena entre usar o operador composto ou os operadores convencionais? Resultados Eficincia O C calcula as operaes aritmticas em uma sequncia precedncia, Os parntesis tem maior precedncia que os outros operadores, determinada pelas regras de

Operadores aritmticos
Quando dos operadores com igual precedncia esto no mesmo nvel, a expresso calculada da esquerda a direita, Precedncia de operadores aritmticos
Operador () Ordem de precedncia [1], se houver parntesis aninhados calcula-se primeiro o parntesis mais interno ++ ou -- [2] *, / ou % [3] no caso de vrios operadores so calculados da esquerda a direita + ou [4] no caso de vrios operadores so calculados da esquerda a direita

Operadores aritmticos
Precedncia de operadores exemplo Seja:
soma uma varivel com a soma dos

elementos de uma matriz


m numero de linhas n numero de colunas

Calculamos a mdia como


media = soma / m * n

O resultado correto? Justifique.

Operadores relacionais
Refere-se s relaes que os operandos podem ter uns com os outros,
Operador > >= < <= == != Significado maior que maior ou igual que menor menor ou igual que igual a diferente de

Todos os operadores relacionais so binrios, Operandos = variveis ou operaes aritmticas.

Operadores relacionais
Os operadores igualdade (==) e diferente (!=) tem dificuldade para trabalhar com operandos de ponto flutuante, Lembre que os nmeros de ponto flutuante so armazenados de forma aproximada, Em C, qual o resultado da expresso:
(2.0/3 + 2.0/3 + 2.0/3) == 2.0

Qual a alternativa para isso? Como comparar dois valores de ponto flutuante?

Operadores lgicos
Referem-se s formas que relaes podem ser combinadas
Operador && || ! Significado AND, e OR, ou NOT, no Tipo Binrio Binrio Unrio

Os operandos de um operador lgico so: Operaes relacionais, Variveis

Operadores lgicos
verdadeiro = qualquer valor diferente de zero, falso = zero, as expresses que utilizam operadores lgicos e relacionais retornam zero para F e um para V. Tabela da verdade
a 0 0 1 1 b 0 1 1 0 a && b 0 0 1 0 a || b 0 1 1 1 !a 1 1 0 0

Operadores lgicos
Os operadores lgicos e relacionais tem menor precedncia que os operadores aritmticos, Em uma expresso que misture operaes lgicas e aritmticas,
Primeiro avaliam-se as operaes aritmticas Depois avaliam-se as operaes lgicas

Precedncia de operadores lgicos e relacionais


! > >= == != && || < <=

Operadores lgicos
Em operaes lgicas a ordem de avaliao dos operandos influi na eficincia do cdigo Em operaes &&
Se o primeiro operando for falso, o segundo no avaliado O primeiro operando deve ser aquele com maior probabilidade de ser falso

Em operaes | |
Se o primeiro operando for verdadeiro, o segundo no avaliado O primeiro operando deve ser aquele com maior probabilidade de ser verdadeiro

Operadores lgicos
Exemplo (a!=0) && (b/a>1) (a==0)||(b/a>1)

As operaes acima podem ser utilizadas em linguagem C? Recomenda o uso dessas instrues em outras linguagens?

Estruturas de controle
Estruturas do controle so utilizadas para especificar a ordem em que as instrues devem ser executadas,
Tipos de estruturas de controle:

1. estrutura sequncial, 2. estruturas de seleo, 3. estruturas de repetio.

Estruturas de controle
Em C existem 7 estruturas de controle: A estrutura sequncial Trs estruturas seleo (condicionais) seleo simples seleo dupla seleo mltipla Trs estruturas de repetio incondicional ou por contador condicional com teste no inicio condicional com teste no final

Estruturas de controle
Estrutura sequncial Padro da linguagem A menos que aparea outra estrutura de controle as instrues so executada sequencialmente Direo de leitura convencional Uma instruo aps outra De cima para baixo Da esquerda para a direita

Estruturas de controle
Estruturas de seleo Permitem instrues Pode selecionar entre dois ou mais blocos de instrues Caminhos diferentes durante a execuo executar (ou no) blocos de

Estruturas de controle
Seleo simples Executa ou ignora um bloco de instrues Sintaxe:

if(condio) {Instrues}

nota>=60

Imprimir, Aprovado

if (nota >= 60) printf(Aprovado\n);

Estruturas de controle
Seleo dupla Escolhe entre dois blocos de instrues diferentes Sintaxe:
if(condio) {Bloco Verdadeiro} else {Bloco Falso}
if (nota >= 60) printf(Aprovado\n); else printf(Reprovado\n);

Imprimir, Reprovado

nota>=60

Imprimir, Aprovado

Estruturas de controle
Estruturas de seleo aninhadas Sintaxe:
if(condio 1) {Bloco 1} else if (condio 2) {Bloco 2} else if (condio 3) {Bloco 2} ... else if (condio n) {Bloco n} else {Bloco n+1}
if (nota >= 90) printf(Conceito A\n); else if (nota >= 80) printf(Conceito B\n); else if (nota >= 70) printf(Conceito C\n); else if (nota >= 60) printf(Conceito D\n); else printf(Conceito F\n);

Estruturas de controle
Estruturas de seleo Exemplos:
if (nota >= 60) printf(Aprovado\n); printf(No faz final\n); else printf(Reprovado\n); printf(Faz final\n); if (x>0) if (y>0) printf(Quadrante else printf(Quadrante else if (y>0) printf(Quadrante else printf(Quadrante

if (x>0) && (y>0) printf(Quadrante 1\n); else if (x<0) && (y>0) printf(Quadrante 2\n); else if (x<0) && (y<0) printf(Quadrante 3\n); else if (x>0) && (y<0) printf(Quadrante 4\n);

1\n); 4\n);

2\n); 3\n);

Estruturas de controle
Estruturas de seleo Exemplos:
if (nota >= 60){ printf(Aprovado\n); printf(No faz final\n); } else{ printf(Reprovado\n); printf(Faz final\n); }

if (x>0 && y>0) printf(Quadrante 1\n); else if ((x<0) && (y>0)) printf(Quadrante 2\n); else if ((x<0) && (y<0)) printf(Quadrante 3\n); else printf(Quadrante 4\n);

Estruturas de controle
Seleo mltipla Escolhe entre diversos blocos de instrues diferentes Um algoritmo pode conter uma srie de decises nas quais uma varivel ou expresso e testada separadamente para cada um dos valores constantes que ela pode assumir, Com base no resultado dos testes diferentes aes so tomadas

Estruturas de controle
Seleo mltipla Exemplo: Crie um programa para processar as notas
de uma exame (A, B, C, D, E). Para os conceitos A, B imprima o conceito e a mensagem APROVADO SEM RESTRIES. Para os conceitos C, D imprima o conceito e a mensagem APROVADO COM RESTRIES. Para o conceito E imprima o conceito e a mensagem REPROVADO.

Estruturas de controle
Seleo mltipla

Estruturas de controle
Seleo mltipla

Estruturas de controle
Seleo mltipla Sintaxe:
switch(expresso){ case constante1: sequncia de comandos break; case constante2: sequncia de comandos break; case constante3: sequncia de comandos break; . . . default: sequncia de comandos }

Estruturas de controle
Seleo mltipla
O switch testa sucessivamente o valor de uma expresso contra uma lista de constantes inteiras, quando os valores coincidem os comandos associados quela constante so executados. Embora case seja uma palavra reservada da linguagem ela no pode se utilizada fora da estrutura switch. O switch solo pode testar igualdade. Duas constantes case no mesmo switch no podem ter valores idnticos.

Estruturas de controle
Seleo mltipla

Quando constantes caracteres comando switch elas so convertidas a inteiros.

so usadas no automaticamente

O comando break, um comando de desvio, quando encontrado a execuo continua na primeira linha de cdigo apos o switch. O comando default executado se nenhuma coincidncia for detectada.

Estruturas de controle
Seleo mltipla

O default opcional, se no estiver presente nenhuma ao ser realizada se todos os testes falharem. Tecnicamente, os comandos break so opcionais, se o break for omitido, a execuo continua pelos prximos comandos at que um break ou o fim do switch seja encontrado. A omisso do break pode levar a erros de lgica na execuo.

Estruturas de controle
Seleo mltipla

case 1

ao do case 1

break

case 2 case 3

ao do case 2

break

ao do case 3

break

ao default

Estruturas de controle
Operador condicional utilizado para substituir a estrutura de seleo
if/else em operaes simples

Sintaxe:

(condio) ? instruo A : instruo B;


Exemplos:
b = (a > 0) ? a++ : a--; b = (c > 0) ? sqrt(c) : sqrt(-c); (grau >= 60) ? printf(Aprdo.\n) : printf(Reprd.\n);

Estruturas de controle
Estruturas de repetio Permitem executar uma instruo ou um bloco de instrues vrias vezes, Ideal para manipulao de vetores e matrizes A linguagem C fornece trs tipos de estruturas de repetio: 1. estrutura while, 2. estrutura do\while, 3. estrutura for.

Estruturas de controle
Estruturas de repetio while Permite ao programador especificar que uma ao deve ser repetida enquanto uma determinada condio for verdadeira, Repetio controlada por sentinela Exemplo: lista de compras
Enquanto (houver itens em minha lista de compras) comprar o prximo item risc-lo de minha lista

Estruturas de controle
Estruturas de repetio while Elementos presentes na repetio Inicializao

preparao da lista de compras


Teste condicional

enquanto houver itens em minha lista


Atualizao do estado do lao

riscar um item da lista

Estruturas de controle
Estruturas de repetio while Sintaxe:
while (condio){ bloco de instrues }

Execuo do ciclo while Exemplo: Calcular a primeira potencia de 2 maior que 500.
prod = 2; while (prod <= 500){ prod = prod * 2; }
prod<=500

prod = prod * 2

Estruturas de controle
Estruturas de repetio while Problemas com repetio Problemas de inicializao Laos infinitos Exemplos
while (y>0){ printf(%d\n,y); ++y; } while (x<=100) total += x; ++x;

Estruturas de controle
Estruturas de repetio do/while A estrutura do/while similar a estrutura while No
while

a condio de continuidade do lao

testada no inicio antes do corpo da estrutura ser executado No


do/while

a condio de continuidade do

lao testada depois do corpo do lao se executado O lao vez


do/while

executado pelo menos uma

Estruturas de controle
Estruturas de repetio do/while Sintaxe:
do{ bloco de instrues }while(condio)

Exemplos:
int main(){ int contador=1; while (contador<=10){ printf(%d\n, contador); contador++; } return 0; } int main(){ int contador=1; do{ printf(%d\n, contador); }while(++contador<=10); return 0; }

Estruturas de controle
Estruturas de repetio for Indicada para implementar a repetio controlada por contador
Repetio controlada por contador exige:
1. 2. 3. O nome de uma varivel de controle, O valor inicial da varivel de controle, O incremento (ou decremento) pelo qual a varivel de controle modificada cada vez que o corpo do lao realizado. 4. A condio que testa o valor final da varivel de controle.

Estruturas de controle
Estruturas de repetio for Exemplo:
int main(){ int contador=1; while (contador<=10){ printf(%d\n, contador); contador++; } /* incremento */ /* inicializao */ /* condio */

return 0; }

Estruturas de controle
Estruturas de repetio for
A estrutura de repetio
for

manipula

automaticamente todos os detalhes da repetio controlado por contador Repetimos o exemplo anterior
int main(){ int contador; /* inicializao, condio e incremento esto includos no cabealho da estrutura */ for (contador=1; contador<=10; contador++) printf(%d\n, contador); return 0; }

Estruturas de controle
Estruturas de repetio for
Nome da varivel de controle Valor final da varivel de controle

for (contador=1; contador<=10; contador++)

Palavra-chave

Valor inicial da varivel de controle

Incremento da varivel de controle

Estruturas de controle
Estruturas de repetio for
Sintaxe:

for (expresso1; expresso2; expresso3) {bloco de instrues}


expresso1 = inicializao expresso2 = condio expresso3 = incremento Execuo da estrutura for Na maioria uma dos casos,

existe while

equivalncia

entre as estruturas for e

expresso1 while(expresso2){ instruo expresso3 }

Estruturas de controle
Estruturas de repetio for
Frequentemente expresso1, expresso2 e expresso3 so expresses mltiplas separadas por vrgulas, onde a lista de expresses avaliada da esquerda para a direita, As trs expresses da estrutura for so opcionais e podem ser omitidas, Se a expresso2 for omitida, a linguagem C presume que a condio verdadeira e cria um loop infinito,

Estruturas de controle
Estruturas de repetio for
A expresso1 pode ser omitida se a varivel de controle programa, for inicializada em outro lugar do

A expresso3 pode ser omitida se o incremento calculado no corpo da estrutura for o se nenhum incremento se faz necessrio.

Estruturas de controle
Estruturas de repetio for
Exemplos: 1. A inicializao, condio e continuao do loop podem conter operaes aritmticas.
x = 2; y = 10 for(j=x; j<=4*x*y; j+=y/x)

for(j=2; j<=80; j+=5)

2. O incremento pode ser negativo, neste caso temos decremento ou contagem regressiva
for(i=10; i>=0; i--) printf(%d\n, i);

Estruturas de controle
Estruturas de repetio for
Exemplos:
3. Se a condio de continuao for inicialmente falsa, o corpo do loop nunca executado, a execuo continua na prxima instruo aps o lao
for(i=k; i<k; i++) printf(%d\n, i);

4. Lao infinito
for(;;){ ch = getchar(); if (ch==A) break; }

Estruturas de controle
Estruturas de repetio for
Exemplos: 5. Lao for com condio composta
flag = 1; for(i=0; i<10 && flag; i++){ printf(Digite um numero positivo:); scanf(%d, num); if (num<0) flag = 0; }

Estruturas de controle
Estruturas de repetio for
Exemplos: 6. Lao sem corpo
for(soma=0, num=2; num<=100; soma+=num, num+=2); soma=0; for(num=2; num<=100; num=num+2) soma+=num;

7. Lao utilizando caracteres


for(char letra=A; letra<=Z; letra++) printf(%d %c, letra, letra);

Estruturas de controle
Estruturas de repetio for
Exemplos: Sada do exemplo 7
65 66 67 68 69 70 71 72 73 74 75 76 77 78 A B C D E F G H I J K L M N 79 80 81 82 83 84 85 86 87 88 89 90 O P Q R S T U V W X Y Z

Estruturas de controle
Quando contador? Quando sentinela? Sentinela
Repetio condicional No se conhece o numero de vezes que o lao deve ser executado Deve incluir I/O no corpo do lao Exemplos indefinida ou

devemos devemos

utilizar utilizar

repetio repetio

controlada controlada

por por

Contador
Repetio incondicional Se conhece o numero de vezes que o lao deve ser executado No precisa incluir I/O no corpo do lao Exemplos definida ou

Desvios incondicionados
Modificam o fluxo de execuo de forma incondicional Em C temos quatro comandos que provocam desvio incondicional
return, break, continue, exit.

Desvios incondicionados
O comando return usado para retornar o valor de uma funo, ele faz com que a execuo volte ao ponto onde a chamada a funo foi feita, utilizada para terminar a execuo de uma funo, se for a funo main, termina a execuo do programa.

Desvios incondicionados
O comando break usado para terminar um case em um comando
switch,

ou para forar a terminao imediata de um lao, em ambos casos o controle do programa retorna a prxima instruo aps a estrutura (lao ou switch).

Desvios incondicionados
O comando continue utilizado para forar a prxima iterao de um lao, no lao for, o teste condicional e a expresso de incremento so executados, nos laos while e do/while o controle do programa passa ao teste condicional (incremento?)

Desvios incondicionados
Os comandos break e continue Exemplos
for(t=0; t<100; t++){ if(t%2) continue; printf(%d,t); } for(t=0; t<100; t++){ printf(%d,t); if(t==10) break; } t=0; while(t<100){ if(t%2) continue; printf(%d,t); t++ }

i=0 while(i<10){ printf(Digite Numero positivo); scanf(%d, &num); if (num<0) break; i++; }

Desvios incondicionados
A funo exit() A funo um imediata Sintaxe:
void exit(int codigo_de_retorno);
exit()

pode ser utilizada para sair de provocando execuo do a terminao programa e

programa, da

retornando o controle ao sistema operacional.

Exemplo:
if (num<0) exit(-1);

Erros em programao
Podemos encontrar trs tipos de erros: Erros de sintaxe ou compilao Erros de semntica ou tempo de execuo Erros de lgica

Cada tipo de erro tem um mecanismo de identificao e estratgias de eliminao

Erros em programao
Erros de sintaxe ou compilao so provocados pelo uso indevido dos recursos da linguagem ou erros de digitao, so detectados ao compilar o programa, so muito fceis de diagnosticar e corrigir. Mais comuns: ponto-e-vrgula ao final da linha; fechamento de chaves, parntesis ou colchetes; erros de digitao em palavras chaves; outros ...

Erros em programao
Erros de semntica ou tempo de execuo
envolvem cdigos tecnicamente corretos que contm problemas em seu significado, os compiladores no detectam este tipo de erros, so detectados ao executar o programa pois o programa aborta, so fceis de detectar, em ocasies corrigi-los pode ser complicado. Mais comuns: uso incorreto da memria; incompatibilidade nas instrues de entrada; acesso a recursos inexistentes, ...

Erros em programao
Erros de lgica envolvem cdigos sinttica e semanticamente corretos, entretanto o cdigo no executa da maneira desejada, so os mas difceis de diagnosticar e corrigir, geralmente so provocados por uso incorreto de operadores (ex. igualdade == vs atribuio =), uso incorreto de recursos da linguagem ou erros na compreenso do problema.

Erros em programao
O seguinte programa funciona?
#include <stdio.h> #include <stdlib.h> int main(void) { int a, b, c; a = 4; b = 6; c = a + b; printf ( A media entre 4 e 6 : %d \n, c); }

Porm, ele esta correto?

Identifique os erros no cdigo e classifique-os.

INICIO n

i<- 0 tot<- 0

i<n

V
ai tot <- tot + ai i <- i + 1

n<>0

V
tot/n FIM

Resumo da Linguagem C
auto const double float int short struct unsigned break continue else for long signed switch void case default enum goto register sizeof typedef volatile char do extern if return static union while

Lista de exerccios

Você também pode gostar