Aula 6 - Estruturas de Controle
Ameliara Freire [email protected]
Variaveis, constantes, leitura e escrita ainda não são suficientes para formar uma
linguagem completa para descricao de programas.
Cada programa/algoritmo tem um fluxo de execucao que pode ser definido usando
termos especificos de uma linguagem
◦ Estrutura sequencial
◦ Estrutura de selecao
◦ Estrutura de repeticao
Tipos primitivos
Impõe uma ordem de cima para baixo e da esquerda para a direita na execucao de um algoritmo.
As acoes são separadas por “;”
Formato geral:
Estrutura sequencial
//declaracao de variaveis
//corpo do algoritmo acao 1;
acao 2;
...
Permite o uso de condicoes para escolher entre execucoes de diferentes blocos
Condicoes são expressoes lógicas relacionais que, quando avaliadas, produzem valor lógico (booleano)
Comandos:
◦ if
◦ if – else
◦ switch - case
Estruturas de
selecao/decisao
Forma geral
if-else
if(condicao){
//sequencia de comandos se verdadeiro }else{ // o else é opcional
//sequencia de comandos se falso }
if(media > 7.0){
printf(“Aprovado”);
}else{
printf(“Final ou reprovado”);
}
Fluxo do if-else
if (condicao) { C1;
C2;
...
Cn;
}else { D1;
D2;
...
Dm;
}
condicao
C1;
C2;
...
Cn;
V
D1;
D2;
...
Dn;
F
Altere a funcao que lê as notas do aluno e imprime a média para que a mensagem
impressa se comporte da seguinte maneira:
◦ Se a média foi maior ou igual a 7.0 a mensagem deve ser “Aprovado”. Caso contrário a mensagem deve ser “Estude mais para a final”.
Exercicio
O que o programa abaixo faz?
Exercicio
#include <stdio.h>
main(){
int a,b;
printf(“Digite 2 números: “);
scanf(“%d %d”,&a,&b);
if (b){
printf(“%f”,a/b);
}else {
printf(“Não posso fazer a divisao”);
} }
Variacoes do if-else
if(condicao 1){
C1
}else if (condicao 2){
C2
}else if(condicao 3){
C3 }else{
C4 }
if(condicao 1){
if(condicao 2){
if(condicao 3){
...
} } }
if(condicao 1){
...
}
if(condicao 2){
...
}
if(condicao 3){
...
Cada código que estiver dentro de um bloco deve estar um nível a mais de indentação à direita do bloco mais externo.
Indentar o código é FUNDAMENTAL para
compreensão do escopo de código (identificar
onde começa e onde termina).
Importância da indentação
if(condicao 1){
if(condicao 2){
if(condicao 3){
...
} } }
Como simplificar a seguinte selecao aninhada?
Simplificando selecoes
if (condicao1) { if (condicao2) { if (condicao3) { if (condicao4) { W;
} } } }
if (condicao1 && condicao2 && condicao3 && condicao4){
W;
}
Simplificando selecoes
if (X == V1) { C1;
}
if (X == V2) { C2;
}
if (X == V3) { C3;
}
if (X == V4) { C4;
}
Como diminuir o numero de testes?
if (X == V1) { C1;
}else if (X == V2) { C2;
}else if (X == V3) { C3;
}else if (X == V4) { C4;
}
Qual a
sequencia de comparacoes para atingir
Análise de fluxo
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
Que comandos são executados quando A=B=V e C=F?
Análise de fluxo
Que comandos são executados quando A=B=V e C=F?
{
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
}
Análise de fluxo
Que comandos são executados quando A=C=F e B=V?
{
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
}
Análise de fluxo
Que comandos são executados quando A=C=F e B=V?
{
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
}
Análise de fluxo
Que comandos são executados quando A=C=F e B=V?
{
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
}
Análise de fluxo
Que comandos são executados quando A=C=F e B=V?
{
int A,B,C;
if (A != 0){
C1;
}else{
if (B != 0){
if (C != 0){
C2;
}else{
C3;
C4;
} } C5;
} C6;
}
Escreva um programa que lê a idade de um usuario e em seguida diz se o usuário é ou não maior de idade.
Escreva um programa que lê um número inteiro e diz se o número é par ou ímpar.
Escreva um programa que lê tres numeros e em seguida imprime quantos deles são
iguais.
Escreva um programa que lê três número s inteiros e em seguida imprime os números em ordem crescente.
Exercício
#include <stdio.h>
main() { int num;
printf("Programa que verifica numero\n\n");
printf("Digite o numero: ");
scanf("%d",&num);
if(num%2 == 0) {
printf("\n Numero par!");
} else {
printf("\n Numero impar!");
} }
Multipla escolha: quando se tem um conjunto de valores discretos a serem testados, onde cada valor corresponde a uma acao.
Otimizacao das escolhas se-senao-se
Switch-case
switch (<variável>) { case <valor 1>:
<instruções>;
[break;]
case <valor 2> :
< instruções>;
[break;]
...
[default:<instruções>;]
}
OBS:
• “ variável” deve ser int ou char;
• “break” serve para implementar escolha disjunta
Escreva 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
Switch-case (exemplo)
#include <stdio.h>
int 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!”) }
}
Escreva uma funcao que solicita o usuario digitar um numero de 1 à 7. Em seguida a funcao imprime uma mensagem de acordo com o numero digitado:
◦ 1 – “Voce pertence ao curso de Agronomia”
◦ 2 – “Voce pertence ao curso de Veterinária”
◦ 3 – “Voce pertence ao curso de Zootecnia”
◦ 4 – “Voce pertence ao curso de Pedagogia”
◦ 5 – “Voce pertence ao curso de Letras”
◦ 6 – “Voce pertence ao curso de Engenharia de Alimentos”
◦ 7 – “Voce pertence ao curso de CIENCIA DA COMPUTACAO!”
◦ Qualquer outro numero - “Voce nao pertence a curso algum da UAG”
Exercicio
Imagine um procedimento (algoritmo)
pronto para calcular a média de um aluno.
O que fazer para calcular a média de todos os alunos de uma turma?
Estruturas de repeticao
São construcoes que permitem descrever acoes repetitivas
Também conhecido por loop.
O numero de repeticoes pode ser indeterminado?
O número de repeticoes pode ser infinito?
Repeticao com numero de vezes indeterminado
◦ Laço com teste no inicio (while)
◦ Laço com teste no final (do-while)
Repeticao com numero de vezes determinado
◦ Laço (for)
Laços ou comandos de
repeticao
Antes de cada execucao dos comandos de uma repeticao, a condicao é testada
Repeticao com teste no início
while (condicao) { C1;
C2;
...
Cn;
}
while comandos
Segue o fluxo
condicao valida
condicao invalida
Exemplos
Repeticao com teste no início
int i = 0;
while (i < 10) {
printf(“Valor de i: %d ”, i);
i++;
}
int i = 0;
while (i < 10) {
printf(“Valor de i: %d ”, i);
}
Como seria um programa para calcular a média de 50 alunos da uma turma?
Escreva um programa que calcula o produto de dois números lidos sem usar o operador de multiplicação (‘*’).
Construa um algoritmo que fica lendo
indefinidamente numeros positivos. Caso o numero lido seja igual a 0 o algoritmo pára de ler números e imprime a média dos
números pares lidos anteriormente.
Exercicio
Escreva um programa que lê um número e em seguida calcula e imprime seu fatorial.
Exercicio-desafio
Depois de cada execucao dos comandos de uma repeticao, a condicao é testada
Os comandos são executados pelo menos uma vez
Repeticao com teste no final
do { C1;
C2;
...
Cn;
}while (condicao);
comandos
Segue o fluxo
while condicao valida
condicao invalida
do
Como ficaria o algoritmo para calcular a média dos 50 alunos com teste no final usando o comando do-while?
Exercício
O numero de vezes da repeticao é determinado.
Possui uma variavel de controle cujo valor varia de um valor inicial a um valor final, de acordo com um determinado passo
A condicao de parada é o numero de vezes da repeticao.
Repeticao fixa
Inicialização:
◦ Expressão de atribuição. Sempre é executada uma única vez.
Teste de Condição:
◦ 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.
Repeticao fixa
for(inicializacao;condicao;incremento ){
C1;
...
Cn;
}
Repeticao fixa
int i;
for(i= 0;i < 10;i++){
printf(“%d”,i);
}
printf(“%d”,i);
i = 1
i = 1 + 2 i = 9
i = 11 int i;
for(i= 0;i < 10;i=i+2){
printf(“%d”,i);
}
i = 1
printf(“%d”,i);
i = 1 + 1
Como ficaria o algoritmo para calcular a
media dos 50 alunos usando repeticao fixa?
Escreva um algoritmo que lê 50 números inteiros e em seguida mostra a soma de todos os ímpares lidos.
Altere o algoritmo anterior para que ele
considere apenas a soma dos ímpares que estejam entre 100 e 200.
Construa um algoritmo que leia um conjunto de 20 numeros inteiros e mostre qual foi o maior e o menor valor fornecido.
Exercicio
Lacos são equivalentes
Comparacao entre repeticoes
se (numero de vezes é conhecido){
usa-se o for }senao{
se (teste precisa ser feito no inicio){
usa-se while }senao{
usa-se do-while }
}
Foi feita uma pesquisa para determinar o perfil dos alunos que
ingressaram em engenharia na UFPE num determinado semestre. Faça um programa que:
◦ a) Leia um número indeterminado de alunos que prestaram vestibular. Os dados solicitados correspondem ao sexo do aluno (‘m’ para masculino e ‘f’ para feminino), se passou no vestibular e o número de vezes que este aluno prestou vestibular. No caso de conter no lugar do sexo a letra ‘x’, este é o “sinal” para parar de ler os dados.
◦ c) Determine e imprima:
A quantidade de alunos que passaram no vestibular.
A porcentagem de alunos do sexo masculino que passaram no vestibular.
A porcentagem de alunos, independentemente do sexo, que prestou vestibular 3 ou mais vezes no período.
#include <stdio.h>
#include <conio.h>
main( ) {
char sexo, passou;
int nh = 0, nr = 0, nv, ntotal = 0, nrpassou = 0;
do {
printf("\nDigite o sexo do aluno que prestou vestibular: ");
fflush(stdin);
scanf("%c", &sexo);
if (sexo != 'x' && (sexo == 'm' || sexo == 'M' || sexo == 'f' || sexo == 'F')) {
printf("Digite o numero de vezes que o aluno prestou vestibular: ");
scanf("%d", &nv);
printf("Digite se o aluno passou vestibular [s - sim ou n - nao]: ");
fflush(stdin);
scanf("%c", &passou);
if(passou == 's' || passou == 'S') {
if (sexo == 'm' || sexo == 'M') nh++;
if (nv > 3) nr++;
nrpassou++;
ntotal++;
}
else if (passou == 'n' || passou == 'N') ntotal++;
}
}while(sexo != 'x' && sexo != 'X');
if(ntotal > 0) {
printf("\nA porcentagem dos alunos que passaram no vestubular eh: %.2f\n", ((float)nrpassou/ntotal)*100);
printf("A porcentagem dos alunos do sexo masculino que passaram no vestubular eh: %.2f\n", ((float)nh/ntotal)*100);
printf("A porcentagem dos alunos que prestaram vestibuar mais de 3 vezes eh: %.2f\n", ((float)nr/ntotal)*100);
} else
printf("Nenhum dado foi informado!");
38
#include <stdio.h>
#include <conio.h>
main() {
int n, k;
float x, e, num, den;
do {
printf("Digite o valor de x e n (n >= 2)");
scanf("%f %d",&x,&n);
}while (n < 2);
num = 1;
den = 1;
e = num/den;
for (k = 1; k <= n-1; k++) {
num = num * x;
den = den * k;
e = e + num/den;
}
printf("Resultado: %.2f", e);
getch();
}