Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

32
Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima http://allanlima.wordpress.com/

Transcript of Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Page 1: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Centro Integrado de Tecnologia da Informação

Curso de C/C++Aula 5

Allan Limahttp://allanlima.wordpress.com/

Page 2: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

• Você pode:– copiar, distribuir, exibir e executar a obra – criar obras derivadas – fazer uso comercial da obra

• Sob as seguintes condições:– Atribuição. Você deve dar crédito ao autor original, da forma

especificada pelo autor ou licenciante. – Compartilhamento pela mesma Licença. Se você alterar,

transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.

– Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra.

– Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor.

• Veja aqui a licença completa

Page 3: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Roteiro

• Tipos avançados de dados– Estruturas– Uniões– Enumerações

• Arquivos cabeçalho

Page 4: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Problema

• Tipos primitivos são muito bons quando queremos representar coisa simples

• Mas e quando nós precisarmos representar com coisa mais complexas?– Computador– Pessoa– Funcionário– Bicicleta– ...

Page 5: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Estruturas

• Agrupam diversas variáveis em um único tipo

• São tipos de dados criados pelo programador

• Sintaxe:struct nomeEstrutura {

tipo1 nome1;...tipoN nomeN;

} listaDeVariáveis;

Page 6: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplos

struct Endereco {

char rua[50];

int numero;

char bairro[20];

char *cidade;

char sigla[3];

long int cep;

};

Os atributos não podem ser inicializados dentro da própria estrutura:

