Buscar

lista03(com respostas)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Universidade Tecnológica Federal do Paraná
Departamento Acadêmico de Informática
IF61C – Fundamentos de Programação 1 (2013-2)
Prof. Bogdan Tomoyuki Nassu
Lista de Exercícios – Aula 3
(*) 1. Escreva um programa que use a estrutura condicional para mostrar qual entre 3 números inteiros
dados é o maior. Os números devem ser informados uma única vez, e armazenados em variáveis.
(*) 2. Escreva um programa que receba uma temperatura em graus Celsius e a apresente convertida
para graus Fahrenheit. A fórmula de conversão é: F = (9 x C + 160) / 5, sendo F a temperatura em
Fahrenheit e C a temperatura em Celsius.
(*) 3. Escreva um programa que recebe 2 números distintos n1 e n2, e diz se n1 é divisível por n2, se
n2 é divisível por n1, ou se nenhum dos dois casos ocorre.
(**) 4. Escreva um programa que receba o ano de nascimento de uma pessoa e mostre a sua idade ao
final do ano atual. O programa também deve indicar se a pessoa terá ou não idade para votar e para
ter carteira de habilitação.
(**) 5. Escreva um programa que receba a velocidade máxima em uma avenida e a velocidade com
que um motorista estava dirigindo nela. Calcule a multa que o motorista vai receber, considerando que
são pagos 5 reais por cada km/h que estiver acima da velocidade permitida (considere apenas
números inteiros). Se a velocidade do motorista estiver dentro do limite, o programa deve informar que
não há multa.
(**) 6. Escreva um programa que atribua um número entre 0 e 999 a uma variável e o imprima
invertido, na ordem UDC (Unidade Dezena Centena). (Exemplo: se a entrada é 123, a saída é 321).
Atenção: os dígitos não devem ser informados separadamente.
(**) 7. Considere o código abaixo:
#include <stdio.h>
int main ()
{
 int n1, n2, n3, aux;
 if (n2 >= n3)
 {
 aux = n2;
 n2 = n3;
 n3 = aux;
 }
 if (n1 >= n2)
 {
 aux = n1;
 n1 = n2;
 n2 = aux;
 if (n2 >= n3)
 {
 aux = n2;
 n2 = n3;
 n3 = aux;
 }
 }
 printf ("%d %d %d\n", n1, n2, n3);
 return (0);
}
Sem executar o programa, responda:
a) Qual será a saída se atribuirmos no início os valores 1, 2 e 3 a n1, n2 e n3, respectivamente?
b) Qual será a saída se atribuirmos no início os valores 20, 10 e 30 a n1, n2 e n3, respectivamente?
c) Qual será a saída se atribuirmos no início os valores 5*5, n1/2 e n2+1 a n1, n2 e n3,
respectivamente?
d) (****) O que o programa faz, exatamente? Explique o funcionamento do algoritmo.
(***) 8. Suponha que você está programando um módulo contador de cédulas para caixas eletrônicos.
Escreva um programa que informa com quantas cédulas de Real podemos representar um dado valor.
Exemplo de resposta: R$ 218 = 2 cédulas de 100, 1 cédula de 10, 1 cédula de 5, 1 cédula de 2 e 1
cédula de 1. Considere que existem cédulas de 1, 2, 5, 10, 20, 50 e 100 Reais. Procure minimizar o
número de cédulas usadas. Desconsidere valores com centavos, e suponha que a máquina sempre
tem disponíveis as cédulas necessárias.
(***) 9. Ainda considerando o seu trabalho com caixas eletrônicos, você deve escrever um programa
que recebe um número de conta-corrente com três dígitos e mostra o seu dígito verificador. O dígito
verificador é calculado da seguinte forma (utilizando o número 235 como exemplo):
- Some o número da conta com seu inverso. Exemplo: 235 + 532 = 767 (o algoritmo para realizar esta
inversão foi criado em outro exercício).
- A soma anterior for maior ou igual a 1000, desconsidere o milhar.
- Separe os 3 dígitos do número resultante, multiplicando a centena por 1, a dezena por 2, e a unidade
por 3. Some os 3 valores. Exemplo: 7 (posição 1), 6 (posição 2) e 7 (posição 3): (7 x 1) + (6 x 2) + (7 x
3) = 7 + 12 + 21 = 40.
- O último dígito desse resultado é o dígito verificador da conta. Exemplo: 0.
(***) 10. A Companhia de Táxi Tabajara (CTT) é uma das maiores empresas de transporte do país.
Possui uma vasta frota de carros e opera em todas as grandes cidades. Recentemente a CTT
modernizou a sua frota, adquirindo um lote de 500 carros bicombustíveis (carros que podem utilizar
como combustível tanto álcool quanto gasolina). Além do maior conforto para os passageiros e o
menor gasto com manutenção, com os novos carros é possível uma redução adicional de custo: como
o preço da gasolina está sujeito a variações muito bruscas, pode ser vantagem, em certos momentos,
utilizar álcool como combustível. Entretanto, os carros possuem um melhor desempenho utilizando
gasolina, ou seja, em geral, um carro percorre mais quilômetros por litro de gasolina do que por litro de
álcool.
Escreva um programa que recebe o preço do litro de álcool, o preço do litro de gasolina e os
quilômetros por litro que um carro bicombustível realiza com cada um desses combustíveis. O
programa deve informar se é mais econômico abastecer os carros da CTT com álcool ou com
gasolina. No caso de não haver diferença de custo entre abastecer com álcool ou gasolina, a CTT
prefere utilizar gasolina.
Universidade Tecnológica Federal do Paraná
Departamento Acadêmico de Informática
IF61C – Fundamentos de Programação 1 (2013-2)
Prof. Bogdan Tomoyuki Nassu
Lista de Exercícios - Aula 3 - Respostas
1. Vou dar aqui 2 soluções. Note como elas são até certo ponto análogas às
soluções dadas para o problema das pepitas de ouro na 1a lista.
/* Solução 1: compara 2 valores, faz uma segunda comparação dependendo do 
 resultado da primeira comparação. */
