Você está na página 1de 40

Treinamento em Linguagem C++

Declarao de Classes Visibilidade de Membros de Classes Enumeraes Referncias Funes inline Passagem de parmetros para funes Classes e Objetos Operadores de dados Utilizao do especificador const Objetos como membros de dados de uma classe Operador de inicializao de membro Estruturas e classes (observaes) Sobrecarga de funes Funes membro que retornam um objeto Membros de dados private static Objetos criados dinamicamente Herana Herana pblica e privada Reescrevendo funes-membro da classe base Classe Abstratas Nveis de Herana Herana mltipla Ponteiros Alocao dinmica em C/C++ Sobrecarga de operadores Operadores unrios sobrecarregados pr e ps fixados Converses Listas encadeadas Ponteiros para funes Gravando uma linha por vez no arquivo de sada Lendo uma linha por vez do arquivo de entrada

Identificando o fim de arquivo (eof) A funo open() Lendo um caracter por vez do arquivo de entrada Gravando um caracter por vez no arquivo de sada Exemplo de operaes com arquivos em C++ Gravando objetos Lendo objetos Os mtodos seekp(), seekg(), tellp() e tellg()

Declarao de Classes a) Em C++, as classes permitem ao programador definir novos tipos de dados. b) As classes podem ser declaradas pelas palavras-chave STRUCT, UNION e CLASS c) As estruturas em C++ podem ter membros de dados e de funo; seus membros so public por default. d) As unies em C++ podem ter membros de dados e de funo; seus membros so pblicos por default; todos os mebros de uma unio ocupam a mesma posio de memria. e) As classes (propriamente ditas) tem membros de dados (variveis de instncia) e membros de funo cuja visibilidade private por default. f) Uma instncia de estrutura ou unio dita uma varivel; uma instncia de classe dita um objeto. Ou seja, um objeto uma varivel do tipo classe. Visibilidade de Membros de Classes a) private: os membros private podem ser acessados apenas pelas funes-membro da classe b) public: os membros public podem ser acessados por qualquer funo c) protected: os membros protected podem ser acessados por qualquer funo-membro da classe-base e de suas classes derivadas. Enumeraes a) As enumeraes permitem ao usurio criar variveis s quais podem ser atribudos valores constantes. b) Estes valores constantes esto listados na instruo de definio do tipo enumerado.

c) exemplo: enum CORES { AZUL=1,VERDE=2,CINZA=31}; // declara a varivel cor como do tipo CORES CORES cor; cor = VERDE ; // ok cor = 1 ;// errado - cor do tipo CORES e 1 do tipo inteiro cor=(CORES)1;// foi necessrio utilizar o operador de molde Referncias a) Forma alternativa de passar parmetros para uma funo b) A funo chamada cria referncias para os argumentos fornecidos pela funo chamadora, que ocupam a mesma posio de memria destes argumentos. c) A funo chamada no cria cpias locais dos argumentos recebidos; logo, qualquer alterao nestes ser refletida na funoo chamadora. d) A passagem de argumentos por referncia tambm uma forma de permitir funo chamada retornar mais de um valor funo chamadora. Exemplo: int x; int &xref = x; // cria referncia para x; &x = &x1 Funes inline

a) O especificador inline sugere ao compilador substituir o cdigo da funo na posio em que foi chamada, ao invs de executar o processo de chamada de funo. b) As funes inline so tratatadas com macros, o que pode aumentar a velocidade de execuo. c) Esta sugesto (ver item a) pode ser aceita ou no, baseado em critrios que variam de um compilador para outro (usualmente apenas funes pequenas) .

Passagem de parmetros para funes a) A passagem de parmetros para fun'es pode ser feita por valor, por referncia ou por ponteiro. b) Na chamada por valor, a funo chamada cria uma cpia local do argumento passado pela funo chamadora. c) Na chamada por referncia, a funo chamada no fria uma nova varivel, mas apenas uma referncia (ALIAS) do parmetro fornecido. Quaisquer alteraes de valor nesta referncia sero refletidas na funo chamadora, a menos que o especificador CONST seja includo no prottipo da funo. Por exemplo: int MyFunction_ByRef (const int& MyVariable) { i +=1 ; // esta instruo gera um erro em temnpo de compilao } d) A passagem de parmetros por ponteiro ou por referncia permite funo retornar mais de um valor para a funo chamadora. e) As chamadas de funes com passagem de argumentos por referncia ou por valor so idnticas. f) Na chamada de funes com passagem de argumentos por ponteiros devemos fornecer o endereo da varivel-parmetro. A funo chamada criar um ponteiro para o endereo fornecido. int MyFunction_ByPtr (int *p); // prottipo da funo void main() { int MyVariable=10; MyFunction_ByPtr(&MyVariable); } g) O tipo de um ponteiro corresponde ao tipo do valor aramazenado no endereo por ele apontado. Logo, como p aponta para o endereo de MyVaraiable, que inteira, dizemos que p um ponteiro do tipo int ou ponteiro para inteiro.

