Você está na página 1de 10

Reviso estrutura de dados

Capitulo 1 :tipo definidos pelo usurio: Introduo: Tipos primitivos: char, int, float, double. Variantes: unsigned char, long long int, etc. A escolha de um desses tipos ira depender do tipo de informao que desejamos representar exemplo: salario seria float ou double, numero de habitantes usaria unsigned int. Quando manipularmos um conjunto maior de informaes de um mesmo tipo, fazemos o uso de matrizes, pois ela nos fornecem um mecanismo mais fcil de manipulao.

Estrutura: Limitao das matrizes: todos os elementos dentro dela devem ser do mesmo tipo Struct: permite juntar elementos de tipos diferentes Estrutura: um tipo de dados estruturados que agrupam um conjunto fixo de variveis, possivelmente de tipos diferentes, de modo que possam ser manipulados como um nico objeto, usando um nome ou identificador em comum , uma forma de organizar um conjunto de dados logicamente relacionados Elementos, campos ou varivel-membro da estrutura: so os componentes dentro da estrutura, quando voc define uma estrutura , esta definindo um tipo complexo de varivel e no uma varivel usando uma estrutura como sendo seu tipo. Forma geral de uma estrutura: Struct<identificador>{ <tipo><varivel_membro>; <tipo><varivel_membro>; Identificador: identifica a estrutura (etiqueta de estrutura), Lista de variveis: o conjunto das variveis a serem criadas juntamente com declarao da estrutura. Para acessar um elemento de uma estrutura : <varivel_estrutura>.<varivel_membro> Varivel estrutura: a varivel que inicia a estrutura Varivel menbro: varivel que esta nno struct ponto inicial

Matrizes e estruturas dentro de estruturas: Matriz 10x10 para referir M 5,2 Struct{ p.m[5][2]; Int m [10][10]; ... }p;

Estrutura aninhada: quando um elemento de uma estrutura um elemento de outra estrutura.

Reviso tipos de variveis: Char: varivel char = abc Printf(%c/n, varivel char) Scanf(%c, &varivel char) INT: varivel int = 10 Printf(i/n, varivel int) Scanf(%i, &varivel int) : varivel bool= true Printf(%i/n, varivel bool) float: varivel float = 10.2 Printf(f/n, varivel float) Scanf(%f, &varivel float) double: varivel double = 10.2 Printf(f/n, varivel double) Scanf(%lf, &varivel double)

Restries sobre estruturas aninhada: no pode incluir uma varivel de eestrutura dentro da sua prpria estrutura Matriz de estrutura struct ficha_empregado trabalhadores [100], Printf(cep:%d),trabalhadores*3+.endco.cep); Enumerao uma conjunto de contates inteiras que especificas todos os possveis valores aceitos por uma varivel inteira. Aumentar a legibilidade do cdigo fonte, fornecendo identificadores mnmicos (fceis de lembrar, e guardar com por exemplo duas dias da semana. Enum dias_semana { seg, ter,qua,qui,sex,sab,dom} Constantes do tipo inteira iniciando por 0 (zero). Folga=domingo ou folga=6 Printf(%d,dom)=6 Enum <identificador> { <lista_de_enumerao>} <listadevariaveis> Etiqueta de enumerao : O identificador dias_semana seu uso nos permitir a declarao de novas variveis do tipo enum dias_semanas longe da declarao do tipo enum. Mudana a sequencia dos valores atribudos as constantes Comea sempre atribuindo zero no inicio Enum {jan=1,fev=2,mar=3,abri=4,mai=5,jun=6,jul=7,ag=8,set=9,out=10,nov=11,dez=12} Ou Enum {jan=1,fev,mar,abri,mai,jun,jul,ago,set,out,nov=,dez} Typedef: Typedef ajudar na escrita e na documentao, no cria novas classes de dados. Como de construo de tempo de compilao a forma geral Typedef <tipo> <novo_nome>; Muda o nome criando um apelido para a varivel. Ponteiro:

Ponteiros uma varivel que contem um endereo de memoria que simboliza a posio de/ou aponta para outra varivel de memoria Forma geral declarao ponteiro tipo *nome; Existem dois tipos de operadores especiais de ponteiros em c: * e & o & uma operador unrio que devolve o endereo de memoria so seu operando Operadores e ponteiros: *pi -> devolve o valor locado na memoria Pi-> endereo de memoria Ponteiro Null No aponta para lugar nenhum Comparao entre dois ponteiros nulos distintos sempre retorna verdadeiro Operao com ponteiros: Aritmtica com ponteiros Somente pode ser usado adio e subtrao ou incremento e decremento. Por exemplo local de memoria 1000 + 1 ento ficara 1004 Tamanho em bytes Char->1byte Int-> 4 bytes Short-> 2 bytes Float-> 4 bytes Double-> 8 bytes Ponteiros e matrizes: Acesso indexado de matriz Ex:m [4] Acesso via aritmtica de ponteiros Ex: *(pf+4) A diferena entre eles a velocidade de execuo que mais rpida no segundo caso. Ponteiros e strings: Vetores de caracteres terminados com caracter nul (\o ou caracter hexadecimal ) Matrizes de ponteiros um operador de seleo para acessar os elementos da estrutura. Ponteiros para estrutura: Struct ponto * ps Ponto A={10,20}; Os=&pontoA//poe o endereo da estrutura ponto em os Ponto A.x // acesso ao elemento usando o operador ponto ps-> x // acessa ao elemento usando o operador seta

ponteiros e funes:
Se for necessrio passar uma matriz de ponteiros para uma funo, aplicamos o mesmo mtodo utilizado para passar o endereo da matriz m para o ponteiro px chamamos a funo, usando o nome da matriz como argumento sem qualquer ndice. Por exemplo
void diplay_array(int *q[], int n) { int t; for (t=0; t<n; t++){ putchar(*q[t]); } } ... int a=3, b=5, c=7, d=9, e=11; int *p[5] = {&a, &b, &c, &d, &e}; ... diplay_array(p, 5);

Retorno de ponteiros em funes


Embora, as funes que devolvem ponteiros sejam manipuladas da mesma forma que qualquer outro tipo de funo, alguns conceitos importantes precisam ser definidos. O fato da aritmtica com ponteiros ser feita relativa ao tipo de dado base, uma vez que para cada tipo pode haver um comprimento diferente, o compilador precisa saber para qual tipo de dado o ponteiro est apontando. Por esta razo, uma funo que retornar um ponteiro deve declarar explicitamente para qual tipo de ponteiro est retornando.
#include <stdio.h> // Prototipo da funcao match() char *match(char c, char *str); int main() { char s[80], *p, ch; printf("Informe uma string: "); gets(s); printf("Informe o caracter de busca: "); ch = getchar(); p = match(ch, s); if (*p) { printf("%c foi encontrado!\n", *p); }else{ printf("O caracter %c nao foi encontrado!\n", ch); } return 0; } // Funo que retorna o ponteiro para a primeira ocorrncia // do caracter c na string str. Se nenhuma ocorrncia for encontrada, // a funo retorna um ponteiro para o terminador NUL. char *match(char c, char *str) { while (c!=*str && *str) str++; return (str);

Problemas comuns com ponteiros


Ponteiros no inicializados Um problema muito comum quando se trabalha com ponteiros esquecer de inicializlos. . Um erro desses difcil de se localizar, porque o ponteiro no inicializado no o problema em si. O problema que nesse caso, toda vez que realizamos uma operao usando um ponteiro no inicializado, estaremos lendo/escrevendo em uma rea desconhecida de memria. Ao lermos os dados apontados por um ponteiro no inicializado, o pior que pode acontecer estarmos lendo algum lixo da memria. Contudo, se estivermos escrevendo na memria, usando esse ponteiro, corremos o risco de estarmos causando erros inexplicveis no programa, cuja evidncia pode no sugerir que o ponteiro no inicializado seja o problema, fazendo-nos perde horas de trabalho at encontramos o verdadeiro problema.
int x, *pi; x = 10; *pi = x;

Uma forma de minimizarmos esse tipo problema atribuindo um endereo vlido, ou o ponteiro NULL, aos ponteiros em sua declarao ou, ento, nos certificarmos que o ponteiro aponta para um endereo conhecido antes de o usarmos.
int x, *pi=NULL; x = 10; pi = &y; *pi = x;

Atribuio de ponteiros de tipos diferentes O C permite a atribuio de qualquer endereo a uma varivel do tipo ponteiro. Desse modo, o seguinte fragmento um cdigo valido em C que no emite nenhuma mensagem de erro (dependendo do compilador, emite no mximo um aviso de advertncia!), mas que no ir produzir o resultado desejado.
float x=1.23, y; int *pi; pi = &x; // pi recebe o endereo de x y = *pi; // y recebe o valor apontado por pi que um ponteiro de inteiro!!! printf("%f", y); // No ir imprimir o valor 1.23!!

Ateno aos limites muito comum na programao, usarmos ponteiros para fazer uma varredura nos elementos em um vetor. Nesses casos, porm, preciso ficar bem atento aos limites para que o ponteiro no os extrapole.
int *p, m[10], i; // Zerando os elementos do vetor m p = m; for(i=0; i<=10; i++, p++) { *p = 0; }

Observe que h um pequeno erro na condio de teste do loop, que deveria ser i<10, faz com que o loop d mais uma volta. Nessa ltima volta, a varivel i recebe o valor 0, estendendo o loop para mais 11 voltas, extrapolando o vetor em mais 12 elementos alm dos seus 10. Um outro exemplo dado no cdigo abaixo, veja se voc capaz de encontr-lo
Cap. 2 - Estrutura de dados - Ponteiros 20
char *p1, s[80]; printf("Digite a palavra \"fim\" para terminar\n"); p1 = s; do { gets(s); // Imprime o equivalente decimal de cada caracter da string s while (*p1) { printf(" %d", *p1); p1++; } printf("\n\n"); } while (strcmp(s, "fim"));

O problema desse programa que, na primeira iterao, a varivel p1 aponta para o primeiro caracter de s. Porm, na segunda iterao, ele continua de onde foi deixado, j que ele no reinicializado para o comeo de s. A maneira correta de se escrever esse programa :
char *p1, s[80]; printf("Digite a palavra \"fim\" para terminar\n"); do { p1 = s; // <- CORRETO! gets(s); // Imprime o equivalente decimal de cada caracter da string s while (*p1) { printf(" %d", *p1); p1++; } printf("\n\n"); } while (strcmp(s, "fim"));

A cada vez que o loop se repete, p1 ajustado para o incio da string s. De modo geral, deve-se lembrar de reinicializar todo e qualquer ponteiro, se ele for reutilizado.

Operaes com arquivos Stream e arquivos: Stream sistema de e/s do C prove abstrao entre o programador eo dispositivo utilizado arquivo o dispositivo real

Tipos de stream: Stream texto: sequencia de caracteres, organizadas em linhas, encerrada por um caracter /n Stream binrio: sequencia de bytes, no sofrem nenhuma converso. Abertura de arquivos Fopen( ) Controle de arquivo tipo file definida em <stdio.h> Ponteiros de arquivos -> um ponteiro para estrutura de tipo file # include <stdio.h> ... File *fp, // declarao de um ponteiro do tipo file Funo fopen-> abrir arquivos. File * Fopen ( char * nomedoarquivo, char *modo) Onde nome do arquivo um ponteiro para uma string #incluide<stdio.h> File *Pp; Fp=Fopen (arq-teste.txt,r) Cuidado ao abrir arquivos Armazenar em uma varivel tipo *file para que o arquivo no se perca. Fechamento de arquivos Fclose( ) Int* Fclose (File*Fp) FP-> um ponteiro de arquivos previamente abertos. Gravao e leitura de arquivos: Gravao e leitura de caracteres :fputc() // fgetc() Int fgetc(File * Fp) A funo fgetc devolve uma marca EOF quando o programa alcana o fim do arquivo Fputc( ) -> int fputc int ch, File *Fp) Ela devolve o caracter escrito Gravao/ leitura de dados formados : fread e fwrite buf um ponteiro para uma regio de memoria que recebera os dados do arquivos( fread) Fputc( )-> devolve o caracter escrito Fgetc( ) -> devolve uma marca EOF (end-of-line) Quando o programa alcanar o fim do arquivo Fgets e fputs-> efetuam operaes de leitura e gravao de strings de caracter de e para um arquivo diferena entre fgets e fgetc e que ao incves de ler so um caracter ela ler uma strin Fread para ler tipos de dados maiores que um vyte Fwrite para escrever tipo de dados maiores que um byte Buf um po nteiro para a regio de memoria que recebera os dados do arquivo fread

Fread retorna o numero de itens realmente lidos Fwrite devolve o numero de itens escritos Fseek modifica o indicador de posio de arquivos fazendo o apontar para outro ele mento gravado dentro do arquivo Rewind reposiciona o indicador de posio de arquico do inicio do arquivo Feof devolve verdadeiro( valor int diferente de zero) se o fim do arquivo for atingido ou devolve zero Funo remove() apaga o arquivo especificado devolve zero se for bem sucedida Alocao de memmoria Se um int x=9 sizeof() =4 E a posio de memoria for 1203 Ento o compilador guardarar ate o 1206 Se for uma matriz tipo int a [10] ento seria 10x4 que seria 40 bytes ento guardaria de 1203 ate 1243 Alocao esttica de memoria Vez que a varivel no modificar o seu ripo e nem o seu tamanho, essa reserva espao ocupado pela varivel permanece fixa (esttica do inicio ate o final da execuo do programa. Alocao dinmica de memoria Permite a criao de programas mais eficientes com um menor consumo de memoria e o meio pelo qual um programa pode obter memoria enquanto esta em execuo . Funo de alocao dinmica de memoria Conjunto de funes de alocao e liberao de memoria Funao malloc() <stdlib.h> Malloc() aloca (reserva) na memoria um numero de bytes definido pelo usurio , retornando o endereo do primeiro elemento desse espao alocado. Void* malloc (int size) Onde size a quantidade de bytes a serem alocados na memoria Se no tiver espao para memoria retornara o valor null Funo *realloc() aloca na memoria uma quantidade de byte definido pelo programador para realocao, retornando o primeiro endereo desse espao alocado. os elementos atuais so realocador so copiados para um novo endereo ou novo espao de memoria Liberao de memoria alocada dinamicamente: Free()a oposta da funo malloc ela devolve a memoria alocada a rea livre para que possa ser reutilizada novamente. Alocao dinmica de matriz Indexao matrizes criar uma matriz dinamicamente alocada Vantagens e desvantagens alocao de memoria dinmica tempo de acesso lento Estrutura de dados

Modo particular de armazenamento e organizao de dados em um computador.

Tipos homogneas : quando os dados so compostos pelo mesmo tipo como exemplo inteiros Heterognea quando os elementos as estrutura so formados por tipos diferentes exemplo registro. Estrutura esttica : alocao de tamanho fixo ex: vetores Estrutura dinmica: alm do dado, possuem tambm um ou mais ponteiros , para outros elementos Fila: faz uma analogia natural com o conceito de fila que nos conhecemos, quem primeiro entra na fila o peimeiro a seratendido (FIFO fist-in- fist out) a ideia fundamental e que so podemos inserir ele elementos no final da fila e retira-los por ordem de chegada ex: fila de impresso Funes bsicas: Enqueue() insere um elemento no final da lista overflow se inserir em fila cheia Dequeue() retira o primeiro elemento da lista underflow se retirar elementos de fila vazia. Fila esttica homognea uma estrutura definida por um vetor de tamanho n (esttica), contendo dados primitivos (homognea) e uma variavem niteira tasst que armazena o ultimo elemento da fila Quando last =-1 a fila esta vazia Quando last=n-1 a fila esta cheia Fila (n=10)

funes de apoio. So elas: void initq(Fila *f) - Inicializa as variveis de controle da fila. bool empty(Fila *f) - Informa se a fila est vazia (1=vazia, 0=caso contrrio). bool full(Fila *f) - Informa se a fila est cheia (1=cheia, 0=caso contrrio). void printq(Fila *f) - Mostra na tela os elementos armazenados em uma fila sem retir-los da estrutura. Fila circular esttica homognea Fila esttica homognea > possui uma grnade desvantagem a necessidade de movimentar todos os elementos da fila uma posio a frente cada vez que retiramos um elemento. Uma varivel first que ira armazenar o ndice do primeiro elemento da fila circular o indicie do primeiro elemento da fila circular ( o primeiro indicie da fila deixa de ser o elemento de ndice zero do vetor). O last continua apontando para o ultimo elemento da fila.

Uma funo int incr(int ndx) que calcula o valor do ndice subsequente a ndx, dado pela seguinte expresso prex=(ndx+1)%n Essa expresso faz com que os indicies se mantenham dentro dos limites do vetor ([0,n-1]) assim quando um ndice extrapolar o limite, ele retorna a zero (circular). A fila considerada vazia quando last=first. A fila considera cheia quando lincr(last)=first Inicialmente as variveis de controle da fila circular comeam com fist=0 e last=0

Ao extrapolar o limite do vetor , o valor da varivel lasr volta a ser zero Fila dinmica homognea Uma estrutura de dados tipo FIFO alocada dinamicamente a medida que novos elementos vao sendo armazenados na estrutura

Pilhas A diferena entre pilhas e filas> ordem de sada dos elementos fila FIFO Pilha o ultimo elemento que entra o primeiro que sai LIFO (last in first out) Funes bsicas push( element) que adiciona um elemento no topo da pilha Pop() que remove o elemento do topo da pilha pop desempilhar. Pilha esttica homognea: Construida usando um vetor tamanho N (esttica) com dados primitivos e um varivel inteira top que armazena o ndice do ultimo elemento inserindo na pilha

funes de apoio. So elas: void initp(Pilha *f) - Inicializa as variveis de controle da pilha. bool empty(Pilha *f) - Informa se a pilha est vazia (1=vazia, 0=caso contrrio). bool full(Pilha *f) - Informa se a pilha est cheia (1=cheia, 0=caso contrrio). void printp(Pilha *f) - Mostra na tela os elementos armazenados em uma pilha sem retir-los da estrutura. Pilha dinmica homognea Uma pilha dinmica uma estrutura de dados do tipo LIFO (Last in, First Out), cujos espaos de memria para armazenamento so alocados dinamicamente medida que novos elementos vo sendo alocados na estrutura. A pilha dinmica composta por uma subestrutura que representa um item (elemento) da pilha e mais uma varivel do tipo ponteiro top que aponta para o item que est no topo da pilha.

Você também pode gostar