Tipos Abstratos de Dados

Documentos relacionados
Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: tipos de dados definidos pelo programador: struct union enum typedef

Tipos de Dados Definidos Pelo Usuário. Estruturas Uniões Enumerações O Comando sizeof O Comando typedef

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Algoritmos e Estruturas de dados

#include <stdio.h> #define nl 3 #define nc 4 main () { int matriz[nl][nc],*p,i; for (i=0, p=&matriz[0][0];i<nl*nc;i++) *(p++)=i+1; for (i=0,

Introdução a Programação. Ponteiros para Estruturas, Outros Tipos de Estruturas

Estruturas. Estruturas. Estruturas. Estruturas. Estruturas. Algoritmos e Lógica de Programação. Estruturas. Uniões Enumerações CANSI

Programação: Vetores

Introdução à Computação

Introdução a Programação. Tipos Estruturados de Dados

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Tipos Estruturados. Tipos Estruturados

C++ - Matrizes. Observ.: C++ não avisa quando o limite de uma matriz foi excedido. Providenciar a verificação é responsabilidade do programador.

Algoritmos e Programação

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Métodos Computacionais. Tipos Estruturados

Estruturas. K&R: Capitulo 6. Estruturas IAED, 2014/2015. Introdução às Estruturas Estruturas e Funções Vectores de Estruturas Typedef Exemplo

Ponteiros e Tabelas. K&R: Capítulo 5

Linguagem C Princípios Básicos (parte 1)

Declarando e Utilizando Ponteiros. Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

SSC304 Introdução à Programação Para Engenharias. Estruturas. GE4 Bio

Working 03 : Conceitos Básicos I

Programação I Funções. Prof. Carlos Alberto

Prática de Programação. Prof. Tiago A. E. Ferreira Aula 9 Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Computação para Engenharia Ambiental

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: ESTRUTURAS DEFINIDAS PELO

struct <identificador> { tipo <nome_variável>; tipo <nome_variável>; : } <variáveis_estrutura>;

Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Dominar a manipulação de arquivos

Estrutura de Dados. TAD (Tipo Abstrato de Dados) Criando a primeira estrutura

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Introdução. Ponteiros

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Computação 2. Aula 5. Diego Addan Estrutura de Dados Registros (structs)

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 5: Array. (complemento de dois) Aura - Erick

Universidade Federal do Espírito Santo. Programação I Tipos de Dados Básicos - C Professora: Norminda Luiza

Algoritmos e Estruturas de Dados I 01/2013. Passagem de Parâmetros e Estruturas. Pedro O.S. Vaz de Melo

Estruturas de Dados Homogêneas (Vetores e Matrizes) e Ponteiros em C

Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

8. Tipos estruturados

Laboratório de Programação II

3. Linguagem de Programação C

Computação Eletrônica. Aula 08 Estruturas de Dados. Prof: Luciano Barbosa. CIn.ufpe.br

Introdução à Programação C

Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I. Aula 12 Estruturas

Algoritmos e Programação

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 11 Estruturas (Structs) Structs

Introdução à Programação C

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Vetores e Matrizes. Conceito. Conceito. Conceito. Conceito. Conceito. Variáveis Compostas Homogêneas. Matriz

Tipos Abstratos de Dados

ponteiros INF Programação I Prof. Roberto Azevedo

Modulo 10 : Tipos especiais de dados: união, enumeração e...

MC-102 Aula 21 Registros

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Introdução à Programação

USP - ICMC - SSC SSC o. Semestre 2010 Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Índice Valor C A D E I A \0 memória

NOTAS DE AULA 09 Estruturas e Ponteiros

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

Variáveis primitivas e Controle de fluxo

Modificadores de Acesso e Atributos de Classe

3. Linguagem de Programação C

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 09 Estruturas

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

Caracteres, Vetores e Matrizes

4. Estruturas Fundamentais de Programação em C

Matrizes. Marina Andretta. 17 de abril de 2017 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 17 de abril de / 30

DAS5102 Fundamentos da Estrutura da Informação

Módulo 8 Tipos Estruturados

Linguagens de Programação I

