69
C Comandos de Controle Adriano Cruz [email protected] 19 de julho de 2017 Instituto de Matem´ atica Departamento de Ciˆ encia da Computa¸ ao UFRJ 1

C Comandos de Controle - dcc.ufrj.brdcc.ufrj.br/~valeriab/C1-Controle.pdf · O in´ıcio de um bloco em C ´e marcado por uma chave de abertura ({) e o t´ermino por uma chave de

Embed Size (px)

Citation preview

C

Comandos de Controle

Adriano Cruz

[email protected]

19 de julho de 2017

Instituto de Matematica

Departamento de Ciencia da Computacao

UFRJ

1

Revisao da Secao

Introducao

Comandos de Teste

Comandos de Repeticao

Comandos de Desvio

2

Bibliografia

1 Adriano Cruz. Curso de Linguagem C, Disponıvel em

http://equipe.nce.ufrj.br/adriano

2 Ulysses de Oliveira. Programando em C, Editora Ciencia

Moderna.

3

Bloco de Comandos

Grupos de comandos que devem ser tratados como uma

unidade logica.

O inıcio de um bloco em C e marcado por uma chave de

abertura ({) e o termino por uma chave de fechamento (}).

Serve para agrupar comandos que devem ser executados

juntos.

Por exemplo, usa-se bloco de comandos quando em comandos

de teste deve-se escolher entre executar dois blocos de

comandos.

Pode ser utilizado em qualquer trecho de programa onde se

pode usar um comando C.

E interessante observar que um bloco de comandos pode ter

zero comandos C.

Um bloco de comandos com 0 ou 1 comando pode dispensar

as chaves.4

Exemplo

/* b loco de comandos */

{

i = 0 ;

j = j + 1 ;

printf ( ”%d %d\n” , i , j ) ;

}

5

Revisao da Secao

Introducao

Comandos de Teste

Comandos de Repeticao

Comandos de Desvio

6

Comandos de Teste

Utilidade

Os comandos de teste permitem ao computador decidir o caminho

a seguir, durante a execucao do programa, independentemente do

usuario.

7

Comandos de Teste

Utilidade

Os comandos de teste permitem ao computador decidir o caminho

a seguir, durante a execucao do programa, independentemente do

usuario.

O que testam?

Estes testes sao baseados em estados internos disponıveis ao

processador. Estes estados podem ser resultantes de uma operacao

aritmetica anterior, de uma operacao anterior etc.

7

Desvios

8

Desvios

8

Comando if

O comando if e utilizado quando for necessario escolher

entre dois caminhos.

A forma geral do comando if e a seguinte:

i f ( express~ao )

bloco_de_comandos1 ;

e l s e

bloco_de_comandos2 ;

9

Comando if operac~ao

Neste comando primeiro a expressao e avaliada.

Caso o resultado seja verdadeiro (qualquer resultado

diferente de zero) o bloco de comandos1 e executado,

caso contrario o bloco de comandos2 e executado.

Pela definicao do comando a expressao deve ter como

resultado um valor diferente de zero para ser considerada

verdade.

Observar que somente um dos dois blocos sera executado.

Em C um resultado diferente de zero significa verdadeiro e

zero significa falso.

10

Comando if sem else

Como a clausula else e opcional a forma abaixo do comando

if e perfeitamente valida.

i f ( express~ao )

bloco_de_comandos ;

11

Exemplos de if I

scanf ( ”%d” , &dia ) ;

i f ( dia > 31 | | dia < 1 )

printf ( ”Dia i n v a l i d o \n” ) ;

scanf ( ”%d” , &numero ) ;

i f ( numero > 0 )

printf ( ”Numero p o s i t i v o \n” ) ;

e l s e

printf ( ”Numero nega t i v o \n” ) ;

12

Exemplos de if II

scanf ( ”%f ” , &salario ) ;

i f ( salario < 800 . 00) {

printf ( ” A l i quo t a de imposto = 0.1\ n” ) ;

imposto = salario * 0 . 1 ;

}

e l s e {

printf ( ” A l i quo t a de imposto = 0.25\ n” ) ;

imposto = salario * 0 . 2 5 ;

}

13

Comandos if em escada

i f ( express~ao )

bloco_de_comandos

e l s e i f ( express~ao1 )

bloco_de_comandos1

e l s e i f ( express~ao2 )

bloco_de_comandos2

. . .

e l s e

bloco_de_comandosn

14

Exemplo: le dados

#i n c l u d e < s t d i o . h>

i n t main ( v o i d ) {

f l o a t num1 , /* p r im e i r o operando */

num2 , /* segundo operando */

res ; /* r e s u l t a d o da ope racao */

cha r oper ; /* c a r a c t e r e que d e f i n e a ope racao */

printf ( ”\nPrograma c a l c u l a d o r a s imp l e s .\ n” ) ;

printf ( ” Ent r e com os d o i s operandos .\ n” ) ;

scanf ( ”%f %f ” , &num1 , &num2 ) ;

getchar ( ) ; /* t i r a r o c r */

printf ( ”Qual a ope racao ? \n” ) ;

oper = getchar ( ) ;

15

Exemplo: Calcula

i f ( oper == '+ ' )

res = num1 + num2 ;

e l s e i f ( oper == '− ' )

res = num1 − num2 ;

e l s e i f ( oper == ' * ' )

res = num1 * num2 ;

e l s e i f ( oper == ' / ' ) {

i f ( num2 == 0 . 0 ) {

printf ( ” D i v i s a o por 0 !\n” ) ;

r e t u r n 1 ;

}

e l s e res = num1 / num2 ;

} e l s e { /* Nao era nenhuma das opcoes */

printf ( ”Operacao i n v a l i d a !\ n” ) ;

r e t u r n 1 ;

}

16

Exemplo: Resultados

printf ( ” Resu l tado = %f .\ n” , res ) ;

r e t u r n 0 ;

} /* End o f main */

17

Comando switch

O comando if, em todas suas formas, e suficiente resolver

problemas de selecao de comandos.

Porem em alguns casos o programa se torna mais trabalhoso

para ser escrito e entendido.

O comando switch facilita a escrita de trechos de programa

em que a selecao deve ser feita entre varias alternativas.

18

Forma Geral

sw i t ch ( express~ao ) {

ca se constante1 :

sequ encia_de_comandos ;

b r eak ;

ca se constante2 :

sequ encia_de_comandos ;

b r eak ;

ca se constante3 :

sequ encia_de_comandos ;

b r eak ;

. . .

d e f a u l t :

sequ encia_de_comandos ;

}

19

Ordem de Execucao

1 Expressao e avaliada.

2 Resultado da expressao e comparado com valores dos

comandos case.

3 Se resultado da expressao for verdadeiro, executa comandos.

4 A execucao continua ate o fim do switch, ou ate que um

break seja encontrado.

5 Caso nao ocorra nenhuma coincidencia, os comandos

associados ao comando default sao executados.

6 O comando default e opcional.

7 Se nao houver coincidencia e nao houver o default entao

nenhum comando sera executado.

20

Cuidado!

Uma sequencia de comandos e diferente de um bloco de

comandos.

Um bloco de comandos inicia com uma chave e termina com

uma chave, enquanto que uma sequencia e apenas uma serie

de comandos.

Por exemplo, uma vez que um bloco de comandos foi

selecionado por um comando if ele sera executado ate a

ultima instrucao do bloco, a menos que haja um comando de

desvio.

Uma serie de comandos sao apenas comandos colocados um

apos outro.

21

break

O comando break e um dos comandos de desvio da

linguagem C.

O break e usado dentro do comando switch para

interromper a execucao da sequencia de comandos e pular

para o comando seguinte ao comando switch.

22

Pontos Importantes

O resultado da expressao deve ser um tipo enumeravel, por

exemplo o tipo int.

Tambem podem ser usados tipos compatıveis com int, isto e,

expressoes com resultados tipo char podem ser usadas.

Notar que caso nao apareca um comando de desvio, todas as

instrucoes seguintes ao teste case que teve sucesso serao

executadas, mesmo as que estejam relacionadas com outros

testes case.

O comando switch so pode testar igualdade.

23

Exemplo: le dados

#i n c l u d e < s t d i o . h>

i n t main ( v o i d )

{

f l o a t num1 , /* p r im e i r o operando */

num2 , /* segundo operando */

res ; /* r e s u l t a d o da ope racao */

cha r oper ; /* c a r a c t e r que d e f i n e a ope racao ←

*/

printf ( ”Por f a v o r en t r e com os operandos .\ n” ) ;

scanf ( ”%f %f ” , &num1 , &num2 ) ; getchar ( ) ;

printf ( ”Qual a ope racao \n” ) ;

oper = getchar ( ) ;

printf ( ”A operacao e %c\n” , oper ) ;

24

Exemplo: testa

sw i t ch ( oper ) {

ca se '+ ' :

res = num1 + num2 ;

b r eak ;

ca se '− ' :

res = num1 − num2 ;

b r eak ;

ca se ' * ' :

res = num1 * num2 ;

b r eak ;

ca se ' / ' :

i f ( num2 == 0 . 0 ) {

printf ( ” D i v i s a o por z e r o .\ n” ) ;

r e t u r n 1 ;

}

e l s e {

res = num1 / num2 ;

b r eak ;

} 25

Exemplo: fim do teste e imprime

d e f a u l t :

printf ( ”Operacao i n v a l i d a !\ n” ) ;

r e t u r n 2 ;

} /* f im do sw i t ch */

printf ( ”O r e s u l t a d o da %c v a l e %f .\ n” ,

oper , res ) ;

r e t u r n 0 ;

}

26

Comando Ternario

O comando ternario tem este nome porque necessita de tres

operandos para ser avaliado.

O comando ternario tem a seguinte forma:

express~ao1 ? express~ao2 : express~ao3

Para avaliar o resultado total da expressao, primeiro a

express~ao1 e avaliada.

Caso este resultado seja correspondente ao valor verdadeiro

entao o resultado da expressao sera igual ao resultado da

express~ao2.

Caso contrario a express~ao3 e avaliada e se torna o

resultado.

27

Exemplo

#i n c l u d e < s t d i o . h>

i n t main ( v o i d ) {

f l o a t num1 , /* p r im e i r o operando */

num2 , /* segundo operando */

max ; /* r e s u l t a d o da ope racao */

printf ( ” Imprime o maior v a l o r de d o i s numeros .\ n” ) ;

printf ( ”Por f a v o r en t r e com os d o i s mumeros .\ n” ) ;

scanf ( ”%f %f ” , &num1 , &num2 ) ;

max = ( num1>num2 ) ?num1 : num2 ;

printf ( ”O maior dos numeros l i d o s e %f .\ n” , max ) ;

r e t u r n 0 ;

}

28

Revisao da Secao

Introducao

Comandos de Teste

Comandos de Repeticao

Comandos de Desvio

29

Comandos de Repeticao

O que fazem?

Estes comandos permitem que trechos de programa sejam

repetidos um certo numero de vezes controlado pelo programa.

30

Comandos de Repeticao

O que fazem?

Estes comandos permitem que trechos de programa sejam

repetidos um certo numero de vezes controlado pelo programa.

Repetir ate quando?

O numero de vezes que um laco sera executado pode ser fixo ou

depender de condicoes que mudam durante a execucao do laco.

30

Lacos infinitos

31

Comando for

Este comando aparece em varias linguagens de programacao,

mas na linguagem C ele apresenta um grau maior de

flexibilidade.

Uma variavel de controle, geralmente um contador, recebe um

valor inicial.

O trecho de programa que pertence ao laco e executado.

Ao final a variavel de controle e incrementada ou

decrementada e comparada com o valor final.

Caso a condicao de termino tenha sido atingida o laco e

interrompido.

32

Forma Geral

f o r ( express~ao1 ; express~ao2 ; express~ao3 )

blocodecomandos ;

As tres expressoes geralmente tem os seguintes significados:

A express~ao1 e utilizada para inicializar a variavel de controle

do laco;

A express~ao2 e um teste que controla o fim do laco;

A express~ao3 normalmente faz um incremento ou

decremento da variavel de controle.

33

Passos

1 A express~ao1 e avaliada.

2 A express~ao2 e avaliada para determinar se o comando deve

ser executado.

3 Se o resultado da express~ao2 for verdadeiro executa o o

bloco de comandos

4 caso contrario o laco e terminado.

5 A expressao3 e avaliada.

6 Voltar para o passo 2.

34

Exemplo de for

f o r (i = 1 ; i <= 100 ; i++) {

printf ( ”Numero %d\n” , i ) ;

}

35

Outro exemplo de for

#i n c l u d e <s t d i o . h>

i n t main ( v o i d ) {

i n t numero , f=1, i ;

printf ( ” Ent r e com um numero p o s i t i v o .\ n” ) ;

scanf ( ”%d” , &numero ) ;

f o r (i=numero ; i>1; i−−) {

f = f * i ;

}

printf ( ”O f de %u v a l e %u . ” , numero , f ) ;

r e t u r n 0 ;

}

36

Mais de um comando por expressao

Outra possibilidade que o comando for em C permite e a inclusao

de varios comandos, separados por vırgulas, nas expressoes.

i n t i , j ;

f o r ( i=1, j = 10; i <= 10; i++, j += 10) {

printf ( ” i = %d , j = %d\n” , i , j ) ;

}

37

Testes usando outras variaveis

O teste da expressao de controle pode nao usar a variavel de

controle. O teste de final do laco pode ser qualquer expressao

relacional ou logica. O laco abaixo termina ou porque a variavel de

controle ja chegou ao seu limite ou foi batida a tecla ’*’.

#inc l ude<s t d i o . h>

i n t main ( ) {

cha r c = ' ' ;

i n t i ;

f o r ( i=0 ; (i<5) && (c != ' * ' ) ; i++ ) {

printf ( ”%c\n” , c ) ;

c = getchar ( ) ;

}

r e t u r n 0 ;

}38

Expressoes faltando

Um outro ponto importante do for e que nem todas as expressoes

precisam estar presentes. No exemplo abaixo a variavel de controle

nao e incrementada. A unica maneira do programa terminar e o

usuario bater o numero -1.

39

Expressoes faltando

Um outro ponto importante do for e que nem todas as expressoes

precisam estar presentes. No exemplo abaixo a variavel de controle

nao e incrementada. A unica maneira do programa terminar e o

usuario bater o numero -1.

#inc l ude<s t d i o . h>

i n t main ( ) {

i n t i ;

f o r ( i=0 ; i != −1 ; ) {

printf ( ”%d\n” ,i ) ;

scanf ( ”%d” , &i ) ;

}

r e t u r n 0 ;

}

39

Outras expressoes faltando

#inc l ude<s t d i o . h>

i n t main ( ) {

i n t i ;

i n t n ;

f o r ( i = 0 ; ; i++) {

scanf ( ”%d” , &n ) ;

printf ( ”numero %d\n” , n ) ;

i f ( n == 5) break ;

}

r e t u r n 0 ;

}

40

Laco Infinito

Uma construcao muito utilizada e o laco infinito. No laco infinito o

programa para quando se executa o comando break. O trecho de

programa a seguir somente para quando for digitada a tecla ’s’

ou ’S ’.

41

Laco Infinito

Uma construcao muito utilizada e o laco infinito. No laco infinito o

programa para quando se executa o comando break. O trecho de

programa a seguir somente para quando for digitada a tecla ’s’

ou ’S ’.

f o r ( ; ; ) {

printf ( ”\nVoce quer pa r a r ?\n” ) ;

c = getchar ( ) ;

i f (c == 'S ' | | c == ' s ' ) b r eak ;

}

41

Lacos for aninhados

Uma importante construcao aparece quando colocamos como

comando a ser repetido um outro comando for.

42

Lacos for aninhados

Uma importante construcao aparece quando colocamos como

comando a ser repetido um outro comando for.

#inc l ude<s t d i o . h>

i n t main ( v o i d ) {

i n t i , j ;

printf ( ” Imprime tabuada de mu l t i p l i c a c a o .\ n” ) ;

f o r ( i=1 ; i<10 ; i++) {

printf ( ”Tabuada de %d\n” , i ) ;

f o r (j=1; j<10; j++) {

printf ( ”%d x %d = %d\n” , i , j , i * j ) ;

}

}

r e t u r n 0 ;

}42

while

O comando while tem a seguinte forma geral:

43

while

O comando while tem a seguinte forma geral:

wh i l e ( express~ao )

bloco_de_comandos

43

Passos

1 A expressao e avaliada.

2 Se o resultado for verdadeiro entao o bloco de comandos e

executado, caso contrario a execucao do bloco e terminada.

3 Voltar para o passo 1.

44

Passos

1 A expressao e avaliada.

2 Se o resultado for verdadeiro entao o bloco de comandos e

executado, caso contrario a execucao do bloco e terminada.

3 Voltar para o passo 1.

Uma caracterıstica do comando while, e que o bloco de comandos

pode nao ser executado caso a condicao seja igual a falso logo no

primeiro teste.

44

Exemplo I

i = 1 ;

wh i l e (i <= 100) {

printf ( ”Numero %d\n” , i ) ;

i++;

}

45

Exemplo II

#i n c l u d e <s t d i o . h>

i n t main ( v o i d ) {

i n t c ;

puts ( ” Tec l e c para con t i nua r .\ n” ) ;

wh i l e ( ( c=getchar ( ) ) == ' c ' ) {

puts ( ”Nao Acabou .\ n” ) ;

getchar ( ) ; /* t i r a o en t e r */

}

puts ( ”Acabou .\ n” ) ;

r e t u r n 0 ;

}

46

do - while()

O comando do-while() tem a seguinte forma geral:

47

do - while()

O comando do-while() tem a seguinte forma geral:

do

bloco_de_comandos

wh i l e ( express~ao ) ;

47

Passos

1 Executa o bloco de comandos.

2 Avalia a expressao.

3 Se o resultado da expressao for verdadeiro entao volta para

o passo 1, caso contrario interrompe o do-while.

Observar que neste comando a expressao de teste esta apos a

execucao do comando, portanto o bloco de comandos e executado

pelo menos uma vez. A execucao do comando segue os seguintes

passos:

48

Exemplo

i = 1 ;

do {

printf ( ”Numero %d\n” , i ) ;

i++;

} wh i l e ( i <= 100) ;

49

Revisao da Secao

Introducao

Comandos de Teste

Comandos de Repeticao

Comandos de Desvio

50

Break

1 O comando break pode ser tanto usado para terminar um

teste case dentro de um comando switch quanto

interromper a execucao de um laco.

2 Quando o comando e utilizado dentro de um comando for o

laco e imediatamente interrompido e o programa continua a

execucao no comando seguinte ao comando for.

51

Break

f o r (i = 0 ; i < 100 ; i++) {

scanf ( ”%d” , &num ) ;

i f ( num < 0) break ;

printf ( ”%d\n” , num ) ;

}

52

Break

1 O comando continue e parecido com o comando break.

2 A diferenca e que o comando continue simplesmente

interrompe a execucao da iteracao corrente passando para a

proxima iteracao do laco, se houver uma.

3 No comando for o controle passa a execucao da express~ao3.

4 Nos comandos while e do-while o controle passa para a

fase de testes.

53

Exemplo

f o r (i = 0 ; i < 100 ; i++) {

scanf ( ”%d” , &num ) ;

i f ( num < 0) con t i nue ;

printf ( ”%d\n” , num ) ;

}

54

goto

1 O comando goto causa um desvio incondicional para um

outro ponto da funcao em que o comando esta sendo usado.

2 O comando para onde deve ser feito o desvio e indicado por

um rotulo, que e um identificador valido em C seguido por

dois pontos.

3 E importante notar que o comando goto e o ponto para onde

sera feito o desvio podem estar em qualquer ponto dentro da

mesma funcao.

4 A forma geral deste comando e:

goto rotulo;

. . .

rotulo: comando;

55

Atencao

Este comando durante muito tempo foi associado a programas

ilegıveis. O argumento para esta afirmacao se baseia no fato de

que programas com comandos goto perdem a organizacao e

estrutura porque o fluxo de execucao pode ficar saltando

erraticamente de um ponto para outro.

56

Atencao

Este comando durante muito tempo foi associado a programas

ilegıveis. O argumento para esta afirmacao se baseia no fato de

que programas com comandos goto perdem a organizacao e

estrutura porque o fluxo de execucao pode ficar saltando

erraticamente de um ponto para outro.

Atualmente as restricoes ao uso do comando tem diminuıdo e seu

uso pode ser admitido em alguns casos.

56

exit()

1 A funcao exit provoca a terminacao de um programa,

retornando o controle ao sistema operacional.

2 O prototipo da funcao e a seguinte:

void exit (int codigo);

3 Observar que esta funcao interrompe o programa como um

todo.

4 O codigo e usado para indicar qual condicao causou a

interrupcao do programa.

5 Usualmente o valor 0 indica que o programa terminou sem

problemas.

6 Um valor diferente de 0 indica um erro.

57

return

1 O comando return e usado para interromper a execucao de

uma funcao e retornar um valor a funcao que chamou esta

funcao.

2 Caso haja algum valor associado ao comando return este e

devolvido para a funcao, caso contrario um valor qualquer e

retornado.

3 A forma geral do comando e:

return express~ao;

4 Notar que a expressao e opcional.

5 A chave que termina uma funcao e equivalente a um comando

return sem a expressao correspondente.

6 E possıvel haver mais de um comando return dentro de uma

funcao.

7 O primeiro que for encontrado durante a execucao causara o

fim da execucao.58

The End

59