Академический Документы
Профессиональный Документы
Культура Документы
Aula 06
Vetores como parmetros; Diferena entre vetores e ponteiros; Atividade de laboratrio.
Problema 25
Implemente uma funo que classifique os elementos de um vetor em ordem crescente usando o algoritmo de ordenao por seleo.
ordenao por seleo: procure pelo menor elemento no vetor e permute com o primeiro elemento do vetor; repita este processo para o subvetor que se inicia no segundo elemento e, assim, sucessivamente; o processo termina quando o subvetor contiver apenas um elemento.
Teste a funo com dados aleatrios.
2
Anlise do programa
Para haver a troca, os parmetros no devem ser passados por referncia (endereo)?
Observe como um vetor passado como parmetro de uma funo: o nmero de elementos do vetor no precisa ser declarado.
Anlise do programa
#define INFINITO 999999 #define TAM_MAX 50 int main(int args, char * arg[]) { int i,n,a[TAM_MAX]; // Inicializar gerador de nmeros aleatrios srand((unsigned)time(NULL)); // Vetor gerado aleatoriamente n = (rand() % TAM_MAX)+1; printf("Vetor original: "); for (i = 0; i < n; i++) { a[i] = (rand() % 100); printf("%d ",a[i]); } printf("\n"); // Classificar vetor ordenar_por_selecao(a,n); printf("Vetor ordenado: "); for (i = 0; i < n; i++) printf("%d ",a[i]); printf("\n"); system("PAUSE"); return 0; }
Passagem de parmetros
Quando deve ser feita este tipo de passagem? Veja o exemplo:
Por qu? Porque o nome de um vetor nada mais que um ponteiro para sua primeira posio. Exemplo:
char v[8];
F17 F18 F19 F1A F1B F1C F1D F1E
v F17
C
0
O
1
R
2
D
3
I
4
A
5
L
6
\0
7
6
Isto pode ser facilmente explicado, desde que se entenda que a notao acima absolutamente equivalente a:
*(nome_do_vetor + ndice)
C
v
D
v+3
So equivalentes!!!
8
...
Alteraes no vetor x dentro da funo ordenar_por_selecao sero tambm realizadas no vetor a. Na definio da funo, podemos substituir int x[ ] por int x[TAM_MAX] ou ainda int *x.
...
Resposta: dentro da funo preciso atribuir os elementos do vetor a uma varivel local. Considere o exemplo mostrado a seguir.
10
Sim! A passagem por referncia. Os elementos do vetor a tero seus valores modificados pela funo quadrado?
11
E agora, os elementos do vetor a tero seus valores modificados pela funo quadrado?
12
Operaes vlidas
v = v + 2; v++; v = p;
p = v; p = v + 2;
13
Qualificador const
Para indicar que um parmetro de funo no deve ser alterado, usa-se o qualificador const. Exemplo:
Se existir na funo uma atribuio de valor a um parmetro declarado como constante, a compilao indicar um erro.
14
Problema 26
Implemente uma funo que classifique os elementos de um vetor em ordem crescente usando o algoritmo quicksort:
1. 2. 3. Seja m o elemento na posio central no vetor; Seja i o ndice do primeiro e j, o ndice do ltimo elemento do vetor; Enquanto i for menor ou igual a j, faa com que: a) O valor de i cresa at encontrar um elemento maior que m; b) O valor de j diminua at encontrar um elemento menor que m; c) Haja a troca entre os elementos que ocupam as posies i e j.
15
Problema 26
Ao final desses passos, a situao do vetor ser a seguinte: esquerda da posio central, existem somente elementos menores do que m; direita da posio central, existem somente elementos maiores do que m; Assim, o problema de ordenar o vetor se reduz ao problema de ordenar cada uma dessas metades. Os mesmos passos sero aplicadas repetidas vezes cada nova metade, at que cada metade contenha um nico elemento (caso trivial).
16
Problema 26
Considere o exemplo abaixo:
Ordenar {4,1,3,5,2}
4
Ordenar {2,1}
2
Ordenar {5,4}
1 2
Ordenar {2}
5 4
Ordenar {4}
4 5
Ordenar {5}
1
Ordenar {1}
Como a natureza dos problemas sempre a mesma (ordenar um vetor), o mesmo mtodo pode ser usado para cada subproblema.
17
Anlise do programa
Recursividade
A funo quicksort implementada um exemplo de funo recursiva: funo que chama a si mesma.
19
Funes recursivas
A recursividade muitas vezes torna o algoritmo mais simples. Veja, por exemplo, o Problema 27, que implementa uma soluo recursiva para o jogo Torre de Hani.
20
Funes recursivas
// Programa p27.c #include <stdio.h> #include <stdlib.h> void mover(int n, int a, int b, int c); int main(int args, char * arg[]) { int n; printf("Numero de discos: "); scanf("%d",&n); printf("Solucao da Torre de Hanoi com %d discos:\n",n); mover(n,0,2,1); system("pause"); return 0; } void mover(int n, int a, int b, int c) { if (n > 0) { mover(n-1,a,c,b); printf("%d -> %d\n",a,b); mover(n-1,c,b,a); } }
21
Problema 28
Considere que um polinmio representado como um vetor de valores do tipo float (vetor de coeficientes). Por economia de memria, o vetor deve conter apenas o nmero necessrio e suficiente de elementos para representar o polinmio. Implemente a funo mostrar_polinomio que exibe um polinmio representado desta maneira.
22
Anlise do programa
Note que o vetor declarado como um ponteiro.
Note que o tamanho do vetor de coeficientes definido em tempo de execuo, aps o usurio fornecer o grau do polinmio.
23
v F17
C
0
O
1
R
2
D
3
I
4
A
5
L
6
\0
7
v F17
C
0
O
1
R
2
D
3
I
4
A
5
L
6
\0
7
Para o exemplo:
char v[8];
O compilador aloca 8 * N bytes de memria para v, onde N corresponde ao nmero de bytes usado pelo compilador para armazenar o tipo char.
Ao calcular o espao de memria de um vetor, use a funo sizeof, pois o espao de memria de um determinado tipo, pode variar entre compiladores.
10 * 4 bytes int w[10]; 10 * sizeof(int)
gcc qualquer compilador
27
J a funo malloc requer apenas um parmetro: o espao total em bytes de memria necessrio. Estas funes retornam um ponteiro do tipo void para o incio do espao de memria alocado.
29
ou ento:
sendo MAX_TAM uma constante definida previamente. Neste caso, MAX_TAM deveria ser estimado e poderamos ter duas situaes possveis: a) Desperdcio de memria; b) Erro devido subestimao de MAX_TAM. O programa p28.c declara o vetor c como um ponteiro e aloca o espao de memria somente depois de conhecido o grau do polinmio.
c = (float *)calloc(n+1,sizeof(float));
32
Essa funo retorna um ponteiro para o incio do novo bloco de memria. Este ponteiro pode ser igual ao ponteiro para o bloco de memria original. Caso seja diferente, a funo realloc copia os dados armazenados no bloco de memria original para o novo bloco de memria.
33
Criao do vetor.
Assim, a instruo: msg = "Linguagem C\n"; atribui msg treze posies de memria:
msg
L i n g u a g e m C \n \0
msg = "C\n";
37
Ento, a instruo:
scanf("%s",nome);
scanf(%[^\n]s, nome);
%s
Leitura
de string
^
Ler
\n
At
Portanto, uma matriz tambm pode ser declarada como um ponteiro. Considere, por exemplo, o caso de uma matriz bidimensional com m linhas e n colunas.
42
mat
F17
F17
F1A
A01 A02 A03 A04
F18
A01
B01 B02 B03 B04
F19
B01
43
A seguir, deve-se alocar, para cada elemento de mat, um vetor com quatro elementos do tipo int.
for (i = 0; i < 3; i++) mat[i] = (int *)calloc(4,sizeof(int));
44
A alocao de memria para matrizes com mais dimenses pode ser feita de forma anloga.
Como seria, por exemplo, para uma matriz tridimensional?
45
23 18
a
10 10 20
B0 B1 B2 B3 21 B0
15
19 51
22
C0
C0 C1 C2 C3
76 12
11
30 D0 D1 D2 D3 30
D0
43
E0 E1 E2 E3 31 E0
21 56
32
F0
F0 F1 F2 F3
23 90
47
EXERCCIO Problema 29
Um professor mantm as notas dos alunos das classes em que leciona em tabelas, onde as linhas correspondem aos alunos e as colunas correspondem s avaliaes. Para cada classe, o professor pode fazer quantas avaliaes desejar. Implemente as funes:
maior_nota: retorna a maior nota obtida pela classe; deve retornar tambm o nmero do aluno e o nmero da avaliao correspondente maior nota da classe; media_classe: retorna a mdia das notas obtidas pela classe, considerando todas as avaliaes realizadas.