#include <stdio.h>
int main ()
{
 int n1 = 10;
 int n2 = 15;
 int n3 = 13;
 if (n1 > n2)
 {
 if (n1 > n3)
 printf ("%d\n", n1);
 else
 printf ("%d\n", n3);
 }
 else
 {
 if (n2 > n3)
 printf ("%d\n", n2);
 else
 printf ("%d\n", n3);
 }
 return (0);
}
/* Solução 2: guarda em uma variável n1, e compara esta variável com n2, e 
 depois com n3. Esta solução é estruturalmente mais simples, e é mais parecida
 com a solução para o problema mais geral, que teria um número arbitrário de
 valores. */
#include <stdio.h>
int main ()
{
 int n1 = 10;
 int n2 = 15;
 int n3 = 13;
 int maior;
 maior = n1;
 if (n2 > maior)
 maior = n2;
 if (n3 > maior)
 maior = n3;
 printf ("%d\n", maior);
 return (0);
}
2.
/* O programa é minúsculo, e a fórmula é usada diretamente. */
#include <stdio.h>
int main ()
{
 double c = 10;
 printf ("%.2f\n", (9*c + 160)/5);
 return (0);
}
3.
/* Uso bem direto da estrutura condicional. */
#include <stdio.h>
int main ()
{
 int n1 = 9, n2 = 3;
 if (n1 % n2 == 0)
 printf ("%d eh divisivel por %d.\n", n1, n2);
 else if (n2 % n1 == 0)
 printf ("%d eh divisivel por %d.\n", n2, n1);
 else
 printf ("Nenhum eh divisivel pelo outro.");
 return (0);
}
4.
#include <stdio.h>
main ()
{
 int ano_nascimento = 1980;
 int ano_atual = 2013;
 int idade;
 /* Calcula e mostra a idade ao final do ano atual. */
 idade = ano_atual – ano_nascimento;
 printf ("Idade ao fim do ano atual: %d\n", idade);
 /* Vota a partir dos 16 anos. */
 if (idade >= 16)
 printf ("Podera votar.\n");
 else
 printf ("Nao podera votar.\n");
 /* Dirige a partir dos 18. */
 if (idade >= 18)
 printf ("Podera ter habilitacao.\n");
 else
 printf ("Nao podera ter habilitacao.\n");
}
5.
#include <stdio.h>
int main ()
{
 int velocidade_maxima = 60;
 int velocidade_motorista = 70;
 /* A conta para o valor da multa é simples. Se você teve dificuldades para
 chegar a esta conta, procure ajuda: sem ter um bom domínio de matemática 
 básica, você terá problemas para programar.*/if (velocidade_motorista > velocidade_maxima)
 printf ("Multa: R$ %d\n", (velocidade_motorista - velocidade_maxima)*5);
 else
 printf ("Sem multa.\n");
 return (0);
}
6.
/* Como sabemos que são 3 dígitos, podemos usar a mesma estratégia que já 
 tínhamos usado para separar um número de segundos em horas, minutos e
 segundos – aqui, separamos as unidades em centenas, dezenas e unidades. Repare
 também que o problema não exige o uso da estrutura condicional! */
