380 likes | 459 Views
Aula 6 - Estruturas de Controle. Ameliara Freire ameliara.fjn@gmail.com. Tipos primitivos. Variaveis, constantes, leitura e escrita ainda não são suficientes para formar uma linguagem completa para descricao de programas.
E N D
Aula 6 - Estruturas de Controle Ameliara Freire ameliara.fjn@gmail.com
Tipos primitivos • 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
Estrutura sequencial • 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: //declaracao de variaveis //corpo do algoritmo acao 1; acao 2; ...
Estruturas de selecao/decisao • 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
if-else • Forma geral 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”); }
V F C1; C2; ... Cn; D1; D2; ... Dn; Fluxo do if-else condicao if (condicao) { C1; C2; ... Cn; }else { D1; D2; ... Dm; }
Exercicio • 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? #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){ if(condicao 2){ if(condicao 3){ ... } } } 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){ ... }
Importância da indentação • 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). if(condicao 1){ if(condicao 2){ if(condicao 3){ ... } } }
if (condicao1 && condicao2 && condicao3 && condicao4){ W; } Simplificando selecoes • Como simplificar a seguinte selecao aninhada? if (condicao1) { if (condicao2) { if (condicao3) { if (condicao4) { W; } } } }
Simplificando selecoes if (X == V1) { C1; } if (X == V2) { C2; } if (X == V3) { C3; } if (X == V4) { C4; } if (X == V1) { C1; }else if (X == V2) { C2; }else if (X == V3) { C3; }else if (X == V4) { C4; } Como diminuir o numero de testes? Qual a sequencia de comparacoes para atingir C4?
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=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; }
Exercício • 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.
Switch-case • 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 (<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
Switch-case (exemplo) • 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 #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!”) } }
Exercicio • 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”
Estruturas de repeticao • 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?
Laços ou comandos 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)
Repeticao com teste no início • Antes de cada execucao dos comandos de uma repeticao, a condicao é testada condicao valida while (condicao) { C1; C2; ... Cn; } comandos while condicao invalida Segue o fluxo
Repeticao com teste no início • Exemplos 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); }
Exercicio • 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-desafio • Escreva um programa que lê um número e em seguida calcula e imprime seu fatorial.
Repeticao com teste no final • Depois de cada execucao dos comandos de uma repeticao, a condicao é testada • Os comandos são executados pelo menos uma vez do{ C1; C2; ... Cn; }while (condicao); do comandos while condicao valida condicao invalida Segue o fluxo
Exercício • Como ficaria o algoritmo para calcular a média dos 50 alunos com teste no final usando o comando do-while?
Repeticao fixa • 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. for(inicializacao;condicao;incremento ){ C1; ... Cn; }
Repeticao fixa i = 1 i = 1 + 1 int i; for(i= 0;i < 10;i++){ printf(“%d”,i); } printf(“%d”,i); i = 9 i = 1 i = 1 + 2 int i; for(i= 0;i < 10;i=i+2){ printf(“%d”,i); } printf(“%d”,i); i = 11
Exercicio • 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.
Comparacao entre repeticoes • Lacos são equivalentes 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; intnh = 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++; } elseif (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!"); getche(); }
#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(); }