Introdução à Computação

Documentos relacionados
Alocação Dinâmica em C

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Estrutura de Dados. Aula 07 Alocação Dinâmica

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Linguagem C. Ponteiros. Alex Vidigal Bastos.

3. Linguagem de Programação C

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

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

Aula 25: Alocação Dinâmica

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

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

Reinaldo Gomes Alocação Dinâmica

Tipos Abstratos de Dados. Estrutura de Dados

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

Princípios de Desenvolvimento de Algoritmos MAC122

Programação Estruturada

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Métodos Computacionais. Tipos Estruturados

BCC202 - Estrutura de Dados I

3. Linguagem de Programação C

Estruturas Dinâmicas - Ponteiros

Professora Jeane Melo

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Modulo 12: alocação dinâmica de memória

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Ponteiros. Baseado nos slides do Prof. Mauro.

INF 1007 Programação II

Algoritmos e Estruturas de dados

Algoritmos e Programação

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Módulo 5 Vetores e Alocação Dinâmica

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

ponteiros INF Programação I Prof. Roberto Azevedo

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

DAS5102 Fundamentos da Estrutura da Informação

Funções em Linguagem C Parte II

Ponteiros e Alocação de Memória

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Aula 24 Ponteiros, vetores e structs

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Algoritmos e Programação

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

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Programação: Vetores

Estruturas de Dados. Profa. Juliana Pinheiro Campos

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

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

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

- Mapa de memória de um processo - Ponteiros

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Alocação Dinâmica. Introdução à Computação

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

Ponteiros. Introdução

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Introdução à Computação

Aula 17: Ponteiros e Alocação Dinâmica em C

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

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

Ponteiros. Introdução e Alocação Dinâmica

11a. Aula Ponteiros e Vetores

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

3. Linguagem de Programação C

5. Vetores e alocação dinâmica

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Introdução à Linguagem C

INF 1620 P2-14/10/05 Questão 1 Nome:

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Estruturas Dinâmicas - Ponteiros Parte I

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Estruturas dinâmicas Ponteiros

Programação Estruturada

Estrutura de dados 1. Ponteiros

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

Linguagem C Ponteiros

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

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Introdução a Programação de Jogos

Programação de Computadores II. Cap. 5 Alocação Dinâmica

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

Linguagem C: Ponteiros - Alocação Dinâmica

Transcrição:

Introdução à Computação Linguagem C Professor: André de Carvalho Aula de hoje Introdução Tipos compostos Tipo enumeração Conclusão Tipos compostos A Linguagem C permite criar tipos de dados definíveis pelo usuário Tipo enumeração Estrutura (ou registro): coleção de variáveis referenciadas por um nome Também chamado agregado ou registro Fornece uma forma conveniente de agrupar informações Definição de forma um modelo que pode ser usado para criar variáveis de s Tipo de dado (struct) Formado por um conjunto de componentes individuais (campo, elemento ou membro) Não precisam ser do mesmo tipo Geralmente, os elementos de uma são logicamente relacionados Ex.: Dados de cada empregado de uma empresa Nome Número Função Salário Admissão Joao 324 operario 800 200295 Pedro 15 engenheiro 2000 201192 Criação de novas s Definição de um novo tipo Define campos da Nome de cada campo Tipo de dado de cada campo Define um modelo para todas as variáveis que sejam do novo tipo, mas não aloca espaço para elas Declaração de variáveis do novo tipo Permite armazenar valores do tipo definido 1

