Baixe o app para aproveitar ainda mais
Prévia do material em texto
Departamento de Ciência da Computação - IME - USP MAC2166 Introdução à Computação Prova 3 QUESTÃO 1 Simule a execução do programa abaixo, destacando a sua saída. A saída do programa consiste em tudo que resulta dos comandos printf's e o número digitado pelo usuário. O dado de entrada (variável nusp) é o seu número USP. #include <stdio.h> void f1 (int v[4], int k) { int i; k= 2; for (i=0; i<4; i++) v[i] = v[i] / k; } void f2 (int m[2][2], int v[4]) { int i, j; for (i=0; i<2; i++) for (j=0; j<2; j++) m[i][j] = v[2*i+j]; } int f3 (int *k, int *j) { int i; i = 1; *j = 1; *k = *k + i; return *k; } int main () { int nusp, k, n, i, j, d, a[2][2], v[4]; char c; printf ("Entre com seu no. USP: "); /* na linha abaixo entre com o seu numero USP */ scanf ("%d", &nusp); printf("nusp=%d\n", nusp); k = nusp / 10; n = k % 5; printf("1: k=%d n=%d\n", k, n); if (n > 4) n = 5; for (i = 0; i < 4; i++) v[i] = i + n; printf("2: n=%d v=(%d %d %d %d) \n", n, v[0], v[1], v[2], v[3]); f1(v, n); printf("3: n=%d v=(%d %d %d %d) \n", n, v[0], v[1], v[2], v[3]); for (i=0; i<4; i++) v[i] = i+n; printf("4: n=%d v=(%d %d %d %d) \n", n, v[0], v[1], v[2], v[3]); f2(a,v); printf("5: %d %d\n", a[0][0], a[0][1]); printf("6: %d %d\n", a[1][0], a[1][1]); i = 2; j = 3; v[i] = f3(&v[j], &j); printf("7: %d %d %d %d \n", v[0],v[1],v[2],v[3]); c = 'a'+n+1; printf("8: %c\n", c); return 0; } SOLUÇÃO A resposta depende do resto da divisão do segundo dígito menos significativo do seu número USP por 5. Por exemplo, para no. USP = 1234569 o dígito 6 é o segundo menos significativo e o resultado da simulação depende do número 6%5 == 1, ou seja, depende do valor de (nusp/10)%5. Teste com o seu no. USP e compare a resposta. (0) (nusp/10)%5 == 0. Veja os 2 exemplos abaixo. Entre com seu no. USP: 1234509 nusp=1234509 1: k=123450 n=0 2: n=0 v=(0 1 2 3) 3: n=0 v=(0 0 1 1) 4: n=0 v=(0 1 2 3) 5: 0 1 6: 2 3 7: 0 1 4 4 8: b Entre com seu no. USP: 1234559 nusp=1234559 1: k=123455 n=0 2: n=0 v=(0 1 2 3) 3: n=0 v=(0 0 1 1) 4: n=0 v=(0 1 2 3) 5: 0 1 6: 2 3 7: 0 1 4 4 8: b (1) (nusp/10)%5 == 1. Veja os 2 exemplos abaixo. Entre com seu no. USP: 1234519 nusp=1234519 1: k=123451 n=1 2: n=1 v=(1 2 3 4) 3: n=1 v=(0 1 1 2) 4: n=1 v=(1 2 3 4) 5: 1 2 6: 3 4 7: 1 2 5 5 8: c Entre com seu no. USP: 1234569 nusp=1234569 1: k=123456 n=1 2: n=1 v=(1 2 3 4) 3: n=1 v=(0 1 1 2) 4: n=1 v=(1 2 3 4) 5: 1 2 6: 3 4 7: 1 2 5 5 8: c (2) (nusp/10)%5 == 2. Veja os 2 exemplos abaixo. Entre com seu no. USP: 1234529 nusp=1234529 1: k=123452 n=2 2: n=2 v=(2 3 4 5) 3: n=2 v=(1 1 2 2) 4: n=2 v=(2 3 4 5) 5: 2 3 6: 4 5 7: 2 3 6 6 8: d Entre com seu no. USP: 1234579 nusp=1234579 1: k=123457 n=2 2: n=2 v=(2 3 4 5) 3: n=2 v=(1 1 2 2) 4: n=2 v=(2 3 4 5) 5: 2 3 6: 4 5 7: 2 3 6 6 8: d (3) (nusp/10)%5 == 3. Veja os 2 exemplos abaixo. Entre com seu no. USP: 1234539 nusp=1234539 1: k=123453 n=3 2: n=3 v=(3 4 5 6) 3: n=3 v=(1 2 2 3) 4: n=3 v=(3 4 5 6) 5: 3 4 6: 5 6 7: 3 4 7 7 8: e Entre com seu no. USP: 1234589 nusp=1234589 1: k=123458 n=3 2: n=3 v=(3 4 5 6) 3: n=3 v=(1 2 2 3) 4: n=3 v=(3 4 5 6) 5: 3 4 6: 5 6 7: 3 4 7 7 8: e (4) (nusp/10)%5 == 4. Veja os 2 exemplos abaixo. Entre com seu no. USP: 1234549 nusp=1234549 1: k=123454 n=4 2: n=4 v=(4 5 6 7) 3: n=4 v=(2 2 3 3) 4: n=4 v=(4 5 6 7) 5: 4 5 6: 6 7 7: 4 5 8 8 8: f Entre com seu no. USP: 1234599 nusp=1234599 1: k=123459 n=4 2: n=4 v=(4 5 6 7) 3: n=4 v=(2 2 3 3) 4: n=4 v=(4 5 6 7) 5: 4 5 6: 6 7 7: 4 5 8 8 8: f QUESTÃO 2 Considere o seguinte fragmento de programa: #include <math.h> #define MAX 100 #define PI 3.141592654 float oscilador (int n, int R, float freq) { return sin(2*PI*freq*n/R); } (a) Escreva uma função somaosciladores que recebe dois inteiros n e R, um inteiro M <= MAX, um vetor f contendo os reais f0,. . .,fM-1 e um vetor a contendo os reais a0,. . .,aM-1, e devolve o valor da expressão a0 sin (2 PI f0 n/ R) + a1 sin (2 PI f1 n/ R) + . . . + aM-1 sin (2 PI fM-1 n/ R) Sua função deve utilizar a função oscilador definida acima. SOLUÇÃO /* * Solucao: */ #define MAX 100 float oscilador (int n, int R, float freq); float somaosciladores(int n, int R, int M, float f[MAX], float a[MAX]) { float soma = 0; int i; for (i = 0; i < M; i++) soma = soma + a[i]*oscilador(n, R, f[i]); return soma; } (b) Escreva uma função com protótipo void processaevento (int N, int R, int M, float f[MAX], float a[MAX], float beta_inicial, float beta_final); que recebe como parâmetros um inteiro N, um inteiro R, um inteiro M <= MAX, um vetor f contendo os reais f0,. . .,fM-1, um vetor a contendo os reais a0,. . .,aM-1 e dois reais beta_inicial e beta_final, e escreve na tela uma lista de N amostras (valores reais) dadas pela expressão beta(n) × (a0 sin (2 PI f0 n/ R) + a1 sin (2 PI f1 n/ R) + . . . + aM-1 sin (2 PI fM-1 n/ R)) para os valores n=0,. . .,N-1. Nesta expressão, beta(n) é o valor linearmente interpolado entre beta_inicial e beta_final, e é dado pela fórmula beta(n)=(1-n/N)beta_inicial+ (n/N) beta_final}. Você deve utilizar a função somaosciladores do item (a), mesmo que não a tenha feito. Se você não a fez, escreva o seu protótipo antes da resolução deste item. SOLUÇÃO /* * Solucao: */ float somaosciladores (int n, int R, int M, float f[MAX], float a[MAX]); void processaevento(int N, int R, int M, float f[MAX], float a[MAX], float beta_inicial, float beta_final) { float betan; int n; for (n = 0; n < N; n++) { betan=(1-(float)n/N)*beta_inicial+(float)n/N*beta_final; printf("%f\n",betan*somaosciladores(n, R, M, f, a)); } } (c) Escreva um programa que leia do teclado um inteiro positivo E que representa o número de eventos, um inteiro positivo R que representa a taxa de amostragem e, depois, para cada evento j=0,. . ., E-1, leia um inteiro N que representa o número de amostras do evento j, um inteiro positivo M <= MAX que representa o número de osciladores do evento j, uma lista de M números reais f0,. . .,fM-1 e outra lista de M números reais a0,. . . ,aM-1 que representam freqüências e amplitudes de cada oscilador no evento j, bem como dois números reais beta_inicial e beta_final que representam os valores inicial e final do envelope do evento j. Seu programa deve imprimir na tela a lista de N amostras reais relativas a este evento. Você deve utilizar a função processaevento do item (b), mesmo que não a tenha feito. SOLUÇÃO /* * Solucao: */ #include <stdio.h> #define MAX 100 int main() { int E, M, R, N, j, i; float f[MAX], a[MAX], beta_inicial, beta_final; scanf("%d %d", &E, &R); for (j = 0; j < E; j++) { scanf("%d %d", &N, &M); for (i = 0; i < M; i++) scanf("%f", &f[i]); for (i = 0; i < M; i++) scanf("%f", &a[i]); scanf("%f %f", & beta_inicial, & beta_final); processaevento(N, R, M, f, a, beta_inicial, beta_final); } return 0; } QUESTÃO 3 (a) Escreva uma função busca que recebe como parâmetros um inteiro x, dois inteiros m e n, 1 <= m <= 10, 1 <= n <= 10, uma matriz inteira Am×n e um índice de linha i, 0 <= i < m. Sua função deve devolver -1 se x não aparece na linha i da matriz A e, caso contrário, deve devolver o menor j tal que A[i][j]=x e 0 <= j < n. SOLUÇÃO /* * Solucao: * */ int busca (int x, int n, int m, int A[10][10], int i) { int j; int resposta; j = 0; resposta = -1; while (j < n && resposta == -1) if (A[i][j] == x) resposta = j else j = j + 1; return resposta; } (b) Escreva uma função com protótipoint ultimo (int t, int v[100], int m, int n, int A[10][10], int i, int *j); que recebe como parâmetros de entrada um inteiro t <= 100, um vetor v contendo os inteiros diferentes v0,. . .,vt-1, dois inteiros m e n, com 1 <= m <= 10, 1 <= n <= 10, uma matriz Am×n contendo inteiros diferentes, onde cada um de seus elementos aparece entre v0,. . .,vt- 1, um inteiro i, com 0 <= i < m, indicando uma linha da matriz A. Sua função deve devolver o maior k, 0 <= k < t, tal que vk aparece na linha i da matriz A. Além disso, sua função deve colocar em *j o índice da coluna tal que A[i][*j] = vk e 0 <= *j < n. Você deve utilizar a função busca do item (a), mesmo que não a tenha feito. Se você não a fez, escreva o seu protótipo antes da resolução deste item. Exemplo: Para t = 16, 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... v 11 17 50 10 14 99 80 33 18 42 15 34 72 51 45 35 ... m = 3, n = 4, A 0 1 2 3 0 15 35 51 72 1 17 99 18 10 2 45 34 11 80 a função deve devolver 8 e *j deve receber 2. SOLUÇÃO /* * Solucao 1: * */ int ultimo (int t, int v[100], int m, int n, int A[10][10], int i, int *j){ int k; /* procura o último elemento de v que aparece na linha i */ k = t-1; *j = busca(v[k], n, m, A, i); while (*j == -1) { k = k - 1; *j = busca(v[k], n, m, A, i); } return k; } /* * Solucao 2: * */ int ultimo (int t, int v[100], int m, int n, int A[10][10], int i, int *j) { int k, aux, resp; for (k = 0; k < t; k++) { aux = busca(v[k], n, m, A, i); if (aux != -1) { *j = aux; resp = k; } } return resp; } (c) Escreva um programa em C que leia dois inteiros m e n tais que 1 <= m <= 10, 1 <= n <= 10, uma matriz inteira BINGOm × n, representando uma cartela de bingo: os números armazenados na matriz BINGO são inteiros entre 1 e 100, todos diferentes, e um vetor SORTE com 100 números inteiros, contendo todos os inteiros de 1 a 100, que representa a ordem em que os números foram sorteados, e que imprima o índice da primeira linha da matriz BINGO a ser preenchida, em que sorteio ela foi preenchida e qual o último elemento da linha que foi sorteado. No seu programa, você deve utilizar a função ultimo do item (b), mesmo que não a tenha feito. Se você não a fez, escreva o seu protótipo antes da resolução deste item. Exemplo Para m = 3, n = 4 e BINGO 0 1 2 3 0 15 35 51 72 1 17 99 18 10 2 45 34 11 80 e 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... SORTE11 17 50 10 14 99 80 33 18 42 15 34 72 51 45 35 ... A linha 1 foi a primeira preenchida. O últim elemento sorteado da linha foi o 18, que foi o 9-ésimo número sorteado. SOLUÇÃO /* * Solucao 1: * */ #include <stdio.h> int main() { int bingo[10][10], sorte[100], m, n, i, j, min, ult, lin, col; scanf("%d %d", &m, &n); for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &bingo[i][j]); for (i = 0; i < 100; i++) scanf("%d", &sorte[i]); /* procura a linha que é preenchida primeiro */ min = 100; for (i = 0; i < m; i++) { ult = ultimo(100, sorte, i, m, n, bingo, &j); if (ult < min) { min = ult; lin = i; col = j; } } printf("A linha %d foi a primeira preenchida!\n", lin); printf("O ultimo elemento sorteado da linha foi o %d," " que foi o %d-esimo numero sorteado.\n", bingo[lin][col], min+1); return 0; } /* * Solucao 2: Identica a solucao 1. * */ #include <stdio.h> int main() { int bingo[10][10], sorte[100], m, n, i, j, min, ult, lin; scanf("%d %d", &m, &n); for (i = 0; i < m; i++) for (j=0; j< n; j++) scanf("%d", &bingo[i][j]); for (i = 0; i < 100; i++) scanf("%d", &sorte[i]); /* procura a linha que é preenchida primeiro */ min = 100; for (i = 0; i < m; i++) { ult = ultimo(100, sorte, i, m, n, bingo, &j); if (ult < min) { min = ult; lin = i; } } printf("A linha %d foi a primeira preenchida!\n", lin); printf("O ultimo elemento sorteado da linha foi o %d," " que foi o %d-esimo numero sorteado.\n", v[min], min+1); return 0; } Last modified: Fri Jul 12 16:58:08 BRT 2013 MAC2166 Introdução à Computação Prova 3 QUESTÃO 1 QUESTÃO 2 QUESTÃO 3
Compartilhar