Sei sulla pagina 1di 32

Linguagem C

Comandos de Deciso

Comandos de Deciso

Uma das tarefas fundamentais de qualquer programa decidir o que deve ser executado a seguir Os comandos de deciso permitem determinar qual a ao a ser tomada com base no resultado de uma expresso condicional Podemos escolher entre aes alternativas, dependendo de critrios desenvolvidos no decorrer do programa A linguagem C oferece trs comandos de deciso if if-else switch

O Comando if

O comando if instrui o computador a tomar uma deciso simples

/*IfDemo.C */ #include <stdio.h> #include <stdlib.h> int main() { int anos; printf("Quantos anos voce tem? \n"); scanf("%d", &anos); if( anos < 30) /* Toma uma deciso caso anos < 30 */ printf("Voce e muito jovem!\n"); getchar (); getchar (); return 0; }

Sintaxe do if

O comando consiste na palavra-chave if seguida de uma expresso de teste entre parnteses Se a expresso de teste for verdadeira, a instruo ser executada Se a expresso de teste for falsa, nada ser feito O corpo de um if pode conter uma nica instruo terminada por ponto-e vrgula, ou vrias instrues entre chaves

if(expresso de teste) { instruo; instruo; }

Exemplo O programa que conta zeros


/*ContaZeros.C */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { char ch; int cont=0; printf("Digite uma frase\n"); while( (ch=getche())!= '\r') if(ch=='0') { printf("\n\nZERO detectado\n\n"); cont++; } printf("Voce digitou %d zeros.\n", cont); getchar(); return 0; }

O Programa que conta caracteres e palavras


/*ContaPal.C */ /*Conta caracteres e palavras de uma frase */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int nch = 0; int npalavras = 0; char ch; printf("Digite uma frase:\n"); while( (ch=getche())!= '\r') /* termina com [enter] */ { nch++; /* conta caracteres */ if(ch ==' ')/* espao em branco ? */ npalavras++; } printf("\n\nForam contados %d caracteres ", nch); printf("e %d palavras nesta frase.\n", npalavras + 1); printf("\nTecle [ENTER] para sair.\n"); getchar(); return 0; }

Comandos if aninhados

Um comando if pode estar dentro de outro comando if

/* Ninhosif.C */ /* Mostra if aninhados */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { char ch; printf("Digite uma letra de 'a' a 'z':"); ch=getche(); if(ch >= 'a') if(ch <= 'z') printf("\nVoce digitou uma letra minuscula.\n"); printf("Tecle [ENTER] para sair.\n");

getchar(); return 0;
}

Implementando um algoritmo

Algoritmo do quadrado de um nmero positivo


O quadrado de um nmero positivo n igual soma dos n primeiros nmeros mpares

n 2 2i 1
i 0

n 1

32 = 1 + 3 + 5 62 = 1 + 3 + 5 + 7 + 9 + 11 82 = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15

Implementando um algoritmo
/*Quadrado.C */ /*Calcula o quadrado de nmeros */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int i,n, soma=0; printf("Digite um numero inteiro:\n"); scanf("%d", &n); printf("O quadrado de %d e ", n); if( n < 0 ) n = -n; /*Se negativo, muda o sinal*/

for(i=1 ; n > 0 ; n-- ) { soma += i; i += 2; } printf("%d.\n", soma); printf("Tecle [ENTER] para sair.\n"); getchar(); getchar(); return 0; }

O Comando if-else

O comando if-else a expanso de um simples if

O comando if permite que executemos algo somente se a sua expresso de teste for verdadeira caso contrrio nada executado
Por outro lado, o comando if-else permite executar determinadas instrues se a expresso de testes for verdadeira alm de outras instrues se a expresso de testes for falsa

Sintaxe do comando if-else

if-else consiste no comando if acompanhado de uma instruo ou de um bloco de instrues seguido da palavra-chave else, tambm acompanhada de um instruo ou de um bloco de instrues
if(expresso de teste) { instruo; instruo; } else { instruo; instruo; }

