Você está na página 1de 24

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 balance[100];
char p[10];
int numeros[tam];
float exemplo[20];
• Acesso pode ser realizado através de índices
exemplo[0] exemplo[3]
exemplo[1] exemplo[4]
• O que acontece no caso exemplo[30]?
2
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);
}
3
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 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);
}

5
Execução do Exemplo 1

6
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
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 ... 220 221
8
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 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;
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);
}

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

13
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);
}

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

15
Execução do exemplo 2

16
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


18
Vôos Disponíveis
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;
}
19
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);
}

20
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);
}

21
Exemplo 3
int 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);

22
Exemplo 3
while (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;
}

23
Execução do exemplo 3

24

Você também pode gostar