LÓGICA DE PROGRAMAÇÃO (C) VETORES E MATRIZES. Professor Carlos Muniz

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Programação de Computadores II

Introdução à Programação C

Vetores. Marina Andretta. 11 de abril de 2016 ICMC-USP. Marina Andretta (ICMC-USP) sme0230-ipc 11 de abril de / 20

Funções em Linguagem C Parte II

Matrizes em C. Lucas Ferrari de Oliveira Professor Adjunto. Universidade Federal do Paraná

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Revisão. Profa Marina Gomes

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

Programação Estruturada

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

3. Linguagem de Programação C

Programação Estruturada Prof. Rodrigo Hausen Agregados de Dados Heterogêneos (structs)

Linguagem C Variáveis Indexadas ( vetores e Matrizes) Lógica de Programação

Introdução a Computação

Computação eletrônica:

Transcrição:

Capítulo 3 Tipos Abstratos de Dados A linguagem C possui diversos tipos de dados nativos e disponíveis ao programador como int, float, double, long, char, entre outros. Um programador pode utilizar estes tipos de dados na forma de variáveis para representar informações em seus programas. Em algumas situações, porém, os tipos de dados nativos não representam adequadamente as informações que o programador precisa representar. Tipos Abstratos de dados são tipos de dados que podem ser criados pelo próprio programador C para conseguir representar informações de uma forma mais direta que utilizando apenas os tipos nativos da linguagem C. Existem várias formas de criar tipos abstratos de dados, as quais serão estudadas em partes. 3.1 Enumeração Uma enumeração em C é um tipo de dado que suporta apenas um conjunto finito de valores. A forma de uma enumeração é 1 enum diasemana {domingo, segunda, terca, quarta, quinta, sexta,sabado}; // definicao da enumeracao 2 enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro}; 3 enum cor {branca, amarela, azul, verde, vermelha, preta}; Neste exemplo, criou-se três enumerações diasemana, mes e cor. As enumerações criadas podem ser utilizadas para criar variáveis que somente aceitem como valores os elementos que foram listados entre chaves. No exemplo abaixo, utilizou-se uma enumeração para criar uma variável e depois atribuir um determinado valor a esta variável. Mais tarde o valor da variável é testado para saber se vale sexta. Tanto sexta quanto segunda são valores válidos pois foram listados entre chaves na definição da enumeração. Internamente uma enumeração é representada por um número. Ou seja, no exemplo da primeira enumeração a palavra domingo vale a mesma coisa que 0 (valor padrão), segunda vale 1, terça 2 e assim por diante. Quando atribuimos um valor Minha_Variavel = segunda na realidade ela está recebendo o valor 1. Já na comparação, estamos comparando com o valor 5. 1 enum diasemana Minha_Variavel; // uso da enumeracao para criar uma variavel 2 3 Minha_Variavel = segunda; 4 5 if (Minha_Variavel==sexta) 6 { 7 } else { 9 } Perceba que para criar uma variável, é necessário utilizar a palavra enum seguinda do nome da enumeração criada e o nome da variável. Felizmente, existe uma forma de tornar o uso de uma enumeração semelhante ao de um tipo nativo da linguagem C, através do typedef. 1 enum diasemana {domingo, segunda, terca=5, quarta, quinta, sexta=22,sabado}; // definicao da enumeracao 2 enum mes {janeiro, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro}; 1

