MAC 2166 Introdução à Computação para Engenharia
PROVA 3
QUESTÃO 1 (VERSÃO A).
Simule a execução do programa abaixo, destacando a saída do programa.
A saída do programa é tudo que resulta dos comandos printf. Como
entrada use os seguintes dados:
13 6 8 13 14 7 10 0
#include < stdio.h >
#define MAX 10
int main()
{
int aux, i, n, comeco, fim, vet[MAX];
n = 0;
scanf("%d", &(vet[n]));
while(vet[n] != 0){
n++;
scanf("%d", &(vet[n]));
}
printf("Vetor inicial: ");
for( i = 0; i <= n; i++) printf("%d ", vet[i]);
printf("\n");
comeco = 0;
fim = n-1;
while (comeco < fim){
while (vet[comeco] % 2 == 0 && comeco < fim)
comeco = comeco + 1;
while (vet[fim] % 2 == 1 && comeco < fim)
fim = fim - 1;
if (comeco < fim){
printf("Troca %d com %d\n", comeco, fim);
aux = vet[comeco];
vet[comeco] = vet[fim];
vet[fim] = aux;
}
}
printf("Vetor modificado: ");
for( i = 0; i <= n; i++) printf("%d ", vet[i]);
printf("\n");
return (0);
}
SOLUÇÃO.
Vetor inicial: 13 6 8 13 14 7 10 0
Troca 0 com 6
Troca 3 com 4
Vetor modificado: 10 6 8 14 13 7 13 0
----------------------------------------------------------------
QUESTÃO 1 (VERSÃO B).
Simule a execução do programa abaixo, destacando a saída do programa.
A saída do programa é tudo que resulta dos comandos printf. Como
entrada use os seguintes dados:
10 7 14 13 8 6 13 0
#include < stdio.h >
#define MAX 10
int main()
{
int aux, i, n, comeco, fim, vet[MAX];
n = 0;
scanf("%d", &(vet[n]));
while(vet[n] != 0){
n++;
scanf("%d", &(vet[n]));
}
printf("Vetor inicial: ");
for( i = 0; i <= n; i++) printf("%d ", vet[i]);
printf("\n");
comeco = 0;
fim = n-1;
while (comeco < fim){
while (vet[comeco] % 2 == 1 && comeco < fim)
comeco = comeco + 1;
while (vet[fim] % 2 == 0 && comeco < fim)
fim = fim - 1;
if (comeco < fim){
printf("Troca %d com %d\n", comeco, fim);
aux = vet[comeco];
vet[comeco] = vet[fim];
vet[fim] = aux;
}
}
printf("Vetor modificado: ");
for( i = 0; i <= n; i++) printf("%d ", vet[i]);
printf("\n");
return (0);
}
SOLUÇÃO.
Vetor inicial: 10 7 14 13 8 6 13 0
Troca 0 com 6
Troca 2 com 3
Vetor modificado: 13 7 13 14 8 6 10 0
----------------------------------------------------------------
QUESTÃO 2.
Dada uma matriz real A com m linhas e n colunas, dizemos que uma posição (i,j)
da matriz é um l-máximo se for o máximo da linha i, ou seja, se
A[i][j] >= A[i][k] , para todo k=0,...,n-1.
De forma análoga, podemos definir que uma posição da matriz é um
\textbf{c-máximo} se for o elemento máximo da sua coluna.
Exemplos: Considere a matriz abaixo:
13 6 4 28 7.5 1.05
4 0 0.3 -13 12.3 128.1
-1 8 2 -1.9 12 2
-2 7 5 0 4 12
o elemento 5 na posição (3,2) é um c-máximo;
o elemento 12 na posição (2,4) é um l-máximo;
o elemento 28 na posição (0,3) é um lc-máximo e
o elemento 4 na posição (1,0) não é um máximo.
Faça um programa em C que leia inteiros positivos m e n (onde 1 <= m <= 100 e
1 <= n <= 100), uma matriz real A com m linhas e n colunas, um inteiro k e em
seguida lê k pares de inteiros correspondentes a posições da matriz A e, para
cada posição indica se esta é um l-máximo, c-máximo, lc-máximo ou não é um
máximo.
SOLUÇÃO.
#include < stdio.h >
#define MMAX 100
#define NMAX 100
#define FALSE 0
#define TRUE 1
void le_matriz (double mat[MMAX][NMAX], int *no_linhas, int *no_colunas)
{
int m, n, i, j;
printf("Entre com o numero de linhas e colunas da matriz: ");
scanf("%d %d", &m, &n);
for (i = 0; i < m ; i++)
{
/* Leitura de i-esima linha da matriz */
for (j = 0; j < n; j++)
{
printf("Entre com o elemento da posicao (%d,%d): ", i, j);
scanf("%lf", &mat[i][j]);
}
}
*no_linhas = m;
*no_colunas = n;
}
/*
* Funcao l_maxima devolve TRUE se o elemento na posica (linha,coluna) e' l-maximo
* devolve FALSE caso contraio.
* no_colunas indica o numero de colunas da matriz mat.
*/
int l_maximo (double mat[MMAX][NMAX], int no_colunas, int linha, int coluna)
{
int j;
for (j = 0; j < no_colunas; j++)
{
if (mat[linha][j] > mat[linha][coluna])
return FALSE;
}
return TRUE;
}
/*
* Funcao c_maxima devolve TRUE se o elemento na posica (linha,coluna) e' l-maximo
* devolve FALSE caso contraio.
* no_linhas indica o numero de linhas da matriz mat.
*/
int c_maximo (double mat[MMAX][NMAX], int no_linhas, int linha, int coluna)
{
int i;
for (i = 0; i < no_linhas; i++)
{
if (mat[i][coluna] > mat[linha][coluna])
return FALSE;
}
return TRUE;
}
int main()
{
int
m, /* numero de linhas da matriz dada */
n, /* numero de colunas da matriz dada */
i,
k, /* numero de posicoes a serem verificadas */
linha, coluna, /* para guardar uma posicao da matriz */
l_max, /* indica se o elemnto de uma posicao (linha,coluna) e' l-maximo */
c_max; /* indica se o elemento de uma posicao (linha,coluna) e' c-maximo */
double a[MMAX][NMAX];
/* 1. Leia a matriz */
le_matriz(a, &m, &n);
/* 2. Leia o numero de pares */
printf("Entre com o numero de posicoes: ");
scanf ("%d", &k);
/* 3. Verifique se uma dada posicao e' l-maxima, c-maxima ou lc-maxima */
for (i = 1; i <= k; i++)
{
/* 3.1. Le uma posicao da matriz */
printf("Entre com a %d posicao a ser verificada : ", i);
scanf("%d %d", &linha, &coluna);
/* 3.2. Verifica se o elemento na posicao (linha,coluna) e' l-maximo */
l_max = l_maximo(a, n, linha, coluna);
/* 3.3. Verifica se o elemento na posicao (linha,coluna) e' c-maximo */
c_max = c_maximo(a, m, linha, coluna);
/* 3.4 Escreve o resposta. */
printf("o elemento %g da posicao (%d,%d) ",a[linha][coluna], linha, coluna);
if (l_max == TRUE && c_max == TRUE)
printf ("e' lc-maximo.\n");
else if (l_max == TRUE)
printf ("e' l-maximo.\n");
else if (c_max == TRUE)
printf ("e' c-maximo.\n");
else
printf ("nao e' maximo.\n");
}
return 0;
}
----------------------------------------------------------------
QUESTÃO 3.
Notação: abaixo, a^b significa a elevado a b.
Escreva a função cos(x) que receba dois parâmetros de entrada: x e epsilon,
que definem o ângulo e a precisão desejada. Utilize a série abaixo para
calcular o cos(x):
cos(x) = 1- x^2/2! + x^4/4! - x^6/6! - ... + (-1)^k x^{2k}/(2k)! + ...
A função deve retornar a aproximação do valor do cosseno do ângulo x até o que
o termo x^{2k}/(2k)! seja menor que epsilon (INCLUA também esse último termo
x^{2k}(2k)! < epsilon no cálculo do cosseno).
SOLUÇÃO.
double cosseno(double x, double epsilon)
{
double cosx = 1, termo = 1;
int k = 1;
while (termo <= -epsilon || epsilon <= termo)
{
termo = -termo * x * x / (k * (k+1));
k = k + 2;
cosx = cosx + termo;
}
return cosx;
}
----------------------------------------------------------------
QUESTÃO 4.
Deseja-se desenvolver um programa em C que integre numericamente a função
cosseno, sobre o intervalo (a,b), onde -pi/2 <= a < b <= pi/2. Para isso
deve-se utilizar o método do trapézio, dado por:
integral da função cosseno no intervalo (a,b)=
h/2 (f(a) + 2 f(a+h) + 2 f(a + 2 h) +...+ 2 f(a + (n-1) h) + f(b)),
onde:
f(x) = cos (x);
a e b definem o intervalo de integração, a < b;
n - é o número de subintervalos, n >= 1;
h - é constante e determinada por h = (b-a)/n.
Escreva um programa em C para calcular a integral da função cosseno no
intervalo (a,b) utilizando n trapézios. Seu programa deve ler quatro valores:
a, b, n e epsilon. Os 3 primeiros valores a, b e n definem o intervalo e
o número de trapézios usados para integração, e o valor epsilon define a
precisão a ser utilizada no cálculo dos cossenos. Ao final o seu programa deve
imprimir o valor da integral calculada através do método dos trapézios,
utilizando OBRIGATORIAMENTE a função cos definida na questão anterior, mesmo
que você não a tenha escrito.
SOLUÇÃO.
#include < stdio.h >
int main()
{
double
a, b, /* Define o intervalo (a,b) de integracao. */
epsilon, /* Precisao desejada */
h, /* medida da base do trapezio */
integral; /* valor da integral do cosseno no intervalo (a,b) */
int
i,
n; /* Numero de intervalos/trapezios. Dev ser >= 1. */
printf("Calculo da funcao cosseno atraves do metodo dos trapezios.\n");
/* 1. Leia dos dados */
printf ("Entre com o intervalo de integracao: ");
scanf ("%lf %lf", &a, &b);
printf ("Entre com o numero de trapezios: ");
scanf ("%d", &n);
printf ("Entre com a precisao epsilon desejada: ");
scanf ("%lf", & epsilon);
/* 2. Calcule a base dos trapezios. */
h = (b-a) / n;
/* 3. Calcule a integral */
integral = (cosseno(a, epsilon)+ cosseno(b, epsilon))/2;
for (i = 1; i < n; i++)
{
integral = integral + cosseno(a+i*h,epsilon);
}
integral = h * integral;
/* 4. Escreva o valor da integral. */
printf("Valor da integral da funcao cosseno no intervalo (%g,%g) "
"com %d trapezios e precisao %g = %g.\n", a, b, n, epsilon, integral);
return 0;
}
Last modified: Wed Jul 3 12:33:50 BRT 2002