• Nenhum resultado encontrado

Programação Estruturada

N/A
N/A
Protected

Academic year: 2021

Share "Programação Estruturada"

Copied!
133
0
0

Texto

(1)

Programa¸

ao Estruturada

Estruturas de repeti¸c˜ao

Professores Em´ılio Francesquini e Carla Negri Lintzmayer 2018.Q3

Centro de Matem´atica, Computa¸c˜ao e Cogni¸c˜ao Universidade Federal do ABC

(2)
(3)

Comandos de repeti¸c˜ao

• At´e agora vimos como escrever programas capazes de executar comandos de forma linear, e, se necess´ario, tomar decis˜oes com rela¸c˜ao a executar ou n˜ao um bloco de comandos. • Entretanto, eventualmente ´e necess´ario executar um bloco de

comandos v´arias vezes para se obter o resultado esperado.

(4)

Repeti¸c˜ao

Vamos imprimir todos os n´umeros de 1 at´e 4.

1 printf("1\n"); 2 printf("2\n"); 3 printf("3\n"); 4 printf("4\n");

D´a para fazer com o que j´a vimos.

(5)

Repeti¸c˜ao

Vamos imprimir todos os n´umeros de 1 at´e 100.

1 printf("1\n"); 2 printf("2\n"); 3 printf("3\n"); 4 printf("4\n"); 5 printf("5\n"); 6 ... 7 printf("100\n");

Ainda d´a para fazer com o que j´a vimos, mas ´e mais chato.

(6)

Repeti¸c˜ao

Vamos imprimir todos os n´umeros de 1 at´e n, onde n ´e informado pelo usu´ario.

1 scanf("%d", &n); 2 if (n >= 1) 3 printf("1\n"); 4 if (n >= 2) 5 printf("2\n"); 6 if (n >= 3) 7 printf("3\n"); 8 ... 9 if (n >= 100) 10 printf("100\n");

Agora ficou imposs´ıvel!

(7)
(8)

Comando while

Estrutura:

1 while (condi¸c~ao)

2 comando;

ou

1 while (condi¸c~ao) {

2 comandos;

3 }

Enquanto a condi¸c˜ao for verdadeira (6= 0), o(s) comando(s) s˜ao executados.

(9)

Comando while

Passo 1 Testa a condi¸c˜ao. Se ela for verdadeira, vai para o Passo 2. Se for falsa, vai para o Passo 3.

Passo 2 Executa os comandos. Vai para o Passo 1. Passo 3 Segue o programa.

Comandos Testa condicao

Se for verdadeira Se for falsa

(10)

Comando while

Vamos imprimir todos os n´umeros de 1 at´e 100.

1 #include <stdio.h> 2 3 int main() { 4 int i; 5 6 i = 1; 7 while (i <= 100) { 8 printf("%d\n", i); 9 i++; 10 } 11 12 return 0; 13 } 7

(11)

Comando while

Vamos imprimir todos os n´umeros de 1 at´e n.

1 #include <stdio.h> 2 3 int main() { 4 int i, n; 5 6 scanf("%d", &n); 7 i = 1; 8 while (i <= n) { 9 printf("%d\n", i); 10 i++; 11 } 12 13 return 0; 14 } 8

(12)

Comando while

• O que acontece se a condi¸c˜ao for falsa na primeira vez?

1 while (a != a)

2 a = a + 1;

• O que acontece se a condi¸c˜ao for sempre verdadeira?

1 while (a == a)

2 a = a + 1;

(13)
(14)

Comando do-while

Estrutura:

1 do

2 comando;

3 while (condi¸c~ao);

ou

1 do {

2 comandos;

3 } while (condi¸c~ao);

Diferen¸ca do while: sempre executa o(s) comando(s) pelo menos uma vez.

(15)

Comando do-while

Passo 1 Executa os comandos. Vai para o Passo 2. Passo 2 Testa a condi¸c˜ao. Se ela for verdadeira, vai para

Passo 1. Se for falsa, vai para o Passo 3. Passo 3 Segue o programa.

Testa Condi¸c˜ao Comandos

Condi¸c˜ao Falsa Condi¸c˜ao Verdadeira

(16)

Comando do-while

Vamos imprimir todos os n´umeros de 1 at´e 100.

1 #include <stdio.h> 2 3 int main() { 4 int i; 5 6 i = 1; 7 do { 8 printf("%d\n", i); 9 i = i + 1; 10 } while (i <= 100); 11 12 return 0; 13 } 12

(17)

Comando do-while

Vamos imprimir todos os n´umeros de 1 at´e n.

1 #include <stdio.h> 2 3 int main() { 4 int i, n; 5 6 scanf("%d", &n); 7 i = 1; 8 do { 9 printf("%d\n", i); 10 i = i + 1; 11 } while (i <= n); 12 13 return 0; 14 }

E se o usu´ario digitar 0?

(18)
(19)

O comando for

Estrutura:

1 for (in´ıcio; condi¸c~ao; passo)

2 comando;

ou

1 for (in´ıcio; condi¸c~ao; passo) {

2 comandos;

3 }

• In´ıcio: uma ou mais atribui¸c˜oes, separadas por “,”

• Condi¸c˜ao: os comandos s˜ao executados enquanto a condi¸c˜ao for verdadeira

• Passo: um ou mais comandos separados por “,”. Os comandos do passo sempre s˜ao executados ap´os os comandos do bloco 14

(20)

O comando for

Passo 1 Executa os comandos em “in´ıcio”. Vai para Passo 2.

Passo 2 Testa a condi¸c˜ao. Se ela for verdadeira, vai para Passo 3. Se for falsa, vai para Passo 5.

Passo 3 Executa os comandos do bloco. Vai para Passo 4. Passo 4 Executa os comandos em

“passo”. Vai para Passo 2.

Passo 5 Segue o programa.

Testa Condi¸c˜ao Comandos Condi¸c˜ao Falsa Condi¸c˜ao Verdadeira Comandos de in´ıcio Comandos do passo 15

(21)

O comando for

