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


\begin{document}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
5 6
\chapter{estruturas}

7
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
8
sua manipulação. As variáveis de uma estrutura, ao contrário das variáveis de uma matriz, podem ser de
9 10
diferentes tipos de dados. Uma estrutura pode conter quaisquer tipos de dados válidos em C, inclusive
matrizes e até mesmo outras estruturas.
11

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


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

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
24 25
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
26 27
do tipo da estrutura, também pode ser incluída na definição.

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
30
existem basicamente duas maneiras de definir e declarar estruturas em C:
31

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
34 35
	\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:
36

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

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
47
	\item A segunda maneira é declarar variáveis da estrutura em algum outro ponto do código-fonte. Por
48

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
49 50 51 52 53 54
exemplo:
\begin{lstlisting}
struct coord { /* definicao de uma estrutura */
	int x;
	int y;
};
55 56 57 58 59

/* instrucoes adicionais aqui... */

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

63

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
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, 
utiliza-se o operador de membro de estrutura '.' entre o nome da estrutura e o nome do membro.
69

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
70
exemplo:
71

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

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

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

segunda = primeira;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
87

88 89
é equivalente a:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
90
\begin{lstlisting}
91 92
segunda.x = primeira.x;
segunda.y = primeira.y;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
93
\end{lstlisting}
94

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
95
exemplo:
96

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
97
Recebe informações sobre as coordenadas dos cantos de um retângulo e calcula a sua área. Presume
98 99 100 101
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
102 103
\begin{lstlisting}
#include <stdio.h>
104

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
105 106 107 108
struct coord{
	int x;
	int y;
};
109

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
110 111 112 113
struct retang{
	struct coord esqcima;
	struct coord dirbaixo;
};
114 115

void main ()
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
{
	int altura, largura;
	long area;
	struct retang quadro;

	/* recebe as coordenadas */
	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);

	/* calcula o comprimento e a largura */
	largura = quadro.dirbaixo.x - quadro.esqcima.x;
	altura = quadro.esqcima.y - quadro.dirbaixo.y;

	/* calcula e informa a area */
	area = largura * altura;
	printf("O retangulo tem uma area de %ld unidades.\n", area);
}
\end{lstlisting}
143 144 145

A saída será:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
146
\begin{verbatim}
147 148 149 150
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
151 152
O retângulo tem uma área de 81 unidades.
\end{verbatim}
153

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
157
exemplo:
158

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
159
\begin{lstlisting}
160 161
/* Passando argumentos por valor e por referencia */

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
162 163 164 165
struct coord{
	int x;
	int y;
};
166 167 168 169 170

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

void main ()
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
171
{
172

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
173
	struct coord ponto;
174

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
175 176
	ponto.x = 2;
	ponto.y = 4;
177

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

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

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

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


A saída será:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
200
\begin{verbatim}
201 202 203
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
204 205 206 207
\end{verbatim}


\section{Exercício}
208 209 210

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

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

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
220 221 222 223 224 225 226
\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á
227 228
acusar erro se houver tentativa de inserção de alunos, caso o vetor esteja cheio.

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

\end{document}