Escolar Documentos
Profissional Documentos
Cultura Documentos
Estrutura de Dados
Professor: Paulo R. T. Cndido
CAPTULO 1
1
2
3
4
5
6
7
8
1 Tipos de dados em C
Em C existem 4 tipos bsicos de dados: int, float, char e double.
Atravs do programa abaixo, pode-se verificar o tamanho de cada um destes tipos em
Bytes, que pode variar de acordo com o Hardware e/ou com o compilador.
#include <iostream.h>
#include <conio.h>
void main(void)
{
clrscr();
cout
<< sizeof(int)
<< sizeof(float)
<< sizeof(char)
<< sizeof(double)
getch();
}
<<
<<
<<
<<
endl
endl
endl
endl;
Extenso em Bytes
2
4
1
8
Escala
-32768 a 32767
3,4E-38 a 3,4E+38
-128 a 127
1,7E-308 a 1.7E+308
14
13
12
11
10
14
13
12
11
10
14
13
12
11
10
0
+1
14
13
12
11
10
Nesta notao o Bit mais significativo indica o sinal do nmero: 0 => nmero positivo; 1
=> negativo; os demais Bits compe seu valor. Desta forma com o tipo de dados Int
podemos representar 215 nmeros inteiros positivos (0 a 32767) e 215 inteiros negativos (-1
a 32768).
A varivel a do tipo inteiro sem sinal, armazena apenas nmeros positivos entre 0 e
65535. O Bit mais significativo tambm compem o nmero, resultando em 216 =
65536 nmeros positivos (includo o zero).
As variveis b e c so inteiros longos com sinal (utiliza 32 Bits em vez de 16 Bits
do tipo Int padro). Escala entre 2147483648 a +2147483647
A varivel d do tipo inteiro long sem sinal. Escala entre 0 e +4294967295
Observao: Pode-se utilizar o qualificador SIGNED para indicar tipos inteiros com sinal,
embora seja desnecessrio por ser este o padro. Existe tambm o qualificador SHORT
indicando nmeros curtos.
Importante ressaltar que, com 24 Bits, a mantissa pode representar nmeros com no
mximo 7 dgitos significativos sem zeros esquerda e direita (223 = 8388608).
Lembre-se que o Bit mais significativo representa o sinal. No possvel portanto
representar o nmero 10000001; ele ser arredondamento para 10000000.
Note, entretanto, que possvel representar o nmero 0,00000000000000000012 sem perda
de preciso, pois o mesmo possui apenas dois dgitos significativos. Sua representao
seria: M = 12 ; E = -20 . Note que com 8 Bits, o expoente pode variar entre 128 a +127.
Os tipos Float e Double so tipos de dados que representam nmeros reais utilizando a
notao de ponto flutuante, embora de forma no idntica apresentada, porm seguindo os
mesmos conceitos. A diferena entre estes dois tipos est na preciso de cada um,
decorrente da quantidade de Bits utilizada para a mantissa e para o expoente. O tipo Double
de dupla preciso.
Lembre-se que um literal caractere deve estar entre apstrofes. Contrariamente, a expresso
A (com aspas) representa uma String (ver a seguir).
2 Ponteiros em C
Variveis do tipo ponteiro em C armazenam endereos de memria. Voc pode considerar
a memria do computador (referimo-nos aqui a memria principal RAM) como uma
seqncia de Bytes, cada um referenciado atravs de seu endereo posio absoluta. Em
um dispositivo com 1KB de memria, teremos 1024 Bytes, o primeiro Byte ter o endereo
0, o segundo 1, o terceiro 2, e assim por diante at 1023, endereo do ltimo Byte.
Utilizaremos o cdigo abaixo para exemplificarmos a utilizao de ponteiros.
void main(void)
{
clrscr();
char a='A';
cout << a << endl;
char * p;
p = &a;
*p = 'B';
getch();
// (*)
getch();
Se, por exemplo, a varivel k for alocada no endereo de memria 4094, ao ser somado 1
ao ponteiro p (*), o endereo nele armazenado passar a ser 4096. Voc pode ter estranhado
porque o endereo acrescido em 2, isto se deve ao tamanho do tipo base, no caso o tipo
INT que utiliza 2 Bytes; significando que a varivel p passa a apontar para o prximo
inteiro. Na aritmtica de ponteiros, somar um valor V a um ponteiro, implica em que seu
contedo (um endereo) seja alterado para N x TB, onde TB o tamanho em Bytes do tipo
base do ponteiro. Se o tipo base fosse FLOAT, cujo tamanho 4 Bytes, nas mesmas
condies, a atribuio (*) resultaria o endereo 4098.
3 Vetores
3.1 Vetores Unidimensionais em C
Vetor so seqncias de elementos de um mesmo tipo. Cada elemento da seqncia
manipulado fazendo referncia a sua posio no vetor (ndice).
Suponha a seguinte declarao:
int vet[5] = {10,20,30,40,50};
A varivel VET um vetor de 5 nmeros inteiros. O vetor est sendo inicializado com os
nmeros inteiros 10, 20, 30, 40 e 50.
Por exemplo, se quisermos alterar o nmero 30, que est na terceira posio do vetor, para
35, utilizamos a seguinte atribuio.
vet[2] = 35;
Com este vetor podem ser manipulados 20 nmeros inteiros; o espao total de memria
ocupado por ele de 40 Bytes.
int vet2[4][1] = 80;
O comando acima atribui o nmero 80 a quinta linha, segunda coluna; lembre-se que
vetores so indexados sempre a partir do zero, ou seja, na primeira dimenso so vlidos os
ndices de 0 a 9; na segunda de 0 a 1.
possvel inicializar o vetor acima diretamente no cdigo como segue:
int vet2[10][2] = {
1,10,
2,20,
3,30,
4,40,
5,50,
6,60,
7,70,
8,80,
9,90,
10,100
};
Endereo
Memria
2000
3000
3008 3009
50
4 Strings em C
Strings so estruturas utilizadas para armazenar textos (seqncia de caracteres). Strings em
C so implementadas atravs de vetores de caracteres. Utiliza-se um caractere especial para
indicar o trmino da String ( \0, equivalente ao nmero inteiro zero).
char str[10] = "teste";
A instruo acima declara uma string com capacidade para armazenar textos com no
mximo 9 caracteres, uma posio deve sempre ser reservada para o caractere \0. Veja o
esquema abaixo.
Endereo
Memria
str
2000
3000
3000 3001 3002 3003 3004 3005 3006 3007 3008 3009
t
e
s
t
e
\0
5 Estruturas em C
Atravs de estruturas da linguagem C possvel compor dados de tipos bsicos e manipullos como uma unidade.
struct ponto
{
float x;
float y;
float z;
int cor;
};
void main(void)
{
struct ponto p;
p.x = 1.1;
p.y = 2.2;
p.z = 3.3;
p.cor = 535;
// corpo do programa
}
Note que cada elemento do vetor uma estrutura PONTO, no cdigo acima, estamos
atribuindo o inteiro 333 ao membro COR do terceiro elemento do vetor.
Utilizando um ponteiro, estamos atribuindo valores aos membros do quarto elemento do
vetor. Lembre-se que o ndice 3 refere-se ao quarto elemento. Carregamos em pp o
endereo de memria onde se encontra o quarto elemento do vetor e ento realizamos as
atribuies, utilizando duas diferentes formas (* e ->).
Note a utilizao do operador -> (flecha), que permite mais facilmente o acesso aos
membros de uma estrutura manipulada atravs de ponteiros.
6 Unies em C
Unies so formas especiais de estruturas em que todos os membros ocupam a mesma
posio na memria.
union u1
{
char a;
int
b;
float c;
char d[5];
};
void main(void)
{
clrscr();
union u1 var1;
var1.a=65;
cout << var1.d[0];
getch();
}
Este programa gera a letra A como sada. Note que foi enviado para COUT a primeira
posio do vetor membro D da unio. Como todos os membros comeam na mesma
posio de memria (mesmo endereo), ao se atribuir 65 ao membro A, estamos ao mesmo
tempo modificando os outros membros. Especificamente estamos colocando em D[0],
tambm, o valor 65, da a sada gerada, pois 65 o cdigo ASCII do caractere A.
Apresentamos abaixo o esquema de memria para a varivel VAR1 (supondo que a mesma
seja alocada no endereo de memria 3000).
Membro
3000
3001
3002
3003
Memria
3004 3005
3006
3007
3008
3009
A
B
C
D
void main(void)
{
byte a;
tponto vet[10];
// corpo do programa
}
No cdigo acima definimos dois novos tipos de dados BYTE e TPONTO. Na funo
MAIN declaramos variveis utilizando estes novos tipos da mesma forma que fazemos com
os tipos nativos do C. A varivel A do tipo BYTE, que na realidade o tipo CHAR. Cada
um dos 10 elementos de VET do tipo TPONTO, ou seja uma STRUCT{...}.
8 Exerccios