O for ´e equivalente `a seguinte constru¸c˜ao utilizando o while:

1 in´ıcio;

2 while (condi¸c~ao) {

3 comandos;

4 passo;

5 }

(22)

O comando for

Vamos imprimir todos os n´umeros de 1 at´e 100.

1 #include <stdio.h> 2 3 int main() { 4 int i; 5 6 for (i = 1; i <= 100; i++) { 7 printf("%d\n", i); 8 } 9 10 return 0; 11 } 17

(23)

O comando for

Vamos imprimir todos os n´umeros de 1 at´e n.

1 #include <stdio.h> 2 3 int main() { 4 int i, n; 5 6 scanf("%d", &n); 7 for (i = 1; i <= n; i++) { 8 printf("%d\n", i); 9 } 10 11 return 0; 12 } 18

(24)

I’ll not throw paper airplanes in class

(25)
(26)

La¸cos e o comando break

O comando break faz com que a execu¸c˜ao de um la¸co seja terminada, passando a execu¸c˜ao para o pr´oximo comando depois do final do la¸co.

1 int i; 2 3 for (i = 1; i <= 10; i++) { 4 if (i >= 5) 5 break; 6 printf("%d\n",i); 7 } 8

9 printf("Terminou o la¸co\n");

O que ser´a impresso?

(27)

La¸cos e o comando break

Assim como a “condi¸c˜ao” em la¸cos, o comando break ´e utilizado em situa¸c˜oes de parada de um la¸co.

Ex.: Imprimindo os n´umeros de 1 at´e 10.

1 int i; 2 for (i = 1; ; i++) { 3 if (i > 10) 4 break; 5 printf("%d\n", i); 6 } ´e equivalente a: 1 int i; 2 for (i = 1; i <= 10; i++) { 3 printf("%d\n", i); 4 } 21

(28)

La¸cos e o comando continue

O comando continue faz com que a execu¸c˜ao de um la¸co seja alterada para o final do la¸co.

1 int i; 2 for (i = 1; i <= 10; i++) { 3 if (i == 5) 4 continue; 5 printf("%d\n", i); 6 }

7 printf("Terminou o la¸co\n");

O que ser´a impresso?

(29)

La¸cos e o comando continue

O continue ´e utilizado em situa¸c˜oes onde comandos dentro do la¸co s´o devem ser executados caso alguma condi¸c˜ao seja satisfeita. Ex.: Imprimindo ´area de um c´ırculo, mas apenas se o raio for par e estiver entre 1 e 10.

1 int r;

2 double area;

3 for (r = 1; r <= 10; r++) {

4 if ((r % 2) != 0) /* se n´umero for ´ımpar pulamos */

5 continue;

6 area = 3.1415 * r * r; 7 printf("%lf\n", area);

8 }

Mas note que poder´ıamos escrever algo mais simples:

1 int r; 2 double area; 3 for (r = 2; r <= 10 ; r = r+2) { 4 area = 3.1415 * r * r; 5 printf("%lf\n", area); 6 } 23

(30)
(31)

La¸cos encaixados

• Para resolver alguns problemas, ´e necess´ario implementar um la¸co dentro de outro la¸co.

• Estes s˜ao conhecidos como la¸cos encaixados (ou aninhados).

1 int main() { 2 int i, j; 3 4 for (i = 1; i <= 4; i++) 5 for (j = 1; j <= 3; j++) 6 printf("%d %d\n", i, j); 7 8 return 0; 9 }

• O que ser´a impresso por este programa?

(32)

La¸cos encaixados

1 for (i = 1; i <= 4; i++) 2 for (j = 1; j <= 3; j++) 3 printf("%d %d\n", i, j);

• Fixado um valor para i no primeiro la¸co for, come¸ca-se o segundo la¸co for, que varia o valor de j entre 1 e 3.

• No final deste segundo la¸co for voltamos para o primeiro la¸co, onde a vari´avel i assumir´a seu pr´oximo valor.

• Fixado este valor de i come¸ca-se novamente o segundo la¸co for.

(33)

La¸cos encaixados 1 for (i = 1; i <= 4; i++) 2 for (j = 1; j <= 3; j++) 3 printf("%d %d\n", i, j); Ser´a impresso: 1 1 1 2 1 2 3 1 3 4 2 1 5 2 2 6 ... 7 4 1 8 4 2 9 4 3 26

(34)
(35)

Vari´avel acumuladora

• Vamos ver alguns exemplos de problemas que s˜ao resolvidos utilizando la¸cos.

• H´a alguns padr˜oes de solu¸c˜ao que s˜ao bem conhecidos e s˜ao ´

uteis em diversas situa¸c˜oes.

• O primeiro padr˜ao deles ´e o uso de uma “vari´avel acumuladora”.

(36)

Soma de n´umeros

Problema

Ler um inteiro positivo n, em seguida ler n n´umeros do teclado e apresentar a soma destes.

(37)

Soma de n´umeros

• Como n n˜ao ´e definido a priori, n˜ao podemos criar n vari´aveis e depois somar seus valores.

• A ideia ´e criar uma vari´avel acumuladora que a cada itera¸c˜ao de um la¸co guarda a soma de todos os n´umeros lidos at´e ent˜ao.

• Propriedade da acumuladora:

• No in´ıcio da i-´esima itera¸c˜ao ela tem a soma dos (i − 1) n´umeros lidos anteriormente.

• Durante a i-´esima itera¸c˜ao ela soma a seu valor o novo n´umero lido.

1 acumuladora = 0 /* no in´ıcio ainda n~ao somamos nada */

2 repita n vezes:

3 leia um n´umero aux

4 acumuladora = acumuladora + aux

(38)

Soma de n´umeros

• Podemos usar qualquer estrutura de la¸co de C para esta solu¸c˜ao.

• Abaixo temos uma solu¸c˜ao utilizando o comando for.

1 printf("Digite o valor de n: "); 2 scanf("%d", &n);

3

4 soma = 0;

5 for (i = 1; i <= n; i++) {

6 printf("Digite um novo n´umero: "); 7 scanf("%d", &aux);

8 soma = soma + aux;

9 }

(39)

Soma de n´umeros: c´odigo completo

1 #include <stdio.h>

2

3 int main() {

4 int i, n, soma, aux;

5

6 printf("Digite o valor de n: ");

7 scanf("%d", &n);

8

9 soma = 0;

10 for (i = 1; i <= n; i++) {

11 printf("Digite um numero: ");

12 scanf("%d", &aux);

13 soma = soma + aux;

14 }

15

16 printf("Soma: %d\n", soma);

17

18 return 0;

19 }

(40)

Calculando a divis˜ao

Problema

Calcular a divis˜ao inteira de dois numeros usando apenas soma e subtra¸c˜ao.

(41)

Algoritmo solu¸c˜ao

1 leia dividendo e divisor

2 contador = 0

3 enquanto dividendo >= divisor

4 dividendo = dividendo - divisor

5 contador = contador + 1

6 exiba contador

7 /* note que dividendo cont´em o resto da divis~ao */

Por que?

Contador equivale `a divis˜ao inteira de dividendo por divisor.

(42)

Divis˜ao inteira

1 int main() {

2 int dividendo, divisor, contador, aux;

3 printf("Entre com o dividendo: ");

4 scanf("%d", &dividendo);

5 printf("Entre com o divisor: ");

6 scanf("%d", &divisor);

7

8 contador = 0;

9 aux = dividendo;

10 while (aux >= divisor) {

11 aux = aux - divisor;

12 contador++;

13 }

14

15 printf("A divisao de %d por %d eh %d e tem resto igual a %d.\n", dividendo, divisor, contador, aux);

,→ 16

17 return 0;

18 }

(43)

Vari´avel indicadora

• Um outro uso comum de la¸cos ´e para verificar se um determinado objeto, ou conjunto de objetos, satisfaz uma propriedade ou n˜ao.

