estruturas.tex 5.72 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

35
	\item A primeira é colocar uma lista com um ou mais nomes de variáveis
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
36
			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

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
	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);
130

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
131 132 133 134 135 136
	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

162 163
\vspace*{\fill}

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

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

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

void main ()
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
176
{
177

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
178
	struct coord ponto;
179

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
180 181
	ponto.x = 2;
	ponto.y = 4;
182

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

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

188
	por_ref(&ponto); // chamada por referencia
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
189 190
	printf(""nDepois de chamar por ref(): x = %d, y = %d", ponto.x,ponto.y);
}
191

192
void por valor(struct coord ponto)
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
193 194 195
{
	ponto.x = ponto.y = 0;
}
196 197

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


A saída será:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
205
\begin{verbatim}
206 207 208
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
209 210 211 212
\end{verbatim}


\section{Exercício}
213 214 215

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

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

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
225 226 227 228 229 230 231
\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á
232 233
acusar erro se houver tentativa de inserção de alunos, caso o vetor esteja cheio.

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

236
\end{document}