estruturas.tex 5.71 KB
Newer Older
1 2 3 4
\documentclass[apostila.tex]{subfiles}


\begin{document}
5

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
6 7
\chapter{estruturas}

8
Uma estrutura é uma coleção de uma ou mais variáveis agrupadas sob um único nome para facilitar a
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
9
sua manipulação. As variáveis de uma estrutura, ao contrário das variáveis de uma matriz, podem ser de
10 11
diferentes tipos de dados. Uma estrutura pode conter quaisquer tipos de dados válidos em C, inclusive
matrizes e até mesmo outras estruturas.
12

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
13
\section{A palavra-chave struct}
14 15


Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
16 17 18 19 20 21 22
\begin{lstlisting}
struct rotulo {
	tipo campo1;
	...
	tipo campoN;
} [instância];
\end{lstlisting}
23 24

A palavra-chave struct é usada para declarar estruturas em C. Ela identifica o início de uma definição
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
25 26
de estrutura e é sempre seguida por um rótulo, que é o nome atribuído à estrutura. A seguir vêm os
membros da estrutura, delimitados entre chaves. Uma instância, que é uma declaração de uma variável
27 28
do tipo da estrutura, também pode ser incluída na definição.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
29
\section{Definindo e declarando}
30

Ivo Júnior's avatar
Ivo Júnior committed
31
Existem basicamente duas maneiras de definir e declarar estruturas em C:
32

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
33
\begin{itemize}
34

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
35 36
	\item A primeira é colocar uma lista com um ou mais nomes de variáveis 
			imediatamente após a definição da estrutura, conforme o exemplo a seguir:
37

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
38
\begin{lstlisting}
39
struct coord { // definicao de uma estrutura
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
40 41
	int x;
	int y;
42
} primeira, segunda; // declaracao de variaveis
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
43
\end{lstlisting}
44

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
45
estas instruções definem o tipo de estrutura coord e declaram duas estruturas (variáveis) deste
46 47
tipo, chamadas primeira e segunda.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
48 49 50
	\item A segunda maneira é declarar variáveis da estrutura em algum outro ponto do código-fonte. Por
exemplo:
\begin{lstlisting}
51
struct coord { // definicao de uma estrutura
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
52 53 54
	int x;
	int y;
};
55

56
// instrucoes adicionais aqui... 
57

58
// declaração de variaveis
59
struct coord primeira, segunda;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
60
\end{lstlisting}
61

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
62 63
\end{itemize}

