Programa¸
c˜
ao Estruturada
Estruturas de repeti¸c˜aoProfessores Em´ılio Francesquini e Carla Negri Lintzmayer 2018.Q3
Centro de Matem´atica, Computa¸c˜ao e Cogni¸c˜ao Universidade Federal do ABC
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.
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.
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.
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!
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.
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
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
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
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;
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.
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
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
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?
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
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
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 }
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
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
I’ll not throw paper airplanes in class
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?
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
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?
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
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?
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.
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
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”.
Soma de n´umeros
Problema
Ler um inteiro positivo n, em seguida ler n n´umeros do teclado e apresentar a soma destes.
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
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 }
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 }
Calculando a divis˜ao
Problema
Calcular a divis˜ao inteira de dois numeros usando apenas soma e subtra¸c˜ao.
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.
Divis˜ao inteira
1 int main() {
2 int dividendo, divisor, contador, aux;
3 printf("Entre com o dividendo: ");
4 scanf("%d", ÷ndo);
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 }
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.
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.
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.
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
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
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
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
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.
Vari´avel contadora: primeiros primos
Problema
Imprimir os n primeiros n´umeros primos.
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
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 }
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.
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;
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 }
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.
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
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 }
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.
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;
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.
Maior n´umero
Problema
Fazer um programa que lˆe n n´umeros do teclado e informa qual foi o maior n´umero lido.
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?
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
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;
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.
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
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
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.
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?
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
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
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
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.
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?
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
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?
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.
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
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.
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
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;
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.
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
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
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.
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.
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);
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 }
Calculando potˆencias de 2
Problema
Imprimir as potˆencias 20, 21, . . . , 2n para um n qualquer.
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
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
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
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.
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 +.
Representa¸c˜ao bin´ario-decimal
• Seja o n´umero 10101 em bin´ario. • Qual o seu valor em decimal?
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
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
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.
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
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
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.
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
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 }
Representa¸c˜ao decimal-bin´ario
Problema
Dado um n´umero em decimal, encontrar o seu correspondente em bin´ario.
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
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
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
Dados
Problema
Imprimir todas as possibilidades de resultados ao se jogar 4 dados de 6 faces.
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?
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
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.
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
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 }
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
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
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
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.
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.
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.
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.
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.
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?
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.
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
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.
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.
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
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
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.