• Um padr˜ao que pode ser ´util na resolu¸c˜ao deste tipo de problema ´e o uso de uma vari´avel indicadora.

• Assumimos que o objeto satisfaz a propriedade (indicadora = Verdade).

• Com um la¸co verificamos se o objeto realmente satisfaz a propriedade.

• Se em alguma itera¸c˜ao descobrirmos que o objeto n˜ao satisfaz a propriedade, ent˜ao fazemos indicadora = Falso.

(44)

N´umeros primos

A gera¸c˜ao de n´umeros primos ´e uma parte fundamental em sistemas criptogr´aficos como os utilizados em internetbanking. Problema

Determinar se um n´umero n ´e primo ou n˜ao.

(45)

N´umeros primos

• Um n´umero ´e primo se seus ´unicos divisores s˜ao 1 e ele mesmo.

• Dado um n´umero n, como detectar se este ´e ou n˜ao primo??

• Podemos testar se nenhum dos n´umeros entre 2 e (n − 1) divide n.

• Lembre-se que o operador % retorna o resto da divis˜ao. • Portanto (n%b) ´e zero se e somente se b divide n.

(46)

N´umeros primos

1 leia um n´umero e salve em n

2 div = 2

3 indicadora = 1 /* assumimos que n ´e primo */

4 enquanto div <= (n-1) fa¸ca

5 se (n % div) == 0 ent~ao

6 indicadora = 0 /* descobrimos que n n~ao ´e primo */

7 div = div + 1

8 se indicadora == 1 ent~ao o n´umero ´e primo

(47)

N´umeros primos

1 int main() {

2 int div, n, eh_primo;

3 printf("Digite um n´umero:");

4 scanf("%d", &n); 5 6 div = 2; 7 eh_primo = 1; 8 while (div <= n-1) { 9 if (n % div == 0) 10 eh_primo = 0; 11 div++; 12 } 13 14 if (eh_primo) 15 printf("´E primo!\n"); 16 else 17 printf("N~ao ´e primo!\n"); 18 19 return 0; 20 } 39

(48)

N´umeros primos

Note que assim que descobrirmos que n n˜ao ´e primo, podemos parar o la¸co.

1 intmain() {

2 intdiv, n, eh_primo;

3

4 printf("Digite um n´umero:"); 5 scanf("%d",&n);

6

7 div= 2;

8 eh_primo= 1;

9 while(div<=n-1 &&eh_primo) {/* se eh_primo == 0 podemos sair do la¸co */

10 if(n%div== 0) 11 eh_primo= 0; 12 div++; 13 } 14 15 if(eh_primo) 16 printf("´E primo!\n"); 17 else 18 printf("N~ao ´e primo!\n"); 19 20 return0; 21 } 40

(49)

N´umeros primos

Podemos parar o la¸co com o uso de break.

1 intmain() {

2 intdiv, n, eh_primo;

3

4 printf("\nDigite um n´umero:"); 5 scanf("%d",&n); 6 7 div= 2; 8 eh_primo= 1; 9 while(div<=n-1) { 10 if(n%div== 0) { 11 eh_primo= 0; 12 break; 13 } 14 div++; 15 } 16 17 if(eh_primo) 18 printf("´E primo!\n"); 19 else 20 printf("N~ao ´e primo!\n"); 21 22 return0; 23 } 41

(50)

Vari´avel contadora

• Considere ainda o uso de la¸cos para verificar se um determinado objeto, ou conjunto de objetos, satisfaz uma propriedade ou n˜ao.

• Um outro padr˜ao que pode ser ´util ´e o uso de uma vari´avel contadora.

• Esperamos que um objeto satisfa¸ca x vezes uma sub-propriedade.

• Usamos um la¸co e uma vari´avel que conta o n´umero de vezes que o objeto tem a sub-propriedade satisfeita.

