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; }