#include <stdio.h>
int main ()
{
 int n = 456;
 int c, d, u;
 c = n/100; /* Centenas = quociente da divisão por 100. */
 d = (n%100)/10; /* Dezenas = o resto da divisão por 100 dividido por 10. */
 u = (n%10); /* Unidades = o que não for divisível por 10. */
 printf ("%d\n", c + d*10 + u*100); /* Imprimimos na ordem contrária. */
 return (0);
}
7.
a) 1 2 3
b) 10 20 30
c) 12 13 25
d) O programa reordena n1, n2 e n3 de forma que eles estejam sempre em ordem
crescente. A lógica deste algoritmo é bem “elegante”, e funciona com trocas. O
primeiro if garante que n2 terá valor menor ou igual a n3. O segundo if compara
n1 com este valor. Se n1 <= n2, sabemos que n2 <= n3, portanto n1 <= n3 e os
valores já estão ordenados. Do contrário, trocamos os valores de n1 e n2,
garantindo que o primeiro valor é o menor de todos. Precisamos então comparar
novamente n2 com n3, para verificar se o valor que originalmente estava em n1 e
agora está em n2 é maior que o valor em n3. Para enxergar o funcionamento do
algoritmo, use os valores 1, 2 e 3, em todas as ordens possíveis (são 6 casos).
8.
/* Problema clássico, e muito parecido com aquele das horas. A maior diferença
 aqui é que precisamos quebrar o número inicial em muitos sub-pedaços, então
 fazer todo o cálculo para cada tipo de nota em uma única linha é um pouco
 inconveniente. Em vez disso, podemos ir subtraindo o dinheiro que já "temos"
 do valor total - este é o processo que muita gente usa mentalmente quando faz
 este tipo de coisa na vida real. A solução genérica para um número arbitrário
 de sub-pedaços com pesos variados seria mais complexa, e exigiria uma
 estrutura de dados mais sofisticada, que ainda não vimos. */
#include <stdio.h>
int main ()
{
 int n = 123;
 int n100, n50, n20, n10, n5, n2, n1;
 n100 = n / 100;
 n = n - (n100 * 100);
 n50 = n / 50;
 n = n - (n50 * 50);
 n20 = n / 20;
 n = n - (n20 * 20);
 n10 = n / 10;
 n = n - (n10 * 10);
 n5 = n / 5;
 n = n - (n5 * 5);
 n2 = n / 2;
 n = n - (n2 * 2);
 n1 = n;
 /* Note que eu posso pular uma linha depois da string sem problemas. */
 printf ("100: %d\n50: %d\n20: %d\n10: %d\n5: %d\n2: %d\n1: %d\n",
 n100, n50, n20, n10, n5, n2, n1);
 return (0);
}
9.
#include <stdio.h>
int main ()
{
 int n = 235; /* O número da conta. */
 int n_invertido; /* O número da conta, com os caracteres invertidos. */
 int centenas, dezenas, unidades; /* Nomes mais mnemônicos que c, d e u. */
 int soma_n_n_invertido;
 int final;
 int digito_verificador;
 /* Inverte o n. */
 centenas = n/100;
 dezenas = (n%100)/10;
 unidades = n%10;
 n_invertido = centenas + dezenas*10 + unidades*100;
 /* Soma n com o n invertido. */
 soma_n_n_invertido = n + n_invertido;
 /* Separa de novo os dígitos. Se o resultado for > 999, desconsidera
 o milhar.*/
 soma_n_n_invertido = soma_n_n_invertido % 1000;
 centenas = soma_n_n_invertido/100;
 dezenas = (soma_n_n_invertido %100)/10;
 unidades = soma_n_n_invertido%10;
 /* Multiplica pela ordem posicional e soma tudo. Note que não precisamos
 realmente multiplicar a centena por 1, porque esta multiplicação não 
 teria efeito! */
 final = centenas + (dezenas*2) + (unidades*3);
 /* Pegamos o último dígito. */
 digito_verificador = final % 10;
 printf ("%d\n", digito_verificador);
 return (0);
}
10.
/* O algoritmo para este exercício é MUITO mais simples do que o enunciado
 faz parecer. Apesar de isso parecer um "golpe baixo", este tipo de situação é
 extremamente comum - os problemas reais sempre envolvem reflexão sobre o que
 é relevante e o que faz parte da solução do problema. Acostume-se com 
 enunciados, especificações e descrições com bastante texto: eles acompanharão
 você para sempre. */
#include <stdio.h>
main ()
{
 float preco_a = 1.899; /* reais/litro */
 float preco_g = 2.699; /* reais/litro */
 float rendimento_a = 8; /* km/litro */
 float rendimento_g = 11; /* km/litro */
 float reais_por_km_alcool = preco_a / rendimento_a; /* reais/km */
 float reais_por_km_gasolina = preco_g / rendimento_g; /* reais/km */
 if (reais_por_km_alcool < reais_por_km_gasolina)
 printf ("Melhor usar alcool.\n");
 else
 printf ("Melhor usar gasolina.\n");
}

Continue navegando