Definição de um novo tipo struct nome { declaração-de-campos ; A declaração de um campo é semelhante à declaração de variável struct reg_emp { char nome [30]; int numero; char funcao [20]; int salario; char admissao[20]; x, y; Definição de um novo tipo Nome do tipo é opcional se variáveis não forem declaradas posteriormente struct { char nome [30]; int numero; x, y; struct alunos { char nome [30]; int numero; x, y;... Struct alunos z; Se apenas uma variável vai ser utilizada, não é necessário dar um nome ao tipo Declaração de variáveis do tipo Ex.: reg_emp emp; struct { char nome [30]; char rua[40]; char cidade[20]; char estado[2] unsigned long int cep; endereco; É uma boa prática de programação dar um nome ao tipo emp nome funcao numero salario admissao A variável emp aparece da seguinte forma na memória Nome Número Função Salário Admissão 30 bytes 4 bytes 20 bytes 2 bytes 20 bytes Atribuição Uma vez declarada uma variável de um tipo, é possível referenciar toda a, usando apenas nome da variável Ex.: x = emp; Seleção de campo Campos específicos da, podem ser referenciados usando operador. Ex.: y = emp.nome; Operador. retorna um valor 2

Exemplo #include <stdio.h> void main(void){ struct { int a; char b; x, y; x.a = 10; y = x; /* atribui uma a outra */ printf("%d", y.a); Inicialização de uma variável do tipo Basta atribuir valores aos seus componentes Ex.: emp.nome = Wilson ; emp.salario = 1200; emp.funcao = porteiro ; emp.admissao = 100998 ; emp.numero = 31; Inicialização de uma variável do tipo Pode ser feita na declaração da variável Inicializadores devem ser fornecidos na ordem em que os respectivos campos aparecem na definição da Ex.: static reg_emp emp = { Asdrubal, 98, servente, 500, 121098 ; Outras formas de inicializar variáveis do tipo : struct regemp emp = {0 Inicializa todos os membros da com o valor 0 Membros que são ponteiros são inicializados com o valor NULL Membros que são arrays têm todos os elementos inicializados com o valor 0 Outras formas de inicializar variáveis do tipo Se existirem menos inicializadores que o número de membros, os demais são inicializados com o valor 0 Ponteiros com NULL Mais inicializadores que os membros leva a erros Podem também ser inicializadas atribuindo uma variável do mesmo tipo Vetores de s Uso mais comum de s Ex.: struct reg_emp registros[100]; Cria 100 conjuntos de variáveis organizadas conforme definido em reg_emp Para acessar uma específica, usar indexar o vetor Ex.: printf ( %d, registros[3].salario); 3

Passagem de um elemento de uma variável para uma função, passa apenas o valor desse elemento Alterações realizadas na função não afetam elemento original Para passar endereço, usar & Exceção: se o elemento for um vetor Neste caso, o endereço é que é passado Exemplo struct pessoa{ char sexo; int idade; float peso; char nome[20]; joao; func (joao.sexo); /* valor */ func (joao.idade ); /* valor */ func (joao.peso ); /* valor */ func (joao.nome ); /* endereco */ func (joao.nome[2]); /* valor */ func (&joao.peso ); /* endereco */ Estruturas inteiras podem ser passadas como argumentos para funções Tipo do argumento deve coincidir com tipo do parâmetro Mudanças feitas no conteúdo da dentro da função não mudam conteúdo da original Mudança por valor #include <stdio.h> struct struct_type { /* Define um tipo de */ int a, b; char ch; ; void f1(struct struct_type parm); void main(void){ struct struct_type arg; arg.a = 1000; f1(arg); Observação O tipo do argumento TEM que coincidir com o tipo do parâmetro Não é suficiente que os tipos sejam semelhantes (tenham os mesmos campos) Da mesma forma que permite ponteiros para outros tipos de variáveis, C permite ponteiros para s Algumas peculiaridades devem ser consideradas Exemplo: struct endereco *apont_end 4

Ponteiros para s Variável que armazena dados dos é geralmente declarada como ponteiro para s Menor e mais facilmente manipulada Permite passagem por referência (endereço) Declaração de uma variável do tipo ponteiro para só aloca espaço para o ponteiro Deve ser alocado espaço para os campos da Ex. emp_ptr Seja o tipo reg_emp definida anteriormente: reg_emp *emp_ptr; reg_emp emp; emp_ptr = &emp; emp nome funcao numero salario admissao Ponteiros para s Como referenciar campos de uma usando ponteiros? *emp_ptr.salario Desejado: (*emp_ptr).salario Produzido: *(emp_ptr.salario)». tem precedência maior que *» Emp_ptr.salario não é o endereço do campo salário Linguagem C define o operador especial -> para este caso emp_ptr->salario Alocação de memória Mecanismos para alocação de memória para variáveis em C Alocação estática Alocação automática Alocação de memória Alocação de memória Alocação estática Ex.: static int x; Declaração de variáveis locais com comportamento global Variáveis são associadas a posições fixas de memória Cada vez que a função onde ela é declarada é chamada, valor na última chamada é recuperado Alocação automática Ex.: int x; Declaração de variáveis locais (dentro de uma função) Espaço para a variável é alocada na pilha do sistema 5

Permite durante a execução de um programa: Alocação de memória adicional quando for necessário Liberação explicita de memória dinamicamente alocada quando ela não for mais necessária Quando um programa é carregado na memória, ele ocupa apenas parte da memória disponível Na maioria dos sistemas, é possível, durante a execução do programa, alocar posições de memória não utilizadas Conjunto de posições de memória não alocadas é chamada de heap Biblioteca stdlib.h de C fornece vários funções para alocar memória nova do heap Função malloc () é a mais comum Ex.: malloc (N) Retorna um endereço de um bloco de memória formada por N bytes consecutivos Resultado pode ser armazenado em uma variável do tipo ponteiro (que depois pode ser usada como um vetor) Função malloc () Em C, ponteiros têm tipos int *ip; (ponteiro para variável do tipo int) char *cp; (ponteiro para variável do tipo char) Função malloc aloca memória para ponteiro de qualquer tipo (deve retornar um ponteiro geral ) void *vp; (ponteiro para variável de qualquer tipo) Não pode ser de-referenciada Permite funções retornarem ponteiros de qualquer tipo Função malloc () Protótipo: void *malloc (int nbytes); ANSI C faz a conversão automática entre os tipos ponteiro para void e ponteiro para um tipo específico Ex.: char *cp; cp = malloc (10); cp = (char *) malloc (10); Alocam 10 bytes novos de espaço de memória e armazenam o endereço do primeiro byte em cp Limitações de memória Embora a quantidade de memória disponível seja cada vez maior, ela é finita em tamanho Heap pode ficar sem espaço disponível Quando isso ocorre, malloc () retorna o ponteiro NULL Não foi possível alocar um bloco do tamanho requerido Bom programador checa se existe espaço Ex.: cp = malloc (10); if (cp == NULL) Error ( Falta memoria ); 6

Limitações de memória Função free () recebe um ponteiro alocado por malloc () e libera a memória associada a ele para o heap Ex.: free (cp); Garbage collection Libera automaticamente espaços de memória não utilizados Usado pela linguagem java (Existem alguns programas para a linguagem C) Vetores dinâmicos Vetores declarados Memória é alocada automaticamente como parte do processo de declaração Tamanho deve ser constante durante a execução do programa Vetores dinâmicos Mémória só é alocada após o uso da função malloc Tamanho pode ser ajustado Vetores dinâmicos Criação de um vetor dinâmico com n elementos Ex.: double *vet; vet = malloc (n * sizeof (double)); if (vet == NULL) Error ( Falta memoria ); Função sizeof sizeof (tipo) sizeof (nome_var) ou sizeof nome_var Estruturas dinâmicas struct reg_emp{ string nome; int numero; string funcao; int salario; string admissao; ; reg_emp *emp; emp = malloc (n * sizeof(reg_emp)); Estruturas dinâmicas Uso de apenas um tipo seria mais conveniente Apenas tipo ponteiro para registro Várias aplicações usam s apenas através de ponteiros Estruturas que se auto referenciam Permitem conectar um número não especificado de s struct lista { int valor; struct lista *prox; elem; Variável elem ocupa duas posições de memória: - Valor numérico - Um endereço de memória para uma variável do tipo lista 7

Cada pode ser ligada a uma outra usando o campo prox Formando uma lista de s Variável ponteiro prox contém um endereço de: Posição de memória armazenando outro elemento do tipo lista ou Valor especial NULL (definido como 0) Exemplo: struct lista a, b, c a.valor = 2; b.valor = 4; c.valor = 10; a.prox = b.prox = c.prox = NULL valor prox 2 NULL 4 NULL 10 NULL Exemplo: a.prox = &b; b.prox = &c; 2 4 10 NULL Recuperando elementos sucessivos: a.prox -> valor; /* retorna 4 */ a.prox -> prox -> valor; /* retorna 10 */ struct lista * inicial; inicial = malloc (size (lista)); inicial->valor = 3; inicial->prox = NULL; Inicial->prox = malloc (size (lista)); inicial->prox->valor = 6; inicial->prox->prox = NULL; Inicial->prox->prox = malloc (size (lista)); inicial->prox->prox->valor = 20; inicial->prox->prox->prox = NULL; Exercício Obter o mesmo efeito da inicialização anterior utilizando um comando for Lista encadeada É como uma seqüência de carros, cada um rebocando o seguinte Existe um apontador inicial, apontando para o primeiro elemento (cabeça) da lista Cada elemento aponta para o elemento seguinte O último elemento aponta para NULL 8

Lista de s typedef struct pessoal { string nome; int numero; string funcao; int salario; string admissao; struct pessoal *prox; pessoal *reg_emp; Tipo enumeração C permite criar novos tipos listando os elementos que constituem seu domínio Tipo enumeração Forma sintática: enum nome-tipo { lista-de-elementos nome; Nome do novo tipo Lista de identificadores (constantes de enumeração) Tipo enumeração Exemplo enum sentidos { Norte, Leste, Sul, Oeste ; enum sentidos dir; Tipo enumeração Representação interna Valores do tipo enum são armazenadas internamente como int (inteiros) Compilador atribui números inteiros consecutivos às constantes de enumeração Começa com o valor 0 Ex.: enum sentidos {Norte, Leste, Sul, Oeste a; 0 1 2 3 Tipo enumeração Representação interna É possível controlar a codificação Ex.: enum data { Semana = 7, Mes = 30, Ano = 365 num_dias; Tipo enumeração Representação interna Quando o valor de qualquer constante de enumeração não é especificado, o compilador adiciona um ao valor da constante anterior Exemplo: enum nomes_meses { janeiro = 1, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro mes; 9

Tipo enumeração Representação interna Definição de uma enumeração é semelhante à definição de várias constantes enum nomes_meses { janeiro = 1, fevereiro, marco, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro mes; #define janeiro 1 #define fevereiro 2 #define marco 3... #define dezembro 12 Exercício Utilizando o tipo enumeração, escreva uma função que, dado um mês, retorna o mês anterior Se o mês dado for janeiro, retornar ele mesmo Obs.: a impressão de uma variável do tipo enumeração é uma impressão de inteiro Ex.: printf ( %d\n, jan); /* imprime o valor 0 */ Permite armazenar um valor cujo tipo muda no decorrer do programa Salva memória Semelhante a um tipo Cada campo se refere a uma mesma posição de memória Uso de campos diferentes pode afetar como o conteúdo de uma posição de memória é interpretado Seja a declaração: struct { int campoint; double campodb; string campostr; s; s.campoint s.campodb s.campostr Variável s é composta por três campos: Um do tipo int 2 bytes Um do tipo double 8 bytes Um do tipo string 8 bytes Cada campo é associado a uma posição diferente de memória Memória total = 18 bytes Seja a declaração: s.campoint union { int campoint; double campodb; string campostr; u; s.campodb s.campostr Também tem 3 campos Todos os campos da variável u compartilham a mesma posição de memória Tamanho da memória utilizada é a do maior campo Área ocupada pelo maior campo = 8 bytes Memória total = 8 bytes Operações permitidas Atribuir uma união a uma outra do mesmo tipo Receber o endereço de uma união Acessar membros da união utilizando o operador de membro e o operador ponteiro Assim como s, uniões não podem ser comparadas 10

Alternativa para declarar tipo união: union novo { int campoint; double campodb; string campostr; union novo u; union precisao { char letra; valor valor; nota; main () int pref; float nota; scanf ( %c, &nota.letra); scanf ( %d, &pref); if pref == 0 printf (nota eh: %c\n, nota.letra); else{ nota.valor = nota.letra a ; printf (nota eh: %d\n, nota.valor); Exercício Notação utilizada para acessar membros de uma variável união A mesma utilizada para variáveis do tipo Inicialização Apenas com um valor do primeiro dos tipos suportados Pode: union novo campoint = {8 Não pode: union novo campodn = {3.42 Escreva um programa que cria um vetor, usando vetores de, para dados de N estudantes. Os dados devem ter: No. USP Nome Ano de entrada Notas nas disciplinas: calculo I, física I, ICC I, desenho e filosofia Escrever funções para ordenar o vetor pelo nome do estudante, pelo número usp e pela média geral Conclusão Introdução Tipos compostos Tipo enumeração Conclusão 11