Classes e Objetos

a) Os membros declarados na seo private so encapsulados. Estes membros(de dados ou de funo) s podem ser acessados por funes mebros da mesma classe. b) Os membros de dados so normalmente declarados na seo private. c) As funes-membro declaradas na seo public fazem a interface entre o programador e a classe. Normalmente so as funes d emanipulao de dados. d) Uma classe pode ter membros de dados ou variveis de instncia e membros de funo ou funo-membro ou mtodos. e) Se o corpo da funo-membro declarado dentro da classe, esta funo considerada inline por default, sendo desnecessrio a utilizao do especificador inline. f) Instruo de chamada a uma funo-membro: ClassName.FunctionName(); g) A instruo de chamada a uma funo membro chamada de MENSAGEM. h) Declarao do corpo da funo for a da classe: [tipo] [ClassName] :: [function_name]()

i) O operador (::) o operador de resoluo de escopo. Este operador informa que [function_name] membro da classe [ClassName]. j) Funo construtora ou construtor : funo que tem o mesmo nome da classe e chamada automaticamente quando o objeto declarado. k) O construtor no retorna nenhum tipo de valor, logo a declarao

da funo construtora no deve ser precedida do tipo. [ClassName]::[ClassName]() l) Funo destrutora ou destrutor: funo que tem o memso nome da classe (precedido por um ~) chamada automaticamente quando o objeto destrudo (liberado da memria). m)A funo destrutora no retorna nenhum tipo de valor e no pode receber argumentos. [ClassName]::~[ClassName]() n) Sumrio de termos relacionados Mtodo funo-membro ou membro de funo de uma classe Mensagem qualquer chamada a uma funo membro de um objeto. Funo inline funo-membro cujo corpo declarado no interior da classe. Visibilidade os membros de uma classe podem ser classificados, quanto visibilidade, como private, public ou protected. Os membros public podem ser acessados por qualquer funo; os membros private podem ser acessados apenas pelas funes-membro da classe; e o membros protected podem ser acessados pelas funes-membro da classe e de suas classes derivadas. Operador ponto liga o objeto ao membro. Operador de resoluo de escopo utilizado na declarao de funes-membro fora do corpo da classe, para indicar que as respectivas funes pertencem classe em questo. Construtor funo chamada automaticamente quando um objeto criado; a funo construtora no tem tipo (pois no retorna nenhum tipo de valor) , mas pode receber qualquer nmero de argumentos. Funo de acesso mtodo public utilizado para ler ou alterar membros de dados private. Operadores de Dados

x[y] x.y &x *x xy

= elemento (y-1) da matriz x = membro y do objeto x = endereo de x na memria = contedo do endereo apontado por x = membro y do objeto apontado por x

Utilizaes do especificador const

a) para declarar funes-membro que no podem modificar o valor dos membros de dados da classe, apenas acess-los. [tipo] [ClassName]::[FunctionName](list parameters) const b) para impedir que os valor dos membros de dados sejam alterados aps a inicializao, que deve ser feita obrigatriamente na funo construtora da classe. Neste caso, todos os mtodos da classe devem ser declarados como constantes, conforme sintaxe exibida em (a). const [ClassName] [ObjectName] (list parameters) c) para impedir que o valor de uma varivel seja modificado aps sua inicializao, que deve ser feita obrigatoriamente na declarao da varivel. const [name] = [value] d) A formulao acima pode ser utilizada para substituir a instruo #define [name] [value]

Objeto como membros de dados de uma classe

a) Considere o exemplo a seguir: class Date { private:

int day, month;

public: int year; Date(int,int,int); int PrintDay(); int PrintMonth();

};

int ChangeBirthday(int,int,int); ~Date(); class President { private: FirstName[20], LastName[20]; public: President(char [ ],char [ ], int, int, int); ~President(); Date Birthday;

b) Vemos que Birthday uma instncia da classe Date, e que est definida como um membro de dados da classe President. c) Logo, quando um objeto da classe President inicializado, a funo construtora da classe precisa inicializar tambm o objeto membro de dados Birthday, o que implica em executar tambm a funo construtora da classe Date. d) Portanto, a funo construtora da classe President precisa inicializar os membros de dados da classe Date, o que feito atravs do operador de inicializao de membro ( :). President::President(char n1[ ], char n2[ ] , int d, int m, int y):Birthday(d,m,y) { } Estruturas e classes (observaes)

