Post on 20-Jan-2019
Aula 27: Estruturas heterogêneas ealocação dinâmicaIntrodução a Programação
Túlio Toffolo & Puca Huachihttp://www.toffolo.com.br
BCC201 – 2018/2Departamento de Computação – UFOP
Aulas anteriores
Memória
Ponteiro
Utilização de ponteiros
Aritmética de ponteiros
Alocação dinâmica
Estruturas heterogêneas
2 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
2 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
2 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Exercícios da última aula
Exercício 1Crie um programa que apresente, na tela de abertura, um menu comopções para:1 inserir uma nova pessoa: nome, altura e ano de nascimento;2 listar todos os nomes e respectivas alturas;3 listar os nomes das pessoas que nasceram depois de um certo ano.
Cada uma destas opções deve ser implementada em uma funçãoseparada. O programa deve ser capaz de armazenar dados de até 100pessoas.
3 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Exercícios da última aula
Exercício 2Crie uma estrutura (struct) para armazenar dados de um funcionário:1 nome (até 50 caracteres),2 função (até 50 caracteres),3 idade,4 salário.
Em seguida, crie um programa que lê os dados de n funcionários.
4 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
4 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Struct
struct: palavra reservada que cria um novo tipo de dados.
Tipos conhecidos: char, int, float, double e void.
Estrutura: é um tipo de estrutura de dados heterogênea; agrupa itensde dados de diferentes tipos.
Cada item de dado é denominado membro;
struct define um tipo de dados (estrutura): informa ao compilador onome, o tamanho em bytes e a maneira como ela deve serarmazenada e recuperada da memória.
Ao ser definido, o tipo passa a existir e pode ser utilizado para criarvariáveis.
5 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Exemplo: armazenando dados de um aluno
1 #include <iostream>2 using namespace std;34 struct Aluno {5 int nMat; // número de matrícula6 float nota[3]; // três notas7 float media; // média aritmética8 }; // fim da definição da estrutura (com ;)9
10 int main()11 {12 Aluno bart; // declara a variável do tipo Aluno13 bart.nMat = 1521001;14 bart.nota[0] = 8.5;15 bart.nota[1] = 9.5;16 bart.nota[2] = 10.0;17 bart.media = ( bart.nota[0]+ bart.nota[1] + bart.nota[2] ) / 3.0;18 cout << "Matrícula: " << bart.nMat << endl;19 cout << "Média : " << bart.media << endl;20 return 0;21 }
6 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Inicializando estruturas
A inicialização é semelhante a inicialização das matrizes.
1 struct Data {2 int dia;3 char mes[10];4 int ano;5 };67 Data natal = { 25, "Dezembro", 2016 };8 Data niver = { 20, "Outubro", 1986 };
Obs.: as variáveis são inicializadas juntamente com suas declarações. Osvalores atribuídos aos membros devem ser colocados na ordem em queforam definidos na estrutura, separados por vírgula e entre chaves.
7 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Atribuição entre estruturas
O uso de variáveis de estruturas é similar ao uso das variáveis queestamos acostumados a utilizar...
Uma variável estrutura pode ser atribuída à outra variável do mesmotipo por meio de uma atribuição simples.
1 Data natal = { 25, "Dezembro", 2016 };23 Data natalDesteAno;4 natalDesteAno = natal;
Importante:
valores dos membros da estrutura são atribuídos de uma única vez;
a atribuição entre vetores/matrizes deve ser feita elemento porelemento.
8 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Exemplo de uso e operações em structs:
1 struct Venda {2 int pecas;3 float preco;4 };56 int main()7 {8 Venda A = {20, 110.0};9 Venda B = {3, 258.0};
10 Venda total;1112 // soma membro a membro13 total.pecas = A.pecas + B.pecas;14 total.preco = A.preco + B.preco;15 }
Erro comum
1 // ERRO!2 total = A + B;
9 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas aninhadas
1 struct Data {2 int dia;3 char mes[10];4 int ano;5 };67 struct Venda {8 int pecas;9 float preco;
10 Data diaVenda;11 };1213 int main()14 {15 // exemplo de declaração16 Venda v = {20, 110.0, {7, "Novembro", 2015} };1718 // exemplo de uso:19 cout << "Ano da venda: " << v.diaVenda.ano << endl;2021 return 0;22 }
10 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
As estruturas podem ser passadas como argumentos de funções damesma maneira que as variáveis simples.
O nome de uma estrutura em C++ não é um endereço, portanto elapode ser passada por valor.
Exemplo: função que recebe duas estruturas como argumento eimprime os valores da soma de seus membros.
1 struct Venda {2 int pecas;3 float preco;4 };56 // protótipo (com passagem por valor)7 void imprimeTotal(Venda v1, Venda v2);
11 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
Exemplo utilizando passagem por valor:
1 struct Venda {2 int pecas;3 float preco;4 };56 void imprimeTotal(Venda v1, Venda v2)7 {8 Venda total = {0, 0.0};9 total.pecas = v1.pecas + v2.pecas;
10 total.preco = v1.preco + v2.preco;11 cout << "Nro peças: " << total.pecas << endl;12 cout << "Preço total: " << total.preco << endl;13 }1415 int main()16 {17 Venda v1 = {1, 20}, v2 = {3, 10};18 imprimeTotal(v1, v2);19 return 0;20 }
12 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
Alternativamente, podemos fazer passagem por referência:
1 struct Venda {2 int pecas;3 float preco;4 };56 // protótipo (com passagem por referência)7 void imprimeTotal(Venda &v1, Venda &v2);
Ou, ainda, utilizar ponteiros:
1 struct Venda {2 int pecas;3 float preco;4 };56 // protótipo (utilizando ponteiros)7 void imprimeTotal(Venda *v1, Venda *v2);
13 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
Exemplo utilizando passagem por referência:
1 struct Venda {2 int pecas;3 float preco;4 };56 void imprimeTotal(Venda &v1, Venda &v2)7 {8 Venda total = {0, 0.0};9 total.pecas = v1.pecas + v2.pecas;
10 total.preco = v1.preco + v2.preco;11 cout << "Nro peças: " << total.pecas << endl;12 cout << "Preço total: " << total.preco << endl;13 }1415 int main()16 {17 Venda v1 = {1, 20}, v2 = {3, 10};18 imprimeTotal(v1, v2);19 return 0;20 }
14 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
Exemplo utilizando ponteiros:
1 struct Venda {2 int pecas;3 float preco;4 };56 void imprimeTotal(Venda *v1, Venda *v2)7 {8 Venda total = {0, 0.0};9 total.pecas = (*v1).pecas + (*v2).pecas;
10 total.preco = (*v1).preco + (*v2).preco;11 cout << "Nro peças: " << total.pecas << endl;12 cout << "Preço total: " << total.preco << endl;13 }1415 int main()16 {17 Venda v1 = {1, 20}, v2 = {3, 10};18 imprimeTotal(&v1, &v2);19 return 0;20 }
15 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Estruturas em funções
Exemplo utilizando ponteiros (alternativa):
1 struct Venda {2 int pecas;3 float preco;4 };56 void imprimeTotal(Venda *v1, Venda *v2)7 {8 Venda total = {0, 0.0};9 total.pecas = v1->pecas + v2->pecas; v1->pecasv1->pecas ou (*v1).pecas(*v1).pecas
10 total.preco = v1->preco + v2->preco;11 cout << "Nro peças: " << total.pecas << endl;12 cout << "Preço total: " << total.preco << endl;13 }1415 int main()16 {17 Venda v1 = {1, 20}, v2 = {3, 10};18 imprimeTotal(&v1, &v2);19 return 0;20 }
v1->pecas (*v1).pecas
16 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
16 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Alocação dinâmica e structs
É possível alocar uma estrutura dinamicamente.
O processo é igual ao da criação de um int ou double usandoalocação dinâmica.
De forma análoga, o usuário deve liberar a memória alocada.
1 int main()2 {3 Aluno *a = new Aluno;4 strcpy(a->nome, "Tulio");5 strcpy(a->sobrenome, "Toffolo");6 a->idade = 21;78 cout << a->nome << " " << a->sobrenome << endl;9 cout << "Idade = " << a->idade << endl;
1011 delete a;12 return 0;13 }
17 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Alocação dinâmica e structs
Exemplo completo (incluindo a estrutura Aluno):
1 struct Aluno2 {3 char nome[50];4 char sobrenome[50];5 int idade;6 };78 int main()9 {
10 Aluno *a = new Aluno;11 strcpy(a->nome, "Tulio");12 strcpy(a->sobrenome, "Toffolo");13 a->idade = 21;1415 cout << a->nome << " " << a->sobrenome << endl;16 cout << "Idade = " << a->idade << endl;1718 delete a;19 return 0;20 }
18 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Vetores de struct
A criação/utilização de vetores de estruturas tanto estáticas quantodinâmicas também é simples, sem nenhuma diferença relevante:
1 int main ()2 {3 Aluno alunos[500];4 int n;5 cin >> n; // nro de alunos digitado pelo usuário67 for (int i = 0; i < n; i++) {8 cin >> alunos[i].nome >> alunos[i].sobrenome;9 cin >> alunos[i].idade;
10 }1112 return 0;13 }
19 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Vetores de struct
A criação/utilização de vetores de estruturas tanto estáticas quantodinâmicas também é bastante simples:
1 int main ()2 {3 int n;4 cin >> n; // nro de alunos digitado pelo usuário5 Aluno *alunos = new Aluno[n];67 for (int i = 0; i < n; i++) {8 cin >> alunos[i].nome >> alunos[i].sobrenome;9 cin >> alunos[i].idade;
10 }1112 delete[] alunos;13 return 0;14 }
20 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Vetores de struct
Mas... o que o código a seguir imprimirá?
1 int main ()2 {3 int n;4 cin >> n; // nro de alunos digitado pelo usuário56 Aluno alunosEst[500];7 Aluno *alunosDin = new Aluno[n];89 cout << "Array estático usa " << sizeof(alunosEst)
10 << " bytes!" << endl << endl;1112 cout << "Array dinâmico usa " << sizeof(alunosDin)13 << " bytes???" << endl;14 cout << "Não... Usa " << sizeof(Aluno) * n + sizeof(alunosDin)15 << " bytes!" << endl << endl;1617 return 0;18 }
21 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Vetores de struct
O código anterior imprimirá (se o usuário digitar 20):
1 Array estático usa 52000 bytes!23 Array dinâmico usa 8 bytes???4 Não... Usa 2088 bytes!
O array estático usa 500 × sizeof(Aluno) bytes
O dinâmico usa n × sizeof(Aluno) bytes + um ponteiro (8 bytes)
22 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
22 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
O que o código a seguir imprimirá?
1 #include <iostream>2 using namespace std;34 struct Aluno5 {6 char nome[50];7 char sobrenome[50];8 int idade;9 };
1011 int main()12 {13 Aluno a = { "Puca", "Penna", 20 };1415 Aluno b = a;16 strcpy(b.nome, "Tulio");17 strcpy(b.sobrenome, "Toffolo");1819 cout << a.nome << " " << a.sobrenome << " - " << a.idade << endl;20 cout << b.nome << " " << b.sobrenome << " - " << b.idade << endl;21 return 0;22 }
23 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Cópia de estruturas
O código imprimirá:
1 Puca Penna - 202 Tulio Toffolo - 20
Uma cópia dos dados da estrutura é criada ao fazer Aluno b = a;
Note que a estrutura Aluno ocupa 104 bytes
Ao fazer a cópia, os 104 bytes são copiados
Note que isto só ocorre porque a string foi alocada estaticamente.
24 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
E o código a seguir, o que imprimirá?
1 #include <iostream>2 using namespace std;34 struct Aluno5 {6 char nome[50];7 char ultnome[50];8 int idade;9 };
1011 int main()12 {13 Aluno a = { "Puca", "Penna", 20 };1415 Aluno *b = &a;16 strcpy(b->nome, "Tulio");17 strcpy(b->ultnome, "Toffolo");1819 cout << a.nome << " " << a.ultnome << " - " << a.idade << endl;20 cout << b->nome << " " << b->ultnome << " - " << b->idade << endl;21 return 0;22 }
25 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Cópia de estruturas
O código imprimirá:
1 Tulio Toffolo - 202 Tulio Toffolo - 20
Este resultado é esperado, já que b agora é um ponteiro.
Ao alocar um ponteiro, ocupamos apenas o espaço necessário paraarmazenar um endereço de memória.(4 ou 8 bytes, dependendo de a arquitetura ser de 32 ou 64 bits).
26 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
E o código a seguir, o que imprimirá?
1 #include <iostream>2 using namespace std;34 struct Aluno5 {6 char *nome;7 int idade;8 };9
10 int main()11 {12 Aluno a = { new char[50], 20 };13 strcpy(a.nome, "Puca");1415 Aluno b = a;16 strcpy(b.nome, "Tulio");17 b.idade = 25;1819 cout << a.nome << " - " << a.idade << endl;20 cout << b.nome << " - " << b.idade << endl;2122 delete[] a.nome;23 return 0;24 }
27 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Cópia de estruturas
O código imprimirá:
1 Tulio - 202 Tulio - 25
Ao copiar b em a, copiamos o endereço de memória apontado peloponteiro a.nome em b.nome; eles apontam para a mesma memória!
Copiamos o valor da variável a.idade
Importante: note o delete no exemplo anterior
Toda memória alocada dinamicamente (usando new) deve serdesalocada pelo programador (usando delete).
28 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
28 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Exercício 1
Crie uma estrutura que representa um ponto (x, y). Em seguida, crie:1 uma função que recebe dois pontos e retorna a distância entre eles;2 uma função que recebe dois pontos e retorna o ponto equidistante aos
dois mais próximo.
Exercício 2
Crie uma estrutura para representar um número complexo a+ ib(lembre-se que i =
√−1). Implemente:
1 uma função que retorna a soma dois números complexos;2 uma função que retorna o produto de dois números complexo.
Exemplo: (2 + 5i)× (1− 2i)
= 2− 4i+ 5i− 10i2(lembrando que i2 = −1)
= 2− 4i+ 5i− 10× (−1)
= 2− 4i+ 5i+ 10 = 12 + i
29 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Aula de hoje
1 Exercícios da última aula
2 Estruturas heterogêneas (breve revisão)
3 Alocação dinâmica de estruturas heterogêneas
4 Cópias de estruturas heterogêneas
5 Exercícios
6 Parâmetros da função main e próxima aula
29 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Parâmetros da função main
Até aqui, utilizamos a função main sem parâmetros:
1 int main()2 {3 ...45 return 0;6 }
Mas a função main também pode receber parâmetros:
int argc: número de argumentos
char *argv[]: valor dos argumentos
(ou char **argv)
30 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Parâmetros da função main
1 #include <iostream>2 using namespace std;34 int main(int argc, char *argv[])5 {6 for (int i = 0; i < argc; i++)7 cout << "argumento " << i << " = " << argv[i] << endl;89 return 0;
10 }
O que o código acima irá imprimir?
31 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Parâmetros da função main
O fato é que argv é um vetor de vetores de caracteres!(ou um array de arrays de caracteres)
Mas um vetor de caracteres pode ser visto como uma string...
Portanto, argv é na prática um vetor de strings :)
32 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
Próxima aula
Último item da ementa da disciplina:
Arquivos
Importante
Resolvam as listas de exercícios no site!
http://www.decom.ufop.br/toffolo/ensino/bcc201_2018-2/exercicios/
33 / 33 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 27: Estruturas heterogêneas e alocação dinâmica
/ 12
Perguntas?