introdução 1

Propaganda
UNIVERSIDADE NOVE DE JULHO - UNINOVE
1
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
INTRODUÇÃO
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
ESTRUTURAS DE DADOS
2
• EMENTA: Vetores e Matrizes, Strings, Ponteiros, Funções, Estruturas (struct), Tabelas,
ordenação e busca em vetores, listas ligadas e manipulação de arquivos.
• OBJETIVOS: Capacitar o aluno a desenvolver programas usando funções e ponteiros.
Manipular estruturas de dados: vetores e matrizes, estruturas e tabelas. Manipular strings.
Habilitar o aluno a manipular variáveis e estruturas de dados através de ponteiros. Aplicar todos
os conceitos na Linguagem C.
• METODOLOGIA DE ENSINO: Nas aulas teóricas os conceitos serão expostos por meio de
utilização de lousa, retroprojetor, datashow, sendo disponibilizado para os alunos o material de
apoio utilizado. Serão propostas atividades individuais ou em grupo para melhor fixação dos
conceitos. As aulas práticas serão no laboratório de informática utilizando como ferramenta de
apoio a linguagem de programação C. Todas as aulas práticas serão duas das quatro aulas no
período.
• SISTEMA DE AVALIAÇÃO: O critério de avaliação deverá ser composto por 03 notas oficiais
(AV1, AV2 e AV3), oriundas de instrumentos diversificados de avaliação. Para a composição da
média serão consideradas as duas maiores notas obtidas entre a AV1, AV2 e AV3, sendo que
as duas maiores notas serão somadas e divididas por 2, considerando-se aprovado o aluno
que obtiver média final maior ou igual a 6,0 (seis).
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
BIBLIOGRAFIA
3
• Bibliografia básica:
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C – Módulo I. São Paulo: Ed.
Makron Books, 1990.
MESQUITA, Thelmo João Martins. Linguagem C, 1988. Ed. Erica, 1988.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C – Módulo II. São Paulo: Ed.
Makron Books, 1990.
• Bibliografia complementar:
SCHILDT, Hebert. C – Completo e total. Ed. Makron Books, 1995.
MANZANO, José Augusto Navarro Garcia & OLIVEIRA, Jair Figueiredo de. Estudo dirigido de
Linguagem C.
PEREIRA, Vânia C.S. Algoritmos e Lógica de Programação – 100 exercícios resolvidos em
pseudocódigo e linguagem C. São Paulo: Agbook, 2011. www.agbook.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Revisão:
Estruturas de Repetição
Constantes
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
4
Estruturas de Repetições
5
• São necessárias quando se tem que repetir uma determinada instrução, que represente um
comportamento padrão, várias vezes.
• Com estas estruturas, escreve-se a instrução uma única vez, e ela pode ser executada várias
vezes.
• Repetições podem ser controladas por:
• Condição;
• Contador.
• Quando o controle é por contador, a interrupção é prevista no instante em que é iniciada a
execução da estrutura de controle de repetições.
• Quando o controle é por condição, deverá haver uma expressão lógica, e a interrupção será
controlada por meio do resultado desta expressão.
• É imprescindível que haja uma instrução dentro do bloco de instruções que permita a
alteração do valor lógico da condição.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Estrutura de Repetição Enquanto
6
• É uma estrutura de repetição com condição que permite executar uma ou mais instruções um
determinado número de vezes.
• O bloco será executado enquanto o resultado da <expressão lógica> for verdadeiro. Se já da
primeira vez o resultado for falso, os comandos não são executados nem uma vez.
• Portanto, a quantidade de repetições é indeterminada nesta estrutura.
• O fluxo neste comando é o seguinte: a primeira vez que se chega ao comando de repetição, é
feito o teste da <expressão lógica>, que determina se deve ou não entrar no bloco.
• Se entrar, ao final do bloco volta-se para a primeira linha do bloco e então testa-se novamente
a <expressão lógica>.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Estrutura de Repetição Enquanto
7
Permite executar diversas vezes um trecho do algoritmo, porém, sempre verificando antes
de cada execução se é “permitido” executar o trecho.
Exemplo
Linguagem de Programação
while ( < expressão lógica > )
< instruções > ;
Lembre-se que em uma
<expressão lógica> o resultado
deve ser verdadeiro ou falso.
# include < stdio.h >
# include < stdlib.h >
int main ( ) {
int cont = 0 ;
float n1, n2, n3, media ;
while ( cont < 3 ) {
printf ( "Digite as tres notas: \n“ ) ;
scanf ( "%f %f %f", &n1, &n2, &n3 ) ;
media = ( n1 + n2 + n3 ) / 3 ;
cont ++ ;
printf ( "\n\nA media e igual a %0.2f\n\n", media ) ;
}
system ( “pause” ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Estrutura de Repetição Repita
8
• Esta estrutura permite que uma seqüência de comandos sejam executada até que uma
determinada condição seja satisfeita.
• O fluxo neste comando é o seguinte : a primeira vez que se chega ao comando de repetição,
entra-se no bloco.
• Ao final do bloco testa-se a condição e volta para a primeira linha do bloco se a condição for
falsa.
• O bloco será executado sempre que o resultado da <expressão lógica> for falso, no momento
em que se tornar verdadeiro a ação subseqüente ao comando ‘até que’ será executada.
• Esse tipo de repetição garante que o comando seja executado pelo menos uma vez antes que
a repetição termine.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
9
Estrutura de Repetição Repita
Linguagem de Programação
# include < stdio.h >
# include < stdlib.h >
Linguagem de Programação
do {
<instruções>;
} while <expressão lógica>;
Lembre-se que em uma
<expressão lógica> o resultado
deve ser verdadeiro ou falso.
int main ( ) {
int cont = 1 ;
float n1, n2, n3, media ;
do {
printf ( "Digite tres notas\n " ) ;
scanf ( "%f %f %f", &n1, &n2, &n3 ) ;
media = ( n1 + n2 + n3 ) / 3 ;
printf ( "A media e igual a %0.2f\n\n", media ) ;
cont ++ ;
} while ( cont <= 3 ) ;
system ( "pause ") ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Estrutura de Repetição Para - Faça
10
• É uma estrutura de repetição com contador que permite executar uma ou mais instruções um
determinado número de vezes.
• Para controlar o número de repetições, empregamos uma variável do tipo numérico inteiro.
• Ao encontrar a instrução Para é atribuída à variável o valor de início declarado. A partir daí a
sequência de comandos é executada repetidamente, até que a variável atinja o valor de fim.
• A cada vez que a sequência de comandos é executada, a variável é incrementada
automaticamente.
• Esta estrutura só pode ser utilizada em repetições controladas por um contador. Isto é, aquelas
repetições que sabemos o número de vezes que acontecerá quando iniciamos sua execução.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
11
Estrutura de Repetição Para - Faça
Linguagem de Programação
for ( <variável-de-controle>; <condição>; <incremento> )
<instruções>;
Linguagem de Programação
# include < stdio.h >
# include < stdlib.h >
int main ( ) {
int cont ;
float n1, n2, n3, media ;
for ( cont = 1; cont <=3; cont ++ ) {
printf ( "Digite tres notas\n" ) ;
scanf ( "%f %f %f", &n1, &n2, &n3 ) ;
media = ( n1 + n2 + n3 ) / 3 ;
printf ( "A media e igual a %0.2f\n\n", media ) ;
}
system (" pause “ ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
12
Comparação entre as estruturas de Repetição
• Toda estrutura PARA e REPITA pode ser convertida em ENQUANTO, mas nem toda estrutura
ENQUANTO pode ser convertida em PARA ou REPITA.
Estrutura
Condição
Quantidade de Execuções
Condição de Existência
Enquanto
Início
Indeterminada
Condição verdadeira
Repita
Fim
Mínimo 1
Condição falsa
Para
Implícita no início
( fim – inicio + 1 )
<variável> <= fim
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
13
Variáveis e Constantes em C
Em C, como na maioria das linguagens, as variáveis e constantes devem ser declaradas no
inicio do programa. Estas variáveis podem ser de um dos tipos válidos para a linguagem. A
sintaxe da declaração de variáveis é:
<tipo_da_variável> <lista_de_variáveis>;
Para declarar uma constante utilize a diretiva de compilação #define. Sintaxe:
#define <IDENTIFICADOR> <valor-associado>
Para facilitar a leitura de um programa é recomendável usar uma prática tradicional usando
letras minúsculas para identificadores de variáveis e maiúsculas para identificadores de
constantes, preferencialmente utilizando palavras em português.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
14
Atributos de uma variável
• Atributos (características) de uma variável:
• Identificador, Tipo, Valor associado
Identificador (nome da variável)
Tipo de dado que será armazenado (inteiro, real, caractere ou lógico)
Valor associado (valor armazenado na célula de memória)
Endereço Físico
Identificador
Tipo de dado
Valor Associado
3000: B712
nome
caractere
“João”
2000: 12EC
numero
inteiro
12345
3000: 0004
letra
caractere
“H”
3000: C223
medida
real
0,35
2000: 11DA
resposta
lógico
verdadeiro
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
15
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Matriz e Vetor
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
16
Listas Lineares
• Uma das formas mais comumente usadas para se manter dados agrupados é a lista. Existem
vários exemplos de listas lineares, tais como:
• Fila de clientes em um banco: existe o primeiro da fila, o último da fila e os clientes fazem
com que exista uma "ordem" de atendimento;
• Fichário: existe um número finito de fichas que está agrupado segundo uma "ordem"
preestabelecida, de tal forma que conseguimos identificar a terceira ficha, a décima ficha,
etc..
• Uma lista linear é um conjunto de informações de qualquer tipo, organizadas sequencialmente.
• A organização sequencial estabelece uma relação de ordem, decorrendo daí a possibilidade de
identificar qualquer elemento da lista: o primeiro ou o último ou qual elemento precede ou
sucede qualquer outro.
• Uma lista linear é uma coleção L: [a0, a1, ..., an-1], onde n >= 0, cuja propriedade estrutural
baseia-se apenas na posição relativa dos elementos, que estão dispostos linearmente.
• Uma lista linear suporta diversas operações, tais como: inserção, remoção, acesso, contagem,
concatenação (juntar duas listas), etc.
x1 x4
x
x3
x2 7
x5
x6
x1 < x2 < x3 < x4 < x5 < x6 < x7
Conjunto
Lista Linear
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Listas Lineares
17
• Exemplos:
• listas de elementos com informações de um único tipo:
• listas de inteiros
• listas de reais
• listas de caracteres, etc.
• listas com agrupamento de informações de vários tipos; cada conjunto de informações constitui
um registro e cada informação constitui um campo:
• listas de cadastros de clientes de um banco; para cada cliente existe o seu cpf, nome,
endereço, saldo e saldo médio. Neste caso, o registro contém 5 campos.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Matrizes e Vetores
18
• Conjunto de variáveis, cada uma com um valor associado, como se fossem variáveis simples,
mas todas compartilham o mesmo nome (identificador).
• Índices são utilizados para referenciar os elementos deste conjunto.
• Podem armazenar mais de um valor na variável ao mesmo tempo.
• Todos os valores do conjunto de variáveis devem ser do mesmo tipo.
• Para utilizarmos uma matriz ou vetor, devemos fazer a declaração estabelecendo o tipo de
seus elementos e o seu número máximo de elementos.
• A variável é dividida em várias células, denominadas posições, cada uma identificada por
índices numéricos ro tipo inteiro positivo.
• Todas as posições pertencem à mesma variável.
• Cada posição tem acesso individual e independente.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
19
Matrizes
•
•
•
•
Um conjunto de variáveis com mais de uma dimensão.
O mais utilizado é o bidimensional (aquele que possui duas dimensões).
As dimensões de uma matriz são dadas pelo número de linhas e colunas da matriz.
Sinônimos:
• Conjunto multidimensional
• Vetor multidimensional
• Array multidimensional
• Referimo-nos à cada posição da matriz usando seu nome seguido do índice de sua linha, uma
vírgula e o índice de sua coluna, sendo que os índices devem estar delimitados pelos
caracteres “ [“ e “]”.
0
1
2
3
0
nome_mat
1
2
• Exemplo: nome_mat [ linha ] [ coluna ] No caso da matriz acima, há 3 linhas e 4 colunas.
Dizemos que nome_mat é uma matriz com dimensão 3X4.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
20
Matrizes
• A variação dos índices da matriz devem ficar dentro dos limites da dimensão que os índices
representam. A ordem dos índices interfere no resultado da operação, por isso CUIDADO!
nome_mat
0
1
2
3
0
Referindo-se a nome_mat [ 0 ] [ 2 ]
1
2
•
•
•
•
•
Referindo-se a nome_mat [ 2 ] [ 0 ]
Exemplos de atribuições a matrizes
mat_a [0] [0] = 3
mat_a [0] [1] = 5
mat_a [1] [0] = mat_a [0] [0] + mat_a [0] [1]
mat_a [1] [1] = mat_a [1] [0] * 4
0
0
1
2
3
8
mat_a
1
2
5
32
3
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
21
Exemplo de preenchimento de Matriz
• Há uma forma prática para se trabalhar com matrizes.
F
for ( linha = 0; linha < 3; linha ++ )
for ( coluna = 0; coluna < 4; coluna ++ )
mat_a [linha] [coluna] = linha + coluna ;
linha ← 0, 2
V
F
coluna ← 0, 3
mat_a
V
0
1
2
3
0
0
1
2
3
1
1
2
3
4
2
2
3
4
5
mat_a [linha] [coluna ] ←
linha + coluna
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
22
Declaração de Matrizes
< tipo-de-dado > < identificador > [ < qtd_linhas > ] [ < qtd_colunas > ] ;
Exemplos
0
0
1
2
3
4
5
5,5
7,5
0,5
1,2
3,6
4,8
1
float mat_a [ 10 ] [ 6 ] ;
2
3,0
3
4
5,6
8,4
6,4
5
int mat_b [ 5 ] [ 5 ] ;
0
0
4
1
5
1
2
3
4
7,1
7
8
6
2
13
9
3,3
2,0
1,9
2
3
4
6
9
11
24
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
23
Exemplo de utilização de matriz
Programa que calcula a soma dos elementos da diagonal principal de uma matriz quadrada 3x3,
# include < stdio.h >
# include < stdlib.h >
# define N 3
int main ( ) {
int matriz [ N ] [ N ] ;
int linha, coluna, soma ;
printf ( "Soma Diagonal\n" ) ;
soma = 0 ;
for ( linha = 0; linha < N; linha ++ )
for ( coluna = 0; coluna < N; coluna ++ ) {
scanf ( "%d", &matriz [ linha ] [ coluna ] ) ;
if ( linha == coluna )
soma = soma + matriz [ linha ] [ coluna ] ;
}
printf ( "\n\nSoma = %d \n", soma ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
24
Vetores
• Denominação: variáveis compostas homogêneas unidimensionais.
• Vetores são matrizes que possuem somente uma dimensão.
• CUIDADO: a variação do índice do vetor deve ficar dentro dos limites da dimensão que o índice
representa.
• Referimo-nos a cada posição do vetor usando seu nome seguido de seu índice, delimitado
pelos caracteres “ [“ e “]”.
• Exemplo: nome_vet [ 2 ]
0
1
2
3
4
5
6
7
4
5
6
7
nome_vet
• Exemplos de atribuições a vetores
• nome_vet [ 0 ] = 1
• nome_vet [ 1 ] = 5
• nome_vet [ 2 ] = nome_vet [ 0 ] + nome_vet [ 1 ]
• nome_vet [ 3 ] = nome_vet [ 2 ] - 4
nome_vet
0
1
2
3
1
5
6
2
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
25
Exemplo de preenchimento de Vetor
• Forma mais usual de entrada de dados em vetores
...
for ( i = 0 ; i < 7; i ++ )
scanf ( “%d”, &vet [ i ] )
...
i ← 0, 7
F
V
vet [ i ]
vet
0
1
2
3
4
5
6
7
17
29
31
11
43
27
59
33
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Declaração de vetores
< tipo-de-dado > < identificador > [ < qtd_elementos > ] ;
Exemplos
int idade_chefe [ 5 ] ;
float salario_emp [ 250 ] ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
26
27
Exemplo de utilização de vetor
Programa que lê e calcula a média de 5 notas de um aluno
# include < stdio.h >
# include < stdlib.h >
# define TAM 5
int main ( ) {
float nota [ TAM ] , soma, media ;
int i ;
soma = 0;
printf ( "Digite os valores das cinco notas: \n" ) ;
for (i = 0 ; i < TAM ; i ++ )
scanf ("%f", &nota [ i ] ) ;
for (i = 0 ; i < TAM ; i ++ )
soma = soma + nota [ i ] ;
media = soma / 5 ;
printf ( "\nMedia das notas: %.2f\n\n" , media ) ;
system ( "pause") ;
return 0 ;
}
0
1
2
3
4
nota
7,0
5,0
8,0
3,0
9,0
soma
32
media
6,4
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
28
Exemplo de utilização de vetor
Início
1
soma ← 0
i ← 0, 4
F
V
i ← 0, 4
F
soma ←
soma + nota [ i ]
V
nota [ i ]
1
media ←
soma / 5
media
Fim
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
29
Exemplo de utilização de vetor
#include < stdio.h >
#include < stdlib.h >
Enunciado
Sejam dois vetores, cada um
contendo 5 valores numéricos
reais, armazenar em um terceiro
vetor a média aritmética entre os
valores dos dois primeiros, calcular
a média dos valores do terceiro
vetor, apresentar cada valor do
terceiro vetor comparando com a
média geral
int main ( ) {
float vetor1 [ ] = { 33, 21, 45, 13, 3 } ;
float vetor2 [ ] = {8, 4, 16, 28, 12 } ;
float medarit [ 5 ], soma, medgeral ;
int i ;
soma = 0 ;
for ( i = 0; i < 5; i ++ ) {
medarit [ i ] = ( vetor1 [ i ] + vetor2 [ i ] ) / 2 ;
soma = soma + medarit [ i ] ;
}
medgeral = soma / 5 ;
printf ( "Media geral = %0.1f\n\n", medgeral ) ;
for ( i = 0; i < 5; i ++ )
printf ( "Posicao [ %d ] - Media Aritmetica = %.1f - ", i, medarit [ i ] ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exercícios: Matrizes e Vetores - 1
1. Considerando um vetor capaz de armazenar 5 elementos inteiros, mostre:
a) como declarar este vetor em um programa em C
b) como zerar todos os elementos do vetor
c) como exibir os elementos do vetor em ordem crescente de índice
d) como exibir os elementos do vetor em ordem decrescente de índice
2. O que acontece se usarmos a seguinte codificação?
char dados [ 3 ] ;
...
dados [ -1 ] = 5
dados [ 9 ] = -2
...
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
30
Exercícios: Matrizes e Vetores - 2
31
3. Dado o programa abaixo, quais os valores impressos após o final da execução do mesmo?
# include <stdio.h>
# include <stdlib.h>
int main ( ) {
int vet [ 9 ] = { 12, 6, 9, 5, 14, 8, 33, 54, 35 } ;
int x = 2, y = 3 ;
printf ( "\n\n a) %d", vet [ x ] ) ;
printf ( "\n\n b) %d", vet [ x + 1 ] ) ;
printf ( "\n\n c) %d", vet [ x * 2 ] ) ;
printf ( "\n\n d) %d", vet [ x + y ] ) ;
printf ( "\n\n e) %d", vet [ x * y + 2 ] ) ;
printf ( "\n\n f) %d", vet [ vet[x -1] + 1] ) ;
printf ( "\n\n h) %d", vet [ vet [ x + 1 ] ] ) ;
printf ( "\n\n i) %d", vet [ vet [ x + 1 ] - ( y + 1 ) ] ) ;
printf ( "\n\n j) %d", vet [vet[ y + 1 ] - vet[2 + y]] ) ;
printf ( "\n\n k) %d", vet [ vet[ x * y + 1] % vet[y-x] ] ) ;
printf("\n\n\n");
system ( "pause" );
return 0;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exercícios: Matrizes e Vetores - 2
32
4. Faça um programa que receba dados do tipo inteiro suficientes para preencher uma matriz
com dimensão 2 x 5, calcule e mostre a quantidade de números ímpares.
5. Faça um programa que receba 15 valores reais que devem ser armazenados em um vetor.
Após a digitação de todos os valores, mostre-os na tela, altere todos os valores para sua
metade respectiva e imprima os resultados atuais.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
33
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Manipulação de strings em C
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
34
Strings em C
• A linguagem C não possui o tipo de dado string como em muitas outras linguagens de
programação. Strings em C são tratados como vetores.
• Até o momento a entrada de dados do tipo caractere (string) foi efetuada por meio do comando
scanf, entretanto este comando lê somente até o primeiro espaço, ou seja, até a primeira
palavra.
• Uma string em C na forma de um vetor armazenará em cada posição um caractere, sendo que
sempre haverá uma posição a mais que irá conter o terminador nulo, representado por ‘\0’.
Atenção ao fato que ‘\0’ não representa o número zero (0), mas sim um caractere nulo,
determinando o final da string.
• A declaração de uma string é: char < identificador > [ tamanho ] ;
• Obs.: O tamanho deverá prever também um caractere a mais correspondente ao ‘\0’.
Exemplo: char var_str [ 8 ] ;
indice
0
1
2
3
4
5
6
7
valor
a
m
e
r
i
c
a
‘\0’
• Como a linguagem C não manipula diretamente strings, temos uma série de funções préexistentes para diversas tarefas.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
35
• Função gets ( ) ;
• Lê os caracteres digitados no teclado, armazena no vetor e coloca o terminador nulo no final
da string.
Sintaxe: gets ( < identificador > ) ;
Exemplo:
# include < stdio.h >
# include < stdlib.h >
int main ( ) {
char palavra [ 50 ] ;
printf ( "Digite uma palavra qualquer: " ) ;
gets ( palavra ) ;
printf ( "\n\nPalavra digitada: %s\n\n\n", palavra ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
36
• Função puts ( ) ;
• Escreve o conteúdo da string na unidade padrão de saída e coloca um '\n' no final.
• Sintaxe: puts ( < identificador/string > ) ;
• A função puts() pode escrever apenas strings de caracteres, não podendo escrever
números ou fazer conversões de formato. Se quisermos utilizar caracteres de controle na
função puts, devendo utilizar separadamente da variável string.
• Exemplo:
# include < stdio.h >
# include < stdlib.h >
int main ( ) {
char palavra [ 50 ] ;
printf ( "Digite uma palavra qualquer: " ) ;
gets ( palavra ) ;
puts ( "\n\nPalavra digitada:\n" ) ;
puts ( palavra ) ;
puts ( "\n\n\n" ) ;
system ( “pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
37
• Função strcmp ( ) ;
• Compara o conteúdo de duas strings. Para utilizar esta função acrescente ao seu programa a
blibioteca string.h.
• Sintaxe: strcmp ( < string1 >, < string2 > ) ;
• Se as strings forem iguais a função retorna zero.
• Se a string1 for maior que a string2 a função retorna um valor positivo.
• Se a string1 for menor que a string2 a função retorna um valor negativo.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
• Exemplo:
# include < stdio.h >
# include < stdlib.h >
# include < string.h >
int main ( ) {
char palavra1 [ 30 ], palavra2 [ 30 ] ;
int result ;
printf ( "Digite a primeira palavra: " ) ; gets ( palavra1 ) ;
printf ( "\nDigite a segunda palavra: " ) ; gets ( palavra2 ) ;
result = strcmp ( palavra1, palavra2 ) ;
if ( result == 0 )
printf ( "\n\nAs palavras são iguais. \n\n\n" ) ;
else
if ( result > 0 )
printf ( "\n\nA primeira palavra é a maior.\n\n\n" ) ;
else
printf ( "\n\nA segunda palavra é a maior.\n\n\n" ) ;
system ( "pause" );
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
38
Funções para manipulação de strings em C
39
• Função strcpy ( ) ;
• Copia o conteúdo de uma string para outra string. Para utilizar esta função acrescente ao seu
programa a blibioteca string.h.
• Sintaxe: strcpy ( < string_destino >, < string_origem > ) ;
• A linguagem de programação C não permite atribuição de valores para uma variável do tipo
caractere usada simplesmente a instrução < string_destino > = < string_origem > ;
• Para tal operação existe a função strcpy.
• Exemplo:
# include < stdio.h >
# include < stdlib.h >
# include < string.h >
int main ( ) {
char palavra1 [ 30 ], palavra2 [ 30 ], palavra3 [ 30 ] ;
printf ( "Digite uma palavra qualquer: " ) ;
gets ( palavra1 ) ;
strcpy ( palavra2, palavra1 ) ;
strcpy ( palavra3, "Palavra digitada: " ) ;
printf ( "\n\n%s%s.\n\n\n", palavra3, palavra2 ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
40
• Função strlen ( ) ;
• Retorna o comprimento de uma string. Para utilizar esta função acrescente ao seu programa
a blibioteca string.h.
• Sintaxe: strlen ( < string > ) ;
• O valor retornado pela função é a quantidade de caracteres da string, não levando em
consideração o caractere nulo, portanto o tamanho do vetor será sempre o valor devolvido
acrescido de uma unidade inteira.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
41
• Exemplo:
# include < stdio.h >
# include < stdlib.h >
# include < string.h >
int main ( ) {
char string1 [ ] = { "Universidade Nove de Julho" } ;
char string2 [ 50 ] ;
printf ( "Conteudo da variável string1 = %s.\n", string1 ) ;
printf ( "Numero de caracteres da variável string1 = %d.\n", strlen ( string1 ) ) ;
printf ( "Tamanho do vetor da variável string1 = %d.\n\n\n", strlen ( string1 ) + 1 ) ;
printf ( "Digite uma string qualquer: " ) ;
gets ( string2 ) ;
printf ( "Numero de caracteres da variável string2 = %d.\n", strlen ( string2 ) ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções para manipulação de strings em C
42
• Função strcat ( ) ;
• Une duas strings. Para utilizar esta função acrescente ao seu programa a blibioteca string.h.
• Sintaxe: strcat ( < string_destino >, < string_origem > ) ;
• A função strcat concatena (junta) ao final da < string_destino > o conteúdo da
< string_origem >. O conteúdo da string de origem não será alterado.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
43
Funções para manipulação de strings em C
• Exemplo:
# include < stdio.h >
# include < stdlib.h >
# include < string.h >
int main ( ) {
char nome [ 30 ], sobrenome [ 30 ], mensagem [ 30 ] ;
printf ( "Digite o primeiro nome: " ) ;
gets ( nome ) ;
strcat ( nome," " ) ;
printf ( "Digite o sobrenome: " ) ;
gets ( sobrenome ) ;
strcat ( nome, sobrenome ) ;
strcpy ( mensagem, "Nome completo = " ) ;
strcat ( mensagem, nome ) ;
printf ( "\n\%s.\n\n\n", mensagem ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
44
Vetor de Strings
• String é um vetor de caracteres.
0
1
2
3
4
5
6
D
e
n
i
s
e
\0
• Desta forma um vetor de strings poderia ser representado da seguinte maneira:
0
1
6
0
2
0 1 2
3
4
5
1
2
3
4
5
D e n
i
s
e \0 E d
s
o
n \0
6
3
0
1
2
3
4
5
6
0
1
F
a
u
s
t
o \0 A n
2
3
4
5
6
a \0
• O vetor acima nada mais é do que uma matriz bidimensional de caracteres.
• Devemos então declarar um vetor de strings como uma matriz sendo a primeira dimensão a
quantidade de strings e a segunda dimensão a quantidade de caracteres de cada string.
0
1
2
3
4
5
6
0
D
e
n
i
s
e
\0
1
E
d
s
o
n
\0
2
F
a
u
s
t
o
3
A
n
a
\0
\0
• Declaração de um vetor de strings:
< tipo-de-dado > < identificador > [ < qtd_de_strings > ] [ < qtd_de_caracteres_das_strings > ] ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
45
Exemplo de Vetor de Strings
# include <stdio.h>
# include <stdlib.h>
# define QTD 4
# define LETRAS 7
int main ( ) {
char nomes [ QTD ] [ LETRAS ] ;
int i ;
for ( i = 0; i < QTD ; i ++ ) {
system ( "cls" ) ;
printf ( "Digite o %do. nome: ", i + 1 ) ;
fflush ( stdin ) ;
gets ( nomes [ i ] ) ;
}
system ( "cls" ) ;
printf ( "Nomes digitados: " );
for ( i = 0; i < QTD ; i ++ )
printf ( " %s", nomes [ i ] ) ;
printf ( "\n\n" ) ;
system ( "pause") ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
PONTEIROS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
46
47
Alocação de Memória
• Da área de memória que é reservada ao programa, uma parte é usada para armazenar as
instruções a serem executadas e a outra é destina ao armazenamento de dados.
• Quem determina quanto de memória será usado para as instruções é o compilador.
• Alocar área para armazenamento de dados, entretanto, é responsabilidade do programador.
• Quando a quantidade de memória utilizada pelos dados é previamente conhecida e definida no
próprio código-fonte do programa, trata-se de alocação estática.
• Quando o programa é capaz de criar novas variáveis durante sua execução, dizemos que a
alocação é dinâmica.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
48
Ponteiros
• PONTEIRO é ...
• uma variável especial que contém o endereço de memória de outra variável.
• variável que contém endereços de posições de memória alocadas na memória.
VARIÁVEL
PONTEIRO
VARIÁVEL
DINÂMICA
endereço de memória
de outra variável
conteúdo do tipo que
se deseja “acessar”
ptr
<sem nome>
(endereço 1FFA)
1FFA
5
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
49
Ponteiros – Comandos básicos
< tipo de dado > *< identificador > ;
• Declara uma variável do tipo ponteiro.
• Pode haver um ponteiro (ou apontador) para qualquer tipo de variável.
(void*) malloc(tamanho em bytes);
• Aloca dinamicamente, durante a execução do programa, células de memória.
• Esta função devolve um ponteiro void que deve ser ser convertido para o tipo desejado.
• O tamanho em bytes pode ser determinado utilizando a função sizeof() que retorna o tamanh
em bytes que um tipo de dados ocupa. Exemplo:
int *ptr;
ptr = ( int * ) malloc ( sizeof ( int ) ) ;
free (ponteiro)
• Libera as células de memória alocadas dinamicamente.
• Exemplo
free ( ptr );
• Para manipulação de valores utilizando ponteiros temos dois operadores:
• O operador * devolve o valor contido no endereço apontado pela variável ponteiro;
• O operador & devolve o endereço de memória alocado de uma variável.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
50
Exemplo
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main ( ) {
int *x, *y;
x = ( int * ) malloc ( sizeof ( int ) ) ;
y = ( int * ) malloc ( sizeof ( int ) ) ;
*x = 27 ;
*y = 43 ;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
*x = *y ;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
*x = 27 ;
y=x;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
free ( x ) ;
system ( "pause" ) ;
return 0 ;
}
# include <stdio.h>
# include <stdlib.h>
int main ( ) {
int * x, * y ;
int a, b ;
a = 27 ;
b = 43 ;
x = &a ;
y = &b ;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
*x = *y ;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
*x = 27 ;
y=x;
printf ( "Valor: %d - %d \n\n", *x , *y ) ;
system ( "pause") ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exemplo
51
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main ( ) {
char *x, *y;
x = ( char * ) malloc ( 12 * sizeof ( char ) ) ;
y = ( char * ) malloc ( 12 * sizeof ( char ) ) ;
strcpy ( x, "Estruturas" ) ;
strcpy ( y, "de Dados" ) ;
printf ( "%s %s\n\n", x, y ) ;
strcpy ( y, x ) ;
printf ( "%s %s\n\n", x, y ) ;
strcpy ( y, "de Dados" ) ;
printf ( "%s %s\n\n", x, y );
x= y;
printf ( "%s %s\n\n", x, y ) ;
free( x ) ;
system ( "pause" ) ;
return 0 ;
} Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exercícios: Ponteiros - 1
52
• Codifique um programa que contenha uma variável ponteiro que aponte para um vetor de 5
elementos do tipo inteiro, insira dados neste vetor e mostre os mesmos.
• Codifique um programa que contenha um vetor de 5 elementos do tipo ponteiro para um char,
insira dados neste vetor e mostre os mesmos.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
53
Exercícios: Ponteiros - 2
O que será impresso após a execução do
programa abaixo?
*p1 = 7 ;
strcpy ( x1,"teste" ) ;
*p2 = 15 ;
strcpy ( x2, "aula" ) ;
p3 = 11 ;
strcpy ( x3, "prova" ) ;
p1 = p2 ;
p2 = &p3 ;
strcpy ( x2, x3 ) ;
strcpy ( x1, x3 ) ;
printf ( "%d \n", *p1 ) ;
printf ( "%d \n", *p2 ) ;
printf ( "%d \n", p3 ) ;
printf ( "%s \n", x1 ) ;
printf ( "%s \n", x2 ) ;
printf ( "%s \n", x3 ) ;
system ( "pause" ) ;
return 0 ;
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main ( ) {
int *p1, *p2, p3 ;
char *x1, *x2, x3 [ 7 ] ;
p1 = ( int * ) malloc ( sizeof ( int ) ) ;
p2 = ( int * ) malloc ( sizeof ( int ) ) ;
x1 = ( char * ) malloc ( 7 * sizeof ( char ) ) ;
x2 = ( char * ) malloc ( 7 * sizeof ( char ) ) ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
SUB-ROTINAS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
54
55
Sub-rotinas
• Muitos problemas grandes e de solução complexa geram programas complexos, e podem ser
divididos em problemas menores com lógica mais simples e de compreensão mais fácil,
tornando a tarefa de desenvolvimento e manutenção menos desgastantes.
• Em vez de escrever um algoritmo grande, podemos dividir o mesmo em vários algoritmos
menores.
• Chamamos estas divisões de sub-rotinas, sendo que cada um é na verdade um programa, que
por sua vez podem ser divididos em outros tantos quantos forem necessários.
• Esses sub-rotinas podem ter variáveis próprias ou utilizar as variáveis declaradas no programa
principal. De acordo com o contexto em que está inserido uma variável pode ser considerada
uma variável local ou uma variável global.
Algoritmo Principal
var a, b
Sub-rotina A
var c, d
Sub-rotina B
var e, f
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
56
Sub-rotinas
Início
sub-rotina A
sub-rotina B
Retorna
Retorna
sub-rotina
A
sub-rotina
B
Fim
VANTAGENS
1. Diferentes partes do algoritmo podem ser independentes de forma que possam ser
escritas e testadas separadamente.
2. Trechos do algoritmo podem ser escritos de forma a serem reutilizados em diferentes
partes do algoritmo.
3. Algoritmos complexos podem ser elaborados a partir de unidades menores já prontas e
testadas.
4. Garante maior legibilidade.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
57
Sub-rotinas
Início
sub-rotina A
sub-rotina
A
Retorna
sub-rotina B
sub-rotina
B
Retorna
Fim
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Tipos de Sub-rotinas
58
• Existem, na maioria das linguagens de programação, dois tipos de sub-rotinas: as que não
devolvem valor e as que devolvem valor.
• Na linguagem de programação C sub-rotina é chamada de função.
• Função que não devolve valor
• Conjunto de comandos aos quais foi dado um nome específico.
• Neste caso, separa-se um bloco de comandos com o intuito de realizar alguma operação.
• Função que devolve valor
• Conjunto de comandos aos quais foi dado um nome específico.
• Neste caso, separa-se um bloco de comandos com o intuito de realizar alguma operação e
retornar um valor.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Funções em C
59
• A maioria das linguagens de programação possuem algumas funções pré-definidas, facilitando
o trabalho dos programadores.
• A linguagem C é uma linguagem procedural, ou seja, é baseada em funções (procedimentos).
Todo programa escrito na linguagem C deve ter no mínimo a função main ().
• Uma determinada função pode ser chamada a qualquer hora durante a execução de um
programa a partir de outras funções ou por si mesma.
• Sintaxe de uma função em C
< tipo de dado > < identificador da função > ( < parâmetros > ) {
< instruções >
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Função que não devolve valor
60
• O objetivo de se declarar uma função é associá-la a um identificador para que a mesma possa
ser ativada por um comando em uma outra função.
void < identificador da função > ( < parâmetros > ) {
declaração dos objetos locais da função
< comandos da função >
}
• A chamada ou ativação de uma função que não devolve valor é feita referenciando-se o seu
nome, seguido de abre e fecha parênteses, no local do programa, onde a mesma deve ser
ativada.
• Ao terminar a execução dos comandos da função, a sequência do programa retorna sempre à
instrução seguinte que provocou a sua chamada.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
61
Exemplo de Função que não devolve valor
Início
# include <stdio.h>
# include <stdlib.h>
“Qual o seu nome ?”
char nome[30] ;
nome
void elogio ( ) {
printf ( "Ola %s", nome ) ;
printf ( "\nBonito nome!\n\n" ) ;
}
elogio
Fim
int main ( ) {
printf ( "Qual o seu nome? " ) ;
gets(nome) ;
elogio() ;
system ( "pause" ) ;
return 0 ;
}
elogio
“Olá “, nome
“Bonito nome”
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas
de Dados – TADS
fim
Exemplo de Função que não devolve valor
62
Cálculo da soma de dois números utilizando o conceito de função que não devolve valor.
# include <stdio.h>
# include <stdlib.h>
float x, y ;
void soma ( ) {
float som ;
som = x + y ;
printf ( "soma = %.2f", som ) ;
}
void tela ( ) {
system( "cls" ) ;
printf ( "Soma de dois numeros reais\n\n" ) ;
printf ( "Utilizando Sub-rotinas \n\n\n" ) ;
}
void inicio ( ) {
tela ( ) ;
printf ( "Entre com 1o. numero = " ) ;
scanf ( "%f", &x ) ;
printf ( "Entre com 2o. numero = " ) ;
scanf ( "%f", &y ) ;
printf ( "\n") ;
soma ( ) ;
printf ( "\n\n\n") ;
system ( "pause" ) ;
}
int main ( ) {
inicio ( ) ;
return 0;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
63
Função que devolve valor
• Distingue-se da função que não devolve valor pela característica de retornar um valor.
• O objetivo de se declarar uma função que devolve valor é associá-la a um identificador para
que a mesma possa ser ativada em uma expressão em uma outra função.
< tipo de dado > < identificador da função > ( < parâmetros > ) {
declaração dos objetos locais da função
< comandos da função >
...
return < variável / valor / expressão >
}
• Funções deste tipo devem ser chamadas dentro de expressões:
Exemplo: x = função ( ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
64
Exemplo de Função que devolve valor
# include <stdio.h>
# include <stdlib.h>
Início
a←2
float a,b,c;
float prod ( ) {
return a * b ;
}
int main ( ) {
a = 2;
b = 110;
c = prod() ;
printf ( "%f\n\n",c ) ;
system ( "pause" ) ;
return 0 ;
}
b ← 110
c←
prod(a,b)
c
Fim
prod: real
prod ← x * y
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturasfim
de Dados – TADS
Exemplo de Função que devolve valor
65
Cálculo da soma de dois números utilizando o conceito de função que devolve valor.
# include <stdio.h>
# include <stdlib.h>
float x, y ;
float soma ( ) {
float som ;
som = x + y ;
return som ;
}
void tela ( ) {
system( "cls" ) ;
printf ( "Soma de dois numeros reais\n\n" ) ;
printf ( "Utilizando Sub-rotinas \n\n\n" ) ;
}
void inicio ( ) {
tela ( ) ;
printf ( "Entre com 1o. numero = " ) ;
scanf ( "%f", &x ) ;
printf ( "Entre com 2o. numero = " ) ;
scanf ( "%f", &y ) ;
printf ( "soma = %.2f\n\n\n", soma ( ) ) ;
system ( "pause" ) ;
}
int main ( ) {
inicio ( ) ;
return 0;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
PASSAGEM DE PARÂMETROS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
66
Passagem de Parâmetros
67
• Uma definição genérica para parâmetros seria “qualquer variável que possa ser usada por uma
função fornecida pela função que a chamou”.
• O parâmetro pode ser real ou formal.
• Parâmetro real – variáveis, expressões ou valores usados na chamada da função.
• Parâmetro formal – identificadores usados no cabeçalho da função
• Existem dois tipos de passagem de parâmetros utilizados nas linguagens de programação:
• Passagem por Valor
• Passagem por Referência
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Passagem por Valor
68
• Na passagem por valor, o que é passado para a função é o valor da variável usado como
parâmetro real.
• A função copia o valor do parâmetro real para a variável declarada como parâmetro formal.
• Qualquer alteração no conteúdo de um parâmetro formal, dentro de uma função, não será
refletido no parâmetro real.
• Parâmetro formal é considerado uma variável local, deixando de existir ao término da função.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
69
Passagem de parâmetro por Valor
• Na passagem por valor, o que é passado para a função é o valor da variável usada como
parâmetro real.
• A função copia o valor do parâmetro real para a variável declarada como parâmetro formal.
• Qualquer alteração no conteúdo de um parâmetro formal, dentro de uma função, não será
refletido no parâmetro real.
# include <stdio.h>
# include <stdlib.h>
float prod ( float x, float y ) {
return x * y ;
}
int main ( ) {
float a, b, c;
a = 2;
b = 110;
c = prod ( a, b ) ;
printf ( "%f\n\n",c ) ;
system ( "pause" ) ;
return 0 ;
}
Posições de memória
4052
4053
4054
4055
4056
a
b
c
x
y
2
110
220
2
110
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
70
Exemplo de Passagem de Parâmetro por Valor
# include <stdio.h>
# include <stdlib.h>
int x;
void porvalor ( int a ) ;
int main ( ) {
x = 10;
porvalor ( x ) ;
printf ( "x = %d\n\n", x ) ;
system ( "pause" ) ;
return 0 ;
}
void porvalor ( int a ) {
a=5;
printf ( "x = %d
a = %d\n\n", x, a ) ;
}
Posições de memória
4052
4053
x
a
10
10
4054
4055
4056
5
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
71
Exemplo de Passagem de Parâmetro por Valor
# include <stdio.h>
# include <stdlib.h>
int x;
void dobro ( int n ) ;
int main ( ) {
x=7;
dobro ( x ) ;
printf ( "x = %d\n\n", x ) ;
system ( "pause" ) ;
return 0 ;
}
void dobro ( int n ) {
n=2*n;
printf ( "x = %d
}
Posições de memória
4052
4053
x
n
7
7
4054
4055
4056
14
n = %d\n\n", x, n ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exemplo de Passagem de Parâmetro por Valor
else {
p = base ;
for ( k = 1; k <= exp-1; k ++ )
p = p * base ;
return p ;
}
# include <stdio.h>
# include <stdlib.h>
int pot ( int base, int expoente ) ;
void entrada ( ) ;
int main ( ) {
system ( "cls" ) ;
printf ( "Calculo de Potencias\n\n" ) ;
entrada ( ) ;
return 0 ;
}
int pot ( int base, int exp ) {
int k, p ;
if ( exp == 0 )
return 1 ;
else
if ( base == 0 )
return 0 ;
72
}
void entrada ( ) {
int x, a ;
printf ( "Valor da BASE: " ) ;
scanf ( "%d", &x ) ;
printf ( "Valor do EXPOENTE: " ) ;
scanf ( "%d", &a ) ;
printf ( "\n\n%d = %d \n\n" , a, pot ( x, a ) ) ;
printf ( "%d = %d \n\n\n" , a+1, pot ( x, a + 1 ));
system ( "pause" ) ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
73
Passagem de parâmetro por Referência
• Na passagem por referência o que é passado para a função não é o valor de uma variável, mas
o seu endereço.
• Lembre-se que uma variável é uma entidade que possui um endereço de memória e um valor
armazenado.
• A função faz com que a variável do parâmetro formal passe a ter o mesmo endereço da variável
do parâmetro real.
• A alteração no conteúdo de um parâmetro formal, dentro de uma função, se reflete no
parâmetro real.
# include <stdio.h>
# include <stdlib.h>
float prod ( float *x, float *y ) {
return *x * *y ;
}
Posições de memória
4052
4053
4054
4055
4056
a
b
c
x
y
220
2
110
4052
4053
int main ( ) {
float a, b, c;
a = 2;
b = 110;
c = prod ( &a, &b ) ;
printf ( "%f\n\n",c ) ;
system ( "pause" ) ;
return 0 ;
Profa.
Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
}
74
Exemplo de Passagem de Parâmetro por Referência
# include <stdio.h>
# include <stdlib.h>
int x;
void por_ref ( int *a ) ;
int main ( ) {
x = 10;
porvalor ( &x ) ;
printf ( "x = %d\n\n", x ) ;
system ( "pause" ) ;
return 0 ;
}
void por_ref ( int *a ) {
*a = 5 ;
printf ( "x = %d
a = %d\n\n", x, *a ) ;
}
Posições de Memória
4052
4053
x
a
10
4052
5
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
75
Exemplo de Passagem de Parâmetro por Referência
# include <stdio.h>
# include <stdlib.h>
int x;
void dobro ( int *n ) ;
int main ( ) {
x=7;
dobro ( &x ) ;
printf ( "x = %d\n\n", x ) ;
system ( "pause" ) ;
return 0 ;
}
void dobro ( int *n ) {
*n = 2 * *n ;
printf ( "x = %d
}
Posições de memória
4052
4053
x
n
7
4052
14
n = %d\n\n", x, *n ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Exemplo de Passagem de Parâmetro por Referência
# include <stdio.h>
# include <stdlib.h>
calc ( x , y, '*' , &result ) ;
printf ( " Multiplicacao.. %.1f\n", result );
calc ( x , y, '/' , &result ) ;
printf ( " Divisao........ %.1f\n", result ) ;
}
printf ( "\n\n\n" ) ;
system ( "pause" ) ;
return 0 ;
void calc(float a, float b, char oper, float
*resposta ) ;
int main ( ) {
float x, y, result = 0 ;
system ( "cls" ) ;
printf ( "Primeiro numero: " ) ;
scanf ( "%f", &x ) ;
printf ( "Segund numero: " ) ;
scanf ( "%f", &y ) ;
printf ( "\n\n\n" ) ;
if ( ( x > 0 ) && ( y > 0 ) ){
calc ( x , y, '+' , &result ) ;
printf ( " Adicao......... %.1f\n", result ) ;
calc ( x , y, '-' , &result ) ;
printf ( " Subtracao...... %.1f\n", result ) ;
76
}
void calc(float a, float b, char oper, float
*resposta ) {
switch ( oper ) {
case '+' : *resposta = a + b ; break ;
case '-' : *resposta = a - b ; break ;
case '*' : *resposta = a * b ; break ;
case '/' : *resposta = a / b ; break ;
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
77
Exercícios: Funções - 1
1. Escreva função que troque o conteúdo de 2 variáveis inteiras passadas como parâmetro por
referência.
2. Criar uma função para receber o ano corrente e o ano de nascimento de uma pessoa. Em
seguida retornar a idade da pessoa.
3. Faça um programa que simule uma Calculadora, utilizando para cada operação básica uma
função. Crie no programa principal um menu de opções conforme o lay-out abaixo:
Calculadora
Digite o primeiro número → __
Digite o segundo número → __
Escolha:
1. Adição
2. Subtração
3. Multiplicação
4. Divisão
Opção → __
4. Dado o número do telefone de uma residência, o número de pulsos registrados para
chamadas locais e o valor total de todas as chamadas interurbanas, fazer um programa em C
que controle a conta telefônica de 50 residências contendo as seguintes funções:
a) Para entrada dos dados (variáveis locais);
b) Para cálculo do valor total da conta telefônica. Sabendo-se que o valor total da conta
telefônica = número de pulsos locais x 0.127 + valor total de interurbanos;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
78
Exercícios: Funções - 2
5. O que será exibido na tela após a execução do programa abaixo?
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
void s ( int n ) ;
void p ( char c ) ;
void i ( char c ) ;
int main ( ) {
int t = 3 ;
s(t);
system ( "pause" ) ;
return 0 ;
}
void p ( char c ) {
printf ( "%c" , c ) ;
}
void i ( char c ) {
printf ( "%c" , c ) ;
}
void s ( int n ) {
int lin, col ;
for ( lin = 1; lin <= n; lin ++ ) {
for ( col = 1; col <= n; col ++ )
if (( lin + col ) % 2 == 0 )
p ( ‘x’ ) ;
else
i ( ‘-’ ) ;
printf ( "\n" ) ;
}
printf ( "\n\n\n" ) ;
}
Digite o programa fazendo as seguintes
substituições:
p ( ‘ x ‘ ) por p ( chr ( 219 ) ) ;
i ( ‘ - ‘ ) por i ( chr ( 176 ) ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
79
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
ORDENAÇÃO DE VETORES
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
ORDENAÇÃO DE DUAS VARIÁVEIS
# include <stdio.h>
# include <stdlib.h>
if ( a == b )
printf ( "\nValores iguais\n" ) ;
else
if ( a > b ) {
c = a;
a = b;
b = c;
}
printf ( "\na = %d b = %d\n\n", a, b ) ;
system ( "pause" ) ;
return 0 ;
int main ( ) {
int a, b, c;
printf ( "Valor de a: " ) ;
scanf ( "%d",&a) ;
printf ( "Valor de b: " ) ;
scanf ( "%d",&b) ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
80
ORDENAÇÃO DE VETORES
81
• Assim que você cria uma coleção importante de dados, provavelmente pensa como classificála.
• É preciso organizar os nomes em ordem alfabética, os alunos pelas notas, os clientes pelo
CEP, as vendas de casas pelo preço, as cidade na ordem crescente de população, as estrelas
pela magnitude, etc.
• Classificar dados também pode ser uma etapa preliminar para procurá-los, que é muito mais
rápida do que uma procura linear.
• Trata-se de um dos procedimentos mais freqüentes em processamento de dados.
• Existem vários métodos de ordenação, cada um com suas características próprias, podendo se
adaptar melhor a uma determinada quantidade ou tipo de dados, como por exemplo: por trocas,
por inserção; por seleção; por distribuição
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
ORDENAÇÃO POR TROCAS (BUBLE SORT)
82
• Também conhecido como "método da bolha" ( "bubble sort") é um dos métodos mais simples
de ordenação.
• Compara dois elementos consecutivos de um vetor e se o da esquerda é maior que o da direita
trocam de posição. Quando existem trocas, os elementos maiores tendem a deslocar-se para a
direita e os menores para a esquerda.
• Consiste em percorrer o vetor, comparando-se cada elemento do vetor com o elemento
imediatamente seguinte ( V [ indice ] com V [ indice + 1 ] ).
• O número máximo de execuções do trecho do algoritmo para que o vetor fique ordenado é N-1
vezes, onde N é o número de elementos do vetor.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
83
ORDENAÇÃO POR TROCAS
void bsort ( int vet [ ] , int qtd ) {
int i, j;
int k;
for ( i = 0; i < qtd - 1; i++ ) {
for ( j = 0; j < qtd – ( i + 1 ) ; j++ ) {
if ( vet [ j ] > vet [ j + 1 ] ) {
k = vet [ j ] ;
vet [ j ] = vet [ j + 1 ] ;
vet [ j + 1 ] = k ;
Observações:
• i determina o número de etapas para a
ordenação
•
j determina o número de comparações
em cada etapa e os índices a serem
pesquisados para a comparação
}
}
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
84
EXEMPLO DE ORDENAÇÃO POR TROCAS
// programa 01_ord_letras_bs
#include <stdio.h>
#include <stdlib.h>
void bsort (char v [ ], int qtd ) {
int i, j ;
char k ;
#define MAX 5
for ( i = 0; i < qtd - 1; i++ ) {
for ( j = 0; j < qtd - ( i +1 ) ; j++ ) {
void bsort ( char v [ ], int qtd ) ;
int main() {
int i;
char v [ MAX ] = { 'v', 'f‘ , 's‘ , 'z‘ , 'a‘ } ;
bsort ( v, MAX ) ;
for ( i = 0; i < MAX; i++ )
printf ( " v [ %d ] = %c \n ",i, v [ i ] ) ;
printf ( " \n " ) ;
system ( " pause " ) ;
return 0 ;
}
if ( v [ j ] > v [ j + 1 ] ) {
k=v[j];
v[j]=v[j+1];
v [ j +1 ] = k ;
}
}
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
85
EXERCÍCIO DE ORDENAÇÃO POR TROCAS
1. Simular a ordenação em ordem crescente do vetor Nomes que contém os seguintes dados:
Maria, Sandra, André, Mario, Dirce, Sandro
i
j
k
v[0]
v[1]
v[2]
v[3]
v[4]
v[5]
Maria
Sandra
André
Mario
Dirce
Sandro
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Quantas trocas foram efetuadas para a ordenação deste vetor ? Resposta: ______________
EXERCÍCIO DE ORDENAÇÃO POR TROCAS
86
2. Faça um programa que contenha um vetor de 15 números inteiros e faça a ordenação dos
valores utilizando o método de trocas.
3. Faça um programa que contenha um vetor de 5 nomes e faça a ordenação dos valores
utilizando o métodos de trocas.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
87
EXERCÍCIO DE ORDENAÇÃO DE VETORES
1. Dada a função main ( ) nos slides 24 e 25, codifique as funções ord_nome, ord_nota e
ord_faltas de tal modo que os vetores sejam ordenados simultaneamente conforme as opções do
menu. Exemplo:
Valores Iniciais
[0]
vetor
nomes
vetor
[1]
[2]
[3]
[4]
Ordenação por Nomes
[0]
[1]
vetor
Lia
Ana
Ivo
Teo
Gil
nomes
[0]
[1]
[2]
[3]
[4]
[2]
[3]
[4]
Ana
Gil
Ivo
Lia
Teo
vetor
[0]
[1]
[2]
[3]
[4]
nota
9,5
8,5
3,5
7,5
4,5
nota
7,5
9,5
3,5
4,5
8,5
vetor
[0]
[1]
[2]
[3]
[4]
vetor
[0]
[1]
[2]
[3]
[4]
7
faltas
7
15
11
1
faltas
1
15
3
11
Ordenação por Notas
[0]
[1]
vetor
[2]
[3]
[4]
Ordenação por Faltas
[0]
[1]
vetor
[2]
[3]
[4]
nomes
3
Ivo
Teo
Lia
Gil
Ana
vetor
[0]
[1]
[2]
[3]
[4]
nota
3,5
4,5
7,5
8,5
vetor
[0]
[1]
[2]
faltas
15
11
3
nomes
Gil
Lia
Ana
Teo
Ivo
vetor
[4]
[0]
[1]
[3]
[2]
9,5
nota
8,5
7,5
9,5
4,5
3,5
[3]
[4]
vetor
[4]
[0]
[1]
[3]
[2]
1
7
faltas
1
3
7
11
15
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXERCÍCIO DE ORDENAÇÃO DE VETORES
# include < stdio.h >
# include < stdlib.h >
# include < string.h >
# define QTD 5
void ord_nome ( char vet_nome [ QTD ] [ 30 ], float vet_nota [ QTD ], int vet_faltas [ QTD ] ) ;
void ord_nota ( char vet_nome [ QTD ] [ 30 ], float vet_nota [ QTD ], int vet_faltas [ QTD ] ) ;
void ord_faltas ( char vet_nome [ QTD ] [ 30 ], float vet_nota [ QTD ], int vet_faltas [ QTD ] ) ;
int main ( ) {
char nomes [ QTD ] [ 30 ] ;
float nota [ QTD ] ;
int faltas [ QTD ] ;
int i, opc ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
88
89
case 2 :
for ( i = 0 ; i < QTD ; i++ ) {
EXERCÍCIO
DE
ORDENAÇÃO
DE
VETORES
ord_nota ( nomes, nota, faltas ) ;
system ( "cls" ) ;
break ;
fflush ( stdin ) ;
case 3 :
printf ( "Nome: " ) ;
ord_faltas ( nomes, nota, faltas ) ;
gets ( nomes [ i ] ) ;
break ;
printf ( "Nota: " ) ;
}
scanf ( "%f", &nota [ i ] ) ;
system ( "cls" ) ;
printf ( "Faltas: " ) ;
printf ( "Dados ordenados\n" ) ;
scanf ( "%d", &faltas [ i ] ) ;
for ( i = 0 ; i < QTD ; i++ ) {
}
printf ( "%s",nomes [ i ] ) ;
do {
printf ( " - %.2f ",nota [ i ] ) ;
system ( "cls" ) ;
printf ( "- %d\n",faltas [ i ] ) ;
printf ( "Escolha uma opção\n\n" ) ;
}
printf ( "1. Ordena Nome\n" ) ;
printf ( "\n" ) ;
printf ( "2. Ordena Nota\n" ) ;
system ( "pause" ) ;
printf ( "3. Ordena Faltas\n" ) ;
} while ( opc != 4 ) ;
printf ( "4. Sair\n\n" ) ;
printf ( "\n" ) ;
scanf ( "%d", &opc ) ;
system ( "pause" ) ;
if ( opc == 4) return 0 ;
return 0 ;
switch ( opc ) {
}
case 1 :
ord_nome ( nomes, nota, faltas ) ;
break
; de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Profa. Vânia
Cristina
90
EXERCÍCIO DE ORDENAÇÃO POR TROCAS
1. Simular a ordenação por trocas em ordem decrescente do vetor X que contém os seguintes
dados: 52,47,90,47,95
i
j
k
v[0]
v[1]
v[2]
v[3]
v[4]
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
Quantas trocas foram efetuadas para a ordenação deste vetor ? Resposta: _________
UNIVERSIDADE NOVE DE JULHO - UNINOVE
91
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
PESQUISA EM VETORES
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
PESQUISA EM VETORES
• A procura de informação é uma atividade quotidiana: procuramos números em listas
telefônicas, palavras em dicionários, etc.
• Estudaremos dois métodos para pesquisar um dado em um vetor:
• A pesquisa sequencial.
• A pesquisa binária.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
92
PESQUISA EM VETORES – PESQUISA BINÁRIA
93
• A procura de informação é uma atividade quotidiana: procuramos números em listas
telefônicas, palavras em dicionários, etc.
• A pesquisa binária só é aplicável a vetor ordenados!
• Deverá ser comparado o dado que se encontra a meio do vetor com o dado procurado,
podendo acontecer uma de três coisas:
• é igual ao dado procurado ⇒ está encontrado
• é maior do que o dado procurado ⇒ continuar a procurar (do mesmo modo) no sub-vetor à
esquerda da posição inspecionada
• é menor do que o dado procurado ⇒ continuar a procurar (do mesmo modo) no sub-vetor à
direita da posição inspecionada.
• Em outras palavras: Consideramos primeiro o elemento do meio da tabela.
• Se o dado deste elemento é maior do que o dado procurado, podemos garantir que o
procurado não se encontra na 2ª metade da tabela.
• Se o vetor a ser inspecionado se reduzir a um vetor vazio, conclui-se que o dado procurado não
existe no vetor inicial.
• EmVânia
cadaCristina
passode
a Souza
procura
binária
reduz
o número
de–elementos
a –considerar
para
metade.
Profa.
Pereira
– 2012
– Material
de Apoio
Notas de Aula
Estruturas de
Dados
– TADS
PESQUISA BINÁRIA
int pesqbin ( int v [ ], int busca ) {
int inicio, fim, meio ;
inicio = 0 ;
fim = MAX – 1 ;
while ( inicio <= fim ) {
meio = ( inicio + fim ) / 2 ;
if ( v [ meio ] == busca )
return meio;
if ( busca < v [ meio ] )
fim = meio – 1 ;
else
inicio = meio + 1 ;
}
return -1 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
94
95
EXEMPLO DE PESQUISA BINÁRIA
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
//protótipos das funções
void bsort ( char v [ ], int qtd ) ;
int pesqbin ( char v [ ], char busca ) ;
int main ( ) {
int i, resp ;
char pesq ;
char vet [ MAX ] = { 'o', 'c', 'v', 's', 'n', 'r', 'p', 'e', 'm', 'j‘ } ;
bsort ( vet, MAX ) ;
printf ( " Dado a ser pesquisado: " ) ;
scanf ( " %c ", &pesq ) ;
resp = pesqbin ( vet, pesq ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
96
EXEMPLO DE PESQUISA BINÁRIA
if ( resp >= 0 )
printf( "%c está na posição %d.\n\n", pesq, resp) ;
else
printf ( "%c não está no vetor.\n\n ", pesq ) ;
system ( "pause" ) ; return 0 ;
int pesqbin (char v [ ], char busca) {
int inicio, fim, meio ;
inicio = 0 ;
fim = MAX – 1 ;
while ( inicio <= fim ) {
}
meio = ( inicio + fim ) / 2 ;
void bsort ( char v [ ], int qtd ) {
int i, j ;
char k ;
for ( i = 0; i < qtd - 1; i++ ) {
for ( j = 0; j < qtd - ( i + 1 ) ; j++ ) {
if ( v [ j ] > v [ j + 1 ] ) {
k=v[j];
v[j]=v[j+1];
v[j+1]=k;
}
}
}
}
if (v [ meio ] == busca )
return meio ;
if ( busca < v [ meio ] )
fim = meio – 1 ;
else
inicio = meio + 1 ;
}
return -1 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
97
EXERCÍCIO PESQUISA BINÁRIA
• Simular a busca binária do vetor v que contém os seguintes dados: Maria, Sandra, André,
Mario, Dirce, Sandro, para os seguintes dados:
a) André
Pesqbin = ____
início fim
meio
v[0]
v[1]
v[2]
v[3]
v[4]
v[5]
b) Marcos
Pesqsbin = ____
c) Ana
Pesqbin = ____
d) Sandra
Pesqbin = ____
e) Tânia
Pesqbin = ____
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
REGISTROS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
98
99
REGISTROS
• Em algoritmos utilizamos dois tipos de estruturas de dados:
• estruturas homogêneas: podem conter coleções de dados de mesmo tipo.
• estruturas heterogêneas: podem conter coleções de dados de tipos diferentes entre si.
• Registro é uma coleção de dados de tipos diferentes.
• Registros são conjuntos de informações logicamente relacionadas.
• Utilizamos registros em vários casos, por exemplo:
• informações pessoais sobre um cliente de um banco.
• dados sobre produtos comercializados em uma loja.
• informações sobre veículos produzidos em uma montadora.
• dados sobre inscritos em um concurso.
• folha de chamada de uma turma.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
REGISTROS
100
• As informações de um registro são denominadas campos e podem ser de diferentes tipos.
• Para se criar uma estrutura heterogênea, cria-se um novo tipo de dado (registro). A partir disto,
pode-se declarar variáveis como sendo deste novo tipo criado e utilizar dentro do algoritmo.
• Sintaxe:
struct <identificador-do-registro> {
<tipo-de-dado> <campo-do-registro 1> ;
<tipo-de-dado> <campo-do-registro 2> ;
....
<tipo-de-dado> <campo-do-registro n> ;
};
• A declaração de um struct acima apenas define um registro e seus respectivos campos, para a
manipulação de dados é preciso declarar uma variável por meio da sintaxe:
struct <identificador-do-registro> <identificador-da-variável> ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
101
REGISTROS
• Podemos criar a seguinte estrutura para armazenar informações pertinentes à uma pessoa:
Pessoa
Nome: caractere [ 20 ]
struct regPessoa {
char nome [ 20 ] ;
Idade: inteiro
int idade ;
char sexo ;
Sexo: caractere [ 1 ]
float peso ;
Peso: real
};
struct regPessoa aluno ;
• Entrada, saída e atribuição de dados em registros
• Referenciamos individualmente cada campo de um registro, indicando o nome da variável
registro seguido de um ponto e o nome do campo.
• Considerando a declaração acima, poderíamos ter as seguintes referências a um campo:
Entrada de dados:
gets ( aluno.nome ) ;
Saída de dados:
printf ( "%s", aluno.nome ) ;
Atribuição:
strcpy ( aluno.nome, "José da Silva" ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
REGISTROS
102
• É possível criar um registro em que um ou mais de seus campos também sejam registros,
desde que tais registros tenham sido previamente definidos. Por exemplo:
struct regData {
int dia, mes, ano ;
};
struct regPessoa {
char nome [ 30 ] ;
regData nascimento ;
};
struct regPessoa amigo;
• Para atribuir valores aos campos do registro amigo, podemos escrever:
strcpy ( amigo.nome, "Gerson Silva" ) ;
amigo.nascimento.dia = 27 ;
amigo.nascimento.mes = 7 ;
amigo.nascimento.ano = 1970 ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
103
EXERCÍCIO REGISTRO - 1
1. Considere um bilhete de passagem de ônibus mostrado abaixo para definir a estrutura de
dados necessária.
Número da Passagem
Nome Empresa
Cidade de Origem
Cidade de Destino
Data do Embarque
Horário do Embarque
Assento
Distância em Km
Valor
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXERCÍCIO REGISTRO - 2
104
2. Uma companhia de turismo para fazer reservas de passagens entra com os dados cadastrais
de cada passageiro conforme abaixo:
Nome:
Idade
Mês da viagem:
Preço Base
• O sistema oferece o valor a ser pago de acordo com as regras:
• se a idade for maior ou igual a 65, ou menor que 10, haverá 20% de desconto sobre preço
base.
• se o mês da viagem for de baixa temporada (março, abril, maio, junho, setembro ou outubro)
há um desconto de mais 30% sobre o preço.
• Escrever um programa que lê os dados e imprime o nome do passageiro o preço base e o
preço final a ser pago.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
105
TABELAS
• Também é possível combinar vetores e registros de muitas maneiras interessantes. A
combinação mais comum é um vetor cujos elementos são registros e é denominado de Tabela,
sendo representado com os elementos dispostos em linhas e os campos em colunas.
• Como exemplo, vamos criar uma variável para armazenar uma agenda contendo
informações sobre vários amigos:
LEMBRE-SE QUE:
# define MAX 10
struct regPessoa {
regPessoa agenda [ MAX ] ;
char nome [ 30 ] ;
regData nascimento ;
};
Para atribuir valores, por exemplo,
ao segundo elemento do
vetor agenda, escrevemos:
strcpy(agenda[1].nome,"Roberto Soares" ) ;
agenda[1].nascimento.dia = 15 ;
agenda[1].nascimento.mes = 11 ;
agenda[1].nascimento.ano = 1971 ;
nascimento
nome
dia
mes
ano
0
Gerson Silva
27
07
1970
1
Roberto Soares
15
11
1971
2
Maria da Silva
09
05
1966
9
Pedro Pereira
04
08
1973
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE ORDENAÇÃO DE TABELAS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 3
typedef struct{
char nome [ 10 ] ;
float nota ;
int faltas ;
} registro ;
void ord_nome ( registro v [ MAX ], int qtd ) ;
void ord_nota ( registro v [ MAX ], int qtd ) ;
void ord_faltas ( registro v [ MAX ], int qtd ) ;
106
int main ( ) {
registro vetor [ MAX ] ;
int i, opc ;
for ( i = 0; i < MAX; i++ ) {
system ( "cls" ) ;
printf ( "Aluno numero %d:\n", i + 1) ;
fflush ( stdin ) ;
printf ( "Nome: " ) ;
gets ( vetor [ i ].nome ) ;
printf ( "Nota: " ) ;
scanf ( "%f", &vetor [ i ].nota ) ;
printf ( "Faltas: " ) ;
scanf ( "%d", &vetor [ i ].faltas ) ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE ORDENAÇÃO DE TABELAS
do {
system ( "cls" ) ;
printf ( "Escolha uma opcao\n\n" ) ;
printf ( "1. Ordena Nome\n" ) ;
printf ( "2. Ordena Nota\n" ) ;
printf ( "3. Ordena Faltas\n" ) ;
printf ( "4. Sair\n\n" ) ;
scanf ( "%d", &opc ) ;
if ( opc == 4 ) return 0 ;
switch ( opc ) {
case 1 : ord_nome ( vetor, MAX ) ; break ;
case 2 : ord_nota ( vetor, MAX ) ; break ;
case 3 : ord_faltas ( vetor, MAX ) ; break ;
}
107
system ( "cls" ) ;
printf ( "Dados ordenados\n" ) ;
for ( i = 0; i < MAX; i++ ) {
printf ( "%-10s - ", vetor [ i ].nome ) ;
printf ( "%5.2f", vetor [ i ].nota ) ;
printf ( " - %3d\n", vetor [ i ].faltas ) ;
}
printf ( "\n" ) ;
system ( "pause" ) ;
} while ( opc != 4 ) ;
printf ( "\n" ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE ORDENAÇÃO DE TABELAS
void ord_nome ( registro v [ MAX ], int qtd ) {
int i, j ;
registro k ;
for ( i = 0; i < ( qtd – 1 ) ; i++ )
for (j = 0; j < qtd - ( i + 1 ) ; j++ )
if ( strcmp ( v [ j ].nome, v [ j + 1].nome ) > 0 ) {
k=v[j];
v[j]=v[j+1];
v [ j + 1 ] = k;
}
}
void ord_nota ( registro v [ MAX ], int qtd ) {
int i, j ;
registro k ;
for ( i = 0; i < ( qtd - 1) ; i++ )
for ( j = 0; j < qtd - ( i + 1 ) ; j++ )
if ( v [ j ].nota > v [ j + 1 ].nota ) {
k=v[j];
v[j]=v[j+1];
v [ j + 1 ] = k;
}
}
108
void ord_faltas ( registro v [ MAX ], int qtd ) {
int i, j ;
registro k ;
for ( i = 0; i < ( qtd – 1 ) ; i++ )
for ( j = 0; j < qtd - ( i + 1 ) ; j++ )
if (v [ j ].faltas > v [ j + 1 ].faltas ) {
k=v[j];
v[j]=v[j+1];
v [ j + 1 ] = k;
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
109
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
ARQUIVOS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
ARQUIVOS
110
• Um arquivo é semelhante a um vetor, exceto por alguns motivos:
• o vetor fica armazenado na memória RAM; o arquivo fica armazenado em disco;
• o vetor deve ter um tamanho fixo, definido em sua declaração; o tamanho do arquivo pode
variar durante a execução do programa.
• Os vetores são manipulados através de um índice de controle, enquanto os arquivos são
manipulados por um ponteiro de registro.
• As estruturas de dados tipo arquivo são apropriadas para organizar:
• grande quantidade de dados
• informações processadas por diversas aplicações
• informações que requisitam armazenamento permanente
• Vantagens e desvantagens no uso de arquivos
• Vantagem:
• Os dados não são perdidos entre uma execução e outra do programa.
• Desvantagem:
• O acesso a disco é muito mais lento do que o acesso à memória.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
111
ARQUIVOS
• TIPOS DE ARQUIVO
• TIPO TEXTO
• Estão capacitados a armazenar palavras, frases e também dados numéricos. Os números,
entretanto, serão armazenados como um caractere do tipo alfanumérico. Ao serem lidos de
um arquivo e passados para a memória, os dados numéricos são convertidos para o seu
formato original.
• TIPO BINÁRIO
• usa o sistema binário para armazenar tanto as informações numéricas, quanto as
informações literais, através do código ASCII, compostos por uma sequencia de bytes.
• Arquivos textos são legíveis devido a forma que os dados foram gravados, mas consumem
mais espaço para armazenamento e para acessar uma informação é necessário percorrer
sequencialmente o arquivo tornando a busca lenta.
• Arquivos binários não são legíveis uma vez que os dados são gravados do mesmo modo que
estão na memória e consomem menos espaço de memória para o armazenamento. O
acesso a uma informação em um arquivo binário é pode ser direto tornando a busca mais
rápida.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE MANIPULAÇÃO DE ARQUIVO BINÁRIO
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct {
char nome [ 51 ] ;
char ra[11] ;
float nota ;
int falta ;
} tpRegistro ;
FILE
fopen
112
int main ( ) {
tpRegistro reg ;
FILE *arq ;
arq = fopen ( "alunos.dat", "a+b" ) ;
if ( arq == NULL )
arq = fopen ( "alunos.dat", "w+b" ) ;
if ( arq == NULL ) {
printf ( "\nO arquivo não pode ser criado!\n\n" ) ;
system ( "pause" ) ;
exit ( 1 ) ;
}
tipo de dado para uma variável ponteiro para um arquivo
função para abrir um arquivo deve receber os parâmetros nome do arquivo e o
modo de abertura
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
do {
system ( "cls"
);
Exemplo
de manipulação
de Arquivo Binário
printf ( "Para encerrar digite '.' no campo Nome\n\n" ) ;
printf ( "Nome.... : " ) ;
fflush ( stdin ) ;
gets ( reg.nome ) ;
if ( strcmp ( reg.nome,"." ) != 0 ) {
printf ( "Ra...... : " ) ;
fflush ( stdin ) ;
gets ( reg.ra ) ;
printf ( "Nota.... : " ) ;
scanf ( "%f", &reg.nota ) ;
printf ( "Faltas.. : " ) ;
scanf ( "%d", &reg.falta ) ;
if ( fwrite ( &reg, sizeof ( tpLista ), 1, arq ) == 0 )
break;
}
} while ( strcmp ( reg.nome, "." ) != 0 ) ;
113
fwrite
- Função que grava os dados em um arquivo do tipo binário.
- Deve receber quatro parâmetros:
- variável que contém os dados a serem gravados;
- número de bytes dos dados a serem gravados;
- de
número
de vezes
que
a gravação
será
executada;
e Estruturas de Dados – TADS
Profa. Vânia Cristina
Souza Pereira
– 2012
– Material
de Apoio
– Notas
de Aula –
- nome do arquivo onde os dados serão gravados.
EXEMPLO DE MANIPULAÇÃO DE ARQUIVO BINÁRIO
114
system ( "cls" ) ;
rewind ( arq ) ;
while ( 1 ) {
fread ( &reg, sizeof ( tpLista ), 1, arq ) ;
if ( feof ( arq ) )
break ;
printf ( "Ra....: %s\n", reg.ra ) ;
printf ( "Nome..: %s\n", reg.nome ) ;
printf ( "Nota..: %.1f\n", reg.nota ) ;
printf ( "Faltas: %d\n\n", reg.falta ) ;
}
fclose ( arq ) ;
system ( "pause" ) ;
return 0 ;
}
rewind
fread
recoloca o leitor de posição no início do arquivo.
lê os dados de um arquivo do tipo binário. Deve receber 4 parâmetros:
- variável que receberá os dados lidos;
- número de bytes dos dados que serão lidos;
- número de vezes que a leitura será executada; e
- nome do arquivo onde os dados estão gravados.
feof
informa se o final do arquivo foi atingido ou não, retornando 0 ou 1 para F ou V
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
fclose
fecha um arquivo aberto com a função fopen
TABELA COM MODOS DE ABERTURA DE ARQUIVOS
115
MODO
"r"
SIGNIFICADO
Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.
Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o
"w"
conteúdo anterior será destruído.
Abrir um arquivo texto para gravação. Os dados serão adicionados no fim do arquivo (
"a"
"append"), se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente
anteriormente.
"rb"
Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.
"wb" Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.
Acrescenta dados binários no fim do arquivo, como no modo "a" anterior, só que o arquivo é
"ab"
binário.
"r+"
Abre um arquivo texto para leitura e gravação. O arquivo deve existir e pode ser modificado.
Cria um arquivo texto para leitura e gravação. Se o arquivo existir, o conteúdo anterior será
"w+"
destruído. Se não existir, será criado.
Abre um arquivo texto para gravação e leitura. Os dados serão adicionados no fim do arquivo
"a+"
se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente
anteriormente.
Abre um arquivo binário para leitura e escrita. O mesmo que "r+" acima, só que o arquivo é
"r+b"
binário.
Cria um arquivo binário para leitura e escrita. O mesmo que "w+" acima, só que o arquivo é
"w+b"
binário.
Profa. Vânia
Cristina de
Souza ou
Pereira
2012 arquivo
– Materialbinário
de Apoio
– Notas
de Aula
– Estruturas
de Dados
– TADS
Acrescenta
dados
cria–uma
para
leitura
e escrita.
O mesmo
que
"a+" acima,
"a+b"
só que o arquivo é binário
EXEMPLO DE MANIPULAÇÃO DE ARQUIVO TEXTO
116
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main ( ) {
FILE *arq ;
char nome [ 30 ] ;
int idade, cont = 0 ;
float altura;
arq = fopen ( "dados.txt", "a+" ) ;
if (arq == NULL) {
printf ( "\nErro na criação do arquivo dados.txt" ) ;
getch ( ) ;
exit ( 1 ) ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE MANIPULAÇÃO DE ARQUIVO TEXTO
117
for ( ; ; ) {
system ( "cls" ) ;
printf ( "Nome (. para finalizar ) : " ) ;
flush ( stdin ) ;
gets ( nome ) ;
if ( strcmp ( nome, ".“ ) == 0 )
break ;
printf ( "Idade: " ) ;
scanf ( "%i",&idade ) ;
printf ( "Altura: " ) ;
scanf ( "%f",&altura ) ;
fprintf ( arq, " %s %i %.2f \n ", nome, idade, altura ) ;
}
fclose ( arq ) ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
EXEMPLO DE MANIPULAÇÃO DE ARQUIVO TEXTO
118
printf ( "\nAbertura e leitura do arquivo gravado\n" ) ;
arq = fopen ( "dados.txt", "r" ) ;
if ( arq==NULL ) {
printf ( "\nErro na abertura do arquivo dados.dat" ) ;
getch ( ) ;
exit ( 1 ) ;
}
while ( ! feof ( arq ) ) {
fscanf ( arq,“ %s %i %f \n ", nome, &idade, &altura ) ;
printf ( "\n Nome = %s Idade = %i Altura = %.2f", nome, idade, altura ) ;
++cont ;
}
fclose ( arq ) ;
printf ( "\n\nArquivo com %d registros. Fechando o arquivo.\n", cont ) ;
getch ( ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – TADS
UNIVERSIDADE NOVE DE JULHO - UNINOVE
119
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
LISTAS ENCADEADAS
Material disponível para download em: http://prof.vania.cristina.sites.uol.com.br
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
LISTAS ENCADEADAS
120
• Para ilustrar o que é uma lista, vamos brincar um pouco.
• Imagine que uma pessoa de sua familiar está aniversariando e que você entregará a ela um
cartão.
• No cartão está escrito que o presente está embaixo do tapete na entrada da casa.
• Quando a pessoa chega até lá, ela encontra outro cartão com uma mensagem avisando que o
presente está dentro da mala que se encontra na sala.
• Ao abrir a mala encontra outro papel mandando-a procurar dentro da geladeira.
• Ao chegar até a geladeira a pessoa é mandada para o quarto para que finalmente encontre seu
presente sobre a cama.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
121
Listas Encadeadas
• Devemos notar que:
• As setas utilizadas na ilustração nada mais são que mero artifício ilustrativo, visto que na
descrição do exemplo elas não existem;
• Faz-se necessário um ponto de partida (cartão), que não é considerado parte integrante da
sequência, apenas indicador de seu início;
• Cada um dos pontos é composto pela localização do ponto e de uma indicação do próximo
local. Isso os torna de tal maneira independentes que permite até mesmo uma alteração
completa de sua disposição, mantendo intacto o encadeamento lógico de seus componentes.
• Temos, então, um exemplo daquilo que chamamos de lista, ou lista encadeada, que se define
por:
UM CONJUNTO DE ELEMENTOS INDIVIDUALIZADOS EM QUE CADA UM
REFERENCIA UM OUTRO ELEMENTO DISTINTO COMO SUCESSOR.
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
122
LISTAS ENCADEADAS
• Em outro exemplo, imagine a preparação de uma lista de tarefas a serem cumpridas no centro
da cidade. Inicialmente cada atividade é relacionada, conforme vai surgindo na memória, até
que se esgotem. Temos então o seguinte:
LISTA DE TAREFAS
1.Sacar dinheiro no caixa eletrônico
2.Comprar os livros na livraria
3.Deixar o carro no estacionamento
4.Pegar alguns dvd’s na locadora
5.Enviar encomenda pelo correio
6.Buscar as fotos digitais reveladas
7.Autenticar documentos no cartório
8.Passar na banca de jornais
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
123
LISTAS ENCADEADAS
Início
1
1
2
Banco
2
livraria
5
Correio
3
3
estacionamento
6
6
fotos
4
4
locadora
7
7
5
8
cartório
8
banca
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
124
LISTAS ENCADEADAS
• Agora, um pouco de planejamento: é preciso estabelecer uma ordem a ser seguida conforme
os mais variados critérios: (pré-requisitos, prioridades, proximidade geográfica, etc.). Porém
não iremos reescrever a lista, vamos apenas acrescentar uma coluna, como apresentado a
seguir:
LISTA DE TAREFAS
COMEÇO EM: 3
ITEM
PRÓXIMO
1. Sacar dinheiro no caixa eletrônico
6
2.Comprar os livros na livraria
4
3.Deixar o carro no estacionamento
8
4. Pegar alguns dvds na locadora
Final
5. Enviar encomenda pelo correio
1
6.Buscar as fotos digitais reveladas
2
7.Autenticar documentos no cartório
5
8.Passar na banca de jornais
7
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
125
LISTAS ENCADEADAS
• Temos, então a mesma lista de antes, só que agora ela está encadeada, porque cada elemento
"aponta para" um sucessor, ou seja, cada elemento indica o próximo da lista como se
apontasse para este.
Início
3
1
2
Banco
6
livraria
5
3
4
estacionamento
6
Correio
1
fotos
4
8
locadora
7
2
cartório
8
5
banca
7
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
126
LISTAS ENCADEADAS
• Através de ponteiros podemos alocar espaço para uma informação na memória e liberar este
mesmo espaço quando não for mais necessário.
• Quando precisamos guardar várias informações na memória, independente da quantidade,
podemos utilizar uma estrutura conhecida como Lista Encadeada.
• Uma lista encadeada é uma sequência de informação armazenadas em algum lugar da
memória, sendo que as mesmas estão ligadas entre si por um endereço (pointer).
• Um lista encadeada é criada a partir da estrutura de um registro (estrutura RECORD).
• A estrutura mais básica deste registro conterá dois tipos de campos:
• O primeiro tipo serão os campos utilizados para armazenar as informações propriamente
ditas e
• O segundo tipo será um campo do tipo ponteiro que irá armazenar o endereço da próxima
informação existente na memória.
Início
nome
idade
sexo
proximo
nome
idade
sexo
proximo
nome
idade
sexo
proximo
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
ESTRUTURA DE UMA LISTA ENCADEADA
127
• Para declarar a estrutura de uma lista encadeada devemos criar um tipo struct como por
exemplo:
struct reg {
char nome [ 51 ] ;
int idade ;
char sexo ;
struct reg *proximo ;
} tpLista ;
tpLista *inicio ;
nome
idade
sexo
proximo
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENCADEADA
128
#include <stdio.h>
#include <stdlib.h>
typedef char tpElem ;
typedef struct registro {
tpElem dado ;
struct registro *prox ;
} tpLista ;
void insere ( tpLista *noatual, tpElem x ) ;
void mostra ( tpLista *noatual ) ;
tpLista *procura ( tpLista *noatual, tpElem x ) ;
int retira ( tpLista *noatual, tpElem x ) ;
void esvazia ( tpLista *noatual ) ;
tpLista *inicio = NULL ;
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO MAIN( )
int main( ) {
tpElem valor ;
insere ( inicio, 'b' ) ;
insere ( inicio, 'd' ) ;
insere ( inicio, 'c' ) ;
insere ( inicio, 'a' ) ;
129
printf ( "Dado a ser retirado: " ) ;
fflush ( stdin ) ;
scanf ( "%c", &valor ) ;
if ( retira ( inicio , valor ) == 0 )
printf ( " Nao encontrado...\n\n\n" ) ;
else
printf ( " Valor retirado...\n\n\n" ) ;
mostra ( inicio ) ;
printf ( "\n\nDado a ser procurado: " ) ;
scanf ( "%c", &valor ) ;
mostra ( inicio ) ;
esvazia ( inicio ) ;
if ( procura ( inicio , valor ) == NULL )
printf ( " Nao achou...\n\n" ) ;
else
printf ( " Achou...\n\n" ) ;
printf ( "\n\n\n" ) ;
system ( "pause" ) ;
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO INSERE( )
130
void insere ( tpLista *noatual, tpElem x ) {
tpLista *novono ;
novono = ( tpLista * ) malloc( sizeof ( tpLista ) ) ;
novono->dado = x ;
if ( noatual == NULL ) {
inicio = novono ;
inicio->prox = NULL ;
}
else {
while ( noatual->prox != NULL )
noatual = noatual->prox ;
novono->prox = NULL ;
noatual->prox = novono ;
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO MOSTRA( )
131
void mostra ( tpLista *noatual ) {
printf ( "Valores atuais na lista => " ) ;
while ( noatual != NULL ) {
printf ( "%c ",noatual->dado ) ;
noatual = noatual->prox ;
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO PROCURA( )
132
tpLista *procura ( tpLista *noatual, tpElem x ) {
while ( noatual != NULL ) {
if ( x == noatual->dado )
return noatual ;
else
noatual = noatual->prox ;
}
return NULL ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO RETIRA( )
133
int retira ( tpLista *noatual, tpElem x ) {
tpLista *libera ;
while ( noatual->prox != NULL ) {
if ( noatual == NULL )
if ( x == noatual->prox->dado ) {
return 0 ;
libera = noatual->prox ;
else
noatual->prox = libera->prox ;
if ( x == noatual->dado ) {
free ( libera ) ;
libera = noatual ;
return 1 ;
inicio = noatual->prox ;
}
free ( libera ) ;
else
return 1 ;
noatual = noatual->prox ;
}
}
else {
}
return 0 ;
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
EXEMPLO DE LISTA ENC. – FUNÇÃO ESVAZIA( )
134
void esvazia ( tpLista *noatual ) {
while ( noatual != NULL ) {
inicio = noatual->prox ;
free ( noatual ) ;
noatual = inicio ;
}
}
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
135
LISTA ENCADEADA - EXERCÍCIO
• Faça o encadeamento das listas abaixo sabendo que a primeira lista tem como chave de
indexação o campo "p" e a segunda lista tem como chave de indexação o campo "n".
LE1
1
2
3
4
5
6
Grupo 37
Teatro 22
Linha 13
Aulas 57
Ensaio 15
Mansão 25
p
n
LE2
s
p
n
s
p
n
s
p
n
s
p
n
s
p
n
1
2
3
4
5
6
Grupo 37
Teatro 22
Linha 13
Aulas 57
Ensaio 15
Mansão 25
p
n
s
p
n
s
p
n
s
p
n
s
p
n
s
p
n
s
s
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
136
LISTA ENCADEADA - EXERCÍCIO
LE1
1
2
1
Ana
2
n
p
3
Solano 3
n
p
4
Selma 4
n
p
5
Maria 5
n
p
6
Sonia 6
n
p
7
Fátima 7
n
p
8
Ângela 8
n
p
Silvia
n
p
nome1 = LE1 -> p -> p -> p -> n + LE1 -> p -> p -> p -> p -> p -> p -> n
LE2
4
1
2
Flávio 5
n
p
3
Luiz
6
n
p
4
Miguel 8
n
p
5
André 1
n
p
6
Hugo
2
n
p
7
Mateus 3
n
p
8
Rafael
n
Pedro 7
p
n
nome2 = LE2 -> p -> p -> p -> n + LE2 -> p -> p -> p -> p -> p -> p -> n
Profa. Vânia Cristina de Souza Pereira – 2012 – Material de Apoio – Notas de Aula – Estruturas de Dados – CC/SI
p
Download