MAC 2166 Introdu��o � Computa��o para Engenharia
PROVA 2 - 1o. SEMESTRE DE 2001
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
void f1 (int a, int b) {
double x, y;
a = 2 * a + 1;
x = a;
y = x / 2;
b = x / 2;
x = a / 2;
printf("1: %d %d %g %g\n", a, b, x, y);
}
double f2 (int *x, int b) {
double a;
a = *x + b;
*x = a / 2;
b = *x + b;
printf ("2: %d %d %g\n", *x, b, a);
return a;
}
int main() {
int nusp, dig, a, b;
double x;
printf("Digite o seu numero USP: ");
scanf("%d",&nusp);
dig = nusp % 10;
printf("dig = %d\n", dig);
a = dig%4 + 1;
b = 9 - dig%5;
printf ("3: %d %d \n", a, b);
f1 (a, b);
printf("4: %d %d \n", a, b);
a = dig%4 + 1;
b = 9 - dig%5;
printf ("5: %d %d \n", a, b);
x = f2 (&b, a);
printf ("6: %d %d %g \n", a, b, x);
return 0;
}
SOLU��O.
A resposta depende, essencialmente, do �ltimo d�gito do n�mero USP.
Teste com o seu no. USP e compare a resposta.
Digite o seu numero USP 0
dig = 0
3: 1 9
1: 3 1 1 1.5
4: 1 9
5: 1 9
2: 5 6 10
6: 1 5 10
Digite o seu numero USP 1
dig = 1
3: 2 8
1: 5 2 2 2.5
4: 2 8
5: 2 8
2: 5 7 10
6: 2 5 10
Digite o seu numero USP 2
dig = 2
3: 3 7
1: 7 3 3 3.5
4: 3 7
5: 3 7
2: 5 8 10
6: 3 5 10
Digite o seu numero USP 3
dig = 3
3: 4 6
1: 9 4 4 4.5
4: 4 6
5: 4 6
2: 5 9 10
6: 4 5 10
Digite o seu numero USP 4
dig = 4
3: 1 5
1: 3 1 1 1.5
4: 1 5
5: 1 5
2: 3 4 6
6: 1 3 6
Digite o seu numero USP 5
dig = 5
3: 2 9
1: 5 2 2 2.5
4: 2 9
5: 2 9
2: 5 7 11
6: 2 5 11
Digite o seu numero USP 6
dig = 6
3: 3 8
1: 7 3 3 3.5
4: 3 8
5: 3 8
2: 5 8 11
6: 3 5 11
Digite o seu numero USP 7
dig = 7
3: 4 7
1: 9 4 4 4.5
4: 4 7
5: 4 7
2: 5 9 11
6: 4 5 11
Digite o seu numero USP 8
dig = 8
3: 1 6
1: 3 1 1 1.5
4: 1 6
5: 1 6
2: 3 4 7
6: 1 3 7
Digite o seu numero USP 9
dig = 9
3: 2 5
1: 5 2 2 2.5
4: 2 5
5: 2 5
2: 3 5 7
6: 2 3 7
----------------------------------------------------------------
QUEST�O 2.
Os trechos de programa abaixo tem como objetivo calcular o comprimento da
maior palavra em um texto terminado por '.'.
Isto � feito com o aux�lio da fun��o abaixo:
#define TRUE 1
#define FALSE 0
int e_separador (char ch)
{
if (ch==' ' || ch==',' || ch==';' || ch==':' || ch=='\n' || ch=='.')
return TRUE;
else
return FALSE;
}
Esta fun��o devolve TRUE (igual a 1) se o caractere ch � um separador (ou
seja, o caractere � considerado um separador de palavras, no caso pode ser
espa�o em branco, v�rgula, ponto, etc) e FALSE (igual a 0) caso contr�rio (ou
seja, o caractere ch n�o � considerado um separador de palavras). Suponha que
esses s�o os �nicos separadores necess�rios, e portanto a fun��o est� correta.
Suponha tamb�m que as vari�veis max e tam s�o inteiras e tem valor inicial 0
(zero), e que a � uma vari�vel tipo char.
Alguns dos cinco trechos abaixo est�o corretos e outros est�o incorretos.
Indique isso no lugar apropriado e fa�a um breve coment�rio sobre o erro
encontrado ao lado dos trechos que estiverem incorretos ou ao menos mostre
um contra exemplo. Quest�es marcadas incorretas sem justificativa ou com
justificativas �bvias do tipo ``trecho incorreto'', ser�o consideradas
erradas.
Nesta quest�o, duas respostas erradas anulam uma certa. Respostas em branco
n�o ser�o consideradas erradas.
a = ','; /* virgula */ a) C ( ) I (x)
while (a != '.') {
scanf ("%c",&a); falta tam=0 no inicio de novas
if (e_separador (a) == FALSE) palavras
tam ++;
else
if (tam > max)
max = tam;
}
printf ("Tamanho da palavra mais longa: %d\n", max);
SOLU��O. Incorreto. Faltou um tam = 0 no inicio de novas palavras
a = ','; /* virgula */ b) C (x) I ( )
while (a != '.') {
if (e_separador (a) == FALSE)
tam ++;
else
tam = 0;
if (tam > max)
max = tam;
scanf ("%c",&a);
}
printf ("Tamanho da palavra mais longa: %d\n", max);
SOLU��O. Correto.
for (a = ','; a != '.'; tam ++) { c) C (x) I ( )
scanf ("%c",&a);
if (e_separador (a) == TRUE ) {
if (tam >= max)
max = tam;
tam = -1;
}
}
printf ("Tamanho da palavra mais longa: %d\n", max);
SOLU��O. Correto.
a = ','; /* virgula */ d) C ( ) I (x)
while (a != '.') { tamanho � sempre zero
scanf ("%c",&a);
if (e_separador (a) == FALSE)
tam++;
else
if (tam > max)
max = tam;
tam = 0;
scanf("%c",&a);
}
printf ("Tamanho da palavra mais longa: %d\n", max);
SOLU��O. tamanho � sempre zero.
scanf ("%c",&a); e) C ( ) I (x)
while (a != '.') { n�o funciona quando a maior palavra
if (e_separador (a) == TRUE) { � a �ltima.
if (tam >= max)
max = tam;
tam = 0;
}
else tam++;
scanf ("%c",&a);
}
printf ("Tamanho da palavra mais longa: %d\n", max);
SOLU��O. N�o funciona se a palavra maior � a �ltima.
----------------------------------------------------------------
QUEST�O 3.
Escreva a fun��o cos que recebe um n�mero real x (�ngulo em radianos) e
calcula o co-seno de x, atrav�s da s�rie
cos(x) = 1 - x2/2! + x4/4! - x6/6! + ... + (-1)k x2k/(2k)! + ...
incluindo todos os termos at� que
x2k/(2k)! < 0.00001
Inclua tamb�m na soma o �ltimo termo calculado.
O prot�tipo dessa fun��o deve ser
double cos (double x);
SOLU��O.
double cos (double x)
{
double epsilon = 0.00001, termo = 1.0, cosx = 1.0;
int k;
for (k=1; termo >= epsilon || -termo >= epsilon; k++)
{
termo = -termo*x*x/((2*k-1)*2*k);
cosx = cosx + termo;
}
return cosx;
}
----------------------------------------------------------------
QUEST�O 4.
Utilizando obrigatoriamente a fun��o da quest�o anterior (se voc� n�o a fez,
pode assumir que ela j� existe, e com prot�tipo igual a da quest�o anterior),
fa�a um programa que leia dois n�meros inteiros m e n e que imprima um
``gr�fico'' do co-seno com m linhas e n colunas (ou seja, a largura de cada
linha chegar� a no m�ximo n caracteres).
Para gerar o gr�fico, o seu programa deve chamar a fun��o coseno m vezes
com valores de x variando uniformemente entre 0 e 12.57 (ou seja, no
intervalo [0, 4*PI]).
Esse gr�fico deve ser gerado utilizando-se chamadas � fun��o
printf ("*"); e a sua apar�ncia deve ser similar ao seguinte
exemplo onde n = 30 e m = 40 (note que o gr�fico tem 40 linhas).
******************************
*****************************
**************************
***********************
*******************
**************
*********
*****
**
*
***
*******
************
****************
*********************
*************************
****************************
*****************************
*****************************
****************************
*************************
*********************
****************
***********
*******
***
*
**
*****
*********
**************
*******************
***********************
***************************
*****************************
*****************************
Nota: lembre-se que o valor da fun��o co-seno varia entre -1 e 1. Portanto,
seu programa deve imprimir um n�mero de `*' proporcional a 1 + cos(x). O
gr�fico come�a com a linha representando cos(0) e termina com a linha
representando cos(4*pi).
SOLU��O.
#include
double cos (double x);
int main()
{
int i, j, n, m;
double x, y, incremento;
printf("entre com os valores de m e n:");
scanf("%d %d", &m, &n);
incremento = 12.57/(m-1);
x = 0.0;
for (j = 0; j < m; j++)
{
y = n*(cos(x) + 1)/2;
for (i = 0; i < (int) y; i++)
printf("*");
printf ("\n");
x = x + incremento;
}
return 0;
}
Last modified: Tue May 14 09:37:49 EST 2002