MAC 2166 Introdução à Computação para Engenharia
PROVA 2
QUESTÃO 1.
Simule a execução do programa abaixo, destacando a sua saída.
A saída do programa consiste de tudo que resulta dos
comandos printf.
#include < stdio.h >
int f1 (int n, int *j)
{
int i;
i = n % 10;
n = n / 10;
*j = n % 10;
printf("f1: %d %d %d\n", n, i, *j);
return i;
}
void f2 (int n, double *x)
{
int i, j;
double y;
j = n % 10;
n = (j % 3) + 1;
y = n + 5;
i = y / 5;
*x = y / 5;
printf("f2: %d %d %d %g %g\n",
n, i, j, y, *x);
}
int main()
{
int nusp, n, i, j;
double x;
printf("Entre com o seu no. USP: ");
scanf ("%d", &nusp);
n = nusp; i = 11; j = 11;
printf(" 1: %d %d %d\n", n, i, j);
j = f1 (n, &i);
printf(" 2: %d %d %d\n", n, i, j);
n = nusp; i = 22; j = 22;
printf(" 3: %d %d %d\n", n, i, j);
j = f1 (n, &n);
printf(" 4: %d %d %d\n", n, i, j);
n = nusp; i = 33; j = 33; x = 3.33;
printf(" 5: %d %d %d %g\n", n, i, j, x);
f2 (n, &x);
printf(" 6: %d %d %d %g\n", n, i, j, x);
return 0;
}
SOLUÇÃO.
A resposta depende, essencialmente, do último e penúltimo dígitos do
número USP. Teste com o seu no. USP e compare a resposta. Na soluções a
seguir o penúltimo dígito do número USP é representado por X. Assim, o
número USP 1234567 é escrito como 12345X7.
Entre com o seu no. USP: 12345X0
1: 12345X0 11 11
f1: 12345X 0 X
2: 12345X0 X 0
3: 12345X0 22 22
f1: 12345X 0 X
4: X 22 0
5: 12345X0 33 33 3.33
f2: 1 1 0 6 1.2
6: 12345X0 33 33 1.2
Entre com o seu no. USP: 12345X1
1: 12345X1 11 11
f1: 12345X 1 X
2: 12345X1 X 1
3: 12345X1 22 22
f1: 12345X 1 X
4: X 22 1
5: 12345X1 33 33 3.33
f2: 2 1 1 7 1.4
6: 12345X1 33 33 1.4
Entre com o seu no. USP: 12345X2
1: 12345X2 11 11
f1: 12345X 2 X
2: 12345X2 X 2
3: 12345X2 22 22
f1: 12345X 2 X
4: X 22 2
5: 12345X2 33 33 3.33
f2: 3 1 2 8 1.6
6: 12345X2 33 33 1.6
Entre com o seu no. USP: 12345X3
1: 12345X3 11 11
f1: 12345X 3 X
2: 12345X3 X 3
3: 12345X3 22 22
f1: 12345X 3 X
4: X 22 3
5: 12345X3 33 33 3.33
f2: 1 1 3 6 1.2
6: 12345X3 33 33 1.2
Entre com o seu no. USP: 12345X4
1: 12345X4 11 11
f1: 12345X 4 X
2: 12345X4 X 4
3: 12345X4 22 22
f1: 12345X 4 X
4: X 22 4
5: 12345X4 33 33 3.33
f2: 2 1 4 7 1.4
6: 12345X4 33 33 1.4
Entre com o seu no. USP: 12345X5
1: 12345X5 11 11
f1: 12345X 5 X
2: 12345X5 X 5
3: 12345X5 22 22
f1: 12345X 5 X
4: X 22 5
5: 12345X5 33 33 3.33
f2: 3 1 5 8 1.6
6: 12345X5 33 33 1.6
Entre com o seu no. USP: 12345X6
1: 12345X6 11 11
f1: 12345X 6 X
2: 12345X6 X 6
3: 12345X6 22 22
f1: 12345X 6 X
4: X 22 6
5: 12345X6 33 33 3.33
f2: 1 1 6 6 1.2
6: 12345X6 33 33 1.2
Entre com o seu no. USP: 12345X7
1: 12345X7 11 11
f1: 12345X 7 X
2: 12345X7 X 7
3: 12345X7 22 22
f1: 12345X 7 X
4: X 22 7
5: 12345X7 33 33 3.33
f2: 2 1 7 7 1.4
6: 12345X7 33 33 1.4
Entre com o seu no. USP: 12345X8
1: 12345X8 11 11
f1: 12345X 8 X
2: 12345X8 X 8
3: 12345X8 22 22
f1: 12345X 8 X
4: X 22 8
5: 12345X8 33 33 3.33
f2: 3 1 8 8 1.6
6: 12345X8 33 33 1.6
Entre com o seu no. USP: 12345X9
1: 12345X9 11 11
f1: 12345X 9 X
2: 12345X9 X 9
3: 12345X9 22 22
f1: 12345X 9 X
4: X 22 9
5: 12345X9 33 33 3.33
f2: 1 1 9 6 1.2
6: 12345X9 33 33 1.2
----------------------------------------------------------------
QUESTÃO 2.
A representação de um número natural em base binária utiliza apenas os
algarismos 0 e 1. Observe,
[Notação: abaixo escrevemos x^{y} para indicar x elevando a y.]
(a) 2 na base binária é representado por 10, pois
1 x 2^1 + 0 2^0 = 2;
(b) 5 na base binária é representado por 101, pois
1 x 2^2 + 0 x 2^1 + 1 x 2^0 = 5;
(c) 18 na base binária é representado por 10010, pois
1 x 2^4 + 0 x 2^3 + 0 x 2^2 + 1 x 2^1 + 0 x 2^0 = 18;
(d) 20 na base binária é representado por 10100, pois
1 x 2^4 + 0 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 20;
(e) 32 na base binária é representado por 100000, pois
1 x 2^5 + 0 x 2^4 + 0 x 2^3 + 0 x 2^2 + 0 x 2^1 + 0 x 2^0 = 32.
O programa abaixo tenta resolver o seguinte problema:
"Dado um número natural na base binária, transformá-lo para a base
decimal".
Por exemplo: dado 10010, a saída será ``$18$''.
[Comentário: a base decimal usa os algarismos 0,1,2,3,4,5,6,7,8 e 9.]
#include < stdio.h >
/* Dado um numero em binario, converter este numero para base decimal. */
/* Recebe um inteiro, num, corta seu ultimo digito e */
/* devolve este digito como resultado. */
int proxdig(int num)
{
int res;
res = num % 10;
num = num / 10;
return res;
}
/* Programa principal. */
int main()
{
int xbase2, xbase10, pot2;
printf("Entre com o numero em binario: ");
scanf("%d", &xbase2);
/* Converte o numero lido para a base decimal. */
xbase10 = 0;
pot2 = 1;
while (pot2 <= xbase2)
{
xbase10 = xbase10 + proxdig(xbase2) * pot2;
pot2 = pot2 * 2;
}
printf("O numero em decimal e %d\n", xbase10);
return 0;
}
O programa está com erro(s) de lógica.
a) Mostre uma entrada válida para a qual o programa não funciona, a saída
(errada) fornecida pelo programa e a reposta correta. {\em Você não deve
fornecer explicações, apenas a entrada, a saída e a resposta correta}.
b) Escreva um programa em C que resolve o problema. O seu programa
pode ou não estar baseado no programa acima.
SOLUÇÃO de (a).
para a entrada 10 a resposta é 0 e deveria ser 2.
para a entrada 11 a resposta é 15 e deveria ser 3.
para a entrada 100 a resposta é 0 e deveria ser 4.
para a entrada 101 a resposta é 127 e deveria ser 5.
para a entrada 110 a resposta é 0 e deveria ser 6.
para a entrada 111 a resposta é 127 e deveria ser 7.
para a entrada 1000 a resposta é 0 e deveria ser 8.
para a entrada 1001 a resposta é 1023 e deveria ser 9.
Na realidade, se o número binário lido pelo programa termina com 0 então
a resposta é 0. Já se o número binário lido pelo programa termina com 1
então a resposta é ... Bem, quem consegue dizer qual é a resposta???
Mais umas entradas/respostas para ajudar na inspiração:
para a entrada 10001 a resposta é 16383 e deveria ser 17.
para a entrada 10011 a resposta é 16383 e deveria ser 19.
para a entrada 100001 a resposta é 131071 e deveria ser 33.
[...]
SOLUÇÃO de (b)
#include < stdio.h >
/* Dado um numero em binario, converter este numero para base decimal. */
/* Recebe um inteiro, num, corta seu ultimo digito e */
/* devolve este digito como resultado. */
int proxdig (int *num)
{
int res;
res = *num % 10;
*num = *num / 10;
return res;
}
/* Programa principal. */
int main()
{
int xbase2, xbase10, pot2;
printf("Entre com o numero em binario: ");
scanf("%d", &xbase2);
/* Converte o numero lido para a base decimal. */
xbase10 = 0;
pot2 = 1;
while (xbase2 > 0)
{
xbase10 = xbase10 + proxdig(&xbase2) * pot2;
pot2 = pot2 * 2;
}
printf("O numero em decimal e %d\n", xbase10);
return 0;
}
----------------------------------------------------------------
QUESTÃO 3.
Considere o problema: Dados um inteiro n que é potência de 2
(isto é, n é um número no conjunto {1, 2, 4, 8, 16, 32, ...})
e uma seqüência de n números reais, calcular a média
geométrica dos elementos desta seqüência.
[Notação: abaixo escrevemos x^{y} para indicar x elevando a y.]
Lembre-se que a média geométrica de x_1,x_2,...,x_n é dada por
M = (x_1x_2...x_n)^{1/n}
e que para n=2^k esta expressão pode ser calculada como
M = (((((x_1x_2...x_n)^{1/2})^{1/2})^{1/2})...)^{1/2},
onde o 1/2 aparece k vezes na última expressão.
Você deve produzir um programa em C que resolva o problema acima. Para
lhe ajudar, a resposta da questão está nas linhas a seguir. O único
problema é que as linhas do programa não estão necessariamente em ordem.
Você tem duas opções: resolver este quebra-cabeça, numerando as linhas
de acordo com a ordem em que devem aparecer no programa, ou
alternativamente escrever um programa completo para a solução do
problema proposto. Você pode usar a função sqrt(x) para calcular
x^{1/2}, adicionando a linha
#include < math.h >
no início do seu programa. Você NÃO PODE usar qualquer outra função
desta biblioteca.
Indique a seguir a sua opção (marque apenas UMA alternativa):
( ) resolver o quebra-cabeça ( ) escrever um programa completo
( ) } /* final de main */
( ) #include < math.h >
( ) int main() {
( ) #include < stdio.h >
( ) p = 1.0;
( ) /* final do while */
( ) } /* final do for */
( ) double x,p;
( ) while (i>1) {
( ) printf("Media geometrica = %g\n",p);
( ) scanf("%d",&n);
( ) i = n;
( ) return 0;
( ) for (i=0; i < n; i=i+1) {
( ) int n,i;
( ) i = i/2;
( ) p = p*x;
( ) scanf("%lf",&x);
( ) p = sqrt(p);
SOLUÇÃO.
(19) } /* final de main */
( 2) #include < math.h >
( 3) int main() {
( 1) #include < stdio.h >
( 7) p = 1.0;
(16) /* final do while */
(11) } /* final do for */
( 5) double x,p;
(13) while (i > 1) {
(17) printf("Media geometrica = %g\n",p);
( 6) scanf("%d",&n);
(12) i = n;
(18) return 0;
( 8) for (i=0; i < n; i=i+1) {
( 4) int n,i;
(15) i = i/2;
(10) p = p*x;
( 9) scanf("%lf",&x);
(14) p = sqrt(p);
ou melhor
( 1) #include < stdio.h >
( 2) #include < math.h >
( 3) int main() {
( 4) int n,i;
( 5) double x,p;
( 6) scanf("%d",&n);
( 7) p = 1.0;
( 8) for (i=0; i < n; i=i+1) {
( 9) scanf("%lf",&x);
(10) p = p*x;
(11) } /* final do for */
(12) i = n;
(13) while (i > 1) {
(14) p = sqrt(p);
(15) i = i/2;
(16) } /* final do while */
(17) printf("Media geometrica = %g\n",p);
(18) return 0;
(19) } /* final de main */
----------------------------------------------------------------
QUESTÃO 4.
Faça um programa em C que lê um número inteiro n (1 <= n <= 100) e
uma seqüencia com n notas da prova de MAC 2166 e calcula a média
das notas e quantas notas são maiores que a média.
Por exemplo, para a entrada
4
7.5 8.5 9.5 4.5
a saída deve ser
Media = 7.5
No. de notas maiores que a media = 2
SOLUÇÃO.
#include < stdio.h >
#define NMAX 1000
int main()
{
int
n, /* numero de notas a serem lidas */
i, /* indice usado para percorrer o vetor de notas */
cont; /* contado de numero de notas maiores que a media */
double
nota[NMAX], /* vetor para armazenar as notas */
soma, /* soma das notas */
media; /* media das notas */
/* 1. Leia o numero n de notas */
printf("Entre com o numero de notas: ");
scanf("%d", &n);
/* 2. Leia as notas e calcule a soma das notas */
soma = 0;
for (i = 0; i < n; i++)
{
printf("Entre com uma nota: ");
scanf ("%lf", ¬a[i]);
soma = soma + nota[i];
}
/* 3. Calcule a media das notas */
media = soma / n;
printf("Media = %g\n", media);
/* 4. Conte quantas notas sao maiores que a media */
cont = 0;
for (i = 0; i <= n-1; i++)
{
if (nota[i] > media)
{
cont = cont + 1;
}
}
/* 5. Escreva a resposta */
printf("No. de notas maiores que a media = %d\n", cont);
return 0;
}
Last modified: Thu May 23 15:48:44 EST 2002