mc-102 aula 10 vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao...

Post on 02-Jan-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

MC-102 — Aula 10Vetores

Instituto de Computacao – Unicamp

Roteiro

1 Introducao

2 VetoresDefinicao de VetoresVetores – Como usarVetores e a MemoriaVetores – Exemplos

3 Informacoes Extras: Inicializacao de um vetor

4 O Problema da Busca

5 Busca Sequencial

6 Busca Binaria

7 Exercıcios

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 2 / 40

Vetores

Vetores sao construcoes de linguagens de programacao que servempara armazenar varios dados de um mesmo tipo de forma simplificada.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 3 / 40

Vetores

Suponha que desejamos guardar notas de alunos.

Com o que sabemos, como armazenarıamos 3 notas?

float nota1, nota2, nota3;

printf("Nota do aluno 1: ");

scanf("%f", &nota1);

printf("Nota do aluno 2: ");

scanf("%f", &nota2);

printf("Nota do aluno 3: ");

scanf("%f", &nota3);

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 4 / 40

Vetores

Com o que sabemos, como armazenarıamos 100 notas?

float nota1, nota2, nota3,..., nota100;

printf("Nota do aluno 1: ");

scanf("%f", &nota1);

printf("Nota do aluno 2: ");

scanf("%f", &nota2);

...

printf("Nota do aluno 100: ");

scanf("%f", &nota100);

Criar 100 variaveis distintas nao e uma solucao elegante para esteproblema.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 5 / 40

Definicao de Vetores

Um vetor em C e uma colecao de variaveis de um mesmo tipo quesao referenciadas por um identificador unico.

Caracterısticas de um vetor:I As variaveis ocupam posicoes contıguas na memoria.I O acesso se da por meio de um ındice inteiro.I O vetor possui um tamanho pre-definido.I O acesso do vetor com um ındice fora dos limites, pode causar

comportamento anomalo do programa.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 6 / 40

Declaracao de um vetor

Para se declarar um vetor usamos a seguinte sintaxe:

tipo variavel identificador[tamanho do vetor];

Exemplos

float notas[100]; //vetor "notas" corresponde

//a 100 variaveis do tipo float

int primos[20]; //vetor "primos" corresponde

// a 20 variaveis do tipo int

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 7 / 40

Usando um vetor

Apos declarada uma variavel do tipo vetor, pode-se acessar umadeterminada posicao do vetor utilizando-se um ındice de valor inteiro.

Sendo n o tamanho do vetor, os ındices validos para o vetor vao de 0ate n − 1.

I A primeira posicao de um vetor tem ındice 0.I A ultima posicao de um vetor tem ındice n − 1.

A sintaxe para acesso de uma determinada posicao e:I identificador[posicao];

O vetor em uma posicao especıfica tem o mesmo comportamento que umavariavel simples.

Exemplo

int nota[10];

int a;

nota[5] = 95; //"nota[5]" corresponde a uma var. inteira

a = nota[5];

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 8 / 40

Usando um vetor

Voce deve usar valores inteiros como ındice para acessar uma posicaodo vetor.

O valor pode ser inclusive uma variavel inteira.

Exemplo

int g, vet[10];

for(g=0; g<10; g++)

vet[g]=5*g;

Quais valores estarao armazenados em cada posicao do vetor apos aexecucao deste codigo?

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 9 / 40

Vetores e a Memoria

Suponha o codigo:

int d;

int vetor[5];

int f;

Na memoria temos:

Nome d vetor f

Indice - 0 1 2 3 4 -

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 10 / 40

Vetores e a Memoria

Ao executar o comando

vetor[3]=10;

temos:

Nome d vetor f

Indice - 0 1 2 3 4 -

10

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 11 / 40

Vetores e a Memoria

O que ocorre se forem executados os comandos abaixo?

vetor[3]=10;

vetor[5]=5;

vetor[-1]=1;

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 12 / 40

Vetores e a Memoria

Ao executar

vetor[3]=10;

vetor[5]=5;

vetor[-1]=1;

teremos:

Nome d vetor f

Indice - 0 1 2 3 4 -

1 10 5

O seu programa estara errado pois voce esta alterandoinadvertidamente valores de outras variaveis.