a) Conforme j mencionado, os membros de uma estrutura so public por default e os de uma classe so private por default. b) Consequentemente, a utilizao da palavra-chave public no corpo de da declarao de uma estrutura desnecessria, assim como da palavra-chave private no corpo de declarao de uma classe.

Sobrecarga de funes a) Em C++ possvel declarar duas ou mais funes com o mesmo nome. Estas funes (alm da primeira) so ditas sobrecarregadas. b) As funes sobrecarregadas so diferenciadas pelo compilador no pelo tipo de varivel que retornam, mas pela lista de argumentos. c) A utilizao de funes sobrecarregadas pode ser til em diversas situaes, como por exemplo na inicializao de objetos (construtores sobrecarregados).

Funes membro que retornam um objeto

a) Considere a declarao da classe Venda class Venda { private: int npecas; float preco; public: Venda();// construtor Venda AddVenda(Venda); void PrintVenda(); ~Venda() { } ;// funo destrutora (inline)

};

b) Considere agora a declarao da funo-membro da classe Venda que retorna um objeto Venda Venda Venda::AddVenda(Venda A) { Venda Temp; Temp.npecas= npecas + A.npecas; Temp.preco = preco + A.preco; return Temp;

} c) Declaramos abaixo 3 objetos da classe Venda Venda A,B,Temp; d) A instruo Temp = A.AddVenda(B); equivale a somar os valores das respectivas variveis de instncia dos objetos A e B. d) O objeto B passado como argumento para a funo-membro do objeto A. e) Um novo objeto Temp criado na funo AddVenda,e suas variveis d einstncia recebem a soma das variveis de instncia do objeto atual (A) e do objeto passado como parmetro (B), ou seja, Temp = A + B ; f) Este resultado (um objeto da classe Venda) atribudo ao objeto Temp, declarado no bloco principal do programa.

Membros de dados private static a) Quando um membro de dados declarado como static, ele compartilhado por todos os objetos pertencentes classe. b) Os membros de dados private auto (classe de armazenamento default) so individualizados por objeto, ou seja, cada membro criado para cada objeto. c) As variveis de instncia static comportam-se de forma semelhante s variveis static convencionais. d) Os membros de dados static devem ser declarados atravs da instruo [tipo] [NomeClasse]::[NomeVarivel] = [ inicializao]

Objetos criados dinmicamente a) Objetos so criados dinmicamente por meio do operador new (semelhante malloc() na linguagem C), que retorna um ponteiro para o endereo do objeto. b) O espao em memria ocupado pelo objeto liberado por meio da instruo delete. c) Os membros de objetos criados dinamicamente so acessados por meio do operador de dados (). d) Quando o ponteiro para o objeto criado por meio da instruo new, a funo construtora executada. e) Quando o ponteiro para o objeto destrudo por meio da instruo delete, a funo destrutora executada. f) No caso de objetos criados automaticamente, a funo destrutora executada quando atingido o trmino da execuo do bloco no qual o objeto foi declarado.

Herana a) As classes-base incorporam os membros pblicos e protegidos da classe base. b) Isto permite a reutilizao de cdigo, ou seja, se necessrio modificar ou adicionar funes, no necessrio alterar o cdigofonte da classe base, mas apenas criar classes-derivadas que implementem estas funes. c) Para isso, basta ter disposio o cdigo-objeto com as classesbase (no necessrio dispor do cdigo fonte das mesmas). Ou seja, podem ser definidas classes derivadas a partir de classes base confinadas em bibliotecas. d) Definindo classe derivada class [derivada]:[public/private] [base] e) Qualquer membro pblico da classe-base acessvel classe

derivada. f) Os membros protected so acessveis s funes-membro da classe base e de todas as classes derivadas. g) Se nenhum construtor for especificado na classe derivada, o construtor sem argumentos da classe base ser utilizado.

h) Construtores da classe-base: [derivada]::[derivada] (lista de parmetros 2) : [base](lista de parmetros 1) { corpo } o construtor da classe derivada recebe a lista de parmetros 2 e passa lista de parmetros 1 para a funo construtora da classe base, que executada. Em seguida, as instrues do corpo da funo so executadas.

