Buscar

lista04(com respostas)

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 4
(*) 1. Suponha que cada item abaixo é o conteúdo da função main de um programa. Para cada item,
indique qual será a saída do programa. Tente descobrir a saída sem executar o código, apenas
simulando manualmente a execução.
a)
int a = 10, b = 20;
printf ("%d, ", b);
b = 5;
printf ("%d, %d\n", a, b);
b)
int a = 30;
int b = 20;
int c = a + b;
printf ("%d\n", c);
b = 10;
printf ("%d, %d\n", b, c);
c = a + b;
printf ("%d, %d, %d\n", a, b, c);
c)
int a = 10;
int b = 20;
int c = a;
b = c;
a = b;
printf ("%d, %d, %d\n", a, b, c);
d)
int a = 10;
int b = a + 1;
a = b + 1;
b = a + 1;
printf ("%d\n", a);
a = b + 1;
printf ("%d, %d\n", a, b);
e)
int a = 10;
int b = 5;
int c = a+b;
b = 20;
a = 10;
printf ("%d, %d, %d\n", a, b, c);
f)
int x = 1;
int y = 2;
int z = y-x;
printf ("%d\n", z);
x = 5;
y = x+z;
printf ("%d, %d, %d\n", x, y, z);
(*) 2. Marque os identificadores válidos na linguagem C:
a) foo
b) (foo)
c) foo123
d) 123foo
e) foo_bar
f) _bar
g) foo&bar
h) “foo”
i) void
j) IF
k) _void
l) FOO
(**) 3. Converta os seguintes números (na base 10) para as representações binária e hexadecimal:
a) 9 e) 15 i) 127 m) 512
b) 10 f) 250 j) 128 n) 1024
c) 11 g) 63 k) 255 o) 2048
d) 12 h) 64 l) 256 p) 2047
(**) 4. Converta os seguintes números (na base 16) para a representação decimal:
a) F8 c) 16 e) 9 g) ABC
b) AB d) 1 f) 100 h) 123
(**) 5. Escreva um programa que receba o número total de eleitores de um município, o número de
votos brancos, nulos e válidos. O programa deve calcular o percentual que cada um representa em
relação ao número total de eleitores, assim como o número e proporção de abstenções. O programa
deve também testar as entradas, para conferir se elas não são inválidas.
(**) 6. Suponha que uma pessoa pode se aposentar se:
- Tiver no mínimo 65 anos de idade.
- Tiver contribuído por no mínimo 30 anos para o INSS.
- Tiver no mínimo 60 anos de idade e tiver contribuído por no mínimo 25 anos para o INSS.
Escreva um programa que receba o ano atual, o ano de nascimento do empregado e o ano em que
ele começou a contribuir para o INSS (supondo que a contribuição foi ininterrupta). O programa deve
escrever a idade do empregado ao final do ano atual, e dizer se ele poderá ou não se aposentar até lá.
(**) 7.
a) O que o programa abaixo irá mostrar na tela? Responda sem executar o programa.
#include <stdio.h>
int main ()
{
 char coisa;
 short negocio;
 int treco;
 printf ("%d %d %d\n", coisa, negocio+coisa, treco*coisa);
 coisa = 67;
 negocio = coisa;
 treco = 0x58;
 printf ("%d %d %d\n", coisa, negocio, treco);
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("%d", coisa%2);
 coisa = coisa / 2;
 printf ("\n");
 treco = 1000;
 coisa = treco;
 printf ("%d %d %d\n", coisa, negocio, treco);
 return (0);
}
b) O primeiro printf do programa acima tem um erro. Qual?
c) No segundo printf, o valor impresso para a variável treco não é 58. Por que?
d) Quais variáveis/valores são armazenados pelo computador como números hexadecimais? Quais
são armazenados como números na base 10? Quais são armazenados como números binários?
e) Explique o significado do que é impresso na sequência de impressões e divisões envolvendo a
variável coisa.
f) Na última impressão, apesar de atribuirmos o valor de treco à variável coisa, os valores
mostrados são diferentes. Por que isso acontece?
(***) 8. A jornada de trabalho semanal de um funcionário é de até 40 horas. Cada hora extra além
deste limite é remunerada com o mesmo valor de uma hora regular, com um acréscimo de 50%.
Escreva um programa que recebe o número de horas trabalhadas em uma semana e o salário por
hora, e escreva o salário semanal total do funcionário, que deverá ser acrescido das horas extras,
caso tenham sido trabalhadas.
(***) 9. O Guia do Mochileiro das Galáxias diz que os aarghs são seres muito inteligentes, com cabeça
grande, pele escamosa, e 3 tentáculos. Os aarghs possuem um raciocínio matemático bastante
sofisticado. Diferente de seres inferiores, como os terráqueos, os aarghs não contam considerando
cada tentáculo como valendo “1”, o que os permitira contar apenas até 3. Em vez disso, eles giram as
pontas de cada tentáculo, em 5 direções distintas: para a frente, para cima, para a direita, para baixo e
para a esquerda; sempre nesta ordem. Podemos representar esses estados usando 5 símbolos:
● ↑ → ↓ ←
Os aarghs interpretam cada tentáculo da mesma forma que interpretamos os dígitos em um número
na base 10 ou os bits em um número binário, contando em base 5. Ou seja, um aargh representa o
número 0 com os tentáculos posicionados da seguinte forma:
●●●
O maior valor que um aargh pode representar é:
←←←
Com base nisso, responda:
a) Como um aargh representaria os números de 1 a 10?
b) Como um aargh representaria o número 42?
c) Como um aargh representaria o número 100?
d) Qual número equivale à configuração de tentáculos ↑↑↑?
e) Qual número equivale à configuração de tentáculos →→↑?
f) O maior número que os humanos costumam representar usando os 10 dedos das mãos é 10. Qual
o maior número que um aargh pode representar usando os seus 3 tentáculos?
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 4 – Respostas
1.
a)
20, 10, 5
b)
50
10, 50
30, 10, 40
c)
10, 10, 10
d)
12
14, 13
e)
10, 20, 15
f)
1
5, 6, 1
2.
a) Válido
b) Inválido. Uma declaração do tipo int (foo) pode até funcionar, mas o
identificador declarado é foo, sem os parêntesis.
c) Válido.
d) Inválido. Identificadores não podem começar com números, somente com letras
ou o underline.
e) Válido.
f) Válido.
g) Inválido. Identificadores só podem ter números, letras e o underline.
h) Inválido. Identificadores só podem ter números, letras e o underline.
i) Inválido. void é uma palavra reservada da linguagem C.
j) Válido. if (em minúsculas) é uma palavra reservada da linguagem C, mas IF (em
maiúsculas) não.
k) Válido.
l) Válido.
3.
Binário:
a) 1001 e) 1111 i) 0111 1111 m) 0010 0000 0000
b) 1010 f) 1111 1010 j) 1000 0000 n) 0100 0000 0000
c) 1011 g) 0011 1111 k) 1111 1111 o) 1000 0000 0000
d) 1100 h) 0100 0000 l) 0001 0000 0000 p) 0111 1111 1111
Hexadecimal:
a) 0x09 e) 0x0F i) 0x7F m) 0x0200
b) 0X0A f) 0xFA j) 0x80 n) 0x0400
c) 0x0B g) 0x3F k) 0xFF o) 0x0800
d) 0x0C h) 0x40 l) 0x0100 p) 0x07FF
4.
a) 248 c) 22 e) 9 g) 2748
b) 171 d) 1 f) 256 h) 291
5.
#include <stdio.h>
int main ()
{
 int total = 100000;
 int validos = 85000;
 int brancos = 1000;
 int nulos = 1000;
 int abstencoes; /* Vamos calcular. */
 abstencoes = total - (brancos + nulos + validos);
 /* Não preciso testar se o número de votos válidos, brancos e nulos é
 maior que o número de eleitores. Quando isso acontecer, o número de
 abstenções será negativo, e já estamos testando isso! */
 if (brancos < 0 || nulos < 0 || validos < 0 || abstencoes < 0)
 {
 printf ("Entrada invalida.\n");
 return (1);
 }
 printf ("Total:\t\t%d\n", total);
 printf ("Brancos:\t%d\t%.2f%%\n", brancos, ((float) brancos) / total * 100);
 printf ("Nulos:\t\t%d\t%.2f%%\n", nulos, ((float)nulos) / total * 100);
 printf ("Validos:\t%d\t%.2f%%\n", validos, ((float) validos) / total * 100);
 printf ("Abstencoes:\t%d\t%.2f%%\n", abstencoes, ((float) abstencoes) /
 total * 100);
 return (0);
}
6.
/* Já tivemos exercícios com estrutura similar a este. */
#include <stdio.h>
int main ()
{
 int ano_atual = 2013;
 int ano_nascimento = 1952;
 int inicio_contribuicao = 1988;
 int idade_atual, tempo_contribuicao;
 idade_atual = ano_atual - ano_nascimento;
 tempo_contribuicao = ano_atual - inicio_contribuicao;
 printf ("%d anos.\n", idade_atual);
 printf ("Contribuiu por %d anos.\n", tempo_contribuicao);
 if (idade_atual >= 65)
 printf ("Pode se aposentar.\n");
 else if (tempo_contribuicao >= 30)
 printf ("Pode se aposentar.\n");
 else if (idade_atual >= 60)
 {
 if (tempo_contribuicao >= 25)
 printf ("Pode se aposentar.\n");
 }
 return (0);
}
7.
a) (as interrogações são respondidas na letra b)
? ? ?
67 67 88
11000010
-24 67 1000
b) As variáveis não estão sendo inicializadas antes do primeiro printf. Esquecer
de inicializar variáveis é um dos erros mais comuns entre principiantes.
c) O valor 88 é o decimal correspondente ao número hexadecimal 0x58.
d) TODAS as variáveis são SEMPRE armazenadas usando representação binária.
e) O que é impresso é a sequência binária correspondente ao número 67... mas ao
contrário! Existe um algoritmo para converter números decimais em binários que
consiste exatamente em realizar sucessivas divisões por 2, analisando o resto
dessas divisões. Este algoritmo não foi descrito em sala porque é muito fácil
ceder à tentação de usá-lo mecanicamente, sem compreender a razão do seu
funcionamento. Procure refletir sobre a razão pela qual este algoritmo funciona.
f) O que acontece é um overflow. O tipo char só tem 1 byte, e não é capaz de
armazenar o valor 1000.
8.
#include <stdio.h>
int main ()
{
 float n_horas = 40;
 float salario_hora = 20;
 float salario_semanal;
 if (n_horas <= 40) /* Não fez horas extras. */
 salario_semanal = salario_hora * n_horas;
 else
 {
 /* Fez horas extras. Primeiro, descontamos as 40 horas regulares, 
 depois, acrescentamos ao total de horas restantes, com remuneração 
 acrescida de 50%. */
 salario_semanal = salario_hora * 40;
 n_horas = n_horas - 40;
 salario_semanal = salario_semanal + (n_horas * salario_hora) * 1.5f;
 }
 printf ("%.2f\n", salario_semanal);
 return (0);
}
9.
A chave para compreender esta questão é o fato de que os aarghs trabalham com 5
“símbolos” (posições para os tentáculos). Isso é equivalente a dizer que os
aarghs contam em base 5. Assim como na base 10 cada dígito é associado a uma
potência de 10, e na base 2 cada bit é associado a uma potência de 2, na base 5
cada “dígito” (ou tentáculo, no caso) é associado a uma potência de 5. 
a)
1 ● ● ↑
2 ● ● →
3 ● ● ↓
4 ● ● ←
5 ● ↑ ●
6 ● ↑ ↑
7 ● ↑ →
8 ● ↑ ↓
9 ● ↑ ←
10 ● → ●
b) 42 = 1*25 + 3*5 + 2 = ↑ ↓ →
c) 100 = 4*25 = ← ● ●
d) ↑ ↑ ↑ = 1*25 + 1*5 + 1 = 31
e) → → ↑ = 2*25 + 2*5 + 1 = 61
f) 124 (é 53-1).