Programar em C/Estruturas: diferenças entre revisões

[revisão pendente][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição
Linha 1:
{{reciclagem}}
 
== StructuresEstruturas ==
 
As stucturesestruturas (structs) permitem com que possamos ter variáveis de vários tipos aglomerados sob o mesmo nome. E esse mesmo nome vai passar a ser um novo tipo de dados tal como o int ou float.
 
Mas o uso disto é que podemos ter valores que tenham alguma relação lógica, por exemplo guardar um int de idade e um string de nome. Isto pode ser atributos de uma pessoa. Ou seja podemos empacotar várias variáveis de vários tipos com o objetivo de representar o mundo real e dar um nome a essas variáveis todas.
 
Ao fazer isto criámoscriamos um tipo de dados da mesma forma como fazemos em relação ao int ou ao float.
 
== Declarar uma estrutura ==
A sintaxe é:
 
<pre>
 
<source lang=c>
struct <identificador> {
<tipo> campo_um ;
<tipo> campo_dois ;
};
</presource>
 
Aqui o tipo struct indica que vamos criar uma estrutura.
Linha 27 ⟶ 29:
'''Primeiro método:'''
 
<source lang=c>
<pre>
struct minha_estrutura
{
Linha 34 ⟶ 36:
char fruta[40];
} ;
</presource>
 
Aqui o identificador do tipo "struct" é "minha_estrutura" dentro dessa estrutura temos três campos o ultimo é "fruta"
Linha 42 ⟶ 44:
 
Para ter acesso aos membros definidos dentro da estrutura utilizamos um operador de seleçao de membro "."(um ponto).
 
<pre>
<source lang=c>
nova_estrutura.fruta[0];
</presource>
 
Nos dá o primeiro caracter da palavra contida dentro do membro "fruta".
 
Para inicializar um campo da estrutura o processo é o mesmo que usamos com as variáveis.
 
<pre>
<source lang=c>
nova_estrutura.campo_dois = 100;
</presource>
 
== Matrizes de estruturas ==
Linha 65 ⟶ 69:
Podemos declarar os objetos de duas formas:
* Ao mesmo tempo que declaramos a estrutura
 
<pre>
<source lang=c>
struct product {
int weight;
float price;
} apple, banana, melon;
</presource>
* Ou como uma variável normal
 
<pre>
<source lang=c>
struct product
{
Linha 81 ⟶ 87:
struct product apple, banana, melon;
}
</presource>
E até podemos declarar um array delas
 
<pre>
<source lang=c>
Person p[20];
</presource>
 
'''Pergunta''': como é que é feito exatamente os objetos?
Linha 94 ⟶ 101:
 
Se tivermos apenas um objeto (ou variável da estrutura) não é necessário darmos o nome da estrutura
 
<pre>
<source lang=c>
struct {
char item[40]; // name of item
Linha 102 ⟶ 110:
int lead_time; // number of days before resupply
} temp;
</presource>
 
== Acessar as variáveis membro das estruturas ==
Agora queremos dar valores a cada uma das pessoas, queremos dar o nome e a altura, para isso faríamos;
 
<pre>
<source lang=c>
strcpy(p1.name, "Tiago");
p1.altura =1.9;
</presource>
 
A forma genérica é:
 
<pre>
<source lang=c>
structure-varname.member-name
</presource>
 
ou seja
Linha 122 ⟶ 132:
 
Exemplo
 
<pre>
<source lang=c>
#include <stdio.h>
const int MAX = 3;
Linha 149 ⟶ 160:
return 0;
}
</presource>
 
== Iniciar uma estrutura ==
 
Podemos iniciar uma estrutura usando uma '''lista de iniciação''', que seria algo como:
 
<pre>
<source lang=c>
Person p1 = {"Jeff Kent", 72};
</presource>
isto basicamente é igual a arrays, apenas com a diferença de termos tipos diferentes. Logo a ordem vai interessar, por exemplo se escrevêssemos
<source lang=c>
<pre>
Person p1 = {72, "Jeff Kent"}; //não iria funcionar- erro de compilação
</presource>
 
== Ponteiros para estruturas ==
 
<source lang=c>
<pre>
struct movies_t
{
Linha 173 ⟶ 185:
movies_t amovie;
movies_t * pmovie;
</presource>
 
Nós criámos algo
<source lang=c>
<pre>
movies_t title year
amovie
* pmovie
</presource>
 
Vejamos que temos um ponteiro como instância.
<source lang=c>
<pre>
// pointers to structures
#include <stdio.h>
Linha 209 ⟶ 221:
return 0;
}
</presource>
Como já devem ter deduzido o operador -> será muito similar a
pmovie->title é equivalente a (*pmovie).title
Linha 219 ⟶ 231:
A estrutura é passada como ponteiro.
 
<source lang=c>
<pre>
#include <stdio.h>
#include <string.h>
Linha 255 ⟶ 267:
printf("Person's name is %s and height is %d.", pers.name, pers.height);
}
</presource>
 
== Estruturas aninhadas ==
 
A ideia é ter uma estrutura dentro de outra estrutura.
<source lang=c>
<pre>
#include <stdio.h>
Linha 305 ⟶ 317:
printf("Person's birthday in dd/mm/yyyy format is: %d/%d/%d\n", pers.bDay.day, pers.bDay.month, pers.bDay.year );
}
</presource>
 
Reparem que a estrutura Date tem de ser declarada antes da estrutura Person, pois caso contrário o compilador não entenderia o tipo declarado na estrutura Person.