• Ao terminar o la¸co, se contadora for igual `a x ent˜ao o objeto satisfaz a propriedade.

(51)

Vari´avel contadora: primeiros primos

Problema

Imprimir os n primeiros n´umeros primos.

(52)

Vari´avel contadora: primeiros primos

O programa abaixo verifica se o valor na vari´avel candidato corresponde a um primo:

1 divisor = 2;

2 eh_primo = 1;

3 while (divisor <= candidato/2 && eh_primo) {

4 if (candidato % divisor == 0) 5 eh_primo = 0; 6 divisor++; 7 } 8 9 if (eh_primo) { 10 printf("%d, ", candidato); 11 } 44

(53)

Vari´avel contadora: primeiros primos

Criamos um la¸co externo e usamos uma vari´avel contadora primosImpressos, que contar´a o n´umero de primos impressos durante a execu¸c˜ao deste la¸co.

1 while (primosImpressos < n) {

2 /* trecho do c´odigo anterior que checa se candidato ´e

ou n~ao ´e primo */ ,→ 3 4 if (eh_primo) { 5 printf("%d, ", candidato); 6 primosImpressos++; 7 } 8

9 candidato++; /* testa pr´oximo candidato a primo */

10 }

(54)

Vari´avel contadora: primeiros primos

• Inclu´ımos uma parte inicial de c´odigo para leitura de n e inicializa¸c˜ao de vari´aveis.

• Para finalizar, basta incluir o trecho de c´odigo que checa se um n´umero ´e primo ou n˜ao.

(55)

Vari´avel contadora: primeiros primos

1 intmain() {

2 intdivisor, candidato, primosImpressos, n, eh_primo;

3

4 printf("Digite um n´umero inteiro positivo: "); 5 scanf("%d",&n); 6 7 candidato= 2; 8 primosImpressos= 0; 9 while(primosImpressos<n) { 10 divisor= 2; 11 eh_primo= 1;

12 while(divisor<=candidato/2 &&eh_primo) {

13 if(candidato%divisor== 0) 14 eh_primo= 0; 15 divisor++; 16 } 17 18 if(eh_primo) { 19 printf("%d, ", candidato); 20 primosImpressos++; 21 } 22

23 candidato++;/* testa pr´oximo n´umero candidato a primo */

24 }

25

26 return0;

(56)

Vari´avel contadora: primeiros primos

O que acontece se mudarmos a vari´avel indicadora eh primo para fora do primeiro la¸co while? Faz diferen¸ca?

1 intmain() {

2 intdivisor, candidato, primosImpressos, n, eh_primo;

3 printf("Digite um n´umero inteiro positivo: "); 4 scanf("%d",&n);

5 candidato= 2;

6 primosImpressos= 0;

7 eh_primo= 1; /* fora do la¸co, faz diferen¸ca? */

8 while(primosImpressos<n) {

9 divisor= 2;

10 while(divisor<=candidato/2 &&eh_primo) {

11 if(candidato%divisor== 0) 12 eh_primo= 0; 13 divisor++; 14 } 15 if(eh_primo) { 16 printf("%d, ", candidato); 17 primosImpressos++; 18 }

19 candidato++;/* testa pr´oximo n´umero candidato a primo */

20 }

21 return0;

22 }

(57)

Vari´avel contadora: primeiros primos

• O que acontece se mudarmos a vari´avel indicadora eh primo para fora do primeiro la¸co while? Faz diferen¸ca?

• Resposta: Quando testarmos um candidato que n˜ao ´e primo, a vari´avel eh primo ser´a setada para 0 e nunca mais ser´a setada para 1.

• Logo, nenhum outro candidato posterior ser´a identificado como primo.

(58)

Vari´avel contadora: primeiros primos

• Note que o n´umero 2 ´e o ´unico n´umero par que ´e primo. • Podemos alterar o programa para sempre imprimir o n´umero

2:

1 int main() {

2 int divisor, candidato, primosImpressos, n, eh_primo;

3

4 printf("\n Digite um n´umero inteiro positivo:"); 5 scanf("%d",&n); 6 7 if (n > 0) { 8 printf("%d, ", 2); 9 ... 50

(59)

Vari´avel contadora: primeiros primos

Podemos alterar o programa para testar apenas n´umeros ´ımpares como candidatos a primo:

1 ... 2 candidato= 3; 3 primosImpressos= 1; 4 while(primosImpressos<n) { 5 divisor= 2; 6 eh_primo= 1;

7 while(divisor<=candidato/2 &&eh_primo) {

8 if(candidato%divisor== 0) 9 eh_primo= 0; 10 divisor++; 11 } 12 13 if(eh_primo) { 14 printf("%d, ", candidato); 15 primosImpressos++; 16 } 17

18 candidato+= 2;/* testa pr´oximo n´umero (´ımpar) candidato a primo */

19 }

20

21 return0;

22 }

(60)

Vari´avel contadora: primeiros primos

Al´em disso, sabendo que candidato ´e sempre um n´umero ´ımpar: • N˜ao precisamos mais testar os divisores que s˜ao pares. • Se candidato ´e sempre um n´umero ´ımpar, ele n˜ao pode ser

divis´ıvel por um n´umero par, pois se n˜ao seria divis´ıvel por 2 tamb´em.

• Portanto basta testar divisores ´ımpares.

(61)

Vari´avel contadora: primeiros primos

1 intmain() {

2 intdivisor, candidato, primosImpressos, n, eh_primo;

3

4 printf("\nDigite um numero inteiro positivo:"); 5 scanf("%d",&n); 6 7 if(n> 0) { 8 printf("%d, ",2); 9 candidato= 3; 10 primosImpressos= 1; 11 while(primosImpressos<n) {

12 divisor= 3;/* primeiro divisor ´ımpar a ser testado */

13 eh_primo= 1;

14 while(divisor<=candidato/2 &&eh_primo) {

15 if(candidato%divisor== 0)

16 eh_primo= 0;

17 divisor=divisor+ 2;/* demais poss´ıveis divisores s~ao ´ımpares */

18 } 19 20 if(eh_primo) { 21 printf("%d, ", candidato); 22 primosImpressos++; 23 }

24 candidato=candidato+ 2;/* testa pr´oximo n´umero candidato a primo */

25 }

26 }

27 return0;

(62)
(63)

Outros exemplos

• O uso de vari´aveis acumuladoras, indicadoras e contadoras s˜ao ´uteis em v´arias situa¸c˜oes.

• Mas n˜ao existem f´ormulas para a cria¸c˜ao de solu¸c˜oes para problemas.

• Em outros problemas, o uso destes padr˜oes pode aparecer em conjunto, ou nem mesmo aparecer como parte da solu¸c˜ao.

(64)

Maior n´umero

Problema

Fazer um programa que lˆe n n´umeros do teclado e informa qual foi o maior n´umero lido.

(65)

Maior n´umero

• O programa deve ter os seguintes passos:

1. Leia um n´umero e salve em n.

2. Repita n vezes a leitura de um n´umero determinando o maior.

• Mas como determinar o maior?

(66)

Maior n´umero

• A ideia ´e criar uma vari´avel maior que sempre armazena o maior n´umero lido at´e ent˜ao.

1 leia um n´umero e salve em n

2 leia um n´umero e salve em maior

3 repita n-1 vezes:

4 leia um n´umero e salve em aux

5 se aux > maior ent~ao

6 maior = aux

(67)

Maior n´umero

1 int main() {

2 int cont, n, maior, aux;

3

4 printf("Digite a quantidade de n´umeros: ");

5 scanf("%d", &n);

6

7 printf("Digite um n´umero: ");

8 scanf("%d", &maior); /* com um n´umero lido, ele ´e o maior */

9 cont = 1; /* j´a lemos um n´umero */

10 while (cont < n) {

11 printf("Digite um n´umero: ");

12 scanf("%d", &aux);

13 if (aux > maior)

14 maior = aux;

15 cont++;

16 }

17 printf("O maior numero lido ´e: %d\n", maior);

18

19 return 0;

(68)

Equa¸c˜oes lineares inteiras

Um uso comum de la¸cos encaixados ocorre quando para cada um dos valores de uma determinada vari´avel, precisamos gerar/checar algo sobre os valores de outras vari´aveis.

Problema

Determinar todas as solu¸c˜oes inteiras de um sistema linear como x1+ x2= C

com x1 ≥ 0, x2≥ 0, C ≥ 0 e todos valores inteiros.

(69)

Equa¸c˜oes lineares inteiras

Uma solu¸c˜ao poss´ıvel: para cada um dos valores de x1, com 0 ≤ x1 ≤ C , teste todos os valores de x2 poss´ıveis e verifique quais deles s˜ao solu¸c˜oes.

1 para cada x1 entre 0 e C fa¸ca:

2 para cada x2 entre 0 e C fa¸ca:

3 se x1 + x2 = C ent~ao imprima solu¸c~ao

(70)

Equa¸c˜oes lineares inteiras

1 int main() {

2 int C, x1, x2;

3

4 printf("Digite o valor de C: "); 5 scanf("%d", &C); 6 7 for (x1 = 0; x1 <= C; x1++) { 8 for (x2 = 0; x2 <= C; x2++) { 9 if (x1 + x2 == C) 10 printf("%d + %d = %d\n", x1, x2, C); 11 } 12 } 13 14 return 0; 15 } 61

(71)

Equa¸c˜oes lineares inteiras

Note que, fixado x1, n˜ao precisamos testar todos os valores de x2, pois este ´e determinado como x2= C − x1.

1 int main() {

2 int C, x1, x2;

3

4 printf("Digite o valor de C: "); 5 scanf("%d", &C); 6 7 for (x1 = 0; x1 <= C; x1++) { 8 x2 = C - x1; 9 printf("%d + %d = %d\n", x1, x2, C); 10 } 11 12 return 0; 13 }

Mas em um caso geral com n vari´aveis, x1+ x2+ . . . + xn= C

ser´a preciso fixar (n − 1) vari´aveis para s´o ent˜ao determinar o valor de xn.

(72)

Equa¸c˜oes lineares inteiras

Problema

Quais s˜ao as solu¸c˜oes de x1+ x2+ x3 = C com x1 ≥ 0, x2 ≥ 0,

x3 ≥ 0, C ≥ 0 e todas inteiras?

(73)

Equa¸c˜oes lineares inteiras

Uma solu¸c˜ao: para cada um dos valores de x1, com 0 ≤ x1 ≤ C , teste todos os valores de x2 e x3 e verifique quais deles s˜ao solu¸c˜oes.

1 para cada x1 entre 0 e C fa¸ca:

2 para cada x2 entre 0 e C fa¸ca:

3 para cada x3 entre 0 e C fa¸ca:

4 se x1 + x2 + x3 = C ent~ao imprima solu¸c~ao

(74)

Equa¸c˜oes lineares inteiras

1 int main() {

2 int C, x1, x2, x3;

3

4 printf("Digite o valor de C: ");

5 scanf("%d", &C); 6 7 for (x1 = 0; x1 <= C; x1++) { 8 for (x2 = 0; x2 <= C; x2++) { 9 for (x3 = 0; x3 <= C; x3++) { 10 if (x1 + x2 + x3 == C) 11 printf("%d + %d + %d = %d\n", x1, x2, x3, C); 12 } 13 } 14 } 15 16 return 0; 17 } 65

(75)

Equa¸c˜oes lineares inteiras

• Note que, fixado x1, o valor m´aximo de x2 ´e C − x1.

• Fixados x1 e x2, o valor de x3´e determinado como C − x1− x2. • Podemos alterar o programa com estas melhorias.

1 int main() {

2 int C, x1, x2, x3;

3

4 printf("Digite o valor de C: ");

5 scanf("%d", &C); 6 7 for (x1 = 0; x1 <= C; x1++) { 8 for (x2 = 0; x2 <= C - x1; x2++) { 9 x3 = C - x1 - x2; 10 printf("%d + %d + %d = %d\n",x1, x2, x3, C); 11 } 12 } 13 14 return 0; 15 } 66

(76)

Mega-Sena

Na Mega-Sena, um jogo consiste de 6 n´umeros distintos com valores entre 1 e 60.

Problema

Imprimir todos os jogos poss´ıveis da Mega-Sena.

(77)

Mega-Sena

Partimos da mesma id´eia dos dados: gerar todos os poss´ıveis valores para cada um dos 6 n´umeros do jogo.

1 intmain() { 2 intd1, d2, d3, d4, d5, d6; 3 4 for(d1= 1; d1<= 60; d1++) 5 for(d2= 1; d2<= 60; d2++) 6 for(d3= 1; d3<= 60; d3++) 7 for(d4= 1; d4<= 60; d4++) 8 for(d5= 1; d5<= 60; d5++) 9 for(d6= 1; d6<= 60; d6++) 10 printf("%d, %d, %d, %d, %d, %d\n", d1, d2, d3, d4, d5, d6); 11 12 return0; 13 }

Qual a sa´ıda deste programa? Ele est´a correto?

(78)

Mega-Sena 1 intmain() { 2 intd1, d2, d3, d4, d5, d6; 3 4 for(d1= 1; d1<= 60; d1++) 5 for(d2= 1; d2<= 60; d2++) 6 for(d3= 1; d3<= 60; d3++) 7 for(d4= 1; d4<= 60; d4++) 8 for(d5= 1; d5<= 60; d5++) 9 for(d6= 1; d6<= 60; d6++) 10 printf("%d, %d, %d, %d, %d, %d\n", d1, d2, d3, d4, d5, d6); 11 12 return0; 13 }

As primeiras linhas impressas por este programa ser˜ao: 1 1,1,1,1,1,1 2 1,1,1,1,1,2 3 1,1,1,1,1,3 4 1,1,1,1,1,4 5 1,1,1,1,1,5 6 1,1,1,1,1,6 7 1,1,1,1,1,7 8 1,1,1,1,1,8 9 1,1,1,1,1,9 69

(79)

Mega-Sena

O programa anterior repete n´umeros, portanto devemos remover repeti¸c˜oes. 1 intmain() { 2 intd1, d2, d3, d4, d5, d6; 3 4 for(d1= 1; d1<= 60; d1++) 5 for(d2= 1; d2<= 60; d2++) 6 for(d3= 1; d3<= 60; d3++) 7 for(d4= 1; d4<= 60; d4++) 8 for(d5= 1; d5<= 60; d5++) 9 for(d6= 1; d6<= 60; d6++) 10 if((d1!=d2)&&(d1!=d3)&&...) 11 printf("%d, %d, %d, %d, %d, %d\n", d1, d2, d3, d4, d5, d6); 12 13 return0; 14 }

Ap´os incluir todos os testes para garantir que os n´umeros s˜ao distintos, temos a solu¸c˜ao?

(80)

Mega-Sena

• N˜ao temos uma solu¸c˜ao v´alida, pois o programa ir´a imprimir jogos como:

1 12, 34, 8, 19, 4, 45

2 34, 12, 8, 19, 4, 45

3 34, 12, 19, 8, 4, 45

• Todos estes s˜ao um ´unico jogo: 4, 8, 12, 19, 34, 45. • Podemos assumir ent˜ao que um jogo ´e sempre apresentado

com os n´umeros em ordem crescente.

• Dado que fixamos o valor de d1, d2 necessariamente ´e maior que d1.

• Ap´os fixar d1 e d2, d3 deve ser maior que d2, e etc.

(81)

Mega-Sena Solu¸c˜ao correta: 1 intmain() { 2 intd1, d2, d3, d4, d5, d6; 3 4 for(d1= 1; d1<= 60; d1++) 5 for(d2=d1+ 1; d2<= 60; d2++) 6 for(d3=d2+ 1; d3<= 60; d3++) 7 for(d4=d3+ 1; d4<= 60; d4++) 8 for(d5=d4+ 1; d5<= 60; d5++) 9 for(d6=d5+ 1; d6<= 60; d6++) 10 printf("%d, %d, %d, %d, %d, %d\n", d1, d2, d3, d4, d5, d6); 11 12 return0; 13 } 72

(82)

N´umeros em ordem

Problema

Fazer um programa que lˆe n n´umeros inteiros do teclado, e no final informa se os n´umeros lidos est˜ao ou n˜ao em ordem crescente.

(83)

N´umeros em ordem

• Um la¸co principal ser´a respons´avel pela leitura dos n´umeros. • Vamos usar duas vari´aveis, uma que guarda o n´umero lido na

itera¸c˜ao atual, e uma que guarda o n´umero lido na itera¸c˜ao anterior.

• Os n´umeros estar˜ao ordenados se a condi¸c˜ao (anterior <= atual) for v´alida durante a leitura de todos os n´umeros.

1 leia um n´umero e salve em n

2 ordenado = 1 /* Assumimos que os n´umeros est~ao ordenados */

3 leia um n´umero e salve em anterior 4 repita (n-1) vezes:

5 leia um n´umero e salve em atual

6 se atual < anterior

7 ordenado = 0

8 anterior = atual

(84)

N´umeros em ordem

1 #include<stdio.h>

2

3 intmain() {

4 inti, n, atual, anterior, ordenado;

5

6 printf("Digite o valor de n:"); 7 scanf("%d",&n);

8

9 scanf("%d",&anterior); 10 i= 1;/* j´a leu um n´umero */

11

12 ordenado= 1;

13 while(i<n&&ordenado) { 14 scanf("%d",&atual);

15 i++; 16 if(atual<anterior) 17 ordenado= 0; 18 anterior=atual; 19 } 20 21 if(ordenado)

22 printf("Sequ^encia ordenada!\n");

23 else

24 printf("Sequ^encia n~ao ordenada!\n"); 25

26 return0;

(85)

N´umeros de Fibonacci

• A s´erie de Fibonacci ´e: 1, 1, 2, 3, 5, 8, 13, . . .

• Ou seja, o n-´esimo termo ´e a soma dos dois termos anteriores F (n) = F (n − 1) + F (n − 2) ,

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

Fazer um programa que imprime os primeiros n n´umeros da s´erie de Fibonacci.

(86)

N´umeros de Fibonacci

1 leia um n´umero e salve em n

2 contador = 1

3 f_atual = 1, f_ant = 0

4 enquanto contador <= n fa¸ca

5 imprima f_atual

6 aux = f_atual

7 f_atual = f_atual + f_ant

8 f_ant = aux

9 contador = contador +1

(87)

N´umeros de Fibonacci

1 int main() {

2 int n, f_ant, f_atual, f_aux, cont;

3

4 printf("Digite um n´umero:");

5 scanf("%d", &n); 6 7 cont = 1; 8 f_ant = 0; 9 f_atual = 1; 10 while (cont <= n) { 11 printf("%d, ", f_atual); 12 f_aux = f_atual;

13 f_atual = f_atual + f_ant;

14 f_ant = f_aux; 15 cont++; 16 } 17 printf("\n"); 18 19 return 0; 20 } 78

(88)

Menu de escolhas

• Em programas de computador, ´e comum a apresenta¸c˜ao de um menu de op¸c˜oes para o usu´ario.

• Vamos fazer um menu com algumas op¸c˜oes, incluindo uma ´

ultima para encerrar o programa.

(89)

Menu de escolhas

O programa ter´a as seguintes op¸c˜oes: • 1 - Cadastrar um produto.

• 2 - Buscar informa¸c˜oes de produto. • 3 - Remover um produto.

• 4 - Sair do Programa.

Ap´os realizar uma das opera¸c˜oes, o programa volta para o menu.

(90)

Menu de escolhas

O comportamento do seu programa deveria ser algo como:

1 do {

2 printf("1 - Cadastrar um produto\n");

3 printf("2 - Buscar informa¸c~oes de produto\n"); 4 printf("3 - Remover um produto\n");

5 printf("4 - Sair do programa\n"); 6 printf("Entre com a op¸c~ao: "); 7 scanf("%d", &opcao);

8

9 /* Fa¸ca o que for esperado conforme op¸c~ao digitada */ 10

11 } while (opcao != 4);

(91)

Menu de escolhas

1 intmain() {

2 intopcao;

3

4 do{

5 printf("1 - Cadastrar um produto\n"); 6 printf("2 - Buscar informa¸c~oes de produto\n"); 7 printf("3 - Remover um produto\n");

8 printf("4 - Sair do programa\n"); 9 printf("Entre com a op¸c~ao: "); 10 scanf("%d",&opcao); 11 12 if(opcao== 1) 13 printf("Cadastrando....\n\n\n"); 14 else if(opcao== 2) 15 printf("Buscando...\n\n\n"); 16 else if(opcao== 3) 17 printf("Removendo...\n\n\n"); 18 else if(opcao== 4)

19 printf("Seu programa ser´a encerrado.\n\n\n");

20 else

21 printf("Op¸c~ao Inv´alida!\n\n\n"); 22 }while(opcao!= 4);

23

24 return0;

25 }

(92)

Calculando potˆencias de 2

Problema

Imprimir as potˆencias 20, 21, . . . , 2n para um n qualquer.

(93)

Calculando potˆencias de 2

• Usamos uma vari´avel acumuladora que no in´ıcio da i-´esima itera¸c˜ao de um la¸co, possui o valor 2i.

• Imprimimos este valor e atualizamos a acumuladora para a pr´oxima itera¸c˜ao, multiplicando esta vari´avel por 2.

• Propriedade da acumuladora:

• No in´ıcio da i-´esima itera¸c˜ao tem o valor de 2i que ´e impresso. • No fim da i-´esima itera¸c˜ao seu valor ´e atualizado para 2i +1

para a pr´oxima itera¸c˜ao.

1 acumuladora = 1 /* Corresponde a 2^0 */

2 para i = 0 at´e n fa¸ca:

3 imprima acumuladora

4 acumuladora = acumuladora * 2

(94)

Calculando potˆencias de 2

A solu¸c˜ao pode ser obtida utilizando-se o la¸co for.

1 pot = 1; /* corresponde a 2^0 */ 2 for (i = 0; i <= n; i++) { 3 printf("%d\n", pot); 4 pot = pot * 2; 5 } 85

(95)

Calculando potˆencias de 2

Tamb´em pode ser obtida utilizando o comando while.

1 int i, n, pot; 2 3 scanf("%d", &n); 4 5 pot = 1; 6 i = 0; 7 while (i <= n) { 8 printf("2^%d = %d\n", i, pot); 9 pot = pot *2; 10 i++; 11 } 86

(96)

Representa¸c˜ao bin´ario-decimal

J´a sabemos que um computador armazena todas as informa¸c˜oes na representa¸c˜ao bin´aria.

´

E ´util saber como converter valores bin´arios em decimais e vice versa.

Problema

Dado um n´umero em bin´ario, encontrar o seu correspondente em decimal.

(97)

Representa¸c˜ao bin´ario-decimal

• Dado um n´umero em bin´ario bnbn−1. . . b2b1b0, este corresponde na forma decimal a:

n X i =0 bi× 2i • Exemplos: 101 = 22+ 20= 5 1001110100 = 29+26+25+24+22 = 512+64+32+16+4 = 628 • OBS: Em uma palavra no computador, um bit ´e usado para

indicar o sinal do n´umero: − ou +.

(98)

Representa¸c˜ao bin´ario-decimal

• Seja o n´umero 10101 em bin´ario. • Qual o seu valor em decimal?

(99)

Representa¸c˜ao bin´ario-decimal

• Seja o n´umero 10101 em bin´ario. • Qual o seu valor em decimal? • Resposta: 21 = 24+ 22+ 20

(100)

Representa¸c˜ao bin´ario-decimal

• Vamos supor que lemos do teclado um inteiro em bin´ario. • Ou seja, ao lermos n = 111 assumimos que este ´e um n´umero

bin´ario (e n˜ao cento e onze).

• Como transformar este n´umero no correspondente valor decimal (7 neste caso)?

• Basta usarmos a express˜ao: n X

i =0 bi× 2i

(101)

Representa¸c˜ao bin´ario-decimal

Um passo importante ´e conseguir recuperar os d´ıgitos individuais do n´umero:

• Note que n%10 recupera o ´ultimo d´ıgito de n.

• Note que n/10 remove o ´ultimo d´ıgito de n, pois ocorre a divis˜ao inteira por 10.

Exemplo: Com n = 345, ao fazermos n%10 obtemos 5. E ao fazermos n/10 obtemos 34.

(102)

Representa¸c˜ao bin´ario-decimal

Para obter cada um dos d´ıgitos de um n´umero n podemos fazer algo como:

1 leia n

2 enquanto n != 0 fa¸ca:

3 digito = n % 10

4 imprima o digito

5 n = n/10

(103)

Representa¸c˜ao bin´ario-decimal

O programa abaixo imprime cada um dos d´ıgitos de n:

1 int main() {

2 int n, digito;

3

4 printf("\n Digite um n´umero:"); 5 scanf("%d", &n); 6 7 while (n != 0) { 8 digito = n % 10; 9 printf("%d\n", digito); 10 n = n/10; 11 } 12 13 return 0; 14 } 94

(104)

Representa¸c˜ao bin´ario-decimal

• Usar a f´ormula Pn

i =0bi× 2i para transformar um n´umero em bin´ario para decimal.

• Devemos gerar as potˆencias 20, . . . , 2n e multiplicar cada potˆencia 2i pelo i -´esimo d´ıgito.

• Calcular as potˆencias j´a sabemos (acumuladora pot).

• Para armazenar a soma Pn

i =0bi × 2i, usamos uma outra vari´avel acumuladora soma.

(105)

Representa¸c˜ao bin´ario-decimal

1 leia n

2 pot = 1

3 soma = 0

4 enquanto n != 0 fa¸ca:

5 digito = n % 10

6 n = n/10

7 soma = soma + (pot*digito)

8 pot = pot * 2

(106)

Representa¸c˜ao bin´ario-decimal

1 int main() {

2 int n, digito, soma, pot;

3

4 printf("Digite um n´umero em bin´ario: ");

5 scanf("%d", &n); 6 7 soma = 0; 8 pot = 1; 9 while (n != 0) { 10 digito = n % 10; 11 n = n/10;

12 soma = soma + (digito*pot);

13 pot = pot*2;

14 }

15 printf("Valor em decimal: %d\n", soma);

16

17 return 0;

18 }

(107)

Representa¸c˜ao decimal-bin´ario

Problema

Dado um n´umero em decimal, encontrar o seu correspondente em bin´ario.

(108)

Representa¸c˜ao decimal-bin´ario

• Qualquer decimal pode ser escrito como uma soma de

potˆencias de 2: 5 = 22+ 20 e 13 = 23+ 22+ 20, por exemplo. • Nesta soma, para cada potˆencia 2i, sabemos que na

representa¸c˜ao em bin´ario haver´a um 1 no i -´esimo d´ıgito. Exemplo: 13 = 1101.

• O que acontece se fizermos sucessivas divis˜oes por 2 de um n´umero decimal? 13/2 = 6 com resto 1 6/2 = 3 com resto 0 3/2 = 1 com resto 1 1/2 = 0 com resto 1 99

(109)

Representa¸c˜ao decimal-bin´ario

• Dado n em decimal, fazemos repetidas divis˜oes por 2, obtendo os d´ıgitos do valor em bin´ario:

13/2 = 6 com resto 1 6/2 = 3 com resto 0 3/2 = 1 com resto 1 1/2 = 0 com resto 1

1 leia n

2 enquanto n != 0 fa¸ca:

3 digito = n % 2

4 imprima digito

5 n = n/2

(110)

Representa¸c˜ao decimal-bin´ario

1 int main() {

2 int n, digito;

3

4 printf("Digite um n´umero:"); 5 scanf("%d", &n); 6 7 while (n != 0) { 8 digito = n % 2; 9 n = n/2; 10 printf("%d\n", digito); 11 } 12 13 return 0; 14 } 101

(111)

Dados

Problema

Imprimir todas as possibilidades de resultados ao se jogar 4 dados de 6 faces.

(112)

Dados

• Para cada possibilidade do primeiro dado, devemos imprimir todas as possibilidades dos 3 dados restantes.

• Para cada possibilidade do primeiro e segundo dados, devemos imprimir todas as possibilidades dos 2 dados restantes.

• ...

• Vocˆe consegue pensar em uma solu¸c˜ao com la¸cos aninhados?

(113)

Dados 1 int main() { 2 int d1, d2, d3, d4; 3 4 printf("D1 D2 D3 D4\n"); 5 for (d1 = 1; d1 <= 6; d1++) 6 for (d2 = 1; d2 <= 6; d2++) 7 for (d3 = 1; d3 <= 6; d3++) 8 for (d4 = 1; d4 <= 6; d4++) 9 printf("%d %d %d %d\n", d1, d2, d3, d4); 10 11 return 0; 12 } 104

(114)

Calculando o valor de n!

Problema

Fazer um programa que lˆe um valor inteiro positivo n e calcula o valor de n!.

Lembre-se que n! = n × (n − 1) × (n − 2) × . . . 2 × 1.

(115)

Calculando o valor de n!

• Criamos uma vari´avel acumuladora que no in´ıcio da i-´esima itera¸c˜ao de um la¸co armazena o valor de (i − 1)!.

• Durante a i-´esima itera¸c˜ao atualizamos a vari´avel acumuladora multiplicando esta por i obtendo i !. • Propriedade da acumuladora:

• No in´ıcio da i-´esima itera¸c˜ao tem o valor de (i − 1)!. • No fim da i-´esima itera¸c˜ao seu valor ´e atualizado para

i ! = (i − 1)! × i .

• No fim do la¸co, ap´os n itera¸c˜oes, teremos na acumuladora o valor de n!.

1 acumuladora = 1 /* corresponde a 0! */

2 para i = 1 at´e n fa¸ca:

3 acumuladora = acumuladora * i

4 i = i + 1

(116)

Calculando o valor de n! 1 #include <stdio.h> 2 3 int main() { 4 int i, n, fat; 5 6 scanf("%d", &n); 7 8 for(fat = 1, i = 1; i <= n; i++) { 9 fat = fat * i; 10 } 11

12 printf("Fatorial de %d e: %d\n", n, fat); 13

14 return 0;

15 }

(117)

N´umeros primos: outra solu¸c˜ao

• Um n´umero n ´e primo se nenhum n´umero de 2 at´e (n − 1) dividi-lo.

• Podemos usar uma vari´avel que conta quantos n´umeros dividem n.

• Se o n´umero de divisores for 0, ent˜ao n ´e primo.

1 leia um n´umero e salve em n

2 div = 2

3 divisores = 0 /* ningu´em divide n ainda */

4 enquanto div <= (n-1) fa¸ca

5 se (n % div) == 0 6 divisores = divisores + 1 7 div = div + 1 8 se divisores == 0 ent~ao 9 n´umero ´e primo 108

(118)

N´umeros primos

1 int main() {

2 int div, n, divisores;

3 printf("Digite um n´umero:");

4 scanf("%d", &n); 5 6 div = 2; 7 divisores = 0; 8 while (div <= n-1) { 9 if (n % div == 0) 10 divisores++; 11 div++; 12 } 13 14 if (divisores == 0) 15 printf("´E primo!\n"); 16 else 17 printf("N~ao ´e primo!\n"); 18 19 return 0; 20 } 109

(119)

N´umeros primos

´

E claro que ´e melhor terminar o la¸co assim que descobrirmos algum divisor de n.

1 intmain() {

2 intdiv, n, divisores;

3

4 printf("Digite um numero:"); 5 scanf("%d",&n);

6

7 div= 2;

8 divisores= 0;

9 while(div<=n-1 &&divisores== 0) {

10 if(n%div== 0) 11 divisores++; 12 div++; 13 } 14 15 if(divisores== 0) 16 printf("´E primo!\n"); 17 else 18 printf("N~ao ´e primo!\n"); 19 20 return0; 21 } 110

(120)
(121)

Exerc´ıcio

Fa¸ca um programa que imprima um menu de 4 pratos na tela e uma quinta op¸c˜ao para sair do programa.

O programa deve imprimir o prato solicitado.

O programa deve terminar quando for escolhida a quinta op¸c˜ao.

(122)

Exerc´ıcio

Fa¸ca um programa que lˆe dois n´umeros inteiros positivos a e b. Utilizando la¸cos, o seu programa deve calcular e imprimir o valor ab.

(123)

Exerc´ıcio

Fa¸ca um programa que lˆe um n´umero n e que computa e imprima o valor

n X i =1

i .

OBS: N˜ao use f´ormulas como a da soma de uma P.A.

(124)

Exerc´ıcio

Fa¸ca um programa que lˆe um n´umero n e imprima os valores entre 2 e n que s˜ao divisores de n.

(125)

Exerc´ıcio

Fa¸ca um programa que lˆe um n´umero n e imprima os valores j

X i =1 i

para j variando de 1 at´e n, um valor por linha.

(126)

Exerc´ıcio

No exemplo dos n´umeros primos, n˜ao precisamos testar todos os n´umeros entre 2, . . . , (n − 1), para verificar se dividem ou n˜ao n. Basta testarmos at´e n/2.

Por quˆe? Qual o maior divisor poss´ıvel de n? Na verdade, basta testarmos os n´umeros 2, . . . ,√n. Por quˆe?

(127)

Exerc´ıcio

Considere o programa para determinar se uma sequˆencia de n n´umeros digitados pelo usu´ario est´a ordenada ou n˜ao.

Refa¸ca o programa usando uma vari´avel contadora ao inv´es de indicadora.

(128)

Exerc´ıcio

Fa¸ca um programa em C que calcule o m´aximo divisor comum (MDC) de dois n´umeros m e n.

Vocˆe deve utilizar a seguinte regra do c´alculo do MDC, com m ≥ n:

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

(129)

Exerc´ıcio

Na transforma¸c˜ao de decimal para bin´ario, modifique o programa para que este guarde o valor bin´ario em uma vari´avel inteira ao inv´es de imprimir os d´ıgitos um por linha na tela.

Dica: Suponha que n = 7 (111 em bin´ario), e que vocˆe j´a

computou x = 11. Para “inserir” o ´ultimo d´ıgito 1 em x vocˆe deve fazer x = x + 100. Ou seja, vocˆe precisa de uma vari´avel

acumuladora que armazena as potˆencias de 10: 1, 10, 100, 1000 etc.

(130)

Exerc´ıcio

Implemente um programa que compute todas as solu¸c˜oes de equa¸c˜oes do tipo

x1+ x2+ x3+ x4 = C Melhore o seu programa com as seguinte id´eias:

• Fixado x1, os valores poss´ıveis para x2 s˜ao 0, . . . , C − x1. • Fixado x1 e x2, os valores poss´ıveis para x3 s˜ao

0, . . . , C − x1− x2.

• Fixados x1, x2 e x3, ent˜ao x4 ´e unicamente determinado.

(131)

Exerc´ıcio

Fa¸ca um programa que leia um n´umero 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 1 2 3 4 5 6 121

(132)

Exerc´ıcio

Fa¸ca um programa que leia um n´umero n e imprima n linhas na tela com o seguinte formato (exemplo se n = 6):

1 + * * * * * 2 * + * * * * 3 * * + * * * 4 * * * + * * 5 * * * * + * 6 * * * * * + 122

(133)

Exerc´ıcio

Um jogador da Mega-Sena ´e supersticioso e s´o faz jogos em que o primeiro n´umero do jogo ´e par, o segundo ´e ´ımpar, o terceiro ´e par, o quarto ´e ´ımpar, o quinto ´e par e o sexto ´e ´ımpar.

Fa¸ca um programa que imprima todas as possibilidades de jogos que este jogador supersticioso pode jogar.

Referências

Documentos relacionados

(4-C) Os clones animais, os clones em fase de embrião, os descendentes de clones animais, os produtos germinais de clones animais e dos seus descendentes e os alimentos para

2.2.7 Registrar no sistema GCR os dados observados nos subitens 2.2.4, 2.2.5, e 2.2.6 deste capítulo, de forma que esses registros possam fundamentar a avaliação final do desempenho

Ainda, a respeito deste filme, gostaria de destacar as distintas maneiras como três personagens - Stanley, seu amigo Mitch, e um garoto de recados – acendem, em situações diversas,

Distribution of Staphylococcus aureus isolated from bovine mastitis in Brazil, according to the number of virulence genes exhibited (luk, hla, hlb, sea, seb, sec, sed,

curnulant.es kr.. Tabela 151 Valores esperados do est.imadore de máxima verossimilhançaca de tP~ para os diversos delineament.os considerados no caso de cinco

Diante da classificação multibacilar de todas as mulheres com duas cicatrizes BCG e o maior número de mulheres multibacilares entre os casos novos, sugerem-se os seguintes

NIVEL II MARIA DOMINGAS COSTA RODRIGUES CORREA..

25. A minuta de edital de pregão eletrônico constante nos autos observa, com pequenas alterações, o modelo da AGU para serviços com dedicação exclusiva de mão