2 CAPÍTULO 3. TIPOS ABSTRATOS DE DADOS 3 enum cor {branca, amarela, azul, verde, vermelha, preta}; 4 5 typedef enum diasemana diasemana; 6 7 diasemana Minha_Variavel; 9 Minha_Variavel = segunda; Os valores não precisam ser necessariamente sequenciais iniciando-se em 0. Podemos ajustar o valor de um dos dias da semana para ser digamos 5. Todos os elementos seguintes ao elemento que foi ajustado terão valores uma unidade maior e a sequencia continua. No exemplo, domingo vale 0, segunda vale 1, terça vale 5, quarta vale 6, quinta vale 7, sexta vale 22 e sábado 23. 3.2 Estruturas não homogêneas As vezes precisamos trabalhar com um conjunto de informações como se fosse apenas uma. Vamos pensar os registros de pessoas numa agenda telefônica. Um registro da agenda descreve uma pessoa. O registro será composto tipicamente por nome, endereço e telefone. Na linguagem C podemos criar um registro com a palavra reservada struct, tal como mostrado abaixo. Podemos criar variáveis utilizando posteriormente a palavra struct o nome da estrutura que foi criada pelo programador e o nome da variável. Agora temos uma variável chamada Variavel_V1 que internamente possui 3 campos (nome, endereco e telefone) que podem ser acessados utilizando-se um ponto. 1 struct Registro_de_pessoa { 2 char nome[20]; 3 char endereco[20]; 4 int telefone; 6 7 struct Registro_de_pessoa Variavel_V1; 9 Variavel_V1.telefone=324567; 10 strcpy(variavel_v1.nome, "Ana Maria"); 11 strcpy(variavel_v1.endereco, "getulio Vargas 1234"); 12 13 14 printf("mostra os dados completos\n"); 15 printf("nome=%s Endereco=%s Telefone= %d \n\n", Variavel_V1.nome, Variavel_V1.endereco, Variavel_V1. telefone); No exemplo utilizamos o ponto para acessar o campo telefone e como telefone é um inteiro, conseguimos atribuir diretamente um valor para o mesmo. Já para o caso do campo nome e endereço que são strings, na linguagem C não é possível atribuir diretamente, precisamos utilizar uma função de copia de string strcpy() para este fim. Posteriormente, mostramos na tela os valores dos campos usando um printf. A forma de declarar variáveis que são uma estrutura é semelhante ao enum no sentido de ser necessário escrever a palavra reservada novamente. Podemos adotar a mesma solução que antes e usar o typedef para criar um nome novo para o struct Registro_de_pessoa. Agora, a forma de declarar variáveis ficou semelhante ao uso dos tipos nativos da linguagem C 1 struct Registro_de_pessoa { 2 char nome[20]; 3 char endereco[20]; 4 int telefone; 6 typedef struct Registro_de_pessoa Registro_de_pessoa; 7 // tipo de dado nome da variavel 9 Registro_de_pessoa Variavel_V1; 10 int xxx; 11 12 Variavel_V1.telefone=324567; 13 strcpy(variavel_v1.nome, "Ana Maria");

3.2. ESTRUTURAS NÃO HOMOGÊNEAS 3 14 strcpy(variavel_v1.endereco, "getulio Vargas 1234"); 15 16 17 printf("mostra os dados completos\n"); 1 printf("nome=%s Endereco=%s Telefone= %d \n\n", Variavel_V1.nome, Variavel_V1.endereco, Variavel_V1. telefone); Ao criarmos os campos de uma struct podemos utilizar os tipos nativos da linguagem C e também outros tipos que tenham sido criados pelo programador. Veja o exemplo. 1 2 struct Tipo_Telefone { 3 int DDD; 4 int numero; 5 } 6 typedef struct Tipo_Telefone Tipo_Telefone; 7 struct Tipo_Endereco { 9 char rua[20] 10 int numero_da_casa; 11 char cidade[20]; 12 char estado[3]; 13 } 14 typedef struct Tipo_Endereco Tipo_Endereco; 15 16 17 struct Registro_de_pessoa { 1 char nome[20]; 19 Tipo_Endereco endereco[20]; 20 Tipo_Telefone telefone; 21 }; 22 typedef struct Registro_de_pessoa Registro_de_pessoa; 23 24 // tipo de dado nome da variavel 25 Registro_de_pessoa Variavel_V1; 26 int xxx; 27 2 Variavel_V1.telefone.DDD=4; 29 Variavel_V1.telefone.numero=321234; 30 31 strcpy(variavel_v1.nome, "Ana Maria"); 32 strcpy(variavel_v1.endereco.rua, "getulio Vargas"); 33 Variavel_V1.endereco.numero_da_casa=1234; 34 strcpy(variavel_v1.endereco.cidade, "Ararangua"); 35 strcpy(variavel_v1.endereco.estado, "SC"); 36 37 3 printf("mostra os dados completos\n"); 39 printf("nome=%s Endereco=%s %d Telefone= (%d)- %d \n\n", Variavel_V1.nome, Variavel_V1.endereco.rua, Variavel_V1.endereco.numero_da_casa, 40 Variavel_V1.telefone.DDD, Variavel_V1.telefone.numero); 3.2.1 Estruturas não homogêneas - typedef struct Podemos combinar a o struct e o typedef vistos anteriormente para criar um novo tipo de dado, veja o exemplo: 1 2 typedef struct XXXX { 3 char Nome[5]; 4 int Codigo; 5 char Sexo; 6 int c;

4 CAPÍTULO 3. TIPOS ABSTRATOS DE DADOS 7 char Opcao; } Dados_Cliente; 9 10 void main (void) 11 { 12 Dados_Cliente Cliente; 13 14 Cliente.Codigo=12345; Cliente.Sexo= F ; 15 printf("codigo:%d\n",cliente.codigo); 16 printf("sexo :%c\n",cliente.sexo); 17 } Repare que XXXX pode ser qualquer coisa (é opcional), o que importa mesmo é o nome Dados_Cliente que aparece antes do ponto e vírgula. 3.2.2 Inicialização estática de estruturas É possível inicializar uma estrutura no mesmo momento no qual uma variável é criada. No exemplo abaixo, Dados_cliente é composto por 2 campos. A variável cliente é criada como sendo do tipo Dados_cliente mas seu valor não é explicitado. Ja a variável Pedro é criada e o valor de seus dois campos é explicitado na mesma ordem em que foram declarados dentro do struct. 2 #include <string.h> 3 4 typedef int Meu_Inteiro; 5 typedef char String[100]; 6 7 typedef struct { char Nome[5]; 9 int Codigo; 10 }Dados_Cliente; 11 12 void main (void) 13 { 14 Meu_Inteiro xx; 15 String a; 16 Dados_Cliente Cliente; 17 Dados_Cliente Pedro={"teste",123}; 1 } 3.3 Uniões Uniões são similares a structs no sentido de que podemos criar um registro composto por várias variáveis. Mas existe uma grande diferença entre registros e uniões em relação a como os campos ficam localizados na memória. Ao utilizar uniões, os campos que aparecem dentro da união ocuparão a mesma posição de memória. ex: 1 union { 2 float numero_float; 3 int numero_inteiro; 4 }Tipo_Variavel; 5 6 void main () { 7 Tipo_Variavel x; x.numero_float = 3.1415; 9 printf("%f\n",x.numero_float); 10 x.numero_inteiro = 45; 11 printf("%d\n",x.numero_inteiro); 12 }

3.4. MODIFICANDO CAMPOS DE UMA ESTRUTURA 5 3.4 Modificando campos de uma estrutura Sabemos que para acessar um campo de uma estrutura é necessário usar o operador.. Ocorre que se tivermos uma função e o parâmetro desta função é uma estrutura, cuidados especiais devem ser tomados. Veja um exemplo que NÃO FUNCIONA. 6 // O programador acredita que assim, modificara o campo CPF. 7 // Mas para modificar o parametro da funcao, este precisa ser passado por REFERENCIA // e NAO por VALOR... 9 void muda_cpf ( struct Teste xx) { 10 xx.cpf = 100; 11 } 12 void main (void) 13 { 14 struct Teste T; 15 16 T.codigo=123; 17 T.CPF=34; 1 muda_cpf(t); 19 printf("cpf=%d\n",t.cpf); 20 } Agora veja o próximo exemplo, onde o parâmetro da função muda CPF é passado por referência (passa-se o endereço onde a variável está na memória). Para alterar um campo dessa estrutura, precisamos usar a notação (*variável estrutura).nome do campo=valor; Como mostrado no próximo exemplo. 6 void muda_cpf ( struct Teste *xx) { 7 (*xx).cpf= 100; } 9 void main (void) 10 { 11 struct Teste T; 12 13 T.codigo=123; 14 T.CPF=34; 15 muda_cpf(&t); 16 printf("cpf=%d\n",t.cpf); 17 } A notação (*xx).cpf assusta algumas pessoas, por isso, existe uma notação equivalente xx->cpf, ou seja, ao invés de. usa-se -> (seta). Em resumo: Quando você precisa alterar campos de uma estrutura DENTRO DE UMA FUNÇÃO a estrutura deve ser passada por REFERÊNCIA e os campos devem ser acessados usando o ->. 6 void muda_cpf ( struct Teste *xx) { 7 xx->cpf= 100; // Aqui usa o operador seta para modificar o campo CPF 9 } 10 void main (void)

6 CAPÍTULO 3. TIPOS ABSTRATOS DE DADOS 11 { 12 struct Teste T; 13 14 // coloca algum conteudo dentro da estrutura, usa o ponto pois aqui so apenas os campos de uma varivel 15 T.codigo=123; 16 T.CPF=34; 17 muda_cpf(&t); // Neste ponto o programador deseja alterar a estrutura, entao deve passa-la por referencia 1 printf("cpf=%d\n",t.cpf); 19 } 3.5 Vetores de estruturas Podemos criar vetores de estruturas onde cada uma das posições do vetor será uma estrutura composta por campos. Abaixo, mostra-se como criar um vetor estático de 100 posições onde cada uma destas posições terá os campos código e CPF. 6 typedef struct Teste Teste; 7 Teste vetor[100]; 9 void main (void) { 10 vetor[0].cpf=100; 11 vetor[0].codigo=1212; 12 vetor[1].cpf=1233; 13 vetor[1].codigo=345; 14 } 3.5.1 Função com vetores de estruturas como parâmetros Quando utilizamos vetores de estruturas como parâmetros, por ser um vetor, seu nome é o endereço onde o mesmo está na memória. Assim, internamente na função podemos modificar o vetor pois é uma passagem de parâmetro por referência (mesmo que não sejam utilizados os símbolos & e asterisco). 6 typedef struct Teste Teste; 7 Teste vetor[100]; int contador=0; // contador comeca em zero 9 void insere_dados (Teste v[], int codigo, int CPF) { 10 v[contador].codigo=codigo; // usa uma variavel GLOBAL contador para controlar 11 v[contador].cpf=cpf ; // a posicao onde deve colocar os dados 12 contador++; // na proxima vez insere na proxima posicao 13 } 14 void mostra_todos (Teste v[]) { 15 int x; 16 for (x=0;x<contador;x++) { 17 printf("%d %d\n",v[x].codigo, v[x].cpf); 1 } 19 } 20 void main (void) { 21 insere_dados(vetor, 100, 123); 22 insere_dados(vetor, 200, 456);

3.5. VETORES DE ESTRUTURAS 7 23 insere_dados(vetor, 300, 79); 24 insere_dados(vetor, 400, 9); 25 mostra_todos (vetor); 26 } 3.5.2 Vetores de estruturas O exemplo anterior apresentou um vetor de estruturas e uma variável global para controlar a posição que o mesmo deve ser acessado. Ocorre que usar variável global não é uma boa forma de manter o código bem organizado e gerenciado, ainda mais se tivermos vários vetores de estruturas para controlar. Uma forma mais adequada seria Empacotar a variável contadora dentro de uma estrutura 6 typedef struct Teste Teste; 7 struct Minha_Estrutura { Teste vetor[100]; 9 int contador; 10 }; 11 typedef struct Minha_Estrutura Minha_Estrutura; 12 void insere_dados (Minha_Estrutura *v, int codigo, int CPF) { 13 v->vetor[ v->contador ].codigo = codigo; 14 v->vetor[ v->contador ].CPF = CPF; 15 v->contador++; 16 } 17 void mostra_todos (Minha_Estrutura v) { 1 int x; for (x=0;x<v.contador;x++) printf("%d %d \n",v.vetor[x].codigo, v.vetor[x].cpf); 19 } 20 int main (void) { 21 Minha_Estrutura M; // N e a variavel do tipo estrutura que tem um vetor e um contador; 22 M.contador = 0; // inicializa-se o contador para marcar zero 23 insere_dados (&M, 100, 200); // usa-se & pois agora M nao e um vetor como no exemplo anterior 24 insere_dados (&M, 100, 300); 25 mostra_todos (M); 26 }