Вы находитесь на странице: 1из 11

FATEC

Estrutura de Dados
Professor: Paulo R. T. Cndido

CAPTULO 1
1

2
3

4
5
6
7
8

Tipos de dados em C ...................................................................................................... 1


1.1
Tipo INT ................................................................................................................. 2
1.1.1
inteiros Negativos ........................................................................................... 2
1.1.2
Qualificadores de Tipos de Dados.................................................................. 3
1.2
Tipos Float e Double .............................................................................................. 3
1.3
Tipo Char................................................................................................................ 4
Ponteiros em C ............................................................................................................... 5
2.1
Aritmtica de ponteiros .......................................................................................... 6
Vetores............................................................................................................................ 6
3.1
Vetores Unidimensionais em C .............................................................................. 6
3.2
Vetores Multidimensionais em C ........................................................................... 7
3.3
Vetores so implementados com ponteiros em C................................................... 8
Strings em C ................................................................................................................... 8
Estruturas em C .............................................................................................................. 9
Unies em C ................................................................................................................. 10
Criando novos tipos em C ............................................................................................ 11
Exerccios ..................................................................................................................... 11

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;

Tipicamente os valores so os seguintes:


Tipo dado
Int
float
char
double

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

1.1 Tipo INT


Considerando a tabela acima, nmeros inteiros so representados por uma seqncia de
16 Bits. O nmero inteiro 5, por exemplo, representado como a seguir:
15

14

13

12

11

10

Computa-se o valor, multiplicando-se o valor de cada Bit (0 ou 1) por uma potncia de


dois associada posio do Bit na seqncia. Por exemplo, ao Bit mais direita
posio zero (tambm chamado de Bit menos significativo), associa-se potncia 20
(dois elevado a zero). Ao Bit mais esquerda (mais significativo), associa-se
potncia 215 . Desta forma, a seqncia acima realmente representa o nmero 5, pois:
5 = 0 x 215 + 0 x 214 + ... + 0 x 23 + 1 x 22 + 0 x 21 + 1 x 20

1.1.1 inteiros Negativos


O mtodo utilizado para representar nmeros inteiros negativos chamado notao de
complemento de dois. Obtm-se o nmero negativo a partir do seu oposto positivo,
fazendo a complementao de cada Bit - ou seja, 0 vira 1 e 1 vira 0 e em seguida
somando 1.
Por exemplo:
Inteito 5
15

14

13

12

11

10

Complementao e cada Bit (tambm chamada complemento de 1)


15

14

13

12

11

10

0
+1

Inteiro 5 (em notao complemento de 2)


15

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).

1.1.2 Qualificadores de Tipos de Dados


Pode ser alterada a representao padro de tipo Int utilizando-se qualificadores, como
abaixo:
unsigned int a;
long int b;
long c;
unsigned long d;

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.

1.2 Tipos Float e Double


Nmeros reais so representados utilizando a notao de ponto flutuante. Nesta
notao, um nmero real representado por um nmero inteiro, chamado mantissa, vezes
uma base elevada a uma potncia de inteiro, chamada expoente. Em geral a base fixa; a
mantissa e o expoente variam de modo a representar nmeros reais diferentes.
Exemplos:
Supondo Base = 10, M=mantissa e E=expoente; temos
-345,78 => M = -34578 ; E = -2
0,0002 => M = 2 ; E = -4
3040 => M = 304 ; E = 1
1 => M = 1 ; E = 0
Um tipo de dado para nmeros reais de 32 Bits, por exemplo, pode utilizar 24 Bits para a
mantissa e 8 Bits para o expoente, ambos em notao complemento de dois. O nmero 5,3
, por exemplo, seria representado conforme segue:
111111111111111111001011 11111111
Mantissa= -53
Expoente = -1

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.

1.3 Tipo Char


O tipo Char tem tamanho de 1 Byte e utilizado para representar caracteres ASCII ou
nmeros inteiros de 8 Bits com (signed) ou sem (unsigned) sinal.
O cdigo a seguir vlido.
void main(void)
{
char a='A';
char b=65;
unsigned char c = 255 // escala: 0 a 255
b=b+1;
}

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';

