Buscar

Resoluçã de Exercícios Capítulo 3 - Treinamento em Linguagem C

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.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais