7888-Aula_06_-_Vetores_como_parâmetros

48
 1 Estrutura de Dados  Aula 06 Vetores como parâmetros; Diferença entre vetores e ponteiros; Atividade de laboratório.

Transcript of 7888-Aula_06_-_Vetores_como_parâmetros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 1/48

 

1

Estrutura de Dados 

Aula 06Vetores como parâmetros;

Diferença entre vetores e ponteiros;Atividade de laboratório.

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 2/48

 

2

• Implemente uma função que classifique os

elementos de um vetor em ordem crescente usandoo algoritmo de ordenação por seleção.

• ordenação por seleção: procure pelo menorelemento no vetor e permute com o primeiroelemento do vetor; repita este processo para osubvetor que se inicia no segundo elemento e,assim, sucessivamente; o processo termina quandoo subvetor contiver apenas um elemento.

• Teste a função com dados aleatórios.

Problema 25

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 3/48

 

3

Análise do programa

Observe como um vetoré passado comoparâmetro de umafunção: o número deelementos do vetor não

precisa ser declarado.

Para haver a troca, os

parâmetros não devemser passados porreferência (endereço)?

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 4/48

 

Análise do programa#define INFINITO 999999

#define TAM_MAX 50

int main(int args, char * arg[]){

int i,n,a[TAM_MAX];

// Inicializar gerador de números aleatórios

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

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 5/48

 

5

• Quando deve ser feita este tipo de passagem? Veja

o exemplo:

Exibe: x = 2 y = 5

Passagem por Valor

Exibe: x = 5 y = 2

Passagem por Referência

Passagem de parâmetros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 6/48

 

6

• No caso de uma função ter como parâmetro um

vetor, temos um caso particular de grandeimportância.

Por quê? Porque o nome de um vetor nada mais éque um ponteiro para sua primeira posição.

• Exemplo:

C O R D I A Lv0

1 2 3 4 5 6

F17

F17 F18 F19 F1A F1B F1C F1D

char v[8];

 \0

7

F1E

Vetores como parâmetros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 7/487

• Mas, então como é possível usarmos a notação:

• Isto pode ser facilmente explicado, desde que se

entenda que a notação acima é absolutamenteequivalente a:

• Mas, o que significa somar (ou subtrair) um valor aum ponteiro?

nome_do_vetor[índice]

*(nome_do_vetor + índice)

Vetores como parâmetros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 8/488

• Quando incrementamos um ponteiro, ele passa a

apontar para o próximo valor do mesmo tipo.

• Exemplo: ao incrementar um ponteiro para char, 

ele anda 1 byte na memória e ao incrementar umponteiro para double ele anda 8 bytes.

C O R D I A L

v

0 1 2 3 4 5 6

v + 3

v &v[0]

*v v[0] = 'C'

*(v + 3) v[3] = 'D' 

São equivalentes!!!

Vetores como parâmetros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 9/489

• Logo, como o nome de um vetor é também um

ponteiro, a passagem de parâmetro para vetores ésempre por referência.

Assim, qualquer modificação ocorrida no vetordentro da função será, na realidade, feita sobre oparâmetro usado na chamada.

...

...

Alterações no vetor x dentroda função ordenar_por_selecaoserão também realizadas novetor a.

Na definição da função, podemos

substituir int x[ ] por int x[TAM_MAX] ou ainda int *x.

Vetores como parâmetros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 10/48

10

• O que devemos fazer se desejarmos que os

elementos de um vetor, passado como parâmetropara uma função, não sejam alterados?

• Resposta: dentro da função é preciso atribuir oselementos do vetor a uma variável local.

• Considere o exemplo mostrado a seguir.

Vetores como parâmetros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 11/48

11

Os elementos do vetor a terãoseus valores modificados pelafunção quadrado?

Sim! A passagem

é por referência.

Vetores como parâmetros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 12/48

12

Não! Foi feita uma

cópia de v em x.

Atenção! Observe que a cópia doselementos foi feita um a um. O queaconteceria se fizéssemos: x = v?

Vetores como parâmetros

E agora, os elementos do vetor a terão seus valores modificadospela função quadrado?

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 13/48

13

Atenção!!

• Há uma diferença importante entre o nome de umvetor e um ponteiro: um ponteiro é uma variável,mas o nome de um vetor não é uma variável.

• Isto significa, que não se consegue alterar o

endereço que é apontado pelo "nome do vetor".Exemplo:

int v[10];

int *p, i;p = &i;

v = v + 2;

v++;

v = p;

Operações

inválidas

p = v;

p = v + 2;

Operaçõesválidas

Diferença entre vetores e ponteiros

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 14/48

14

• Para indicar que um parâmetro de função não

deve ser alterado, usa-se o qualificador const.

• Exemplo:

Se existir na função umaatribuição de valor a umparâmetro declaradocomo constante, a

compilação indicaráum erro.

Qualificador const

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 15/48

15

• Implemente uma função que classifique os

elementos de um vetor em ordem crescenteusando o algoritmo quicksort:

1. Seja m o elemento na posição central no vetor;

2. Seja i o índice do primeiro e j, o índice do último elemento do vetor;3. Enquanto i for menor ou igual a j, faça com que:

a) O valor de i cresça 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 posições i e j.

Problema 26

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 16/48

16

• Ao final desses passos, a situação do vetor será a

seguinte:à esquerda da posição central, existem somenteelementos menores do que m;à direita da posição central, existem somente

elementos maiores do que m;

• Assim, o problema de ordenar o vetor se reduz aoproblema de ordenar cada uma dessas “metades”.

• Os mesmos passos serão aplicadas repetidasvezes à cada nova “metade”, até que cada metadecontenha um único elemento (caso trivial).

Problema 26

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 17/48

17

• Considere o exemplo abaixo:

• Como a natureza dos problemas é sempre amesma (“ordenar um vetor”), o mesmo método

pode ser usado para cada subproblema.

4 1 3 5 2

Ordenar {4,1,3,5,2}

2 1 5 4

Ordenar {2,1} Ordenar {5,4}

1 2Ordenar {1} Ordenar {2}

4 5Ordenar {4} Ordenar {5}

Problema 26

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 18/48

18

Análise do programa

Veja que interessante: afunção quicksort chamaa si mesma!!!

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 19/48

19

• A função quicksort implementada é um exemplo

de função recursiva: função que chama a simesma.

Recursividade

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 20/48

20

• A recursividade muitas vezes torna o algoritmo

mais simples.

• Veja, por exemplo, o Problema 27, que

implementa uma solução recursiva para o jogoTorre de Hanói.

• Desafio: escrever um algoritmo não-recursivo

para resolver o jogo Torre de Hanói.

Funções recursivas

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 21/48

21

// 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);

}

}

Funções recursivas

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 22/48

22

• Considere que um polinômio é representado como um

vetor de valores do tipo float (vetor de coeficientes).Por economia de memória, o vetor deve conterapenas o número necessário e suficiente deelementos para representar o polinômio.

• Implemente a função mostrar_polinomio que exibe umpolinômio representado desta maneira.

Problema 28

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 23/48

23

Análise do programa

Note que o vetor é declaradocomo um ponteiro.

Note que o tamanho do vetorde coeficientes é definido emtempo de execução, após ousuário fornecer o grau dopolinômio.

 

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 24/48

24

• Já discutimos que o nome de um vetor nada mais é

que um ponteiro para sua primeira posição.

• Exemplo:

• Portanto, uma outra forma de declarar o vetor é:

char *v;

Alocação estática de memória

C O R D I A Lv0 1 2 3 4 5 6

F17

F17 F18 F19 F1A F1B F1C F1Dchar v[8];

 \07

F1E

 

á ó

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 25/48

25

• Então, qual a diferença entre declarar o vetor v 

como um ponteiro para char ou como um vetor deelementos do tipo char?

• A diferença está na alocação de memória.

char *v;

ou

Alocação estática de memória

C O R D I A Lv 0 1 2 3 4 5 6F17

F17 F18 F19 F1A F1B F1C F1D

char v[8];

 \07

F1E

 

Al á i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 26/48

26

• Ao declarar v como um vetor de elementos do tipo

char, o compilador aloca automaticamente o espaçode memória necessário.

• Para o exemplo:

• O compilador aloca 8 * N bytes de memória para v,onde N corresponde ao número de bytes usado pelo

compilador para armazenar o tipo char.

• Normalmente, N = 1 byte, para o tipo char.

char v[8];

Alocação estática de memória

 

Al ã á i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 27/48

27

• A linguagem C utiliza a função sizeof para determinar

o número de bytes reservado pelo compilador paraum determinador tipo.

• Por exemplo, no gcc:

• Ao calcular o espaço de memória de um vetor, use afunção sizeof, pois o espaço de memória de umdeterminado tipo, pode variar entre compiladores.

a = sizeof(int);

b = sizeof(float);

c = sizeof(double);

a = 4

b = 4

c = 8

int w[10];

10 * 4 bytes

10 * sizeof(int)

gcc

qualquer

compilador

Alocação estática de memória

 

Al ã á i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 28/48

28

• Se o programador define a quantidade de memória

necessária a um vetor (especificando o tipo e onúmero de elementos), a alocação de memória podeser feita em tempo de compilação: alocação estática.

• Declarando um vetor como ponteiro, a alocação dememória não pode ser feita pelo compilador, pois adeclaração não especifica o número de elementos.

• Neste caso, a alocação deverá ser feita em tempo deexecução: alocação dinâmica de memória.

Alocação estática de memória

porque é feita em tempo de execução 

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 29/48

29

• Para fazer a alocação dinâmica de memória,

podemos usar as funções calloc ou malloc.

• A função calloc requer dois parâmetros: o número deposições de memória e o tamanho em bytes de cadaposição.

• Já a função malloc requer apenas um parâmetro: o

espaço total em bytes de memória necessário.

• Estas funções retornam um ponteiro do tipo void parao início do espaço de memória alocado.

Alocação dinâmica de memória

  

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 30/48

30

• Portanto, este ponteiro deve ser convertido (type

casting) para o tipo de dado desejado.

• Para fazer com que w aponte para um espaço dememória capaz de acomodar 10 elementos do tipo

int, podemos escrever:

ou então:

int *w;

w = (int *)calloc(10,sizeof(int));

int *w;

w = (int *)malloc(10*sizeof(int));

No caso do gcc, esta conversãonão precisa ser explícita.

Alocação dinâmica de memória

 

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 31/48

31

• Qual a vantagem de declarar um vetor como

ponteiro?

• Neste caso, não é necessário definir, a priori , onúmero de posições de memória necessárias.

• No programa p28.c, por exemplo, o vetor c é usadopara armazenar os coeficientes de um polinômio.

• Porém, não é possível saber o número exato decoeficientes, pois este número depende do grau dopolinômio, que é fornecido em tempo de execução.

Alocação dinâmica de memória

 

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 32/48

32

• Obviamente, seria possível declarar o vetor c como:

sendo MAX_TAM uma constante definidapreviamente.

• Neste caso, MAX_TAM deveria ser estimado epoderíamos ter duas situações possíveis:a) Desperdício de memória;b) Erro devido à subestimação de MAX_TAM.

• O programa p28.c declara o vetor c como umponteiro e aloca o espaço de memória somentedepois de conhecido o grau do polinômio.

int c[MAX_TAM];

c = (float *)calloc(n+1,sizeof(float));

Alocação dinâmica de memória

 

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 33/48

33

• Outra vantagem da alocação dinâmica de memória é

a possibilidade de reduzir ou aumentar a quantidadede memória alocada anteriormente.

• Isto pode ser feito com a função realloc, cujosparâmetros são um ponteiro para o início do bloco de

memória e a quantidade de bytes a ser alocada.

• Essa função retorna um ponteiro para o início donovo bloco de memória. Este ponteiro pode ser igual

ao ponteiro para o bloco de memória original.• Caso seja diferente, a função realloc copia os dados

armazenados no bloco de memória original para o

novo bloco de memória.

Alocação dinâmica de memória

 

Al ã di â i d ó i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 34/48

34

Criação do vetor.

Aumentando oespaço alocado.

Diminuindo oespaço alocado.

Alocação dinâmica de memória

 

St i t i

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 35/48

35

• Considere o seguinte programa:

• Neste caso, msg é um ponteiro para char, ouequivalentemente, um vetor de caracteres.

• Note que não há alocação de memória chamando-se a função calloc ou a função malloc.

Strings como ponteiros

 

Strings como ponteiros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 36/48

36

• Isto é possível porque, para strings, o espaço de

memória necessário e suficiente é alocado,dinamicamente, no momento da atribuição.

• Assim, a instrução:

atribui à msg treze posições de memória:

• Se em seguida, o programa atribui:

msg = "Linguagem C\n";

L i n g u a g e m C \n \0

msg = "Programação na Linguagem C\n";

msg = "C\n";

ou O espaço alocado para msg serádiminuído ou aumentado

automaticamente.

msg

Strings como ponteiros

 

Strings como ponteiros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 37/48

37

• Este tipo de alocação dinâmica ocorre apenas no

caso de atribuições para strings.

• Se o valor do string não for atribuído diretamente(por exemplo, valor é lido pelo comando gets), a

alocação deve ser feita usando calloc ou malloc.

Strings como ponteiros

 

Strings como ponteiros

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 38/48

38

• A leitura de um string deve ser feita pela função

gets, pois usando-se scanf, os espaços em brancosão entendidos como separadores de valores.

• Por exemplo, se o usuário digita:

Então, a instrução:

atribuiria à variável nome apenas o valor “Sao”. 

Sao Paulo Futebol Clube

scanf("%s",nome);

Strings como ponteiros

 

E t d d D d

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 39/48

Entrada de DadosString com espaços em branco

 

E t d d D d

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 40/48

Entrada de DadosString com espaços em branco

 

E t d d D d

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 41/48

scanf(%[^\n]s, nome);%s

Leitura de string ^

Ler qualquer caractere

 \nAté um enter

Entrada de DadosString com espaços em branco

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 42/48

42

• Como no caso de vetores, o nome de uma matriz é

também um ponteiro para a primeira posição dememória alocada para esta matriz.

• Portanto, uma matriz também pode ser declarada

como um ponteiro.

• Considere, por exemplo, o caso de uma matrizbidimensional com m linhas e n colunas.

Alocação dinâmica para matrizes

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 43/48

43

• Uma matriz pode ser imaginada como um vetor de

m elementos, em que cada elemento é um ponteiropara o início de um vetor de n elementos.

• Exemplo: int mat[3][4];

Alocação dinâmica para matrizes

mat

F17

F17

F18

F19

F1A F1B F1C F1D

Vetor que armazena os

endereços das linhas da matriz.

F1A

A01 

B01

A01 A02 A03 A04

B01 B02 B03 B04

Vetores quearmazenam oselementos da

matriz.

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 44/48

44

• Portanto, inicialmente, é preciso alocar um vetor

com três elementos, correspondentes aosendereços das linhas da matriz.

• Isto pode ser feito como a seguir:

• A seguir, deve-se alocar, para cada elemento de

mat, um vetor com quatro elementos do tipo int.

mat = (int **)calloc(3,sizeof(int *));

for (i = 0; i < 3; i++)

mat[i] = (int *)calloc(4,sizeof(int));

Alocação dinâmica para matrizes

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 45/48

45

• Portanto, no caso geral de uma matriz de m linhas

e n colunas, a alocação dinâmica de memória podeser feita como:

• A alocação de memória para matrizes com maisdimensões pode ser feita de forma análoga.

• Como seria, por exemplo, para uma matriztridimensional?

mat = (int **)calloc(m,sizeof(int *));

for (i = 0; i < m; i++)

mat[i] = (int *)calloc(n,sizeof(int));

Alocação dinâmica para matrizes

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 46/48

46

• Neste caso, teríamos o código:

• Para este código, podemos abstrair arepresentação da matriz a como a seguir.

Alocação dinâmica para matrizes

 

Alocação dinâmica para matrizes

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 47/48

47

15 2 19 51

23 18 3 1

1 3 76 12

a10

10

A0 A1 A2 A3

B0 B1 B2 B3

C0 C1 C2 C320

30

A0

B0

C0

D0

E0

F0

11

20

22

21

30

32

31 7 21 56 8

4 43 1 9

9 6 23 90

D0 D1 D2 D3

E0 E1 E2 E3

F0 F1 F2 F3

Exemplo: float ***a;

Sejam: n1=2, n2=3, n3=4

Exemplo:a[0][0][0] = 23a[1][2][3] = 90

Alocação dinâmica para matrizes

 

EXERCÍCIO Problema 29

5/13/2018 7888-Aula_06_-_Vetores_como_parâmetros - slidepdf.com

http://slidepdf.com/reader/full/7888-aula06-vetorescomoparametros 48/48

• Um professor mantém as notas dos alunos das classes

em que leciona em tabelas, onde as linhascorrespondem aos alunos e as colunas correspondemàs avaliações.

• Para cada classe, o professor pode fazer quantasavaliações desejar. Implemente as funções: – maior_nota: retorna a maior nota obtida pela classe;

deve retornar também o número do aluno e o número daavaliação correspondente à maior nota da classe;

 – media_classe: retorna a média das notas obtidas pelaclasse, considerando todas as avaliações realizadas.

• Testar o programa com notas geradas aleatoriamente.

EXERCÍCIO Problema 29