Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ......

41
Aula 27: Estruturas heterogOEneas e alocaªo dinmica Introduªo a Programaªo Toelio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computaªo UFOP

Transcript of Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ......

Page 1: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 2: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 3: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 4: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 5: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 6: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 7: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 8: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 9: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 10: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 11: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 12: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 13: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 14: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 15: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 16: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 17: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 18: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 19: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 20: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 21: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 22: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 23: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 24: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 25: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 26: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 27: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 28: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 29: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 30: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 31: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 32: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 33: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 34: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 35: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 36: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 37: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 38: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 39: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 40: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

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

Page 41: Aula 27: Estruturas heterogêneas e alocação dinâmica ... · Crie uma estrutura (struct) ... Estruturas em funções ... O nome de uma estrutura em C++ não é um endereço, portanto

/ 12

Perguntas?