i) O compilador busca o membro na classe-base primeiramente. No encontrando, busca na classe-derivada. Herana pblica e privada a) Herana pblica (ou derivao pblica) Class Agente: public Policia todos os membros public da classe base (Policia) so membros public da classe derivada (Agente) e todos os membros protected da classe base so protected da classe derivada. Ou seja, a visibilidade dos membros da classe base mantida na classe derivada. b) Herana privada (ou derivao privada) Class Agente:private Policia todos os membros public e protected da classe base sero membros private da classe derivada. Reescrevendo funes-membro da classe base a) Quando necessrio adicionar instrues a uma funo de uma classe base pr-compilada (da qual no dispomos do cdigo-fonte),

podemos definir uma funo de mesmo nome na classe derivada. Assim, uma chamada a funo ser feita de modo nico por um objeto da classe derivada. b) A funo na classe derivada chama a funo na classe base utilizando o operador de resoluo de escopo (::). void print() { Base::print(); }

Classes Abstratas Classes abstratas so utilizadas apenas para derivar outras classes, ou seja, nenhuma instncia destas classe (objeto) declarada (ver classe Conta no diretrio heritage1). Nveis de Herana Uma classe derivada pode ser subclasse de outra classe derivada. Podemos ter mltiplos nveis de hierarquia (ver classe ContaPremio no diretrio heritage1). Obs: os dois mecanismos de incorporao de membros de classes base so herana (simples e mltipla) e objetos membros.

Herana mltipla a) Uma classe derivada tem mais de uma classe base b) Sintaxe de declarao: class [derivada] : [public/private] [base1] , ... , [public/private] [base n] c) Ambiguidade em herana mltipla: ocorre, dentre outras situaes, quando h funes de mesmo nome nas classes base, sem correspondncia na classe derivada (no h funo alguma com este nome na classe derivada). d) A ambiguidade resolvida pelo operador de resoluo de escopo (::). [nome do objeto].[nome da classe]::[nome do membro](lista de parmetros) ; e) Os construtores da classe derivada em herana mltipla tm a mesma sintaxe do tem (h), seo Herana. As chamadas s classes-base so separtadas por vrgulas. A construtora da classe derivada deve receber todos os argumentos necessrios para inicializar todos os membros de dados das classes base.

[derivada]::[derivada] (lista de parmetros 2) : [base](lista de parmetros 1A), ..., [base](lista de parmetros 1N)

Ponteiros a) Ponteiro varivel - contm um endereo de memria. b) Ponteiro constante - o nome de uma matriz um endereo constante. c) Operador de endereos (&) - operador unrio que retorna o endereo do operando. d) Operador de referncias(&) - cria uma cpia da varivel operando; esta cpia na verdade apenas um alias, pois ocupa a mesma posio de memria da varivel original. e) Operador indireto(*) - retorna o valor armazenado no endereo apontado pelo operando, ou seja, retorna o valor da varivel apontada. f) Operaes com ponteiros: int *px, y; px = &x ; (atribuio) y = *px; (operao indireta) cout << &px ; (retorna endereo do ponteiro) n = py - px ; (diferena = (&y - &x)/(n de bytes do tipo apontado))

g) Alocao dinmica de memria Operador new: retorna um ponteiro para o incio do bloco de memria alocado. O operador new, ao contrrio de malloc (que retorna um ponteiro void), retorna um ponteiro para otipo da varivel apontada. Torna-se desnecessria a utilizao do operador de molde. Operador delete: libera a memria previamente alocada por new. Delete recebe como argumento o ponteiro retornado por null.

Alocao Dinmica em C/C++

a) Considere a instruo em C struct MY_STRUCT S; Que declara uma estrutura do tipo MY_STRUCT; o programa aloca memria automaticamente esta varivel. b) Contudo, se declaramos um ponteiro para MY_STRUCT struct MY_STRUCT *S; O ponteiro incializado com um endereo invlido (NULL). necessrio atribuir um endereo para este ponteiro, o que feito (em C) pelo operador malloc: S = (struct MY_STRUCT *) malloc(sizeof(MY_STRUCT)); c) Esta instruo aloca a memria necessria e retorna um ponteiro genrico void. Este tipo de ponteiro no pode ser diretamente acessado, sendo necessrio utilizar o operador de molde (struct MY_STRUCT *) para convert-lo para pobteiro para MY_STRUCT. (obs: o operador sizeof retorna o tamanho do operando em bytes). d) Em C++, a alocao dinmica de memria feita com o operador new, que considera o tipo deponteiro a ser retornado, dispensado a utilzao do operador de molde. S = new MY_STRUCT; e) O operador new retorna um ponteiro do tipo indicado na instruo para o primeiro byte do objeto ou varivel. f) O operador new, ao alocar memria para um objeto, faz com que sua funo construtora seja automaticamente executada. Logo, possvel passar parmetros para o construtor na prpria instruo de alocao dinmica de memria: declara ponteiro para instncia da classe MyClass MyClass *Obj;

