MC-102 Aula 09 Comandos Repetitivos



Documentos relacionados
MC-102 Aula 09 Comandos Repetitivos

Programação Estruturada

MC-102 Aula 07 Comandos Repetitivos

MC-102 Aula 08 Comandos Repetitivos

MC-102 Aula 06 Comandos Repetitivos

MC-102 Aula 14. Instituto de Computação Unicamp. 29 de Setembro de 2016

Aula 11 - Repetições Encaixadas

Aula 15: Repetição (Parte 3)

Aula 16: Laços aninhados e desvios

Aula 10: Manipulação do fluxo de laços

PCI- Estrutura de Repetição II. Profa. Mercedes Gonzales Márquez

MC102 Algoritmos e Programação de Computadores

DURAÇÃO DA PROVA: 2 horas

Vejamos agora mais alguns exemplos de problemas envolvendo seqüência de números.

SSC304 Introdução à Programação Para Engenharias. Controle de Fluxo. GE4 Bio

Introdução à Programação. Ciclos 1ª parte

Laços de repetição for, while, do-while

Algoritmos e Programação

Aula 10 Comandos de Repetição For e Do While

Computação eletrônica: Estruturas de repetição

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

Lógica de Programação I

MC-102 Aula 05 Comandos Condicionais

Aula 14: Repetição (Parte 2)

Linguagem C estruturas de repetição

Aula 11: Laços e exercícios

DURAÇÃO DA PROVA: 2 horas

ESTRUTURAS DE CONTROLE - LAÇOS OU MALHAS DE REPETIÇÃO

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

Introdução a programação Comandos de repetição

Aula 05: Condicionais (Parte 2)

MAC 2166 Introdução à Computação para Engenharia

Aula 4 ESTRUTURAS DE REPETIÇÃO (FOR)

Primos... Determinar se um inteiro é primo. 1. Um número é primo se apenas é divisível por ele próprio e por 1.

Apresentar os comandos de controle associados com as estruturas de repetição.

Aula 5 ESTRUTURAS DE REPETIÇÃO (WHILE)

10 Comandos de repetição

MC-102 Aula 10 Vetores

Aula 8: Estruturas de Repetição: O comando while

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA

Quantas variáveis para armazenar as notas e as médias são necessárias para resolver este problema?

MC-102 Aula 12 Matrizes e Vetores Multidimensionais

Introdução à Ciência da Computação

LINGUAGEM C: COMANDOS DE REPETIÇÃO

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA

Aula 01. Programação Condicional Programação repetitiva

Simulado da Prova Parcial 2 (01/08/2013)

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701

Aula 15 Variáveis Indexadas (vetores)

Introdução à Programação. Estruturas de Repetição

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

Laboratório 3 Comandos de repetição while, do-while e for

12 Indicador de Passagem

Estruturas de Repetição

INF 1005 Programação I

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Quarta Aula Prática - 17 de abril de 2013

Estrutura de controle repetitiva: Para (for)

Universidade Federal de Mato Grosso do Sul. Lista de Exercícios 2

Puca Huachi Vaz Penna / José Américo T. Messias

UNISINOS - UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) Curso: Informática

Linguagem C: while e do-while

ESTRUTURAS DE CONTROLE

MC102 Aula 27 Recursão II

Laços. - receba o dinheiro - Pergunte qual refrigerante o cliente deseja - forneça o refrigerante - devolva o troco

Algoritmos e Programação

Repetição com contador. DO varcontrole = valorinicial, valorfinal, [passo] instruções END DO

1ª Lista de Exercícios

5 Comando de Seleção Simples e Composta

INSTRUÇÕES DE REPETIÇÃO

Estruturas de repetição. Objetivos: - Compreender diversos tipos de comandos de repetições disponíveis na linguagem C.

controle de fluxo repetições iterativas

Unidade 3: Estruturas de Controle Parte 2 - Lógica, SWITCH, FOR, WHILE e DO WHILE Prof. Daniel Caetano

notas de aula versão 1 - Jerônimo C. Pellegrini notas de aula versão 1 11 de fevereiro de 2011

Linguagem C. Prof.ª Márcia Jani Cícero

Programação para Games I

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Estruturas de Controle - Repetição. Prof. César Melo

ESTRUTURAS DE REPETIÇÃO - PARTE 1

Linguagem C Estruturas de Repetição

Programação de Computadores II

Aula 5 - Mais C e repetição

Comandos de Repetição -Laços

3. Linguagem de Programação C

MAC 2166 Introdução à Computação para Engenharia

Estruturas de Repetição. for() while() do-while() break; continue;

Programação Estruturada Aula - Estruturas de Repetição

Working 04 : Conceitos Básicos III

INFORMÁTICA APLICADA AULA 05 LINGUAGEM DE PROGRAMAÇÃO C++

Estruturas de Repetição

MAC2166 Introdução à Computação para Engenharia Escola Politécnica Primeira Prova 05 de abril de 2010

Aula 2 Comandos de Decisão