64

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
65
\subsection{Acessando os membros de uma estrutura}
66

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
67 68
Os membros individuais de uma estrutura podem ser usados como qualquer outra variável 
respeitando-se as características do seu tipo. Para acessar os membros de uma estrutura, 
69
utiliza-se o operador de membro de estrutura `.' entre o nome da estrutura e o nome do membro.
70

71
Exemplo:
72

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
73 74 75 76 77
\begin{lstlisting}
struct coord {
	int x;
	int y;
} primeira, segunda;
78 79 80

primeira.x = 50;
primeira.y = -30;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
81
\end{lstlisting}
82

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
83
Uma das vantagens de se utilizar estruturas ao invés de variáveis individuais é a capacidade de copiar
84
informações entre estruturas do mesmo tipo através de uma única instrução de atribuição. Continuando
85 86
com o exemplo anterior, a instrução:

87
\begin{lstlisting}
88
segunda = primeira;
89
\end{lstlisting}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
90

91 92
é equivalente a:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
93
\begin{lstlisting}
94 95
segunda.x = primeira.x;
segunda.y = primeira.y;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
96
\end{lstlisting}
97

98
Exemplo:
99

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
100
Recebe informações sobre as coordenadas dos cantos de um retângulo e calcula a sua área. Presume
101 102 103 104
que a coordenada y no canto superior esquerdo é maior que a coordenada y no canto inferior direito, que
a coordenada x do canto inferior direito é maior do que a coordenada x do canto superior esquerdo, e que
todas as coordenadas são positivas.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
105 106
\begin{lstlisting}
#include <stdio.h>
107

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
108 109 110 111
struct coord{
	int x;
	int y;
};
112

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
113 114 115 116
struct retang{
	struct coord esqcima;
	struct coord dirbaixo;
};
117 118

void main ()
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
119 120 121 122 123
{
	int altura, largura;
	long area;
	struct retang quadro;

124
	// recebe as coordenadas
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
125 126 127 128 129 130 131 132 133 134 135 136
	printf("Digite a coordenada x superior esq.:\n");
	scanf("%d", &quadro.esqcima.x);

	printf("Digite a coordenada y superior esq.:\n");
	scanf("%d", &quadro.esqcima.y);
	
	printf("Digite a coordenada x inferior dir.:\n");
	scanf("%d", &quadro.dirbaixo.x);

	printf("Digite a coordenada y inferior dir.:\n");
	scanf("%d", &quadro.dirbaixo.y);

137
	// calcula o comprimento e a largura
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
138 139 140
	largura = quadro.dirbaixo.x - quadro.esqcima.x;
	altura = quadro.esqcima.y - quadro.dirbaixo.y;

141
	// calcula e informa a area
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
142 143 144 145
	area = largura * altura;
	printf("O retangulo tem uma area de %ld unidades.\n", area);
}
\end{lstlisting}
146 147 148

A saída será:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
149
\begin{verbatim}
150 151 152 153
Digite a coordenada x superior esq.: 1
Digite a coordenada y superior esq.: 1
Digite a coordenada x inferior dir.: 10
Digite a coordenada y inferior dir.: 10
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
154 155
O retângulo tem uma área de 81 unidades.
\end{verbatim}
156

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
157
OBS.: Quando estruturas são passadas por referência, utilizamos o operador `\verb|->|' ao invés do operador
158
`.'.
159

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
160
exemplo:
161

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
162
\begin{lstlisting}
Ivo Júnior's avatar
Ivo Júnior committed
163
// Passando argumentos por valor e por referência
164

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
165 166 167 168
struct coord{
	int x;
	int y;
};
169 170 171 172 173

void por valor( struct coord );
void por ref( struct coord * );

void main ()
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
174
{
175

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
176
	struct coord ponto;
177

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
178 179
	ponto.x = 2;
	ponto.y = 4;
180

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
181
	printf("Antes de chamar por valor(): x = %d, y = %d\n", ponto.x,ponto.y);
182

183
	por_valor(ponto); // chamada por valor
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
184
	printf(""nDepois de chamar por valor(): x = %d, y = %d", ponto.x,ponto.y);
185

186
	por_ref(&ponto); // chamada por referencia
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
187 188 189
	printf(""nDepois de chamar por ref(): x = %d, y = %d", ponto.x,ponto.y);
}
	
190
void por valor(struct coord ponto)
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
191 192 193
{
	ponto.x = ponto.y = 0;
}
194 195

void por ref(struct coord *ponto)
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
196 197 198 199
{
	ponto->x = ponto->y = 0;
}
\end{lstlisting}
200 201 202


A saída será:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
203
\begin{verbatim}
204 205 206
Antes de chamar por valor(): x = 2, y = 4
Depois de chamar por valor(): x = 2, y = 4
Depois de chamar por ref(): x = 0, y = 0
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
207 208 209 210
\end{verbatim}


\section{Exercício}
211 212 213

Crie um pequeno banco de dados que armazenará os seguintes dados de um aluno:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
214 215 216 217 218 219
\begin{itemize}
	\item código de matrícula
	\item nome
	\item telefone
	\item endereço
\end{itemize}
220 221 222

O programa deverá ter um menu com as seguintes opções:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
223 224 225 226 227 228 229
\begin{itemize}
	\item inserir aluno
	\item imprimir alunos
	\item ordenar alunos
\end{itemize}

Cada aluno inserido será armazenado em um vetor de tamanho \verb|TAM_MAX| e o programa deverá
230 231
acusar erro se houver tentativa de inserção de alunos, caso o vetor esteja cheio.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
232
No caso da função de ordenação, esta deverá ser realizada pela ordem alfabética do nome.
233

Ivo Júnior's avatar
Ivo Júnior committed
234
\end{document}