mc-102 aula 07 comandos repetitivoseduardo/material_mc102/aula07.pdf · roteiro 1...

27
MC-102 — Aula 07 Comandos Repetitivos Eduardo C. Xavier Instituto de Computação – Unicamp 28 de Junho de 2017

Upload: others

Post on 03-Aug-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

MC-102 — Aula 07Comandos Repetitivos

Eduardo C. Xavier

Instituto de Computação – Unicamp

28 de Junho de 2017

Page 2: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Roteiro

1 Variável IndicadoraNúmeros PrimosNúmeros em Ordem

2 Variável ContadoraNúmeros Primos

3 Outros ExemplosMaior NúmeroNúmeros de Fibonacci

4 Exercícios

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 2 / 27

Page 3: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Introdução

Vimos quais são os comandos de repetição em C.Veremos mais alguns exemplos de sua utilização na resolução deproblemas.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 3 / 27

Page 4: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Variável Indicadora

Um outro uso comum de laços é para verificar se um determinadoobjeto, ou conjunto de objetos, satisfaz uma propriedade ou não.Um padrão que pode ser útil na resolução deste tipo de problema é ouso de uma variável indicadora.

I Assumimos que o objeto satisfaz a propriedade (indicadora = Verdade).I Com um laço verificamos se o objeto realmente satisfaz a propriedade.

Se em alguma iteração descobrirmos que o objeto não satisfaz apropriedade, então fazemos (indicadora = Falso).

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 4 / 27

Page 5: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

ProblemaDeterminar se um número n é primo ou não.

Um número é primo se seus únicos divisores são 1 e ele mesmo.Dado um número n, como detectar se este é ou não primo??

I Testar se nenhum dos números entre 2 e (n − 1) divide n.

Lembre-se que o operador % retorna o resto da divisão.Portanto (n%b) é zero se e somente se b divide n.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 5 / 27

Page 6: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

Le i a um número e s a l v e em nd i v = 2i n d i c a d o r a = 1 // assumimos que n é pr imoEnquanto d i v <= (n−1) f a ç a

Se ( n%d i v ) == 0 Entãoi n d i c a d o r a = 0 // descob r imos que n não é pr imo

d i v = d i v +1Se i n d i c a d o r a == 1 então o número é pr imo

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 6 / 27

Page 7: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números PrimosEm C:i n t main ( ){

i n t d iv , n , epr imo ;

p r i n t f ( " D i g i t e um número : " ) ;s c a n f ( "%d" ,&n ) ;

d i v = 2 ;epr imo=1;wh i l e ( d iv<=n−1 ){

i f ( n%d i v == 0)epr imo=0;

d i v++;}i f ( epr imo )

p r i n t f ( "\nÉ pr imo ! ! \ n" ) ;e l s e

p r i n t f ( "\nNão é pr imo ! ! \ n" ) ;}

Note que se descobrirmos que n não é primo, podemos parar o laçoimediatamente.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 7 / 27

Page 8: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

Com término antecipado do laço:i n t main ( ){

i n t d iv , n , epr imo ;

p r i n t f ( " D i g i t e um número : " ) ;s c a n f ( "%d" ,&n ) ;

d i v = 2 ;epr imo=1;wh i l e ( d iv<=n−1 && epr imo ){ // se epr imo==0 podemos s a i r j á do l a ç o

i f ( n%d i v == 0)epr imo=0;

d i v++;}i f ( epr imo )

p r i n t f ( "\nÉ pr imo ! ! \ n" ) ;e l s e

p r i n t f ( "\nNão é pr imo ! ! \ n" ) ;}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 8 / 27

Page 9: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

Com o uso de break:i n t main ( ){

i n t d iv , n , epr imo ;

p r i n t f ( "\n D i g i t e um número : " ) ;s c a n f ( "%d" ,&n ) ;d i v = 2 ;epr imo=1;wh i l e ( d iv<=n−1){

i f ( n%d i v == 0){epr imo=0;break ;

}d i v++;

}i f ( epr imo )

p r i n t f ( "\nÉ pr imo ! ! \ n" ) ;e l s e

p r i n t f ( "\nNão é pr imo ! ! \ n" ) ;}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 9 / 27

Page 10: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números em Ordem

ProblemaFazer um programa que lê n números inteiros do teclado, e no final informase os números lidos estão ou não em ordem crescente.

