algoritmo e estrutura de dados i aulas 10 e 11 – linguagem c vetores e ponteiros márcia marra...

24
Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra [email protected]

Upload: manuel-martins-leao

Post on 07-Apr-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

Algoritmo e Estrutura de Dados I

Aulas 10 e 11 – Linguagem C Vetores e Ponteiros

Márcia [email protected]

Page 2: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

2

Vetores• Declaração de vetores no C

tipo nome_variavel[tamanho];• Exemplos de vetores:

float balance[100];char p[10];int numeros[tam];float exemplo[20];

• Acesso pode ser realizado através de índicesexemplo[0] exemplo[3]exemplo[1] exemplo[4]

• O que acontece no caso exemplo[30]?

Page 3: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

3

Exemplo 1 – Leitura de números#include <stdio.h>

int main (){ int num[100]; /* Declara um vetor de inteiros de 100 posicoes */ int count=0; int totalnums; do { printf ("\nEntre com um numero (-999 p/ terminar):"); scanf ("%d",&num[count]); count++; } while ( num[count-1] != -999);

totalnums=count-1;

printf ("\n\n\n\t Os números que você digitou foram:\n\n");

for (count=0;count<totalnums;count++) printf (" %d",num[count]);

return(0);}

Page 4: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

4

Exemplo 1

• Existe algum problema com o programa anterior?

• O que acontece se tentarmos ler mais números do que a variável que foi alocada permite?– BUGS!!– Erros imprevisíveis!

• Como este programa poderia ser reescrito para resolver este problema?

Page 5: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

5

Exemplo 1 – com restrição do número de valores lidos#include <stdio.h>

int main (){

int num[10]; /* Declara um vetor de inteiros de 100 posicoes */int count=0;int totalnums;do

{printf ("\nEntre com um numero (-999 p/ terminar):");

scanf ("%d",&num[count]); count++;

} while ( num[count-1] != -999 && count < 10);if (count < 10)

totalnums=count-1;else

totalnums=count;printf ("\n\n\n\t Os números que você digitou foram:\n\n");for (count=0;count<totalnums;count++)printf (" %d",num[count]);return(0);

}

Page 6: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

6

Execução do Exemplo 1

Page 7: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

7

Exemplo 2• A diretoria do ICEx deseja saber se existem alunos

cursando, simultaneamente, Algoritmos e Estrutura de Dados I (AEDSI) e Cálculo Numérico (CN).

• Existem disponíveis na unidade de entrada os números de matrícula dos alunos de AEDSI (no máximo 150 alunos) e de CN (no máximo 220 alunos).

• Cada conjunto dos números de matrícula dos alunos de uma disciplina tem a matrícula fictícia 99999 no final.

• Formular um algoritmo que imprima o número de matrícula dos alunos que estão cursando estas disciplinas simultaneamente.

Page 8: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

8

Exemplo 2 – Estrutura de Dados

• Este problema trata da verificação de ocorrência de um elemento de um conjunto em um outro conjunto.

...

1 2 3 4 5 ... 150 151

AEDS I

...

1 2 3 4 5 ... 220 221

CN

Page 9: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

9

Exemplo 2 (1/3)#include <stdio.h>int main() {

int AEDSI[151]; int CN[221]; int i,j;

// Leitura das matriculas de AEDSI i = 0; printf("Entre com a primeira matricula de AEDSI: "); scanf("%d", &AEDSI[i]); while (AEDSI[i] != 9999) { i++; printf("Entre com a proxima matricula de AEDSI: "); scanf("%d",&AEDSI[i]); }

Page 10: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

10

Exemplo 2 (2/3)

// Leitura das matriculas de CN i = 0; printf("Entre com a primeira matricula de CN: "); scanf("%d", &CN[i]);

while (CN[i] != 9999) { i++; printf("Entre com a proxima matricula de CN: "); scanf("%d",&CN[i]); }

Page 11: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

11

Exemplo 2 (3/3)i = 0;