aloca memria para o ponteiro Obj = new MyClass(12,122,PFC);

g) O destrutor de um objeto criado automaticamente executado quando atingido o trmino da execuo do bloco no qual o objeto foi definido. h) O destrutor de um objeto alocado dinmicamente (via operador new) executado quando a memria ocupada pela instncia liberada (via operador delete), o que pode ser feito antes do trmino da execuo do bloco. i) Obviamente, possvel alocar dinamicamente no apenas objetos, mas tambm tipos de variveis pr-definidos na linguagem. Considere as instrues a seguir: int *ptr; ptr = new int; j) Utilizando os operadores new e delete com arrays (alocao dinmica de vetores) int *intNotas; int intSize = 10; float media=0; intNotas = new int[intSize]; ..... delete [] intNotas; k) O cdigo a seguir ilustra a alocao dinmica em C++, atravs da utilizao dos operadores new e delete com arrays. Tambm h um exemplo de atribuio entre objetos (pgina 26, Treinamento em linguagem C++, mdulo 2).

#include <conio.h> #include <iostream.h> #include <string.h> // declara classe MFC class MFC { private:// membros de daods pblicos da classe char *strMyStringPtr;// ponteiro para char public: MFC(char*);// construtor void vdPutData();// funo de acesso void vdUpDateMyString(char*); ~MFC();// destrutor }; MFC::MFC(char *string) { int l=strlen(string); // aloca memria para o membro de dados private da classe // o endereo da nova string armazenado em strMyStringPtr strMyStringPtr = new char[l+1]; strcpy(strMyStringPtr,string); } void MFC::vdPutData() { cout << strMyStringPtr << endl;} void MFC::vdUpDateMyString(char *string) { int l=strlen(string); // libera memria previamente alocada na funo construtora // obs: poderia ter sido utilizxado um ponteiro para char temporrio delete [] strMyStringPtr; // aloca memria para o membro de dados private da classe // o endereo da nova string armazenado em strMyStringPtr strMyStringPtr = new char[l+1]; strcpy(strMyStringPtr,string); } MFC::~MFC() { // libera a memria alocada pelo operador new delete [] strMyStringPtr; } void main() { MFC Obj1("Saraiva"),Obj2("Kadesh"); Obj1.vdPutData(); getch(); Obj1.vdUpDateMyString("This one is much longer"); Obj1.vdPutData(); getch(); Obj1 = Obj2 ;

Obj1.vdPutData(); getch(); }

Sobrecarga de operadores a) Os operadores utilizados com os tipos bsicos da linguagem C++ no podem ser utilizados com os tipos definidos pelo usurio, como classes, estruturas e enumeraes. b) Sobrecarregar um operador significa redefinir seu smbolo, de modo que possa ser utilizado com tipos definidos pelo usurio. c) A sobrecarga de operadores feita atravs de funes operadoras. d) As funes operadoras podem ser globais ou membros de classe. e) A sobrecarga s pode ser feita a partir dos operadores existentes na linguagem. f) Os seguintes operadores no podem ser sobrecarregados: operador ponto (.), operador de resoluo de escopo (::) e operador condicional ternrio (?:). Unrios no recebem parmetros pr ou ps fixados ? Binrios recebem um nico parmetro g) A palavra reservada operator deve vir logo aps o tipo retornado pela funo operadora, em sua declarao. [tipo] operator [operador]([parmetro se for binrio]) h) Toda vez que [operador] for aplicado a um objeto da classe da qual a funo operadora acima membro, ela ser chamada. i) Considere a sobrecarga do operador unrio pr-fixado ++: Declarao: void operator ++( ) Chamada :++Obj (equivale a Obj.operator++())

Operadores unrios pr e ps fixados

a) As funes operadoras que implementam a operadores unrios no recem parmetro algum.

sobrecarga

de

b) Para identificar um operador como ps-fixado, inserir a palavra chave int entre parnteses; ela apenas servir, neste contexto, para permtir ao compilador diferenciar as funes operadoras ps e pr-fixadas. c) A operao ps-fixada deve ser implementada pelo programador. Converses