Usaremos uma variável indicadora na resolução deste problema.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 10 / 27

Page 11: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números em Ordem

Um laço principal será responsável pela leitura dos números.Vamos usar duas variáveis, uma que guarda o número lido na iteraçãoatual, e uma que guarda o número lido na iteração anterior.Os números estarão ordenados se a condição (anterior <= atual) forválida durante a leitura de todos os números.

Le i a um número e s a l v e em nordenado = 1 //Assumimos que os números e s t ão ordenadosLe i a um número e s a l v e em a n t e r i o rRep i t a (n−1) v e z e s

Le i a um número e s a l v e em a t u a lSe a t u a l < a n t e r i o r

ordenado = 0a n t e r i o r = a t u a l

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 11 / 27

Page 12: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números em Ordem

Em C:p r i n t f ( " D i g i t e o v a l o r de n : " ) ;s c a n f ( "%d" , &n ) ;

s c a n f ( "%d" , &a n t e r i o r ) ;i = 1 ; // l e u um número

ordenado = 1 ;wh i l e ( i < n && ordenado ){

s c an f ( "%d" , &a t u a l ) ;i ++;i f ( a t u a l < a n t e r i o r )

ordenado = 0 ;a n t e r i o r = a t u a l ;

}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 12 / 27

Page 13: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números em Ordem#i n c l u d e <s t d i o . h>

i n t main ( ){i n t i , n , a tua l , a n t e r i o r , ordenado ;

p r i n t f ( " D i g i t e o v a l o r de n : " ) ;s c a n f ( "%d" , &n ) ;

s c a n f ( "%d" , &a n t e r i o r ) ;i = 1 ; // l e u um número

ordenado = 1 ;wh i l e ( i < n && ordenado ){

s c an f ( "%d" , &a t u a l ) ;i ++;i f ( a t u a l < a n t e r i o r )

ordenado = 0 ;a n t e r i o r = a t u a l ;

}i f ( ordenado )

p r i n t f ( " Sequênc ia ordenada !\ n" ) ;e l s e

p r i n t f ( " Sequênc ia não ordenada !\ n" ) ;}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 13 / 27

Page 14: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Variável Contadora

Considere ainda o uso de laços para verificar se um determinadoobjeto, ou conjunto de objetos, satisfaz uma propriedade ou não.Um outro padrão que pode ser útil é o uso de uma variávelcontadora.

I Esperamos que um objeto satisfaça x vezes uma sub-propriedade.Usamos um laço e uma variável que conta o número de vezes que oobjeto tem a sub-propriedade satisfeita.

I Ao terminar o laço, se contadora for igual à x então o objeto satisfaz apropriedade.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 14 / 27

Page 15: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

Um número n é primo se nenhum número de 2 até (n − 1) dividi-lo.Podemos usar uma variável que conta quantos números dividem n.Se o número de divisores for 0, então n é primo.

Le i a um número e s a l v e em nd i v = 2d i v i s o r e s = 0 //ninguém d i v i d e n a indaEnquanto d i v <= (n−1) f a ç a

Se ( n%d i v ) == 0d i v i s o r e s = d i v i s o r e s + 1

d i v = d i v + 1

Se d i v i s o r e s == 0 entãoNúmero é pr imo

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 15 / 27

Page 16: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

i n t main ( ){i n t d iv , n , d i v i s o r e s ;

p r i n t f ( " D i g i t e um número : " ) ;s c a n f ( "%d" ,&n ) ;

d i v = 2 ;d i v i s o r e s =0;wh i l e ( d i v <= n−1){

i f ( n%d i v == 0)d i v i s o r e s ++;

d i v++;}i f ( d i v i s o r e s == 0)

p r i n t f ( "\nÉ pr imo ! ! \ n" ) ;e l s e

p r i n t f ( "\nNão é pr imo ! ! \ n" ) ;}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 16 / 27

Page 17: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exemplo: Números Primos

É claro que é melhor terminar o laço assim que descobrirmos algum divisorde n.i n t main ( ){

i n t d iv , n , d i v i s o r e s ;

p r i n t f ( " D i g i t e um numero : " ) ;s c a n f ( "%d" ,&n ) ;

d i v = 2 ;d i v i s o r e s =0;wh i l e ( d i v <= n−1 && d i v i s o r e s == 0 ){

i f ( n%d i v == 0)d i v i s o r e s ++;

d i v++;}i f ( d i v i s o r e s == 0)

p r i n t f ( "\nÉ pr imo ! ! \ n" ) ;e l s e

p r i n t f ( "\nNão é pr imo ! ! \ n" ) ;}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 17 / 27

