www.sobralmatematica.org editora cplus

Upload: micontabil

Post on 17-Oct-2015

134 views

Category:

Documents


0 download

TRANSCRIPT

  • Uma introducao a` linguagem de programacao C++

    Tarcisio Praciano Pereira1

    5a. Edicao - preliminar

    Universidade Estadual do Vale do Acarau

    20 de junho de 2013

    [email protected]

  • Sumario

    I Logica 1

    1 Primeiros programas em C++ 21.1 Imprimindo na tela . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.1.1 C++ e C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.2 Recebendo dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.2.1 Variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.2 Usando funcoes . . . . . . . . . . . . . . . . . . . . . . . . 12

    1.3 Operacoes aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . 171.4 Os inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.5 Cadeias de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 28

    1.5.1 Como guardar texto . . . . . . . . . . . . . . . . . . . . . 291.5.2 Onde guardar textos de forma segura . . . . . . . . . . . 30

    1.6 A agenda telefonica . . . . . . . . . . . . . . . . . . . . . . . . . . 341.7 Um programa com orientacao a objeto . . . . . . . . . . . . . . . 381.8 Uma classe que herda os metodos de outra . . . . . . . . . . . . . 391.9 Vocabulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    2 Operadores aritmeticos e logicos 472.1 Operacoes aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . 50

    2.1.1 C++ interpretado . . . . . . . . . . . . . . . . . . . . . . . 512.1.2 Adicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.1.3 Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562.1.4 Subtracao . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.1.5 Divisao inteira . . . . . . . . . . . . . . . . . . . . . . . . 582.1.6 Atalhos ++... . . . . . . . . . . . . . . . . . . . . . . . . . 59

    2.2 Operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . . . 632.2.1 Desigualdades . . . . . . . . . . . . . . . . . . . . . . . . . 642.2.2 Teste de igualdade . . . . . . . . . . . . . . . . . . . . . . 662.2.3 Conjuncao logica . . . . . . . . . . . . . . . . . . . . . . . 672.2.4 Disjuncao logica . . . . . . . . . . . . . . . . . . . . . . . 67

    2.3 Lista dos operadores aritmeticos e logicos . . . . . . . . . . . . . 68

    i

  • 3 Logica 763.1 O que e um programa . . . . . . . . . . . . . . . . . . . . . . . . 76

    3.1.1 O primeiro passo na escala da abstracao . . . . . . . . . . 773.1.2 O segundo passo na escala da abstracao . . . . . . . . . . 783.1.3 O terceiro passo na evolucao da abstracao . . . . . . . . . 78

    3.2 Ponto de decisao, if() . . . . . . . . . . . . . . . . . . . . . . . . 793.2.1 Completando o if() . . . . . . . . . . . . . . . . . . . . . 823.2.2 Mapas de programas, fluxogramas . . . . . . . . . . . . . 88

    3.3 Lacos:while() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.3.1 Como e que funciona ? . . . . . . . . . . . . . . . . . . . . 953.3.2 do while() . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    3.4 Multiplas escolhas: switch() . . . . . . . . . . . . . . . . . . . . 1033.5 Outra forma de fazer lacos . . . . . . . . . . . . . . . . . . . . . . 106

    3.5.1 Lacos: usando for() . . . . . . . . . . . . . . . . . . . . . 1063.5.2 C++ interpretado, Calc . . . . . . . . . . . . . . . . . . . . 1063.5.3 Diferencas entre os metodos for(), while() . . . . . . . 108

    3.6 Sada forcada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103.6.1 Blocos logicos . . . . . . . . . . . . . . . . . . . . . . . . . 1103.6.2 Parada forcada,break . . . . . . . . . . . . . . . . . . . . 110

    3.7 Vocabulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

    4 Funcoes e metodos 1134.1 Historia das funcoes . . . . . . . . . . . . . . . . . . . . . . . . . 1134.2 Funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    4.2.1 Passando valores . . . . . . . . . . . . . . . . . . . . . . . 1194.3 Biblioteca de funcoes . . . . . . . . . . . . . . . . . . . . . . . . . 123

    4.3.1 Construindo a biblioteca areas.h . . . . . . . . . . . . . 1244.4 Funcao e variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    4.4.1 Valor default . . . . . . . . . . . . . . . . . . . . . . . . . 1274.5 Funcao: linha de comandos . . . . . . . . . . . . . . . . . . . . . 128

    5 As variaveis e os seus tipos 1315.1 Variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

    5.1.1 Smbolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1335.1.2 A codificacao dos caracteres . . . . . . . . . . . . . . . . . 1355.1.3 As regras . . . . . . . . . . . . . . . . . . . . . . . . . . . 1365.1.4 O espaco de nomes . . . . . . . . . . . . . . . . . . . . . . 139

    5.2 Os tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 1415.2.1 Tipos basicos de dados . . . . . . . . . . . . . . . . . . . . 1415.2.2 Outros tipos de dados . . . . . . . . . . . . . . . . . . . . 1435.2.3 Estrutura com metodo . . . . . . . . . . . . . . . . . . . . 144

    5.3 Variavel global e local . . . . . . . . . . . . . . . . . . . . . . . . 1465.3.1 Comentarios sobre os exerccios . . . . . . . . . . . . . . . 1515.3.2 Erro com variaveis locais polped.cc . . . . . . . . . . . . 155

    5.4 Tecnicas com o uso de variaveis locais . . . . . . . . . . . . . . . 155

    ii

  • 5.5 Variavel global . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1615.5.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . 162

    5.6 Endereco de uma variavel . . . . . . . . . . . . . . . . . . . . . . 1625.6.1 Referenciando dados via ponteiro . . . . . . . . . . . . . . 1645.6.2 Operacoes com ponteiros. . . . . . . . . . . . . . . . . . . 169

    5.7 Valor por referencia . . . . . . . . . . . . . . . . . . . . . . . . . 1715.8 Ponteiro para funcao . . . . . . . . . . . . . . . . . . . . . . . . . 172

    5.8.1 Explicando o tutorial . . . . . . . . . . . . . . . . . . . . . 1735.9 Valores na linha de comando . . . . . . . . . . . . . . . . . . . . 174

    5.9.1 Usando uma funcao para alocar memoria . . . . . . . . . 1765.10 Cadeias de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 177

    5.10.1 Texto da linguagem C . . . . . . . . . . . . . . . . . . . . 1775.11 Passando valores entre funcoes . . . . . . . . . . . . . . . . . . . 1785.12 Arquivos em disco . . . . . . . . . . . . . . . . . . . . . . . . . . 1805.13 Tabelas ou registros . . . . . . . . . . . . . . . . . . . . . . . . . 181

    5.13.1 Criar um tipo ou usar um tipo . . . . . . . . . . . . . . . 1825.13.2 Tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

    5.14 Passagem de dados complexos . . . . . . . . . . . . . . . . . . . . 1835.15 Vocabulario: variavel e tipo de dado . . . . . . . . . . . . . . . . 184

    6 Stream 1906.1 Streams - a simulacao dos perifericos . . . . . . . . . . . . . . . . 1906.2 Classes i/o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1926.3 Biblioteca IOstream . . . . . . . . . . . . . . . . . . . . . . . . . 197

    6.3.1 A entrada e sada de dados . . . . . . . . . . . . . . . . . 1986.3.2 Manipuladores . . . . . . . . . . . . . . . . . . . . . . . . 200

    6.4 Strings, tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2026.5 Biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

    6.5.1 Algumas funcoes globais - string . . . . . . . . . . . . . 2076.5.2 Entrada e sada de dados . . . . . . . . . . . . . . . . . . 208

    7 Classes e objetos 2117.1 Classes, modelos de programas . . . . . . . . . . . . . . . . . . . 211

    7.1.1 Estrutura e sub-estrutura . . . . . . . . . . . . . . . . . . 2127.1.2 Classes e suas instancias . . . . . . . . . . . . . . . . . . . 2147.1.3 A producao de software . . . . . . . . . . . . . . . . . . . 215

    7.2 ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2187.2.1 Usando Ambiente.h . . . . . . . . . . . . . . . . . . . . . 220

    7.3 A garrafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2227.3.1 A classe computacional da garrafa . . . . . . . . . . . . . 2247.3.2 Utilizando a classe da garrafa . . . . . . . . . . . . . . . 230

    7.4 Completando as ideias sobre classes . . . . . . . . . . . . . . . . 2357.5 Vocabulario, classes . . . . . . . . . . . . . . . . . . . . . . . . . 235

    iii

  • II Criando projetos 240

    8 A classe da calculadora 2438.1 Os numeros complexos . . . . . . . . . . . . . . . . . . . . . . . . 2438.2 Primeiros programas com a algebra dos complexos . . . . . . . . 2468.3 Usando um programa externo: gnuplot . . . . . . . . . . . . . . 2508.4 A calculadora grafica . . . . . . . . . . . . . . . . . . . . . . . . . 253

    8.4.1 Analise de calculadora.cc . . . . . . . . . . . . . . . . . 2558.5 A classe dos numeros complexos . . . . . . . . . . . . . . . . . . 256

    8.5.1 Tipo de dado complexo . . . . . . . . . . . . . . . . . . . 2568.5.2 Membros e metodos . . . . . . . . . . . . . . . . . . . . . 257

    9 Classes para Graficos 2599.1 Classes para graficos . . . . . . . . . . . . . . . . . . . . . . . . . 2599.2 Graficos de funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . 2609.3 Como e que funciona . . . . . . . . . . . . . . . . . . . . . . . . . 2659.4 Classes graficas:Versao melhorada . . . . . . . . . . . . . . . . . . 2659.5 Versao completa do programa . . . . . . . . . . . . . . . . . . . . 266

    9.5.1 Replanejando o trabalho . . . . . . . . . . . . . . . . . . . 2669.5.2 Resumo dos graficos . . . . . . . . . . . . . . . . . . . . . 2689.5.3 Ajustes finais . . . . . . . . . . . . . . . . . . . . . . . . . 269

    9.6 Graficos multivariados . . . . . . . . . . . . . . . . . . . . . . . . 2699.7 Vocabulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

    10 Classes para Sistemas 27410.1 A equacao do segundo grau . . . . . . . . . . . . . . . . . . . . . 274

    10.1.1 Otimizacao . . . . . . . . . . . . . . . . . . . . . . . . . . 27610.2 Planejamento de programa . . . . . . . . . . . . . . . . . . . . . 277

    10.2.1 Como fazer um planejamento . . . . . . . . . . . . . . . . 27710.3 A construcao da versao beta . . . . . . . . . . . . . . . . . . . . . 28010.4 Transformando bilioteca numa classe . . . . . . . . . . . . . . . . 28410.5 Fechando alguns conceitos . . . . . . . . . . . . . . . . . . . . . . 285

    10.5.1 Variavel e objeto . . . . . . . . . . . . . . . . . . . . . . . 28510.5.2 Nomes dos objetos . . . . . . . . . . . . . . . . . . . . . . 28610.5.3 Classes e objetos . . . . . . . . . . . . . . . . . . . . . . . 28610.5.4 private, public . . . . . . . . . . . . . . . . . . . . . . 28610.5.5 Funcoes e metodos . . . . . . . . . . . . . . . . . . . . . . 287

    11 Referencias 28811.1 Uma lista de referencias . . . . . . . . . . . . . . . . . . . . . . . 288

    11.1.1 Palavras reservadas . . . . . . . . . . . . . . . . . . . . . . 28911.1.2 Man, info . . . . . . . . . . . . . . . . . . . . . . . . . . 28911.1.3 Make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29111.1.4 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . 29911.1.5 Compilacao . . . . . . . . . . . . . . . . . . . . . . . . . . 30011.1.6 Como capturar o return(n) . . . . . . . . . . . . . . . . 304

    iv

  • 11.1.7 Entrada de Sada de dados . . . . . . . . . . . . . . . . . 30411.2 Entrada e sada de dados . . . . . . . . . . . . . . . . . . . . . . 305

    11.2.1 Mascara grafica . . . . . . . . . . . . . . . . . . . . . . . . 305Bibliografia ............................................................................... 307

    v

  • Lista de Figuras

    1.1 Um programa em C++ . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Um menu de opcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.3 Um switch para internet - conecta os computadores . . . . . . . . . . . . 271.4 Um antigo programa em BASIC . . . . . . . . . . . . . . . . . . . . . 421.5 Etapas na producao de um programa . . . . . . . . . . . . . . . . . . . 44

    3.1 if() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813.2 Fluxograma com dois if() . . . . . . . . . . . . . . . . . . . . . . . . 893.3 Fluxograma com dois if(), uma entrada e uma sada dados . . . . . . . . 903.4 while() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963.5 Fluxograma de uma soma - um laco . . . . . . . . . . . . . . . . . . . 1003.6 switch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043.7 Usando for() em calc . . . . . . . . . . . . . . . . . . . . . . . . . . 1073.8 Ao encontrar break o fluxo e desviado para a` proxima funcao externa ao

    bloco. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    4.1 Um programa em BASIC . . . . . . . . . . . . . . . . . . . . . . . . 1154.2 Uma funcao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1164.3 O menor programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    5.1 Variavel global e variavel local. . . . . . . . . . . . . . . . . . . . . . . 1485.2 Variavel global e local . . . . . . . . . . . . . . . . . . . . . . . . . . 1535.3 Uma variavel em main(). . . . . . . . . . . . . . . . . . . . . . . . . 1575.4 Nova versao do programa . . . . . . . . . . . . . . . . . . . . . . . . 1585.5 Tecnicas para eliminacao de variaveis globais . . . . . . . . . . . . . . . 1595.6 Variavel ponteiro do tipo XX . . . . . . . . . . . . . . . . . . . . . . . 1655.7 imprime um numero . . . . . . . . . . . . . . . . . . . . . . . . . . 1845.8 imprime um numero guardado numa variavel . . . . . . . . . . . . . . . 185

    6.1 A logica: sada, entrada de dados . . . . . . . . . . . . . . . . . . . . . 1936.2 www.cplusplus.com . . . . . . . . . . . . . . . . . . . . . . . . . . . 1956.3 Sobrecarregamento de cin . . . . . . . . . . . . . . . . . . . . . . . . 199

    7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2227.2 uma classe esqueleto para fazer classes . . . . . . . . . . . . . . . . . . 224

    vi

  • 7.3 A classe Garrafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2257.4 A classe Garrafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2267.5 O objeto garrafa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2317.6 Classe filha e classe mae . . . . . . . . . . . . . . . . . . . . . . . . . 237

    8.1 n = 0; in+2 = i2 = 1; in+3 = i3 = i . . . . . . . . . . . . . . . . . . 2448.2 O plano complexo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

    10.1 Fluxograma de quase splines3.cc . . . . . . . . . . . . . . . . . . . 283

    11.1 Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

    vii

  • IntroducaoA introducao tem que estar colocada, em qualquer livro, no comeco, mas isto nao

    significa que ela seja facil de ser entendida numa primeira leitura. Todo texto com letrapequena, neste livro, e um texto que sugiro que @ leitor@ leia com desconfianca, e a introducaoesta em letra pequena.

    Um dos objetivos que qualquer autor tem, com a introducao, e de expor o plano dotrabalho e isto e um assunto difcil para alguem que esteja se iniciando no assunto. E comoexplicar a alguem que nunca visitou uma cidade as belezas e as sutilezas que podem ser laencontradas, no mnimo e um bom suporfero mesmo que a cidade seja interessante. Mas epreciso ler, pelo menos rapidamente, esta introducao para que voce saiba qual e o conteudodo livro.

    Se voce for novo em programacao, faca uma leitura superficial desta abertura do livro epasse logo para o primeiro captulo que e dirigido para quem esta comecando. Mais exata-mente, o primeiro captulo foi projetado como um tutorial para conduz-l@ a escrever o seuprimeiro programa.

    Depois que voce estudar com cuidado o primeiro captulo, faca uma leitura superficial doresto do livro, para se inteirar do seu conteudo, e talvez entao voce deva fazer uma segundaleitura da introducao seguida de um trabalho cuidadoso do resto do livro. Esta e a minhasugestao de como usar este livro,

    estudar com cuidado o primeiro captulo,

    depois recomecar a leitura do livro desde o comeco o que inclui uma segunda leituradesta introducao.

    Foi assim que planejei o trabalho com o livro: o primeiro captulo e um pequeno cursointrodutorio de programacao voltado para a linguagem que estou discutindo neste

    livro. Quando voce terminar o primeiro captulo ja estara escrevendo, sozinho, osprimeiros programas.

    Entretanto, somente voce e que pode descobrir a sua forma de desenvolvimento, o que eimportante e que voce se libere de alguns mitos que nos atrapalham no aprendizado:

    mito: que existe uma forma padrao de aprendizado. Nao existe! cada um de nos tema sua, e esta a principal dificuldade numa sala de aula quando o professor tem que sedirigir de forma padronizada a 30 pessoas que necessitariam, cada uma, de uma formaespecfica de orientacao;

    mito: a ordem dos captulos e um padrao imutavel. Infelizmente o livro vem com oscaptulos numa ordem prefixada, mas voce pode ler os captulos em outra ordem, tente;

    mito: existe uma forma pre-definida para a arrumacao do conhecimento, qual e o con-ceito que vem primeiro. Isto e falso, mesmo voce, em dois momentos distintos, podeprecisar de formas diferentes para entender um mesmo assunto... porque o nosso estadomental se altera frequentemente, um assunto que voce entendeu perfeitamente horasatras, agora pode lhe parecer complicado. Isto e valido inclusive para um programa quevoce mesmo escreveu e que esta funcionando, e numa nova leitura, do programa, voceja nao entende porque usou aquele truque... Para resolver este problema os programasadmitem um tipo de texto, dentro dos programas, chamados comentarios, em que vocepode deixar explicacoes para voce mesmo do significado das construcoes que voce fizer;

    mito: o autor e perfeito e o livro e livre de defeitos... sou humano, as vezes escrevo comsono, e nem preciso deste alibi, erro mesmo. Este, possivelmente, e o pior de todos osmitos. Se voce tiver dificuldades de entender um paragrafo, pode ser que o livro estejaerrado e que voce tenha razao! O autor e um estudante mais avancado e ainda estaaprendendo.

    Possivelmente o principal problema, dentre os que relacionei acima, se encontra nos errosdo autor. Sao ciladas que um inexperiente pode encontrar num caminho antes nunca percor-rido. A sada e estudar em equipe. Um colega de estudos completa sua visao e juntos vocespodem superar os problemas que o autor venha a criar. E, finalmente, voce comprou o livro,adquiriu o direito de se comunicar comigo para discutir situacoes difceis. Escreva-me ume-mail descrevendo o problema, seja sintetico e objetivo, e me passe a forma como eu possa

    viii

  • reproduzir a situacao sobre a qual voce deseja um apoio, e procurarei dar-lhe alguma ajuda.Mas nao espere que eu lhe possa dar um curso particular na Internet, use este recurso deforma economica.

    Sobre este ponto, de recorrer a ajudas, seja sempre economico! Procure ajuda com outraspessoas, mas nao se esqueca de que qualquer excesso, neste sentido, e desgastante. Primeirotente resolver os problemas sozinho ou com companheiros de estudo. Tente ajuda externa emultima analise, e com certeza voce encontrara a` sua volta quem o possa ajudar deixando oautor em ultimo lugar, nesta lista. Mas o meu endereco se encontra no final desta introducao,porque me sinto responsavel por este trabalho.

    A linguagem C++Antes de discutir o plano do livro, deixe-me falar um pouco sobre o que e C++. Sem duvida

    e intrigante os dois mais, ++, que completam o nome curtssimo desta linguagem que, talvez,voce saiba que vem de outra linguagem chamada C.

    E, voce esta estudando uma extensao de C e, naturalmente, a primeira pergunta seria:entao eu devo fechar esta livro e ir estudar primeiro C?

    Houve um tempo em que eu diria: sim!. Hoje nao penso mais desta forma, C++ podeser a sua primeira linguagem de programacao e talvez posteriormente voce precise aprenderC para conseguir certas otimizacoes em programas, porem a tendencia parece ser a de que Cdesapareca na poeira da estrada.

    Entretanto voce vai encontrar aqui os rudimentos de C que lhe serao necessarios paraentender todo o conteudo deste livro, na verdade sao partes integrantes da nova linguagem,mas em algum momento voce podera precisar mais, e entao, neste momento pegue um livrode C e complete o que voce precisar. Quando voce sentir esta necessidade voce sabera comoproceder, agora pode seguir em frente aqui mesmo.

    C++ e uma linguagem orientada a objetos mas que admite programacao tradicional e oprojeto era mesmo este, permitir que os programadores da linguagem C conseguissem migrarpara uma outra metologia de programacao. Os primeiros programas usarao objetos sem quevoce tenha muita consciencia disto, porque a linguagem foi feita para isto. Mas desde cedo,atraves dos exemplos, eu @ estarei conduzindo a se acostumar com uma nova forma de escreverprogramas, a orientacao a objetos.

    O plano do livroDeixe-me apresentar-lhe o plano do livro.Este livro esta dividido em duas partes.

    1. A primeira parte se compoe de 7 captulos:

    O primeiro captulo: dos exemplos, vai lhe mostrar uma colecao de pequenosprogramas atraves dos quais voce sera introduzido a` linguagem. Este e o maiorcaptulo do livro e ira fazer uso dos seis captulos que vem em seguida. Nele vocesera convidado, frequentemente, a visitar os outros captulos para pegar algumainformacao necessaria. Mas, volte logo para o ponto de onde voce tiver sado.

    Os exerccios irao estimula-l@ a alterar os programas e e neste tipo de exercciosque voce ira ganhar a experiencia para partir sozinh@ no seu proprio voo nummomento futuro, futuro nao muito distante: no final do captulo 1.

    Ao final do primeiro captulo voce ja devera estar escrevendo pequenos progra-mas que respondam a alguns objetivos pessoais que voce tenha. Este tipo de mo-tivacao e crucial, primeiro porque programas existem para resolver situacoes conc-retas, logo voce deve ter objetivos bem claros no estudo de uma linguagem de pro-gramacao. Quando eu comecei a estudar a primeira linguagem de programacaoeu queria construir um calendario, eis um problema particularmente difcil e bempratico, o calendario gregoriano e um verdadeiro quebra-cabecas. . . eu nao sugiroque voce comece com este problema e no primeiro captulo estarao as minhassugestoes.

    Este primeiro captulo termina com uma lista de topicos que denominei vo-cabulario com o discurso informativo sobre os diversos assuntos que sao sugeridosao longo do captulo. Evito, assim, de distra-l@ do objetivo principal que e rodaros primeiros programas deixando este discurso para o final do captulo. Todos ostopicos do vocabulario estao indexados e voce podera retornar a eles consultando

    ix

  • o ndice remissivo que se encontra ao final do livro. Isto vale para os outrosvocabularios que se encontram ao final de alguns captulos.

    Captulos de referencia. Os captulos 2, 3, 4, 5, 6, 7 formam um conjunto decaptulos de referencia. Em diversos momentos no captulo 1, estarei sugerindoque voce compareca a um destes captulos para ler um topico de que eles tratam.Faca uma leitura rapida ou mais aprofundada, dependendo do nvel de motivacaoque voce tiver. Os exerccios que voce encontrar nestes captulos devem conduz-lo a um aprofundamento do topico de que eles tratam, tutoriais, que devem serfeitos na segunda leitura.

    O segundo captulo: dos operadores, vai exercita-lo no uso dos operadoresda linguagem. Na segunda parte deste captulo tem uma listagem dos oper-adores para lhe servir de referencia futura. O objetivo nao sera uma leituradesta descricao para memorizar o seu conteudo, mas saber onde se encontra adescricao para que voce possa retornar ao que lhe possa interessa especifica-mente quando precisar. E uma referencia e todos os topicos estao indexadospara facilitar o seu retorno ao ponto certo.

    O terceiro captulo: a logica, vai descrever as estruturas logicas da linguagem.Cada topico esta seguido de uma pequena lista de exerccios que lhe deveservir de exemplo do uso da funcao apresentada. Este captulo e um captulode referencia, quer dizer, voce nao devera le-lo como se fosse um romance.Tome conhecimento do seu conteudo e retorne quando for preciso.

    O quarto captulo: as funcoes da linguagem C++ vao ser discutidas aqui.Uma funcao e um pequeno programa, um algoritmo bem otimizado com oobjetivo de executar uma pequena tarefa. No captulo 7 elas vao adquirirum outro nome, vao ser chamadas de metodos. Digamos que uma formarapida de explicar programacao orientada a objetos seria dizer que agoracriamos variaveis capazes de se automodificar com os seus proprios metodos(as antigas funcoes). Em C fala-se de funcao, em C++ fala-se de metodo. Osmetodos sao funcoes acopladas a um certo tipo de dados (variavel).C++ e uma linguagem inteiramente independente1 que expandiu a linguagemC. Neste captulo vou mostrar-lhe como se definem funcoes. Neste mo-mento serao funcoes e este aprendizado e essencial para depois lidar comos metodos. Nao de muita importancia a esta conceituacao difusa, va emfrente que aos poucos voce ira compreender que e metodo ou funcao. E emC++ ha funcoes chamadas globais! Na segunda parte eu voltarei a tratardisto e tambem no captulo 6.

    O quinto captulo: dos nomes e dos seus tipos, em que vou discutir a partequase mais fundamental da teoria da computacao, as variaveis, os seus nomese os seus tipos. Nao leia este captulo de uma vez, ele e um captulo dereferencia. Volte sempre que precisar, mas faca uma leitura inicial. Aochegar no captulo 7 voce aprendera que ha uma nova forma de pensar,tpica de orientacao a objeto, que altera em profundidade o conceito devariavel. Uma classe e uma variavel com metodos! Isto quer dizer que ocaptulo 5 estara ultrapassado quando voce passar para a segunda parte dolivro, mesmo assim, didaticamente, eu preciso dele aqui.

    O sexto captulo vai lhe mostrar como C++ simula os perifericos, os dispos-itivos para onde os programas vao enviar dados ou de onde vao receberdados, tela do computador, impressora, um disco, ou teclado. Voce deveraretornar a deste captulo com frequencia, para completar as informacoesque ele guarda e usa-las em outras situacoes. Na parte final deste captuloeu vou discutir a classe string que e a forma com que C++ trata os textos,e naturalmente, o lugar de texto e em algum arquivo num disco ou numdispositivo de armazenamento de dados.

    1C++ entende C portanto programas escritos em C ou com partes escritas em C sao tambemprogramas da nova linguagem.

    x

  • O setimo captulo: vai representar uma revisao geral do que foi visto naprimeira parte. Nele voce vai entender tudo que foi discutido nos captulosanteriores e ele representa a entrada para a segunda parte. Vou mostrar-lhe,detalhadamente, o que e uma classe e como elas foram usadas nos captulosanteriores. Mas, possivelmente, voce ja o tera lido quase todo no decorrerda leitura que fizer dos outros captulos, e o que eu espero. Se for assimpule logo para a segunda parte e comece a estudar os projetos, voltandoao capitulo 7 quando precisar de rever algum conceito, recorra ao ndiceremissivo para isto.

    Ao finalizar esta primeira parte voce fez um curso geral sobre a linguagem.

    2. A segunda parte

    Na segunda parte eu desenvolvi tres projetos, nos captulos 8, 9, 10 usando algumamatematica como motivacao para programar em C++. Em cada captulo voce vai en-contrar mais ferramentas num processo construdo a partir da necessidade de resolverum determinado tipo de problema. Cada captulo esta dirigido para um projeto e to-dos sao independentes entretanto o captulo 9, que trata de graficos, sera utilizado naultima parte dos captulos 8 e 10. Em cada caso voce sera orientad@ a um breve leiturado captulo 9.

    O oitavo captulo: vai tratar de aritmetica. E um captulo independente quevoce pode deixar para estudar posteriormente. Nele eu constru uma caculadoragrafica para numeros complexos. Os programas vao usar gnuplot que e melhorexplicado no captulo 9.

    O nono captulo: vai discutir graficos, mas usando um pacote externo, gnuplot evoce vai encontrar aqui um tutorial para entender este pacote. Vou mostrar-lhecomo fazer graficos de funcoes.

    O decimo captulo vai conduz-lo a` solucao de sistemas de equacoes lineares den-tro da construcao de funcoes polinomais por pedacos. No final vou aplicar o queestudei de graficos na visualizacao destes problemas. Este captulo depende doanterior, o captulo 9 no uso que vai fazer de gnuplot.

    O decimo primeiro captulo : e um manual de referencias da linguagem. O seuobjetivo e muito mais o de sugerir onde procurar do que propriamente lhe oferecertodas as informacoes, porque, se eu fosse colocar aqui todas as informacoes,este captulo, sozinho, teria mais de 1000 paginas. Depois, existem fontes deinformacao de primeira qualidade que e absolutamente importante que voce saibaonde estao e como usa-las, e este o objetivo deste captulo, mostrar-lhe o caminhodas pedras.

    Deixe-me chamar sua atencao para dois itens que nao parecem fazer parte do plano dolivro, os dois ndices, o analtico, que aparece no comeco e e um resumo do plano que descreviacima, e o ndice remissivo que aparece ao final, depois da bibliografia. Fiz um esforco paraindexar todas as palavras importantes que aparecem no livro, faca uso do ndice remissivopara encontrar um assunto que voce nao sabe mais onde esta no livro.

    Tambem o captulo 11 deve lhe dar uma sensacao de que ele deveria ser chamado apendiceuma vez que e um apanhado de informacoes.

    Esta e uma duvida ao se escrever um livro: que quantidade de informacoes deve ser ap-resentada para construir um processo didatico - sem empanturrar o leitor com informacoes.Ate porque nao sera possvel se dizer tudo! O objetivo que defini para este trabalho foi de queo livro nao ultrapasse 300 paginas e conduzisse o leitor a comecar, efetivamente, a programarem C++.

    Agradecimento este livro, assim como tudo que tenho aprendido nos ultimos 10 anos,seria praticamente impossvel sem a existencia de programacao livre. Colocar aqui todosaqueles a quem sou devedor seria uma longa lista de itens e eu incorreria certamente nainjustica de me esquecer de alguem, e praticamente tudo que roda sob Linux que na ultimainstalacao de programas que executei, acusou a existencia 350.000 itens instalados no meucomputador. Eu nao faco uso direto da maioria destes itens, alguns eu uso sem nem mesmo

    xi

  • saber. Mas eu mencionei Linux que e um dos programas que eu uso sem saber, e queriamencionar dois outros diretamente ligados a este livro:

    LATEX e um poderoso compositor de textos que e o responsavel direto pelo belo trabalhotipografico que voce tem na frente dos seus olhos. Procure na Internet para saber oque e LATEX , se eu fosse aqui explicar voce terminaria sem aprender C++.

    O compilador g++ produzido pela fundacao GNU, este livro esta escrito com este compi-lador em mente, ele e gratuito, facilmente intalavel dentro de uma distribuicao Linuxe seguramente nao ha compilador melhor do que g++.

    Ha nomes signficativos na comunidade do software livre que todos os livros citam e quevou evitar de citar, como disse acima, para nao incorrer na injustica de omitir um nomemenor. Para dar um exemplo, uma das distribuicoes de Debian/Gnu/Linux, consagrou onome do Espy, um jovem que morreu aos 21 anos, em 11 de Julho de 2000, preso ao leito emque viveu durante a sua curta vida. Espy deixou-nos todos emocionados quando soubemosque um dos mais agitados programadores da Internet, morria aos 21 anos de uma doencadegenerativa do sistema nervoso que o mantinha preso ao leito.

    Que, ao mencionar Joel Espy Klecker, eu esteja rendendo a minha mais profunda home-nagem a todos os programadores e autores do sistema livre da ciencia, do conhecimento e daliteratura da qual eu tambem faco parte.

    Tarcisio Praciano-Pereira

    [email protected]

    xii

  • Parte I

    Logica

    1

  • Captulo 1

    Uma classe inicial

    Este e o captulo mais longo do livro. Ao terminar este primeiro captulovoce estara escrevendo, sozinho, os seus primeiros programas em C++. Mas eledepende dos seis outros captulos que o seguem, e voce sera frequentementeconvidado a fazer primeiras leituras dos outros captulos.Faca exatamente isto, uma primeira leitura, e retorne ao ponto em que voce seencontrava quando saiu, muito provavelmente no meio de um programa ou deum exerccio.

    1.1 Imprimir, uma sada de dados

    Imprimir na tela e uma das tarefas mais elementares que um programa tem que fazer, euma sada de dados. Vou mostrar como fazer isto inicialmente.Neste primeiro captulo vou me concentrar em fazer processamento numerico porque e aforma mais simples de conduz-lo a um domnio imediato da linguagem.

    C++ e uma linguagem orientada a objetos. Guarde isto na mente para irse acostumando com a ideia, sobretudo se voce ja tiver habitos tradicionais deprogramar.

    Neste momento esta frase representa apenas o trabalho subliminar de prepara-cao para uma forma mais evoluida de programar, para que sua mente se prepareaos poucos, sobre tudo se voce tiver habitos antigos de programacao, vou ajuda-l@ a evoluir destes habitos antigos aqui, e foi com este objetivo que a linguagemC++ foi criada. Entretanto nao e preciso, e ate seria melhor, que voce nao tivesseos habitos antigos de programar. Eu, por exemplo, tinha e me deu algum tra-balho para mudar de padrao.

    Como sera um programa nesta forma extra-terrestre de programar, orientadoa objetos ?

    2

  • Para comecar eles sao bastante normais. Na figura (1.1) pagina 3 vocetem um primeiro exemplo.

    # include int main() { cout

  • ./prog

    Na primeira linha voce tera criado com auxlio de g++ o executavel prog.Na segunda linha voce tera executado prog. Compile e rode primeiro01.cc.

    2. Tutorial sobre as opcoes do g++

    Revisando o processo de compilacao de um programa.

    g++ e o nome do compilador distribuido livremente pela Fundacao2para Software Livre;

    primeiro01.cc e o nome do arquivo onde o texto do programa seencontra gravado. E costume fazer referencia a este texto como ocodigo fonte;

    -Wall e uma opcao na linha de comandos do g++. Algum dia vocedeve ler o manual do compilador3 e ira ver a quantidade opcoes quevoce pode incluir na linha de comandos. Elas alteram a forma comoo compilador ira tratar o programa. Neste caso vai fazer com queg++ escreva tudo que viu no programa. Voce pode pedir que ele aindaseja mais falador incluindo a opcao -pedantic...

    Experimente omitir esta opcao para ver o que acontece. Depois tenteusar -pedantic. Tente tambem apagar algum ponto-e-vrgula evolte a compilar o programa com e sem -Wall e -pedantic paraver o comportamento de g++ nos dois casos.

    -oprog para indicar que voce deseja que o executavel seja chamadoprog, o o e de output. Se voce omitir esta opcao, g++ usara onome a.out. A escolha e sua.

    Experimente omitir a opcao -oprog, para ver o que acontece. Exe-cute:

    a.out

    num terminal.

    ./prog para pedir que o sistema operacional, Linux, rode o programa.Deve ser possvel digitar apenas prog, se voce precisar desta formamais complicada, isto quer dizer que o sistema esta mal instalado doponto de vista dos usuarios.

    3. Comentando o programa

    Observe que o programa contem uma funcao chamada main(). Osparenteses estao a para receber parametros e mais a frente vou lhemostrar como fazer isto. Naturalmente, main() e apenas a funcaoprincipal, mas como funcao, em princpio pode receber parametroscomo e habito com as funcoes da Matematica. Voce nunca vai fazer

    2Free Software Fundation - GNU3para ler o manual digite, numa shell(num terminal), info g++ e para sair acione q...

    4

  • uso direto de main(), ela se confunde com o programa. Se vocetiver criado o executavel prog, e a funcao main() que voce estarachamando quando executar prog.

    Os programas sao feitos de sentencas que devem ser sintaticamentecorretas de acordo com a linguagem. O que marca o fim de umasentenca e o ponto-e-vrgula final. Experimente apagar algum evolte a compilar o programa. E uma boa experencia, pode aparecermuita reclamacao, mas talvez nenhuma lhe dizendo que faltou ponto-e-vrgula.

    O comum e que o compilador diga alguma coisa como:

    11: error: parse error before

  • grave de compreensao do texto, porque, ninguem precisa aprender C para depoisaprender C++.

    Continuarei, durante algum tempo, a comparar as duas4 linguagens, mas haautores que dizem de partida que voce pode ignorar C ao iniciar o seu apren-dizado de C++. Eles nao estao errados, e eu nao vou usar C neste livro e sim fazeralgumas comparacoes dirigidas aos eventuais programadores da linguagem C queestejam lendo o livro. Se nao for o seu caso, ignore a linguagem C, simplesmente.

    Exerccios 2 (Tutorial) Tutorial sobre primeiro01.c

    1. Leia o programa5primeiro01.c e depois o compile com C++

    g++ primeiro01.c -Wall -oprog16

    e rode

    ./prog1

    Observe que g++ compila programas escritos em C.

    Agora execute (observe o que esta escrito)

    gcc -Wall -oprog2 primeiro01.c

    e voce criou o executavel prog2 usando gcc, o compilador da linguagemC.

    2. C++ entende C e a primeira licao que podemos tirar deste exemplo e queC++ pode compilar programas escritos em C.

    Mas faca uma outra experiencia, compile o programa primeiro01.cc como g++:

    g++ primeiro01.cc -Wall -oprog3

    e voce criou o executavel prog3 usando g++, o compilador da linguagemC++.

    Agora rode

    ls -lat prog1 prog2 prog3

    O comando ls de LinuX, com a opcao -lat vai lhe mostrar os tamanhosdos tres programas,

    (a) o executavel prog1 obtido com g++ a partir de um programa escritoem C;

    (b) o executavel prog2 obtido com gcc a partir do mesmo programa es-crito em C;

    4observe que falei duas linguagens, e e isto mesmo5e um programa escrito em C6a ordem dos parametros na linha de comando pode ser qualquer

    6

  • (c) e o executavel prog3 obtido com g++ a partir de um programa escritoem C++ ;

    Um e menor, e a diferenca e pequena porque sao programas muito pe-quenos. Qual e o menor ? Qual e o maior ? E por que ?

    Resposta:

    (a) prog2 e o menor, porque e um programa escrito em C e compiladocom o gcc que e um compilador otimizado para programas da lin-guagem C;

    (b) o medio e o executavel prog1 obtido com g++ a partir de um programaescrito em C;

    (c) o maior e o executavel prog3 obtido com g++ a partir de um programaescrito em C++;

    compilador compilador compiladorgcc g++ g++

    prog2 < prog1 < prog3programa em C programa em C programa em C++primeiro01.c primeiro01.c primeiro01.cc

    Conclusao errada que devemos aprender a programar em C que e maisotimizado.

    Isto e apenas meia verdade. Mas com frequencia, depois que um programaem C++ esta funcionando bem, parte dele e convertido para C. Poremos compiladores estao melhorando e esta dendencia devera mudar como tempo. Porem, se isto representar no futuro uma necessidade para voce,no momento certo voce sabera como faze-lo. Agora e apenas uma curiosi-dade.

    3. Diferencas entre primeiro01.c e primeiro01.cc:

    Semelhanca: todo programa tem uma funcao main() que e a gerentedo processo. Ela e que chama as outras. Examine agora os doisprogramas.

    A primeira diferenca fica logo na primeira linha# include

    e observe que ela nao aparece em primeiro01.cc.

    Aparece em primeiro01.c porque C e tao omizado que nao tem nemmesmo como fazer impressao de dados na tela. Precisa de uma bib-lioteca basica da linguagem C onde se encontram definidas funcoes deentrada e sada de dados, como printf().

    Experimente eliminar esta linha (com o smbolo de comentario) e,compile e analise o resultado.

    7

  • Logo no incio dos programas vem diretivas de compilacao . Elasestao caracterizadas pelo smbolo do jogo da velha seguido duma palavrachave, neste caso include. include e a traducao para o ingles denossa palavra incluir... e assim o compilador sabe que deve ir buscaro arquivo stdio.h no diretorio em que se encontram as bibliotecasda linguagem7 e incluir no programa todas as funcoes pedidas peloprograma, e apenas estas, dentre aquelas definidas na biblioteca.

    Em primeiro01.cc a linha e

    # include

    Se voce eliminar8 esta linha, (tente nos dois programas), o compi-lador vai reclamar que tem coisa que ele nao entende no programa.Experimente!

    Em primeiro01.c tem printf() para imprimir.Este programa usa uma funcao, para imprimir.

    O modo de imprimir em primeiro01.cc e bem distinto: envia amensagem para o objeto cout que sabe como imprimir.

    primeiro01.cc usa um metodo, dum objeto, para imprimir.

    Talvez voce devesse fazer agora uma primeira leitura do captulo 7,mas volte logo para ca. Ou, faca como voce fez para aprender a falar,siga usando as palavras que aos poucos voce aprende a programar. Ateoria e importante, mas ela pode ser adquirida aos poucos ao longoda pratica.

    Assim voce esta vendo onde programacao orientada a objeto estaaparecendo no programa primeiro01.cc.

    Em primeiro01.cc as mensagens estao impressas em unica linha,sem interrupcao. Experimente colocar

  • e preciso truques especiais que fazem os programas mais difceis de serem en-tendidos e consequentemente de manutencao custosa.

    Um bom programador, nas duas linguagens, prefere programar em C++porque ela e mais humana, o que se traduz com a expressao de mais alto nvel.

    Outra razao, que somente deve ficar clara com o tempo, e que os progra-mas em C++ sao mais algebricos - as classes sao modelos que podem ser re-aproveitadas, como estruturas algebricas que podem ser realizadas em exem-plos. Isto na linguagem de computacao se diz criar um objeto, como instanciade uma classe. Uma instancia, o objeto, e um exemplo realizado do modelo,a classe.

    Um programador inexperiente pode fazer programas de pessima qualidadecom qualquer linguagem de programacao, e neste sentido C++ nao ajuda muito,e muito possvelemnte pode representar um instrumento de qualidade duvidosa.

    Um mau programador pode estragar qualquer coisa.Ha uma frase presente em diversos livros de programacao que vale a pena

    citar, mesmo que eu nao possa indicar a origem: um programa mal feito etao ruim que mais vale a pena aprender a programar novamente e refazer oprograma, em vez de tentar corrigir o tal programa mal feito.

    Para concluir esta comparacao, considerando dois programas bem feitos, emC e em C++, e muito provavel que o programa escrito em C seja menor e portantorode mais rapido e que o programa em C++ seja um pouco maior e um poucomais lento. Com as velocidades bastante grandes e quantidade de memoriatambem muito grandes dos computadores, esta diferenca tende a desaparecer,ficando a qualidade do projeto, no caso de C++, como a grande diferenca.

    Se costuma afirmar que e comum, criar o programa em C++, e quando pronto,traduz-lo para C, pelo menos uma parte do programa.

    Comigo tem acontecido o inverso, tenho programado de forma tradicional(como se fosse em C) para produzir um exemplo funcionando, em seguida otransformo, criando uma classe adequada, a partir da biblioteca de funcoes, emC++.

    Voce vai ver esta pratica aqui neste livro.Em termos de velocidade de processamento, as comparacoes que tenho lido

    entre C++ e a linguagem concorrente mais proxima, Java, indicam uma ve-locidade cerca de 20 vezes superior para programas escritos em C++. Insisto,estou repetindo comparacoes feitas por outros programadores uma vez que naoprogramo, usualmente, em Java. Sendo isto verdade, e e muito provavel queseja, nao ha necessidade de fazer a traducao mencionada acima, de programasterminados e testados em C++, para a linguagem C.

    C++ e uma linguagem definitiva!Possivelmente, voce nunca precisara de descer aos poroes da linguagem e

    aprender C.

    9

  • 1.2 Entrada de dados

    Vou usar variaveis nos programas desta secao. Voce e convidado a ler um pouco a respeito

    no captulo 5. Mas faca uma leitura rapida e volte logo para ca.

    Um programa que faca qualquer coisa interessante tem que usar variaveis9.

    1.2.1 Usando variaveis num programa

    E, a nota de rodape e sempre um pouco incoveniente, mas fala a verdade.O programa primeiro03.cc tem a sua utilidade e nao tem nenhuma variavel.Mas em geral nao e assim. Como os programas sao uma abstracao de problemas,modelos, para representarem algum aspecto da realidade, do mundo real, elesprecisam de expressoes que possam ser alteradas, porque a realidade muda e osprogramas servem para analisar estas mudancas. Isto se faz com variaveis.

    O captulo 5 trata de variaveis e e util fazer uma primeira leitura dele erapidamente voltar para ca.

    A proxima lista de exerccios analisa o programa primeiro03.cc mais deperto e vai conduz-lo a novas versoes do programa.

    Exerccios 3 (Tutorial) Variaveis num programa

    1. Rode o programa primeiro03.cc:

    g++ -Wall -oprog primeiro03.cc

    e depois

    ./prog

    2. Leia primeiro03.cc e volte a roda-lo ate que tudo fique claro no programa.

    3. Altere primeiro03.cc para que ele escreva mais texto de sua autoria,apagando a tela entre os blocos de texto.

    A responsavel por apagar a tela e a funcao system(). Ela chama umutilitario do sistema, clear, que apaga a tela.

    4. Usando comandos do sistema Experimente digitar clear e num terminal. Aprenda a abrir terminais, vou usar muitos terminaisneste livro. . .

    5. Observe que de dentro de um programa voce pode chamar os utilitarios dosistema.

    Voce pode chamar o proprio programa desta forma. Mas, deixe para faze-lo quando tiver mais experiencia, isto pode usar muito memoria do sis-tema se houver algum erro no seu programa. Experimente o programaprimeiro04.cc. Compile e rode! Mais interessante e fazer isto enquanto

    9Claro que isto e falso, rode primeiro03.cc

    10

  • ele aparece editado em outro terminal para que voce compreenda o queesta acontecendo: ira rodar dezenas de copias do programa prog10. Pareo programa com CTRL-C, se nao conseguir, abra outro terminal e neledigite:

    killall prog

    e de enter.

    6. Voce pode criar os seus proprios utilitarios do sistema. Em vez de usarclear para limpar a tela, crie um apagador

    Solucao: apagador.cc

    7. Voce pode criar o seu utilitario avisando que saiu para tomar cafe e logovolta, tente!

    Solucao: cafe.cc

    8. Faca um programa no qual esteja definida uma equacao e que o programalhe peca valores da variavel para substituir na equacao.

    Solucao: primeiro05.cc

    9. Altere primeiro05.cc para limpar a tela mais vezes e sobre tudo deixara tela limpa quando sair. Observe que em primeiro05.cc existem oscaracteres especiais \t que e o tabulador. Experimente os caracteres\a e \n.

    10. Acrescente mais variaveis ao programa primeiro05.cc para verificar seos pontos calculados com a equacao de fato se encontram sobre uma reta.

    Solucao: primeiro06.cc

    11. No programa primeiro06.cc, uma das linhas saiu do alinhamento databulacao. Analise porque, (esta indicado num comentario no programa).Corrija este defeito (nao e um erro...)

    12. Inclua uma variavel teste em primeiro06.cc para guardar um dos coefi-cientes angulares e depois de comparar com o outro emitir um laudo sobrea posicao dos pontos.

    Solucao: primeiro07.cc

    13. O programa primeiro07.cc tem diversos defeitos, (acredite, eu os deixeipara que voce aprenda!) 11. Leia os comentarios e se inspire neles paraalterar o programa de modo que o resultado seja melhor, sem frases desa-linhadas etc...

    10A cada enter que voce der, roda uma nova copia. Como e um programa muito pequenoisto nao afeta muito o desempenho do computador, mas nao pode ser usado na pratica.

    11Acredite se quiser, eu acho que este autor nao sabe mesmo programar!

    11

  • Usei variaveis do tipo int e do tipo float em alguns programas na lista deexerccios acima.

    As variaveis numericas sao as mais simples de serem usadas em qualquerlinguagem de programacao. Voce deve fazer um passeio ao captulo 5 para umarapida leitura dos assuntos que ele trata. Faca uma leitura superficial para seinteirar de que as variaveis tem tipo e que existe uma razao forte para isto.

    Igualdades

    O programa primeiro07.cc apresenta um problema esquisito, compara doisnumeros iguais e conclui que eles podem ser diferentes. Este e um dos problemasdo Calculo e da Analise Numerica: e difcil de se obter uma igualdade. Oprograma calcula os coeficientes angulares de dois segmentos sobre uma mesmareta

    b3 b2a3 a2 ,

    b2 b1a2 a1 (1.1)

    e o calculo resulta em uma pequena diferenca conduzindo o programa a concluirque os numeros podem ser diferentes.

    A solucao para a busca de igualdades, em computacao, e procurar umadesigualdade. Uma solucao se encontra no programa primeiro08.cc em quesubstitu a busca de uma igualdade por um teste envolvendo uma desigualdade

    teste = b2b1a2a1

    (1.2)

    |teste b3b2a3a2

    | < 0.00001 (1.3)e sendo este ultimo teste verdadeiro, o programa reconhece que os dois pontosse encontram sobre a mesma reta. Leia tambem o comentario (100) sobre o usoda biblioteca math.h e faca a experiencia que o comentario sugere.

    1.2.2 Usando funcoes

    O captulo 4 discute funcao, e seria interessante que voce fizesse uma rapida leitura destecaptulo.O ponto de partida sera o programa primeiro09.cc incluindo uma funcao definida pelaprogramadora.

    As funcoes sao o centro da programacao12 em C++ e vou agora alterar oprograma primeiro09.cc usando este conceito.

    Em todos os programas que estudamos ate agora, as modificacoes sucessivasde primeiro01.cc sao formados de uma unica funcao: main().

    O programa primeiro09.cc e bem simples tem uma mensagem de tres lin-has para facilitar o meu objetivo imediato que e mostrar-lhe o significado dasfuncoes.

    12As funcoes sao importantes em qualquer linguagem de programacao atual, depois elaspassarao a ser chamadas de metodos.

    12

  • Este conceito, funcao, e a forma como se modularizam os programas.Uma funcao e um pequeno algoritmo que uma outra funcao chama, desen-

    cadeando o fluxo formado por pequenos processos, os atomos de um programa.Com frequencia main() e apenas uma listagem em que diversas funcoes sao

    sucessivamente chamadas. Um programa euma colecao defuncoes chamandooutras funcoes,

    tudo isto gerenci-ado pela funcao

    main()

    Nao e possvel fazer programas interessantes sem funcoes.Leia rapidamente o captulo 4 para completar as informacoes de que preciso

    aqui, entretanto nao sera preciso muita coisa neste primeiro momento. Vocepode fazer uma leitura mais completa do captulo depois.

    Primeiro aprenda a usar as funcoes. O proximo tutorial tem este objetivo.Voce vai aprender a usar as funcoes, depois voltaremos a discutir a teoria, nocaptulo 4.

    Exerccios 4 (Tutorial) Construcao de funcoes

    1. Abra o programa primeiro09.cc, leia e rode o programa.

    2. Um programa tem que ter uma funcao principal, main(). Mas pode teroutras, e este tem, a funcao return(). A alteracao deste programa quese encontra no arquivo primeiro091.cc. Vou passar a` analise do novoprograma:

    Se voce tiver se apressado e compilado o programa, achou erros! Logovou discutir estes erros.

    Criei a funcao, mensagem(), colocada logo depois do final de main(); transferi para mensagem() a tarefa de imprimir as mensagens queantes se encontravam em main();

    em main() coloquei o comando13 mensagem();

    3. Compile e rode o progama primeiro091.cc. Leia e compare os programasprimeiro09.cc, primeiro091.cc

    4. Ocorreu um erro, certo?

    primeiro091.cc: In function int main():

    primeiro091.cc:23: error: mensagem was not declared in this scope

    e porque precisamos informar ao compilador que existe uma funcao quevai ser usada. Leia o comentario ao final do programa, nele voce encontrainstrucoes de como corrigir o programa. A correcao se encontra em

    primeiro092.cc

    Compile e rode o progama primeiro092.cc.

    5. O programa primeiro092.cc ainda esta errado, mas agora foi uma sim-ples aviso que o compilador fez: warning:

    13Cada nova funcao que voce criar, e um novo comando que voce estara criando.

    13

  • primeiro092.cc: In function int mensagem():

    primeiro092.cc:34: warning: control reaches end of non-void function

    6. Leia o comentario no programa, nele voce encontra a sada para o avisona compilacao de primeiro092.cc.

    7. Melhore primeiro092.cc colocando algumas mudancas de linha. Corrijatambem o defeito mencionado no comentario, use os dois metodos sugeri-dos.

    solucoes: primeiro092a.cc primeiro092.cc

    Vamos analisar a metamorfose de primeiro09.cc para ser transformadoem primeiro092.cc.

    A sua primeira reacao pode ser que o autor apenas complicou as coisas.E e verdade!Mas o proximo exemplo vai mostrar-lhe que esta tecnica complicadora e

    salutar, aguarde um pouco.Antes de prosseguir vamos repassar os detalhes da criacao de uma funcao.

    Para definir uma funcao e preciso,

    antes de main() declarar o prototipo da funcao, a primeira linha copiadada definicao da funcao, mas terminada com ponto-e-vrgula, e colocada noincio do programa, onde ficam todas as declaracoes iniciais.

    Este e o erro que havia em primeiro091.cc, a ausencia do prototipo.

    Depois construir a definicao da funcao. Finalmente chama-la la dentro de main(), ou de dentro de uma outrafuncao, porque, num programa mais complexo o comum e que,

    main() chama algumas funcoes ecada funcao chama outra funcao,

    que chama outra funcao,que chama outra funcao,

    que chama . . . uma funcaose o programa estiver correto

    para!senao ....

    e melhor aprender a programar efazer outro programa!

    Continuando com o tutorial, agora alterando primeiro07.cc.Voce ja rodou este programa, e ja o leu?Ele tem umas repeticoes que indicam que ele esta mal feito. E preciso

    de algumas funcoes para evitar este defeito. Um texto repetido dentro de umprograma e um indcio de que alguma coisa esta errada.

    14

  • Exerccios 5 (Tutorial) Ainda sobre funcao

    1. Crie uma funcao mensagem() para apresentar o programa. Nao se esquecado prototipo, mas se voce se esquecer o compilador vai alerta-l@ disto. Enao se esqueca de chamar mensagem() no local certo em main().

    Solucao: primeiro071.cc

    2. Leia o comentario (80) em primeiro071.cc e crie uma funcao adequada.Nao se esqueca do prototipo... etc... Ha um erro antigo, herdado deprimeiro071.cc, corrija este erro. Leia o comentario (120) emprimeiro072.cc.

    Solucao: primeiro072.cc

    3. Corrija o erro no coeficiente angular do programa primeiro072.cc leia ocomentario (120).

    Solucao: primeiro073.cc

    4. Crie uma funcao laudo final() para emitir a mensagem final do pro-grama primeiro073.cc. Esta funcao deve receber as variaveis x1, x2,x3, y1, y2, y3 para calcular os coeficientes angulares.

    Solucao: primeiro074.cc

    5. Ha ainda uma repeticao de rotinas em primeiro074.cc que podem serexecutadas por uma funcao, faca isto. Talvez voce precise de duas funcoesf1, f2.

    Solucao: primeiro075.cc

    6. Ha ainda uma repeticao de rotinas em primeiro074.cc que podem serexecutadas por uma funcao imprime pontos().

    Solucao: primeiro076.cc

    7. Infelizmente o programador esqueceu-se de calcular alguma coisa emprimeiro076.cc

    e os pontos estao sendo calculados de uma forma extranha. Descubraonde esta o erro, leia o comentario (300).

    Solucao: primeiro077.cc

    No tutorial anterior voce acompanhou a evolucao de um programa para neleincluir diversas funcoes que executavam, cada uma, tarefas especficas que anteseram repetidas dentro do programa inicial.

    O planejamento nao foi dos melhores. Ha formas bem mais organizadasde obter o resultado alcancado pelo programa primeiro077.cc mas nao era oobjetivo neste momento atingir um planejamento melhor. Eu queria ilustrar acriacao e uso do conceito de funcao.

    Embora eu ainda nao tenha discutido este conceito a fundo, isto sera feitono captulo 4, de agora em diante ja vou usar funcoes nos programas.

    15

  • Cabe aqui uma pequena analise do que foi obtido com o programaprimeiro077.cc.

    A funcao main() agora assume um papel de planejamento do trabalho.Voce vera que esta atitude sera adotada seguidamente no futuro.

    Dividimos o trabalho em pequenas tarefas (funcoes). Cada uma destastarefas podem ser verificadas separadamente antes de serem usadas dentrodo programa. Estude o programa

    testa funcao01.cc

    Ele mostra como se pode testar uma funcao.

    A divisao do trabalho em pequenas funcoes que executem, cada uma delas,uma pequena tarefa, garante uma probabilidade mnima de erro.

    Pequenas funcoes sao objetos importantssimos para os quais sempre va-mos encontrar novas utilizacoes. Analise a bilioteca

    Ambiente.h

    que traz a definicao da classe Ambiente, sem dar grande importancia aofato de que ela seja uma classe. As classes serao estudadas no captulo 7.Observe que Ambiente.h e formada de um conjunto de pequenas funcoes(agora chamadas de metodos da classe Ambiente). Na proxima secao fareiuso direto de Ambiente.h. Em quase todos os programas que voce estudoate agora, a biblioteca Ambiente.h esta sendo declarada. Experimenteisola-la com um comentario e depois compile o programa.

    Vai dar erro, provavelmente. E que Ambiente.h esta se reponsabilizandopela declaracao de C para C++. Mais a frente voltarei a esta questao.

    Voce foi inicializado no conceito de funcao. Passe a usar funcoes vendo nosprogramas primeiro071.cc ...primeiro077.cc como elas sao definidas. Masguarde a observacao, as funcoes que construi nesta sequencia tinham o objetivode mostrar como fazer, e em alguns casos nao foram a melhor solucao.

    O metodo que descrevi e o que se usa na producao de programas:

    Vamos aos poucos construindo a versao melhor de um programa a partirde uma sucessao de versoes que corrigem os erros das anteriores.

    Em geral este trabalho e feito em equipe, o trabalho e divido entre osmembros da equipe e cada um constroi as suas funcoes e as testa. Vocevai ver, quando se constroi uma boa funcao14, nao e necessario que ninguema leia para usa-la. Ela e em geral simples, faz poucas coisas, tem um nomeque identifica bem o seu objetivo e pode trazer uma ajuda dando dicassobre o seu uso.

    14Aos poucos vou deixar de usar a palavra funcao. Em programacao orientada a objetosnos as chamamos de metodos.

    16

  • Experimente digitar tar, seguido de enter, numa shell, (sem as-pas).

    Experimente15 digitar factor 34344343542 (sem aspas) numa shell.

    Experimente digitar factor h (sem aspas e sem parametros).

    tar nao e o melhor exemplo porque e um programa bem complexo...formado de diversos metodos!

    factor tambem nao e muito simples, mas e um exemplo de utilitariobem feito e tremendamente util, com algumas funcoes chamandoumas as outras.

    Finalmente juntamos o trabalho no programa final, como tar ou factore o distribuimos16, gratuitamente, na rede.

    Na ultima atualizacao que fiz da minha caixinha Linux foi acusada a presencade 350 mil programas ou arquivos instalados. Entre eles se encontra

    factor que fator um numero inteiro de tamanho arbitrario,

    factor 234255550

    234255550: 2 5 5 41 229 499

    pi que, escreve o numero pi com um numero arbitrario de casas decimais:

    3.141592653589793238462643383279502884197169399375105820974944

    59230781640628620899862803482534211706798214808651328230664709

    38446095505822317253594081284811174502841027019385211055596446

    229489549303819

    1.3 As operacoes aritmeticas

    Um dos objetivos de uma linguagem de computador e fazer contas com numeros. Algumaslinguagens sao capazes de fazer contas com smbolos, com letras, como em algebra, isto sechama de computacao algebrica. Nao podemos fazer computacao algebrica diretamente comC++, podemos faze-lo com uma ferramenta escrita com C++, mas nao sera o objetivo destelivro.

    Vou lhe falar nesta secao de operacoes aritmeticas, quer dizer que osprogramas vao fazer contas com numeros. Faca uma leitura inicial do assunto

    15Este programa, factor. pode nao estar instalado, instale, ou peca ao administrador dosistema que ele seja instalado.

    16Nem tar e nem factor sao de autoria do autor deste livro...tar e um utilitario comumnas estacoes unix - como Linux.

    17

  • tpos de dados no captulo 5. As variaveis tem tipo e aqui vou descrever o queacontece com o tipo de dados chamado int.

    Vou usar uma das versoes de primeiro07.cc para mostrar-lhe que nunca17

    comeco do zero, sempre uso um programa que ja faz alguma coisa parecidocom aquilo que desejo fazer, para isto uso as palavras chave que deixo dentrodos programas.

    Certo, o nunca e um exagero, mas no mnimo comeco com00esqueleto.cc

    e com isto nao me esqueco

    de usar comentarios; de identificar a equipe que escreveu o programa; de registrar o meu objetivo com o programa; de registrar as palavras chave do programa; de usar as biblioteca basicas, (as classes basicas).Leia o programa 00esqueleto.cc, mais do que isto, o modifique para que

    ele atenda a`s suas necessidades iniciais. Voce ja deve ter observado que osprogramas todos tem, nos comentarios iniciais, um item, palavras chave. Sevoce executar

    grep chave *.cc | more

    voce vai ter uma lista de todos os assuntos18 que os programas cobrem e poderaescolher um programa que esteja proximo do que voce deseja. Mantenha esteitem atualizado nos seus programas.

    Vou fazer uma copia de primeiro077.cc para segundo01.cc e fazer algumasalteracoes para comecar o trabalho:

    cp primeiro077.cc segundo01.cc

    Exerccios 6 (Tutorial) Funcoes e classe

    1. Leia e rode o programa segundo01.cc. Ele esta errado e o comentario(100), dentro do programa, identifica o erro. Corrija e rode o programa.

    2. Altere segundo01.cc (a versao que voce tiver corrigido) para calcular acombinacao linear z na equacao

    z = a1t1 + a2t2 + a3t3

    em que a1, a2, a3 sao constantes do programa e o usuario fornece os valoresde ti. Mantenha os valores de default para ti, de forma que o usuario possausa-los, se quiser, quando o programa executar cin >> ti 19.

    17As vezes comeco usando 00esqueleto.cc...18Executando grep chave *.cc > chaves voce cria um arquivo chamado chaves con-

    tendo a lista de todas linhas com as palavras chave dos programas. Este comando e destrutivo,vai substituir o arquivo chaves, se ele existir.

    19cin e um objeto definido em iostream para entradadas de dados, e >> e o metodo paraacessa-lo. Metodo ? que e metodo ? faca uma leitura rapida do captulo 7

    18

  • No momento da leitura de dados, dando enter, o valor existente em tisera utilizado. E o que se chama de valor default, ou um valor padraopara uma variavel.

    Solucao: segundo02.cc

    3. O programa segundo02.cc tem outro erro. Compile o programa e de-pois veja o comentario (40) que indica como corrigir o erro. Corrija oprograma, transformando o erro em comentario.

    4. No programa segundo02.cc criei uma funcao para fazer entrada de da-dos. Estude o programa e veja como isto foi feito, mas nao se considereessencial dominar tudo. Use primeiro, depois entenda. Esta funcao virouum metodo da classe Ambiente.

    5. O programa segundo02.cc tem uma sada de dados muito pouco explica-tiva. Altere-o para que ele explique qual foi a combinacao linear feita.

    Em segundo02.cc constru uma funcao para fazer entradas de dados do tipoint. A funcao usa duas funcoes da linguagem C para entrada de dados.

    Nao sofra muito procurando entender a fundo o funcionamento destas funcoes,esta e uma solucao rapida que pode sera substituida, mais a frente, por codigogenuinamente C++. Aqui serve de exemplo de uso de C, depois voce vera outraopcao e podera selecionar qual prefere.

    Exerccios 7 (Tutorial) Metodos de Ambiente

    1. Compile, rode e leia o programa segundo02.cc.

    g++ -Wall -oprog segundo02.cc e depois rode: ./prog.

    2. Leia o metodo entrada int() definido em Ambiente.h. Como esta en-trada de dados ja estava madura, (vinda de meus proggramas em C), eu ainclu em uma biblioteca20.

    3. Leia o arquivo Ambiente.h, ele contem uma classe (classes serao estu-dadas no captulo 7). O objetivo da classe Ambiente e oferecer pequenosmetodos que tem uma utilidade geral, em diversos programas.

    Ambiente.h e uma evolucao, para classe de minha antiga bilioteca defuncoes ambiente.h escrita para os programas em C. Compare as duas,ambas se encontram no disco.

    4. Experimente rodar o programa apeteco.cc

    g++ -Wall -oprog apeteco.cc e depois rode: ./prog.

    O programa apeteco.cc foi transformado num metodo de Ambiente.Tudo que este programa faz e emitir uma mensagem solicitando que voceaperte enter para finalizar o programa.

    20Agora as bibliotecas devem conter classes, Ambiente e uma classe definida em Ambiente.h.

    19

  • 5. Agora leia o arquivo Ambiente.h e voce ira encontrar uma versao deapeteco.cc transformada em um metodo da classe Ambiente. Na ver-dade ira encontrar tres: apetecof(), apeteco2(), apeteco()

    Nos proximos exerccios vou usar a classe Ambiente dentro dos programas.Uma primeira leitura do captulo 7 e util, agora. Mas faca apenas uma primeiraleitura e volte para aprender-usando na lista de exerccios seguinte.

    Exerccios 8 (Tutorial) A classe Ambiente

    1. Leia o programa segundo03.cc. Em particular observe

    (a) Tem um # include para incluir a bibliteca Ambiente.h;

    (b) Depois tem uma definicao de tipo

    Ambiente Tela

    criando uma nova variavel (e um objeto da classe Ambiente). Sedeve dizer que e uma realizacao da classe Ambiente, em ingles, aninstance of the class Ambiente.

    (c) Depois usei alguns metodos de Ambiente herdados por Tela

    Tela.apetecof(), Tela.limpa janela()

    Leia o programa e volte a roda-lo.

    2. Faca algumas experiencias e analise o resultado, com o programa

    segundo03.cc

    (a) Apague (use comentario) #include Ambiente.h. Compile erode o programa. O erro e o mesmo que o de usar uma variavelnao declarada. Tela nao foi declarada.

    (b) Volte a incluir #include Ambiente.h, mas, onde tiverTela.limpa janela()

    apague o prefixo Tela. Compile e rode o programa. Agora o erro eindica que a funcao limpa janela() nao existe - nao foi declarada,apesar de que esteja definida em Ambiente.h.

    E que limpa janela() nao e mais uma funcao, e um campo da classeAmbiente. Para ser utilizada tem que ser acessada como um campode um objeto desta classe, no caso, Tela, portanto com a sintaxe

    Tela.limpa janela()

    3. Faca um pequeno programa apenas para usar

    apetecof(), limpa janela() herdados por um objeto chamadoComunicacao

    Se inspire no uso de Tela.

    Solucao: segundo04.cc

    20

  • 4. Escreva um programa que imprima todos os numeros inteiros de 1 ate 10.

    Solucao: segundo05.cc

    5. O programa segundo05.cc sugere que voce aprenda a usar o while().Compareca ao captulo 3 para ver como se usa while(). Tente transfor-mar segundo05.cc numa versao mais evoluida.

    Solucao: segundo06.cc

    6. segundo06.cc descreve os termos de uma p.a. de razao 1 tendo comoprimeiro termo 1. Altere segundo06.cc para obter

    (a) Uma p.a. com razao 3 e primeiro termo 5;

    (b) Uma p.a. com razao -5 tendo por primeiro termo 17

    Solucao: segundo07.cc

    7. O programa segundo07.cc lhe apresenta um atalho21 que se originou nalinguagem C. Leia o comentario (50) e faca as experiencias sugeridas.

    8. Em segundo07.cc alterne a posicao das linhas dentro do while() e analiseo resultado.

    9. Altere segundo06.cc para calcular a soma dos 1000 primeiros numerosnaturais (inteiros positivos).

    Solucao: segundo08.cc

    10. O programa segundo08.cc imprime, inutilmente, os valores intermediariosacumulados na variavel soma. Elimine este defeito.

    Solucao: segundo081.cc

    11. Mas talvez fosse interessante ver as somas parciais, por exemplo, a cada20 parcelas. Um if() resolveria este problema. Leia a respeito de if()no captulo 3 e altere segundo081.cc para que sejam impressas algumassomas parciais. Voce vai precisar de uma variavel contador para con-trolar estes eventos.

    Solucao: segundo082.cc

    Em todos os programas passarei a usar a biblioteca22 Ambiente.h para es-tabelecer comunicacao com o usuario do programa.

    E possvel que a notcia sobre o direito autoral o aborreca, ela se torna assimum exerccio, o de elimina-la dos programas, ou transforma-la em um texto quelhe pareca mais agradavel. Depois vou ensinar-lhe a evitar este aborrecimentopermitindo ao usuario o direito de nao ler comentarios dos programas.

    Leia a biblioteca Ambiente.h, mas com o objetivo de conhece-la. Ela usao conceito de classe que sera estudado no captulo 7.

    21Os atalhos sao discutidos no captulo 222Eras do autor! Nao e uma biblioteca, e uma classe, um modelo!

    21

  • Exerccios 9 (Tutorial) if()/else

    1. maior do que Faca um programa que solicite do usuario um numero maiordo que 100 e teste se ele fez isto.

    Solucao: terceiro01.cc

    2. else Se o usuario tiver obedecido ao solicitado, o programa termina semdize-lo! Isto pode ser alterado incluindo um complemento ao if() que eo else. Leia a respeito no captulo 3 e faca um programa mais completo.

    Solucao com um erro: terceiro02.cc

    3. else O programa terceiro02.cc , infelizmente, esta errado23, mas o co-mentario (20), dentro do programa, explica porque. Corrija o erro aten-dendo ao comentario do programa.

    4. desigualdade Faca um programa que solicite do usuario dois numeros, ummaior do que 100 e outro menor do que 50 e depois teste os resultados. Oprograma terceiro03.cc pretende fazer isto, mas ele esta errado, porque ? Rode varias vezes o programa com as distintas possibilidades paraverificar por que ele esta errado. Leia o comentario (50), no programa.

    Solucoes: terceiro03a.cc , terceiro03b.cc

    5. logica, conjuncao Em terceiro04.cc estou usando a conjuncao logicacondicao1 && condicao2 como parametro do if(). Verifique se esteprograma resolve a questao anterior.

    6. equacao Faca um programa que resolva a equacao (inteira)24

    x+ b = c

    Solucao: terceiro05.cc

    7. Dependendo dos coeficientes, o programa terceiro05.cc pode apresentara equacao de uma forma pouco elegante: x + 3 = 7... Experimente edepois corrija este defeito do programa.

    Solucao: terceiro06.cc

    8. Ainda ficou uma imperfeicao no programa, ele escreve a equacao x+0 = 7,e eu gostaria que ele escrevesse x = 7. Faca esta correcao.

    Solucao: terceiro061.cc

    9. Para resolver uma equacao qualquer do primeiro grau, voce precisa do tipofloat25. Altere terceiro06.cc para resover uma equacao do primeirograu Ax +B = C.

    Solucao: terceiro07.cc

    23Va se acostumando, este livro esta cheio de erros!24sobre o conjunto dos inteiros25ponto flutuante

    22

  • 10. desigualdade Para resolver uma desigualdade temos que analisar se em

    Ax+B C

    o coeficiente A e positivo ou negativo. Use if()/else e escreva umaprograma que resolva esta desigualdade.

    Solucao: terceiro08.cc

    11. O rotulo26 de terceiro08.cc esta errado (tpico quando se re-aproveitaum programa...). Corrija isto.

    12. Faca um programa que resolva equacoes do segundo grau. Altereterceiro08.cc

    por exemplo. Considere as etapas: (produza as funcoes que as vao repre-sentar)

    Analise primeiro quais sao as etapas do problema; altere rotulo() de forma conveniente; faca as funcoes que resolvem cada uma das tarefas que voce tiveridentificado;

    re-escreva main() para gerenciar o processo: o script.Solucao: terceiro09.cc

    13. Rode e leia terceiro09.cc. Observe que tem apeteco2() em excesso noprograma. Corrija isto.

    14. O programa terceiro09.cc resolve equacoes do segundo grau com razesreais. Leia e rode o programa. Termine o programa para que ele calcule asrazes complexas atendendo as recomendacoes que ficaram no programa.

    Solucao: terceiro091.cc

    15. Faca um planejamento diferente do que foi usado em terceiro091.ccpara resolver equacoes do segundo grau.

    Use a funcao main() como planejamento; crie funcoes vazias de acordo com o planejamento feito com main(); construa as funcoes que main() chama.

    Solucao: segundo grau*.cc

    26Chamo de rotulo aos comentarios que coloco no incio dos meus programas.

    23

  • 1.4 Operacoes com os inteiros

    Os numeros, em computacao, nao sao o mesmo tipo de objetos para a Matematica. Umdiferenca fundamental separa estes dois campos do conhecimento

    para a Matematica os numeros formam um conjunto infinito;

    nao tem sentido em computacao falar-se em conjunto infinito, e mais, um numero eum tipo de dado. Voce pode ler mais a respeito de tipo de dado no captulo 5.

    em Matematica se estabelece uma departamentalizacao para os numeros, mas porrazoes puramente formais, e no fundo todo numero pertence a ao conjunto dos numeroscomplexos, em computacao ha uma clara divisao entre numero inteiro e numero componto flutuante, float. Uma razao desta diferenca se deve ao espaco que cada umdesses tipos de dados numericos ocupa na memoria.

    Leia o captulo 5.

    Considerando que um inteiro e um tipo de dados para linguagens de com-putacao, um dos objetivos do proximo tutorial e a identificacao do espaco queum inteiro ocupa na memoria e as restricoes que as operacoes da aritmeticasofrem com este tipo de dados.

    Como quero fazer um pouco de aritmetica, nada mais natural do que fixarcomo objetivo montar uma calculadora. Neste momento sera uma calculadoramuito simples, mas ao final do livro voce vai observar que este projeto simples eo passo inicial de um projeto mais ambicioso que se encontra mais para frente.

    Rode o programa inteiros01.cc. Rode e leia o programa. E um programamuito rudimentar, nao tem uma boa apresentacao, tem erros nas mensagens, ee um bloco monoltico.

    Vou criticar este programa e transforma-lo num programa bem planejado.O proximo tutorial vai partir de um programa que e uma copia (melhorada)

    de inteiros01.cc.

    Exerccios 10 (Tutorial) Sobre os inteirosA leitura de programas e um exerccio importante em que voce adquire

    a experiencia de outro programador. Porem, a` medida que os programas foremficando mais complexos, este exerccio ira ficando mais difcil. Uma forma defacilitar esta analise consiste em abrir dois terminais:

    num deles voce roda o programa; no outro voce edita o programa.

    assim, ao mesmo tempo que voce le o codigo fonte tambem ve o programarodando.

    Em Linux isto e facil de ser feito! Abra dois terminais, num deles voce rodao programa, no outro voce edita o programa.

    1. Leia e rode o programa quarto01.cc. Faca uma listagem dos metodos queeste programa herda da classe Ambiente.h.

    24

  • 2. Refaca o programa quarto01.cc para torna-lo independente de Ambiente.h.Conclua se ha vantagens no uso desta classe. sugestao: copie os metodosde Ambiente.h transformando-os em funcoes do programa, sem fazer grandesesforcos para entender como funcionam. Aprenda usando! Abaixo vocetem a solucao, mas tente a sua primeiro.

    solucao: quarto01 c.cc

    3. Altere quarto01.cc para fazer todas as quatro operacoes com os numerosfornecidos. sugestao: Este e um grande projeto! Divida-o em 5 pequenosprojetos: adicao, subtracao, multiplicacao, divisao (aqui pode dar proble-mas...), modulo (resto na divisao por). Faca cada um deles funcionar antesde acrescentar o outro. Lembre-se, a primeira versao de um programa naodeve deve ter nenhuma arte, a parte artstica vem posteriormente e e oque ficou faltando a todos os programas deste livro. . .

    Solucao: quarto02.cc

    4. Se voce rodar quarto02.cc com numeros realmente grandes, na classe demilhar, a multiplicacao pode ter resultados extranhos, experimente. Vocetambem vai encontrar resultados extranhos com respeito a` divisao. Leiao captulo 2 a respeito da divisao inteira. Outras justificativas voce vaiencontrar lendo a respeito do tipo int no captulo 5.

    O programa quarto02.cc e extenso mas nao e difcil. Vou analisa-lo emalgum detalhe, agora, antes de partir para a construcao da calculadora. Leiatambem no programa os comentarios, nao se esqueca de que eles fazem parteintegrante do texto deste livro.

    Ele tem pelo menos um defeito de planejamento27 indicado no proprio pro-grama que e a existencia de uma segunda funcao principal licao inteiro()que faz tudo. Este papel e da funcao main(). Para corrigir isto basta levarlicao inteiro() para dentro de main().

    Outro defeito: falta-lhe um menu de opcoes, compile e rode o programaquarto03.cc para ter ideias de como melhorar este. A figura (1.2) pagina 26,mostra como aparece na tela o menu do programa quarto03.cc.

    Um desafio! Claro, se tratam de defeitos de planejamento, mas o programapode ficar assim e funcionar. O autor esta satisfeito com o resultado, a leitoradeve ficar insatisfeita e produzir algo melhor que se enviado ao autor pode serincludo na proxima edicao com creditos para quem enviar a melhor solucao.Observe que a calculadora ja e uma solucao melhorada. . .

    quarto02.cc se compoe de cinco funcoes que descrevem as cinco operacoeselementares da aritmetica. A quinta operacao e o calculo do resto. Voce podeler mais a respeito dos operadores aritmeticos da linguagem C++ no captulo 2.

    Em C++ a divisao se comporta de uma forma aparentemente extranha. Aocalcular uma divisao entre numeros inteiros, o que vamos obter e o quociente.Leia novamente quarto02.cc, na parte final esta a funcao divisao euclidiana()

    27A verdade mesmo e que nao houve planejamento nenhum. . .

    25

  • Figura 1.2: Um menu de opcoes

    que usa o algoritmo da divisao euclidiana escrevendo quociente, resto com adivis~ao e o modulo.

    O modulo28 e a quinta operacao fundamental da aritmetica. Leia mais arespeito no captulo 2.

    Para construir a calculadora vou usar o controle logico switch() que setraduz por escolhe ou seleciona. E o nome em ingles para interruptor eletrcode parede para selecionar em dois estados de uma lampada: acesa ou apagada.

    Este controle, switch(), e a boa opcao sempre que voce tiver varias opcoesentre a`s quais uma deve ser escolhido, por exemplo, e excelente para constuirmenus.

    Esta palavra em ingles tambem significa conecta e e exatamente isto que sequer dizer. Pense naquelas caixas de conexao a` internet em locais em que hauma rede de computadores. Na figura (1.3) pagina 27, voce ve um switch parainternet. E um aparelho que conecta cada um dos computadores em uma redeinterna. O sinal de internet entra no primeiro conector e o aparelho escolhe paraqual computador devera enviar os datagramas que estao chegando.

    Em computacao switch() generaliza o if() permitindo que escolhamosentre varios estados. Voce pode fazer um switch() com varios if()/elsestambem, mas fica complicado e feio.

    Veja o arquivo switch.cc que nao e um programa. Quando voce precisarde usar esta estrutura logica podera chamar este arquivo e inclu-lo em seuprograma. Leia o arquivo para entender a sintaxe desta estrutura de controlelogico e leia mais a respeito no captulo 3.

    Vamos alterar quarto02.cc incluindo nele o arquivo switch.cc para con-struir o programa inicial da proxima lista de exerccios.

    28O significado da palavra modulo, aqui, e o mesmo da Algebra quando da se refere a`sclasses quocientes no resto da divisao

    26

  • Figura 1.3: Um switch para internet - conecta os computadores

    Exerccios 11 (Tutorial) A calculadora

    1. Faca um programa que simule uma calculadora com as quatro operacoes.

    Solucao: quarto03.cc

    2. Leia rode e estude quarto03.cc. Ao estudar, tente fazer alteracoes ecompilar para verificar se obteve o que esperava.

    3. O programa quarto03.cc precisa que voce indique com um numero quale a opcao desejada. Vamos aprender a responder com o sinal da operacaoe depois melhorar quarto03.cc.

    (a) Rode o programa ascii.cc e depois o leia. Ele usa a estrutura decontrole for() sobre a qual voce pode ler mais no captulo 3. Vocepode tambem o arquivo for.cc que e um esqueleto para o uso defor().

    (b) Experimente o que o texto do programa ascii.cc sugere.

    (c) O programa ascii.cc tem um if() para controlar quantos caracteresserao impressos na tela de cada vez. Ele imprime de 10 em 10. Altereo programa para que ele passe a imprimir de 15 em 15.

    (d) Faca um programa que imprima os 100 primeiros termos de umaprogressao aritmetica transformado ascii.cc para isto.

    Solucao: quarto05.cc

    (e) Altere quarto05.cc para que ele receba o sinal da operacao que vocedeseja executar.

    Solucao: quarto06.cc ignore as reclamacoes (warning), mas elasindicam que tem uma forma melhor de programar que ficara maisclara a partir do captulo 6.

    ++

    27

  • 1.5 Palavras e frases

    Nesta secao vou mostrar-lhe como C++ pode agir sobre texto. Como texto e um tipo dedado muito grande, e interessante aprender a guardar ou ir buscar texto em um arquivo emdisco. Ha dois tipos de texto, os textos do tipo C e os textos do tipo C++. No captulo 6 voudiscutir o novo tipo de dados, na verdade um objeto, que e texto do C++ que e muito maisdinamico (para fazer operacoes) sobre textos do que o metodo tradicional de C que e comuma` maioria das linguagens da geracao do C, como Pascal.Na verdade, na antiga linguagem C, texto e um tipo de dados, em C++ e um objeto e portantoele (o texto) sabe como transformar-se a pedido do usuario.

    Trabalhar com o tipo de dados, texto, vai ser assunto para o captulo 6que voce pode inclusive visitar rapidamente. Estamos terminando o captulo1, e para que minha promessa de que, ao terminar este captulo, voce ja estejafazendo alguns programas interessantes, seja verdadeira, eu vou desenvolver umprojeto nesta parte final, uma agenda telefonica.

    Mas agenda telefonica e informacao que e preciso ficar guardada num ar-quivo. O programa vai construir a agenda, guardar num arquivo, e depoisvoce podera acessa-la com um editor de texto qualquer, podera imprim-la, porexemplo, fazer alteracoes que lhe parecam interessantes ou passar para outroprograma.

    Entao vou precisar de guardar texto em arquivo! dois assuntos quentes:texto, arquivo.

    Vou usar algumas ferramentas externas que sao naturais nos sistemas Linux,quando acontecer isto vou chamar sua atencao para que voce tente se adaptarpara outro sistema operacional, mas neste ponto voce ja tera adquirido algumaexperiencia se tiver feito os exemplos do livro em outro sistema que nao Linux.

    Neste captulo, e em muitas outras ocasioes neste livro, estou usando o(fazendo referencia ao) editor de textos joe que comumente e instalado nasdistribuicoes Linux. Voce tem duas opcoes,

    ignore joe junto com qualquer outra preferencia do autor a este editor, eo substitua em todos os programas por um editor que se encontre instaladono sistema que voce estiver usando;

    instale o joe que vale a pena, e simples e muito poderoso29.

    Deixe-me alerta-l@ para a dificuldade um pouco maior desta secao sobre asanteriores e com isto quero dizer-lhe duas coisas:

    o difcil nao e para pessoas mais inteligentes, apenas exige mais tempo deprocessamento mental;

    nao tente entender tudo imediatamente, aprenda a usar antes de com-preender perfeitamente.

    29Isto deve ser falso, como pode algo ser simples e poderoso...

    28

  • Nao duvide de que o conhecimento representado por uma linguagem de pro-gramacao foi obtido ao longo de anos e por varias equipes estudando, errando,aprendendo.

    Em particular, aqui, vou me comunicar com arquivos em disco para guardartexto. Dois assuntos que exigem mais tempo e trabalho para que voce com-preenda todas as relacoes envolvidas.

    Nos captulos 5 e 6, voce pode encontrar uma visao mais aprofundada sobreos dois tipos dados que vou usar aqui: texto, arquivo, mas use primeiro e seprepare para ir compreendendo com o uso.

    O captulo, 6, trata de texto e arquivo de uma forma bem mais aprofundadado que estarei fazendo neste captulo, como e de se esperar. E aconselhavel umaleitura superficial dos dois captulos, 5 e 6.

    O projeto: vou construir uma agenda de telefonica. Espero que este projetoseja motivador e util.

    Para produzir um projeto relativamente grande como este, precisaremos deusar praticamente tudo que estudamos nas secoes anteriores e assim, ao concluiro primeiro captulo, voce terminou um minicurso sobre C++ depois do que vocepodera iniciar o seu aprofundamento atraves dos captulos seguintes.

    1.5.1 Como guardar texto

    Leia a mais a respeito nos captulos 5 e 6. Aqui vou dirigi-l@ rapidamentepara fazer uso de texto, e a tecnica aprender a usar para depois compreendermelhor.

    Algumas linguagens de computacao tratam texto como matrizes de carac-teres, e o tipo string. C++ tem uma classe para tratar de texto, e a classeStreams, portanto vamos criar objetos desta classe para lidar com textos.

    O captulo 6 trata mais a fundo esta questao. Estas duas formas de textocoexistem em C++ e algumas vezes caracterizamos isto dizendo:

    um texto de tipo C++, Streams; texto do tipo C, as matrizes de caracteres. um metodo de conversao de Streams para o texto do tipo C; um metodo para importar texto do tipo C para Streams de C++.

    Leia mais a este respeito no captulo 6.O que caracteriza uma cadeia de caracteres e abrir/fechar aspas e e um

    erro comum de sintaxe faltar aspas fechando ou abrindo. Em geral os editoresvao alerta-l@ para este erro. Em varios programas eu ja fiz uso de cadeias decaracteres de formas que voce nao esta encontrando, ate este ponto, nenhumanovidade. Mas ate agora nao usei texto como um tipo de dados.

    Usar um tipo de dado significa eleger uma variavel para guardar este tipode dado, um comando como

    cout

  • nao esta usando o tipo de dados int, embora esteja sendo enviado um o numerointeiro 3 para a sada de dados. E diferente do comando

    cout

  • Para manipular arquivos em disco C++ usa uma classe com que representa amemoria de massa30,

    stream, se diz em ingles, corrente seria a traducao para portugues; cadeia de caracteres sao em portugues as matrizes de caracteres, o tipo dedados, texto, de C.

    O captulo 6 discute estes tipo de dados.A proxima lista de exerccios vai mostrar-lhe como acessar um arquivo e

    guardar alguma coisa nele, assim como recuperar o que esteja em um arquivo.De agora em diante, os nomes dos programas passarao a ter significado,

    estou entrando num projeto.

    Exerccios 12 (Tutorial) O acesso a arquivos

    1. Rode o programa abre arquivo01.cc. Se der erro em tempo de execuc~aoa razao esta na linha

    system(joe telefone);

    porque este programa usa o editor de textos joe que pode nao estar insta-lado no seu sistema. Neste caso troque joe pelo nome de um editor queesteja instalado e ignore a instrucao sobre como fechar o arquivo, CTRL-C,que vale para o joe mas pode nao valer para o editor que voce estiverusando.

    Quando voce compilar o programa, C++ nao sabe se joe esta instaladono computador e nao vai ver nenhum erro nisto. Mas quando voce ro-dar o programa, pode haver um erro em tempo de execucao31. Um dostipos de erro mais dramaticos em computacao! Leia o comentario (30) noprograma.

    2. Leia abre arquivo01.cc num terminal, enquanto voce o executa em outroterminal. Analise o que faz o programa enquanto voce o le.

    3. Altere o programa abre arquivo01.cc para criar alguns textos diferentes.

    4. Altere o programa abre arquivo01.cc para gravar textos em diferentesarquivos no mesmo programa. Nao se esqueca de chamar o editor ade-quado para ver os textos escritos.

    Aqui ha um erro potencial muito comum: esquecer de fechar o arquivo,leia o comentario (20) no programa abre arquivo01.cc, antes de abriroutro. Modo de evitar este erro: use os comandos:

    ofstream nome arq("telefone", ios::out);30Uma denominacao antiga, mas com frequencia usada, para fazer referencia aos discos,

    provavelmente devido ao material com que eram feitos. Uma memoria flash, um pen-drive caineste tipo de memoria

    31Isto pode ser previsto pela programadora, ha um comando para verificar se um programaexiste, em algum momento voce vai a