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

40
MC-102 — Aula 10 Vetores Instituto de Computa¸c˜ ao – Unicamp

Upload: others

Post on 02-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

MC-102 — Aula 10Vetores

Instituto de Computacao – Unicamp

Page 2: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 3: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 4: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 5: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 6: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 7: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 8: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 9: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 10: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 11: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 12: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 13: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 14: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 15: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 16: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 17: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 18: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 19: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 20: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 21: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 22: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 23: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 24: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 25: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 26: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 27: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 28: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 29: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 30: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 31: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 32: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 33: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 34: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 35: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 36: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 37: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 38: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 39: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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

Page 40: MC-102 Aula 10 Vetoreslucas/teaching/mc102/2017-1/... · 2017. 4. 3. · vetor2 para saber se s~ao iguais. Usamos uma vari avel indicadora para decidir ao nal dos la˘cos encaixados,

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