a) Converses entre tipos bsicos: as converses entre tipos bsicos so feitas de forma implcita (converso implcita) ou de forma explcita (converso explcita) atravs do operador de molde. b) Converso de um objeto para tipo bsico: para realizar a converso de um objeto para um tipo bsico necessrio sobrecarregar o operador de molde, criando uma funo chamada funo conversora. Funes conversoras: retornam um valor para o tipo desejado; na sua declarao no deve ser inserido o tipo do valor retornado, pois esta informao est contida no operador de molde sobrecarregado ( converso de objeto para tipo bsico ). c) Converso de um tipo bsico para objeto: para realizar a converso de um tipo bsico para objeto necessrio sobrecarregar o operador de atribuio.

Bsico Bsico Operador de molde ou converso implcita Objet Funo conversora o (sobrecarga do operador de molde)

Objeto Sobrecarga do operador de atribuio (1) Funo conversora (2) Construtor para converso

Converso de objeto tipo bsico Sobrecarga do operador de molde funo conversora


class string { private: char str[20]; public: string() { str[0]=0; } string(char s[]) { strcpy(str,s);} // funo conversora no especificar tipo operator int(); // funo conversora no especificar tipo operator float(); ~string() {} }; string::operator int() { return atoi(str); } string::operator float() { return atof(str); } void main() { string str1(12), str2(123.33); int x ; float y = str2; // converso implcita x = int(str1); // converso explcita cout << x << endl; cout << y << endl; getch(); }

Listas Encadeadas a) Inicializa ponteiro marcador do topo da lista void *head = NULL; b) Rotina de insero aloca memria para novo elemento MyStruct *novo = new MyStruct; rotina de entrada dos dados da estrutura encadeamento da lista // aponta para NULL ou para o elemento anteriormente inserido na lista novo prximo = head; // reposiciona head no topo da lista head = novo; c) Rotina de busca aloca memria para elemento atual MyStruct *atual = new MyStruct; aponta para o topo da lista atual = (MyStruct *)head; percorre a lista while(atual!=NULL) { . atual = atual prximo; }

d) Rotina de excluso aloca memria para elemento atual MyStruct *atual = new MyStruct; aponta para o topo da lista atual = (MyStruct *)head; percorre a lista while(atual prximo!=NULL) { if(atual prximocampo = valor) atualprximo=atual prximoprximo; . atual = atual prximo; } e) Rotina de excluso especial para elemento no topo da lista ver cdigo em anexo f) Rotina de excluso especial para elemento no fim da lista ver cdgio em anexo.

Treinamento em linguagem C++ Captulo 11 - Ponteiros Listas encadeadas (ou listas ligadas)
#include <iostream.h> #include <conio.h> #include <stdlib.h> struct Livro { char nome[40]; int code; float preco; Livro *proximo;// ponteiro para Livro }; void *head = NULL; inline int Empty(Livro* atual){ return (atual==NULL)?1:0; }

void Inserir() { // aloca memria para novo elemento Livro *novo = new Livro; cout << "Nome : " ; cin >> novo->nome; cout << "Codigo: "; cin >> novo->code; cout << "Preco : "; cin >> novo->preco; // encadeamento da lista novo->proximo = (Livro *) head; head = novo; } void Listar() { Livro *atual= (Livro *)head; if(!Empty(atual)) while(atual!=NULL) { cout << "Nome : " << atual->nome << endl; cout << "Codigo: " << atual->code << endl; cout << "Preco : " << atual->preco << endl <<endl; atual = atual->proximo; } }

void Remover(int code) { Livro *atual= (Livro *)head; Livro *aux = (Livro *)NULL; // rotina especial para remover elemento do topo da lista if(atual->code==code) { head = atual->proximo; return; } if(!Empty(atual)) while(atual->proximo!=NULL) { if(atual->proximo->code==code) { atual->proximo = atual->proximo->proximo; return; } aux = atual; atual = atual->proximo; } // rotina especial para remover elemento do fim da lista if(atual->code==code) aux = NULL;// aux aponta para a posio anterior na lista } void Pesquisar(int code) { Livro *atual= (Livro *)head; if(!Empty(atual)) while(atual!=NULL) { if(atual->code==code) { cout << "Nome : " << atual->nome << endl; cout << "Codigo: " << atual->code << endl; cout << "Preco : " << atual->preco << endl <<endl; //break; se habilitado, impede listagem de ocorrncias mltiplas //do valor da chave de busca } atual = atual->proximo; } }

void main() { int op,code; do { cout << "[1] Insere elemento na lista" << endl; cout << "[2] Remove elemento da lista" << endl; cout << "[3] Busca elemento na lista" << endl; cout << "[4] Listar elementos"<< endl; cout << "[5] Sair do programa" << endl; cout << "Selecione opcao : "; cin >> op; switch(op) { case 1: Inserir();break; case 2: cout << endl; cout << "Codigo = "; cin >> code; Remover(code); break; case 3: cout << endl; cout << "Codigo = "; cin >> code; Pesquisar(code); break; case 4: Listar();break; case 5: exit(0); default: cout << "Opcao invalida !"; } } while(1); }

Ponteiros para funes

a) Declarao de um ponteiro para funo do tipo void (atribuir ao ponteiro ptr o endereo da funo) void *ptr; ptr = MyFunction; a) poderamos condensar as duas linhas acima em uma nica instruo: void *ptr = MyFunction; b) Note a ausncia dos parnteses. Se estivessem presentes, estaramos atribuindo ao ponteiro no o endereo da funo, mas o valor por ela retornado. c) Para fazer uma chamada a funo utilizado o ponteiro: (*ptr)(); d) Matriz de ponteiros para funes int (*ptr[])(int) = { Soma, Multiplica, EhMaior, EhIgual}; e) A instruo (*ptr[i])() corresponde chamada da (I-1)-sima funo elemento da matriz.