// atribui-se a p o endereo de memria onde a varivel a foi alocada.


// atribui-se ao byte cujo endereo esta em p o caractere 'B'.
// Indiretamente est-se modificando o valor da varivel a.
cout << a << endl;
}

getch();

Como mostrado na quarta linha, variveis de ponteiros so declaradas especificando um


tipo base, o caractere * e o nome da varivel (no caso: p)
Na quinta linha, o operador & junto a varivel a gera como resultado a posio (endereo)
na memria onde a varivel foi alocada (por exemplo, endereo 2500). Este endereo
atribudo a varivel p.
Na sexta linha, o operador * junto a varivel p especifica o Byte cujo endereo est em p; o
valor B ento atribudo a este Byte. Como o endereo armazenado em p corresponde
posio de memria ocupada pela varivel a, est-se modificando indiretamente esta
varivel. Este mecanismo de extrema importncia na passagem de argumentos para
funes.

2.1 Aritmtica de ponteiros


Exemplificaremos a aritmtica de ponteiros atravs do programa abaixo.
void main(void)
{
int k;
int * p;
p = &k;
printf("%u\n",p);
p = p + 1;
printf("%u\n",p);
}

// (*)

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;

Note que em C os vetores so indexados sempre a partir do 0 (zero). Portanto, VET[0]


referencia a primeira posio (nmero 10); VET[1] referencia a segunda posio, e assim
por diante.

3.2 Vetores Multidimensionais em C


As linguagens C e C++ permitem vetores com duas ou mais dimenses. Declaramos a
seguir a varivel vetor VET2 de duas dimenses: 10 linhas e 2 colunas.
int vet2[10][2];

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
};

Neste caso, por exemplo, em VET2[1][0] tem-se o nmero 2.

3.3 Vetores so implementados com ponteiros em C


Em C e C++, as variveis vetores so na realidade ponteiros para a regio da memria onde
os vetores so alocados. No exemplo abaixo, na regio da memria a partir do endereo
3000 so alocados 10 Bytes para o vetor (3000 a 3009); na varivel VET colocado o
endereo de memria do primeiro Byte desta regio (3000).
int vet[5] = {10,20,30,40,50};
vet

Endereo
Memria

2000
3000

Regio alocada para o vetor

3000 3001 ...


10

3008 3009
50

As seguintes instrues so equivalentes.


vet[2] = 35;
*(vet+2) = 35;

O programa a seguir imprime o vetor definido acima, utilizando a notao de ponteiro.


void main(void)
{ clrscr();
int vet[5] = {1,2,3,4,5};
int j;
for(j=0;j<5;j++)
{
cout << *(vet+j);
}
getch();
}

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

Regio alocada para a string

2000
3000

3000 3001 3002 3003 3004 3005 3006 3007 3008 3009
t
e
s
t
e
\0

Existem diversas funes na biblioteca do C para manipulao de Strings, destacamos


abaixo algumas:
strcpy(str1,ABC); - copia o literal string ABC para a varivel string str1
strcat(str1,str2); - anexa a string str2 ao final da string str1
strcmp(str1,str2); - compara duas strings, retorna o inteiro 0 (zero) se elas
forem iguais. Se str1 > str2 retorna um inteiro positivo, seno
retorna um inteiro negativo.
Strlen(str1);
- retorna o tamanho da string

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
}

No cdigo acima, definimos a estrutura PONTO (coordenadas no espao de um ponto em


um sistema grfico) e declaramos a varivel P como sendo do tipo desta estrutura. Os
membros da estrutura (x, y, z, cor) so acessados utilizando o operador ., tambm
chamado de operador de seleo. Criamos, portanto, um novo tipo composto de dados.
Podemos tambm definir vetores de estrutura e ponteiro para estruturas.
struct ponto vet[10];
struct ponto * pp;
vet[2].cor=333;
pp = &vet[3];
*pp.cor = 444;
pp->x = 2.5;

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

7 Criando novos tipos em C


possvel definir tipos novos utilizando o TYPEDEF, conforme exemplo abaixo.
typedef char byte
typedef struct
{
float x;
float y;
float z;
int cor;
} tponto;

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