Exercícios Repetição

Aula 7 Oficina de Programação Estruturas de Repetição no C. Profa. Elaine Faria UFU

1) Operadores de auto incremento ++ e auto decremento --

Transcrição:

MC-102 Aula 09 Comandos Repetitivos Instituto de Computação Unicamp 15 de Setembro de 2016

Roteiro 1 Laços Encaixados Números Primos Dados Mega-Sena 2 Exercícios (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 2 / 24

Laços Encaixados: Primos A geração de números primos é uma parte fundamental em sistemas criptográficos como os utilizados em internetbanking. Já sabemos testar se um determinado número é ou não primo. Imagine agora que queremos imprimir os n primeiros números primos. Como resolver este problema? (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 3 / 24

Laços Encaixados: Primos O programa abaixo verifica se o valor na variável candidato corresponde a um primo: divisor = 2; eprimo = 1; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor++; if(eprimo){ printf("%d, ", candidato); (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 4 / 24

Laços Encaixados: Primos Criamos um laço externo e usamos uma variável contadora primosimpressos, que contará o número de primos impressos durante a execução deste laço. while(primosimpressos < n){ //trecho do código anterior que //checa se candidato é ou n~ao é primo if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato++;//testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 5 / 24

Laços Encaixados: Primos Incluímos uma parte inicial de código para leitura de n e inicialização de variáveis. Para finalizar, basta incluir o trecho de código que checa se um número é primo ou não. int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um número inteiro positivo:"); scanf("%d",&n); candidato = 2; primosimpressos = 0; while(primosimpressos < n){ //trecho do código que checa //se candidato é ou n~ao é primo if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato++;//testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 6 / 24

Laços Encaixados: Primos Código completo: int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um número inteiro positivo:"); scanf("%d",&n); candidato = 2; primosimpressos = 0; while(primosimpressos < n){ divisor = 2; eprimo=1; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor++; if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato++;//testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 7 / 24

Laços Encaixados: Primos O que acontece se mudarmos a variável indicadora eprimo para fora do primeiro laço while? Faz diferença? int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um número inteiro positivo:"); scanf("%d",&n); candidato = 2; primosimpressos = 0; eprimo=1; // **************************** Saiu do laço, faz diferença?? while(primosimpressos < n){ divisor = 2; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor++; if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato++;//testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 8 / 24

Laços Encaixados: Primos O que acontece se mudarmos a variável indicadora eprimo para fora do primeiro laço while? Faz diferença? Resposta: Quando testarmos um candidato que não é primo, a variável eprimo será setada para 0 e nunca mais será setada para 1. Logo nenhum outro candidato posterior será identificado como primo. int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um número inteiro positivo:"); scanf("%d",&n); candidato = 2; primosimpressos = 0; eprimo=1; // **************************** Saiu do laço, faz diferença?? while(primosimpressos < n){ divisor = 2; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor++; if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato++;//testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 9 / 24

Laços Encaixados: Primos Note que o número 2 é o único número par que é primo. Podemos alterar o programa para sempre imprimir o número 2: int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um número inteiro positivo:"); scanf("%d",&n); if(n > 0){ printf("%d, ", 2);... (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 10 / 24

Laços Encaixados: Primos Podemos alterar o programa para testar apenas números ímpares como candidatos a primo: candidato = 3; primosimpressos = 1; while(primosimpressos < n){ divisor = 2; eprimo=1; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor++; if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato = candidato + 2;//Testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 11 / 24

Laços Encaixados: Primos Além disso sabendo que candidato é sempre um número ímpar: Não precisamos mais testar os divisores que são pares. Se candidato é sempre um número ímpar, ele não pode ser divisível por um número par, pois seria divisível por 2 também. Portanto basta testar divisores ímpares. (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 12 / 24

Laços Encaixados: Primos int main(){ int divisor, candidato, primosimpressos, n, eprimo; printf("\n Digite um numero inteiro positivo:"); scanf("%d",&n); if(n > 0){ printf("%d, ", 2); candidato = 3; primosimpressos = 1; while(primosimpressos < n){ divisor = 3; //Primeiro divisor ímpar a ser testado eprimo=1; while( (divisor <= candidato/2) && (eprimo) ){ if(candidato % divisor == 0) eprimo = 0; divisor = divisor + 2; //Demais divisores s~ao ímpar if(eprimo){ printf("%d, ", candidato); primosimpressos++; candidato = candidato + 2;//Testa próximo número candidato a primo (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 13 / 24

Laços Encaixados: Dados Problema Imprimir todas as possibilidades de resultados ao se jogar 4 dados de 6 faces. Para cada possibilidade do primeiro dado, devemos imprimir todas as possibilidades dos 3 dados restantes. Para cada possibilidade do primeiro e segundo dado, devemos imprimir todas as possibilidades dos 2 dados restantes... Você consegue pensar em uma solução com laços aninhados? (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 14 / 24

Laços Encaixados: Dados int main(){ int d1, d2, d3, d4; printf("\nd1 D2 D3 D4\n"); for(d1 = 1; d1 <= 6; d1++) for(d2 = 1; d2 <= 6; d2++) for(d3 = 1; d3 <= 6; d3++) for(d4 = 1; d4 <= 6; d4++) printf("%d %d %d %d\n",d1,d2,d3,d4); (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 15 / 24

Laços Encaixados: Mega-Sena Na Mega-Sena, um jogo consiste de 6 números distintos com valores entre 1 e 60. Problema Imprimir todos os jogos possíveis da Mega-Sena. (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 16 / 24

Laços Encaixados: Mega-Sena Partimos da mesma idéia dos dados: gerar todos os possíveis valores para cada um dos 6 números do jogo. int main(){ int d1, d2, d3, d4, d5, d6; for(d1 = 1; d1 <= 60; d1++) for(d2 = 1; d2 <= 60; d2++) for(d3 = 1; d3 <= 60; d3++) for(d4 = 1; d4 <= 60; d4++) for(d5 = 1; d5 <= 60; d5++) for(d6 = 1; d6<= 60; d6++) printf("%d, %d, %d, %d, %d, %d\n",d1,d2,d3,d4,d5,d6); Qual a saída deste programa? Ele está correto? (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 17 / 24

Laços Encaixados: Mega-Sena int main(){ int d1, d2, d3, d4, d5, d6; for(d1 = 1; d1 <= 60; d1++) for(d2 = 1; d2 <= 60; d2++) for(d3 = 1; d3 <= 60; d3++) for(d4 = 1; d4 <= 60; d4++) for(d5 = 1; d5 <= 60; d5++) for(d6 = 1; d6<= 60; d6++) printf("%d, %d, %d, %d, %d, %d\n",d1,d2,d3,d4,d5,d6); As primeiras linhas impressas por este programa serão: 1, 1, 1, 1, 1, 1 1, 1, 1, 1, 1, 2 1, 1, 1, 1, 1, 3 1, 1, 1, 1, 1, 4 1, 1, 1, 1, 1, 5 1, 1, 1, 1, 1, 6 1, 1, 1, 1, 1, 7 1, 1, 1, 1, 1, 8 1, 1, 1, 1, 1, 9 (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 18 / 24

Laços Encaixados: Mega-Sena O programa anterior repete números, portanto devemos remover repetições. int main(){ int d1, d2, d3, d4, d5, d6; for(d1 = 1; d1 <= 60; d1++) for(d2 = 1; d2 <= 60; d2++) for(d3 = 1; d3 <= 60; d3++) for(d4 = 1; d4 <= 60; d4++) for(d5 = 1; d5 <= 60; d5++) for(d6 = 1; d6<= 60; d6++) if( (d1!=d2) && (d1!=d3) &&...) printf("%d, %d, %d, %d, %d, %d\n",d1,d2,d3,d4,d5,d6 Após incluir todos os testes para garantir que os números são distintos, temos a solução? (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 19 / 24

Laços Encaixados: Mega-Sena Não temos uma solução válida, pois o programa irá imprimir jogos como: 12, 34, 8, 19, 4, 45 34, 12, 8, 19, 4, 45 34, 12, 19, 8, 4, 45 Todos estes jogos são um único jogo: 4, 8, 12, 19, 34, 45. Podemos assumir que um jogo é sempre apresentado com os números em ordem crescente. Dado que fixamos o valor de d1, d2 necessariamente é maior que d1. Após fixar d1 e d2, d3 deve ser maior que d2 etc. (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 20 / 24

Laços Encaixados: Mega-Sena Solução correta: int main(){ int d1, d2, d3, d4, d5, d6; for(d1 = 1; d1 <= 60; d1++) for(d2 = d1 + 1; d2 <= 60; d2++) for(d3 = d2 +1; d3 <= 60; d3++) for(d4 = d3 +1; d4 <= 60; d4++) for(d5 = d4 +1; d5 <= 60; d5++) for(d6 = d5 +1; d6<= 60; d6++) printf("%d, %d, %d, %d, %d, %d\n",d1,d2,d3,d4,d5,d6); (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 21 / 24

Exercício Faça um programa que leia um número n e imprima n linhas na tela com o seguinte formato (exemplo se n = 6): 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 22 / 24

Exercício Faça um programa que leia um número n e imprima n linhas na tela com o seguinte formato (exemplo se n = 6): + * * * * * * + * * * * * * + * * * * * * + * * * * * * + * * * * * * + (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 23 / 24

Exercício Um jogador da Mega-Sena é supersticioso, e só faz jogos em que o primeiro número do jogo é par, o segundo é ímpar, o terceiro é par, o quarto é ímpar, o quinto é par e o sexto é ímpar. Faça um programa que imprima todas as possibilidades de jogos que este jogador supersticioso pode jogar. (Instituto de Computação Unicamp) MC-102 Aula 09 15 de Setembro de 2016 24 / 24