Em alguns casos o seu programa sera encerrado (SegmentationFault).

Em outros casos seu programa podera continuar executando, masocorrerao erros difıceis de serem rastreados.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 13 / 40

Questoes importantes sobre vetores

O tamanho do vetor e pre-definido (durante a execucao do programanao pode ser alterado).

O uso de ındices fora dos limites podem causar comportamentoanomalo do programa.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 14 / 40

Como armazenar ate 100 notas?

float nota[100];

int n, i;

printf("Numero de alunos: ");

scanf("%d", &n);

for (i = 0; i < n; i++) {

printf("Digite a nota do aluno %d: ", i);

scanf("%f", &nota[i]);

}

O programa acima esta correto?

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 15 / 40

Como armazenar ate 100 notas?

Voce deve testar se n > 100 para evitar erros!!

float nota[100];

int n, i;

printf("Numero de alunos: ");

scanf("%d", &n);

if(n>100){

n=100;

printf("\nNumero maximo de alunos alterado para 100");

}

for (i = 0; i < n; i++) {

printf("Digite a nota do aluno %d: ", i);

scanf("%f", &nota[i]);

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 16 / 40

Exemplo: Produto Interno de dois vetores

Ler dois vetores de dimensao 5 e computar o produto interno destes.

Quais tipos de variaveis usar?

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 17 / 40

Exemplo: Produto Interno de dois vetores

Abaixo temos o codigo para ler dois vetores de dimensao 5.

int main(){

double vetor1[5], vetor2[5], resultado;

int i;

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 1:",i);

scanf("%lf",&vetor1[i]);

}

printf("\n\n");

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 2:",i);

scanf("%lf",&vetor2[i]);

}

//calculando o produto interno

......

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 18 / 40

Exemplo: Produto Interno de dois vetores

Abaixo temos a parte do codigo para computar o produto interno dosvetores.

int main(){

double vetor1[5], vetor2[5], resultado;

int i;

...

//calculando o produto interno

resultado = 0.0;

for(i=0; i < 5; i++){

resultado = resultado + ( vetor1[i]*vetor2[i] );

}

printf("\n\nO produto interno e: %lf\n",resultado);

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 19 / 40

Exemplo: Produto Interno de dois vetores

Agora o codigo completo.

int main(){

double vetor1[5], vetor2[5], resultado;

int i;

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 1:",i);

scanf("%lf",&vetor1[i]);

}

printf("\n\n");

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 2:",i);

scanf("%lf",&vetor2[i]);

}

//calculando o produto interno

resultado = 0.0;

for(i=0; i < 5; i++){

resultado = resultado + ( vetor1[i]*vetor2[i] );

}

printf("\n\nO produto interno e: %lf\n",resultado);

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 20 / 40

Exemplo: Elementos Iguais

Ler dois vetores com 5 inteiros cada.

Checar quais elementos do segundo vetor sao iguais a algum elementodo primeiro vetor.

Se nao houver elementos em comum, o programa deve informar isso.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 21 / 40

Exemplo: Elementos Iguais

Abaixo esta o codigo que faz a leitura de dois vetores.

int main(){

int vetor1[5], vetor2[5];

int i, j, umEmComum;

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 1:",i);

scanf("%d",&vetor1[i]);

}

printf("\n\n");

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 2:",i);

scanf("%d",&vetor2[i]);

}

...

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 22 / 40

Exemplo: Elementos Iguais

Para cada elemento do vetor1 testamos todos os outros elementos dovetor2 para saber se sao iguais.

Usamos uma variavel indicadora para decidir ao final dos lacosencaixados, se os vetores possuem ou nao um elemento em comum.