struct S { // ERRADO!!! float f = 2.5f;};

Page 7: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Estruturas

• Podemos restringir o número exato de bits que cada campo para o comportamento do campo

• Exemplo:struct Exemplo {

int a:3;char c:4;long long l:40;

};

Page 8: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Ponteiros para Estruturas

• Estruturas podem conter ponteiros para outras estruturas

• Exemplo:

struct Pessoa {

char nome[100];

char telefone[14];

struct Endereco *endereco;

};

Page 9: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplos

struct Cidade {

char *nome;

long populacao;

};

struct Estado {

char *nome;

char sigla[3];

struct Cidade *cidades;

int numeroCidades;

} pernambuco; // variável

Page 10: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Manipulação

• O acesso aos membros de uma estrutura é feito através dos operadores:. (Ponto)

struct Cidade c;

c.populacao = 10;

->struct Cidade *c

= malloc(sizeof(struct cidade));

c->populacao = 10;

// equivalente a (*c).populacao

Page 11: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplo

• exemploStruct2.c

• exemploStruct3.c

Page 12: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Copias de Estruturas

struct Cidade c1, c2;

c1.nome = (char *) calloc(20, sizeof(char));strcpy(c1.nome, "Sao Paulo“);c1.populacao = 15000000;

// cuidado ao fazer cópias// de estruturasc2 = c1;

Page 13: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Copias de Estruturas

São Paulo

O que acontece quando fazemos:

strcpy(C1.nome, “Recife”);

???

c2

População 15000000

Nome

c1

População 15000000

Nome

Page 14: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Copias de Estruturas

Recife

c2.nome também é alterado!

c2

População 15000000

Nome

c1

População 15000000

Nome

Page 15: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Copias de Estruturas

• A solução:

struct Cidade *clone(struct Cidade *c) { struct Cidade *copia = (struct Cidade *) malloc(sizeof(struct Cidade)); copia->nome = (char *) calloc(strlen(c->nome) + 1, sizeof(char));

strcpy(copia->nome, c->nome); copia->populacao = c->populacao; return copia;}

Page 16: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Uniões

• Permitem criar uma única localização de memória onde podem estar armazenadas variáveis diferentes

• Sintaxe:union nomeDaUniao {

tipo1 nome1;

...

tipoN nomeN;

} listaDeVariaveis;

Page 17: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplo

#include <stdio.h>

union MinhaUniao { long i; float l;};

int main() { union MinhaUniao uniao;

uniao.i = 10; printf("%d\n", uniao.i); uniao.l = 45.4f; printf("%f\n", uniao.l); return 0;}

O compilador aloca o tamanho do maior componente da união para permitir o uso de qualquer um destes

Page 18: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplo

• exemploUnionChar.c

Page 19: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Enumerações

• Permitem ao programador restringir os valores de uma variável pode assumir

• Sintaxe:enum nome { listaDeValores } listaDeVariáveis;

• Exemplo:enum tiposTelefone {

celular, residencial, comercial

};

Page 20: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplo

#include <stdio.h>

enum Linguagens { Java, C, Pascal, Assembly, Haskell} minhaLinguagem;

int main() { enum Linguagens outraLinguagem = Java; minhaLinguagem = C; // Imprime 0 printf("Valor de Java: %d\n", outraLinguagem); // Imprime 1 printf("Valor de C: %d\n", minhaLinguagem); return 0;}

Page 21: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Enumerações

• A cada valor da enumeração é atribuído um número

• Por default o 1° é 0, o 2° é 1, ...

• Mas podemos modificar isto!

• Exemplo:

enum Linguagens {

Java = 0, C = 10000, Pascal = 10,

Assembly = 5, Haskell = 9

};

Page 22: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

sizeof

• É um operador e não uma função

• Retorna o tamanho do tipo em bytes

• Ajuda a manter a portabilidade

• Sem ele seria muito mais complicado alocar memória dinamicamente

• Sintaxe:sizeof(nomeDoTipo);

sizeof(nomeDaVariavel);

Page 23: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplo

• exemploSizeof.c

Page 24: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

typedef

• Permite ao programador definir um novo nome para um tipo criado anteriormente

• Sintaxe:typedef nomeAtual novoNome

• Exemplo:

exemploTypedef.c

Page 25: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Criando Grandes Projetos

• Grandes projetos tem muitas funções e estruturas

• Não faz sentido colocar todas em um único arquivo

• Para resolver este problema utilizamos arquivos cabeçalho

Page 26: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Arquivos Cabeçalhos

• São idênticos aos arquivos normais de código, porém com duas restrições:– Tem a extensão h– Não podem possuir uma função main

• Também são chamados de headers

• Os mais conhecidos são:– stdio.h, stdlib.h e string.h

• Por convenção só declaramos protótipo de funções em arquivos cabeçalhos

Page 27: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Arquivos Cabeçalhos

• Funcionamento:– O corpo das funções de um header ficam em

outro local, normalmente arquivo .c– O corpo só é incluído no momento da

linkagem

• Também podemos criar nosso próprios arquivos cabeçalhos

Page 28: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exemplos

• cidade.h

• cidade.c

• main.c

Page 29: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exercícios

1) Crie as estruturas:

– Carro, guardando modelo, cor, ano, fabricante, o número de portas e o valor do aluguel.– Cliente, guardando nome, endereço, celular e data de nascimento.– Locacao, guardando a data da locação, o cliente que realizou o aluguel, o carro alugado

e número de dias da locação.– Sinta-se à vontade para criar outros tipos que possam ajudar na resposta.

2) Crie um arquivo cabeçalho chamado ponto.h que irá conter as seguintes definições:

– Estrutura ponto, com os atributos x e y– Função distância que calcula a distância entre dois pontos

• Crie também um arquivo chamado ponto.c que irá conter a definição da função distancia

• Por fim crie um arquivo chamado main.c que irá testar o seu header• Obs.: Para calcular a raiz quadrada de um número utilize a função sqrt() definida

no header math.h

Page 30: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Exercícios

3) Crie as seguintes estruturas:

struct Node { // Nó da pilha int value; struct Node *next;};

struct Stack { // Pilhastruct Node *first;

};

– Defina também as funções:

void push(struct Stack *stack, struct Node *node);

Insere node no topo de stack

struct Node *pop(struct Stack *stack);

Remove e retorna o primeiro elemento de stack

– Não se esqueça de desalocar a memória no final do programa– Sinta-se à vontade para criar funções auxiliares

Page 31: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Referências

• Matos, P. A. & Carvalho, G. H. P. - A Linguagem de Programação C

• Curso de C da UFMG– http://ead1.eee.ufmg.br/cursos/C/

• Algumas Notas sobre Programação em C– http://paginas.fe.up.pt/~apm/C_tut/Cap_7.htm

• Standart C– http://www.ccs.ucsd.edu/c/

• Slides de Gustavo ([email protected]) do Curso C/C++

Page 32: Centro Integrado de Tecnologia da Informação Curso de C/C++ Aula 5 Allan Lima

Agradecimentos

• Gustavo Henrique Porto – Pelo material cedido para montagem da aula