Gravando uma linha por vez no arquivo de sada #include <fstream.h> void main() { ofstream fout("teste.txt"); fout << "Line 1 - This is Chapter 13"<< endl; fout << "Line 2 - -----------------------------"<< endl;

a) o arquivo de cabealho FSTREAM.H contm as declaraes das classes OFSTREAM e IFSTREAM. b) declaramos um objeto da classe OFSTREAM, inicializando-o com o nome do arquivo de sada. c) o operador sobrecarregado << imprime o argumento (a string) no arquivo de sada. d) no necessrio fechar o arquivo explicitamente, pois a funo destrutora da classe ofstream ir faz-lo quando o objeto fout for descartado. Lendo uma linha por vez do arquivo de entrada #include <fstream.h> void main() { const int MAX=80; char buff[MAX], fim_de_linha='.'; ifstream fin("teste.txt"); while(fin) { fin.getline(buff,MAX,fim_de_linha); cout << buff; }

a) declaramos um objeto da classe IFSTREAM, inicializando-o com o nome do arquivo de entrada. b) o mtodo getline() armazena no mximo MAX caracters por linha no buffer buff. A leitura interrompida antes deste limite se for encontrado o caracter fim_de_linha. c) o argumento fim_de_linha opcional; se no for fornecido, o valor padro assumido '\n'. d) aps sua leitura, cada linha impressa na tela (sada padro).

Identificando o fim de arquivo (eof)

a) Objetos da classe IFSTREAM tm um valor que pode ser testado para a verificao de fim de arquivo (EOF). b) Qualquer mensagem (chamada de um membro de objeto da classe) retornar o valor zero em caso de fim de arquivo. c) Portanto, o lao while acima poderia ser reescrito, de forma mais compacta, como: while(fin.getline(buff,MAX,fim_de_linha)) cout << buff; A funo open() a) Os objetos da classe IFSTREAM e OFSTREAM podem ser incializados na declarao (atravs do construtor da classe) ou aps a declarao, atravs da funo OPEN. b) Tanto a funo OPEN quando o construtor das classes IFSTREAM e OFSTREAM podem receber dois parmetros: o nome do arquivo de entrada/sada; o modo de abertura do arquivo (Guia de Consulta Rpida Pgina 25) ios::in (default para objetos da classe ifstream) - leitura. ios::out ( default para objetos da classe ofstream) - gravao. ios::app - grava a partir do final do arquivo.

Lendo um caracter por vez do arquivo de entrada #include <fstream.h> void main() { ifstream fin; char ch; fin.open("teste.txt",ios::in); } while(fin.get(ch)) cout << ch;

a) declaramos um objeto da classe IFSTREAM. b) utilizamos o mtodo OPEN para inicializar o objeto fin com o nome do arquivo de entrada. c) fornecemos, a ttulo de ilustrao, o segundo argumento da funo OPEN, que o modo de abertura do arquivo. Este argumento dispensvel neste caso, pois o modo padro para objetos da classe IFSTREAM. d) o mtodo get() retorna um carater lido do arquivo de entrada. Gravando um caracter por vez no arquivo de sada #include <fstream.h> void main() { ofstream fout; char ch=0; fout.open("teste.txt",ios::out); while(ch!='.')