O programa que conta zeros modificado


/*ContaZeros1.C */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { char ch; int cont=0; printf("Digite uma frase\n"); while( (ch=getche())!= '\r') if(ch=='0') { printf("\n\nZERO detectado\n\n"); cont++; } if(cont > 0) printf("\nVoce digitou %d zeros.\nTecle[ENTER] para sair.\n", cont); else printf("\nVoce nao digitou zero.\nTecle[ENTER] para sair.\n"); getchar(); return 0; }

Um jogo de cara ou coroa


/*CaraCoroa.C */ /*Jogo de cara ou coroa */ #include <stdio.h> #include <stdlib.h> int main() { int n, perda=0, ganho=0, resp,i; printf("Quantas vezes voce quer jogar? "); scanf("%d",&n); for (i=0; i < n; i++) { printf("Escolha: 0=Cara e 1=Coroa: "); scanf("%d",&resp); while ( resp != 0 && resp != 1) { printf("ERRO: entre 0 cara e 1 coroa "); scanf("%d",&resp); } if( (rand()%2)==resp) { ganho++; if(resp==0) printf("Cara, voce ganhou.\n"); else printf("Coroa, voce ganhou.\n"); } else { perda++; if(resp==1) printf("Cara, voce perdeu.\n"); else printf("Coroa, voce perdeu.\n"); } } printf("\n\nRelatorio Final:"); printf("\nNo. de jogos que voce ganhou: printf("\nNo. de jogos que voce perdeu: printf("\nTecle [ENTER] para sair.\n"); } getchar(); getchar(); return 0; %d",ganho); %d\n", perda);

Comandos if-else aninhados

Quando v tem um certo nmero de if e else, como o computador decide qual else de qual if?

if(x > y) if(y != 0) a = x/y; else a = y;

Quando ser executada a instruo a = y;?


Em outras palavras, o else est associado ao primeiro ou ao segundo if?

O else est sempre associado ao mais recente if sem else


Se o x no for maior que y, nada ser executado

Caso no seja isto o desejado, devemos usar chaves

if(x > y) { if(y != 0) a = x/y; } else a = y;

Usando operadores lgicos

Operadores lgicos so comuns em expresses de teste de comandos if


/* bomdia.c */ #include <stdio.h> #include <stdlib.h>
int main () { int dia,mes; printf("Digite: dia mes: "); scanf("%d%d",&dia,&mes); if(mes==12 && dia==25) printf("FELIZ NATAL!\n"); else printf("BOM DIA!\n"); getchar(); getchar(); return 0; }

Contrues else-if
/* Calculadora.C */ /*Simula uma calculadora de 4 operaes*/ #include <stdio.h> #include <stdlib.h> int main() { const int TRUE=1; while(TRUE) /* Sempre verdadeiro*/ { float n1,n2; char op; printf("\nDigite numero operador numero: "); scanf("%f%c%f", &n1, &op, &n2); if( op == '+') printf("\n%f", n1 + n2); else if( op == '-') printf("\n%f", n1 - n2); else if( op == '*') printf("\n%f", n1 * n2); else if( op == '/') printf("\n%f", n1 / n2); else printf("\nOperador desconhecido.");

} printf("\nPrograma Finalizado. Tecle [ENTER] para sair."); getchar(); getchar(); return 0;

Contrues else-if

Um conjunto de if-else aninhados pode ser escrito por meio de outro estilo, afim de tornar o programa mais legvel: construes else-if

Contrues else-if
/* Calculadora1.C */ /*Simula uma calculadora de 4 operaes*/ #include <stdio.h> #include <stdlib.h> int main() { const int TRUE=1; while(TRUE) /* Sempre verdadeiro*/ { float n1,n2; char op; printf("\nDigite numero operador numero: "); scanf("%f%c%f", &n1, &op, &n2); if( op == '+') printf("\n%f", n1 + n2); else if( op == '-') printf("\n%f", n1 - n2); else if( op == '*') printf("\n%f", n1 * n2); else if( op == '/') printf("\n%f", n1 / n2); else printf("\nOperador desconhecido.");

} }

