Buscar

Introdução à Programação - Poli - P2 - em C - 2001

Prévia do material em texto

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
	MAC 2166 Introdução à Computação para Engenharia
	PROVA 2 - 1o. SEMESTRE DE 2001

Continue navegando