1. (POLI 94) Um conjunto pode ser representado por um vetor da seguinte forma: V[0] é o tamanho do conjunto; V[1], V[2], etc. são os elementos do conjunto (sem repetições).
(a) Faça uma função chamada intersecção que dados dois conjuntos de números inteiros A e B, constrói um terceiro conjunto C que é a intersecção de A e B. Lembre-se de que em C[0] a sua função deve colocar o tamanho da intersecção.
(b) Faça um programa que lê um inteiro n > 1 e uma seqüência de n conjuntos de números inteiros (cada um com no máximo 100 elementos) e constrói e imprime um vetor INTER que representa a intersecção dos n conjuntos.
Por exemplo, se n=3 e os conjuntos são {1, 2, 4, 9}, {2, 4, 7, 8, 9} e {5, 4, 9}, a entrada será:
3 | O valor de n |
4 | V[0] = tamanho do primeiro conjunto |
1 2 4 9 | V[1] V[2] V[3] V[4] |
5 | V[0] = tamanho do segundo conjunto |
2 4 7 8 9 | V[1] V[2] V[3] V[4] V[5] |
3 | V[0] = tamanho do terceiro conjunto |
5 4 9 | V[1] V[2] V[3] |
INTER[0] = 2 | tamanho do conjunto | |
INTER[1] = 4 | INTER[2] = 9 | conjunto intersecção |
Use obrigatoriamente a função do item anterior,
mesmo que você não a tenha feito.
2. (a) Escreva uma função que lê, linha a linha, uma matriz real Amxn
(b) Escreva uma função
que imprime uma matriz real Amxn
3. (a) Escreva uma função que calcula a soma dos elementos da linha i de uma matriz real Amxn.
(b) Escreva uma função
que calcula o produto dos elementos da coluna j de uma matriz real
Amxn.
4. (a) Escreva uma função que troca o conteúdo de duas variáveis.
(b) Escreva uma função
que recebe dois inteiros, i e j, uma matriz real Amxne
troca linha i pela linha j. Utilize a função
do item anterior.
5. (POLI 97)
(a) Faça uma função
MAX
que recebe como entrada um inteiro n, uma matriz inteira
Anxn
e
devolve três inteiros: k, Lin e Col. O inteiro
k
é um maior elemento de A e é igual a A[Lin,Col].
Exemplo:
Ex.: No caso da matriz acima, a saída poderia ser:
Elem | Linha | Coluna |
8 | 1 | 2 |
7 |
|
1 |
5 | 2 | 0 |
4 | 2 | 2 |
3 | 0 | 0 |
3 | 2 | 1 |
2 | 1 | 1 |
1 | 0 | 2 |
1 | 1 | 0 |
6. Escreva uma função que recebe uma matriz de caracteres
8x8 representando um tabuleiro de xadrez e calcula o valor total das peças
do jogo. Espaços vazios do tabuleiro são codificados como
casas com ` '(branco) e têm valor 0 (zero). O valor das demais peças
é dado de acordo com a tabela:
Peça |
|
peão |
|
cavalo |
|
bispo |
|
torre |
|
rainha |
|
rei |
|
7. (a) Escreva uma função que recebe como parâmetros um vetor real A com n elementos e um vetor real B com m elementos, ambos representando conjuntos, e verifica se A está contido em B (A B).
8. (a) Escreva uma função que recebe uma matriz real Amxn e determina a sua transposta (Se B é a matriz transposta de A então aij = bji).
(b) Escreva uma função que calcula o produto escalar de dois vetores dados.
(c) Dada uma matriz real Xmxn, usando as funções acimas, calcule o produto X x Xt .
(d) Faça uma função que verifica se uma matriz Amxm é a matriz identidade.
(e) Ache uma aplicação
para esse exercício.
9. (a) Dado um vetor real X com n elementos e um certo índice k, escreva uma função que determina o índice do elemento mínimo entre X[k], X[k+1], ..., X[n-1].
(b) Usando a função
do item anterior coloque os elementos de um vetor em ordem crescente.
10. Para encontrar uma raiz de um polinômio p(x)=a0+a1x+...+anxn, (n > 2), pode-se aplicar o método de Newton (1), que consiste em refinar uma aproximação inicial x0 dessa raiz através da expressão:
Usualmente, repete-se esse refinamento até
que |xn+1 - xn | < ,
>
0, ou até que m iterações tenham sido executadas.
Dados um polinômio
p(x)=a0+a1x+...+anxn,
uma aproximação inicial x0 da raiz de p(x),
> 0 e o número máximo de iterações que devem
ser executadas, determine uma aproximação da raiz de p(x)
pelo método de Newton. Utilize uma função que, dado
um polinômio p(x), calcula a derivada p'(x)
e, para calcular p(xn) e p'(xn)
em cada iteração, uma função que calcula o
valor de um polinômio em um ponto.
11. (a) Escreva uma função que recebe como parâmetros:
Exemplo:
n=6, m=3
c=1,
k=0, p=4
Exemplo: n = 6,
12. (a) Escreva uma função que recebe como parâmetros uma matriz de caracteres NOMESmxn , os índices i e j de duas linhas e que troca os elementos da linha i com os da linha j.
(b) Escreva uma função que recebe como parâmetros uma matriz NOMESmxn, os índices i e j de duas linhas e que devolve valor 1 se o nome na linha i é maior ou igual ao da linha j (ordem alfabética) e 0 caso contrário.
(c) São dados n
nomes que serão armazenados em uma matriz NOMESmxn.
Coloque os nomes dessa matriz em ordem alfabética usando as funções
descritas acima.
13. (FEA 88)
(a) Escreva uma função
que recebe como parâmetros uma matriz real Anxm
, e uma posição (i,j) da matriz,
e calcula a média aritmética dos vizinhos de (i,j),
ou seja, a média entre Ai-1, j , Ai+1,
j , Ai, j+1 ,Ai,
j+1. Desconsidere os vizinhos que não pertencem
a matriz (por exemplo, os vizinhos de (0, 0) são somente (0,1) e
(1,0) ).
(b) Escreva uma função que recebe como parâmetro uma matriz real Anxm e devolve uma matriz Amédia, onde aijmédia é a média aritmética dos vizinhos de (i,j). Para isto, utilize a função do item anterior.
(c) Escreva um programa que
lê uma matriz real Anxm , e um número
inteiro k; utilizando a função do item anterior, o
programa deve transformar a matriz k vezes, imprimindo a matriz
inicial e depois de cada transformação.
Solução em Pascal
14. Dizemos que uma matriz Anxn é um quadrado latino de ordem n se em cada linha e em cada coluna aparecem todos os inteiros 1,2,3,...,n (ou seja, cada linha e coluna é permutação dos inteiros 1,2,...,n).
Exemplo:
(b) Usando a função
acima, verifique se uma dada matriz inteira Anxn é
um quadrado latino de ordem n.
15.
(a) Faça uma função
que transforma um número num vetor correspondente à sua representação
binária.
(b) Dados inteiros positivos n e m, e os vetores ReprN e ReprM correspondentes à representação binária dos números n e m, considere a seguinte matriz A de caracteres:
`*' se ReprN[i]= 1 e ReprM[j]= 1
` ' caso contrário
16. (POLI 96) Dada uma matriz real quadrada A de ordem n e um inteiro positivo k, define-se a aproximação da matriz real eA pela soma abaixo:
(b) Escreva uma função que recebe como parâmetro um número inteiro n, um número real c e uma matriz Xnxn. A função devolve em uma matriz Y, também passada como parâmetro, o produto do número c pela matriz X. Ou seja,
Yi,j = c * Xi,j para 0< i < n-1 e 0 < j < n-1
17. (POLI 86) Este problema consta de três partes:
(a) Escreva uma função
de nome Início com os seguintes parâmetros de entrada:
O valor da função deve ser o índice
da posição onde se inicia a última palavra de V
(isto é, o índice da primeira letra dessa palavra).
Exemplo:
E | S | S | E | É | F | Á | C | I | L | ! |
(b) Escreva uma função de nome Insere com os seguintes parâmetros:
O | Q | U | E | É | B | O | M | A | G | E | |||||
N | T | E | F | A | T | U | R | A | , | O | Q | U | |||
E | É | R | U | I | M | A | G | E | N | T | E | ||||
E | S | C | O | N | D | E | . |
A eliminação da ``quebra'' deve ser feita inserindo-se uma nova linha, que será ocupada apenas pela palavra ``quebrada''. As posições anteriormente ocupadas pela palavra devem passar a conter brancos.
Supõe-se que qualquer palavra do texto caiba inteiramente em uma linha.
No exemplo acima, o novo conteúdo da matriz A, após
eliminar a ``quebra'' da palavra GENTE, seria:
O | Q | U | E | É | B | O | M | A | |||||||
G | E | N | T | E | |||||||||||
F | A | T | U | R | A | , | O | Q | U | ||||||
E | É | R | U | I | M | A | G | E | N | T | E | ||||
E | S | C | O | N | D | E | . |
Use obrigatoriamente as funções definidas nos itens (a) e (b) (mesmo que você não as tenha feito).
Observação: no texto existe pelo menos um branco separando duas palavras consecutivas, mesmo que elas estejam em linhas diferentes.
18. Considere um exame de vestibular em que as questões são do tipo teste. Deseja-se obter uma lista com o nome, o número de identificação e o número de pontos de cada um dos candidatos, em ordem decrescente de pontos. A resolução deste problema será dividida em três partes:
(a) Escreva uma função Pontos com os seguintes parâmetros:
O valor que esta função deve assumir é o número
de pontos feitos pelo candidato cujas respostas estão armazenadas
em XResp.
(b) Escreva uma função Insere com os seguintes
parâmetros:
Esta função
insere o candidato InfoCandidato no vetor
A, de modo que
os candidatos continuem armazenados por ordem decrescente de pontos.
(c) Escreva um programa que recebe como dados:
e constrói um
vetor contendo o nome, o número de identificação e
o número de pontos alcançados por cada candidato, em ordem
decrescente de pontos.
Utilize obrigatoriamente
as funções Pontos e Insere, mesmo que você não
as tenha feito.
19. (POLI 96) Uma função matemática pode ser representada por um vetor. Por exemplo, com n = 5 e o vetor de tamanho n[0.0, 0.5, 1.0, 1.5, 2.0] estamos representando a função f(i)=i/2, i=0,1,2,3,4.
O alisamento de uma função é definido como:
Para o exemplo acima, temos:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(a) Escreva uma função alisa que recebe um vetor real F com n elementos e devolve um vetor G contendo o alisamento da função representada em F.
(b) Escreva uma função realisa que recebe m,n inteiros e um vetor F de n números reais e retorne em uma matriz de números reais Amxn os m alisamentos sucessivos da função representada em F. Cada vetor deverá ser armazenado em um linha da matriz.
(c) Escreva uma função avalia que recebe os números
inteiros m,n e um vetor F de n números reais e, utilizando
obrigatoriamente a função do item anterior (se não
o fez, escreva apenas o protótipo) retorne quais são os valores
máximo e mínimo da representação do m-ésimo
alisamento de F.
20. Simule a execução do seguinte programa, destacando a sua saída.
#include <stdio.h> /* Variavel Global */ int i; void p1(int x) { i = i + 1; x = x + 2; printf("%d\n", x); } void p2(int *x) { i = i + 1; *x = *x + 2; printf("%d\n", *x); } int main() { /* Variavel Local */ int a[2]; a[0] = 10; a[1] = 20; printf("%d %d\n", a[0], a[1]); i = 0; p1(a[i]); printf("%d %d\n", a[0], a[1]); a[0] = 10; a[1] = 20; i = 0; p2(&a[i]); printf("%d %d\n", a[0], a[1]); return 0; }
21. (POLI 87) Simule a execução do programa abaixo destacando a sua saída:
int main() { int m, x, nv, i, k, achou, b[50], v[50]; printf("Digite o tamanho da sequencia: "); scanf("%d", &m); printf("Tamanho = %d\n", m); for (i = 0; i < m; i++) { scanf("%d", &b[i]); printf("%d ", b[i]); } printf("\n"); i = 0; achou = 0; while (!achou && (i<m)) { constroi(b, m, b[i], v, &nv); printf("Elemento = %d\n", b[i]); for (k = 0; k < nv; k++) printf("%d ", v[k]); printf("\n"); printf("Total = %d\n", nv); if (nv == m/2) achou = 1; else i = i + 1; } if (achou) { printf("Achou o %d\n", b[i]); for (k = 0; k < nv; k++) printf("%d ", b[v[k]]); printf("\n"); } constroi(b, m, 20, v, &nv); printf("Elemento = 20\n"); for (k = 0; k < nv; k++) printf("%d ", v[k]); printf("\n"); return 0; }
22. (POLI 88) Simule a execução do programa abaixo destacando a sua saída:
#include <stdio.h> #define max 50 void imprime(int a[][max], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("%2d ", a[i][j]); printf("\n"); } } void soma(int a[][max], int b[][max], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j] = a[i][j] + b[i][j]; } int main() { int i, j, n, a[max][max], b[max][max]; printf("Digite n: "); scanf("%d", &n); printf("n = %d\n", n); for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d", &a[i][j]); for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d", &b[i][j]); imprime(a, n); imprime(b, n); soma(a, b, n); imprime(a, n); imprime(b, n); return 0; }
23. (POLI 96) Simule a execução do seguinte programa, mostrando todos os valores intermediários gerados para cada variável e destacando a sua saída.
#include <stdio.h> int g; int fa(int m[20][20], int a, int cte, int *p1, int p2) { int i, j; g = *p1; *p1 = p2; p2 = g; for (i = 0; i < a; i++) for (j = 0; j < a; j++) m[i][j] = (3*i+j+cte)%5; printf("%d %d\n", m[0][0], m[0][1]); printf("%d %d\n", m[0][0], m[0][1]); printf("%d %d %d\n", g, *p1, p2); return(cte); } void flin(int m[], int i) { int g; for (g = 0; g < i; g++) printf("%d ", m[g]); printf("\n"); } void fpr(int m[20][20], int a) { int i; for (i = 0; i < a; i++) flin(m[i], a); } int main() { int m[20][20], p1, p2, i, num; char c, s[20]; float x, y; g = 0; printf("Digite um numero: "); scanf("%d", &num); printf("num = %d, g = %d\n", num, g); p1 = 1; p2 = 3; m[0][0] = 1; m[0][1] = 0; m[1][0] = 0; m[1][1] = 1; fpr(m, 2); printf("g = %d\n", g); i = fa(m, 2, num, &p1, p2); printf("%d %d %d %d\n", g, p1, p2, i); printf("%d %d\n", m[0][0], m[0][1]); printf("%d %d\n", m[0][0], m[0][1]); c = 'a' + num + 1; printf("%c\n", c); x = 5; p2 = 3; x = x/2; y = p2/2; printf("x = %3.1f, y = %3.1f\n", x, y); s[0] = 'a'; s[1] = 'b'; s[2] = 'c'; s[3] = 'd'; s[4] = 'e'; s[5] = 'f'; s[6] = '\0'; printf("s = %s\n", s); s[2+num%3] = '\0'; printf("s = %s\n", s); return 0; }
24. (POLI 87) Simule a execução do programa abaixo destacando a sua saída:
#include <stdio.h> #define max 50 int indmax(float v[], int n) { int j, indice; indice = 0; for (j = 1; j < n; j++) if (v[j] > v[indice]) indice = j; return(indice); } void roda(float v[], int n, int imaior) { int j, k; float x[max]; k = imaior; for (j = 0; j < k; j++) x[j] = v[j]; for (j = 0; j < n-k; j++) v[j] = v[j+k]; for (j = 0; j < k; j++) v[n-k+j] = x[j]; } int main() { int i, m, n, l, c, imaior; float v[max], aux[max], a[max][max]; printf("Digite m e n.\n"); scanf("%d %d", &m, &n); printf("m = %d n = %d\n", m, n); printf("Digite uma matriz mxn.\n"); for (l = 0; l < m; l++) { for (c = 0; c < n; c++) { scanf("%f", &a[l][c]); printf("%4.1f ", a[l][c]); } printf("\n"); } for (l = 0; l < m; l++) { for (i = 0; i < n; i++) aux[i] = a[l][i]; imaior = indmax(aux, n); printf("%d\n", imaior); roda(aux, n, imaior); for (i = 0; i < n; i++) a[l][i] = aux[i]; for (c = 0; c < n; c++) printf("%4.1f ", a[l][c]); printf("\n"); } for (l = 0; l < m; l++) v[l] = a[l][0]; imaior = indmax(v, m); printf("\n%4.1f\n", a[imaior][0]); return 0; }
25. Considere as seguintes declarações:
void m(int x[][2], int y[][2], int z[][2]) { z[0][0] = x[0][0] * y[0][0] + x[0][1] * y[1][0]; z[0][1] = x[0][0] * y[0][1] + x[0][1] * y[1][1]; z[1][0] = x[1][0] * y[0][0] + x[1][1] * y[1][0]; z[1][1] = x[1][0] * y[0][1] + x[1][1] * y[1][1]; }