149
PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações. PDF generated at: Sun, 30 Mar 2014 20:34:50 UTC Programar em C++

Programar Em C++ Wikibooks

Embed Size (px)

Citation preview

  • PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes.PDF generated at: Sun, 30 Mar 2014 20:34:50 UTC

    Programar em C++

  • ContedoPginas

    Objetivo 1Por que C++? 1Diferenas entre C e C++ 2Introduo 3Al, Mundo! 6Variveis e constantes 12Ponteiros 18Vetores 20Estruturas 29Operadores 34Deciso e controle de fluxo 37Estruturas de repetio 42Funes 49Referncias de dados 51Entrada e sada de dados 56Entrada e sada de dados 2 65Manipulando strings 80Classes 88Encapsulamento 103Herana 106Polimorfismo 119Friend 124Classes internas 126Sobrecarga de operadores 127Alocao dinmica de memria 129Excees 136Namespace 136Templates 136Containers 138Compilao 138Lista de Palavras Reservadas do C++ 140Lista de Sequncias de Escape 141Tabela ASCII 142C++11 143

  • RefernciasFontes e Editores da Pgina 144Fontes, Licenas e Editores da Imagem 145

    Licenas das pginasLicena 146

  • Objetivo 1

    ObjetivoO livro Programar em C++ tem por objetivo apresentar os fundamentos desta linguagem, de modo que o estudantepossa desenvolver diferentes tipos de softwares em alto e baixo nvel para os diversos ambientes existentes, desdeaplicaes para GNU/Linux ou Windows at programas para microcontroladores, alm de fornecer a base para osestudos avanados de C++.Por ser um livro especfico sobre a linguagem C++, altamente recomendvel que o leitor tenha conhecimentosprvios sobre a linguagem C.Espera-se que este livro aborde: Aspectos tericos Aspectos prticos Os erros comunsPara tanto cada tpico dever ter uma explicao terica, citar os erros mais comuns e exerccios.

    Por que C++?Imagine que voc deve fazer um programa para fazer a mquina de um pequeno relgio de pulso funcionar, entovoc pensa: Bom, isso pode ser feito com Assembly... Porm, pensando melhor, voc decide mudar de linguagem quando voc pondera. O problema maior que se eu tiver que mudar o processador do relgio, vou ter que refazer o programa. melhor

    usar linguagem "C". Depois voc termina por avaliar outra possibilidade: Bem, se eu j estou pensando em "C" melhor usar "C++", depois vai ser mais fcil de entender o cdigo,

    reaproveitar em outras coisas e ainda vai ser mais fcil de expandir para outros modelos de relgio.E assim o que podemos perceber como C++ poderosa, flexvel e abrangente. Ela pode ser usada para programarqualquer tipo de hardware, desde os mais simples at os mais complexos. Alm disso, C++ uma linguagem quegera programas em cdigo de mquina, que funcionam com ou sem a participao de sistemas operacionais nodispositivo.Alguns profissionais afirmam que C++ a linguagem mais poderosa que existe, veja algumas caractersticas dela: um superconjunto da linguagem C, e contm vrios melhoramentos; Deu origem a grandes linguagens como Java e D; a porta para a programao orientada a objetos; C++ pode virtualmente ser efetivamente aplicado a qualquer tarefa de programao; H vrios compiladores para diversas plataformas tornando a linguagem uma opo para programas

    multiplataforma.A linguagem C++ utilizada em projetos como: Compiladores; Editores; Ferramentas de programao; Jogos; Programas de redes.At ao momento foram realizadas 3 grandes revises linguagem:

  • Por que C++? 2

    1 em 1985; 2 em 1990; 3 em 1998 a que deu origem ao ANSI \ ISO standard a que ficou comummente denominada de Standard C++.

    Esta verso suportada por todos os compiladores C++ famosos incluindo Microsofts Visual C++, BorlandsC++ Builder e GCC. Esta foi revista em 2003.

    C++ considerada uma linguagem que est entre linguagem de alto nvel (em ingls, high level language) elinguagem de baixo nvel (em ingls, low level language). Dito de outra forma, uma linguagem que est prximada linguagem humana (linguagem de alto nvel), mas ao mesmo tempo permite estar prximo da maneira como ocomputador processa, prximo do Assembly (uma linguagem de baixo nvel).

    Diferenas entre C e C++Quem sabe programar em C++, capaz de programar C, devido semelhana entre as linguagens e o fato do C++ser uma extenso do C. Contudo o C no completamente um subconjunto do C++. Grande parte de cdigo C podeser perfeitamente compilado em C++, mas existem algumas pequenas diferenas sintticas e semnticas entre aslinguagens que tornam alguns trechos de cdigo C vlidos em cdigo C++ invlido, ou cdigos que exibemcomportamentos diferentes em cada linguagem.Algumas diferenas bsicas: O C permite a converso implcita entre o tipo de dado void* para ponteiros para outros tipos, algo que o C++ no

    permite. O C permite que constantes de caracteres sejam inseridas em chamadas de funes com parmetros tipo char*,

    em C++ preciso declarar o parmetro como const char *;Alm destas pequenas diferenas, C++ tem um conjunto de caractersticas que a torna fundamentalmente diferentede "C". Esse conjunto, torna possvel programar em C++ de um modo totalmente diferente do modo de programar dalinguagem "C". O que traz a diferena o modo da orientao na montagem do cdigo.Chamamos o modo de programar em "C" de orientado a procedimentos e chamamos o modo do "C++" de orientadoa objetos. Muitas pessoas confundem as coisas quando comeam a programar usando um compilador C++, pois estalinguagem permite programar nos dois modos. Essa uma das caractersticas que a torna mais flexvel.Apesar de C++ permitir programar em modo orientado a procedimentos, podemos dizer que nestes casos estamosprogramando em "C", usando um compilador C++. Quando usamos C++ programamos em modo orientado aobjetos. Devido a estas caractersticas, o C++ permite programar em modo misto, ou seja, escrevendo partes docdigo orientadas a procedimentos e outras orientadas a objetos.As diferenas entre os dois modos de programar sero esclarecidas nos captulos subsequentes. Por hora nos bastadeixar claro que os dois modos so diferentes. Usar estes dois modos de programar ao mesmo tempo uma dasfacilidades que o C++ permite, enquanto que outras linguagens orientadas a objetos como Java, Eifel, etc, nopermitem.

    Esta pgina um esboo de informtica. Ampliando-a voc ajudar a melhorar o Wikilivros.

  • Introduo 3

    Introduo

    Pensando no cdigoConsiderando o conjunto de operaes e eventos que nosso programa deve executar temos diversas maneiras de criaro cdigo, porm o mais difcil criar um cdigo eficiente, rpido e compacto. Na verdade, diversos fatores podeminterferir nestes aspectos da programao, entre eles, a escolha do compilador, o mtodo de estruturar o cdigo, aorientao do mesmo, etc... Em termos gerais, um cdigo torna-se mais prximo do ideal a medida que suas partestornam-se mais simples de se analisar e quando todos os processos esto bem definidos e especializados. Quandotemos um cdigo que contm muito mais excees do que regras, este precisa de uma reestruturao.Podemos definir C++ como um "superconjunto" da linguagem C, ou seja, uma linguagem com mais funcionalidadesque a linguagem C. Embora este seja o ponto de vista de quem j tem um conhecimento da linguagem C, ela muitomais que isto. Podemos mudar completamente a forma de criar o programa quando usamos os recursos avanados dalinguagem, as estruturas de deciso (por exemplo, if-else ou switch) podem ser simplificadas e a organizaodo cdigo pode ser bem mais globalizada e genrica, possibilitando a reutilizao do cdigo em diversas situaesdiferentes.Vejamos como as funcionalidades da linguagem C++ podem ajudar a redefinir os meios de programao queaprendemos com o bom e velho estilo C.

    Dois modos de programarObservando o modo de programar que as linguagens oferecem desde os primrdios da computao, podemos notarvrios mtodos que foram sendo superados e outros que se estabelecem por um momento. O modo de programarmais usual e bem mais difundido conhecido como modelo estruturado sequencial. Em sntese, refere-se a formade programar onde uma instruo segue a outra numa sequncia que inicia e termina em um fluxo parcialmente"previsvel".A programao estruturada ainda pode ser classificada em dois modos: um orientado a procedimentos e outroorientado a objetos. Os dois podem ser confundidos por quem no tem muita experincia, mas o uso de um ou dooutro implica em caractersticas prprias para cada caso. Logo, preciso entender bem os conceitos antes de definirse um cdigo procedural ou orientado a objetos.O modelo sequenciado procedural bem simples de implementar, porm, aumenta a complexidade para tarefas maisbem trabalhadas e sofisticadas. Isto ocorre devido a estrutura do modelo, que exige rotinas cada vez mais extensas.No raramente possvel encontrar rotinas que, em alguns casos, tornam-se comparveis a programas completos,usando como referncia o nmero de linhas de instrues. O uso deste modelo, muitas vezes dificulta a manutenoe expanso do cdigo, caso isto no seja feito de maneira muito bem organizada.O segundo modelo o orientado a objetos. O que significa isso e o que muda no modo de programar, caso oadotemos em vez do modelo anterior?A orientao define o modo de abordar o problema para tentar solucion-lo: O modelo de orientao a procedimentos se preocupa em fornecer meios para resolver o problema sem

    contabilizar, a princpio, os dados que sero usados durante o processo. O modelo de orientao a objetos se preocupa com os elementos que so necessrios para a soluo de um

    problema. Sob este ngulo, os dados so os elementos principais na anlise do problema.Este livro traz uma viso dos problemas sob a ptica da orientao a objetos, enquanto que o livro "Programar em C" traz a anlise sob a ptica da orientao a procedimentos. Isto no quer dizer que devamos escolher a orientao a objetos como o modo mandatrio de programao, mas que podemos contar com seus recursos sempre que esta escolha facilite a resoluo do problema. Portanto, cabe sempre uma anlise para definir se o problema melhor

  • Introduo 4

    tratado por uma abordagem orientada a objetos ou a procedimentos.

    Um pouco sobre orientao a objetosA programao orientada a objetos um paradigma de programao que visa organizao, produtividade esustentabilidade.A apresentao dos conceitos de orientao a objetos bastante abrangente, o que implica na abordagem de diversosaspectos, como modelagem, estudo de performance de modelos, aplicabilidade de tcnicas, estruturao de objetos,otimizao, manuteno do cdigo, entre outros. Por este motivo, nosso objetivo aqui no apresentar a orientao aobjetos em sua totalidade. Para um estudo mais detalhado do tema sugerimos o livro POO, que trata especificamentedeste tema. O objetivo aqui apresentar como a orientao a objetos se aplica na linguagem C++, porm osconceitos aqui apresentados devem ser suficientes para a estruturao de programas de bom nvel.A ideia principal por traz do modelo de programao orientado a objetos est em transformar entidades do mundoreal em identificadores dentro do programa (objetos), trabalhando-os como entidades da linguagem que possuemcaractersticas e operaes prprias. Esta abordagem transforma o programa em um meio de simulao de situaesvirtuais por meio de entidades de cdigo que tem comportamento predefinido. Esta abstrao uma aliada doprogramador por permitir idealizar sistemas mais sofisticados de uma maneira bastante intuitiva.Todas as linguagens orientadas a objetos contm os princpios de: Encapsulamento

    um mecanismo para esconder os detalhes envolvidos no processamento de uma ao. Por exemplo, quandousamos um telefone, no precisamos lidar diretamente com o circuito interno; a interface do telefone cuidadesse problema.

    PolimorfismoIsso permite o uso de uma nica interface uma nica forma de uso para objetos de tipos diferentes; emparticular, a mesma interface para objetos de uma classe e objetos de classes derivadas dessa.

    HeranaComo o nome sugere, isso permite que uma classe herde de outra suas caractersticas, podendo tambmintroduzir suas prprias ou alterar as caractersticas herdadas. O uso de herana acaba poupando trabalho emelhorando a organizao do cdigo.

    Paradigmas da Programao:Desde o incio da programao, j passamos pelos seguintes paradigmas: No estruturada - exemplos: COBOL, FORTRAN, BASIC (anos 50-60) Procedimental ou Procedural - exemplos: C, Pascal (anos 70) Modular - exemplo: Modula II (anos 80) Abstrao de tipos de dados - exemplo: Ada (anos 80) Programao Orientada a Objetos - exemplos: C++, Java, Delphi (Object Pascal) entre outras. (dcadas

    80-90-2000)

  • Introduo 5

    ObjetosObjeto , genericamente, uma entidade de armazenamento e manipulao de dados. O mesmo deve ser criado paraprocessar os dados que armazena e recebe, sendo sensvel a entradas do programa principal para fornecer as sadasesperadas pelo mesmo. Por estes motivos o objeto deve ser pensado como uma entidade de dados autnoma,encarregada de processar todos os dados que mantm.Da mesma forma que podemos usar tipos de dados nativos da linguagem podemos criar nossos tipos de dados. Nalinguagem C podemos criar tipos de dados compostos que chamamos de estruturas, estes so criados com a palavrachave struct. C++ possibilita o uso de estruturas de dados e introduz um novo tipo chamado de classe. Como onome sugere, uma classe refere-se a um conjunto de caractersticas dadas a um grupo de "indivduos", ou seja, grupode objetos. Por este motivo, classe a definio de tipo de objeto.Em C++ as classes de objetos so criadas atravs da palavra chave class. Esta nomenclatura usada por muitasoutras linguagens de programao mais caracteristicamente restritas a orientao a objetos. Estes aspectos facilitamum pouco o aprendizado por programadores j familiarizados com estas linguagens quando iniciam a programaoem C++.O processo de criao de um objeto segue a sequncia: Definir os dados e procedimentos que a classe deve conter; Criar a classe de objetos; Declarar (instanciar) o objeto.A definio de uma classe de objetos deve ser feita de forma a tornar, preferencialmente, todos os dados protegidosde interferncias de cdigos externos ao objeto. Por este motivo um objeto deve ser uma parte do cdigo doprograma com uma certa autonomia. Este deve ter controle sobre seus dados e ser capaz de prov-los e lidar comeventos a eles relacionados. Dentro de seu escopo de responsabilidades, a entidade deve essencialmente "ter vidaprpria".

  • Al, Mundo! 6

    Al, Mundo!

    Ol mundo! comum, no aprendizado de uma linguagem de programao, que seu primeiro programa faa com que ocomputador exiba "Ol mundo!". Na linguagem C++ este primeiro programa j introduz muitos conceitos sobre alinguagem. Veja o cdigo do nosso primeiro programa:

    #include

    using namespace std;

    int main ()

    {

    cout

  • Al, Mundo! 7

    #endif

    Em sistemas parecidos com UNIX, como GNU/Linux ou FreeBSD, pode-se usar um terminal de linha de comandofacilmente, pois os mesmos possuem o recurso facilmente acessvel, mesmo quando o usurio est usando a interfacegrfica. Por isso, para esses sistemas um comando para solicitar pausa ao sistema no necessrio.

    Entrada de dados e comentrios no cdigoComentrio um recurso muito til em programao. Ele permite que o programador adicione texto ao programapara facilitar o entendimento do programa por parte de outros programadores, ou at dele mesmo. Os comentriosso usados para explicar trechos de cdigo, adicionar clusulas e qualquer texto em geral.Vamos agora para um programa mais completo com entrada de dados e comentrios dentro do cdigo:

    // Este um comentrio de uma linha

    /*

    Este

    um comentrio

    de vrias

    linhas

    */

    #include

    using namespace std;

    int main ()

    {

    int x;

    cout > x;

    cout

  • Al, Mundo! 8

    Ao analisar o cdigo, o preprocessador encontra a sequncia // e vai eliminar o texto que est a seguir at ao fimda linha.Mais uma forma de adicionar comentrios:

    /*

    Este

    um comentrio

    de vrias

    linhas

    */

    A linguagem C++ permite tambm fazer comentrios por mais do que uma linha. Chama-se comentrio por bloco eo que faz eliminar tudo o que encontrar entre a sequncia inicial /* e o final */.A vantagem de termos esta possibilidade poder comentar o nosso cdigo. Existem algumas regras de boa condutapara comentrios que foram criadas por pessoas que j tm muito tempo nisto: Uma criar logo no topo um comentrio a dizer o que o nosso programa, e o que faz numa forma geral; Outra fazer comentrios a cada funo que aparece no cdigo a explicar; Outra comentar uma linha mais obscura, mais difcil de entender, que no bvia; A outra no comentar tudo. O comentar deve ser para sobressair.Esta ltima regra pode ser esquecida quando o programa didtico, neste caso pode-se usar o programa como textocomentado.

    Incluindo cabealhos#include

    O smbolo # uma chamada de ateno ao compilador a dizer que aquela linha para o preprocessador, depoistemos o "include" (que basicamente diz para incluir cdigo). Incluir o qu?Deve incluir o ficheiro/arquivo iostream. (in+out+stream, "fluxo de entrada e sada", padro) (na maioria dasvezes, como entrada padro temos o teclado e como sada temos o monitor) (este ficheiro/arquivo contmdeclaraes das funes e definies que o nosso cdigo fonte ir necessitar)Este cdigo que ser includo chamado de cabealho devido a uma caracterstica evidente, o fato de ser cdigo dedeclarao inicial do programa, que deve estar no topo do arquivo/ficheiro.Existem outros arquivos (ficheiros cabealho), o iostream para fluxos de entrada e sada, mas temos muitosmais para matemtica, manipulao de tempo, tratamento de caracteres, etc...Na maioria das vezes, os arquivos de cabealho fazem parte de uma biblioteca. Podemos ver na parte dos anexos,algumas bibliotecas que existem juntamente com as funes de cada uma. Ns prprios podemos criar umabiblioteca com cdigo e nosso prprio cabealho. E at podemos comprar bibliotecas existentes comercialmente,atravs de empresas especializadas em desenvolvimento, que tambm tero seus arquivos/ficheiros de cabealhos.Mas, o que so bibliotecas? So arquivos com um conjunto de cdigos que algum fez antes. As que enunciamosantes so as "standard", so aquelas que tm as funcionalidades bsicas, pertencentes aos padres da linguagem.Repare-se que precisamos da biblioteca at para escrever (no ecr)/(na tela) (stream + out) que nos permite utilizar ocout.O ficheiro/arquivo iostream est envolvido em < >, isto significa que o preprocessador deve procurar oficheiro/arquivo no stio/diretrio usual (que onde o compilador usa como padro para os "includes"). Setivssemos o ficheiro/arquivo iostream envolvido em "" significaria que o preprocessador deveria procur-lodentro de uma lista de diretrios de incluso, "includes", iniciando pelo diretrio atual.

  • Al, Mundo! 9

    As bibliotecas so compostas por 2 partes: um ndice de todas as funes e definies e declaraes, o cabealho, edepois a definio de todas as funes existentes no ndice, arquivos de cdigo.As diretivas de preprocessamento no terminam com o ponto e vrgula como nas instrues.

    Namespaceusing namespace std;

    Observando esta linha, alguns tradicionais programadores em linguagem C, tm uma novidade: namespaces soespaos de nomes dentro do cdigo, eles funcionam, entre outras coisas, como um meio de evitar duplicao denomes dentro de um projeto extenso, que geralmente contam com inmeros arquivos.O C++ usa os namespaces para organizar os diferentes nomes usados nos programas. Cada nome usado noficheiro/arquivo biblioteca "standard iostream" faz parte do "namespace" chamado de std.O objeto de sada padro, cout, est definido dentro do "namespace" std, ele um objeto da classe "ostream" "outputstream", para acess-lo temos que referenci-lo como "std::cout". Para evitar que tenhamos que informar "std::"todas as vezes que precisarmos usar os recursos deste "namespace", podemos informar que estamos usando-o dentrodo arquivo atual, conforme vemos na linha declarada no incio deste tpico.O "namespace" permite que as variveis sejam localizadas em certas regies do cdigo. Declarar o "namespace std"permite que todos os objetos e funes da biblioteca "standard input-output" possam ser usados sem qualquerqualificaes especficas, desta maneira, no mais necessrio o uso de "std::".Este um conceito avanado que podemos explorar mais, vamos deix-lo para depois.

    Funo "main"int main(){}

    Como na linguagem C, a funo principal de entrada do programa a partir do sistema operacional a funo main.Por isso mesmo ela obrigatria em qualquer programa. Se no existisse uma "main function", no haveria entradapara que o sistema iniciasse o programa.Todas as funes so declaradas e usadas com o operador ( ), assim que o compilador reconhece que estas sofunes. A ideia de ter funes permitir o encapsulamento de uma ideia ou operao, dar um nome a isso e depoischamar essa operao de vrias partes do programa simplesmente usando o seu nome. As funes declaradas comomembros de uma classe de objetos podem ser chamadas de mtodos.Do ponto de vista funcional, um cdigo dentro de uma funo executa operaes em outra parte do programa, queno aquela de onde foi chamada, por este motivo as mesmas contam com um mecanismo de passagem de dados, aodeclarar uma funo indicamos quais os dados que entram e o que ela deve fornecer a quem lhe chamou. Pode-sedizer que, tal qual uma funo matemtica, a funo em C/C++ poder ser substituda, depois de sua execuo, pelovalor que ela retorna, este valor ser especificado antes do nome da funo na declarao da mesma, conformevemos no incio deste tpico.O int significa que a funo vai retornar um inteiro. Existem outros tipos de dados como, por exemplo, os seguintes: int que a abreviatura de inteiro; char que a abreviatura de caratere; float que a abreviatura de "floating point number", ou seja, uma representao para nmero real.Vejamos um exemplo:Quando criamos uma funo soma, obviamente s para ilustrao pois isso no necessrio, podemos fazer:

    int soma(int a, int b)

    { return a + b;

    }

  • Al, Mundo! 10

    Agora imagine que tenhamos que somar 2 e 3, colocando o resultado em outra varivel chamada valor, para istofaremos:

    valor = soma(2, 3);

    Primeiro analisamos qual o resultado e depois substitumos a funo pelo valor que ela retorna:

    valor = 5;

    Simples, no?; - Final de sequncia de instrues

    O ponto e vrgula funciona como ponto final, separa as instrues e contextos. Repare que apenas as funes, oumelhor, as definies de funes e as diretivas de preprocessamento que no tm o ";" importante notar que o cdigo poderia ser todo escrito quase numa linha tipo:

    int main (){int a; cout > a;cout

  • Al, Mundo! 11

    O que esta linha faz colocar o valor que foi digitado numa rea de memria que foi chamada de "a".Da mesma forma que o cout existe para sada de dados, temos outro objeto para entrada atravs do teclado, esteobjeto chamado de Console IN - cin, seguindo a mesma analogia. Observe que o operador >> usado para darideia de que os dados esto vindo do cin para a varivel "a".

    cout

  • Variveis e constantes 12

    Variveis e constantes

    ConstantesCompatvel com a linguagem C, o C++ mantm as constantes bsicas e introduz algumas novas funcionalidadespossibilitadas pelo modificador const.O uso do modificador const tem duas funes principais:1.1. Resguarda da inviolabilidade de valores apontados por ponteiros;2.2. Auxlio na compreenso das caractersticas de funes, durante a implementao.

    SimblicasConstantes simblicas podem ser criadas com as diretivas do preprocessador #define. Neste modo os valores, defato, no so interpretados imediatamente pelo compilador, antes so identificados e substituidos pelopreprocessador no estgio anterior compilao. Por exemplo:

    #define BUFFER_LENGTH 2048

    ...

    ...

    ...

    char data[BUFFER_LENGTH];

    Observe que o valor 2048 ser usado logo abaixo no cdigo, depois que o preprocessador substituir a constantesimblica BUFFER_LENGTH pelo valor que lhe foi atribudo.Note que as constantes so escritas com todas as letras maisculas, isso no uma regra, mas ajuda a identificar oque constante simblica dentro do programa, sendo adotado pela maioria dos desenvolvedores como uma boaprtica de programao.Neste caso, podemos definir valores simblicos compostos, por exemplo:

    #define BUFFER_LENGTH 2048

    #define N_BUFFERS 100

    #define MASTER_LENGTH ( BUFFER_LENGTH * N_BUFFERS )

    ...

    ...

    ...

    char screen[MASTER_LENGTH];

    Os valores podem ser simblicos em formato de cdigo, o que permite criar programas com melhor legibilidade.Para isso podemos colocar expresses com funcionalidades bem definidas substitudas por nomes que asidentifiquem. Por exemplo:

    float a[3];

    #define PRINT_VECTOR cout

  • Variveis e constantes 13

    PRINT_VECTOR;

    Desta forma, todas as vezes que quisermos mostrar o valor do vetor de trs coordenadas podemos usar a constantePRINT_VECTOR.

    LiteraisConstantes literais podem ser declaradas da mesma forma que na linguagem "C", ou seja, podemos definir valoresfixos em qualquer parte do programa, expressando-os diretamente no cdigo atravs de seu valor significativo. Porexemplo, podemos definir nmeros:

    256 //decimal

    0400 //octal

    0x100 //hexadecimal

    Tambm podemos definir valores para caracteres ou cadeias de caracteres, como segue:

    'a' // um caractere

    "abc" // uma cadeia de caracteres

    "\xF3\x23\x12" // uma cadeia de caracteres representada por seus

    valores em hexadecimal

    Temos ainda a possibilidade de declarar constantes compostas por valores e operadores:

    (4.23e14 * (12.75 + 12976.18/36)) // constante composta

    EnumeraesValores enumerados so muito recorrentes nos ambientes de programao, por isso podemos contar com adeclarao de enum em C++ tambm, o que segue a mesma sintaxe que temos em "C":

    enum seq {A,B,C,D};

    seq x;

    ou ainda:

    enum nomes {LANY=100,SANDRA=200,MARCIA=300,RODRIGO=400};

    nomes x;

    Porm, observamos uma diferena: a palavra enum pode ser dispensada na declarao da varivel, enquanto que emC obrigatrio,apesar desta pequena diferena a funcionalidade do recurso a mesma, ou seja, pode-se definirvariveis que assumem estritamente os valores presentes na declarao de enumerao.Este recurso torna-se til na padronizao de valores a serem usados como entrada de funes, por exemplo. Podeser considerada como uma funcionalidade mnemnica, seu uso no altera o cdigo final caso modifiquemos oprograma para que use variveis inteiras ou strings de mesmo valor do enum.A seguinte sintaxe:

    seq x = 3;

    No permitida, mesmo que o valor presente no enum seja avaliado como 3 pelo compilador em tempo de compilao. Isso pode parecer confuso, mas lembre-se de que os valores sero atribuidos pelo compilador, logo isso

  • Variveis e constantes 14

    evita que o mesmo programa seja compilado em ambientes diferentes e tenha comportamento diferente.

    VariveisAs variveis no C++ podem ser usadas da mesma forma que na linguagem "C", porm algumas poucas diferenaspodem ser destacadas, principalmente aquelas que trazem linguagem C++ caractersticas prprias da orientao aobjetos.

    TiposComo na linguagem "C", os tipos nativos do compilador em uso so referenciados por:

    char

    int

    float

    double

    Que correspondem a nmeros com tamanho relativos, com os significados respectivos: caractere, inteiro, pontoflutuante e ponto flutuante de dupla preciso. De qualquer forma a extenso dos mesmos depende da mquina que sepretende programar. Considerando que nem sempre teremos que programar apenas computadores, poderemos terextenses bem distintas dependendo do hardware a ser programado, por exemplo, computadores domsticostipicamente tem processadores de 32 ou 64 bits hoje em dia, enquanto que dispositivos embarcados podem terprocessadores de 8, 16 ou 32 bits. Portanto, o compilador para cada caso atribui faixas diferentes para cada tipo emcada situao.A linguagem C++ introduz o tipo bool, que representa o valor booleano, falso ou verdadeiro, o que no existe nalinguagem "C", porm seu tamanho na memria depende da capacidade de otimizao do compilador usado.Tipicamente os compiladores para computadores usam uma varivel do tamanho de char para representar o valor, oque poderia ser considerado um desperdcio, mas devido abundncia de memria no chega a ser inadequado.Porm em sistemas pequenos h compiladores que armazenam o valor booleano em apenas um bit. Obviamente, se oprocessador possuir recursos de manipulao de bits isso muito til e pode ser usado como um fator de melhoria daqualidade do software desenvolvido. Em outros ambientes, onde a manipulao de bits traga prejuzo para odesempenho usa-se a estratgia padro de desperdiar um pouco de espao em favor de uma agilidade maior nasoperaes. Portanto, embora as variaes de utilizao do espao sejam muitas, o compilador sempre far a maisapropriada para cada ambiente de utilizao da linguagem.

    ModificadoresO C++ conta com os modificadores de amplitude (short,long) presentes na linguagem "C" e modificadores deacesso, alguns exclusivos do C++, que esto diretamente ligados a caractersticas da POO (programao orientada aobjetos). Desta forma descreveremos apenas os tipos relevantes exclusivamente para a programao na linguagemescopo do livro presente sem nos aprofundarmos na teoria por trs dos mesmos. A prtica do uso dos mesmos melhor indicada como meio de aprofundamento do tema.Assim contamos com os modificadores da linguagem "C":

    static

    short

    long

    unsigned

    signed

  • Variveis e constantes 15

    const

    A linguagem C++ introduz um novo modificador chamado const, que tem comportamento variado dependendo dolocal onde est sendo declarado. Sua funo, basicamente, estabelecer um vnculo entre declarao eobrigatoriedade da coerncia no uso do smbolo declarado.A princpio, quando declaramos uma constante com este modificador fazemos com que seja obrigatrio o uso dosmbolo de forma que o mesmo no possa ter seu valor alterado. Assim, se fizermos:

    const int x = 4;

    O inteiro x no poder deixar de ter valor igual a 4. Qualquer tentativa de modificar o valor da constante ao longo doprograma ser reportada como erro pelo compilador. Porm podemos considerar esta funcionalidade como bvia etrivial, ainda temos o uso do modificador de uma forma mais proveitosa, na passagem de parmetros para funes,por exemplo:

    void inhibitX(const int *x)

    {

    ...

    ...

    BASEADDRESS = z*((*x) - 23p*71);

    ...

    ...

    }

    Neste caso, a funo acima recebe um valor inteiro atravs de um ponteiro, que no obrigatoriamente precisa serconstante no escopo fora da funo, porm dentro da mesma a varivel ser constante. Fazendo este simplesprocedimento teremos como fazer com que um smbolo seja varivel fora da funo e constante dentro da mesma, deforma que dentro do escopo da mesma s faamos leituras do seu valor. O artifcio cria duas consequnciasimportantes: a primeira a melhor legibilidade do cdigo, visto que ao usarmos uma funo teremos certeza de queos valores no sero alterados dentro da funo; a segunda que poderemos evitar erros inadvertidos de atribuiode valores varivel quando da construo da funo.

    volatile

    Uma varivel "voltil", como a prpria expresso sugere, uma varivel que pode ser modificada sem oconhecimento do programa principal, mesmo que esta ainda esteja declarada dentro do escopo onde o programa estsendo executado. Isso est relacionado, principalmente a processos concorrentes e "threads", estes podem alterar ocontedo da varivel em eventos fora da previsibilidade do tempo de compilao. Em outras palavras, o compiladorno pode prever com segurana se pode otimizar trechos de programa onde esta varivel se encontra.A palavra reservada volatile destinada as situaes onde uma varivel pode ter seu valor alterado por fatoresdiversos, e portanto, no pode ser otimizada. Usando-a o programador informa ao compilador que no deve interferirna forma com que o programa foi escrito para acesso a esta varivel. Desta forma impede que erros inseridos porotimizao estejam presentes na verso final do executvel.O uso desta palavra implica em mudana no comportamento do compilador durante a interpretao do cdigo. Asclasses de objetos do tipo volteis s podero ser acessadas por rotinas que declarem aceitar como entrada dadosvolteis, da mesma forma que apenas objetos volteis podem acessar variveis volteis. Esta "amarrao" faz comque o uso de tais variveis se torne mais seguro.Podemos declarar variveis volteis da seguinte forma:

    volatile int x;

  • Variveis e constantes 16

    Enquanto que para funes que acessam tais variveis teremos consequncias visveis na montagem do cdigo, porexemplo, se tivermos o seguinte trecho de programa:

    int x = 1265;

    void main_loop()

    {

    while( x == 1265)

    {

    // fazer alguma coisa

    }

    }

    Poderemos ter uma otimizao gerada pelo compilador como segue:

    int x = 1265;

    void main_loop_optimized()

    {

    while( true )

    {

    // fazer alguma coisa

    }

    }

    Considerando que em um programa que foi desenhado para ambiente multitarefa isso no pode ser consideradoverdadeiro, pois o programa pode estar esperando que uma das tarefas modifique o estado da varivel paraprosseguir seu curso, a otimizao acima ser um desastre, uma vez que a funo acima jamais ser encerrada.Para evitar isso fazemos:

    volatile int x = 1265;

    void main_loop()

    {

    while( x == 1265)

    {

    // fazer alguma coisa

    }

    }

    E o compilador no poder mais avaliar que o valor de x pode ser otimizado para o valor corrente, pois informamosna declarao que o valor da varivel pode ser alterado sem seu conhecimento. Desta forma o mesmo no alterar oalgortmo e far o teste da varivel dentro do while.

  • Variveis e constantes 17

    Nomeando tiposA linguagem "C" possui recursos de nomeao de tipos simples e compostos atravs das palavras chaves typedef estruct. Adicionada a estas o C++ acrescenta a palavra chave class. Vejamos como devemos definir um novo tipoatravs desta palavra chave.A palavra class atribui a um conjunto de tipos de dados o estado de modelo de objeto. Este conceito fundamentalpara o modo avanado de programar usando o C++. Com este identificador declaramos objetos, da mesma forma quedeclaramos estruturas.Uma classe pode ser definida em um cabealho "header", da seguinte forma:

    class nome_da_classe

    { variavel_1;

    variavel_2;

    .

    .

    .

    variavel_n;

    -----

    nome_funcao ( variavel_1, variavel_2, variavel_3 ...);

    };

    O mais interessante de observar a presena de uma funo dentro da declarao acima. Ento poderamosperguntar: Por que colocar uma funo dentro de um tipo? A resposta simples: Para manipular os dados dentro dotipo! No apenas por esta caracterstica, mas por vrias outras que aboradaremos nos captulos seguintes, o tipo class extremamente flexvel e poderoso. importante ressaltar que em C++ a declarao do identificador: enum, struct, class, etc... dispensado quando sedeclara uma varivel ou objeto para o referido tipo. Desta forma podemos ter tambm as seguintes declaraes comovlidas, alm do uso padro da linguagem "C":

    struct data{ int a;

    int b;

    int c;

    };

    class object{ int a;

    char b;

    long w;

    float p;

    void getData();

    };

    ...

    ...

    ...

    ...

    void func()

    { data x;

    object y;

  • Variveis e constantes 18

    ...

    ...

    y.getData();

    }

    Como podemos ver na funo acima se a varivel x for declarada para uma estrutura data o uso da palavra structno obrigatrio, assim como tambm no o para outros tipos de dados compostos.

    Ponteiros

    PonteirosEm linguagem "C", podemos definir variveis ponteiro, ou seja, variveis que armazenam o endereo de outrasvariveis. Este recurso largamente explorado pela linguagem, embora que deva ser usado com cautela poriniciantes devido ao seu poder destrutivo. Como linguagem "irm mais nova" o C++ tambm permite o uso deponteiros, o que a distingue de muitas outras linguagens orientadas a objeto. Embora seja muito difundida a idia dacriao de linguagens que no suportem acesso a ponteiros, basicamente pressupondo que todos os programadoresso inexperientes, a falta deste recurso limita as capacidades de interao de programas com o hardware. Em outraspalavras, a falta de um meio de manipular ponteiros faz a linguagem limitada ou dependente de fabricantes debibliotecas que acessem o hardware.A disponibilidade do uso de ponteiros em C++ agrega um poder a mais ao conjunto da linguagem, porm implica emnecessidade de cautela na elaborao de programas que usam deste recurso. Certamente, nem todos osprogramadores precisam ser considerados inaptos, a priori, atravs da supresso ou insero de complicadores derecursos criados explicitamente para for-los a no usar dos recursos. Por isso, a linguagem C++ disponibiliza orecurso para quem deseja utiliz-lo e tambm apresenta diversos outros recursos que so alternativas ao uso deponteiros quando eles no so imprescindveis.

    O operador *O operador *, chamado de apontador, funciona em C++ da mesma forma que em C. Considerando que tenhamosuma varivel ponteiro p: Em p armazena-se o endereo de memria que queiramos manipular. Na maioria das vezes obtemos o endereo

    de outra varivel e colocamos em p; Se p um ponteiro, *p o valor apontado por p, ou seja, o valor que est armazenado no endereo de memria

    que queremos ler ou alterar.Na declarao de variveis, uma varivel declarada com * um ponteiro.Exemplo:

    int *px;

    Muitas vezes, iniciantes podem se sentir confusos porque quando declaramos um ponteiro usamos o * e quandoatribumos endereos a ele no usamos o *. A conceituao bsica a seguinte: Declaramos o ponteiro com *, para que o compilador identifique que a varivel um ponteiro; Usamos o ponteiro sem *, para acessar o endereo que ele aponta na memria; Usamos o ponteiro com *, para acessar o valor do dado armazenado na posio de memria;

  • Ponteiros 19

    O operador &Na linguagem "C", o operador & tem duas funes bsicas, funciona como operador da funo lgica AND e comooperador de leitura de endereos. Para operaes com vetores, isso usado da seguinte forma:

    int a = 12;

    int *pa;

    ...

    ...

    pa = &a;

    ...

    ...

    *pa = 100;

    Ou seja, declaramos a varivel a, depois declaramos um ponteiro pa, atravs do operador & obtemos o endereo de ae atribumos o valor 100 varivel usando o ponteiro ao invs da varivel a. Desta forma alteramos o valor de aindiretamente.Um outro uso de & (que no tem similar em "C") pode ser visto mais adiante, em ../Referncias de dados/, mas, paraisto, necessrio estudar o que so ../Funes/.

    O ponteiro "this"Imagine que tenhamos criado um objeto qualquer de uma classe X, se quisermos ter acesso ao ponteiro que contm aposio de memria onde est armazenado este objeto basta chamar o ponteiro "this". O ponteiro "this" uma dascaractersticas dos objetos em C++ e algumas outras linguagens que suportam orientao a objetos. Ele ummembro inerente a todos os objetos que instanciamos em programas escritos em C++.Faremos uma breve explanao a respeito de objetos para esclarecer este tpico. Objeto so parecidos comestruturas, uma diferena bsica que estes possuem "habilidades especficas" representadas por funes que estodentro do seu escopo. Vejamos um exemplo:

    struct Data

    { int x,y;

    int get_x(){ return x;}

    int get_y(){ return y;}

    int set_x(int a){ return x=a;}

    int set_y(int b){ return y=b;}

    };

    Observe que a estrutura acima, apresenta dois inteiros e duas funes para cada um deles, uma que atribui o valor eoutra que l o valor de uma das mesmas. Detalhes das implicaes a respeito desse modo de operar os valores serodados nos captulos seguintes que tratam de objetos. Por ora vamos nos ater a um conceito fundamental importantepara a noo de ponteiros em C++, a identidade de um objeto.Veja, temos uma estrutura de dados que est na memria, os dados esto l (variveis x e y), porm as funes noestaro l, pois se tivssemos que copiar uma funo para cada estrutura que crissemos o programa tomaria umtamanho monstruoso. O que se faz apenas guardar o endereo da estrutura em um ponteiro especial, o ponteirothis. Assim, o compilador poder criar uma nica cpia de funo para todas as estruturas que criarmos e depoisquando a funo quiser manipular os dados de uma estrutura em particular, o far atravs do ponteiro this.Examinemos os detalhes mais de perto... Digamos que instanciemos um objeto "A" da classe Data:

  • Ponteiros 20

    Data A;

    A.set_x(2);

    A.set_y(7);

    Para acessar estas funes o compilador far:

    Data A;

    A.set_x(2);

    // { Data *this = &A;

    // return this->x = 2;

    // }

    A.set_y(7);

    // { Data *this = &A;

    // return this->y = 7;

    // }

    Desta forma podemos perceber como diferentes conjuntos de dados podem ser manipulados pela mesma funo.Quando declaramos uma funo dentro de uma estrutura de dados esta rotina recebe um ponteiro com o endereo doconjunto de dados que deve tratar toda vez que for invocada pelo programa. Assim, sempre acessar os dados atravsdeste ponteiro, o this. Como todos os objetos precisam ser identificados por esse ponteiro, ele definido paraqualquer objeto com o mesmo nome: this.

    Vetores

    Vetores e MatrizesFaamos uma pequena reviso de conceitos: Vetores e matrizes so variveis compostas homogneas, ou seja, so agrupamentos de dados que

    individualmente ocupam o mesmo tamanho na memria e so referenciados pelo mesmo nome, geralmente soindividualizadas usando-se ndices.

    Vetores distinguem-se das matrizes apenas pela caracterstica de ter dimenso (1 x n) ou (n x 1), essencialmentevetores so matrizes linha ou matrizes coluna.

    Em linguagem "C" vetores e matrizes so usados abundantemente para compor estruturas de dados necessrias paracomposio de diversos recursos. Esta usa, mais explicitamente, vetores de caracteres para definir cadeias de texto, oque conhecido como o mais trivial uso de vetores. Alm deste recurso, o "C" tambm define meio de criao dematrizes tipo (n x m), provendo, desta forma os recursos necessrios para criao destes conjuntos de dados.A linguagem "C++" suporta os mesmos recursos e permite a criao de matrizes de objetos. Uma vez que um objeto essencialmente um tipo de dado criado pelo programador, todas as caractersticas bsicas legadas aos "tipos" emgeral so observados nos tipos criados (classes de objetos).

  • Vetores 21

    VetoresOs vetores em C++ seguem a mesma notao da linguagem "C", via de regra declara-se o tipo seguido de umasterisco. Para acessar o valor apontado pela varivel usa-se um asterisco de forma semelhante, como pode ser vistono trecho de cdigo abaixo:

    int *x;

    int a = 3;

    x = &a;

    cout

  • Vetores 22

    equivalente a soma de suas variveis internas para ser alocado na memria.

    Declarando arranjoOs arrays permitem fazer o seguinte:

    int a1, a2, a3,.a100; equivalente a ter int a[100];

    Ou seja permite declarar muitas variveis de uma forma bem simples, poupa escrita e bastante compreensvel. O nmero que est dentro de brackets [] o size declarator. Ele que vai permitir ao computador dizer quantas

    variveis a serem geradas e logo quanta memria dever ser reservada. A memria reservada para as variveisvo ser todas seguidas, um int a seguir ao outro

    H uma forma para no dizer o valor deste size declarator, mas isso apenas acontece antes da compilao, ou sejao compilador que vai fazer esse preenchimento por ns, visualizando o nosso cdigo e contanto os membros quecolocmos. Isto um automatismo dos compiladores recentes. chama-se a isto iniciao implcita que vamos vernesta seco.

    As variveis geradas pelos arrays vo ser todos do mesmo tipo. Reparem que o valor do size declarator um nmero. literal, ele no vai mudar quando o programa estiver a

    correr. Por isso quando no soubermos o nmero de elementos o que fazemos?Veja uma tentativa:

    #include

    using namespace std;

    int main ()

    {

    int numTests;

    cout > numTests;

    int testScore[numTests];

    return 0;

    }

    Isto vai dar um erro de compilao, porque o array est a espera de uma constante e no uma varivel. H umamaneira de contornar isto que atravs da memria dinmica que vamos dar mais tarde, num capitulo prprio, poisisto vai envolver muitos conceitos.

    ConstantesReparem que h uma diferena entre literais e constantes, apesar de em ambos os casos o valor no alteradodurante a execuo do programa, a constant um nome que representa o valor, o literal o valor.

    Declarar constantes exatamente como declarar uma varivel com duas diferenas:1.1. A declarao comea com a palavra const. Isto vai dizer ao compilador que uma constante e no uma varivel2.2. Teremos de atribuir logo o valor na declarao, ou seja, fazer a iniciaoExemplo:

    const int numTests = 3;

    Portanto se tentarmos colocar um outro valor ao numTest, isso vai dar um erro de compilao

  • Vetores 23

    Array index

    a[100] composto por a[0], a[1], a[99] ( De a[0], a[1], a[99] existe 100 posies)

    Pergunta: Porque que o ndex comea em zero e no um? Ou seja temos as 100 posies que pedimos mas o ndexcomea no zero e no no 1. A razo disto tem a ver com offset que refere ao valor adicionado para o endereo basepara produzir a segunda address. Bem no entendi bem! Eu explico de novo: O endereo (address) do primeiroelemento do array, o mesmo do que o endereo base do prprio array. ah espera a, o que esto a dizer que oendereo do array igual ao do primeiro elemento do array. Assim o valor que teria de ser adicionado, ao endereobase do array, para conseguirmos o endereo do primeiro elemento seria zero. Agora sim, percebi!Erro: Um erro comum esquecer que o index comea no zero, e portanto quando se querem referir ao ltimoelemento, esquecem-se que tm de subtrair uma unidade. O que advm desse esquecimento que podem estar aalterar memria pertencente a uma varivel, instruo,..de um outro programa. Ou seja vai existir violao dedados.Se o array for declarado globalmente em vez de ser localmente, ento cada elemento inicializado ao valor defautque zero.

    IniciaoIniciao, se bem se recordam atribuir um valor a uma varivel ao mesmo tempo que declaramos a varivel.Podemos fazer a iniciao de um array de 2 maneiras:1) explicit array sizing

    int testScore[3] = { 74, 87, 91 };

    float milesPerGallon[4] = { 44.4, 22.3, 11.6, 33.3};

    char grades[5] = {'A', 'B', 'C', 'D', 'F' };

    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"};

    Pergunta: O que que acontece se dermos mais valores de atribuio do que elementos do array?

    int a[3] = { 74, 87, 91, 45 };

    Isto vai dar um erro de compilao too many initializersPergunta: O que que acontece se tivermos menos valores do que os elementos

    int a[3] = { 74 };

    No acontece nada simplesmente no temos valores para a[1] e a[2]. Porm em alguns compiladores os elementosno inicializados ficam com os valores defaut, que no caso dos ints 0 no caso dos floats 0.0 e nos caracteres ocaractere nulo ("\0"). No entanto se no inicializarmos um dos elementos, os restantes elementos tero de ser noinicializados pois caso contrrio teremos um erro de compilao2) implicit array sizing

    int testScore[ ] = { 74, 87, 91 };

    float milesPerGallon[ ] = { 44.4, 22.3, 11.6, 33.3};

    char grades[ ] = {'A', 'B', 'C', 'D', 'F' };

    Aqui o compilador faz o trabalho por ns, conta os elementos e preenche o nmero de elementos

  • Vetores 24

    Caracter arraychar name[ ] = {'J', 'e', 'f', 'f', '\0' };

    char name[ ] = "Jeff";

    Ambas as inicializaes so permitidas. Porm tomar ateno ultima iniciao! Quando colocmos as aspas duplaso compilador acrescenta o "\0" na array que cria! No tem []!! Esta at costuma ser a preferida pelos programadores, ao estilo de strings (Na verdade as strings so arrays de char mas vamos falar disso num capitulo prprio)O char "\0" o escape sequence para caracterer null. Este escape sequence sinaliza ao cout o fim do character array. o ltimo elemento do array preenchido! Se no tivssemos este carcter apareceriam estranhos caracteres a seguirao "jeff", chamados "caracteres-lixo". (porqu?) Isto no significa que o ltimo elemento deva ser sempre o nullcarcter

    Arrays de vrias dimensesPodemos ter duas dimenses

    tipo_da_varivel nome_da_varivel [altura][largura];

    como tambm poderamos ter infinitas

    tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];

    Iniciandofloat vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };

    int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

    char str [10] = { 'J', 'o', 'a', 'o', '\0' };

    char str [10] = "Joao";

    char str_vect [3][10] = { "Joao", "Maria", "Jose" };

    Peguemos no exemplo:

    int a [2][3]={1,2,3,4,5,6,}

    Na memria teramos as coisas assim. ou seja os elementos so seguidos e do mesmo tipo

    a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

    1 2 3 4 5 6

    Portanto ter int a [2][3] equivalente a ter int a [6] o nome que se d que diferente.Pergunta: ser pedido espao par 6 ints ou antes um espao com o tamanho de 6 ints? Como ns sabemos que osarrays os elementos tm endereos de memoria consecutivos, por isso, no podem ser pedidos 6 ints, pois se fosseesse o caso, poderia acontecer que eles no ficassem juntos.

  • Vetores 25

    Const Constant arraysconst int daysInMonth [] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    Recordar que temos de inicializar quando queremos fazer uma constante array

    Atribuir valores ao array#include

    using namespace std;

    int main ()

    {

    int testScore[3];

    cout > testScore[0];

    cout > testScore[1];

    cout > testScore[2];

    cout

  • Vetores 26

    {

    int testScore[MAX];

    for (int i = 0; i < MAX; i++)

    {

    cout

  • Vetores 27

    }

    Vamos torn-lo mais modular, escrevendo uma funo para atribuir valores ao array e outa funo para mostrar osvalores do array

    #include

    using namespace std;

    void assignValues(int[], int);

    void displayValues(int[], int);

    const int MAX = 3;

    int main ()

    {

    int testScore[MAX];

    assignValues(testScore, MAX);

    displayValues(testScore, MAX);

    return 0;

    }

    void assignValues(int tests[], int num)

    {

    for (int i = 0; i < num; i++)

    {

    cout

  • Vetores 28

    }

    Este exemplo por acaso est muito curiosoPergunta: mas agora deveramos perguntar se neste caso tnhamos uma passagem por valor ou referncia.Quando um array passado para uma funo, a funo recebe no a cpia do array mas invs disso o endereo,address do primeiro elemento do array, que igual ao valor do array (base).Assim todas as modificaes que se efectuarem na funo que foi chamada iro repercutir-se no array passado.Vamos confirmar:

    #include

    using namespace std;

    void doubleThem(int a[], int size);

    int main()

    {

    int a;

    int myInts[10] = {1,2,3,4,5,6,7,8,9,10};

    doubleThem(myInts, 10); //passei o array base

    for (a=0; a

  • Estruturas 29

    Estruturas

    Breve reviso

    ConceitoDa linguagem "C" tambm temos o conceito de estrutura, do qual faremos uma pequena reviso agora. Como todossabemos, nem todos os dados que precisamos usar podem ser agrupados em matrizes. Frequentemente usamos dadosde diversos tipos diferentes, com tamanhos diferentes. Para tipos de dados de diferentes tamanhos existem estruturasde armazenamento de dados heterogneos.O especificador struct usado para esta finalidade. Com ele podemos criar tipos que armazenam dados compostospor agrupamentos de outros tipos primitivos da linguagem. Geralmente, os dados so armazenados de forma afacilitar a identificao de cada campo de dados que pretende-se manter, para isso usamos nomes para cada campodentro da estrutura de dados, de forma a ter um meio de acess-la depois.Estruturas so blocos bsicos de informao e so manipulados de maneira primitiva. Basicamente o compiladorinstrui a montagem de um cdigo que manipula-as de forma a copiar, referenciar e obter posio na memria. Todasas outras formas de tratar os dados devem ser providas pelo cdigo do programa.

    ImplementaoPara criar um tipo de dados composto heterogneo, basicamente, cria-se uma lista de tipos e nomes de variveisseparadas por ponto e vrgula. Podemos imaginar esta lista como um bloco de cdigo, em linguagem C, onde estopresentes apenas as declaraes de variveis. Para isso temos a seguinte sintaxe:

    struct Estrutura

    {

    NomeVariavelA;

    NomeVariavelA2;

    NomeVariavelA3;

    NomeVariavelB;

    NomeVariavelC;

    NomeVariavelD;

    ...

    ...

    NomeVariavelZ;

    } [];

    O nome da varivel composta pode ser omitido na declarao da estrutura e depois definido onde for maisapropriado, geralmente, dentro de algum bloco de cdigo onde venha a ser usado. Podemos ver logo abaixo, oexemplo de uma declarao de estrutura:

    struct Estrutura

    {

    int Inteiro;

    double PontoFlutuante;

    char Caracteres[10];

    };

  • Estruturas 30

    int main()

    {

    Estrutura MinhaVariavelComposta;

    ...

    ...

    ...

    return 0;

    }

    Acessando dados internosO modo de acesso a variveis internas de uma estrutura feito atravs do operador ponto ".", porm, quando usamosponteiros para guardar o endereo de uma estrutura usamos o operador seta "->". Vejamos um pequeno trecho decdigo:

    Estrutura st;

    Estrutura *pst;

    st.Inteiro = 200;

    pst = &st;

    pst->PontoFlutuante = 23.976;

    Estruturas em C++As estruturas em C++ funcionam de modo anlogo ao apresentado em linguagem "C". A diferena, a princpio,notvel entre elas nas duas linguagens que em "C++" o especificador struct no precisa ser escrito quando criamosa estrutura:Em C, para criar uma estrutura de dados chamada st, declaramos:

    struct Estrutura st;

    Para fazer o mesmo em C++, declaramos:

    Estrutura st;

    Este simples detalhe revela uma caracterstica importante das estruturas em C++: Nesta linguagem as estruturas sotratadas como tipos primitivos de objetos. Elas tm caractersticas semelhantes s classes, que veremos nos captulossubsequentes.As estruturas em C++ tambm podem conter funes alm de dados. Este fato vem da ideia de modelo de objeto queas estruturas mantm nesta linguagem. Objetos devem ter propriedades (variveis) e mtodos (funes membro), porisso temos a possibilidade de criar funes dentro do corpo das estruturas, com a finalidade de lidar com os dadosque elas mantm.

  • Estruturas 31

    ConstrutoresOs construtores so funes que so criadas automaticamente sempre que tentamos criar um objeto. Eles funcionamda mesma maneira que construtores de classe. A esses que so criados automaticamente so os chamados de defaut.Se escrevermos o cdigo:

    #include

    #include

    using namespace std;

    const int MAX = 3;

    struct Person

    {

    string name;

    int height;

    };

    int main ()

    {

    Person p1;

    cout

  • Estruturas 32

    #include

    #include

    using namespace std;

    const int MAX = 3;

    struct Person {

    string name;

    int height;

    Person()

    {

    name = "No name assigned";

    height = -1;

    }

    };

    int main ()

    {

    Person p1;

    cout

  • Estruturas 33

    };

    int main ()

    {

    int metro;

    string strName;

    cout metro;

    cin.ignore();

    Person p1(strName,metro);

    cout

  • Estruturas 34

    int metro;

    string strName;

    cout metro;

    cin.ignore();

    Person p1(strName, inches);

    cout

  • Operadores 35

    operaes e alter-las quando nos seja conveniente.

    Entendendo o operadorBasicamente, temos dois tipos de implementao para operadores, o tipo global e o tipo membro de classe. Os doistipos so usados regularmente nas implementaes mais comuns. Analisaremos o tipo global, uma vez que ainda notemos uma noo de classes suficiente para abordar o tipo membro de classe.Digamos que temos uma estrutura ponto, como definida abaixo:

    struct Ponto

    { int x;

    int y;

    };

    Uma vez que tenhamos definido um ponto, nada mais natural que queiramos somar, subtrair, enfim operar, pontosdiferentes de acordo com nossas necessidades. Para isso podemos criar operadores para fazer isso, da seguinte forma: Observamos a quantidade de parmetros, o retorno e a forma de chamar o operador que queiramos definir e

    criamos uma funo que execute a operao desejada; Inserimos o cdigo da referida funo dentro de uma chamada de operador, usando a palavra reservada operator

    seguida do operador que desejamos definir:

    Ponto operator+ ( Ponto a, Ponto b )

    { Ponto soma;

    soma.x = a.x + b.x;

    soma.y = a.y + b.y;

    return soma;

    }

    E assim, o operador entendido como uma funo, sendo a sobrecarga um processo de definio da operao a serexecutada. Recebe esse nome porque todo operador j existe e a definio de uma nova funcionalidade apenasadiciona (sobrecarrega) as habilidades anteriores do operador. Embora isto seja comum, bom lembrar queoperaes de tipos primitivos no podero ser modificadas, restando apenas a funcionalidade de criar operadorespara nossos tipos (classes).

    Os argumentosAgora vejamos como os argumentos so vistos pelo compilador durante a chamada ao operador. Essa sintaxe, muitasvezes, confunde iniciantes, mas bastante intuitiva. Veja:c = a + b;

    Consideremos que a,b,c so pontos. Em termos gerais, qualquer operador binrio (com dois argumentos) definido emescopo global, receber a e b como primeiro e segundo argumento da funo que define o operador.Podemos ver a chamada da seguinte forma:

    c = operator+( a, b );

  • Operadores 36

    Operadores aritmticosOperadores aritmticos so utilizados para efetuar operaes matemticas entre dados. So 5 operadores aritmticosem C++:

    #include

    using namespace std;

    int main() {

    int soma = 5 + 5; // o operador '+' realiza somas.

    double subtracao = 5 - 5; // o operador '-' efetua subtrao.

    float multiplicacao = 5.1 * 0.5; // o operador '*' efetua

    multiplicao.

    char divisao = 100 / 2; // o operador '/' efetua diviso.

    int modulo = 51 % 5; // retorna o resto da diviso inteira.

    cout

  • Operadores 37

    Diviso real

    A diviso real aquela efetuada entre tipos ponto flutuante ou entre ponto flutuante e inteiros/caracteres. Issoefetuar a diviso at que o resto seja zero, ou quando o resto repetir-se indefinidamente (no caso de dzimasperidicas como, por exemplo, 10/3).Se quisermos que a diviso entre inteiros retorne a diviso real, deveremos efetuar uma converso explcita,conforme o exemplo:

    int num = 3;

    int num2 = 2;

    cout

  • Deciso e controle de fluxo 38

    if-else

    if

    Se voc quer que o software execute um determinado comando somente em certas situaes, utilize if paradeterminar isto. O programa vai, ento, executar a primeira linha de cdigo aps o if, se a declarao entreparnteses for verdadeira. Exemplo:

    #include

    using namespace std;

    int main(void) {

    int variavel;

    cout > variavel;

    if(variavel == 5)

    cout

  • Deciso e controle de fluxo 39

    booleano falso.Podemos ainda encadear vrios else, e obter ainda mais possibilidades:

    if(deposito < 20) {

    cout

  • Deciso e controle de fluxo 40

    Cada um dos casos tem de ser uma constante (no pode alterar durante a vida do programa), neste exemplo A, B,

    O defaut serve para a condio de todas as avaliaes dos casos anteriores der falsa. ( tipo o else) O break serve para terminar o switch, caso contrrio se num dado case fosse verdadeiro, iria executar todos os

    statementes mesmo de outros cases at terminar o switch. Aqui para cada caso no necessitamos de {} se tivermos mais do que 2 statements. o if-else mais forte do que o switch por que permite fazer coisas como:

    if (apples == oranges)

    do this;

    else if (sales >= 5000)

    do that;

    Para alm do ponto j dito de os casos serem obrigatoriamente constantes, no switch Tambm posso utilizar operadores lgicos no switch

    switch (age >= 18 && citizen == true)

    {

    case true:

    cout

  • Deciso e controle de fluxo 41

    5>3 ? a : b // returns the value of a, since 5 is greater than 3. a>b ? a : b // returns whichever is greater, a or b.

    O Comando gotoO goto realiza um salto para um local especificado. Este local determinado por um rtulo. Portanto pode ser emqualquer parte do programa.

    nome_do_rtulo:

    ....

    goto nome_do_rtulo;

    ....

    // goto loop example

    #include

    using namespace std;

    int main ()

    {

    int n=10;

    loop:

    cout

  • Estruturas de repetio 42

    Estruturas de repetioLaos (loops em ingls), ou estruturas de repetio, so comandos existentes nas linguagens de programaodestinados a executar uma ou mais instrues quantas vezes forem necessrias. Cada ciclo de um loop chamado deiterao. Podemos ter tambm loops dentro de outro loop.

    WhileO while, "enquanto" em ingls, um lao que ordena o computador a executar determinadas instrues enquantouma condio for verdadeira. Isso faz com que um comando seja executado uma vez a cada verificao da condio.De modo geral o comando sempre deve ser elaborado de forma que se leve a condio de execuo a ser falsa emalgum momento, de forma a interromper o lao para que o resto do programa entre em execuo.

    Sintaxewhile (condio)

    comando;

    Onde condio a condio de execuo do lao while.O cdigo abaixo mostra o uso do lao while para imprimir na tela do nmero 1 ao nmero 10. Perceba o uso de umavarivel inteira intitulada contador. Esta varivel utilizada para armazenar um valor a ser impresso bem comoparticipar da condio de execuo do lao. Assim que a varivel atingir o valor 11 o programa segue para ocomando logo aps o lao.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel contador.

    contador=1; // contador recebe o valor 1.

    while (contador

  • Estruturas de repetio 43

    Do-WhileO lao do-while um while invertido, onde voc coloca as instrues a serem repetidas antes da verificao dacondio de execuo. Isso significa que os comandos do lao sero executados ao menos uma vez.

    Sintaxedo {

    comando;

    } while (condio);

    Onde condio a condio de execuo do lao do-while. Os comandos pertencentes ao lao somente deixaro dese repetir quando a condio for falsa.O algoritmo abaixo mostra como seria o algoritmo exemplo usado na seo do lao while convertido para o uso dolao do-while.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel contador.

    contador=1; // contador recebe o valor 1.

    do {

    cout

  • Estruturas de repetio 44

    fixo, dez no algoritmo em questo.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel

    contador.

    for (contador=1; contador

  • Estruturas de repetio 45

    Dicas

    Bloco de ComandosEm muitos casos, os laos devem repetir dois ou mais comandos. Para isso, necessitamos criar um bloco decomandos contendo todas as instrues a serem repetidas. A criao de um bloco de comandos simples, bastacolocar todos os comandos entre chaves { }. Os algoritmos de exemplo dos laos while e do-while fazem uso de umbloco de comandos.Caso o lao no encontre a abertura de um bloco logo em seguida, ele assumir que o comando imediatamenteabaixo o nico que deve ser repetido.Exemplo 1:

    while (condio)

    comando1; // Este comando faz parte do lao.

    comando2; // Este comando no faz parte do lao.

    Exemplo 2:

    while (condio)

    {

    comando1; // Este comando faz parte do lao.

    comando2; // Este comando faz parte do lao.

    }

    O Comando breakO que o break faz quebrar a execuo para fora do bloco de cdigo onde ela est presente

    #include

    using namespace std;

    int main(void)

    {

    int num;

    char choice;

    bool quit = false;

    while (true)

    {

    cout > num;

    if (num > 0)

    break;

    else

    {

    cout > choice;

    if (choice != 'Y')

    {

    quit = true;

    break;

    }

  • Estruturas de repetio 46

    }

    }

    if (quit == false)

    cout

  • Estruturas de repetio 47

    int num = 2;

    cout

  • Estruturas de repetio 48

    cout

  • Funes 49

    FunesFuno, do latim functio, onis, representa na computao, um pequeno algoritmo com uma funo simples e bemdefinida. como se cada funo fosse um micro programa, ou um tijolo na construo do programa principal. O usode funes facilita muito o desenvolvimento, pois, divide o problema principal em pequenos problemas maissimples. Essa tcnica se chama, Dividir para conquistar.A experincia mostra que o uso de funes facilita e acelera a criao e manuteno de sistemas.Todo programa em C++ tem pelo menos uma funo, o main. Veja o exemplo do programa em C++:

    #include //Biblioteca com funes de entrada e sada de dados

    using namespace std;

    int main (void) //Funo principal do programa

    {

    cout

  • Funes 50

    int i_f,i_c; //if is a reserved word

    df = 75.0;

    ff = 75.0;

    i_f = 75;

    // The compiler resolves the correct

    // version of ConvertFToC based on

    // the arguments in each call

    cout

  • Funes 51

    Parmetros default (padro)Pode acontecer que tenhamos que declara varia vezes o mesmo valor como parmetro de uma funo. Parasimplificar a chamada a funes que variam pouco podemos definir uma parmetro default.

    #include

    #include

    /*-----------------------------Cabealho--------------------------------*/

    /*Definimos uma funao*/

    void function(int a,int b, int c = 100 )

    {

    printf("Meu Primeiro argumento :%d\n",a );

    printf("Meu Segundo argumento :%d\n",b );

    printf("Meu terceiro argumento :%d\n",c );

    getchar();

    }

    int main (void)

    {

    function( 10, 30);

    /* Agora use a funo assim e veja o que acontece */

    // function( 10,30,999);

    }

    Os parmetros por default devem ser os ltimos da lista, ou seja, mais direita. O parmetro padro deve serespecificado no prottipo e no na declarao da funo.

    Referncias de dados

    Variveis de refernciaEm C++ podemos criar variveis que podem ser uma alternativa para os ponteiros em algumas situaes. Avantagem de no usar diretamente o endereo (valor de ponteiro) em situaes onde no precisamos lidardiretamente com valores de memria torna a programao mais segura e simplificada. Podemos deixar as operaescom ponteiros apenas para quando for estritamente necessrio.Variveis de referncia podem ser criadas para dar um nome diferente para as variveis que j existem no programa,ou para passar a varivel para dentro do corpo de uma funo. Observemos, inicialmente, um caso simples:

    int a = 10;

    int &b = a;

    b = 20;

    Neste trecho de programa, criamos uma varivel de referncia b para a varivel a, o que significa que criamos outronome para a varivel a. De fato, b a prpria varivel a com outro nome, apenas isso. Desta forma, podemos alteraro valor de a usando b.

  • Referncias de dados 52

    Passagem de parmetrosNa linguagem "C", durante a chamada de uma funo, os argumentos (parmetros) tm seus valores copiados para area de processamento da funo. Depois que os mesmos foram usados dentro do bloco de processamento da funo,eles so descartados. A funo retorna o processamento para o bloco que a chamou trazendo apenas o valor deretorno. A nica maneira de fazer com que a funo modifique o valor de alguma varivel definida no bloco deprograma que a chamou pass-la por um ponteiro com o seu endereo.Vejamos o fragmento de cdigo seguinte:

    int f( int x )

    {

    x--;

    return x;

    }

    int main()

    {

    int a = 10;

    int b;

    b = f(a);

    ...

    ...

    Em "C", a menos que o programador seja bem malicioso e faa manipulaes de memria arriscadas, a funo fjamais alterar o valor do seu argumento x.Diferentemente da linguagem "C", a chamada a uma funo em C++ pode alterar o valor de uma varivel definidaantes da chamada da funo, mesmo sem esta varivel ser explicitamente passada como um ponteiro. Este modo chamado de passagem por referncia. Em termos mais gerais, significa a passagem da varivel propriamente dita,para o corpo interno da funo com outro nome, aquele definido na lista de parmetros da funo.Em C++, uma funo pode ser chamada na forma acima e alterar o valor das suas variveis. Para isso bastadeclar-la como:

    int function(int & x)

    {

    x--;

    return x;

    }

    Temos em C++ o operador & que se comporta diferentemente de C, tendo uma funo a mais, a de criar variveis dereferncia: &x quando usado no cdigo retorna o pointero para o endereo de x; &x quando usado na declarao de varivel, cria uma referncia; &x quando usado como parmetro na declarao de uma funo faz com que suas chamadas transfira o

    argumento/parmetro passando-o de forma similar a passagem de seu pointero. (Passagem por referncia).Em termos semnticos, ao passar a varivel para uma funo onde o parmetro uma referncia, o endereo davarivel atribudo ao endereo do parmetro. Desta forma, o parmetro a mesma varivel passada, no trecho decdigo onde a funo foi invocada, assumindo um nome diferente dentro da funo.Vejamos um exemplo usando a funo anterior:

  • Referncias de dados 53

    int m = 4;

    function(m);

    cout

  • Referncias de dados 54

    int &ref = val1;

    cout

  • Referncias de dados 55

    Comparao entre passagem por referncia e ponteirosPara exercitar vamos criar um novo problema: Criar um funo que duplique qualquer valor colocado peloutilizador:

    1 PROGRAMA-via referncia 2 PROGRAMA via ponteiros - endereos

    #include

    using namespace std;

    void doubleIt(int&);//prototype com endereo de variavel

    int main ()

    {

    int num;

    cout > num;

    doubleIt(num); //chamo funo, passando parametro num

    cout

  • Entrada e sada de dados 56

    Entrada e sada de dados

    Entrada e sadaAqui vamos dar incio ao estudo de recursos que possibilitaro inserir dados e fazer reporte da falta deles.No C++ a entrada e sada podem ser feitas atravs da biblioteca iostream. Para podermos us-la deveremos colocar alinha de cdigo: #include A estrutura de comunicao com o meio externo em modo texto composta por um conjunto de objetos. Estas, emconjunto com operadores e funes de formatao possibilitam uma forma de comunicao mais intuitiva. Devido abstrao de elementos do mundo real por recursos da orientao a objetos, a forma de entender o cdigo torna-semais natural.Na biblioteca iosteam, temos os seguintes objetos: cin - Este objeto fornece entrada de dados "bufferizada" atravs do "standard input device", o dispositivo de

    entrada padro; cout - Este objeto fornece sada de dados "bufferizada" atravs do "standard output device", o dispositivo de sada

    padro; cerr - Este objeto fornece sada de dados no "bufferizada" para o standard error device, o dispositivo de erro

    padro, que inicialmente definido para a tela. clog - Este objeto fornece sada "bufferizada" atravs do "standard error device", o dispositivo de erro padro que

    inicialmente definido para a tela.O foco de orientao a objetos que a biblioteca iostream confere aos dispositivos de entrada e sada uma dascaractersticas da linguagem C++. Ele est presente na maneira na qual o cdigo foi idealizado e est formatado,modificando a maneira como as partes do sistema de entrada/sada interagem. Desta forma, as operaes de interaoentre o usurio e o software tornam-se mais intuitivas para o programador.O sistema de entrada e sada um exemplo deste modelo de programao, onde cada entidade fsica ou lgica deentrada e sada representada por objetos cujas operaes podem ser acessadas diretamente nos programas.

    BufferPara entendermos um pouco mais sobre Buffer, se faz necessrio recordar um pouco sobre o funcionamento damemria e suas operaes relacionadas a Buffer.Bufferizao um meio de sincronizao entre dispositivos de velocidades diferentes, tais quais memria edispositivos de armazenamento mecnicos, como discos magnticos. Para evitar que as operaes do dispositivomais lento interfiram no desempenho do programa pode-se fazer com que os dados sejam colocados em umamemria mais rpida e depois sejam enviadas ao dispositivo mais lento a medida que ele tenha disponibilidade parareceb-los, desta forma temos os seguintes modos de escrita em dispositivos de sada: unbuffered significa que qualquer mensagem ou dados sero escritos imediatamente. o caso da escrita no

    dispositivo cerr; buffered - significa que os dados sero mantidos num buffer de memria at que o dispositivo de destino solicite,

    ou que um comando de descarregamento seja executado, ou quando o buffer estiver cheio. O problema que se oprograma interrompido antes do buffer ser escrito esses dados so perdidos.

  • Entrada e sada de dados 57

    coutcout

  • Entrada e sada de dados 58

    \\ barra oposta (contrabarra) (\)

    cinO objeto cin obtm informao do "standard input" (que usualmente o teclado). Este objeto est tal como o coutdeclarado no cabealho da biblioteca A sintaxe mais comum da instruo para obter dados do cin : cin >> [variable name];Aqui temos o operador de extrao ">>" que diz que tudo o que o teclado escrever, coloque esses dados na varivelque me segue. Este operador consegue at traduzir o conceito de dados de fora para dentro.

    #include

    using namespace std;

    int main(void)

    {

    int testScore;

    cin >> testScore;

    cout

  • Entrada e sada de dados 59

    Aqui j no temos a questo de dar a volta ao intervalo permitido, aqui temos o caso em que vai ser colocado umnmero estranho. Isto no est perfeitamente explicado.Chama-se prompt quando dito ao utilizador o que deve fazer, o que no deixar como no exemplo anterior o cursora piscar sem o utilizador saber o que fazer. Alm de que temos o problema de overflow em execuo, portanto bomque o utilizador cumpra os requerimentos.De uma maneira muito conveniente, os dados recebidos pelo cin so tratados de forma a tornar o processopolimrfico, da mesma forma que no caso de cout, assim temos como receber os dados da maneira que precisamos,ou seja, quando declaramos uma varivel int e a usamos para receber um dado do cin, o mesmo convertido naentrada para inteiro, quando usamos uma varivel de outro tipo, a entrada convertida para o tipo da varivel.

    Lendo um caractereLer um caractere at simples, basta utilizar o objeto cin e ser guardado o valor digitado na varivel.

    char nivel;

    cout > nivel;

    Porm teremos de pressionar a tecla ENTER depois de digitar o caractere. Isto leva a vrias questes.O problema pressione uma tecla para continuar...

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout > ch;

    if (ch != 'S' && ch != 's')

    cout

  • Entrada e sada de dados 60

    A funo cin.get()J tivemos oportunidade para discutir a funo getline (funo membro) do objeto cin.

    cin.getline(name,80);

    Aqui vamos utilizar uma outra funo, a cin.get().Esta funo pode ser chamada, tal como a getline(), atravs de 3 argumentos, onde o primeiro o array de caracteres,mas tambm o pode ser sem argumentos ou ainda apenas um argumento.No caso de no conter argumentos apenas ir ler um caractere, em vez de uma cadeia de caracteres.No caso de ter um argumento, ela aceita qualquer tecla incluindo o enter. (o que no se passa com o cin e o operadorde extrao). Aqui um exemplo

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 61

    Ou seja, na segunda iterao, retirado o caractere nova linha que ficou da 1 iterao - e colocado na varivelch. Agora o "input buffer" est vazio.

    cin.ignore()Uma soluo limpar o caractere nova linha do "input buffer" antes da chamada da funo getline(). E fazemos issousando a funo ignore() do objeto cin.Esta funo membro tal com a get() e a getline() so sobrecarregadas, podem ser chamadas sem argumentos, com umou dois argumentos.Utilizar a funo ignore() sem argumentos, permite que o prximo caractere no "input buffer" seja lido e depoisdescartado,- e isto exatamente aquilo que queramos.A funo com 1 ou 2 argumentos usada para cadeias de caracteres. Com um argumento, o argumento o nmero mximo de caracteres a ser removido do "input buffer". Exemplo:

    cin.ignore(80); // Remove at 80caracteres do input buffer

    Com dois argumentos, o segundo argumento o delimitador, um caractere que se encontrado, antes do nmero decaracteres especificado no primeiro paramento, faz com que a remoo pare. Exemplo:

    cin.ignore (80, '\n'); // Remove 80 caracteres se at l no encontrar

    o nova linha.

    Reescrevendo o cdigo anterior utilizando o cin.ignore()

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 62

    Se pressionarmos a tecla Enter para continuar, teremos de fazer isso duas vezes, pois a primeira vez ignorada. Arazo: que no existe nada no "input buffer" quando a funo ignore chamada, por isso que a tecla enternecessita de ser pressionada 2 vezes, colocando um caractere nova linha a mais no "buffer" para a funo ignore()remover.Se tentarmos modificar isto atravs do if?

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 63

    cout

  • Entrada e sada de dados 64

    Razo: A funo get() com um argumento deixa o caractere nova linha no "input buffer" se pressionarmosum caractere e o enter. mas no deixar, se apenas pressionarmos o enter. portanto necessrio confirmar.

    Entrada de valores para variveis mltiplasPodemos fazer com que o programa receba vrios valores ao mesmo tempo

    cin >> [first variable] >> [second variable] >> [third variable];

    Neste caso o utilizador separa os dados por espaos (o enter tambm d) e como anteriormente o utilizador fechautilizando o enter

    #include

    #include

    using namespace std;

    int main(void)

    {

    int peso, altura;

    string nome;

    cout > nome >> peso >> altura;

    cout

  • Entrada e sada de dados 2 65

    Entrada e sada de dados 2

    Entrada/Sada em ficheiros (arquivos)Nota introdutria: Este capitulo geralmente colocado uns captulos mais para o fim, mas acho por bem que setorne as coisas mais interativas, o que possvel introduzindo agora operaes em arquivos, d muito maisentusiasmo. Encontramos aqui conceitos avanados mas podero ser deixados para depois se o leitor no quiserobservar o tema neste momento.

    Gravar (Salvar) os dados para um ficheiro(arquivo)Os dados que mantemos nos programas esto guardados na memria RAM, que limpa quando o programa oucomputador para de funcionar. Isso implicaria que perderamos toda a informao! Porm existe uma maneira paratornar os dados persistentes que gravar os dados num ficheiro (arquivo) no "hard drive" (disco rgido) ou no outromeio persistente. Nas formas mais diretas de escrita podemos passar os dados em formato binrio para oficheiro(arquivo). Outros meios avanados para guardar dados podem envolver bases de dados relacionais ou XML.

    O que um ficheiro(arquivo)?Um arquivo uma coleo de dados que esto localizados numa memria persistente tipo hard drive, cd-rom, etc.Para identificarmos o arquivo podemos atribuir-lhe um nome (filename). Os "filenames" tm usualmente umaextenso, que determina o tipo de arquivo em sistemas operacionais semelhantes aos da Microsoft, mas que podemser dispensados em sistemas operacionais que guardam as caractersticas dos arquivos no meio de armazenamento,tais quais sistemas UNIX e seus similares GNU/Linux, FreeBSD, etc... A extenso representada por 3 ou 4 letrasque seguem aps o nome do arquivo e um ponto ".". Por exemplo: "joao.doc" ou "joao.odt". Isto diz-me que temosum ficheiro(arquivo) que se chama "joao", e que tem a extenso .doc que refere usualmente a documentos do WORDno primeiro caso e com extenso ".odt" do OpenOffice no segundo. Outros tipos de extenses podem ser ".xls" paradocumentos EXCEL, ".ods" para planilhas do OpenOffice. ou ainda ".cpp" para ficheiros(arquivos) de cdigos dec++.

    Ficheiros(Arquivos) binrios e tipo textoExistem na verdade dois tipos de ficheiros(arquivos): os do tipo texto e os do tipo binrio. Os arquivos tipo texto apenas armazenam texto obedecendo uma codificao de caracteres, a mais comum a

    ASCII, isto implica no uso do cdigo para armazenamento, ou seja, pode ser que a codificao seja interpretadaantes de ser efetivada no meio de armazenamento.

    Os arquivos binrios podem guardar mais informao, como imagens, base de dados, programasPor exemplo,editores de texto com formatao, como o OpenOffice e o Word, guardam os seus arquivos em formatos binrios,porque eles possuem alm do texto, informao acerca da formatao do texto, para as tabelas, as listasnumeradas, tipo de fonte, etc... da aparecerem os caracteres de formatao tipo 6, L, h5

    Os arquivos binrios podero ser mais bem explorados em um tpico avanado, vamos trabalhar inicialmente comarquivos tipo texto, que poderemos operar de maneira mais simplificada.

  • Entrada e sada de dados 2 66

    biblioteca padro fstreamAt agora temos usado a biblioteca iostream (i de input + o de output + stream), que suporta, entre vriasfuncionalidades, o objeto cin para ler da "standard input" (que usualmente o teclado) e o objeto cout para "standardoutput" (que usualmente o monitor)Ora, agora queremos ler e escrever para ficheiros(arquivos) e isso requer a biblioteca fstream (f de file + stream).Esta biblioteca define 3 novos tipos de classe: ofstream (apenas para sada "out to a file". serve para criar, manipular ficheiros (arquivos) e escrever, no serve

    para ler). ifstream (apenas para entrada "in from a file" . serve para ler ficheiros (arquivos), receber dados dos mesmos,

    no serve para criar nem escrever). fstream (este conjuga os dois tipos anteriores, "input and output to file". cria ficheiros (arquivos), escreve e l

    informao dos mesmos.

    Abrir um ficheiro(arquivo)Um ficheiro(arquivo) deve ser aberto pelo programa para que o mesmo possa ser manipulado, a abertura do arquivoimplica, entre outras coisas, em atribuir um identificador que nos permita ter acesso aos seus dados. necessriocriar uma linha de comunicao entre o arquivo e o objeto stream.Podemos recorrer a dois mtodos para abrir um ficheiro (arquivo):1.1. Usando um construtor;2.2. Usando a funo membro chamada de "open".

    Usando o ConstrutorO construtor uma funo que automaticamente chamada quando tentamos criar uma instncia de um objeto.

    fstream afile; // criado uma instncia do fstream chamada

    de afile

    Os construtores de objetos podem ser sobrecarregados, ou seja, para a mesma classe podemos ter um construtor semargumentos, com um argumento, dois argumentos, etc. No exemplo anterior criamos um sem argumentos. Osconstrutores no retornam valores, geralmente o compilador reporta erro quando se declara funes que retornamvalor e estas tm o mesmo nome da classe, pois este nome reservado para os construtores. Vamos dar um exemplocom dois argumento:

    ofstream outfile ("joao.doc", ios::out);

    Chama o construtor com dois argumentos, criando uma instncia de ofstream e abrindo o ficheiro(arquivo)"joao.doc" para operaes de sada.

    Usando a funo membro "open"Esta funo tem como primeiro argumento o nome e localizao do ficheiro/(arquivo) a ser aberto, o segundoargumento especifica o modo de abertura.Sobre a questo da localizao existem 2 tipos, o "path" relativo e o "path" absoluto. Para este ltimo indicamos ocaminho todo: "c:\\....\\joao.doc" em sistemas Microsoft ou "/home/joao/joao.odt" para sistemas UNIX esimilares. O "path" relativo dispensa essa descrio se o ficheiro/(arquivo) estiver (na mesma directoria)/(no mesmodiretrio) que o programa.Sobre a questo do modo de abertura temos as seguintes modalidades:

  • Entrada e sada de dados 2 67

    Modo doabertura

    sinalizador(Flag)

    Descrio

    ios::app "Appendmode"

    Todos os dados do arquivo so preservados e qualquer sada escrita a partir do fim do arquivo.

    ios::ate Se o arquivo j existe,o programa vai diretamente ao seu fim.O modo de escrita ento feito de formaaleatria.Usado normalmente com arquivos do modo binrio(binary mode).

    ios::binary "Binarymode"

    Informaes so escritas na forma binria e no na forma textual(text mode).

    ios::in "Input mode" Leitura de informaes de arquivo(no ir criar um arquivo novo)

    ios::out "Outputmode"

    Informaes sero escritas no arquivo.

    ios::trunc Se o arquivo j existe,suas informaes sero truncadas, outra forma de se dizer: deletadas e reescritas.

    Os sinalizadores (flags) so nmeros em potncias da base binria, portanto podemos ter vrios flags ao mesmotempo se usarmos o operador unrio para a operao "OU", como no exemplo abaixo:

    ofstream outfile; //crio o objeto outfile

    outfile.open("students.dat", ios::binary | ios::app); /*chamo a funo

    membro open do objeto,

    com o 1

    parmetro que o nome do arquivo

    e o 2 o modo

    de abertura. */

    Observe que estamos abrindo o arquivo "students.dat" em modo binrio e ao mesmo tempo com o modo "append",isto significa que abriremos o arquivo e poderemos preservar o seu contedo anterior inserindo os novos dados nofim do arquivo.

    Comparando os dois mtodos (pela funo membro e pelo construtor)O primeiro mtodo similar a ter

    int age;

    age=39;

    O segundo mtodo similar a

    int age=39;

    A escolha do melhor mtodo em cada situao depende do contexto em que estamos criando o cdigo, geralmentequando j temos o objeto criado e ele est fechado podemos abrir um novo arquivo com ele e depois fech-lonovamente, isto nos sugere que usemos a funo open quando o objeto deve abrir arquivos diferentes em cada trechode cdigo, embora que possam surgir outras funcionalidades, dependendo de como o projeto foi idealizado.

  • Entrada e sada de dados 2 68

    Abrir um arquivo para leituraA histria aqui a mesma s tem uma diferena: que no caso de leitura, no ser criado nenhum ficheiro (arquivo)caso ele no exista.

    ifstream arq; //cria objeto "arq"

    arq.open (joo.doc); //chama funo membro open ao objeto "arq", com o

    //parmetro do nome do ficheiro

    Poderamos fazer o mesmo com o c