printf("\nPrograma Finalizado. Tecle [ENTER] para sair."); getchar(); getchar();

return 0;

Os comandos break e continue

Os comandos break e continue so instrues que devem pertencer ao corpo de um lao for, while ou do-while

No podem ser utilizados em outras partes de um programa

O comando break tem um segundo uso que ser analisado em seguida junto ao comando switch O comando break causa a sada imediata de um lao

Em seguida, o controle passa para prxima instruo

Se a instruo break pertencer a um conjunto de laos aninhados, afetar somente o lao ao qual pertence e os laos internos a ele
O programa anterior tem uma falha: nunca acaba.

Indique uma possvel soluo.

Uso do comando break


/* Calculadora2.C */ /*Simula uma calculadora de 4 operaes*/ /* Mostra o uso de break */ #include <stdio.h> #include <stdlib.h> int main() { const int TRUE=1; while(TRUE) /* Sempre verdadeiro*/ { float n1,n2; char op; printf("\nDigite numero operador numero: "); scanf("%f%c%f", &n1, &op, &n2); if( n1 == 0.0 ) break;/*Termina se Zero digitado*/

} printf("\nPrograma Finalizado. Tecle [ENTER] para sair."); getchar(); getchar(); return 0;

if( op == '+') printf("\n%f", n1 + n2); else if( op == '-') printf("\n%f", n1 - n2); else if( op == '*') printf("\n%f", n1 * n2); else if( op == '/') printf("\n%f", n1 / n2); else printf("\nOperador desconhecido.");

O comando continue

O comando continue fora a prxima iterao do lao e pula o cdigo que estiver abaixo

Nos laos while e do-while, um comando continue faz com que o controle do programa avalie imediatamente a expresso de teste e depois continue o processo do lao
No lao for, executada a expresso de incremento e, em seguida, o teste

O exemplo a seguir imprime apenas os caracteres digitados no teclado que so diferentes de dgitos

Uso do comando continue


/* SemDigitos.C */ /* Elimina impresso de dgitos */ /* Mostra o uso de continue */ #include <stdio.h> #include <stdlib.h> #include <conio.h> /* para getche()*/ int main() { char ch; while ((ch=getch())!='X') /* Termina quando digitado X*/ { if( ch >= '0' && ch <= '9') /* dgito?*/ continue; /*Execute o teste novamente*/ printf("%c", ch); } printf("\nPrograma Finalizado. Tecle [ENTER] para sair.");

getchar(); return 0;
}

O comando goto

O comando goto est disponvel em C para fornecer alguma compatibilidade com outras linguagens

Sua utilizao no aconselhada Esse comando causa o desvio do controle do programa para a instruo seguinte ao rtulo com o nome indicado Lembrando que um rtulo um nome seguido de dois-pontos (:)

if(x == 0) goto erro; else r = n/x; ..... ..... erro; printf(\nERRO: diviso por zero);

O comando switch

O comando switch permite selecionar uma entre vrias aes alternativas Embora construes como if-else possam executar testes para escolha de uma entre vrias alternativas, muitas vezes so deselegantes O comando switch tem um formato limpo e claro

Sintaxe do comando switch


switch(varivel ou constante) { case constante 1: instruo; instruo; break; case constante 2: instruo; instruo; break; case constante 3: instruo; instruo; break; default: instruo; instruo; break; } Sem ponto-e-vrgula Dois pontos Geralmente, a ltima instruo break, o que causa a sada imediata de todo o corpo do switch

Voc no poder usar uma varivel ou uma expresso lgica como rtulo de um caso dentro de um switch

Sintaxe do comando switch


