+ Curso de C/C++ Aula 3 Instrutor: Pedro Henrique Atanásio e Silva Material por: Allan Lima
+ Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima
Transcript of + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima
![Page 1: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/1.jpg)
+
Curso de C/C++
Aula 5
Instrutor: Luiz Felipe Sotero
Material por: Allan Lima
http://allanlima.wordpress.com/
![Page 2: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/2.jpg)
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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/3.jpg)
+Roteiro
Tipos avançados de dados
EstruturasUniõesEnumerações
Arquivos cabeçalho
![Page 4: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/4.jpg)
+Problema
Tipos primitivos são muito bons quando queremos representar coisa simples
Mas e quando nós precisarmos representar com coisa mais complexas?
ComputadorPessoaFuncionárioBicicleta...
![Page 5: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/5.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/6.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/7.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/8.jpg)
+Ponteiros para Estruturas
Estruturas podem conter ponteiros para outras estruturas
Exemplo:
struct Pessoa {
char nome[100];
char telefone[14];
struct Endereco *endereco;
};
![Page 9: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/9.jpg)
+Exemplos
struct Cidade {
char *nome;
long populacao;
};
struct Estado {
char *nome;
char sigla[3];
struct Cidade *cidades;
int numeroCidades;
} pernambuco; // variável
![Page 10: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/10.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/11.jpg)
+Exemplo
exemploStruct2.c
exemploStruct3.c
![Page 12: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/12.jpg)
+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 estruturas
c2 = c1;
![Page 13: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/13.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/14.jpg)
+Copias de Estruturas
Recife
c2.nome também é alterado!
c2
População 15000000
Nome
c1
População 15000000
Nome
![Page 15: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/15.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/16.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/17.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/18.jpg)
+Exemplo
exemploUnionChar.c
![Page 19: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/19.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/20.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/21.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/22.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/23.jpg)
+Exemplo
exemploSizeof.c
![Page 24: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/24.jpg)
+typedef
Permite ao programador definir um novo nome para um tipo criado anteriormente
Sintaxe:
typedef nomeAtual novoNome Exemplo:
exemploTypedef.c
![Page 25: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/25.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/26.jpg)
+Arquivos Cabeçalhos
São idênticos aos arquivos normais de código, porém com duas restrições:
Tem a extensão hNã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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/27.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/28.jpg)
+Exemplos
cidade.h
cidade.c
main.c
![Page 29: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/29.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/30.jpg)
+Exercícios3) Crie as seguintes estruturas:
struct Node { // Nó da pilha int value;
struct Node *next;
};
struct Stack { // Pilha
struct 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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/31.jpg)
+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: + Curso de C/C++ Aula 5 Instrutor: Luiz Felipe Sotero Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc141497959413d8df4dd/html5/thumbnails/32.jpg)
+Agradecimentos
Allan Lima. Breno do Vale e Francisco Magalhães
Pelo material cedido para o curso