Departamento de Ciência da
Computação - IME - USP
cos(x) = 1 - x2/2! + x4/4! - x6/6! + . . . + (-1)k x2k/(2k)! + . . .Inclua na aproximação todos os termos da série até o primeiro de valor absoluto (ou seja, módulo) menor do que epsilon. Inclua também na soma esse último termo calculado.
/*
* Solucao 1: curta e grossa
*
*/
#include <stdio.h>
int main()
{
float x;
float epsilon; /* precisao desejada */
float termo; /* termo da serie */
float cosx; /* aproximacao do cosseno de x */
int k;
printf("Digite x e epsilon: ");
scanf("%f %f", &x, & epsilon);
termo = 1;
cosx = 1;
k = 1;
while (termo <= -epsilon || epsilon <= termo)
{
termo = -termo*x*x/((2*k-1)*2*k);
cosx = cosx + termo;
k = k + 1;
}
printf("cos(x) = %f\n", cosx);
return 0;
}
Exemplo:
Para m = 5, n = 8,
| 0 | 1 | 2 | 3 | 4 | 5 | ... | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ... | |||||
| v | 4 | -7 | 24 | 5 | 8 | ... | ... | w | 4 | 6 | 4 | -7 | 24 | 5 | 8 | -7 | ... |
/*
* Solucao:
*/
#define MAX 1000
#define TRUE 1
#define FALSE 0
int ocorre(int m, int v[MAX], int n, int w[MAX], int i)
{
int e_sub; /* indica se v[0..m-1] == w[i..i+m-1] */
int j; /* usado como indice dos vetor v e w */
/* verifique se w[i+m-1] e uma posicao valida do vetor w */
if (i+m-1 > n)
e_sub = FALSE;
else
e_sub = TRUE;
/* verifique se v[0..m-1] == w[i..i+m-1] */
j = 0;
while (j < m && e_sub == TRUE)
{
if (v[j] != w[i+j]) e_sub = FALSE;
j = j + 1;
}
return e_sub;
}
(b) Escreva um programa em C que lê
O seu programa deve utilizar a função ocorre do item (a). Caso você não tenha feito o item (a) escreva o protótipo da função ocorre antes da resolução deste item.
Exemplos:
Entrada: 5 4 -7 24 5 8 8 4 6 4 -7 24 5 8 -7 Saída: SIM. A 1a. sequencia ocorre na 2a. Entrada: 3 1 2 3 4 1 2 2 3 Saída: NAO. A 1a. sequencia nao ocorre na 2a. | Entrada: 1 7 4 10 -2 -2 7 Saída: SIM. A 1a. sequencia ocorre na 2a. Entrada: 3 1 2 3 4 3 2 1 2 Saída: NAO. A 1a. sequencia nao ocorre na 2a. |
/*
* Solucao:
*/
#include <stdio.h>
#define MAX 1000
#define TRUE 1
#define FALSE 0
int main() {
int m; /* numero de elementos na 1a. sequencia */
int v[MAX]; /* numeros na primeira sequencia */
int n; /* numero de elementos na 2a. sequencia */
int w[MAX]; /* numeros na segunda sequencia */
int i; /* usada como indice dos vetores */
int e_sub; /* indica se a 1a. sequencia e' subsequencia da 2a. */
/* 1. leia o numero de elementos da 1a. sequencia */
printf("Digite m: ");
scanf("%d", &m);
/* 2. leia a 1a. sequencia */
for (i = 0; i < m; i++)
{
printf("Entre com o %io. numero da 1a. sequencia: ", i+1);
scanf("%d", &v[i]);
}
/* 3. leia o numero de elementos da 2a. sequencia */
printf("Digite n: ");
scanf("%d", &n);
/* 4. leia a 2a. sequencia */
for (i = 0; i < n; i++)
{
printf("Entre com o %io. numero da 2a. sequencia: ", i+1);
scanf("%d", &w[i]);
}
/* 5. procure uma ocorrencia de v[0..m-1] em w[0..n-1] */
e_sub = FALSE;
i = 0;
while (i <= n-m && e_sub == FALSE)
{
e_sub = ocorre(m,v,n,w,i);
i = i + 1;
}
/* 6. escreva a resposta */
if (e_sub == TRUE)
{
printf("SIM. v[0..%d] == w[%d..%d].\n", m-1, i-1, i+m-2);
}
else
{
printf("NAO. A 1a. sequencia nao e subsequencia da 2a.\n");
}
return 0;
}
Exemplo:
Para n = 3 devemos ter
| A | 0 | 1 | 2 | 3 |
| 0 | 1 | 0 | 0 | ... |
| 1 | 0 | 1 | 0 | ... |
| 2 | 0 | 0 | 1 | ... |
| 3 | ... | ... | ... | ... |
/*
* Solucao:
*
*/
#define MAX 100
void identidade (int n, int A[MAX][MAX])
{
int i; /* indice de linha */
int j; /* indice de coluna */
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i == j)
A[i][j] = 1;
else
A[i][j] = 0;
}
(b) Escreva uma função multimat que recebe como parâmetros
Exemplo:
Para m=2, n=3, p=2
| A | 0 | 1 | 2 | 3 | B | 0 | 1 | 2 | |||
| 0 | 1 | 0 | 2 | ... | 0 | 1 | 0 | ... | |||
| 1 | -1 | 2 | 1 | ... | 1 | -1 | 1 | ... | |||
| 2 | ... | ... | ... | ... | 2 | 3 | 1 | ... | |||
| 3 | ... | ... | ... |
| C | 0 | 1 | 2 |
| 0 | 7 | 2 | ... |
| 1 | 0 | 3 | ... |
| 2 | ... | ... | ... |
/*
* Solucao: A matriz C recebe o produto de A por B; C <- A x B
*
*/
void multimat (int m, int n, int p,
int C[MAX][MAX], int A[MAX][MAX], int B[MAX][MAX])
{
int i;
int j;
int k;
int prod[MAX][MAX]; /* matriz auxiliar para guardar o
produto */
for (i = 0; i < m; i++)
for (j = 0; j < p; j++)
{
/* faz o produto da linha i de A pela coluna j de B */
prod[i][j] = 0;
for (k = 0; k < n; k++)
prod[i][j] = prod[i][j] + A[i][k]*B[k][j];
}
for (i = 0; i < m; i++)
for (j = 0; j < p; j++)
C[i][j] = prod[i][j];
}
(c) Escreva um programa em C que lê:
O seu programa deve utilizar a função identidade do item (a) e a função multmat do item (b). Caso você não tenha feito o item (a) escreva o protótipo da função identidade antes da resolução deste item. Caso você não tenha feito o item (b) escreva o protótipo da função multimat antes da resolução deste item.
Exemplos:
Para n = 3 e
| A | 0 | 1 | 2 | 3 |
| 0 | 1 | 0 | 2 | ... |
| 1 | -1 | 2 | 1 | ... |
| 2 | 0 | -1 | 1 | ... |
| 3 | ... | ... | ... | ... |
A elevada a 0: 1 0 0 0 1 0 0 0 1 | A elevada a 1: 1 0 2 -1 2 1 0 -1 1 | A elevada a 2: 1 -2 4 -3 3 1 1 -3 0 | A elevada a 3: 3 -8 4 -6 5 -2 4 -6 -1 |
/*
* Solucao:
*
*/
#include <stdio.h>
#define MAX 100
int main()
{
int A[MAX][MAX];
int n; /* dimensao da matriz */
int k; /* potencia de A a ser calculada */
int Ai[MAX][MAX]; /* usada para armazenar A^i */
int i;
int j;
/* 0. leia a dimensao da matriz A */
printf("Digite a dimensao da matriz: ");
scanf("%d", &n);
/* 1. leia a matriz A */
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
printf("Digite o elemento (%d,%d) da matriz: ", i,j);
scanf("%d", &A[i][j]);
}
/* 2. leia o valor da potencia a ser calculada */
printf("Digite k: ");
scanf("%d", &k);
/* 3. inicialize Ai com a matriz identidade */
identidade(n, Ai); /* ai <- 1 */
for (i = 0; i < k; i++)
{
multimat(n, n, n, Ai, Ai, A); /* ai <- ai * a */
}
/* 4. imprima Ai */
printf("A elevada a %d:\n", k);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(" %3d", Ai[i][j]);
}
printf("\n");
}
return 0;
}