Algoritmo e Estrutura de Dados I Aulas 10

  • Slides: 24
Download presentation
Algoritmo e Estrutura de Dados I Aulas 10 e 11 – Linguagem C Vetores

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

Vetores • Declaração de vetores no C tipo nome_variavel[tamanho]; • Exemplos de vetores: float

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 índices exemplo[0] exemplo[1] exemplo[3] exemplo[4] • O que acontece no caso exemplo[30]? 2

Exemplo 1 – Leitura de números #include <stdio. h> int main () { int

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 ("n. Entre com um numero (-999 p/ terminar): "); scanf ("%d", &num[count]); count++; } while ( num[count-1] != -999); totalnums=count-1; printf ("nnnt Os números que você digitou foram: nn"); for (count=0; count<totalnums; count++) printf (" %d", num[count]); return(0); } 3

Exemplo 1 • Existe algum problema com o programa anterior? • O que acontece

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? 4

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

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 ("n. Entre 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 ("nnnt Os números que você digitou foram: nn"); for (count=0; count<totalnums; count++) printf (" %d", num[count]); return(0); } 5

Execução do Exemplo 1 6

Execução do Exemplo 1 6

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

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. 7

Exemplo 2 – Estrutura de Dados • Este problema trata da verificação de ocorrência

Exemplo 2 – Estrutura de Dados • Este problema trata da verificação de ocorrência de um elemento de um conjunto em um outro conjunto. AEDS I . . . 1 2 3 4 5 . . . 150 151 CN . . . 1 2 3 4 5 . . . 8 220 221

Exemplo 2 (1/3) #include <stdio. h> int main() { int AEDSI[151]; int CN[221]; int

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]); } 9

Exemplo 2 (2/3) // Leitura das matriculas de CN i = 0; printf("Entre com

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]); } 10

Exemplo 2 (3/3) i = 0; while (AEDSI[i] != 9999) { j = 0;

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 CNn", AEDSI[i]); } i++; } return (0); } 11

Exemplo 2 • Para ler os números de matrículas dos alunos que cursam CN

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!! 12

Exemplo 2 utilizando funções (2/1) #include <stdio. h> // Funcao que le um determinado

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 le. Vetor. Matricula ( int *x, char *nome. Disciplina) { int i; // Leitura das matriculas i = 0; printf("Entre com a primeira matricula de %s: ", nome. Disciplina); scanf("%d", &x[i]); while (x[i] != 9999) { i++; printf("Entre com a proxima matricula de %s: ", nome. Disciplina); scanf("%d", &x[i]); } return 0; } 13

Exemplo 2 utilizando funções (2/2) int main() { int AEDSI[151]; int CN[221]; int i,

Exemplo 2 utilizando funções (2/2) int main() { int AEDSI[151]; int CN[221]; int i, j; char disciplina. AEDS[] = "AEDSI"; char disciplina. CN[] = "CN"; le. Vetor. Matricula( AEDSI, disciplina. AEDS); le. Vetor. Matricula( CN, disciplina. CN); 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 CNn", AEDSI[i]); i++; } return (0); } 14

Exemplo 2 – outra forma para passagem do vetor como parâmetro int le. Vetor.

Exemplo 2 – outra forma para passagem do vetor como parâmetro int le. Vetor. Matricula ( int x[], char nome. Disciplina[]) { int i; // Leitura das matriculas i = 0; printf("Entre com a primeira matricula de %s: ", nome. Disciplina); scanf("%d", &x[i]); while (x[i] != 9999) { i++; printf("Entre com a proxima matricula de %s: ", nome. Disciplina); scanf("%d", &x[i]); } return 0; } 15

Execução do exemplo 2 16

Execução do exemplo 2 16

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

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. 17

Exemplo 3 – Estrutura de Dados Número dos Lugares Vôos Disponíveis 18

Exemplo 3 – Estrutura de Dados Número dos Lugares Vôos Disponíveis 18

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

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 le. Vetor( 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; } 19

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

Exemplo 3 /* Funcao que realiza a busca de um numero de voo dentro do vetor com todos os voos disponiveis pela companhia aerea */ int busca. Voo( 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); } 20

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

Exemplo 3 /* Funcao que verifica a disponibilidade de lugares em um determinado voo */ int verifica. Disponibilidade(int *x, int posicao. Voo) { int resultado = 0; if ( x[posicao. Voo] > 0) { x[posicao. Voo] = x[posicao. Voo] - 1; resultado = 1; } return (resultado); } 21

Exemplo 3 int main () { int voos[NUMVOOS]; int ldisp[NUMVOOS]; int apont, cliente, i,

Exemplo 3 int main () { int voos[NUMVOOS]; int ldisp[NUMVOOS]; int apont, cliente, i, numero. Voo; // Leitura do numero dos voos le. Vetor(voos, 1); // Leitura da disponibilidade de lugares em cada voo le. Vetor(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", &numero. Voo); 22

Exemplo 3 while (cliente != 9999) { if (busca. Voo(voos, numero. Voo, &apont) !=

Exemplo 3 while (cliente != 9999) { if (busca. Voo(voos, numero. Voo, &apont) != -1) { if (verifica. Disponibilidade(ldisp, apont)) printf("nn. Voo %d reservado para cliente %dn", numero. Voo, cliente); else printf("nn. Voo lotado! Tente novamente. n"); } else { printf("nn. Voo 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", &numero. Voo); } return 0; } 23

Execução do exemplo 3 24

Execução do exemplo 3 24