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