switch(varivel ou constante) { case constante 1: instruo; instruo; break; case constante 2: instruo; instruo; break; case constante 3: instruo; instruo; break; default: instruo; instruo; break; }
O corpo de cada caso poder ser vazio ou conter um ou mais intrues, que no necessitam estar entre chaves. O corpo de um switch deve estar entre chaves. Se o rtulo de um caso for igual ao valor da expresso do switch, a execuo comear nele. Se nenhum caso for satisfeito e existir um caso default, a execuo comear nele. Um caso default opcional. No pode haver casos com rtulos iguais.

Exemplo

O primeiro exemplo imprime o dia da semana a partir de uma data O ano deve ser maior ou igual a 1600 Nessa data houve uma redefinio do calendrio

/* DiaSemana.C */ /* Imprime o dia da semana a partir de uma data */ /* Mostra o uso de switch */ #include <stdio.h> #include <stdlib.h> #include <conio.h> /* para getch()*/ int main() { int dia, mes, ano, dSemana; const char ESC = 27; do { printf("Digite a data na forma dd mm aaaa: "); scanf("%d%d%d",&dia, &mes, &ano); dSemana = ano + dia + 3 * (mes - 1) - 1; if( mes < 3) ano--; else dSemana -= (int)(0.4*mes+2.3); dSemana += (int)(ano/4) - (int)((ano/100 + 1)*0.75); dSemana %= 7; switch(dSemana) { case 0: printf("Domingo"); break; case 1: printf("Segunda-feira"); break; case 2: printf("Tera-feira"); break; case 3: printf("Quarta-feira"); break; case 4: printf("Quinta-feira"); break; case 5: printf("Sexta-feira"); break; case 6: printf("Sbado"); } printf("\nESC para terminar ou ENTER para recomear"); printf("\n"); } while (getch() != ESC); system("PAUSE"); return 0; }

O programa calculadora.c modificado

Re-escrevemos o programa para que use um comando switch no lugar de ninhos de if-else

O programa calculadora.c modificado


/* Calculadora3.C */ /* Simula uma calculadora de 4 operaes*/ /* Mostra o uso de switch */ #include <stdio.h> #include <stdlib.h> int main() { const int TRUE=1; while(TRUE) /* Sempre verdadeiro*/ { float n1,n2; char op; printf("\nDigite numero operador numero: "); scanf("%f%c%f", &n1, &op, &n2); if( n1 == 0.0 ) break;/*Termina se Zero digitado*/ switch(op) { case '+': printf("\n%f", n1 + n2); break; case '-': printf("\n%f", n1 - n2); break; case '*': printf("\n%f", n1 * n2); break; case '/': printf("\n%f", n1 / n2); break; default: printf("\nOperador desconhecido."); }

printf("\nPrograma Finalizado. Tecle [ENTER] para sair."); getchar(); getchar();


} return 0;

Casos sem break em comandos switch


Quando vrios casos devem executar as mesmas instrues, usamos casos sem break Suponhamos que queremos permitir ao usurio do programa calculadora.c utilizar o sinal * ou x para indicar multiplicao o sinal / ou \ para indicar diviso

/* Calculadora4.C */ /* Simula uma calculadora de 4 operaes*/ /* Mostra casos sem break em switch */ #include <stdio.h> #include <stdlib.h> int main() { const int TRUE=1;

while(TRUE) /* Sempre verdadeiro*/ { float n1,n2; char op;


printf("\nDigite numero operador numero: "); scanf("%f%c%f", &n1, &op, &n2); if( n1 == 0.0 ) break;/*Termina se Zero digitado*/ switch(op) { case '+': printf("\n%f", n1 + n2); break; case '-': printf("\n%f", n1 - n2); break; case 'x' : case '*': printf("\n%f", n1 * n2); break; case '\\': case '/': printf("\n%f", n1 / n2); break; default: printf("\nOperador desconhecido."); }

} printf("\nPrograma Finalizado. Tecle [ENTER] para sair."); getchar(); getchar(); return 0;

Potrebbero piacerti anche