int main(){

int vetor1[5], vetor2[5];

int i, j, umEmComum;

...

umEmComum = 0; //Assumimos que n~ao hajam elementos comuns

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

for(j = 0; j < 5; j++)

if(vetor1[i] == vetor2[j]){

umEmComum = 1; //Descobrimos que ha elemento comum

printf("Posicao %d do vetor1 igual a posic~ao %d do vetor2.\n",i,j);

}

if(!umEmComum)

printf("Nenhum elemento em comum!\n");

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 23 / 40

Exemplo: Elementos Iguais

Codigo completo abaixo.

int main(){

int vetor1[5], vetor2[5];

int i, j, umEmComum;

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 1:",i);

scanf("%d",&vetor1[i]);

}

printf("\n\n");

for(i=0; i<5; i++){

printf("Entre com valor da posic~ao %d para vetor 2:",i);

scanf("%d",&vetor2[i]);

}

umEmComum = 0;

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

for(j = 0; j < 5; j++)

if(vetor1[i] == vetor2[j]){

umEmComum = 1;

printf("Posicao %d do vetor1 igual a posic~ao %d do vetor2.\n",i,j);

}

if(!umEmComum)

printf("Nenhum elemento em comum!\n");

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 24 / 40

Informacoes Extras: Inicializacao de um vetor

Em algumas situacoes e necessario declarar e ja atribuir um conjuntode valores constantes para um vetor.

Em C, isto e feito atribuindo-se uma lista de elementos para o vetorna sua criacao da seguinte forma:

tipo identificador[] = {elementos separados por vırgula} ;

Exemplos:

double vet1[] = {2.3, 3.4, 4.5, 5.6};

int vet2[] = {5, 4, 3, 10, -1, 0};

Note que automaticamente e criado um vetor com tamanho igual aonumero de dados da inicializacao.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 25 / 40

Informacoes Extras: Inicializacao de um vetor

#include <stdio.h>

int main(){

double vet1[] = {2.3, 3.4, 4.5, 5.6};

int vet2[] = {5, 4, 3, 10, -1, 0};

int i;

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

printf("%lf\n", vet1[i]);

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

printf("%d\n", vet2[i]);

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 26 / 40

O Problema da Busca

Vamos estudar alguns algoritmos para o seguinte problema:

Temos uma colecao de elementos, onde cada elemento possui umidentificador/chave unico, e recebemos uma chave para busca. Devemosencontrar o elemento da colecao que possui a mesma chave ou identificarque nao existe nenhum elemento com a chave dada.

Nos nossos exemplos usaremos um vetor de inteiros como a colecao.I O valor da chave sera o proprio valor de cada numero.

Apesar de usarmos inteiros, os algoritmos servem para buscarelementos em qualquer colecao de elementos que possuam chaves quepossam ser comparadas, como registros com algum campo deidentificacao unico (RA, ou RG, ou CPF, etc.).

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 27 / 40

O Problema da Busca

O problema da busca e um dos mais basicos em Computacao etambem possui diversas aplicacoes.

I Suponha que temos um cadastro com registros de motoristas.I Um vetor de registros e usado para armazenar as informacoes dos

motoristas. Podemos usar como chave o numero da carteira demotorista, ou o RG, ou o CPF.

Veremos algoritmos simples para realizar a busca assumindo quedados estao em um vetor.

Em cursos mais avancados sao estudados outros algoritmos eestruturas (que nao um vetor) para armazenar e buscar elementos.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 28 / 40

O Problema da Busca

tam = 8

0 1 2 3 4 5 6 7 8 9

vet

chave = 45 tam = 8

20 5 15 24 67 45 1 76

20 5 15 24 67 45 1 76

0 1 2 3 4 5 6 7 8 9

vet

chave = 100

No exemplo mais acima, a busca deve resultar na posicao 5 5, enquantono exemplo mais abaixo a busca deve resultar em -1 (nao encontrado).

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 29 / 40

Busca Sequencial

A busca sequencial e o algoritmo mais simples de busca:I Percorra todo o vetor comparando a chave com o valor de cada

posicao.I Se for igual para alguma posicao, entao o resultado e esta posicao.I Se o vetor todo foi percorrido entao o resultado e -1.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 30 / 40

Busca Sequencial

#i n c l u d e <s t d i o . h>

i n t main ( ) {i n t v e t [ ] = {1 , 3 , 5 , 7 , 8 , 10 , 15 , 22 , 30 , 1 0 0} ;i n t tam = 1 0 ;i n t chave , i ;i n t pos = −1;s c a n f (”%d ” , &chave ) ;f o r ( i =0; i<tam ; i ++){

i f ( v e t [ i ] == chave ) {pos = i ;b r e a k ;

}}p r i n t f (” pos = %d\n ” , pos ) ;r e t u r n 0 ;

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 31 / 40

Busca Binaria

A busca binaria e um algoritmo um pouco mais sofisticado.

E mais eficiente, mas requer que o vetor esteja ordenado pelos valoresda chave de busca.

A ideia do algoritmo e a seguinte (assuma que o vetor esta ordenado):

I Verifique se a chave de busca e igual ao valor da posicao do meio dovetor.

I Caso seja igual, devolva esta posicao.I Caso o valor desta posicao seja maior, entao repita o processo mas

considere que o vetor tem metade do tamanho, indo ate a posicaoanterior a do meio.

I Caso o valor desta posicao seja menor, entao repita o processo masconsidere que o vetor tem metade do tamanho e inicia na posicaoseguinte a do meio.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 32 / 40

Busca Binaria

Pseudo-Codigo:

// v e t o r comeca em i n i e t e r m i n a em f imi n i = 0f im = tam−1

R e p i t a enquanto tamanho do v e t o r c o n s i d e r a d o f o r >= 1meio = ( i n i + f im )/2

Se v e t [ meio ] == chave Entaod e v o l v a meio

Se v e t [ meio ] > chave Entaof im = meio − 1

Se v e t [ meio ] < chave Entaoi n i = meio + 1

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 33 / 40

Busca Binaria

meio = 4

0 1 2 3 4 5 6 7 8 9

vet

chave = 15 tam = 10

1 5 15 20 24 45 67 76 78 100

ini = 0

fim = 9

Como o valor da posicao do meio e maior que a chave, atualizamos fim dovetor considerado.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 34 / 40

Busca Binaria

meio = 1

0 1 2 3 4 5 6 7 8 9

vet

chave = 15 tam = 10

1 5 15 20 24 45 67 76 78 100

ini = 0

fim = 3

Como o valor da posicao do meio e menor que a chave, atualizamos ini dovetor considerado.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 35 / 40

Busca Binaria

meio = 2

0 1 2 3 4 5 6 7 8 9

vet

chave = 15 tam = 10

1 5 15 20 24 45 67 76 78 100

ini = 2

fim = 3

Finalmente encontramos a chave e podemos devolver sua posicao 2.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 36 / 40

Busca BinariaCodigo completo:

i n t main ( ) {i n t v e t [ ] = {1 , 3 , 5 , 7 , 8 , 10 , 15 , 22 , 30 , 1 0 0} ;i n t tam = 1 0 ; i n t pos = −1;i n t chave , i n i , f im , meio ;s c a n f (”%d ” , &chave ) ;i n i = 0 ;f im = tam−1;w h i l e ( i n i <= fim ) {

meio = ( f im+i n i ) / 2 ;i f ( v e t [ meio ] == chave ) {

pos = meio ;b r e a k ;

} e l s e i f ( v e t [ meio ] > chave ) {f im = meio − 1 ;

} e l s e {i n i = meio + 1 ;

}}p r i n t f (” pos = %d\n ” , pos ) ;r e t u r n 0 ;

}

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 37 / 40

Exercıcio

Escreva um programa que le 10 numeros inteiros e os salva em umvetor. Em seguida o programa deve encontrar a posicao do maiorelemento do vetor e imprimir esta posicao.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 38 / 40

Exercıcio

Escreva um programa que le 10 numeros ponto flutuante e os salvaem um vetor. Em seguida o programa deve calcular a media dosvalores armazenados no vetor e imprimir este valor.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 39 / 40

Exercıcio

Escreva um programa que le 10 numeros inteiros e os salva em umvetor. Em seguida o programa deve ler um outro numero inteiro C . Oprograma deve entao encontrar dois numeros de posicoes distintas dovetor cuja multiplicacao seja C e imprimi-los. Caso nao existam taisnumeros, o programa deve informar isto.

Exemplo: Se vetor = (2, 4, 5,−10, 7) e C = 35 entao o programadeve imprimir “5 e 7”. Se C = −1 entao o programa deve imprimir“Nao existem tais numeros”.

(Instituto de Computacao – Unicamp) MC-102 — Aula 10 40 / 40

top related