{ }

cin >> ch; fout.put(ch);

O programa l um caracter por vez do teclado (entrada padro) e o imprime no arquivo de sada, atravs do mtodo put, que recebe este caracter como argumento. O lao prossegue at que seja digitado o caracter ponto. Exemplo de operaes com arquivos em C++
/* Treinamento em Linguagem C++ Capitulo 13 - Operacoes com Arquivos [1] Gravar em um arquivo de sada as linhas de um arquivo de entrada que satisfaam o seguinte critrio: a) comecem com vogal b) tenham uma consoante no quinto caracter [2] Imprimir o nmero de cada linha (referente sua posio no arquivo de entrada). [3] Exibir o nmero mdio de caracteres/linha do arquivo de entrada. [4] Exibir a percentagem de linhas do arquivo de entrada que satisfazem a condio [1] */ #include #include #include #include <fstream.h> <stdio.h> <iomanip.h> <conio.h>

// (0)consoante (1)vogal (-1)caracteres nao alfabeticos inline int VogalConsoante(char ch) { if(((ch>=97)&&(ch<=122)||(ch>=65)&&(ch<= 90))) if((ch==97)||(ch==101)||(ch==105)||(ch==111)||(ch==117)||(ch==65) ||(ch== 69)||(ch== 73)||(ch== 79)||(ch== 85)) return 1; else return 0; return(-1); } void main() { ifstream in; // declara objeto da classe ifstream ofstream out;// declara objeto da classe ofstream

// requisita nomes dos arquivos de entrada e saida char input[20],output[20]; cout << "Nome do arquivo de entrada = ";gets(input); cout << "Nome do arquivo de saida = ";gets(output); in.open(input,ios::in) ;// inicializa objeto da classe ifstream out.open(output,ios::out);// inicializa objeto da classe ofstream const int MAX=81;// define tamanho mximo do buffer char buffer[MAX];// declara buffer utilizado pelo mtodo getline int lin=0,ch=0 ;// contadores de linhas e caracteres int lin2=0 ;// contador de linhas que satisfazem a condio 1

while(in.getline(buffer,MAX))// se EOF, a mensagem retorna 0 { lin++; ch+=strlen(buffer); if((VogalConsoante(buffer[0])==0)&&(VogalConsoante(buffer[4])==1)) { out << setfill('0') << setw(3) << lin << " - " << buffer << endl; lin2++; } } cout << endl; cout << "Numero total de linhas no arquivo de entrada = " << lin << endl; cout << "Numero medio de caracters/linha = " << setiosflags(ios::fixed) << setprecision(1) << (float)ch/lin << endl; cout << "Percentagem de linhas que satisfazem a condicao = " << setiosflags(ios::fixed) << setprecision(1) << 100*(float)lin2/lin << "%" << endl; getch(); }

Gravando objetos

#include <fstream.h> void main() { ofstream out(teste.txt);

MyClass obj; . out.write((char *)&obj,sizeof(obj)); } .

O mtodo write da classe ofstream recebe dois argumentos: o endereo do objeto (convertido para ponteiro do tipo char) e o nmero de bytes ocupados pelo objeto (valor obtido utilizando o operador sizeof()). Lendo objetos #include <fstream.h> void main() { ifstream in(teste.txt); MyClass obj; . while(in.write((char *)&obj,sizeof(obj))) { . }

O mtodo read da classe ifstream recebe dois argumentos: o endereo do objeto (convertido para ponteiro do tipo char) e o nmero de bytes ocupados pelo objeto (valor obtido utilizando o operador sizeof()). Os mtodos seekg( ), seekp( ) , tellg( ) e tellp( )

a) Qualquer arquivo em C++ tem dois valores inteiros a ele associados: o ponteiro de posio corrente de leitura e o ponteiro de posio corrente de gravao.

b) O mtodo seekg(offset,ref) reposiciona o ponteiro de posio corrente de leitura, deslocando-o offset bytes em relao ao byte ref. c) O mtodo seekp(offset,ref) reposiciona o ponteiro de posio corrente de gravao, deslocando-o offset bytes em relao ao byte ref. d) O mtodo tellg( ) informa a posio do ponteiro corrente de leitura, em bytes em relao ao incio do arquivo. e) O mtodo tellp( ) informa a posio do ponteiro corrente de gravao, em bytes em relao ao incio do arquivo. f) No parmetro ref, podemo fornecer as flags: ios::beg (incio do arquivo), ios::end(final do arquivo) e ios::curr(posio atual); o valor padro ios::beg.

Você também pode gostar