algo 10 linguagem C controle fluxo [Modo de Compatibilidade]€¦ · 2 Comandos Um comando em C é...
Transcript of algo 10 linguagem C controle fluxo [Modo de Compatibilidade]€¦ · 2 Comandos Um comando em C é...
1
Algoritmos e Lógica de Programação
Linguagem CLinguagem C
Reinaldo [email protected]
Comandos de Controle de Fluxo
Grupos:Seleção (comando condicional)
Comandos de Controle de Fluxo
ç ( )• if e switch;
Iteração (laços)• while, for e do-while
Desvio• break, continue, goto e return;
Rótulo• case, default e label;
Bloco• blocos de código { }
2
ComandosUm comando em C é definido em três maneiras:
Comandos de Controle de Fluxo
• Uma expressão seguida de um ponto e vírgula (;)x = 0;printf(“Alô mundo”);++i;
• Um bloco de comandos delimitados por { e }.{x = 0;printf(“Alô mundo”);printf( Alô mundo );++i;}
• Um comando de controle de fluxoif (nota >= 7.0)printf(“Aluno aprovado por média\n”);
Verdadeiro e Falso em CVerdadeiro: diferente de zero; Falso: igual a zero
Comandos de Controle de Fluxo
Comando if - elseÉ usado para tomar decisõesSeleciona a execução de um comando se uma expressão lógica for avaliada como VERDADEIRA (Diferente de Zero)Opcionalmente (quando se utilizar o else) é executado um outro comando quando a expressão for avaliada como FALSA (Valor Z )Zero)Sintaxe Geral
if (<expressao>)<comando-1>[ else<comando-2> ]
3
Exemploif (nota >= 7.0 && faltas < 16)
Comandos de Controle de Fluxo
printf(“Aluno aprovado por média\n”);else {
printf(“Aluno não foi aprovado por média\n”);printf(“Vai passar parte das férias estudando!\n”);
}Quando se aninham comandos if, o else é sempre Quando se aninham comandos if, o else é sempre associado ao if mais recente (mais próximo) que ainda não tem nenhum else associado pode-se forçar uma outra forma de associação dos comandos usando-se os delimitadores de blocos { e }
Para esclarecer veja o seguinte exemplo:...if ( grupoSanguineo == ‘O’ )
Comandos de Controle de Fluxo
if ( grupoSanguineo == O )if (fatorRH == ‘-’) {
printf(“Voce eh doador universal”);printf(“Fator RH - (negativo)”);
}else /* Erro difícil de ver */
printf(“Aguarde a fase de análise\n”);
Neste exemplo há um erro, pois o else está associado ao segundo if, apesar da indentação sugerir o contrárioCorrige-se adicionando os delimitadores de bloco { e } em torno dos comandos do primeiro if
4
Comando if – else (Exercício)Escreva um programa C que leia dois números do
Comandos de Controle de Fluxo
#include <stdio.h>main(){int a,b;printf(“Digite 2 números: “);
teclado e imprima na tela a divisão do primeiro pelo segundo. OBS: Deve-se evitar divisões por zero
printf( Digite 2 números: );scanf(“%d %d”,&a,&b);if (b)
printf(“%f”,a/b);else
printf(“Não posso dividir por zero\n”);}
main()
Comando if – else (Exercício)
Comandos de Controle de Fluxo
main(){int a,b,c;printf(“Digite os 3 Números: “);scanf(“%d %d %d”,&a, &b, &c);if (a > b)
if (a > c)printf(“\nO Maior é %d”,a);
else
(Exercício)
Escreva um programa C que leia três números do teclado, e imprima na tela o maior entre
printf(“\nO Maior é %d”,c);else
if (b > c)printf(“\nO Maior é %d”,b);
else printf(“\nO Maior é %d”,c);
}
na tela o maior entre eles.
5
Comando if – else (Exercício)Escreva um programa C que leia dois números do
Comandos de Controle de Fluxo
main(){int a,b,t;printf(“Digite os 2 Números: “);scanf(“%d %d”,&a, &b);if ( b) {
Escreva um programa C que leia dois números do teclado, e os imprima na tela em ordem ascendente.
if (a < b) {t = a;a = b;b = t;}
printf(“Ordenados: %d e %d\n“, b, a);}
ifs AninhadosUm if aninhado é um comando if que está localizado dentro de
t if l
Comandos de Controle de Fluxo
outro if ou else;if (salario > 200) {
if (salario < 300)printf(“8% desc.”);
elseif (salario < 500)
printf(“9% desc.”);
obs: este códigofunciona, mas oteste não éeficiente!
elseprintf(“11% desc.”);
} elseprintf(“sem desconto”);
O padrão ANSI especifica que até 15 níveis de aninhamento devem ser suportados.
eficiente!
6
Escada if-else-ifAs condições são avaliadas de cima para baixo
Comandos de Controle de Fluxo
As condições são avaliadas de cima para baixoAssim que uma condição verdadeira é encontrada, o comando associado a ela é executado e o fluxo é desviado do resto da escada
Sintaxe:
Comando ?: Forma compacta de expressar uma instrução if – else
Comandos de Controle de Fluxo
• (condição) ? expressão1 : expressão2Exemplo 1: Determinar o maior entre dois números.(num1 > num2) ? printf(“%d”, num1) : printf(“%d”, num2);Forma estendida:
if (num1 > num2)printf(“%d”, num1);
else printf(“%d”, num2);
Exemplo 2: Determinar o valor absoluto de um número.• ABS = (num < 0) ? - num : num;
Exercício: Determinar e imprimir se um número é par ou ímpar.
7
Comando switch Verifica se uma dada expressão corresponde a um dos
Comandos de Controle de Fluxo
Verifica se uma dada expressão corresponde a um dos valores especificados. Permite tomar múltiplas decisões a partir da avaliação de uma expressão.
Forma de se substituir o comando if – else ao se executar vários testesexecutar vários testes
• Diversas vezes precisamos determinar se um valor encontra-se numa lista de valores. Apesar de podermos usar uma seqüência de ifs, este recurso além de não ser elegante, por vezes confunde o entendimento do programa
switch (<expressão>) {OBS:
A ã d iá l d ti
Comandos de Controle de FluxoComando switch
( p ) {case <valor 1> :
<instruções>;[break;]
case <valor 2> :< instruções>;[break;]
case <valor 3> :
• A expressão deve ser uma variável do tipo inteiro ou caractere
• Os valores podem ser caracteres, inteiros, ou uma expressão de constantes, mas nunca variáveis ou referências a funções
•Execução começa no primeiro case com valor igual ao da expressão, e continua pelos casescase valor 3 :
< instruções>;[break;]
[default :< instruções>;]
}
igual ao da expressão, e continua pelos cases seguintes até encontrar o final do switch ou um comando de escape (break)
• O rótulo default é opcional e é executado quando nenhum dos cases corresponde ao valor da expressão
•O comando switch sé pode testar a igualdade
8
Exemplo ...opcao = getche(); // Lê do teclado a opcaoswitch (opcao) {
Comandos de Controle de Fluxo
switch (opcao) {case ‘1’:
incluir();break;
case ‘2’:alterar();break; ‘3’case ‘3’:excluir();break;
default:puts(“opção inválida”);
}...
Vejamos a seguinte situação…i=2; // depois i=4,5 e 6. O que vai ser impresso?switch(i) {
Comandos de Controle de Fluxo
switch(i) {case 1:case 2:case 3:
printf(“computacao”);break;
case 4:i f(“f di l i ”)printf(“fonoaudiologia”);
case 5:printf(“fisioterapia”);break;
defaultprintf(“Nao ha correspondencia!”);
}
9
Observe…switch(i) {
case 1:
Comandos de Controle de Fluxo
int t;t = 10; // Está errado!
case 2:...
}
switch(i) {case 1: { /* criando um bloco */case 1: { / criando um bloco /
int t;t = 10;printf(“%d”, t);break;
}case 2:...
Comando switch (Exemplo Calculadora: Escreva um programa C que receba 2 números e um
Comandos de Controle de Fluxo
um programa C que receba 2 números e um caractere operador (+, -, * ou /) do teclado, realize a operação determinada entre eles e imprima na tela o resultado.
10
#include <stdio.h>i ( ) {
Comandos de Controle de Fluxo
main ( ) {char op;float num1, num2;printf (“ Digite um número, um operador e um número:”);scanf (“ %f %c %f”, &num1, &op, &num2);switch (op) {
case ‘+’:printf (“ = %f”, num1 + num2);break;;
case ‘-’:printf (“ = %f”, num1 - num2);break;
default:printf (“ Operador inválido!”);
}}
switch aninhadoswitch(i) {
case 1:
Comandos de Controle de Fluxo
case 1:switch(j) {
case 0:printf(“Erro de divisão por zero”);break;
case 1:printf(“%d”, i/j);
} // i h d j} // switch do jbreak;
case 2:...
}
11
Estruturas de repetiçãoComo imprimir os 1000 primeiros números a partir de 1?
Comandos de Controle de Fluxo
#include <stdio.h>
main ( )
{
printf (“1 ”);
i tf (“2 ”)
Como imprimir os 1000 primeiros números a partir de 1?
printf (“2 ”);
: : :
printf (“10 ”);
}
saída: 1 2 3 4 ... 10
Estruturas de repetição (laços ou loops)Repetem uma seqüência de comandos
Comandos de Controle de Fluxo
Repetem uma seqüência de comandos• for
• while
• do-while
12
Comando forSintaxe:f (<i i i li ã > < ã ló i > <i t >)
Comandos de Controle de Fluxo
for (<inicialização>; <expressão lógica>; <incremento>)<instrução>;
• <inicialização>:– Expressão de atribuição.– Sempre é executada uma única vez.
• <expressão lógica>:– Condição que controla a execução do laço.– É sempre avaliada a cada execução.– Se Verdadeiro continua a execução.– Se falso pára a execução.
• <incremento>:– Define como a variável de controle será alterada.– É sempre executada após a execução do corpo do laço.
Comando forExemplo 1: Como imprimir os 1000 primeiros números
Comandos de Controle de Fluxo
#include <stdio.h>main ( )
{int num;
Exemplo 1: Como imprimir os 1000 primeiros números a partir de 1?
for (num = 1; num <= 1000; num++)printf (“ % d”, num);
}Saída: 1 2 3 ... 1000
13
Comando forExercício: Como imprimir os números pares entre 0 e
Comandos de Controle de Fluxo
#include<stdio.h>main ( ){
int num;
Exercício: Como imprimir os números pares entre 0 e 100?
for ( num = 0; num <= 100; num += 2 )printf (“ %d”, num);
}
Saída: 2 4 6 8
Comando forFlexibilidade: qualquer expressão de um laço “for” pode
Comandos de Controle de Fluxo
q q p ç pconter várias instruções separadas por vírgula.
for (x=0, y=0; x + y < 100; ++x, y = y + x) printf(“%d”, x + y);
Esta instrução inicializa x e y com zero, incrementando d 1 1 b d l id d l x de 1 em 1 e y recebendo seu valor acrescido do valor
de x. O resultado a cada iteração seria impresso desta forma: 0 (x=0 e y=0) 2 (x=1 e y=1) 5 (x=2 e y=3) 9 14 e assim sucessivamente.
14
A condição como sentença relacional ou lógica
Comandos de Controle de Fluxo
...int x;char ch = ‘A’;for (x =0; x<3 && ch != ‘#’; x++) {
printf(“digite o número: “);ch = getche();g ();
}
if (x == 3)exit(0);
…/* Executa as operações em caso de sucesso */
Comando for – Laço Infinitofor(;;)
Comandos de Controle de Fluxo
for(;;)printf(“Este laço executará eternamente!\n”);
Qualquer das 3 partes do for pode ser omitida, no entanto os ponto e vírgula (;) devem permanecerNo caso da <expressão lógica> ser omitida a avaliação No caso da <expressão lógica> ser omitida, a avaliação será sempre VERDADEIRA. Desta forma será criado um laço infinito na execução do programa
15
Comando for – Laço InfinitoAo contrário de outras linguagens que não permitem o
Comandos de Controle de Fluxo
for(;;) {
Ao contrário de outras linguagens que não permitem o término do laço a não ser quando a condição de finalização for satisfeita, C permite que um laço seja interrompido antes de seu término normal sem qualquer inconveniente através do comando “break”
for(;;) {scanf(“%c”,&c);if (c == ‘A’)
break; /*interrompe o que deveria ser um laço infinito*/
}printf(“Fim do Laço!”);
Comando continue utilizado em laçosForça a próxima iteração do laço
Comandos de Controle de Fluxo
main(){ int x;
Força a próxima iteração do laço.Pula o código que estiver em seguida.Exercício: Escreve um programa C que imprima na tela os números pares compreendidos entre 0 e 100
for(x = 0; x <= 100; x++) {
if (x % 2) continue;
printf(“%d ”, x); }
}
16
Comando for – Laço Vazio
Comandos de Controle de Fluxo
for(i=0;i<10;i++);
A presença do ponto e vírgula finalizando o comando, força a execução do laço sem que seja executado qualquer outro comandoqualquer outro comando.
Comando whileExecuta um comando ou um bloco destes, enquanto uma
Comandos de Controle de Fluxo
expressão (condição) lógica for avaliada como VERDADEIRA.Sintaxe geral
while (<expressao>)<comando>O while é um comando de repetição (loop) com teste “antes” (em cima)(em cima)Expressão lógica é avaliada antes da execução do comando associado, de tal forma que se a expressão for avaliada como FALSA na primeira vez, o comando não será executado mais executado
17
Comando whileExemplo: Como imprimir os 1000 primeiros números a
Comandos de Controle de Fluxo
#include <stdio.h>main(){int i=1;
Exemplo: Como imprimir os 1000 primeiros números a partir de 1?
int i 1;while (i <= 1000) {
printf(“%d ”,i);i++;
}}
Comando whileExercício: Como imprimir os números pares entre 0 e
Comandos de Controle de Fluxo
#include <stdio.h>main(){int i=0;while (i <= 100) {
printf(“%d\n”, i);
Exercício: Como imprimir os números pares entre 0 e 100.
i+=2;}
}
18
Comando whileExemplo – Quando o laço será interrompido?
Comandos de Controle de Fluxo
. . .int emTrabalho=1;while (emTrabalho) {emTrabalho=processa();
}. . .
Exemplo Quando o laço será interrompido?
Comando do – whileExecuta um comando, ou um bloco destes, e em seguida avalia
ã C j li d
Comandos de Controle de Fluxo
uma expressão. Caso a mesma seja avaliada como VERDADEIRA os comandos são repetidos.Sintaxe geral
do<comando>
while (<expressao>);
O do-while é um comando de repetição (loop) com teste “depois” (em baixo), ou seja, a expressão lógica é avaliada após a execução do comando associadoO comando será executado ao menos uma vez
19
Comando do – whileExemplo 1: Seleção de Menu
Comandos de Controle de Fluxo
. . .do {
clrscr();puts(“Menu Principal\n\n”);puts(“1 - Incluir”); ...puts(“4 - Sair”);do
opcao = getche();while (opcao < ‘1’ || opcao > ‘5’);while (opcao < 1 || opcao > 5 );switch (opcao) {
case ‘1’:incluir();break;
. . .}
} while (opcao != ‘4’);. . .
Comando do – whileExemplo 2: Programa que lê números do teclados
Comandos de Controle de Fluxo
#include <stdio.h>main(){int num;do {
Exemplo 2: Programa que lê números do teclados enquanto esses números são menores que 10.
do {printf(“Digite um número menor que 10:”);scanf(“%d”,&num);
} while (num < 10);printf(“Programa encerrado – Você digitou um número maior que 10!”);}
20
Comando breakInterrompe a execução de um loop (for, while, do-while)
Comandos de Desvio de Fluxo
independentemente da expressão lógica que controla o mesmoEvita o teste condicional normal do laçoQuando usado em um switch interrompe a sequência de execução do mesmo, fazendo com que todos os case’s posteriores ao break sejam descartadosToda vez que um comando break é encontrado o loop (ou Toda vez que um comando break é encontrado, o loop (ou switch) mais interno é interrompido.Sintaxe geral
• break;
Exemplo...
Comandos de Desvio de Fluxo
clrscr();for (nl = 0, i = 0; i < 256; ++i) {
printf(“%03d - %c\n”, i, i);if (++nl > 23) {
printf(“<Esc> aborta <Enter> continua ”);if (getch() == 27)(g () )break;clrscr();nl = 0;
}}
21
Comando continueDesvia o fluxo de execução de um loop para a próxima iteração d l d l ódi i t diá i
Comandos de Desvio de Fluxo
do mesmo, pulando qualquer código intermediárioAo contrário do break, o continue se aplica somente aos loops, e não ao switch.O comando continue num switch dentro de um loop, provoca a próxima iteração do loopQuando o loop é um while ou um do-while, a expressão lógica será imediatamente executadaserá imediatamente executadaQuando o loop é um for, no entanto a expressão de incremento será executada primeiro, seguida então da expressão lógicaSintaxe geral
• continue;
Exemplo...
Comandos de Desvio de Fluxo
for (i = 0; i < 10; ++i) {scanf(“%d”, &numero);if ( numero <= 0)
continue; /* Salta numeros menores igual a 0 *//* Trata elementos acima de zero */
soma += numero;}printf(“Soma =%d”)...
22
Comando gotoDesvia, incondicionalmente, o fluxo de execução para um bloco d d i i i d ót l (l b l)
Comandos de Desvio de Fluxo
de comandos iniciados por um rótulo (label)Sintaxe geral
• goto <rótulo>;As regras de formação para o nome do rótulo são as mesmas para a formação do nome de identificadores em C. No ponto de início do bloco de comandos, o rótulo tem seu nome acrescido de dois pontos (:)de dois pontos (:)Uso indiscriminado deve ser evitado, pois em geral dificulta o entendimento da lógica do programaSó quando se tem um aninhamento de vários loops e se deseja encerrar todos eles, o goto deve ser utilizado
Exemplo...
Comandos de Desvio de Fluxo
for (...) {for (...) {
...if (houve erro)
goto ERRO;}}
}
ERRO:/* arruma a casa */...
23
Comando exitFunção que provoca a saída imediata de um programa, forçando t i t i l
Comandos de Desvio de Fluxo
o retorno ao sistema operacional;
Sintaxe geral• exit( int <código de retorno>);• Código de retorno: retornado ao processo chamador (normalmente é o
sistema operacional)• O valor zero: indica uma terminação normal do programa. Outros ç p g
argumentos são usados para indicar outro tipo de erro
Uso:• Quando uma condição para a execução do programa não é satisfeita
Exemplo...do {
Comandos de Desvio de Fluxo
do {ch = getchar();switch(ch) {
case ‘1’:incluir();break;
case ‘2’:l ()alterar();
break;case ‘3’:
exit(0);}
} while ( ch != ‘1’ && ch!=‘2’);
24
Algoritmos e Lógica de Programação
Linguagem CLinguagem C
Reinaldo [email protected]
Comandos de Controle de Fluxo