Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Cap3_Lacos/Exercicio19.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 19: O numero de combinacoes de n objetos diferentes, em que r objetos sao escolhidos de cada vez, eh dado pela seguinte formula: nCr = fatorial de n / (fatorial de r * fatorial de (n-r)) ==> nCr = n! / (r! * (n-r)!). Escreva um programa que calcule o numero de combinacoes de n objetos tomados r de cada vez. Os valores n e r devem ser solicitados ao usuario. Resolução comentada em: https://youtu.be/sK4VQ5V9-tM */ #include<stdio.h> int main(){ int n, r, i; unsigned int fatn, fatr, fatn_r, nCr; printf("Digite a quantidade de objetos: "); scanf("%d", &n); printf("Digite em quantos estes devem ser agrupados: "); scanf("%d", &r); /*6! = 6*5*4*3*2*1 */ i = n; fatn = 1; /*Fatorial de n*/ while(i > 1){ fatn *= i; i--; } /*Fatorial de r*/ i = r; fatr = 1; while(i > 1){ fatr *= i; i--; } /*Fatorial de n-r*/ i = n - r; fatn_r = 1; while(i > 1){ fatn_r *= i; i--; } /*Calculo da combinaçao simples*/ nCr = fatn / (fatr * fatn_r); printf("\nO numero de combinacoes possiveis eh: %u", nCr); return 0; } Cap3_Lacos/Exercicio18.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 18: Escreva um programa que solicite um numero entre 3 e 18 e calcule a propabilidade que esse numero tem de sair ao se jogar tres dados ao mesmo tempo. A probabilidade e calculada por meio da seguinte formula: P = (n1 / n2) * 100.0 em que n1 eh o numero no qual a soma dos dados eh igual ao numero de dado pelo usuario, e n2 eh o numero total de casos possiveis. Por exemplo, se o numero inserido for 6, o programa imprimira: "A probabilidade de sair 6 e de 4.63%" Resolução comentada em: https://youtu.be/LBFIyIGP-1c */ #include<stdio.h> int main(){ const int n2 = 216; int soma_num, i, j, k, n1; float prob; /*Entrada dos dados*/ do{ printf("Digite a soma dos dados: "); scanf("%d", &soma_num); } while(soma_num < 3 || soma_num > 18); /*Processamento dos dados*/ n1 = 0; for(i = 1; i <= 6; i++){ for(j = 1; j <= 6; j++){ for(k = 1; k <= 6; k++){ n1 = i + j + k == soma_num ? n1 + 1 : n1; } } } prob = ((float)n1 / n2) * 100.0; /*Saida dos dados*/ printf("\nA probabilidade de sair %d e de %.2f%%", soma_num, prob); return 0; } Cap3_Lacos/Exercicio20.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 20: A sequencia de numeros de Fibonacci eh a seguinte: os dois primeiros termos tem o valor 1 e cada termo seguinte eh igual a soma dos dois anteriores. 1, 1, 2, 3, 5, 8, 13, 21, ... Escreva um programa que solicite ao usuario o numero do termo da sequencia de Fibonacci e calcule o valor desse termo. Por exemplo, se o numero fornecido pelo usuario for 7, o programa devera encontrar e imprimir o valor 13 Resolução comentada em: https://youtu.be/a_RIsWmaLRo a b fib 0 1 1 1 1 2 1 2 3 2 3 5 */ #include<stdio.h> int main(){ int termo, i, a, b, fibonacci; printf("Digite o termo que deseja da sequencia de Fibonacci: "); scanf("%d", &termo); printf("1"); a = 0; b = 1; for(i = 1; i < termo; i++){ fibonacci = a + b; a = b; b = fibonacci; printf(", %d", fibonacci); } return 0; } Cap3_Lacos/Exercicio17.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 17: Elabore um programa que solicite um numero inteiro ao usuario e crie um novo numero inteiro com os digitos em ordem inversa. Por exemplo, uma execucao do programa eh: Digite um numero inteiro: 5382 Seu numero invertido eh: 2835 5382 = 5000 + 300 + 80 + 2 5000 = 5 * 1000 == 1000 = 10^3 300 = 3 * 100 == 100 = 10^2 80 = 8 * 10 == 10 = 10^1 2 = 2 * 1 == 1 = 10^0 5000 / 10^3 = * 10^0 == 5 300 / 10^2 = * 10^1 == 30 80 / 10^1 = * 10^2 == 800 2 / 10^0 = * 10^3 == 2000 */ #include<stdio.h> int main(){ int num, i, j, cont_algarismos, pot1, pot2; printf("Digite um numero inteiro:\t"); scanf("%d", &num); i = 1; cont_algarismos = 0; /*Contar algarismos*/ while(num > i){ cont_algarismos++; i *= 10; } /*Primeira potencia*/ for(i = 0, pot1 = 1; i < cont_algarismos; i++){ for(j = cont_algarismos - i, pot2 = 1; j > 1) pot1 *= 10; } /*Teste de Mesa: i = 0; pot1 = 1 i < cont_algarismos ? Sim; pot1 = 10; i = 1 i < cont_algarismos ? Sim; pot1 = 100; i = 2; i < cont_algarismos ? Sim; pot1 = 1000; i = 3; i < cont_algarismos ? Sim; pot1 = 10000; i = 4; i < cont_algarismos ? Nao; */ return 0; } Cap3_Lacos/Exercicio15.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 15: Escreva um programa que imprima os caracteres da tabela ASCII de codigos 32 a 255. O programa deve imprimir cada caractere, seu codigo decimal e seu codigo hexadecimal. Resolucao comentada em https://youtu.be/JBQOSudKSA0 */ #include<stdio.h> int main(){ int i; printf("Char\tDec\tHex\n"); /*Usando laço for*/ for(i = 32; i <= 255; i++) printf("%c\t%d\t%x\n", i, i, i); /*Usando laco while*/ i = 32; while(i <= 255){ printf("%c\t%d\t%x\n", i, i, i); i++; } /*Usando laço do-while*/ i = 32 do{ printf("%c\t%d\t%x\n", i, i, i); i++; } while(i <= 255); return 0; } Cap3_Lacos/Exercicio16.c /*Treinamento em Linguagem C - Victorine Viviane Mizrahi Capítulo 3 - Laços Exercício 16: Escreva um programa que utilize um laço while para ler caracteres digitado no teclado enquanto o usuario nao pressionar a tecla ESC de codigo 27. Os caracteres lidos nao devem ser ecoados no video. Se o caractere lido for uma letra minuscula, o programa a imprimira em maiusculo; se for qualquer outro caractere, ele mesmo sera impresso. Utilize o operador ternario. */ #include <stdio.h> #include <conio.h> int main(){ char ch = 1; while(ch != 27){ ch = getch(); printf("A letra correspondente eh: %c", ch >= 'a' && ch <= 'z' ? ch - 32 : ch); } return 0; } Cap3_Lacos/Exercicio1_14.c //Treinamento em Linguagem C - Victorine Viviane Mizrahi //Capítulo 3 - laços //Exercícios 1 a 14 1. Um laço for com uma unica instrucao termina com: a) virgula; b) chave de abertura; c) chave de fechamento; d) ponto-e-virgula; Resposta: Quanto houver apenas e somente apenas uma instrucao ou ate nenhuma instrucao, deve conter ponto-e-virgula. d) No livro: Pagina 67 auxilia nesta resposta. 2. Um laco while com uma unica instrucao termina com: a) virgula; b) chave de abertura; c) chave de fechamento; d) ponto-e-virgula; Resposta: Igual a questao 1. Necessita ter ponto-e-virgula para uma instrucao. d) No livro: Pagina 73 3. Um laco do-while com uma unica instrucao termina com: a) virgula; b) chave de abertura; c) chave de fechamento; d) ponto-e-virgula; Resposta: A similaridade com o comando while tambem absorve esta caracteristica. Se houver uma unica instrucao, basta apenas o ponto-e-virgula d) 4. Um laco for de multiplas instrucoes termina com: a) virgula; b) chave de abertura; c) chave de fechamento; d) ponto-e-virgula; Resposta: Quando ha necessidade de varias instrucoes para um laco, usamos "bloco de instrucao" que nada mais eh do que as instrucoes/operacoes entre as chaves. A questao 5 e 6 tem a mesma resposta da questao 4. Sempre que precisar em um laco varias operacoes faz-se necessario o uso de chaves. 7. As tres expressoes que compoem a expressao do laco for sao separadas por _______. Resposta: As tres expressoes ao qual o livro refere-se eh inicializacao - teste - incremento. Para separa-las precisa usar o ponto-e-virgula. Lembrando = for(i = 0; i < 5; i++); inicializacao; teste; incremento. Podemos recordar tambem que nos tres passos podemos fazer mais de uma operacao separando-as por virgula = for(i = 0, j = 15; i <= j; i++, j++). No livro: A pagina 62 faz esta explicacao. 8. Multiplas exprecoes de incremento na expressao do laco for sao separadas por _____. Resposta: Acabei respondendo no exercicio anterior. Sao separadas por virgula. 9. Um laco do-while e util quando seu corpo: a) nunca eh executado; b) pode nunca ser executado; c) deve ser executado pelo menos uma vez; d) termina apos a primeira execucao; Resposta: O comando do-while faz seu teste apenas no final da primeira instrucao. Ou seja, quando queremos primeiro saber algo para depois ter uma acao, o do-while eh a melhor escolha. Opcao c). No livro: Na introducao ao laco do-while na pagina 75 a autora reforca esta ideia. 10. A expressao de inicializacao de um laco for: a) nunca eh executada; b) eh executada uma unica vez a cada iteracao; c) eh executada enquanto o laco nao termina; d) eh executada uma vez antes do laco ser iniciado; Resposta: A inicializacao no laco for, atribui um valor de "start" a uma variavel, por exemplo, "Neste for, minha variavel i vai iniciar em 0", esta inicializacao ocorre apenas uma vez no inicio do laco e seu valor sera modificado apenas com a expressao de incremento. Logo, a resposta correta eh a opcao d) 11. Verdadeiro ou Falso: Os dois fragmentos seguintes produzem o mesmo resultado. a) for(i = 0; i < 10; i++) for(j = 0; j < 10; j++) printf("%d", i + j); b) for(i = 0, j = 0; i < 10; i++) for(; j < 10; j++) printf("%d", i + j); Resposta: Nao se enganem! Sao totalmente diferentes. Vamos analisar cada um. a) O primeiro for inicializa o i = 0 e parte para a proxima instrucao; O segundo for inicializa o j = 0 e parte para a proxima instrucao; O printf() sera repitido ate o j < 10 ser falso. Apos j < 10 falso, i sera incrementado (i++) e validado (i < 10). Caso verdadeiro ira para a proxima instrucao. O segundo for sera novamente inicializado com j=0. Resumindo, para cada i, o j recebera 0 e fara a proxima expressao, isto resultara em 100 printf(); Lembrando que a inicilizacao do for ocorre apenas uma vez antes do laco comecar. O i sera inicializado uma vez e o j sera inicializado 10 vezes. b) O primeiro for inicializa i = 0 e j = 0; O segundo for nao inicializa nenhuma variavel, ou seja, mantem o valor de o valor de j; Acontece que quando j++ resultar em j = 0, o teste do segundo for sempre vai ser falso e por isso sera "pulado". Resumindo, o printf() ocorrera 10 vezes apenas. 12. Qual eh o erro deste programa? /*Soma dos quadrados*/ #include<stdio.h> int main(){ int i; for(i = 1; i < 10; i++){ int soma = 0; soma += i*i; } printf("%d\n", soma); return 0; } Resposta: Aparentemente o codigo esta correto. Nao ha erro de sintaxe, os ponto-e-virgulas estao corretos, a biblioteca esta ok e a operacao matematica ocorre de forma correta. Agora pense o seguinte: Se apagassemos o laco for, como ficaria o programa? Veja: #include<stdio.h> int main(){ int i; printf("%d\n", soma); return 0; } Achou o erro? Declaramos a variavel i e imprimimos a variavel soma, mas a variavel soma nao esta declarada! Este eh justamente o erro. Quando declaramos uma variavel dentro de um bloco esta variavel sera util enquanto este bloco estiver sendo usado, quando o bloco acaba, a variavel eh "destruida". A variavel soma eh declarada dentro do for e quando o for acaba ela acaba tambem. Para corrigir este programa a declaracao da soma deveria ser antes do for: /*Soma dos quadrados*/ #include<stdio.h> int main(){ int i; int soma = 0; for(i = 1; i < 10; i++){ soma += i*i; } printf("%d\n", soma); return 0; } 13. Qual eh a saida do programa seguinte? #include<stdio.h> int main(){ int a; for(a = 36; a > 0; a /= 2) printf("%d\t", a); printf("\n"); return 0; } Resposta: Veja este passo a passo. a = 36; a > 0 ? Sim; printf("36\t"); a = 36 / 2; a = 18; a > 0 ? Sim; printf("18\t"); a = 18 / 2; a = 9; a > 0 ? Sim; printf(" 9\t"); a = 9 / 2; a = 4; a > 0 ? Sim; printf(" 4\t"); a = 4 / 2; a = 2; a > 0 ? Sim; printf(" 2\t"); a = 2 / 2; a = 1; a > 0 ? Sim; printf(" 1\t"); a = 1 / 2; /*A divisao inteira de 1 por 2 eh 0.*/ a = 0; a > 0 ? Nao; printf("\n"); Isto eh o que acontecera dentro deste for e a saida sera: 36 18 9 4 2 1 14. Este programa imprime uma letra I bem grande na tela: /*Imprime a letra I*/ #include<stdio.h> int main(){ int i = 0; printf("IIIIIII\n"); while(i < 17){ printf(" III\n"); i++; } printf("IIIIIII\n"); printf("\n"); return 0; } a) modifique o programa para que utilize um laco for no lugar do laco while; b) construa um programa similar que imprima a letra E; c) responda: nesse exemplo, qual dos lacos se adapta melhor; Por que? Resposta a): /*Substituindo apenas o while*/ #include<stdio.h> int main(){ int i = 0; printf("IIIIIII\n"); for(; i < 17; i++) /*Como o i ja esta sendo inicializado, deixei a inicializacao sem instrucao*/ printf(" III\n"); /*Retirei o i++ pois este ja ocorre no instrucao de incremento do for*/ printf("IIIIIII\n"); printf("\n"); return 0; } Resposta b) /*Letra E com o while*/ #include<stdio.h> int main(){ int i = 0, j; while(i < 3){ printf("IIIIIIIIIIIIIIIIIIIIIIIIIIII\n"); j = i == 2 ? 17 : 0; while(j < 17){ printf("III\n"); j++; } i++; } return 0; } O primeiro while forma a parte horizontal da letra, o segundo while forma a parte vertical. /*Letra E com o for*/ #include<stdio.h> int main(){ int i, j; for(i = 0; i < 3; i++){ printf("IIIIIIIIIIIIIIIIIIIIIIIIIIII\n"); j = i == 2 ? 17 : 0; for( ;j < 17; j++) printf("III\n"); } return 0; } O mesmo que acontece com o while acontece com o for. Resposta c) Para este exemplo o laco for foi muito melhor pois usou bem menos instrucoes que o while. No while eu preciso iniciar e incrementar "manualmente", ja no for faco isto no comeco do laco apenas. Instrucoes no for: 5, instrucoes no while: 7.
Compartilhar