while (AEDSI[i] != 9999) { j = 0; while ( CN[j] != 9999 && AEDSI[i] != CN[j]) { j++; } if ( AEDSI[i] == CN[j]) { printf("Aluno %d esta matriculado em AEDSI e

CN\n", AEDSI[i]); }

i++; } return (0);}

Page 12: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

12

Exemplo 2

• Para ler os números de matrículas dos alunos que cursam CN e AEDSI foi utilizado praticamente o mesmo código.

• O que poderia ser feito para evitar este uso repetido?

Utilizar funções!!

Page 13: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

13

Exemplo 2 utilizando funções (2/1)#include <stdio.h>

// Funcao que le um determinado numero de matriculas ate que seja lida a matricula ficticia 9999

int leVetorMatricula ( int *x, char *nomeDisciplina) { int i; // Leitura das matriculas i = 0; printf("Entre com a primeira matricula de %s: ",

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

while (x[i] != 9999) { i++; printf("Entre com a proxima matricula de %s: ",

nomeDisciplina); scanf("%d",&x[i]); } return 0;}

Page 14: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

14

Exemplo 2 utilizando funções (2/2)int main() {

int AEDSI[151]; int CN[221]; int i,j; char disciplinaAEDS[] = "AEDSI"; char disciplinaCN[] = "CN";

leVetorMatricula( AEDSI, disciplinaAEDS); leVetorMatricula( CN, disciplinaCN);

i = 0; while (AEDSI[i] != 9999) { j = 0; while ( CN[j] != 9999 && AEDSI[i] != CN[j]) { j++; }

if ( AEDSI[i] == CN[j]) printf("Aluno %d esta matriculado em AEDSI e CN\n", AEDSI[i]); i++; } return (0);}

Page 15: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

15

Exemplo 2 – outra forma para passagem do vetor como parâmetro

int leVetorMatricula ( int x[], char nomeDisciplina[]) {

int i;

// Leitura das matriculas i = 0;

printf("Entre com a primeira matricula de %s: ", nomeDisciplina);

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

while (x[i] != 9999) { i++; printf("Entre com a proxima matricula de %s: ",

nomeDisciplina); scanf("%d",&x[i]); } return 0;}

Page 16: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

16

Execução do exemplo 2

Page 17: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

17

Exemplo 3• Escrever um algoritmo que faça reserva de passagens

aéreas de uma companhia.• Além da leitura do número de vôos e quantidade de

lugares disponíveis, ler vários pedidos de reserva, constituídos do número da carteira de identidade do cliente e do número do vôo desejado.

• Para cada cliente, verificar se há disponibilidade no vôo desejado. – Em caso afirmativo, imprimir o número da identidade do cliente e o

número do vôo, atualizando o número de lugares dosponíveis. – Caso contrário, avisar ao cliente da inexistência de lugares.

• Indicando o fim dos pedidos de reserva, existe um passageiro cujo número da carteira de identidade é 9999. Considerar fixo e igual a 37 o número de vôos da companhia.

Page 18: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

18

Exemplo 3 – Estrutura de Dados

Número dos

Vôos

Lugares

Disponíveis

Page 19: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

19

Exemplo 3#include <stdio.h>// Define o numero de voos da companhia#define NUMVOOS 37

/* Funcao que lê um determinado numero de valores e armazena em um vetor */int leVetor( int *x, int opcao) { int i = 0; if ( opcao == 1) printf("Entre com numero do primeiro voo: "); else printf("Entre com a disponibilidade de lugares

no primeiro voo: ");

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

for (i = 1; i < NUMVOOS; i++) { if ( opcao == 1) printf("Entre com o numero do %d voo: ", i+1); else printf("Entre com a disponibilidade de lugares no %d voo: ",

i+1); scanf("%d",&x[i]); } return 0;}

Page 20: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

20

Exemplo 3/* Funcao que realiza a busca de um numero de voo dentro do vetor

com todos os voos disponiveis pela companhia aerea */

int buscaVoo( int *x, int voo, int *apont) {

int resultado = -1;

int i;

// Percorre o vetor em busca do voo for (i = 0; i < NUMVOOS; i++) {

if ( x[i] == voo ) { resultado = i; *apont = i; break; } } return (resultado);}

Page 21: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

21

Exemplo 3/* Funcao que verifica a disponibilidade de lugares em um

determinado voo */

int verificaDisponibilidade(int *x, int posicaoVoo) {

int resultado = 0;

if ( x[posicaoVoo] > 0) { x[posicaoVoo] = x[posicaoVoo] - 1; resultado = 1; }

return (resultado);}

Page 22: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

22

Exemplo 3int main () {

int voos[NUMVOOS]; int ldisp[NUMVOOS];

int apont, cliente, i, numeroVoo;

// Leitura do numero dos voos leVetor(voos, 1); // Leitura da disponibilidade de lugares em cada voo leVetor(ldisp, 2);

// Le o primeiro cliente printf("Entre com o numero da CI do cliente: "); scanf("%d", &cliente);

// Le o voo para reserva printf("Entre com o numero do voo: "); scanf("%d", &numeroVoo);

Page 23: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

23

Exemplo 3while (cliente != 9999) { if (buscaVoo(voos, numeroVoo, &apont) != -1) {

if (verificaDisponibilidade(ldisp, apont)) printf("\n\nVoo %d reservado para cliente %d\n", numeroVoo, cliente); else printf("\n\nVoo lotado! Tente novamente.\n"); } else { printf("\n\nVoo inexistente. Tente novamente.\n"); } // Le o proximo cliente printf("Entre com o numero da CI do cliente: "); scanf("%d", &cliente);

// Le o voo para reserva printf("Entre com o numero do voo: "); scanf("%d", &numeroVoo); } return 0;}

Page 24: Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores e Ponteiros Márcia Marra marsha@dcc.ufmg.br

24

Execução do exemplo 3