Page 18: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Outros Exemplos

O uso de variáveis acumuladora, indicadora e contadora são úteisem várias situações.Mas não existem fórmulas para a criação de soluções para problemas.Em outros problemas, o uso destes padrões pode aparecer emconjunto, ou nem mesmo aparecer como parte da solução.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 18 / 27

Page 19: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Maior Número

ProblemaFazer um programa que lê n números do teclado e informa qual foi o maiornúmero lido.

O programa deve ter os seguintes passos:1 Leia um número e salve em n.2 Repita n vezes a leitura de um número determinando o maior.

Como determinar o maior??

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 19 / 27

Page 20: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Maior Número

A idéia e criar uma variável maior que sempre armazena o maiornúmero lido até então.

Le i a um número e s a l v e em nLe i a um número e s a l v e em maiorRep i t a n−1 v e z e s

Le i a um número e s a l v e em auxSe aux > maior então

maior = aux

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 20 / 27

Page 21: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Maior Número

i n t main ( ){i n t cont , n , maior , aux ;

p r i n t f ( "\n D i g i t e a quant i dade de números : " ) ;s c a n f ( "%d" ,&n ) ;

p r i n t f ( "\n D i g i t e um número : " ) ;s c a n f ( "%d" ,&maior ) ;cont = 1 ;wh i l e ( cont<n ){

p r i n t f ( "\n D i g i t e um número : " ) ;s c a n f ( "%d" ,&aux ) ;i f ( aux>maior )

maior = aux ;cont++;

}p r i n t f ( "\nO maior é :%d\n" , maior ) ;

}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 21 / 27

Page 22: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Números de Fibonacci

A série de Fibonacci é: 1, 1, 2, 3, 5, 8, 13, . . .Ou seja o n-ésimo termo é a soma dos dois termos anteriores

F (n) = F (n − 1) + F (n − 2)

onde F (1) = 1 e F (2) = 1.

ProblemaFazer um programa que imprime os primeiros n números da série defibonacci.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 22 / 27

Page 23: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Números de Fibonacci

Le i a um número e s a l v e em ncontado r = 1f_atua l = 1 , f_ant = 0Enquanto contado r <= n fa ça

Imprima f_atua laux = f_atua lf_atua l = f_atua l + f_antf_ant = auxcontado r = contado r +1

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 23 / 27

Page 24: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Números de Fibonacci

i n t main ( ){i n t n , f_ant , f_atua l , f_aux , cont ;

p r i n t f ( "\n D i g i t e um número : " ) ;s c a n f ( "%d" ,&n ) ;

cont = 1 ;f_ant=0; f_atua l =1;wh i l e ( cont<=n ){

p r i n t f ( " %d , " , f_atua l ) ;f_aux = f_atua l ;f_atua l = f_atua l + f_ant ;f_ant = f_aux ;cont++;

}p r i n t f ( "\n" ) ;

}

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 24 / 27

Page 25: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exercício

No exemplo dos números primos não precisamos testar todos osnúmeros entre 2, . . . , (n − 1), para verificar se dividem ou não n.Basta testarmos até n/2. Por que? Qual o maior divisor possível de n?Na verdade basta testarmos os números 2, . . . ,

√n. Por que?

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 25 / 27

Page 26: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exercício

Considere o programa para determinar se uma sequência de n númerosdigitados pelo usuário está ordenada ou não. Refaça o programausando uma variável contadora ao invés de indicadora.

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 26 / 27

Page 27: MC-102 Aula 07 Comandos Repetitivoseduardo/material_mc102/aula07.pdf · Roteiro 1 VariávelIndicadora NúmerosPrimos NúmerosemOrdem 2 VariávelContadora NúmerosPrimos 3 OutrosExemplos

Exercício

Faça um programa em C que calcule o máximo divisor comum de doisnúmeros m, n. Você deve utilizar a seguinte regra do cálculo do mdccom m ≥ n

mdc(m, n) = m se n = 0

mdc(m, n) = mdc(n,m%n) se n > 0

Eduardo C. Xavier (Instituto de Computação – Unicamp)MC-102 — Aula 07 28 de Junho de 2017 27 / 27