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

Uma introdu c ao ` a linguagem de programa c ao C++

Tarcisio Praciano Pereira1 5a. Edi c ao - preliminar

Universidade Estadual do Vale do Acara u 20 de junho de 2013

tarcisio@member.ams.org

Sum ario
I L ogica
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
2 2 8 10 10 12 17 24 28 29 30 34 38 39 40 47 50 51 53 56 57 58 59 63 64 66 67 67 68

1 Primeiros programas em C++ 1.1 Imprimindo na tela . . . . . . . . . . . . . . . 1.1.1 C++ e C . . . . . . . . . . . . . . . . . 1.2 Recebendo dados . . . . . . . . . . . . . . . . 1.2.1 Vari aveis . . . . . . . . . . . . . . . . 1.2.2 Usando fun co es . . . . . . . . . . . . . 1.3 Opera co es aritm eticas . . . . . . . . . . . . . 1.4 Os inteiros . . . . . . . . . . . . . . . . . . . . 1.5 Cadeias de caracteres . . . . . . . . . . . . . . 1.5.1 Como guardar texto . . . . . . . . . . 1.5.2 Onde guardar textos de forma segura 1.6 A agenda telef onica . . . . . . . . . . . . . . . 1.7 Um programa com orienta ca o a objeto . . . . 1.8 Uma classe que herda os m etodos de outra . . 1.9 Vocabul ario . . . . . . . . . . . . . . . . . . . 2 Operadores aritm eticos e l ogicos 2.1 Opera co es aritm eticas . . . . . . . . . . . 2.1.1 C++ interpretado . . . . . . . . . . 2.1.2 Adi ca o . . . . . . . . . . . . . . . . 2.1.3 Produto . . . . . . . . . . . . . . . 2.1.4 Subtra ca o . . . . . . . . . . . . . . 2.1.5 Divis ao inteira . . . . . . . . . . . 2.1.6 Atalhos ++... . . . . . . . . . . . . 2.2 Operadores l ogicos . . . . . . . . . . . . . 2.2.1 Desigualdades . . . . . . . . . . . . 2.2.2 Teste de igualdade . . . . . . . . . 2.2.3 Conjun ca o l ogica . . . . . . . . . . 2.2.4 Disjun ca o l ogica . . . . . . . . . . 2.3 Lista dos operadores aritm eticos e l ogicos . . . . . . . . . . . . . . . . . . . . . . . . . .

3 L ogica 3.1 O que e um programa . . . . . . . . . . . . . . . . . 3.1.1 O primeiro passo na escala da abstra ca o . . . 3.1.2 O segundo passo na escala da abstra ca o . . . 3.1.3 O terceiro passo na evolu ca o da abstra ca o . . 3.2 Ponto de decis ao, if() . . . . . . . . . . . . . . . . . 3.2.1 Completando o if() . . . . . . . . . . . . . . 3.2.2 Mapas de programas, uxogramas . . . . . . 3.3 La cos: while() . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Como e que funciona ? . . . . . . . . . . . . . 3.3.2 do while() . . . . . . . . . . . . . . . . . . . . 3.4 M ultiplas escolhas: switch() . . . . . . . . . . . . . 3.5 Outra forma de fazer la cos . . . . . . . . . . . . . . . 3.5.1 La cos: usando for() . . . . . . . . . . . . . . 3.5.2 C++ interpretado, Calc . . . . . . . . . . . . . 3.5.3 Diferen cas entre os m etodos for(), while() 3.6 Sa da for cada . . . . . . . . . . . . . . . . . . . . . . 3.6.1 Blocos l ogicos . . . . . . . . . . . . . . . . . . 3.6.2 Parada for cada,break . . . . . . . . . . . . . 3.7 Vocabulario . . . . . . . . . . . . . . . . . . . . . . . 4 Fun co es e m etodos 4.1 Hist oria das fun co es . . . . . . 4.2 Fun co es . . . . . . . . . . . . . 4.2.1 Passando valores . . . . 4.3 Biblioteca de fun co es . . . . . . 4.3.1 Construindo a biblioteca 4.4 Fun ca o e variaveis . . . . . . . 4.4.1 Valor default . . . . . . 4.5 Fun ca o: linha de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . areas.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76 76 77 78 78 79 82 88 95 95 102 103 106 106 106 108 110 110 110 112 113 113 116 119 123 124 125 127 128 131 132 133 135 136 139 141 141 143 144 146 151 155 155

5 As vari aveis e os seus tipos 5.1 Vari aveis . . . . . . . . . . . . . . . . . . . . 5.1.1 S mbolo . . . . . . . . . . . . . . . . 5.1.2 A codica ca o dos caracteres . . . . . 5.1.3 As regras . . . . . . . . . . . . . . . 5.1.4 O espa co de nomes . . . . . . . . . . 5.2 Os tipos de dados . . . . . . . . . . . . . . . 5.2.1 Tipos b asicos de dados . . . . . . . . 5.2.2 Outros tipos de dados . . . . . . . . 5.2.3 Estrutura com m etodo . . . . . . . . 5.3 Vari avel global e local . . . . . . . . . . . . 5.3.1 Coment arios sobre os exerc cios . . . 5.3.2 Erro com vari aveis locais polped.cc 5.4 T ecnicas com o uso de vari aveis locais . . . ii

5.5 5.6

5.7 5.8 5.9 5.10 5.11 5.12 5.13

5.14 5.15

Vari avel global . . . . . . . . . . . . . . . . . . . 5.5.1 Constantes . . . . . . . . . . . . . . . . . Endere co de uma vari avel . . . . . . . . . . . . . 5.6.1 Referenciando dados via ponteiro . . . . . 5.6.2 Opera co es com ponteiros. . . . . . . . . . Valor por refer encia . . . . . . . . . . . . . . . . Ponteiro para fun ca o . . . . . . . . . . . . . . . . 5.8.1 Explicando o tutorial . . . . . . . . . . . . Valores na linha de comando . . . . . . . . . . . 5.9.1 Usando uma fun ca o para alocar mem oria Cadeias de caracteres . . . . . . . . . . . . . . . . 5.10.1 Texto da linguagem C . . . . . . . . . . . Passando valores entre fun co es . . . . . . . . . . Arquivos em disco . . . . . . . . . . . . . . . . . Tabelas ou registros . . . . . . . . . . . . . . . . 5.13.1 Criar um tipo ou usar um tipo . . . . . . 5.13.2 Tutorial . . . . . . . . . . . . . . . . . . . Passagem de dados complexos . . . . . . . . . . . Vocabul ario: vari avel e tipo de dado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

161 162 162 164 169 171 172 173 174 176 177 177 178 180 181 182 182 183 184 190 190 192 197 198 200 202 204 207 208 211 211 212 214 215 218 220 222 224 230 235 235

6 Stream 6.1 Streams - a simula ca o dos perif ericos . . . 6.2 Classes i/o . . . . . . . . . . . . . . . . . . 6.3 Biblioteca IOstream . . . . . . . . . . . . 6.3.1 A entrada e sa da de dados . . . . 6.3.2 Manipuladores . . . . . . . . . . . 6.4 Strings, tutorial . . . . . . . . . . . . . . . 6.5 Biblioteca . . . . . . . . . . . . . . . . . . 6.5.1 Algumas fun co es globais - string 6.5.2 Entrada e sa da de dados . . . . . 7 Classes e objetos 7.1 Classes, modelos de programas . . . . . . 7.1.1 Estrutura e sub-estrutura . . . . . 7.1.2 Classes e suas inst ancias . . . . . . 7.1.3 A produ ca o de software . . . . . . 7.2 ambiente . . . . . . . . . . . . . . . . . . . 7.2.1 Usando Ambiente.h . . . . . . . . 7.3 A garrafa . . . . . . . . . . . . . . . . . . 7.3.1 A classe computacional da garrafa 7.3.2 Utilizando a classe da garrafa . . 7.4 Completando as id eias sobre classes . . . 7.5 Vocabul ario, classes . . . . . . . . . . . .

iii

II

Criando projetos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

240
243 243 246 250 253 255 256 256 257 259 259 260 265 265 266 266 268 269 269 271 274 274 276 277 277 280 284 285 285 286 286 286 287 288 288 289 289 291 299 300 304

8 A classe da calculadora 8.1 Os n umeros complexos . . . . . . . . . . . . . . . . 8.2 Primeiros programas com a algebra dos complexos 8.3 Usando um programa externo: gnuplot . . . . . . 8.4 A calculadora gr aca . . . . . . . . . . . . . . . . . 8.4.1 An alise de calculadora.cc . . . . . . . . . 8.5 A classe dos n umeros complexos . . . . . . . . . . 8.5.1 Tipo de dado complexo . . . . . . . . . . . 8.5.2 Membros e m etodos . . . . . . . . . . . . . 9 Classes para Gr acos 9.1 Classes para gr acos . . . . . . . . 9.2 Gr acos de fun co es . . . . . . . . . 9.3 Como e que funciona . . . . . . . . 9.4 Classes gr acas:Vers ao melhorada . 9.5 Vers ao completa do programa . . . 9.5.1 Replanejando o trabalho . . 9.5.2 Resumo dos gr acos . . . . 9.5.3 Ajustes nais . . . . . . . . 9.6 Gr acos multivariados . . . . . . . 9.7 Vocabulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10 Classes para Sistemas 10.1 A equa ca o do segundo grau . . . . . 10.1.1 Otimiza ca o . . . . . . . . . . 10.2 Planejamento de programa . . . . . 10.2.1 Como fazer um planejamento 10.3 A constru ca o da vers ao beta . . . . . 10.4 Transformando bilioteca numa classe 10.5 Fechando alguns conceitos . . . . . . 10.5.1 Vari avel e objeto . . . . . . . 10.5.2 Nomes dos objetos . . . . . . 10.5.3 Classes e objetos . . . . . . . 10.5.4 private, public . . . . . . 10.5.5 Fun co es e m etodos . . . . . . 11 Refer encias 11.1 Uma lista de refer encias . . . . . . . 11.1.1 Palavras reservadas . . . . . . 11.1.2 Man, info . . . . . . . . . . 11.1.3 Make . . . . . . . . . . . . . 11.1.4 Bibliotecas . . . . . . . . . . 11.1.5 Compila ca o . . . . . . . . . . 11.1.6 Como capturar o return(n)

iv

11.1.7 Entrada de Sa da de dados . . . . . . . . . . . . . . . . . 304 11.2 Entrada e sa da de dados . . . . . . . . . . . . . . . . . . . . . . 305 11.2.1 M ascara gr aca . . . . . . . . . . . . . . . . . . . . . . . . 305 Bibliograa ............................................................................... 307

Lista de Figuras
1.1 1.2 1.3 1.4 1.5 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 4.1 4.2 4.3 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 6.1 6.2 6.3 7.1 7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Um switch para internet - conecta os computadores . . Um antigo programa em BASIC . . . . . . . . . . . Etapas na produ ca o de um programa . . . . . . . . .
Um programa em C++ Um menu de op co es if() . . . . . . . . . . Fluxograma com dois if()

. . . . .

. . . . .

. . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . .

3 26 27 42 44

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fluxograma com dois if(), uma entrada e uma sa da dados . while() . . . . . . . . . . . . . . . . . . . . . . . . . Fluxograma de uma soma - um la co . . . . . . . . . . . . switch() . . . . . . . . . . . . . . . . . . . . . . . . . Usando for() em calc . . . . . . . . . . . . . . . . . . .
bloco.

. 81 . 89 . 90 . 96 . 100 . 104 . 107

Ao encontrar break o uxo e desviado para ` a pr oxima fun ca o externa ao

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

. . . . . . . . . . . . . . . . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 O menor programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118


Um programa em BASIC Uma fun ca o Vari avel global e local . . Uma vari avel em main().

. . . Nova vers ao do programa . Tecnicas para elimina ca o de vari aveis globais . Vari avel ponteiro do tipo XX . . . . . . . . . imprime um n umero . . . . . . . . . . . . imprime um n umero guardado numa vari avel .
Vari avel global e vari avel local. A l ogica: sa da, entrada de dados www.cplusplus.com . . . Sobrecarregamento de cin

. . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

148 153 157 158 159 165 184 185

. . . . . . . . . . . . . . . . . . . . . 193 . . . . . . . . . . . . . . . . . . . . . . . . 195 . . . . . . . . . . . . . . . . . . . . . . . . 199

uma classe esqueleto para fazer classes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 . . . . . . . . . . . . . . . . . . 224

vi

7.3 7.4 7.5 7.6 8.1 8.2 10.1 11.1

. . . . . . . . O objeto garrafa . . . . Classe lha e classe m ae .


A classe Garrafa A classe Garrafa

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

225 226 231 237

n = 0; in+2 = i2 = 1; in+3 = i3 = i O plano complexo

. . . . . . . . . . . . . . . . . . 244 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 . . . . . . . . . . . . . . . . . . . 283

Fluxograma de quase splines3.cc Makefile

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

vii

Introdu c ao
A introdu ca o tem que estar colocada, em qualquer livro, no come co, mas isto n ao signica que ela seja f acil de ser entendida numa primeira leitura. Todo texto com letra pequena, neste livro, e um texto que sugiro que @ leitor@ leia com desconan ca, e a introdu ca o est a em letra pequena. Um dos objetivos que qualquer autor tem, com a introdu ca o, e de expor o plano do como trabalho e isto e um assunto dif cil para algu em que esteja se iniciando no assunto. E explicar a algu em que nunca visitou uma cidade as belezas e as sutilezas que podem ser l a encontradas, no m nimo e um bom supor fero mesmo que a cidade seja interessante. Mas e preciso ler, pelo menos rapidamente, esta introdu ca o para que voc e saiba qual e o conte udo do livro. Se voc e for novo em programa ca o, fa ca uma leitura supercial desta abertura do livro e passe logo para o primeiro cap tulo que e dirigido para quem est a come cando. Mais exatamente, o primeiro cap tulo foi projetado como um tutorial para conduz -l@ a escrever o seu primeiro programa. Depois que voc e estudar com cuidado o primeiro cap tulo, fa ca uma leitura supercial do resto do livro, para se inteirar do seu conte udo, e talvez ent ao voc e deva fazer uma segunda leitura da introdu ca o seguida de um trabalho cuidadoso do resto do livro. Esta e a minha sugest ao de como usar este livro, estudar com cuidado o primeiro cap tulo, depois recome car a leitura do livro desde o come co o que inclui uma segunda leitura desta introdu ca o. Foi assim que planejei o trabalho com o livro: o primeiro cap tulo e um pequeno curso introdut orio de programa c ao voltado para a linguagem que estou discutindo neste livro. Quando voc e terminar o primeiro cap tulo j a estar a escrevendo, sozinho, os primeiros programas. Entretanto, somente voc e e que pode descobrir a sua forma de desenvolvimento, o que e importante e que voc e se libere de alguns mitos que nos atrapalham no aprendizado: mito: que existe uma forma padr ao de aprendizado. N ao existe! cada um de n os tem a sua, e esta a principal diculdade numa sala de aula quando o professor tem que se dirigir de forma padronizada a 30 pessoas que necessitariam, cada uma, de uma forma espec ca de orienta ca o; tulos e um padr ao imut avel. Infelizmente o livro vem com os mito: a ordem dos cap cap tulos numa ordem prexada, mas voc e pode ler os cap tulos em outra ordem, tente; mito: existe uma forma pr e-denida para a arruma ca o do conhecimento, qual e o conceito que vem primeiro. Isto e falso, mesmo voc e, em dois momentos distintos, pode precisar de formas diferentes para entender um mesmo assunto... porque o nosso estado mental se altera frequentemente, um assunto que voc e entendeu perfeitamente horas atr as, agora pode lhe parecer complicado. Isto e v alido inclusive para um programa que voc e mesmo escreveu e que est a funcionando, e numa nova leitura, do programa, voc e j a n ao entende porque usou aquele truque... Para resolver este problema os programas admitem um tipo de texto, dentro dos programas, chamados coment arios, em que voc e pode deixar explica co es para voc e mesmo do signicado das constru co es que voc e zer; e perfeito e o livro e livre de defeitos... sou humano, as vezes escrevo com mito: o autor sono, e nem preciso deste alibi, erro mesmo. Este, possivelmente, e o pior de todos os mitos. Se voc e tiver diculdades de entender um par agrafo, pode ser que o livro esteja errado e que voc e tenha raz ao! O autor e um estudante mais avan cado e ainda est a aprendendo. Possivelmente o principal problema, dentre os que relacionei acima, se encontra nos erros do autor. S ao ciladas que um inexperiente pode encontrar num caminho antes nunca percorrido. A sa da e estudar em equipe. Um colega de estudos completa sua vis ao e juntos voc es podem superar os problemas que o autor venha a criar. E, nalmente, voc e comprou o livro, adquiriu o direito de se comunicar comigo para discutir situa co es dif ceis. Escreva-me um e-mail descrevendo o problema, seja sint etico e objetivo, e me passe a forma como eu possa

viii

reproduzir a situa ca o sobre a qual voc e deseja um apoio, e procurarei dar-lhe alguma ajuda. Mas n ao espere que eu lhe possa dar um curso particular na Internet, use este recurso de forma econ omica. Sobre este ponto, de recorrer a ajudas, seja sempre econ omico! Procure ajuda com outras pessoas, mas n ao se esque ca de que qualquer excesso, neste sentido, e desgastante. Primeiro tente resolver os problemas sozinho ou com companheiros de estudo. Tente ajuda externa em u ltima an alise, e com certeza voc e encontrar a ` a sua volta quem o possa ajudar deixando o autor em u ltimo lugar, nesta lista. Mas o meu endere co se encontra no nal desta introdu ca o, porque me sinto respons avel por este trabalho.

A linguagem C++

Antes de discutir o plano do livro, deixe-me falar um pouco sobre o que e C++. Sem d uvida e intrigante os dois mais, ++, que completam o nome curt ssimo desta linguagem que, talvez, voc e saiba que vem de outra linguagem chamada C. voc E, e est a estudando uma extens ao de C e, naturalmente, a primeira pergunta seria: ent ao eu devo fechar esta livro e ir estudar primeiro C? Houve um tempo em que eu diria: sim!. Hoje n ao penso mais desta forma, C++ pode ser a sua primeira linguagem de programa ca o e talvez posteriormente voc e precise aprender C para conseguir certas otimiza co es em programas, por em a tend encia parece ser a de que C desapare ca na poeira da estrada. Entretanto voc e vai encontrar aqui os rudimentos de C que lhe ser ao necess arios para entender todo o conte udo deste livro, na verdade s ao partes integrantes da nova linguagem, mas em algum momento voc e poder a precisar mais, e ent ao, neste momento pegue um livro de C e complete o que voc e precisar. Quando voc e sentir esta necessidade voc e saber a como proceder, agora pode seguir em frente aqui mesmo. C++ e uma linguagem orientada a objetos mas que admite programa ca o tradicional e o projeto era mesmo este, permitir que os programadores da linguagem C conseguissem migrar para uma outra metologia de programa ca o. Os primeiros programas usar ao objetos sem que voc e tenha muita consci encia disto, porque a linguagem foi feita para isto. Mas desde cedo, atrav es dos exemplos, eu @ estarei conduzindo a se acostumar com uma nova forma de escrever programas, a orienta c ao a objetos.

O plano do livro

Deixe-me apresentar-lhe o plano do livro. Este livro est a dividido em duas partes. oe de 7 cap tulos: 1. A primeira parte se comp ca o de pequenos O primeiro cap tulo: dos exemplos, vai lhe mostrar uma cole programas atrav es dos quais voc e ser a introduzido ` a linguagem. Este e o maior cap tulo do livro e ir a fazer uso dos seis cap tulos que vem em seguida. Nele voc e ser a convidado, frequentemente, a visitar os outros cap tulos para pegar alguma informa ca o necess aria. Mas, volte logo para o ponto de onde voc e tiver sa do. Os exerc cios ir ao estimul a-l@ a alterar os programas e e neste tipo de exerc cios que voc e ir a ganhar a experi encia para partir sozinh@ no seu pr oprio v oo num momento futuro, futuro n ao muito distante: no nal do cap tulo 1. Ao nal do primeiro cap tulo voc e j a dever a estar escrevendo pequenos programas que respondam a alguns objetivos pessoais que voc e tenha. Este tipo de motiva ca o e crucial, primeiro porque programas existem para resolver situa co es concretas, logo voc e deve ter objetivos bem claros no estudo de uma linguagem de programa ca o. Quando eu comecei a estudar a primeira linguagem de programa ca o eu queria construir um calend ario, eis um problema particularmente dif cil e bem pr atico, o calend ario gregoriano e um verdadeiro quebra-cabe cas. . . eu n ao sugiro que voc e comece com este problema e no primeiro cap tulo estar ao as minhas sugest oes. Este primeiro cap tulo termina com uma lista de t opicos que denominei vocabul ario com o discurso informativo sobre os diversos assuntos que s ao sugeridos ao longo do cap tulo. Evito, assim, de distra -l@ do objetivo principal que e rodar os primeiros programas deixando este discurso para o nal do cap tulo. Todos os t opicos do vocabul ario est ao indexados e voc e poder a retornar a eles consultando

ix

o ndice remissivo que se encontra ao nal do livro. Isto vale para os outros vocabul arios que se encontram ao nal de alguns cap tulos. Cap tulos de refer encia. Os cap tulos 2, 3, 4, 5, 6, 7 formam um conjunto de cap tulos de refer encia. Em diversos momentos no cap tulo 1, estarei sugerindo que voc e compare ca a um destes cap tulos para ler um t opico de que eles tratam. Fa ca uma leitura r apida ou mais aprofundada, dependendo do n vel de motiva ca o que voc e tiver. Os exerc cios que voc e encontrar nestes cap tulos devem conduz lo a um aprofundamento do t opico de que eles tratam, tutoriais, que devem ser feitos na segunda leitura. a-lo no uso dos operadores O segundo cap tulo: dos operadores, vai exercit da linguagem. Na segunda parte deste cap tulo tem uma listagem dos operadores para lhe servir de refer encia futura. O objetivo n ao ser a uma leitura desta descri ca o para memorizar o seu conte udo, mas saber onde se encontra a descri ca o para que voc e possa retornar ao que lhe possa interessa especica uma refer mente quando precisar. E encia e todos os t opicos est ao indexados para facilitar o seu retorno ao ponto certo. ogica, vai descrever as estruturas l ogicas da linguagem. O terceiro cap tulo: a l Cada t opico est a seguido de uma pequena lista de exerc cios que lhe deve servir de exemplo do uso da fun ca o apresentada. Este cap tulo e um cap tulo de refer encia, quer dizer, voc e n ao dever a l e-lo como se fosse um romance. Tome conhecimento do seu conte udo e retorne quando for preciso. O quarto cap tulo: as fun coes da linguagem C++ v ao ser discutidas aqui. Uma fun c ao e um pequeno programa, um algoritmo bem otimizado com o objetivo de executar uma pequena tarefa. No cap tulo 7 elas v ao adquirir um outro nome, v ao ser chamadas de m etodos. Digamos que uma forma r apida de explicar programa c ao orientada a objetos seria dizer que agora criamos vari aveis capazes de se automodicar com os seus pr oprios m etodos (as antigas fun co es). Em C fala-se de fun c ao, em C++ fala-se de m etodo. Os m etodos s ao fun c oes acopladas a um certo tipo de dados (vari avel). C++ e uma linguagem inteiramente independente1 que expandiu a linguagem C. Neste cap tulo vou mostrar-lhe como se denem fun co es. Neste momento ser ao fun co es e este aprendizado e essencial para depois lidar com os m etodos. N ao d e muita import ancia a esta conceitua ca o difusa, v a em frente que aos poucos voc e ir a compreender que e m etodo ou fun c ao. E em C++ h a fun co es chamadas globais! Na segunda parte eu voltarei a tratar disto e tamb em no cap tulo 6. O quinto cap tulo: dos nomes e dos seus tipos, em que vou discutir a parte quase mais fundamental da teoria da computa ca o, as vari aveis, os seus nomes e os seus tipos. N ao leia este cap tulo de uma vez, ele e um cap tulo de refer encia. Volte sempre que precisar, mas fa ca uma leitura inicial. Ao chegar no cap tulo 7 voc e aprender a que h a uma nova forma de pensar, t pica de orienta ca o a objeto, que altera em profundidade o conceito de vari avel. Uma classe e uma vari avel com m etodos! Isto quer dizer que o cap tulo 5 estar a ultrapassado quando voc e passar para a segunda parte do livro, mesmo assim, didaticamente, eu preciso dele aqui. O sexto cap tulo vai lhe mostrar como C++ simula os perif ericos, os dispositivos para onde os programas v ao enviar dados ou de onde v ao receber dados, tela do computador, impressora, um disco, ou teclado. Voc e dever a retornar a deste cap tulo com frequ encia, para completar as informa co es que ele guarda e us a-las em outras situa co es. Na parte nal deste cap tulo eu 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 num dispositivo de armazenamento de dados.
1 C++ entende C portanto programas escritos em C ou com partes escritas em C s ao tamb em programas da nova linguagem.

O s etimo cap tulo: vai representar uma revis ao geral do que foi visto na primeira parte. Nele voc e vai entender tudo que foi discutido nos cap tulos anteriores e ele representa a entrada para a segunda parte. Vou mostrar-lhe, detalhadamente, o que e uma classe e como elas foram usadas nos cap tulos anteriores. Mas, possivelmente, voc e j a o ter a lido quase todo no decorrer da leitura que zer dos outros cap tulos, e o que eu espero. Se for assim pule logo para a segunda parte e comece a estudar os projetos, voltando ao c apitulo 7 quando precisar de rever algum conceito, recorra ao ndice remissivo para isto. Ao nalizar esta primeira parte voc e fez um curso geral sobre a linguagem. 2. A segunda parte Na segunda parte eu desenvolvi tr es projetos, nos cap tulos 8, 9, 10 usando alguma matem atica como motiva ca o para programar em C++. Em cada cap tulo voc e vai encontrar mais ferramentas num processo constru do a partir da necessidade de resolver um determinado tipo de problema. Cada cap tulo est a dirigido para um projeto e todos s ao independentes entretanto o cap tulo 9, que trata de gr acos, ser a utilizado na u ltima parte dos cap tulos 8 e 10. Em cada caso voc e ser a orientad@ a um breve leitura do cap tulo 9. um cap etica. E tulo independente que O oitavo cap tulo: vai tratar de aritm voc e pode deixar para estudar posteriormente. Nele eu constru uma caculadora gr aca para n umeros complexos. Os programas v ao usar gnuplot que e melhor explicado no cap tulo 9. acos, mas usando um pacote externo, gnuplot e O nono cap tulo: vai discutir gr voc e vai encontrar aqui um tutorial para entender este pacote. Vou mostrar-lhe como fazer gr acos de fun co es. O decimo cap tulo vai conduz -lo ` a solu ca o de sistemas de equa co es lineares dentro da constru ca o de fun co es polinomais por peda cos. No nal vou aplicar o que estudei de gr acos na visualiza ca o destes problemas. Este cap tulo depende do anterior, o cap tulo 9 no uso que vai fazer de gnuplot. O d ecimo primeiro cap tulo : e um manual de refer encias da linguagem. O seu objetivo e muito mais o de sugerir onde procurar do que propriamente lhe oferecer todas as informa co es, porque, se eu fosse colocar aqui todas as informa co es, este cap tulo, sozinho, teria mais de 1000 p aginas. Depois, existem fontes de informa ca o de primeira qualidade que e absolutamente importante que voc e saiba onde est ao e como us a-las, e este o objetivo deste cap tulo, mostrar-lhe o caminho das pedras. Deixe-me chamar sua aten ca o para dois itens que n ao parecem fazer parte do plano do livro, os dois ndices, o anal tico, que aparece no come co e e um resumo do plano que descrevi acima, e o ndice remissivo que aparece ao nal, depois da bibliograa. Fiz um esfor co para indexar todas as palavras importantes que aparecem no livro, fa ca uso do ndice remissivo para encontrar um assunto que voc e n ao sabe mais onde est a no livro. Tamb em o cap tulo 11 deve lhe dar uma sensa ca o de que ele deveria ser chamado ap endice uma vez que e um apanhado de informa co es. Esta e uma d uvida ao se escrever um livro: que quantidade de informa c oes deve ser apresentada para construir um processo did atico - sem empanturrar o leitor com informa c oes. At e porque n ao ser a poss vel se dizer tudo! O objetivo que deni para este trabalho foi de que o livro n ao ultrapasse 300 p aginas e conduzisse o leitor a come car, efetivamente, a programar em C++. ltimos 10 anos, Agradecimento este livro, assim como tudo que tenho aprendido nos u seria praticamente imposs vel sem a exist encia de programa c ao livre. Colocar aqui todos aqueles a quem sou devedor seria uma longa lista de itens e eu incorreria certamente na injusti ca de me esquecer de alguem, e praticamente tudo que roda sob Linux que na u ltima instala ca o de programas que executei, acusou a exist encia 350.000 itens instalados no meu computador. Eu n ao fa co 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 queria mencionar dois outros diretamente ligados a este livro:
A L TEX e um poderoso compositor de textos que e o respons avel direto pelo belo trabalho tipogr aco que voc e tem na frente dos seus olhos. Procure na Internet para saber o A que eL TEX , se eu fosse aqui explicar voc e terminaria sem aprender C++.

O compilador g++ produzido pela funda ca o GNU, este livro est a escrito com este compilador em mente, ele e grat uito, facilmente intal avel dentro de uma distribui ca o Linux e seguramente n ao h a compilador melhor do que g++. H a nomes signcativos na comunidade do software livre que todos os livros citam e que vou evitar de citar, como disse acima, para n ao incorrer na injusti ca de omitir um nome menor. Para dar um exemplo, uma das distribui co es de Debian/Gnu/Linux, consagrou o nome do Espy, um jovem que morreu aos 21 anos, em 11 de Julho de 2000, preso ao leito em que viveu durante a sua curta vida. Espy deixou-nos todos emocionados quando soubemos que um dos mais agitados programadores da Internet, morria aos 21 anos de uma doen ca degenerativa do sistema nervoso que o mantinha preso ao leito. Que, ao mencionar Joel Espy Klecker, eu esteja rendendo a minha mais profunda homenagem a todos os programadores e autores do sistema livre da ci encia, do conhecimento e da literatura da qual eu tambem fa co parte. Tarcisio Praciano-Pereira tarcisio@member.ams.org

xii

Parte I

L ogica

Cap tulo 1

Uma classe inicial

Este e o cap tulo mais longo do livro. Ao terminar este primeiro cap tulo voc e estar a escrevendo, sozinho, os seus primeiros programas em C ++. Mas ele depende dos seis outros cap tulos que o seguem, e voc e ser a frequentemente convidado a fazer primeiras leituras dos outros cap tulos. Fa ca exatamente isto, uma primeira leitura, e retorne ao ponto em que voc e se encontrava quando saiu, muito provavelmente no meio de um programa ou de um exerc cio.

1.1

Imprimir, uma sa da de dados

Imprimir na tela e uma das tarefas mais elementares que um programa tem que fazer, e uma sa da de dados. Vou mostrar como fazer isto inicialmente. Neste primeiro cap tulo vou me concentrar em fazer processamento num erico porque e a forma mais simples de conduz -lo a um dom nio imediato da linguagem.

C++ e uma linguagem orientada a objetos. Guarde isto na mente para ir se acostumando com a id eia, sobretudo se voc e j a tiver h abitos tradicionais de programar. Neste momento esta frase representa apenas o trabalho subliminar de preparaca o para uma forma mais evoluida de programar, para que sua mente se prepare aos poucos, sobre tudo se voc e tiver h abitos antigos de programa ca o, vou ajud al@ a evoluir destes h abitos antigos aqui, e foi com este objetivo que a linguagem C++ foi criada. Entretanto n ao e preciso, e at e seria melhor, que voc e n ao tivesse os h abitos antigos de programar. Eu, por exemplo, tinha e me deu algum trabalho para mudar de padr ao. Como ser a um programa nesta forma extra-terrestre de programar, orientado a objetos ?

Para come car eles s ao bastante normais. Na gura (1.1) p agina 3 voc e tem um primeiro exemplo.

# include <iostream.h> int main() { cout << " A primeira mensagem:"; cout << " estou aprendendo a programar."; cout << " E em C++ \n"; return(0); }

Figura 1.1:

Um programa em C++

Este programa se encontra no arquivo primeiro01.cc. O formato do programa no disco e um pouco mais complexo do que este que voc e est a vendo impresso no livro, porque ele tem coment arios que s ao os textos que podemos colocar num programa para explicar detalhes do mesmo. Se acostume com a leitura dos coment arios dentro dos programas, eles fazem parte integrante do livro, junto com os programas. A pr oxima lista de exerc cios e um tutorial para que voc e entenda claramente o programa e, mais do que isto, o altere. Um tutorial e um conjunto de instru co es tendo como objetivo conduz -l@ a dominar uma certa t ecnica. Os exerc cios t em tais instru co es e voc e deve segu las. Voc e n ao aprender a nada se n ao praticar e sobretudo se n ao ensaiar alguma novidade em cima do que lhe for sugerido. Acredite: dicilmente voc e estragar a o computador com os programas que encontrar aqui (e quando houver algum risco isto lhe ser a dito). Com certeza voc e poder a estragar os programas. . . mas voc e tamb em sabe onde encontrar a vers ao original para substituir aquele que voc e tiver estragado. N ao tenha pena de estrag a-los. Exerc cios 1 (Tutorial) Tutorial sobre o primeiro programa 1. Tutorial para rodar um programa Rode e leia primeiro01.cc. Abra uma shell1, mude para o diret orio em que se encontram os programas que voc e recebeu no CD (e copiou para o HD) e digite num terminal: g++ primeiro01.cc -Wall -oprog
1 shell

e uma area de trabalho, um terminal onde voc e pode executar comandos

./prog Na primeira linha voc e ter a criado com aux lio de g++ o execut avel prog. Na segunda linha voc e ter a executado prog. Compile e rode primeiro01.cc. 2. Tutorial sobre as op c oes do g++ Revisando o processo de compila c ao de um programa. e o nome do compilador distribuido livremente pela Funda c ao2 g++ para Software Livre; primeiro01.cc e o nome do arquivo onde o texto do programa se costume fazer refer encontra gravado. E encia a este texto como o c odigo fonte; e uma op ca o na linha de comandos do g++. Algum dia voc e -Wall deve ler o manual do compilador3 e ir a ver a quantidade op co es que voc e pode incluir na linha de comandos. Elas alteram a forma como o compilador ir a tratar o programa. Neste caso vai fazer com que g++ escreva tudo que viu no programa. Voc e pode pedir que ele ainda seja mais falador incluindo a op c ao -pedantic... Experimente omitir esta op c ao para ver o que acontece. Depois tente usar -pedantic. Tente tamb em apagar algum ponto-e-v rgula e volte a compilar o programa com e sem -Wall e -pedantic para ver o comportamento de g++ nos dois casos. -oprog para indicar que voc e deseja que o execut avel seja chamado prog, o o e de output. Se voc e omitir esta op c ao, g++ usar a o nome a.out. A escolha e sua. Experimente omitir a op c ao -oprog, para ver o que acontece. Execute: a.out num terminal. ./prog para pedir que o sistema operacional, Linux, rode o programa. Deve ser poss vel digitar apenas prog, se voc e precisar desta forma mais complicada, isto quer dizer que o sistema est a mal instalado do ponto de vista dos usu arios. 3. Comentando o programa Observe que o programa cont em uma fun c ao chamada main(). Os par enteses est ao a para receber par ametros e mais a frente vou lhe mostrar como fazer isto. Naturalmente, main() e apenas a fun c ao principal, mas como fun c ao, em princ pio pode receber par ametros como e h abito com as fun c oes da Matem atica. Voc e nunca vai fazer
2 Free 3 para

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

uso direto de main(), ela se confunde com o programa. Se voc e tiver criado o execut avel prog, e a fun c ao main() que voc e estar a chamando quando executar prog. Os programas s ao feitos de senten cas que devem ser sintaticamente corretas de acordo com a linguagem. O que marca o m de uma senten ca e o ponto-e-v rgula nal. Experimente apagar algum e uma boa exper volte a compilar o programa. E encia, pode aparecer muita reclama c ao, mas talvez nenhuma lhe dizendo que faltou pontoe-v rgula. O comum e que o compilador diga alguma coisa como: 11: error: parse error before << token erro de an alise na linha 11, na frente do <<. a no arquivo primeiro01.cc difere um coment ario O texto que est pouco do que aparece acima, no texto. Se acostume com esta id eia, voc e tem os programas no disco, eles est ao completos. Aqui vou apresentar apenas peda cos de programa. Abra agora o texto do programa (o c odigo fonte), com um editor de textos para acompanhar a conversa. A primeira parte do programa e um coment ario. Eles s ao iniciados com /* e terminam com */. g++ ignora os coment arios, eles est ao no programa para lhe servir de avisos, de informa c ao que voc e deseja guardar. Em meus programas coloco, no nal, uma se c ao de coment arios em que fa co observa c oes mais longas sobre os programas. Se habitue a ler os coment arios porque eles complementam o texto do livro. coment ario outra forma de fazer coment ario, voc e pode ver na linha 10 do programa. Ele come ca com s mbolo // depois do qual g++ ignora tudo que vier at e o nal da linha. Leia, em primeiro01.cc, o que diz o coment ario (20). 4. Onde est ao os objetos? Boa pergunta? vamos andar um pouco mais, e comparar com o mesmo programa escrito em C, para que voc e veja onde est ao os objetos ! Os exerc cios zeram uma primeira apresenta ca o de um programa em C++. Vou traduzir este programa para C para atender uma curiosidade natural sua. Se voc e n ao souber programar em C, n ao que assustado. Voc e tem duas op co es: aprender um pouco sobre C... ignorar tudo que eu disser sobre C se voc e adotar a segunda atitude, algumas refer encias ` a linguagem C ir ao representar um inc omodo psicol ogico para voc e, mas n ao haver a nenhuma perda 5

grave de compreens ao do texto, porque, ningu em precisa aprender C para depois aprender C++. Continuarei, durante algum tempo, a comparar as duas4 linguagens, mas h a autores que dizem de partida que voc e pode ignorar C ao iniciar o seu aprendizado de C++. Eles n ao est ao errados, e eu n ao vou usar C neste livro e sim fazer algumas compara co es dirigidas aos eventuais programadores da linguagem C que estejam lendo o livro. Se n ao for o seu caso, ignore a linguagem C, simplesmente. Exerc cios 2 (Tutorial) Tutorial sobre primeiro01.c 1. Leia o programa5 primeiro01.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 est a escrito) gcc -Wall -oprog2 primeiro01.c e voc e criou o execut avel prog2 usando gcc, o compilador da linguagem C. e a primeira li c ao que podemos tirar deste exemplo e que 2. C++ entende C C++ pode compilar programas escritos em C. Mas fa ca uma outra experi encia, compile o programa primeiro01.cc com o g++: g++ primeiro01.cc -Wall -oprog3 e voc e criou o execut avel prog3 usando g++, o compilador da linguagem C++. Agora rode ls -lat prog1 prog2 prog3 O comando ls de LinuX, com a op c ao -lat vai lhe mostrar os tamanhos dos tr es programas, (a) o execut avel prog1 obtido com g++ a partir de um programa escrito em C; (b) o execut avel prog2 obtido com gcc a partir do mesmo programa escrito em C;
que falei duas linguagens, e e isto mesmo um programa escrito em C 6 a ordem dos par ametros na linha de comando pode ser qualquer
5 e 4 observe

(c) e o execut avel prog3 obtido com g++ a partir de um programa escrito em C++ ; Um e menor, e a diferen ca e pequena porque s ao programas muito pequenos. 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 compilado com o gcc que e um compilador otimizado para programas da linguagem C; (b) o m edio e o execut avel prog1 obtido com g++ a partir de um programa escrito em C; (c) o maior e o execut avel prog3 obtido com g++ a partir de um programa escrito em C++; compilador gcc prog2 programa em C primeiro01.c compilador g++ prog1 programa em C primeiro01.c compilador g++ prog3 programa em C++ primeiro01.cc

<

<

Conclus ao errada que devemos aprender a programar em C que e mais otimizado. Isto e apenas meia verdade. Mas com frequ encia, depois que um programa em C++ est a funcionando bem, parte dele e convertido para C. Por em os compiladores est ao melhorando e esta dend encia dever a mudar com o tempo. Por em, se isto representar no futuro uma necessidade para voc e, no momento certo voc e saber a como faz e-lo. Agora e apenas uma curiosidade. 3. Diferen cas entre primeiro01.c e primeiro01.cc: Semelhan ca: todo programa tem uma fun c ao main() que e a gerente do processo. Ela e que chama as outras. Examine agora os dois programas. A primeira diferen ca ca logo na primeira linha # include <stdio.h> e observe que ela n ao aparece em primeiro01.cc. Aparece em primeiro01.c porque C e t ao omizado que n ao tem nem mesmo como fazer impress ao de dados na tela. Precisa de uma biblioteca b asica da linguagem C onde se encontram denidas fun c oes de entrada e sa da de dados, como printf(). Experimente eliminar esta linha (com o s mbolo de coment ario) e, compile e analise o resultado. 7

Logo no in cio dos programas v em diretivas de compila ca o . Elas est ao caracterizadas pelo s mbolo do jogo da velha seguido duma palavra chave, neste caso include. include e a tradu c ao para o ingl es de nossa palavra incluir... e assim o compilador sabe que deve ir buscar o arquivo stdio.h no diret orio em que se encontram as bibliotecas da linguagem7 e incluir no programa todas as fun c oes pedidas pelo programa, e apenas estas, dentre aquelas denidas na biblioteca. Em primeiro01.cc a linha e # include <iostream.h> Se voc e eliminar8 esta linha, (tente nos dois programas), o compilador vai reclamar que tem coisa que ele n ao entende no programa. Experimente! Em primeiro01.c tem printf() para imprimir. Este programa usa uma fun c ao, para imprimir. O modo de imprimir em primeiro01.cc e bem distinto: envia a mensagem para o objeto cout que sabe como imprimir. primeiro01.cc usa um m etodo, dum objeto, para imprimir. Talvez voc e devesse fazer agora uma primeira leitura do cap tulo 7, mas volte logo para c a. Ou, fa ca como voc e fez para aprender a falar, siga usando as palavras que aos poucos voc e aprende a programar. A teoria e importante, mas ela pode ser adquirida aos poucos ao longo da pr atica. Assim voc e est a vendo onde programa ca o orientada a objeto est a aparecendo no programa primeiro01.cc. Em primeiro01.cc as mensagens est ao impressas em u nica linha, sem interrup c ao. Experimente colocar << endl antes do ponto-e-v rgula e veja o resultado. Solu c ao: primeiro02.cc Lendo os coment arios em primeiro02.cc voc e ca informado que pode continuar usando a troca de linha de C. Nenhuma novidade! anal C++ entende C.

1.1.1

C++ entende C

O resultado das experi encias feitas em alguns dos exerc cios com os dois compiladores gcc, g++ e desconcertante. A conclus ao mais simples e que gcc e melhor. Este conceito, melhor, e discut vel. N ao existe um melhor, o que existe eo instrumento otimo para uma certa aplica ca o. A linguagem C, quando bem utilizada, produz programas r apidos e ecientes, mas para conseguir a otimiza ca o
7 em 8 N ao

LinuX e o diret orio /usr/include precisa apagar, basta torn a-la um coment ario...

e preciso truques especiais que fazem os programas mais dif ceis de serem entendidos e conseq uentemente de manuten ca o custosa. Um bom programador, nas duas linguagens, prefere programar em C++ porque ela e mais humana, o que se traduz com a express ao de mais alto n vel. Outra raz ao, que somente deve car clara com o tempo, e que os programas em C++ s ao mais alg ebricos - as classes s ao modelos que podem ser reaproveitadas, como estruturas alg ebricas que podem ser realizadas em exemplos. Isto na linguagem de computa ca o se diz criar um objeto, como inst ancia de uma classe. Uma inst ancia, o objeto, e um exemplo realizado do modelo, a classe. Um programador inexperiente pode fazer programas de p essima qualidade com qualquer linguagem de programa ca o, e neste sentido C++ n ao ajuda muito, e muito poss velemnte pode representar um instrumento de qualidade duvidosa. Um mau programador pode estragar qualquer coisa. H a uma frase presente em diversos livros de programa ca o que vale a pena citar, mesmo que eu n ao possa indicar a origem: um programa mal feito e t ao ruim que mais vale a pena aprender a programar novamente e refazer o programa, em vez de tentar corrigir o tal programa mal feito. Para concluir esta compara ca o, considerando dois programas bem feitos, em C e em C++, e muito prov avel que o programa escrito em C seja menor e portanto rode mais r apido e que o programa em C++ seja um pouco maior e um pouco mais lento. Com as velocidades bastante grandes e quantidade de mem oria tamb em muito grandes dos computadores, esta diferen ca tende a desaparecer, cando a qualidade do projeto, no caso de C++, como a grande diferen ca. Se costuma armar 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 o transformo, criando uma classe adequada, a partir da biblioteca de fun co es, em C++. Voc e vai ver esta pr atica aqui neste livro. Em termos de velocidade de processamento, as compara co es que tenho lido entre C++ e a linguagem concorrente mais pr oxima, Java, indicam uma velocidade cerca de 20 vezes superior para programas escritos em C++. Insisto, estou repetindo compara co es feitas por outros programadores uma vez que n ao programo, usualmente, em Java. Sendo isto verdade, e e muito prov avel que seja, n ao h a necessidade de fazer a tradu ca o mencionada acima, de programas terminados e testados em C++, para a linguagem C. C++ e uma linguagem denitiva! Possivelmente, voc e nunca precisar a de descer aos por oes da linguagem e aprender C.

1.2

Entrada de dados
Vou usar vari aveis nos programas desta se ca o. Voc e e convidado a ler um pouco a respeito

no cap tulo 5. Mas fa ca uma leitura r apida e volte logo para c a.

Um programa que fa ca qualquer coisa interessante tem que usar vari aveis9.

1.2.1

Usando vari aveis num programa

a nota de rodap E, e e sempre um pouco incoveniente, mas fala a verdade. O programa primeiro03.cc tem a sua utilidade e n ao tem nenhuma vari avel. Mas em geral n ao e assim. Como os programas s ao uma abstra c ao de problemas, modelos, para representarem algum aspecto da realidade, do mundo real, eles precisam de express oes que possam ser alteradas, porque a realidade muda e os programas servem para analisar estas mudan cas. Isto se faz com vari aveis. O cap tulo 5 trata de vari aveis e e u til fazer uma primeira leitura dele e rapidamente voltar para c a. A pr oxima lista de exerc cios analisa o programa primeiro03.cc mais de perto e vai conduz -lo a novas vers oes do programa. Exerc cios 3 (Tutorial) Vari aveis num programa 1. Rode o programa primeiro03.cc: g++ -Wall -oprog primeiro03.cc e depois ./prog 2. Leia primeiro03.cc e volte a rod a-lo at e que tudo que 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 respons avel por apagar a tela e a fun c ao system(). Ela chama um utilit ario do sistema, clear, que apaga a tela. 4. Usando comandos do sistema Experimente digitar clear e <enter> num terminal. Aprenda a abrir terminais, vou usar muitos terminais neste livro. . . 5. Observe que de dentro de um programa voc e pode chamar os utilit arios do sistema. Voc e pode chamar o pr oprio programa desta forma. Mas, deixe para faz elo quando tiver mais experi encia, isto pode usar muito mem oria do sistema se houver algum erro no seu programa. Experimente o programa primeiro04.cc. Compile e rode! Mais interessante e fazer isto enquanto
9 Claro

que isto e falso, rode primeiro03.cc

10

ele aparece editado em outro terminal para que voc e compreenda o que est a acontecendo: ir a rodar dezenas de c opias do programa prog10 . Pare o programa com CTRL-C, se n ao conseguir, abra outro terminal e nele digite: killall prog e d e enter. 6. Voc e pode criar os seus pr oprios utilit arios do sistema. Em vez de usar clear para limpar a tela, crie um apagador Solu c ao: apagador.cc 7. Voc e pode criar o seu utilit ario avisando que saiu para tomar caf e e logo volta, tente! Solu c ao: cafe.cc 8. Fa ca um programa no qual esteja denida uma equa c ao e que o programa lhe pe ca valores da vari avel para substituir na equa c ao. Solu c ao: primeiro05.cc 9. Altere primeiro05.cc para limpar a tela mais vezes e sobre tudo deixar a tela limpa quando sair. Observe que em primeiro05.cc existem os caracteres especiais \t que e o tabulador. Experimente os caracteres \a e \n. 10. Acrescente mais vari aveis ao programa primeiro05.cc para vericar se os pontos calculados com a equa c ao de fato se encontram sobre uma reta. Solu c ao: primeiro06.cc 11. No programa primeiro06.cc, uma das linhas saiu do alinhamento da tabula c ao. Analise porque, (est a indicado num coment ario no programa). Corrija este defeito (n ao e um erro...) 12. Inclua uma vari avel teste em primeiro06.cc para guardar um dos coecientes angulares e depois de comparar com o outro emitir um laudo sobre a posi c ao dos pontos. Solu c ao: primeiro07.cc 13. O programa primeiro07.cc tem diversos defeitos, (acredite, eu os deixei para que voc e aprenda!) 11 . Leia os coment arios e se inspire neles para alterar o programa de modo que o resultado seja melhor, sem frases desalinhadas etc...
10 A cada enter que voc e der, roda uma nova c opia. Como e um programa muito pequeno isto n ao afeta muito o desempenho do computador, mas n ao pode ser usado na pr atica. 11 Acredite se quiser, eu acho que este autor n ao sabe mesmo programar!

11

Usei vari aveis do tipo int e do tipo float em alguns programas na lista de exerc cios acima. As vari aveis num ericas s ao as mais simples de serem usadas em qualquer linguagem de programa ca o. Voc e deve fazer um passeio ao cap tulo 5 para uma r apida leitura dos assuntos que ele trata. Fa ca uma leitura supercial para se inteirar de que as vari aveis t em tipo e que existe uma raz ao forte para isto. Igualdades O programa primeiro07.cc apresenta um problema esquisito, compara dois n umeros iguais e conclui que eles podem ser diferentes. Este e um dos problemas do C alculo e da An alise Numerica: e dif cil de se obter uma igualdade. O programa calcula os coecientes angulares de dois segmentos sobre uma mesma reta b3 b2 b2 b1 , a3 a2 a2 a1 (1.1)

e o c alculo resulta em uma pequena diferen ca conduzindo o programa a concluir que os n umeros podem ser diferentes. ca o, e procurar uma A solu ca o para a busca de igualdades, em computa desigualdade. Uma solu ca o se encontra no programa primeiro08.cc em que substitu a busca de uma igualdade por um teste envolvendo uma desigualdade teste = |teste
b2 b1 a2 a1

(1.2) (1.3)

b3 b2 a3 a2 |

< 0.00001

e sendo este u ltimo teste verdadeiro, o programa reconhece que os dois pontos se encontram sobre a mesma reta. Leia tamb em o coment ario (100) sobre o uso da biblioteca math.h e fa ca a experi encia que o coment ario sugere.

1.2.2

Usando fun c oes

O cap tulo 4 discute fun c ao, e seria interessante que voc e zesse uma r apida leitura deste cap tulo. O ponto de partida ser a o programa primeiro09.cc incluindo uma fun ca o denida pela programadora.

As fun co es s ao o centro da programa ca o12 em C++ e vou agora alterar o programa primeiro09.cc usando este conceito. Em todos os programas que estudamos at e agora, as modica c oes sucessivas de primeiro01.cc s ao formados de uma u nica fun ca o: main(). O programa primeiro09.cc e bem simples tem uma mensagem de tr es linhas para facilitar o meu objetivo imediato que e mostrar-lhe o signicado das fun co es.
fun co es s ao importantes em qualquer linguagem de programa ca o atual, depois elas passar ao a ser chamadas de m etodos.
12 As

12

Este conceito, fun c ao, e a forma como se modularizam os programas. Uma fun ca o e um pequeno algoritmo que uma outra fun c ao chama, desencadeando o uxo formado por pequenos processos, os atomos de um programa. Com frequ encia main() e apenas uma listagem em que diversas fun co es s ao sucessivamente chamadas. N ao e poss vel fazer programas interessantes sem fun co es. Leia rapidamente o cap tulo 4 para completar as informa co es de que preciso aqui, entretanto n ao ser a preciso muita coisa neste primeiro momento. Voc e pode fazer uma leitura mais completa do cap tulo depois. Primeiro aprenda a usar as fun co es. O pr oximo tutorial tem este objetivo. Voc e vai aprender a usar as fun co es, depois voltaremos a discutir a teoria, no cap tulo 4. Exerc cios 4 (Tutorial) Constru c ao de fun c oes 1. Abra o programa primeiro09.cc, leia e rode o programa. 2. Um programa tem que ter uma fun c ao principal, main(). Mas pode ter outras, e este tem, a fun c ao return(). A altera c ao deste programa que se encontra no arquivo primeiro091.cc. Vou passar ` a an alise do novo programa: Se voc e tiver se apressado e compilado o programa, achou erros! Logo vou discutir estes erros. transferi para mensagem() a tarefa de imprimir as mensagens que antes se encontravam em main(); em main() coloquei o comando13 mensagem(); 3. Compile e rode o progama primeiro091.cc. Leia e compare os programas primeiro09.cc, primeiro091.cc 4. Ocorreu um erro, certo? Criei a fun ca o, mensagem(), colocada logo depois do nal de main();

Um programa e uma cole c ao de fun c oes chamando outras fun c oes, tudo isto gerenciado pela fun c ao main()

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 fun c ao que vai ser usada. Leia o coment ario ao nal do programa, nele voc e encontra instru c oes de como corrigir o programa. A corre c ao se encontra em primeiro092.cc Compile e rode o progama primeiro092.cc. 5. O programa primeiro092.cc ainda est a errado, mas agora foi uma simples aviso que o compilador fez: warning:
13 Cada

nova fun ca o que voc e criar, e um novo comando que voc e estar a criando.

13

primeiro092.cc: In function int mensagem(): primeiro092.cc:34: warning: control reaches end of non-void function 6. Leia o coment ario no programa, nele voc e encontra a sa da para o aviso na compila c ao de primeiro092.cc. 7. Melhore primeiro092.cc colocando algumas mudan cas de linha. Corrija tamb em o defeito mencionado no coment ario, use os dois m etodos sugeridos. solu c oes: primeiro092a.cc primeiro092.cc Vamos analisar a metamorfose de primeiro09.cc para ser transformado em primeiro092.cc. A sua primeira rea ca o pode ser que o autor apenas complicou as coisas. E e verdade! Mas o pr oximo exemplo vai mostrar-lhe que esta t ecnica complicadora e salutar, aguarde um pouco. Antes de prosseguir vamos repassar os detalhes da cria ca o de uma fun ca o. Para denir uma fun ca o e preciso, antes de main() declarar o prot otipo da fun ca o, a primeira linha copiada da deni ca o da fun ca o, mas terminada com ponto-e-v rgula, e colocada no in cio do programa, onde cam todas as declara co es iniciais. Este e o erro que havia em primeiro091.cc, a aus encia do prot otipo. Depois construir a deni ca o da fun ca o. Finalmente cham a-la la dentro de main(), ou de dentro de uma outra fun ca o, porque, num programa mais complexo o comum e que, main() chama algumas fun co es e cada fun ca o chama outra fun ca o, que chama outra fun ca o, que chama outra fun ca o, que chama . . . uma fun ca o se o programa estiver correto para! sen ao .... e melhor aprender a programar e fazer outro programa!

Continuando com o tutorial, agora alterando primeiro07.cc. Voc e j a rodou este programa, e j a o leu? preciso Ele tem umas repeti co es que indicam que ele est a mal feito. E de algumas fun co es para evitar este defeito. Um texto repetido dentro de um programa e um ind cio de que alguma coisa est a errada. 14

Exerc cios 5 (Tutorial) Ainda sobre fun c ao 1. Crie uma fun c ao mensagem() para apresentar o programa. N ao se esque ca do prot otipo, mas se voc e se esquecer o compilador vai alert a-l@ disto. E n ao se esque ca de chamar mensagem() no local certo em main(). Solu c ao: primeiro071.cc 2. Leia o coment ario (80) em primeiro071.cc e crie uma fun c ao adequada. N ao se esque ca do prot otipo... etc... H a um erro antigo, herdado de primeiro071.cc, corrija este erro. Leia o coment ario (120) em primeiro072.cc. Solu c ao: primeiro072.cc 3. Corrija o erro no coeciente angular do programa primeiro072.cc leia o coment ario (120). Solu c ao: primeiro073.cc 4. Crie uma fun c ao laudo final() para emitir a mensagem nal do programa primeiro073.cc. Esta fun c ao deve receber as vari aveis x1, x2, x3, y1, y2, y3 para calcular os coecientes angulares. Solu c ao: primeiro074.cc 5. H a ainda uma repeti c ao de rotinas em primeiro074.cc que podem ser executadas por uma fun c ao, fa ca isto. Talvez voc e precise de duas fun c oes f1, f2. Solu c ao: primeiro075.cc 6. H a ainda uma repeti c ao de rotinas em primeiro074.cc que podem ser executadas por uma fun c ao imprime pontos(). Solu c ao: primeiro076.cc 7. Infelizmente o programador esqueceu-se de calcular alguma coisa em primeiro076.cc e os pontos est ao sendo calculados de uma forma extranha. Descubra onde est a o erro, leia o coment ario (300). Solu c ao: primeiro077.cc No tutorial anterior voc e acompanhou a evolu ca o de um programa para nele incluir diversas fun co es que executavam, cada uma, tarefas espec cas que antes eram repetidas dentro do programa inicial. O planejamento n ao foi dos melhores. H a formas bem mais organizadas de obter o resultado alcan cado pelo programa primeiro077.cc mas n ao era o objetivo neste momento atingir um planejamento melhor. Eu queria ilustrar a cria c ao e uso do conceito de fun ca o. Embora eu ainda n ao tenha discutido este conceito a fundo, isto ser a feito no cap tulo 4, de agora em diante j a vou usar fun co es nos programas. 15

Cabe aqui uma pequena an alise do que foi obtido com o programa primeiro077.cc. A fun ca o main() agora assume um papel de planejamento do trabalho. Voc e ver a que esta atitude ser a adotada seguidamente no futuro. Dividimos o trabalho em pequenas tarefas (fun co es). Cada uma destas tarefas podem ser vericadas separadamente antes de serem usadas dentro do programa. Estude o programa testa funcao01.cc Ele mostra como se pode testar uma fun ca o. A divis ao do trabalho em pequenas fun co es que executem, cada uma delas, uma pequena tarefa, garante uma probabilidade m nima de erro. Pequenas fun co es s ao objetos important ssimos para os quais sempre vamos encontrar novas utiliza co es. Analise a bilioteca Ambiente.h que traz a deni ca o da classe Ambiente, sem dar grande import ancia ao fato de que ela seja uma classe. As classes ser ao estudadas no cap tulo 7. Observe que Ambiente.h e formada de um conjunto de pequenas fun co es (agora chamadas de m etodos da classe Ambiente). Na pr oxima se ca o farei uso direto de Ambiente.h. Em quase todos os programas que voc e estudo at e agora, a biblioteca Ambiente.h est a sendo declarada. Experimente isol a-la com um coment ario e depois compile o programa. que Ambiente.h est Vai dar erro, provavelmente. E a se reponsabilizando pela declara ca o de C para C++. Mais a frente voltarei a esta quest ao. Voc e foi inicializado no conceito de fun ca o. Passe a usar fun c oes vendo nos programas primeiro071.cc ...primeiro077.cc como elas s ao denidas. Mas guarde a observa ca o, as fun co es que construi nesta seq u encia tinham o objetivo de mostrar como fazer, e em alguns casos n ao foram a melhor solu ca o. O m etodo que descrevi e o que se usa na produ ca o de programas: Vamos aos poucos construindo a vers ao melhor de um programa a partir de uma sucess ao de vers oes que corrigem os erros das anteriores. Em geral este trabalho e feito em equipe, o trabalho e divido entre os membros da equipe e cada um constr oi as suas fun c oes e as testa. Voc e vai ver, quando se constr oi uma boa fun c ao14 , n ao e necess ario que ningu em a leia para us a-la. Ela e em geral simples, faz poucas coisas, tem um nome que identica bem o seu objetivo e pode trazer uma ajuda dando dicas sobre o seu uso.
14 Aos poucos vou deixar de usar a palavra fun c ao. Em programa ca o orientada a objetos n os as chamamos de m etodos.

16

Experimente digitar tar, seguido de enter, numa shell, (sem aspas). Experimente15 digitar factor 34344343542 (sem aspas) numa shell. Experimente digitar factor h (sem aspas e sem par ametros). tar n ao e o melhor exemplo porque e um programa bem complexo... formado de diversos m etodos! factor tamb em n ao e muito simples, mas e um exemplo de utilit ario bem feito e tremendamente u til, com algumas fun co es chamando umas as outras. Finalmente juntamos o trabalho no programa nal, como tar ou factor e o distribuimos16 , gratuitamente, na rede. Na u ltima atualiza ca o que z da minha caixinha Linux foi acusada a presen ca de 350 mil programas ou arquivos instalados. Entre eles se encontra factor que fator um n umero inteiro de tamanho arbitr ario, factor 234255550 234255550: 2 5 5 41 229 499 pi que, escreve o n umero com um n umero arbitr ario de casas decimais: 3.141592653589793238462643383279502884197169399375105820974944 59230781640628620899862803482534211706798214808651328230664709 38446095505822317253594081284811174502841027019385211055596446 229489549303819

1.3

As opera c oes aritm eticas

Um dos objetivos de uma linguagem de computador e fazer contas com n umeros. Algumas linguagens s ao capazes de fazer contas com s mbolos, com letras, como em algebra, isto se chama de computa c ao alg ebrica. N ao podemos fazer computa c ao alg ebrica diretamente com C++, podemos faz e-lo com uma ferramenta escrita com C++, mas n ao ser a o objetivo deste livro.

Vou lhe falar nesta se ca o de opera co es aritm eticas, quer dizer que os programas v ao fazer contas com n umeros. Fa ca uma leitura inicial do assunto
15 Este programa, factor. pode n ao estar instalado, instale, ou pe ca ao administrador do sistema que ele seja instalado. 16 Nem tar e nem factor s ao de autoria do autor deste livro...tar e um utilit ario comum nas esta co es unix - como Linux.

17

t pos de dados no cap tulo 5. As vari aveis t em tipo e aqui vou descrever o que acontece com o tipo de dados chamado int. Vou usar uma das vers oes de primeiro07.cc para mostrar-lhe que nunca17 come co do zero, sempre uso um programa que j a faz alguma coisa parecido com aquilo que desejo fazer, para isto uso as palavras chave que deixo dentro dos programas. Certo, o nunca e um exagero, mas no m nimo come co com 00esqueleto.cc e com isto n ao me esque co de usar coment arios; de identicar 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 b asicas, (as classes b asicas). Leia o programa 00esqueleto.cc, mais do que isto, o modique para que ele atenda ` as suas necessidades iniciais. Voc e j a deve ter observado que os programas todos tem, nos coment arios iniciais, um item, palavras chave. Se voc e executar grep chave *.cc | more voc e vai ter uma lista de todos os assuntos18 que os programas cobrem e poder a escolher um programa que esteja pr oximo do que voc e deseja. Mantenha este item atualizado nos seus programas. Vou fazer uma c opia de primeiro077.cc para segundo01.cc e fazer algumas altera co es para come car o trabalho: cp primeiro077.cc segundo01.cc Exerc cios 6 (Tutorial) Fun c oes e classe 1. Leia e rode o programa segundo01.cc. Ele est a errado e o coment ario (100), dentro do programa, identica o erro. Corrija e rode o programa. 2. Altere segundo01.cc (a vers ao que voc e tiver corrigido) para calcular a combina c ao linear z na equa c ao z = a 1 t1 + a 2 t2 + a 3 t3 em que a1 , a2 , a3 s ao constantes do programa e o usu ario fornece os valores de ti . Mantenha os valores de default para ti , de forma que o usu ario possa us a-los, se quiser, quando o programa executar cin >> ti 19 .
vezes come co usando 00esqueleto.cc... grep chave *.cc > chaves voc e cria um arquivo chamado chaves contendo a lista de todas linhas com as palavras chave dos programas. Este comando e destrutivo, vai substituir o arquivo chaves, se ele existir. 19 cin e um objeto denido em iostream para entradadas de dados, e >> e o m etodo para acess a-lo. M etodo ? que e m etodo ? fa ca uma leitura r apida do cap tulo 7
18 Executando 17 As

18

No momento da leitura de dados, dando enter, o valor existente em ti o que se chama de valor default, ou um valor padr ser a utilizado. E ao para uma vari avel. Solu c ao: segundo02.cc 3. O programa segundo02.cc tem outro erro. Compile o programa e depois veja o coment ario (40) que indica como corrigir o erro. Corrija o programa, transformando o erro em coment ario. 4. No programa segundo02.cc criei uma fun c ao para fazer entrada de dados. Estude o programa e veja como isto foi feito, mas n ao se considere essencial dominar tudo. Use primeiro, depois entenda. Esta fun ca o virou um m etodo da classe Ambiente. 5. O programa segundo02.cc tem uma sa da de dados muito pouco explicativa. Altere-o para que ele explique qual foi a combina c ao linear feita. Em segundo02.cc constru uma fun ca o para fazer entradas de dados do tipo int. A fun ca o usa duas fun co es da linguagem C para entrada de dados. N ao sofra muito procurando entender a fundo o funcionamento destas fun co es, esta e uma solu ca o r apida que pode ser a substituida, mais a frente, por c odigo genuinamente C++. Aqui serve de exemplo de uso de C, depois voc e ver a outra op ca o e poder a selecionar qual prefere. Exerc cios 7 (Tutorial) M etodos de Ambiente 1. Compile, rode e leia o programa segundo02.cc. g++ -Wall -oprog segundo02.cc e depois rode: ./prog. 2. Leia o m etodo entrada int() denido em Ambiente.h. Como esta entrada de dados j a estava madura, (vinda de meus proggramas em C), eu a inclu em uma biblioteca20 . 3. Leia o arquivo Ambiente.h, ele cont em uma classe (classes ser ao estudadas no cap tulo 7). O objetivo da classe Ambiente e oferecer pequenos m etodos que t em uma utilidade geral, em diversos programas. Ambiente.h e uma evolu c ao, para classe de minha antiga bilioteca de fun c oes 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 m etodo de Ambiente. Tudo que este programa faz e emitir uma mensagem solicitando que voc e aperte enter para nalizar o programa.
20 Agora

as bibliotecas devem conter classes, Ambiente e uma classe denida em Ambiente.h.

19

5. Agora leia o arquivo Ambiente.h e voc e ir a encontrar uma vers ao de apeteco.cc transformada em um m etodo da classe Ambiente. Na verdade ir a encontrar tr es: apetecof(), apeteco2(), apeteco() Nos pr oximos exerc cios vou usar a classe Ambiente dentro dos programas. Uma primeira leitura do cap tulo 7 eu til, agora. Mas fa ca apenas uma primeira leitura e volte para aprender-usando na lista de exerc cios seguinte. Exerc cios 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 deni c ao de tipo Ambiente Tela criando uma nova vari avel ( e um objeto da classe Ambiente). Se deve dizer que e uma realiza ca o da classe Ambiente, em ingl es, an instance of the class Ambiente. (c) Depois usei alguns m etodos de Ambiente herdados por Tela Tela.apetecof(), Tela.limpa janela() Leia o programa e volte a rod a-lo. 2. Fa ca algumas experi encias e analise o resultado, com o programa segundo03.cc (a) Apague (use coment ario) #include Ambiente.h. Compile e rode o programa. O erro e o mesmo que o de usar uma vari avel n ao declarada. Tela n ao foi declarada. (b) Volte a incluir #include Ambiente.h, mas, onde tiver Tela.limpa janela() apague o prexo Tela. Compile e rode o programa. Agora o erro e indica que a fun c ao limpa janela() n ao existe - n ao foi declarada, apesar de que esteja denida em Ambiente.h. que limpa janela() n E ao e mais uma fun c ao, e um campo da classe Ambiente. Para ser utilizada tem que ser acessada como um campo de um objeto desta classe, no caso, Tela, portanto com a sintaxe Tela.limpa janela() 3. Fa ca um pequeno programa apenas para usar apetecof(), limpa janela() herdados por um objeto chamado Comunicacao Se inspire no uso de Tela. Solu c ao: segundo04.cc

20

4. Escreva um programa que imprima todos os n umeros inteiros de 1 at e 10. Solu c ao: segundo05.cc 5. O programa segundo05.cc sugere que voc e aprenda a usar o while(). Compare ca ao cap tulo 3 para ver como se usa while(). Tente transformar segundo05.cc numa vers ao mais evoluida. Solu c ao: segundo06.cc 6. segundo06.cc descreve os termos de uma p.a. de raz ao 1 tendo como primeiro termo 1. Altere segundo06.cc para obter (a) Uma p.a. com raz ao 3 e primeiro termo 5; (b) Uma p.a. com raz ao -5 tendo por primeiro termo 17 Solu c ao: segundo07.cc 7. O programa segundo07.cc lhe apresenta um atalho21 que se originou na linguagem C. Leia o coment ario (50) e fa ca as experi encias sugeridas. 8. Em segundo07.cc alterne a posi c ao das linhas dentro do while() e analise o resultado. 9. Altere segundo06.cc para calcular a soma dos 1000 primeiros n umeros naturais (inteiros positivos). Solu c ao: segundo08.cc 10. O programa segundo08.cc imprime, inutilmente, os valores intermedi arios acumulados na vari avel soma. Elimine este defeito. Solu c ao: segundo081.cc 11. Mas talvez fosse interessante ver as somas parciais, por exemplo, a cada 20 parcelas. Um if() resolveria este problema. Leia a respeito de if() no cap tulo 3 e altere segundo081.cc para que sejam impressas algumas somas parciais. Voc e vai precisar de uma vari avel contador para controlar estes eventos. Solu c ao: segundo082.cc Em todos os programas passarei a usar a biblioteca22 Ambiente.h para estabelecer comunica ca o com o usu ario do programa. poss E vel que a not cia sobre o direito autoral o aborre ca, ela se torna assim um exerc cio, o de elimin a-la dos programas, ou transform a-la em um texto que lhe pare ca mais agrad avel. Depois vou ensinar-lhe a evitar este aborrecimento permitindo ao usu ario o direito de n ao ler coment arios dos programas. Leia a biblioteca Ambiente.h, mas com o objetivo de conhec e-la. Ela usa o conceito de classe que ser a estudado no cap tulo 7.
21 Os 22 Eras

atalhos s ao discutidos no cap tulo 2 do autor! N ao e uma biblioteca, e uma classe, um modelo!

21

Exerc cios 9 (Tutorial) if()/else ca um programa que solicite do usu ario um n umero maior 1. maior do que Fa do que 100 e teste se ele fez isto. Solu c ao: terceiro01.cc ario tiver obedecido ao solicitado, o programa termina sem 2. else Se o usu diz e-lo! Isto pode ser alterado incluindo um complemento ao if() que e o else. Leia a respeito no cap tulo 3 e fa ca um programa mais completo. Solu c ao com um erro: terceiro02.cc 3. else O programa terceiro02.cc , infelizmente, est a errado23 , mas o coment ario (20), dentro do programa, explica porque. Corrija o erro atendendo ao coment ario do programa. 4. desigualdade Fa ca um programa que solicite do usu ario dois n umeros, um maior do que 100 e outro menor do que 50 e depois teste os resultados. O programa terceiro03.cc pretende fazer isto, mas ele est a errado, por que ? Rode v arias vezes o programa com as distintas possibilidades para vericar por que ele est a errado. Leia o coment ario (50), no programa. Solu co es: terceiro03a.cc , terceiro03b.cc 5. l ogica, conjun c ao Em terceiro04.cc estou usando a conjun c ao l ogica condicao1 && condicao2 como par ametro do if(). Verique se este programa resolve a quest ao anterior. ca um programa que resolva a equa c ao (inteira)24 6. equa c ao Fa x+b=c Solu c ao: terceiro05.cc 7. Dependendo dos coecientes, o programa terceiro05.cc pode apresentar a equa c ao de uma forma pouco elegante: x + 3 = 7... Experimente e depois corrija este defeito do programa. Solu c ao: terceiro06.cc 8. Ainda cou uma imperfei c ao no programa, ele escreve a equa c ao x +0 = 7, e eu gostaria que ele escrevesse x = 7. Fa ca esta corre c ao. Solu c ao: terceiro061.cc 9. Para resolver uma equa c ao qualquer do primeiro grau, voc e precisa do tipo float25. Altere terceiro06.cc para resover uma equa c ao do primeiro grau Ax + B = C . Solu c ao: terceiro07.cc
23 V a

se acostumando, este livro est a cheio de erros! o conjunto dos inteiros 25 ponto utuante
24 sobre

22

10. desigualdade Para resolver uma desigualdade temos que analisar se em Ax + B C o coeciente A e positivo ou negativo. Use if()/else e escreva uma programa que resolva esta desigualdade. Solu c ao: terceiro08.cc 11. O r otulo26 de terceiro08.cc est a errado (t pico quando se re-aproveita um programa...). Corrija isto. 12. Fa ca um programa que resolva equa c oes do segundo grau. Altere terceiro08.cc por exemplo. Considere as etapas: (produza as fun c oes que as v ao representar) Analise primeiro quais s ao as etapas do problema; altere rotulo() de forma conveniente; fa ca as fun c oes que resolvem cada uma das tarefas que voc e tiver identicado; re-escreva main() para gerenciar o processo: o script. Solu c ao: terceiro09.cc 13. Rode e leia terceiro09.cc. Observe que tem apeteco2() em excesso no programa. Corrija isto. 14. O programa terceiro09.cc resolve equa c oes do segundo grau com ra zes reais. Leia e rode o programa. Termine o programa para que ele calcule as ra zes complexas atendendo as recomenda c oes que caram no programa. Solu c ao: terceiro091.cc 15. Fa ca um planejamento diferente do que foi usado em terceiro091.cc para resolver equa c oes do segundo grau. Use a fun c ao main() como planejamento; construa as fun c oes que main() chama.

crie fun c oes vazias de acordo com o planejamento feito com main(); Solu c ao: segundo grau*.cc
26 Chamo

de r otulo aos coment arios que coloco no in cio dos meus programas.

23

1.4

Opera c oes com os inteiros

Os n umeros, em computa ca o, n ao s ao o mesmo tipo de objetos para a Matem atica. Um diferen ca fundamental separa estes dois campos do conhecimento para a Matem atica os n umeros formam um conjunto innito; n ao tem sentido em computa ca o falar-se em conjunto innito, e mais, um n umero e um tipo de dado. Voc e pode ler mais a respeito de tipo de dado no cap tulo 5. em Matem atica se estabelece uma departamentaliza ca o para os n umeros, mas por raz oes puramente formais, e no fundo todo n umero pertence a ao conjunto dos n umeros complexos, em computa ca o h a uma clara divis ao entre n umero inteiro e n umero com ponto utuante, oat. Uma raz ao desta diferen ca se deve ao espa co que cada um desses tipos de dados numericos ocupa na mem oria. Leia o cap tulo 5.

Considerando que um inteiro e um tipo de dados para linguagens de computa ca o, um dos objetivos do pr oximo tutorial e a identica ca o do espa co que um inteiro ocupa na mem oria e as restri co es que as opera co es da aritm etica sofrem com este tipo de dados. Como quero fazer um pouco de aritm etica, nada mais natural do que xar como objetivo montar uma calculadora. Neste momento ser a uma calculadora muito simples, mas ao nal do livro voc e vai observar que este projeto simples e o passo inicial de um projeto mais ambicioso que se encontra mais para frente. um programa Rode o programa inteiros01.cc. Rode e leia o programa. E muito rudimentar, n ao tem uma boa apresenta ca o, tem erros nas mensagens, e e um bloco monol tico. Vou criticar este programa e transform a-lo num programa bem planejado. O pr oximo tutorial vai partir de um programa que e uma copia (melhorada) de inteiros01.cc. Exerc cios 10 (Tutorial) Sobre os inteiros A leitura de programas e um exerc cio importante em que voc e adquire a experi encia de outro programador. Por em, ` a medida que os programas forem cando mais complexos, este exerc cio ir a cando mais dif cil. Uma forma de facilitar esta an alise consiste em abrir dois terminais: num deles voc e roda o programa; no outro voc e edita o programa. assim, ao mesmo tempo que voc e l e o c odigo fonte tamb em v e o programa rodando. Em Linux isto e f acil de ser feito! Abra dois terminais, num deles voc e roda o programa, no outro voc e edita o programa. 1. Leia e rode o programa quarto01.cc. Fa ca uma listagem dos m etodos que este programa herda da classe Ambiente.h.

24

2. Refa ca o programa quarto01.cc para torn a-lo independente de Ambiente.h. etodos Conclua se h a vantagens no uso desta classe. sugest ao: copie os m de Ambiente.h transformando-os em fun c oes do programa, sem fazer grandes esfor cos para entender como funcionam. Aprenda usando! Abaixo voc e tem a solu c ao, mas tente a sua primeiro. solu c ao: quarto01 c.cc 3. Altere quarto01.cc para fazer todas as quatro opera c oes com os n umeros e um grande projeto! Divida-o em 5 pequenos fornecidos. sugest ao: Este projetos: adi ca o, subtra ca o, multiplica ca o, divis ao (aqui pode dar problemas...), modulo (resto na divis ao por). Fa ca cada um deles funcionar antes de acrescentar o outro. Lembre-se, a primeira vers ao de um programa n ao deve deve ter nenhuma arte, a parte art stica vem posteriormente e eo que cou faltando a todos os programas deste livro. . . Solu c ao: quarto02.cc 4. Se voc e rodar quarto02.cc com n umeros realmente grandes, na classe de milhar, a multiplica c ao pode ter resultados extranhos, experimente. Voc e tamb em vai encontrar resultados extranhos com respeito ` a divis ao. Leia o cap tulo 2 a respeito da divis ao inteira. Outras justicativas voc e vai encontrar lendo a respeito do tipo int no cap tulo 5. O programa quarto02.cc e extenso mas n ao e dif cil. Vou analis a-lo em algum detalhe, agora, antes de partir para a constru ca o da calculadora. Leia tamb em no programa os coment arios, n ao se esque ca de que eles fazem parte integrante do texto deste livro. Ele tem pelo menos um defeito de planejamento27 indicado no pr oprio programa que e a exist encia de uma segunda fun ca o principal licao inteiro() que faz tudo. Este papel e da fun ca o main(). Para corrigir isto basta levar licao inteiro() para dentro de main(). Outro defeito: falta-lhe um menu de op c oes, compile e rode o programa quarto03.cc para ter ideias de como melhorar este. A gura (1.2) p agina 26, mostra como aparece na tela o menu do programa quarto03.cc. Um desao! Claro, se tratam de defeitos de planejamento, mas o programa pode car assim e funcionar. O autor est a satisfeito com o resultado, a leitora deve car insatisfeita e produzir algo melhor que se enviado ao autor pode ser inclu do na pr oxima edi ca o com cr editos para quem enviar a melhor solu ca o. Observe que a calculadora j a e uma solu ca o melhorada. . . quarto02.cc se comp oe de cinco fun co es que descrevem as cinco opera c oes elementares da aritm etica. A quinta opera ca o e o c alculo do resto. Voc e pode ler mais a respeito dos operadores aritm eticos da linguagem C++ no cap tulo 2. Em C++ a divis ao se comporta de uma forma aparentemente extranha. Ao calcular uma divis ao entre n umeros inteiros, o que vamos obter e o quociente. Leia novamente quarto02.cc, na parte nal esta a fun ca o divisao euclidiana()
27 A

verdade mesmo e que n ao houve planejamento nenhum. . .

25

Figura 1.2:

Um menu de op co es

que usa o algoritmo da divis ao euclidiana escrevendo quociente, resto com a divis~ ao e o m odulo. O m odulo28 e a quinta opera ca o fundamental da aritm etica. Leia mais a respeito no cap tulo 2. Para construir a calculadora vou usar o controle l ogico switch() que se o nome em ingl traduz por escolhe ou seleciona. E es para interruptor eletr co de parede para selecionar em dois estados de uma l ampada: acesa ou apagada. Este controle, switch(), e a boa op ca o sempre que voc e tiver v arias op co es entre ` as quais uma deve ser escolhido, por exemplo, e excelente para constuir menus. Esta palavra em ingl es tamb em signica conecta e e exatamente isto que se quer dizer. Pense naquelas caixas de conex ao ` a internet em locais em que h a uma rede de computadores. Na gura (1.3) p agina 27, voc e v e um switch para um aparelho que conecta cada um dos computadores em uma rede internet. E interna. O sinal de internet entra no primeiro conector e o aparelho escolhe para qual computador dever a enviar os datagramas que est ao chegando. Em computa ca o switch() generaliza o if() permitindo que escolhamos entre v arios estados. Voc e pode fazer um switch() com v arios if()/elses tamb em, mas ca complicado e feio. Veja o arquivo switch.cc que n ao e um programa. Quando voc e precisar de usar esta estrutura l ogica poder a chamar este arquivo e inclu -lo em seu programa. Leia o arquivo para entender a sintaxe desta estrutura de controle l ogico e leia mais a respeito no cap tulo 3. Vamos alterar quarto02.cc incluindo nele o arquivo switch.cc para construir o programa inicial da pr oxima lista de exerc cios.
signicado da palavra m odulo, aqui, e o mesmo da Algebra quando da se refere ` as classes quocientes no resto da divis ao
28 O

26

Figura 1.3:

Um switch para internet - conecta os computadores

Exerc cios 11 (Tutorial) A calculadora 1. Fa ca um programa que simule uma calculadora com as quatro opera c oes. Solu c ao: quarto03.cc 2. Leia rode e estude quarto03.cc. Ao estudar, tente fazer altera c oes e compilar para vericar se obteve o que esperava. 3. O programa quarto03.cc precisa que voc e indique com um n umero qual e a op c ao desejada. Vamos aprender a responder com o sinal da opera c ao e depois melhorar quarto03.cc. (a) Rode o programa ascii.cc e depois o leia. Ele usa a estrutura de controle for() sobre a qual voc e pode ler mais no cap tulo 3. Voc e pode tamb em o arquivo for.cc que e um esqueleto para o uso de for(). (b) Experimente o que o texto do programa ascii.cc sugere. (c) O programa ascii.cc tem um if() para controlar quantos caracteres ser ao impressos na tela de cada vez. Ele imprime de 10 em 10. Altere o programa para que ele passe a imprimir de 15 em 15. (d) Fa ca um programa que imprima os 100 primeiros termos de uma progress ao aritm etica transformado ascii.cc para isto. Solu c ao: quarto05.cc (e) Altere quarto05.cc para que ele receba o sinal da opera c ao que voc e deseja executar. c oes (warning), mas elas Solu c ao: quarto06.cc ignore as reclama indicam que tem uma forma melhor de programar que car a mais clara a partir do cap tulo 6. ++

27

1.5

Palavras e frases

Nesta se ca o vou mostrar-lhe como C++ pode agir sobre texto. Como texto e um tipo de dado muito grande, e interessante aprender a guardar ou ir buscar texto em um arquivo em disco. H a dois tipos de texto, os textos do tipo C e os textos do tipo C++. No cap tulo 6 vou discutir o novo tipo de dados, na verdade um objeto, que e texto do C++ que e muito mais din amico (para fazer opera co es) sobre textos do que o m etodo tradicional de C que e comum a maioria das linguagens da gera ` ca o do C, como Pascal. Na verdade, na antiga linguagem C, texto e um tipo de dados, em C++ e um objeto e portanto ele (o texto) sabe como transformar-se a pedido do usu ario.

Trabalhar com o tipo de dados, texto, vai ser assunto para o cap tulo 6 que voc e pode inclusive visitar rapidamente. Estamos terminando o cap tulo 1, e para que minha promessa de que, ao terminar este cap tulo, voc e j a esteja fazendo alguns programas interessantes, seja verdadeira, eu vou desenvolver um projeto nesta parte nal, uma agenda telef onica. Mas agenda telef onica e informa ca o que e preciso car guardada num arquivo. O programa vai construir a agenda, guardar num arquivo, e depois voc e poder a acess a-la com um editor de texto qualquer, poder a imprim -la, por exemplo, fazer altera co es que lhe pare cam interessantes ou passar para outro programa. Ent ao vou precisar de guardar texto em arquivo! dois assuntos quentes: texto, arquivo. Vou usar algumas ferramentas externas que s ao naturais nos sistemas Linux, quando acontecer isto vou chamar sua aten ca o para que voc e tente se adaptar para outro sistema operacional, mas neste ponto voc e j a ter a adquirido alguma experi encia se tiver feito os exemplos do livro em outro sistema que n ao Linux. Neste cap tulo, e em muitas outras ocasi oes neste livro, estou usando o e instalado nas (fazendo refer encia ao) editor de textos joe que comumente distribui co es Linux. Voc e tem duas op co es, ignore joe junto com qualquer outra prefer encia do autor a este editor, e o substitua em todos os programas por um editor que se encontre instalado no sistema que voc e estiver usando; e simples e muito poderoso29 . instale o joe que vale a pena, Deixe-me alert a-l@ para a diculdade um pouco maior desta se ca o sobre as anteriores e com isto quero dizer-lhe duas coisas: ao e para pessoas mais inteligentes, apenas exige mais tempo de o dif cil n processamento mental; n ao tente entender tudo imediatamente, aprenda a usar antes de compreender perfeitamente.
29 Isto

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

28

N ao duvide de que o conhecimento representado por uma linguagem de programa ca o foi obtido ao longo de anos e por v arias equipes estudando, errando, aprendendo. Em particular, aqui, vou me comunicar com arquivos em disco para guardar texto. Dois assuntos que exigem mais tempo e trabalho para que voc e compreenda todas as rela co es envolvidas. Nos cap tulos 5 e 6, voc e pode encontrar uma vis ao mais aprofundada sobre os dois tipos dados que vou usar aqui: texto, arquivo, mas use primeiro e se prepare para ir compreendendo com o uso. O cap tulo, 6, trata de texto e arquivo de uma forma bem mais aprofundada aconselh do que estarei fazendo neste cap tulo, como e de se esperar. E avel uma leitura supercial dos dois cap tulos, 5 e 6. onica. Espero que este projeto O projeto: vou construir uma agenda de telef seja motivador e u til. Para produzir um projeto relativamente grande como este, precisaremos de usar praticamente tudo que estudamos nas se co es anteriores e assim, ao concluir o primeiro cap tulo, voc e terminou um minicurso sobre C++ depois do que voc e poder a iniciar o seu aprofundamento atrav es dos cap tulos seguintes.

1.5.1

Como guardar texto

Leia a mais a respeito nos cap tulos 5 e 6. Aqui vou dirigi-l@ rapidamente para fazer uso de texto, e a t ecnica aprender a usar para depois compreender melhor. Algumas linguagens de computa ca o tratam texto como matrizes de caracteres, e o tipo string. C++ tem uma classe para tratar de texto, e a classe Streams, portanto vamos criar objetos desta classe para lidar com textos. O cap tulo 6 trata mais a fundo esta quest ao. Estas duas formas de texto coexistem em C++ e algumas vezes caracterizamos isto dizendo: um texto de tipo C++, Streams; texto do tipo C, as matrizes de caracteres. um m etodo de convers ao de Streams para o texto do tipo C; um m etodo para importar texto do tipo C para Streams de C++. Leia mais a este respeito no cap tulo 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 editores v ao alert a-l@ para este erro. Em v arios programas eu j a z uso de cadeias de caracteres de formas que voc e n ao est a encontrando, at e este ponto, nenhuma novidade. Mas at e agora n ao usei texto como um tipo de dados. Usar um tipo de dado signica eleger uma vari avel para guardar este tipo de dado, um comando como cout << 3 << endl;

29

n ao est a usando o tipo de dados int, embora esteja sendo enviado um o n umero diferente do comando inteiro 3 para a sa da de dados. E cout << um inteiro << endl; se a vari avel um inteiro estiver sido declarada em outro lugar do programa como sendo do tipo int. Ao denir uma vari avel para um determinado tipo de dados, criamos uma vari avel para este tipo de dados e poderemos aplicar os operadores naturais deste tipo de dados ` a esta vari avel. Na linguagem de orienta ca o ` a objeto diremos que podemos aplicar-lhe os m etodos desta classe. Em programa c ao orientada objeto se pensa sempre em m etodos associados a objetos. Agora vou avan car um pouco mais em programa c ao orientada objeto, com objetos que representam arquivos ou texto aos quais lhes vou aplicar fazer os m etodos para acessar arquivos ou manipular texto. O tipo de dados texto e relativamente simples: s ao matrizes (com uma u nica linha) tendo por entrada os caracteres, e a raz ao porque as chamamos, em portugu es, de cadeias de caracteres. Quer dizer que uma vari avel deste tipo consiste uma conjunto de endere cos nos quais se encontram guardados caracteres de forma sequencial.

1.5.2

Onde guardar textos de forma segura

Textos s ao dados muito grandes e algumas vezes muito sens veis, como n umero de telefone, registro no CPF, conta banc aria, e o melhor local para eles e um arquivo em disco (devidamente protegido). preciso associar texto com arquivo em disco. Os itens necess E ario para isto s ao: um tipo de dados, (um objeto de uma certa classe), para representar texto e as opera co es que podemos fazer com ele: concatenar, cortar, colar, selecionar um peda co, guardar num arquivo no disco ou recuperar de um arquivo no disco. um tipo de dados (um objeto de uma certa classe) que represente os arquivos e as opera co es com arquivos dentro do programa. H a duas classes b asicas, istream, o i vem de input, entrada de dados, e iostream, em que io vem de input, output, entrada e sa da de dados; como vou ter que representar a mem oria de massa, classes derivadas destas foram criadas para acessar um arquivo em disco, ofstream para sa da de dados, lembre-se do o de output, que signica arquivo para sa da de dados. ifstream para entrada de dados, lembre-se do i de input, que signica arquivo para entrada de dados.

30

Para manipular arquivos em disco C++ usa uma classe com que representa a mem oria de massa30 , stream, se diz em ingl es, corrente seria a tradu ca o para portugu es; cadeia de caracteres s ao em portugu es as matrizes de caracteres, o tipo de dados, texto, de C. O cap tulo 6 discute estes tipo de dados. A pr oxima lista de exerc cios 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 passar ao a ter signicado, estou entrando num projeto. Exerc cios 12 (Tutorial) O acesso a arquivos c~ ao 1. Rode o programa abre arquivo01.cc. Se der erro em tempo de execu a raz ao est a na linha system(joe telefone); porque este programa usa o editor de textos joe que pode n ao estar instalado no seu sistema. Neste caso troque joe pelo nome de um editor que esteja instalado e ignore a instru c ao sobre como fechar o arquivo, CTRL-C, que vale para o joe mas pode n ao valer para o editor que voc e estiver usando. Quando voc e compilar o programa, C++ n ao sabe se joe est a instalado no computador e n ao vai ver nenhum erro nisto. Mas quando voc e rodar o programa, pode haver um erro em tempo de execu ca o31 . Um dos tipos de erro mais dram aticos em computa c ao! Leia o coment ario (30) no programa. 2. Leia abre arquivo01.cc num terminal, enquanto voc e o executa em outro terminal. Analise o que faz o programa enquanto voc e o l e. 3. Altere o programa abre arquivo01.cc para criar alguns textos diferentes. 4. Altere o programa abre arquivo01.cc para gravar textos em diferentes arquivos no mesmo programa. N ao se esque ca de chamar o editor adequado para ver os textos escritos. Aqui h a um erro potencial muito comum: esquecer de fechar o arquivo, leia o coment ario (20) no programa abre arquivo01.cc, antes de abrir outro. Modo de evitar este erro: use os comandos: ofstream nome arq("telefone", ios::out);
30 Uma denomina ca o antiga, mas com freq u encia usada, para fazer refer encia aos discos, provavelmente devido ao material com que eram feitos. Uma mem oria ash, um pen-drive cai neste tipo de mem oria 31 Isto pode ser previsto pela programadora, h a um comando para vericar se um programa existe, em algum momento voc e vai aprender isto e desta forma podemos evitar tais erros.

31

nome arq.close(); sempre aos pares. Escreva logo os dois comandos, e depois comece a mandar dados para o arquivo entre estes dois comandos, assim voc e n ao ir a esquecer-se fechar o arquivo quando terminar de acess a-lo. 5. Leia o coment ario (05) em abre arquivo01.cc e fa ca a experi encia indicada. 6. Melhorando abre arquivo01.cc. O m etodo cin.getline(borrao, 80) recebe um texto com 80 caracteres que voc e pode colocar num arquivo. Fa ca um programa que lhe pe ca uma linha de texto e a coloque em telefone, separada por linhas em branco e depois abra o arquivo e lhe mostre o que est a escrito. solu c ao: abre arquivo02.cc 7. O programa abre arquivo02.cc dene uma vari avel de tipo char que e uma matriz de caracteres, e uma forma comum para guardar texto. Leia o coment ario (10) no programa. 8. Fa ca um programa que receba um texto e depois escreva cada letra deste, sucessivamente, na tela. solu c ao errada: brinca com texto.cc c ao direta 9. O erro em brinca com texto.cc se deve a tentativa de atribui de um texto a uma vari avel do tipo char. C++ n ao aceita isto, use a fun c ao strcpy(variavel, texto)32 em que texto e o texto que voc e deseja copiar em variavel. solu c ao: brinca com texto01.cc 10. Experimente mais o programa brinca com texto01.cc, por exemplo, tente escrever al em da posi c ao 79. N ao tema estragar o compilador nem o computador, mas preste aten cao, seriamente, ` as reclama c oes que o compilador zer sobre os erros no seu programa. 11. Melhore abre arquivo02.cc usando um while()33 permindo que voc e forne ca 10 linhas de texto para registrar no arquivo telefone. solu c ao: abre arquivo03.cc ao faz aquilo que ele anuncia, e al em 12. O programa abre arquivo03.cc n do mais tem um erro de l ogica. Leia o coment ario (150).
32 strcpy 33 leia

e a abrevia ca o de string copy sobre while() no cap tulo 3

32

13. Ainda tem um erro (se voc e n ao tiver percebido), no programa abre arquivo03.cc ao chega at e 10 como o programa no controle while(), a vari avel k n anuncia. Use <= para corrigir este erro. solu c ao: abre arquivo04.cc 14. Usando a experi encia at e agora adquirida, construa sua agenda de telefones. Ser a o primeiro passo de um projeto em andamento. 15. Escreva algumas linhas, com um editor de textos que opere no modo texto34 no arquivo telefone. Este arquivo ser a aberto para leitura usando ifstream35. Escreva um programa que abra o arquivo onde voc e escreveu texto e leia uma linha do arquivo. solu c ao: abre arquivo05.cc 16. Escreva algumas linhas, com um editor de textos que opere no modo texto36 no arquivo telefone. Este arquivo ser a aberto para leitura usando ifstream. Escreva um programa que abra o arquivo onde voc e escreveu texto e leia todas as linhas guardadas no arquivo. Use while( nome arq.getline(borrao, 80)): para controlar at e quando ainda tiver dados no arquivo. Este m etodo do objeto nome arq devolve, um falso, quando atingir o m do arquivo parando a execu c ao do while. Se inspire na solu c ao, mas tente constru r a sua, mesmo que voc e gaste um tempo extra para descobrir como faz e-lo. solu c ao: abre arquivo06.cc 17. um pequeno utilit ario Altere abre arquivo06.cc usando uma mensagem com cout que lhe pe ca o nome de um arquivo;

uma vari avel para guardar este nome, use cin para receber esta informa c ao para que o programa leia qualquer arquivo que se encontre no disco. O programa que chamo de pequeno utilit ario, no exerc cio (17) e uma r eplica dos utilit arios less ou more que habitualmente s ao instalados junto com as distribui co es Linux. Compare o seu com estes programas e sinta que voc e j a come ca a ser uma programadora, ou um programador! Esta e uma das principais id eias que quero lhe passar, a constru ca o de pequenos programas que executam uma tarefa bem determinada mas suciente geral: listar um arquivo qualquer. Tais programas
no modo texto, ou use joe, vi, gedit.... input, (f) le (stream) uxo. 36 Use joe, vi, vim, gedit.
35 (i) 34 Grave

33

podem ser usados em diversos contextos e vai ser a combina ca o de pequenos programas simples, de prop osito geral e bem feitos que nos permitir ao a constru ca o de grandes sistemas. No u ltimo bloco de exerc cios texto foi manipulado. Voc e viu que o processo de manipular textos e complexo uma vez que estamos trabalhando com duas categorias de dados: texto, arquivo. Vale a pena insistir na observa ca o inicial: aprenda a usar antes de entender tudo perfeitamente37 . Vou usar o que foi discutido para produzir uma primeira vers ao da agenda telef onica.

1.6

A agenda telef onica


vou construir manualmente uma agenda telefnica para que voc atente para as dificuldades e estruturas necessrias;

depois vou transformar os programas que tivermos construdo na lista de exerccios em mtodos;

o local correto para guardar os mtodos numa classe e vou assim criar a classe Telefone;

finalmente vou transformar a ltima verso do programa na verso orientada a objeto.

Observa c ao 1 A metodologia do projeto Voc e logo vai ver que estes m etodos, que vou criar para a agenda telef onica, podem ser u teis em outras situa c oes, por exemplo na constru c ao uma agenda de endere cos e quando voc e vai descobrir o poder da orienta ca o ` a objetos, no segundo projeto que vou desenvolver, ao nal deste cap tulo. H a v arias maneiras de implementar uma agenda telef onica e vou usar um m etodo bem simples que usa outros programas j a existentes e que funcionam muito bem (um dos mais importantes segredos da programa c ao, a reutiliza ca o de processos testados e reconhecidos como livres de erros). Voc e vai ver outros exemplos desta forma de programar neste livro. O contr ario disto consiste em tentar fazer tudo num u nico programa, resultando em sistemas muito grandes e facilmente cheio de erros. Que e uma agenda telef onica? Uma lista de nomes;
37 Ali as,

quando voc e entender tudo perfeitamente, n ao se esque ca de me explicar os detal-

hes...

34

cada nome associado a um n umero de telefone; mas seria relativamente in util uma tal lista se ela n ao estivesse ordenada; Ent ao uma agenda telef onica e uma lista nomes associados a n umeros38 de telefone em que os nomes devem estar ordenados alfabeticamente. Problema: cada vez que voc e colocar um novo nome na agenda, ela quase certamente vai car desordenada! Preciso de um m etodo para re-orden a-la a cada atualiza c ao, e e aqui que vou usar um programa t pico das m aquinas Unix, o sort, para manter a agenda sempre ordenada. Vou construir os programas que fazem todas estas tarefas no pr oximo tutorial e depois vou discutir a transforma c ao dos programas em m etodos. Exerc cios 13 (Tutorial) Construindo a agenda telef onica 1. Aprendendo a usar sort. Edite o arquivo telefone (crie uma arquivo com este nome) colocando nele algumas linhas formadas de nomes de pessoas que voc e conhe ca. Um nome por linha, e n ao se preocupe com nenhuma ordena c ao a n ao ser que todas as linhas comecem na mesma posi c ao. Execute: sort telefone > telefone2. mv telefone2 telefone O efeito destas linhas e Ordena o arquivo;

coloca o resultado no arquivo telefone2;

transfere o arquivo telefone2 para telefone.

O s mbolo > representa para o sistema operacional um redirecionador. Se voc e n ao usar a segunda parte, > telefone2 o sistema escreve o resultado da ordena c ao na tela. Experimente! mv telefone2 telefone transfere o arquivo telefone2 para o arquivo telefone, e o sistema deve lhe pedir conrma c ao sobre se deve sobrescrever telefone. O comando mv, e abrevia c ao de move e tem como resultado mover o arquivo telefone2 para cima do arquivo telefone. joe telefone39 abre o arquivo telefone com o editor joe. O arquivo telefone estar a ordenado, em ordem alfab etica.
38 Que 39 Substitua

n ao s ao n umeros, coisa nenhuma! mas e assim como todos chamam... joe por editor de sua prefer encia ou que esteja instalado no sistema.

35

2. Acrescente alguns nomes no arquivo telefone deixando-o desordenado (alfabeticamente), sempre um nome por linha. N ao se esque ca de que as linhas comecem40 na mesma posi c ao. Fa ca agora um programa que use sort, Voc e vai precisar de: system("sort telefone >> telefone2") system("mv telefone2 telefone") que re-ordene o arquivo telefone e chame joe para vericar se tudo deu certo. Voc e construiu a fun c ao ordenando()... Solu c ao: telefone01.cc 3. Acrescente uma fun ca o no programa telefone01.cc para permitir a entrada de novas informa c oes no arquivo telefone, depois chame a rotina ordenando() para deixar o arquivo em ordem alfab etica. Solu c ao: telefone02.cc 4. O programa telefone02.cc tem um defeito, coisa natural de quem est a aprendendo... ele faz mais do que deve fazer: abre o arquivo telefone para que possamos ver como est a. Isto e tarefa para outra fun c ao. Melhore o programa colocando a chamada ao editor em outra fun c ao. Aprenda a dividir as tarefas em pequenas] fun coes. 5. Na classe Ambiente.h existe um m etodo, sim nao() que pergunta se alguma coisa deve ser feito. Use este m etodo para melhorar o programa telefone03.cc de modo que o arquivo telefone somente seja aberto se for este o desejo do usu ario. Solu c ao: telefone03.cc 6. O programa telefone03.cc tem repeti c oes in uteis do m etodo apeteco2(), melhore o programa. 7. Use o m etodo sim nao() denido em Ambiente.h para permitir que o usu ario escolha se deseja (ou n ao) ver as informa c oes sobre os direitos do autor. Se inspire em telefone03.cc. 8. O programa telefone03.cc tem diversas paradas in uteis. Crie a vers ao milenium deste programa tirando estas paradas. Solu c ao: telefone04.cc 9. Os programas desta suite s ao muito primitivos, ainda se encontram na vers ao beta 0.3, e preciso voltar a rodar o programa para inserir um novo nome. E se quisermos inserir v arios? Melhore a fun c ao acrescentando() para que ela se mantenha no ar enquanto o usu ario quiser inserir nomes ao() da classe na agenda. Produza a vers ao beta 0.5 usando um sim n~ Ambiente.
desobedecer esta regra e analise o resultado, n ao se esque ca de que somente os desobedientes e que logram ir para frente.
40 experimente

36

sugest ao: Acrescente um la co while() para controlar a entrada de dados, use uma vari avel l ogica, resposta, para controlar se o usu ario quer continuar no la co while(). Solu c ao: vers ao 0.5 telefone05.cc 10. Rode o novo programa telefone05.cc num terminal enquando o abre com um editor em outro terminal. Em vez de usar um editor use: less telefone05.cc ou talvez o utitilit ario que voc e construiu. . . e acione <enter> para ver uma nova linha ou <espa co>. Mais adiante vou sugerir o uso deste programa em vez do editor de texto. Leia os coment arios do programa que eles explicam as modica c oes feitas: Foi acrescentada uma nova fun c ao, menu().

A fun c ao rotulo() foi alterada, ela agora d a ao usu ario a possibilidade de passar em frente.

A fun c ao ordenando() cou silenciosa sendo chamada por acrescentando() 11. Altere telefone05.cc estudando alguma melhora, por exemplo no layout do programa. Primeiro copie o programa para um arquivo, teste.cc, cp telefone05.cc teste.cc e altere este. Quando car satisfeito copie para a vers ao denitiva, cp teste.cc telefone.cc. Uma agenda telef onica, deni antes, e uma lista de nomes associados a n umeros de telefones, portanto uma matriz de n linhas com duas colunas em cada linha: Tarcisio Praciano-Pereira 55 88 3677 4249 poderia ser mais complicado, mas vou ignorar complica co es como a de um fulano ter dois ou mais n umeros de telefones. O caso mais complicado pode ser resolvido depois de resolvido o caso simples. Os programas feitos at e agora j a podiam ter produzido uma vers ao simples de agenda telef onica, basta acrescentar o n umero depois de cada nome, e certamete voc e j a fez isto. N ao ? A conclus ao que podemos tirar do tutorial para construir a agenda telef onica e que h a tr es m etodos necess arios: Acrescentar um item na agenda. Ordenar a agenda (uma a ca o independente do usu ario) e aqui podemos ver mais um defeito em telefone03.cc, ele fala que vai fazer a ordena ca o, melhore o m etodo, elimine esta mensagem in util. Apresentar a agenda (e estou usando joe para fazer isto).

37

Uma vers ao mais sosticada poderia apresentar exatamente o telefone de uma pessoa que desejassemos (mais um m etodo) ou apagar o telefone de algu em que j a n ao mais nos interessa ter na agenda (outro m etodo). Claro, o que produzimos a vers ao beta 0.5 da agenda deixando o prop osito de distribuir a vers ao muito melhorada 1.0 para um breve futuro. Ent ao para esta vers ao, j a com dom nio da tecnologia, vou construir agora a verdadeira vers ao orientada a objeto.

1.7

Um programa com orienta c ao a objeto

Existe um h abito, entre os que trabalham com programa c ao orientada a objeto de designar as classes com a primeira letra ma uscula. Porisso a minha classe com m etodos para estabelecer comunica ca o com o usu ario se chama Ambiente e agora vou construir a classe Telefone. Leia a vers ao inicial desta classe em Telefone01.h e nela voc e vai reconhecer as fun co es que constru em telefone05.cc, claro com as melhorias que voc e deve ter feito. Aproveite a sua constru ca o: cp telefone05.cc Telefone01.h Antes leia Telefone01.h e fa ca as adapta co es na u ltima vers a que voc e tiver construido no tuturial anterior. Estude a estrutura do arquivo Telefone01.h e fa ca uma leitura r apida do cap tulo 7 que trada de classes. o arquivo Agora vou construir a vers ao nal41 da agenda telef onica. E telefone.cc, leia este arquivo e o compile: g++ -Wall -oprog telefone.cc Passando ` a an alise da constru ca o do programa telefone.cc antes de iniciar o pr oximo projeto. Se lhe parecer que est a tudo claro pule este discuss ao e siga para a pr oxima se ca o. Transformei o programa telefone05.cc em um programa orientado a objeto, quer dizer ele agora usa uma classe. Os passos: Transformei o programa telefone05.cc, considerado satisfat orio, na classe Telefone, arquivada em Telefone01.h. Leia este arquivo e compare com o velho telefone05.cc. Editei o arquivo Telefone01.h para denir a classe Telefone, leia Telefone01.h e compare com Ambiente.h. As antigas fun co es denidas em telefone05.cc agora s ao os m etodos da classe Telefone. Copiei telefone05.cc para telefone.cc e
41 A

vers ao beta 0.5 ...

38

apaguei todas as deni co es de fun co es; deni um exemplo (inst ancia) da classe Telefone, Agenda, leia o coment ario (20). Acrescentei o prexo42 Agenda. em todas as antigas fun co es denidas no antigo programa telefone05.cc porque agora elas s ao heran cas da classe Telefone, herdadas pelo exemplo (inst ancia) desta classe chamado Agenda. Observe que a classe Telefone usa a classe Ambiente n ao sendo mais necess ario declar a-la no programa telefone.cc. Para programar orientado a objeto n ao e preciso primeiro construir um programa tradicional como zemos aqui com a sucess ao de programas telefone*.cc at e chegar a um programa que esteja funcionando. Aqui voc e est a vendo um m etodo que algu em usa e consiste em produzir alguma coisa que funcione para depois dar-lhe um formato nal. Considero muito dif cil um processo diferente deste. Todos os m etodos que construi antes foram fun co es que testei seguidamente para descobrir erros. Somente quando as fun co es estiverem funcionando a contento e que elas viram m etodos inseridos em alguma classe. De agora em diante, quando quiser melhorar o nosso sistema de agenda telef onica, irei fazer pequenas fun co es que executem alguma tarefa espec ca que preciso incluir no sistema, e, quando este processo estiver funcionando a contendo, vou transform a-lo num m etodo da classe Telefone para cham a-lo de dentro do programa telefone.cc. Este novo m etodo tamb em pode ser denido diretamente dentro da classe Telefone e testado em telefone.cc. H a sistemas que podem ajud a-lo a criar programas orientados a objetos, como Kdevelop43 . Eles fazem algumas perguntas b asicas e criam o esqueleto da classe que voc e poder a depois incrementar, e uma outra op c ao.

1.8

Uma classe que herda os m etodos de outra

Vou mostrar-lhe, com um exemplo simples, o poder da orienta c ao a objeto construindo um sistema mais complexo do que o sistema telefone.cc que vai expandir o exemplo mais simples que constru na se ca o anterior. Vou exemplicar heran ca a respeito do que voc e pode ler mais no cap tulo 7. Mas leia rapidinho e volte logo para c a, primeiro aprenda fazendo. um exemplo simples44 , como anunciei, foi acrescentado um u E nico m etodo na classe derivada. Obviamente poderiamos executar com este novo programa todas as opera co es que que telefone.cc executa. Deixo isto como exerc cio.
diz a refer encia. pela sigla IDE e selecione um sistema que opere com C++ 44 O suxo mil indica que e um programa do tipo mil enio, uma vers ao muito melhorada de uma vers ao antiga.
43 Procure 42 Se

39

Plano do trabalho:

Vou criar uma classe derivada da classe Telefone. Leia o arquivo "Agender.h". Leia os comentrios neste arquivo. Vou criar um programa que vai usar a "classe derivada", o programa "telefone_mil.cc". Edite este arquivo para ver como foi construido. Leia os comentrios no programa. Neste novo programa podemos usar os "mtodos" definidos em qualquer classe que a classe me utilize. Neste caso estamos usando os mtodos de Ambiente porque a classe Telefone usa esta classe.

Exerc cios 14 (Tutorial) Entendendo Agender.h 1. Leia Agender.h, procure o coment ario (10) e veja como uma classe e denida como lha de outra classe. ario (10) em Agender.h Solu c ao: coment 2. Quando m etodos tem a classe Agender ? Solu c ao: coment ario (20) Agender.h 3. Qual e o efeito do m etodo procura() ? ario (30) Agender.h Solu c ao: coment 4. Escreva um programa que resolva a seguinte quest ao: Dez carros controlados num ponto pela patrulha da Pol cia Rodovi aria, transportaram 32 pessoas. Se nenhum dos carros transportava mais de 4 pessoas, qual eo n umero m aximo de carros que poderiam estar transportando exatamente 2 pessoas ? Solu c ao: carros.cc

1.9

Vocabul ario e resumo do cap tulo

cin cin.get() cout execut avel fun c~ ao, heran ca, igualdade, lhs, operador 40

extra c~ ao, operador inser c~ ao, planejamento, ponto e v rgula, return(), rhs, tipo de dado, web Vocabul ario 1 (Vocabulario) Vocabulario ao, e um dos objetos de C++ para entrada de cin Entrada de dados padr dados, alguns livros ensinam como pronunciar cin = c-in e a entrada dados padr ao do C++ e isto quer dizer, pelo teclado. Sintaxe: cin para alguma coisa (em geral uma vari avel). ario (45). Exemplo: quarto01 c.cc, procure coment cin.get() Entrada de dados, ver coment ario (46) no programa quarto01 c.cc esta e uma entrada de dados especializada para um tipo de objeto previamente declarado no programa. da de dados padr ao, e um dos objetos de C++ para sa da de cout Sa dados, alguns livros ensinam como pronunciar cout = c-out e a sa da de dados padr ao do C++ e isto signica a tela do computador. Depois voc e vai encontrar outros tipos de dispositivos para sa da de dados, o mais importante stream (corrente) para jogar num disco. Sintaxe cout << alguma coisa em que alguma coisa e um texto, entre aspas, ou uma vari avel cujo conte udo ser a impresso na tela. ario (40). Exemplo: quarto01 c.cc, procure coment caracter execut avel E stica que pode ter um arquivo nos sistemas de ar um atributo que pode ser alterado com o comando quivos de Linux. E chmod. Quando g++ cria um execut avel j a o faz alterando este atributo para o o arquivo seja execut avel. Neste livro sempre uso o nome prog para os arquivos execut aveis criados por g++, mas n ao precisar ser assim, pode ser o nome que lhe parecer melhor. tulo 4 a respeito de fun c oes. As fun c oes s ao os menores fun c ao Leia o cap m odulos execut aveis em C++ (e em C). Diversos programas neste cap tulo s ao evolu c oes de um programa transformando trechos do c odigo em fun c oes que depois s ao chamadas pela fun c ao principal, main(). Na verdade a forma adequada de trabalhar consiste em transformar a fun c ao principal num script que faz o teatro rolar. Num primeiro est agio da produ c ao, ela se transforma no planejamento do trabalho, veja o programa vazio.cc, ele diz que e o planejamento para resolver equa co es do segundo grau. A gura (1.4) p agina 42, uma vers ao antiga de programa em BASIC, uma 41

um programa em BASIC 10 n = 10 20 delta = 0.1 25 inicio = 5 30 k = 1 40 gosub 100 50 end 100 while(k < n) 110 print k*delta + inicio 120 k = k + 1 130 goto 100 140 return

o ponto final do programa...

Figura 1.4:

Um antigo programa em BASIC

linguagem muito comum na d ecada de 70. As linhas eram numeradas, usualmente de 10 em 10 (para a possibilidade de esquecermos alguma coisa, como pode ser visto na linha 25). O que fazia o papel das fun co es eram as sub-rotinas, um trecho do programa com numera c ao alta (aqui de 100 em diante) que seria chamado de algum ponto do programa (aqui na linha 40). As sub-rotinas terminavam com a instru c ao return que for cavam uma volta ao ponto imediatamente posterior ao ponto de sa da. O programa na gura (1.4) termina na linha 50 quando o controle do programa e retornado ao nal da sub-rotina 100. Um programa em BASIC era uma imensa tira de instru c oes com centenas de linhas numeradas e com as instru c oes goto e return para controlar o uxo. isto que faz a fun Hoje n ao e diferente, apenas mais organizado. E c ao main(), ela chama as fun c oes portanto controlando o uxo. Depois que uma fun c ao faz o seu papel, o controle da execu c ao volta para a fun c ao main() para a instru c ao imediatamente posterior ` a chamada da fun c ao. Mas uma fun c ao pode chamar outra ou at e ela mesma... consequentemente um programa mal planejado pode terminar numa bagun ca indescrit vel. N ao h a tecnologia que consiga barrar uma mente desorganizada! organize a sua! heran ca e um dos assuntos importantes da programa c ao orientada a ob42

jeto. O exemplo da nova vers ao melhorada do telefone.cc mostra de maneira bem simples como fazer isto. Imagine agora um sistema muito complexo mas bem testado e funcionando bem. Ele pode rapidamente ser alterado pelo acrescimento de novos m etodos por uma equipe que simplesmente usa a classe que o deniu, sem precisar de ler o c odigo. Basta saber como funciona, e isto pode ser transmitido num texto simples explicando tudo sobre a classe-m a e. A terminologia e esta, a classe primitiva se chama classe-m ae as que se deduzem dela se chamam classes-derivadas e algumas pessoas tamb em chamam de classes-lhas. Esta e a forma avan cada de reciclagem (re-utiliza c ao) que temos para programas. Em programa c ao orientada a objetos n ao escrevemos programas, escrevemos prot otipos de programas, as classes. Os programas s ao os exemplos (inst ancias) de diversas classes agindo coordenadamente sob a dire c ao de uma fun c ao principal main(), que, com frequ encia, e uma tela gr aca com bot oes como a janela do navegador da internet. objetos e seus m etodos Os componentes de um programa se chamam objetos, cada um deles e um exemplo de uma classe ou de uma classe derivada. encapsulamento As antigas fun c oes se chamam objetos. N ao e apenas uma quest ao de ser antigo ou novo, isto seria muito supercial. A id eia e que as fun c oes devem trazer consigo os dados ou o conjunto de m etodos que formam um objeto, devem trazer consigo os dados. Aqui usamos a palavra protegido, n ao no sentido autorit ario de esconder dos usu arios as informa c oes, mas no sentido de que os programadores est ao convencidos de que o processo funciona bem e portanto n ao deve ser alterado. Mexa somente se voc e souber muito bem o que est a fazendo! caso contr ario, use. Ou seja as informa c oes necess arias ao funcionamento de um objeto est ao encapsuladas junto com os m etodos tudo pronto para funcionar. Leia mais sobre oritenta c ao a objeto no cap tulo 7. igualdade Os programas primeiro06.cc e primeiro07.cc d ao um exemplo de como e dif cil se obter igualdades em programas de computador. A sa da consiste em substituir igualdades por desigualdades, veja primeiro07.cc. es left hand string - m ao esquerda, signca o dado ` a lhs - do ingl esquerda em oposi c ao a rhs que e o dado que ca ` a direita. Usado em refer encia a uma igualdade ou dois param etros dados, neste caso o que ca ` a esquerda.

43

operador extra c ao >> conduz uma mensagem para o objeto cin - em outras palavra faz uma entrada de dados. Se UmaVariavel ent ao 4 >> UmaVariavel atribue o valor 4 ` a vari avel UmaVariavel. da de operador inser c ao << conduz uma mensagem para o objeto de sa dados - o padr ao e a tela do computador. Se voc e n ao tiver alterado a sa da de dados, cout << 4 vai imprimir o n umero 4 na tela do computador. planejamento Antes de escrever um programa fa ca o planejamento do que voc e deseja obter com ele. Existe um sistema gr aco que vamos explorar diversas vezes no livro, os fluxogramas que nos ajudam a ver a id eia do que desejamos obter gracamente e mostram o uxo do algoritmo. Vamos ilustrar isto apresentando-lhe as etapas na produ c ao de um programa, na gura (1.5) p agina 44, voc e pode ver o uxo da produ c ao:
Edio do programa Compilao do programa

Incio

Houve sim erro na compilao

no

Houve sim erro na execuo

no fim

Figura 1.5:

Etapas na produ ca o de um programa

e escreve o programa (ou reaproveita um exis edi c ao: Primeiro voc tente). No m nimo copia esqueleto.cc para o arquivo programa.cc45. cp 00esqueleto.cc programa.cc
45 Que

falta de imagina ca o: programa.cc.....

44

compila c ao: Depois voc e compila o programa, g++ -Wall -oprog programa.cc. Nesta etapa foi criado o arquivo execut avel prog e como j a dissemos poderia o nome que voc e quisesse, com o cuidado de n ao sobre-escrever algum nome de programa j a existente. ponto de decis ao: Depois uma decis ao: houve erros, advert encias (warning)? se tiver havido volte para a edi ca o e em geral longa, alguns dias, v arias teste do programa: Esta etapa pessoas testando quebrar o programa. Numa equipe tem um encarregado somente para isto, descobrir quando o programa n ao funciona! Se aparecer algum erro, volte para edi ca o com as informa c oes sobre o erro. Se tudo der certo comece a escrever a vers ao 2.0 do programa! Mas diga que terminou, m. A u ltima observa c ao mostra que nada e denitivo e o uxograma n ao deve incluir esta etapa. Voc e vai logo chegar ` a conclus ao de que algumas etapas s ao t ao obvias que n ao precisam ser descritas, como os dois testes sobre compila ca o e execu ca o. Haver a num programa outros testes mais importantes sendo melhor evitar os mais obvios para que o uxograma possa atingir o seu objetivo: de forma simples ilustrar o uxo do trabalho. rgula. Pode parecer extranho ponto e v rgula O problema do ponto-e-v que um bom compilador n ao encontre o erro elementar que e a falta do ponto-e-v rgula. Mas ele n ao tem como achar isto facilmente, por este s mbolo apenas marca o m de uma senten ca. N ao encontrando esta marca, o compilador segue lendo a pr oxima senten ca at e encontrar um erro de sintaxe provocado pelas opera c oes seguintes que somente teriam sentido se houvesse o terminador da senten ca anterior. Ele n ao pode, mesmo, com facilidade, descobrir a aus encia do ponto-ev rgula, e sim que a pr oximo senten ca est a sintaticamente mal ligada ` a anterior. return() Este parece um dos pontos mais intrigantes da linguagem C++. Porque toda fun c ao deve tem um return(0);. Primeiro que tudo, n ao precisa ser zero, mas se voc e n ao souber o que colocar, coloque return(0); Por enquanto aceite, depois voc e vai ver que isto e deveras importante. O sistema operacional guarda este valor na vari avel ?. Depois de rodar um programa, logo depois mesmo, execute echo $? e voc e vai ver o valor que foi devolvido. Experimente num programa um n umero esquisito46 , return(10131, por exemplo, para n ao ter d uvida! Ent ao voc e j a pode imaginar aqui uma raz ao, podemos deixar dentro do programa vari aveis para pegar erros inesperados e o respons avel pelos testes dos programa pode fazer uso disto. Esta e uma raz ao!
46 Porque

zero n ao tem nada de esquisito, pensa o autor!

45

rhs - do ingl es riht hand - m ao direita, signca o dado ` a direita em oposi c ao a lhs que e o dado que ca ` a esquerda. Usado em refer encia a uma igualdade ou dois param etros dados, neste caso o que ca ` a direita. tipo de dado os n umeros, os inteiros por exemplo, ou melhor as vari aveis do tipo int se assemelham ao quociente pelo n umero por 2147483648. Este e o maior inteiro que C ++ reconhece. Veja o cap tulo 5 a este respeito. web A solu c ao do exercicio 1.4, p agina 42, que se encontra no arquivo carros.cc, oferece alguns aspectos interessantes que valem ser ressaltados. Primeiro ele e uma mistura de c alculo matem atico com c odigo de computa c ao, e representa e um exemplo de uma tentativa que vem sendo trabalhada desde 1970 por um grupo de Matem aticos que se encontram ` a volta de Knuth e que aos poucos foi se consubstanciando como um m etodo que se se chama web envolvendo TEX, que e uma linguagem de programa c ao para produzir textos47 , e diversas linguagens de programa c ao. A web deve ser capaz de retirar os coment arios dos programas para criar um texto e portanto, em princ pio devemos conseguir, num futuro, resolver problemas computacionalmente e, como subproduto, ter um texto te orico sobre a solu c ao do problema. Podemos com uma linguagem de programa c ao produzir programas de outra linguagem. A primeira id eia consiste de traduzir os programas de uma linguagem para outra. Melhor do que isto, podemos escrever textos tendo programas de computador imersos no mesmo. Para isto e preciso que o editor de textos seja especial e que o pr oprio A texto seja uma linguagem de programa c ao. L TEX e isto, uma linguagem de programa c ao que transforma textos num livro, como este que voc e est a lendo. o que faz a web, ela consegue extrair dos textos, os programas e execut E alos incorporando ao texto o resultado do programa. carros.cc representa um pouco disto, ele resolve um problema e guarda uma forma nos coment arios a forma te orica da resolu c ao Matem atica. E muito emp rica de simular a web de Knuth...

47 este

texto est a escrito usando esta linguagem

46

Cap tulo 2

M aquina de calcular
Este cap tulo e um cap tulo de refer encia, como eu j a disse na introdu ca o, e deve ser estudado numa segunda leitura do livro. Ao longo do primeiro cap tulo ele e citado diversas e voc e j a deve t e-lo lido, supercialmente, e retornado para consultas mais aprofundadas. Vou aqui desenvolver o assunto opera c oes, como e que se calcula em C++. Na pen ultima se ca o desenvolvo um projeto coerente com o objetivo do cap tulo, uma calculadora, que usa as informa co es adquiridas no primeiro cap tulo, deixe esta se ca o para uma segunda leitura.

O cap tulo est a organizado assim: 1. operadores aritm eticos; 2. operadores l ogicos; 3. listas de exerc cios (tutoriais); 4. uma tabela de operadores. Voc e dever a visitar a u ltima se ca o deste cap tulo, com freq u encia, uma vez que ela lhe mostra os operadores com uma r apida resenha de sua sintaxe (o que o vocabul inclue a preced encia) e uso. E ario do cap tulo. Os programas citados no texto s ao apenas exemplos de uso dos operadores. Ao nal do cap tulo voc e pode encontrar exerc cios de verdade. Falamos de operadores na linguagem C++ de modo semelhante como se diz em Matem atica, opera ca o. Sem d uvida estamos diante de uma ambig uidade lingu stica. Conversemos um pouco sobre esta quest ao1 (ou salte esta discuss ao se voc e a considerar irrelevante). ca o de Em Matem atica escrevemos a + b e dizemos que foi feita a opera adi ca o entre os n umeros a, b. Voc e executou uma opera ca o matem atica.
1O

livro e seu, n ao permita que o autor o aborre ca.

47

Em Computa ca o dizemos que o operador + se aplica aos n umeros 3, 4 +(3, 4) 3 + 4; (2.1) e escrevemos apenas 3 + 4. Em programa ca o voc e aplicou um operador a dois dados de um tipo que e compat vel com este operador, (se n ao forem compat veis uma mensagem de erro vai ser gerada dizendo isto). Quando voc e executar, num programa, x = 3 + 4; (2.2)

n ao e uma express ao matem atica2 que estar a sendo executada e sim um comando composto. Relembremos as fases ou partes deste comando: primeiro o operador + e aplicado a dois dados do tipo int: 3 , 4 depois o resultado desta opera ca o e colocado na mem oria associada com a vari avel x substituindo o valor que l a estiver guardado. A ordem como as opera co es foram feitas foi da direita para esquerda, que e o padr ao de como as linguagem de programa ca o l em os comandos compostos. H a tr es grandes tipos de operadores nas linguagens de programa ca o, como C++, s ao os operadores aritm eticos e os operadores l ogicos e os operadores de acesso que s ao tipicos da estrutura de dados dos quais falaremos rapidamente neste cap tulo mas que ser ao tratados novamente no cap tulo 5 e no cap tulo 7. Com os operadores aritm eticos fazemos as contas habituais da aritm etica com certas restri co es no ambiente computacional porque os n umeros, para C++ s ao um subconjunto nito de todos os n umeros. A forma mais adequada de dizer e os n umeros s ao tipos de dados ou mais atual, s ao objetos de uma certa classe. Os operadores l ogicos produzem dois tipos de resultado: falso ou verdadeiro. Em C++ o falso e o zero e qualquer n umero diferente de zero e verdadeiro, mesmo assim C++ admite um tipo de dado chamado bool - booleano3 , com dois valores false, true que mascaram o zero e o diferente de zero que podem continuar sendo usados. Sem d uvida nenhuma o uso de false, true torna os programas mais leg veis. Voltando a usar o exemplo x = 3 + 4 Previamente a vari avel x deve ter sido denida. etico + est a sendo aplicado Operador aritm etico. Depois o operador aritm ao par de par ametros (3,4), 3 + 4, porque as senten cas, em C++, s ao executadas da direita para esquerda. Isto faz parte da hierarquia, ou prioridade das opera co es . Descreveremos esta quest ao mais abaixo.
2 N ao e uma equa ca o matem atica e sim um comando formado por duas opera co es de programa ca o, um comando composto. 3 Vem do nome de Georges Boole que descobriu a aritm etica de zeros e uns

48

Operador atribui ca o. Em seguida foi executada uma opera ca o interna de registro de dados, guardando na vari avel x o valor calculado anteriormente. uma opera E ca o chamada, atribui c~ ao. Agora o n umero do tipo int, 7, est a guardado em um endere co de mem oria que pode ser acessado com a vari avel x (que e chamamado o primeiro n vel de abstra ca o das linguagens de programa ca o), o uso de vari aveis. Al em disto, como j a observei, n ao e com n umeros que voc e est a trabalhando numa linguagem de programa ca o, mas com um tipo de dados que tem o nome de int, neste exemplo. Hierarquia Como podemos executar diversas opera co es num comando, existe uma hierarquia entre os operadores que dene a prioridade em que as opera co es devem ser efetuadas, da direita para a esquerda e de dentro para fora, quando houver fun co es compostas, como em Matem atica. A tabela da hierarquia pode ser vista na Tabela 2, p agina 49, que e Decrescente descendo (crescente subindo), Decrescente para direita (crescente para esquerda). ( ) ++ * + =

-/ +=

% -= /= *= %=

Tabela 2.1: Hierarquia das opera co es aritm eticas a deni ca o de uma hierarquia simplica as express oes alg ebricas, porque, sem esta hierarquiza c ao ser amos obrigados a denir as prioridades com uso de parenteses. Esta hierarquia e hist orica e remonta, possivelmente, ao S eculo XIX, dos textos da aritm etica. Infelizmente n ao pude encontrar uma refer encia sobre este assunto4 . Observa c ao 2 Falar correto ou ser pedante Quer dizer que falamos corretamente acima ao dizer que o operador + se aplicava aos n umeros 3,4. Mas a frase aplicamos o operador + aos membros do tipo de dado int 3,4 melhor errar e terrivelmente pedante para estarmos usando com frequ encia. E um pouco do que falar de forma insuport avel. Temos que ter um certo equil brio entre a obriga c ao de nos expressarmos com precis ao e encontrar uma forma pedag ogica para introduzir o leitor aos conceitos da programa c ao.
4 Se

encontrar alguma refer encia, envie para o autor.

49

N ao queremos com isto que o leitor seja indulgente conosco em sua cr tica e estamos aberto a melhorias no texto. As sugest oes ser ao sempre benvindas. Em Linux, ou nos sistemas do tipo Unix, h a um sistema de ajuda descrito no cap tulo 11, info. S ao manuais muito bem feitos e escritos com uma linguagem t ecnica o que os torna de dif cil leitura, compare o nosso texto com os textos produzido pelo programa info, experimente info gcc gcc signica Gnu C Compiler e o nome do compilador produzido pela funda c ao Free Software Foundation. info e um sistema de manuais que foi inaugurado pela funda c ao gnu em substitui c ao ao man, de manual, que e tradicionalmente usado pelos sistemas Unix. Em Linux voc e encontra os dois sistemas funcionando. Experimente man gcc Os programas-exemplos t em o objetivo de ser tutoriais mostrando o uso dos operadores e muitos deles tem o nome do pr oprio operador de modo que se voc e quiser ir direto a um exemplo de programa sobre um operador, procure o nome do operador entre os programas, por exemplo ls adicao*.* vai lhe mostrar uma listagem de programas envolvendo a adi ca o. Observe que em Linux voc e tamb em pode executar dir adicao*.* para obter a lista dos arquivos. Em mais de um local deste livro voc e vai encontrar a observa ca o de que executando grep chave *.cc | more voc e poder a ver uma listagem das palavras chave que se encontram nos arquivos o que lhe permitir a tamb em fazer uma busca acerca de assuntos que voc e deseje. Inclusive se voc e executar grep chave *.cc | more > chaves o resultao do grep5 car a guardado no arquivo chaves que voc e poder a imprimir ou visulizar com um editor de textos.

2.1

Operadores aritm eticos em C

A linguagem C++ se originou da antiga linguagem C e herdou a sintaxe daquela linguagem. O uso dos operadores aritm eticos e l ogicos e muito parecido nas duas linguagens. C++ tem semelhan cas muito grandes com Java, tamb em. As hist orias de C++ e de Java t em muito em comum: a linguagem C. As duas foram foram feitas pensando num C melhorado.
5 observe que este comando e destrutivo no sentido de que ele ir a substituir o arquivo chaves com o resultado do grep

50

Os operadores aritm eticos em C, C++ ou Java, s ao praticamente os mesmos, em geral se diz que estas linguagens seguem a sintaxe do C. Vou apresentar-lhe a linguagem calc, [2], que e uma linguagem interpretada em que voc e pode fazer experi encias r apidas para testar trechos de programas muito parecidos com programas em C. Por exemplo, voc e poder a experimentar os operadores usando calc. preciso dizer-lhe a semelhan E ca com C que me interessa em calc e tamb em semelhante ao C++, n ao estou procurando incentivar o seu interesse pela linguagem C. Os exemplos que estou dando devem convenc e-l@ de que vale a pena usar calc. Ali as, hoje, dicilmente, voc e poder a programar em apenas uma linguagem, porque sempre vai encontrar algo interessante que outra linguagem oferece e que n ao tem sentido sofrer para obter tudo com uma u nica linguagem. Voc e j a viu v arios exemplos nos programas feitos no cap tulo 1 em que estou usando pequenos programas, em C, dentro dos programas escritos em C++, ou fazendo uso de programas do sistema operacional, editores de texto, dentro dos programas em C++. Uma forma de programar bem natural consiste de chamar um programa externo de dentro de um programa escrito em C++ ou chamar um programa escrito em C++ a partir de outro programa. Assim, usar outra linguagem de programa ca o, junto com C++, e um complemento que ningu em deve desprezar. H a duas situa co es muito comuns escrever um programa noutra linguagem e o chamar de dentro de um programa em C++; o reverso, escrever um programa numa outra linguagem que chame um programa escrito em C++. Um exemplo t pico desta segunda a ca o pode ser a cria ca o de um um painel de controle gr aco para os programas em muito mais simples executar esta tarefa com algumas linguagens C++. E gr acas do que fazer isto diretamente com C++ e neste ponto eu sugiro as seguintes possibilidades, TCL, Qt 4, GDK quando voc e terminar de estudar este livro. Agora deixe-me apresentar-lhe rapidamente calc.

2.1.1

Um C++ interpretado: calc

Embora correndo o risco de voc e, leitor, que zangado porque eu o esteja induzindo em perda de tempo (o que voc e pode facilmente evitar, passando algumas p agina ` a frente), n ao consigo me refrear ante a possibilidade de apresentarlhe calc onde aprendi muito sobre a linguagem de programa ca o C++. Em LinuX voc e pode encontrar uma linguagem de computa ca o, calc, que se assemelha muito ao C++ com a diferen ca de que e uma linguagem interpretada. Isto signica que em calc voc e digita 3 + 4 <enter> 51

7 vendo logo o resultado da opera ca o. Em C++, para ver isto acontecer, e preciso escrever um pequeno programa, compilar6 o programa e depois execut a-lo. N ao e justo diminuir calc chamando-o de um um C++ interpretado. Trata-se de uma linguagem de programa ca o muito parecida com C++ e que e interpretada. Voc e pode aprender muito sobre a linguagem C++ experimentando com calc. E com freq u encia fa co alguns testes usando calc antes de escrever um programa em C++. Uma pequena sess ao usando calc: tarcisio@cap02: calc C-style arbitrary precision calculator (version 2.11.10.1) Calc is open software. For license details type: help copyright [Type "exit" to exit, or "help" for help.] ; 3 + 4 7 ; i = 0 ; while(i < 10){ ;; print 3*i + 5; ;; i++; ;; } 5 8 11 14 17 20 23 26 29 32 Observe que voc e pode colocar este c alculos sob controle de uma fun ca o, como em C++. Olhe os passos para fazer isto: ============= inicio da definicao da funcao ; define laco() { ;; local i=0; ;; while(i < 10){ ;; print 3*i + 5, ; ;; i++; ;; } ;; } =================

6 Esta frase sugere que as linguagens compiladas s ao mais ag eis, o que n ao e verdade. Anal, a melhor forma de trabalhar com linguagens interpretadas e tamb em editando os programas para depois rod a-los com o interpretador. O mesmo c clo de produ ca o!

52

============ fim ========================================= laco() defined ### calc informa que reconheceu a funcao ; laco() ### executando a funcao em calc 5 ,8 ,11 ,14 ,17 ,20 ,23 ,26 ,29 ,32 ,; Este programa se encontra no disco sob o nome exemplo.calc, se for procurar ls *.calc vai encontrar outros exemplos de programas escritos em calc no disco. A v rgula, dentro do comando print, tem o efeito de evitar mudan cas de linha. Ao denir laco() substitu a troca de linhas por uma v rgula e cou um pequeno defeito: aparecendo um ponto-e-v rgula depois do u ltimo termo da progress ao aritm etica. Fica como desao, para voc e, eliminar este defeito... Podemos denir fun c oes, em calc ent ao a forma de programar nesta linguagem e semelhante ` a que eu uso com C++, crio as diversas fun co es que preciso, deno a fun ca o main() que chama as outras. Em calc n ao h a o conceito de fun ca o principal, eu, o programador, e que invento este conceito para fazer programas em calc semelhantes aos programas em C++. Desta forma e f acil traduzir os programas duma linguagem para a outra. Aprenda a usar calc para experimentar trechos de c odigo antes de escrever todo o programa. Infelizmente calc n ao entende C++, mas entende bem uma estrutura, struct, que e a ponte construir os objetos de C++. Com struct se pode construir quase-objetos em calc. Neste cap tulo estou estudando a parte de C++ que e comum com C e a v arias outras linguagens de programa ca o. N ao se esque ca de que C++ e uma expans ao da linguagem C. Ou ainda, que C e a parte7 velha de C++.

2.1.2

A adi c ao

O operador + simula a adi ca o de n umeros como far amos em Matem atica. Digo simula porque n ao e uma opera ca o matem atica e sim uma opera ca o efetuada sobre um tipo de dados. Um exemplo usando calc: ; x = "234134" ; y = "4565456" ; x + y "2341344565456" Que aconteceu acima? A palavra chave e overload, sobrecarga. No cap tulo 7 vou discutir este efeito sob o nome de polimorsmo. A sobrecarga e muito comum em C++ e signica que um operador ou m etodo assume8 diversos tipos de deni ca o.
Que riscos em que este autor est a incorrendo! comportamento e comum nas linguagens humanas em que um fonema tem diversos sentidos que os humanos detectam pelo contexto.
8 Este 7 Eras!

53

Aqui o operador + foi sobrecarregado. Ele percebe que o tipo de dado que lhe foi passado n ao e um inteiro e sim uma string, um vetor de caracteres, e altera o seu comportamento, quer dizer, assume uma nova deni ca o: virou o operador concatena c ao. Para conseguir o mesmo com C++ experimente o programa string01.cc. Exerc cios 15 (Tutorial) Concatena c ao de strings em C++ 1. Leia o programa string01.cc.Depois compile e rode o programa. 2. Fa ca altera c oes em string01.cc para compreender o uso da macro escreve(), por exemplo, retire << endl na deni c ao da macro escreve(). 3. O programa string02.cc tem um erro que est a documentado dentro do programa. O erro serve para voc e entender o m etodo de avalia c ao das express oes em C++. 4. Altere string02.cc para corrigir a sa da de dados e compreender como C++ avalia express oes. Se inspire em string01.cc. Para executar um exemplo semelhante ` a concatena ca o feita com calc tive que recorrer ` a classe string que altera o comportamento do operador adi c ao para que ele aceite texto como par ametro legal. Vou voltar ` a concatena ca o de textos no cap tulo 6, mas voc e pode, se tiver curiosidade, adiantar esta leitura. Eu uso uma forma expositiva que come ca por mostrar erros ou processos ilegais. Este m etodo abre os horizontes, apesar de dar um aspecto um pouco dispersivo ` a exposi ca o. Neste momento tenho um objetivo pedag ogico especial que e o de separar uso que o s mbolo + tem em computa ca o do seu s osia em Matem atica9 . Leia mais a este respeito no cap tulo 5: em computa ca o o operador se aplica a certos tipos de dados. Em calc ele se aplica tamb em aos vetores de caracteres e assim como aos tipos de dados num ericos. Retomando a descri ca o da adi ca o + um operador denido com os tipos de dados num ericos int, float e suas varia co es. Leia, compile e rode o programa adicao01.cc para que voc e possa compreender o que vou dizer. Se voc e tiver rodado o programa viu o que ele somou dois n umeros de tipo diferente. C++ faz uma adapta ca o10de dados, aqui, para um dado de tamanho maior. Rode o programa tamanho.cc que exemplica o tamanho de alguns tipos de dados. N ao leia este programa agora ou se o ler, n ao se assuste, ele usa material que aparecer a no cap tulo 5. Este programa vai lhe mostrar o tamanho que alguns tipos de dados ocupam na mem oria. Esta discuss ao vai voltar ser feita na cap tulo 5.
9 Ou 10 isto

at e em outras linguagens de computa ca o! se chama convers ao de dados - em ingl es - type casting

54

A linguagem C n ao e t ao inteligente como C++ e reagiria a esta mistura de tipos de dados que C++ aceita tranq uilamente. De fato C++ e uma evolu ca o de C, ou uma extens ao como se prefere dizer porque cont em C . H a v arias linguagens de programa ca o que fazem esta convers ao de dados automaticamente, sempre transformando para o tipo de dados mais amplo. A opera ca o convers ao de tipos de dados, em ingl es recebe o nome de cast, como se encontra indicado dentro de adicao01.cc. Leia mais a este respeito no cap tulo 5. A pr oxima lista de exerc cios e um tutorial sobre o tipo de dados int que e um dos dom nios do operador +. Exerc cios 16 (Tutorial) A adi c ao de inteiros 1. Rode o programa adicao02.cc e siga suas instru c oes. 2. Rode o programa logica01.cc. Leia o programa tamb em. 3. Altere o programa adicao02.cc para que ele fa ca uma tabuada eletr onica: o usu ario fornece dois n umeros inteiros e o programa calcula a soma. N ao se esque ca de advertir o usu ario quando ele tentar sair do limite [2.147.483.648, 2147483647] em que est ao connados os dados do tipo int. Solu c ao: adicao03.cc 4. Em adicao03.cc foi feito um c alculo l ogico. Leia a observa c ao (60) que o explica. Rode e leia o programa logica01.cc e volte a ler o programa adicao03.cc se achar que e necess ario. Nos exerc cios que voc e acaba de fazer, voc e viu que a adi c ao em uma linguagem de programa ca o tem limita co es que a Matem atica n ao tem. E h a diferen cas nas implementa co es feitas do compilador C++. Na pr atica, o limite de 231 em LinuX ou 215 nos compiladores que rodam sobre DOS n ao e um problema. Raramente precisamos de somar n umeros inteiros que ultrapassem o limite 215 . Em aplica co es de criptograa este limite e facilmente ultrapassado, mas neste caso as ferramentas ser ao outras, feitas em C++, mas com t ecnicas apropriadas para permitir o trabalho com n umeros muito maiores do que estes. calc e um exemplo destas ferramentas. Experimente para concluir que calc e ilimitado quanto ao uso de inteiros. Experimente fact(145), fact(1450), fact(14500) em calc que j a traz denida a fun ca o fatorial. limitado pela capacidade de mem Limitado na verdade e! E oria da m aquina. Sempre tem que haver alguma cota superior ou inferior quando ca mos nas aplica co es. Somente a Matem atica paira livre acima dos limitantes f sicos. Claro, tamb em o c erebro humano n ao tem estas limita co es, mas foi o c erebro humano que criou a Matem atica sempre expandindo as cotas que outras gera co es vinham estabelecendo.

55

2.1.3

O produto

As observa co es que z sobre o operador + valem verbatim para o operador * que tamb em n ao e uma opera ca o matem atica, mas sim um operador sobre tipos de dados da linguagem C++. Vou fazer experi encias semelhantes ` as que z com + agora com *. O programa produto01.cc mostra que C++ transforma os tipos de dados na multiplica ca o como fez na adi ca o. Rode e leia este programa. Exerc cios 17 (Tutorial) Experi encias com produto 1. Leia, compile e rode produto01.cc. 2. Escreva um programa que calcule um carro c ao11 usando as quatro opera c oes. Solu c ao: produto02.cc 3. O programa produto02.cc est a errado. Leia os coment arios no programa. As regras de preced encia n ao foram obedecidas, o programa est a errado, corrija-o. 4. As mensagens de produto02.cc est ao mal formadas, h a erros de graa inclusive. O programador as vezes somente v e estes erros depois de executar o programa, e algumas vezes nem assim ele consegue ver todos os preciso que outro programador verique o programa: trabalho de erros. E equipe. Melhore o programa. Solu c ao: produto03.cc 5. Leia e rode o programa produto03.cc. Ele dene as regras de preced encia nas express oes aritm eticas. . Rode diversas vezes o programa at e que que claro como que e que funcionam as regras de preced encia. 6. Rode produto03.cc alterando os valores dos par ametros para se certicar de que o compilador aplica corretamente as regras de preced encia nas opera c oes aritm eticas. 7. Escreva um programa que descreva a preced encia das opera c oes aritm eticas incluindo a pot encia. Em C++ a fun c ao pot encia e pow(a,b) = ab , mas em C++ os par ametros tem que ser do tipo double que s ao os n umeros com ponto utuante de dupla precis ao. Substitua int por double ao reaproveitar o programa produto03.cc Solu c ao: produto04.cc 8. O programa produto04.cc est a errado, o compilador diz que n ao reconhece a fun c ao pow() que est a denida na bilioteca math.h. Corrija isto Solu c ao: produto041.cc
11 carro c ao e uma express ao aritm etica contendo as quatro opera co es, quanto mais conta tiver, tanto mais importante e o carro c ao. Ele deve ser calculado manualmente...

56

9. Altere os dados no programa produto041.cc para calcular o valor de outros carro co es de sua escolha. Escreva uma vers ao simplicada do programa, eliminando a explica c ao te orica, para obter o resultado de forma mais direta. Solu c ao: produto05.cc 10. Leia o programa produto05.cc e sobretudo o coment ario (30). Experimente fazer o que coment ario diz que voc e n ao deve fazer e compile e rode o programa. Volte a ler novamente o programa e coment ario e devolva o programa ` a situa c ao original. Observe que voc e n ao precisa apagar a linha, basta torn a-la um coment ario. Nesta se ca o vimos, nos exerc cios, a aplica ca o da regra de preced encia das opera co es aritm eticas.

2.1.4

A subtra c ao em C++

N ao h a nada de novo que se possa dizer sobre a subtra c~ ao al em do que j a foi dito sobre os operadores adi c~ ao e produto. Como nestes outros casos, o operador subtra c~ ao se aplica sobre um tipo de dados da linguagem C++. mister, entretanto, comentar uma arma E ca o, de certos programas12 , que a subtra ca o n ao existe. A verdade n ao e esta, o que acontece e que a subtra ca o n ao tem as mesmas propriedades da adi ca o, como a associatividade o que a tornam uma opera ca o defeituosa. Por outro lado podemos ver a b = a + (b) ou seja a soma de a com o inverso de b o que torna desnecess aria a subtra ca o com sua aus encia de propriedades. Ela e uma opera ca o culturalmente importante para n os, precisamos com freq u encia falar da diferen ca entre dois n umeros ent ao temos que conviver com a subtra ca o. A lista de exerc cios seguinte vai conduz -lo a aumentar sua experi encia com os operadores aritm eticos. Exerc cios 18 (Tutorial) A subtra c ao 1. Rode e depois leia subtracao01.cc. 2. Altere subtracao01.cc para fazer algumas somas sucessivas partindo de um n umero negativo muito grande em m odulo de modo que programa pare quando surgir um n umero positivo. Solu c ao: subtracao02.cc 3. O programa subtracao021.cc termina secamente depois de executar um la co, torne-o mais educado fazendo que ele termine com uma pequena conversa com o usu ario. Solu c ao: subtracao03.cc
atento, os programadores gostam de estabelecer uma dupla vis ao, o que os programas dizem, e o que eles dizem! N ao se deixe confundir!
12 Fique

57

2.1.5

A divis ao de C++ e inteira

Aqui tem alguma novidade, na divis ao. A divis ao, em C++ e o que se chama de divis ao inteira. H a v arias linguagens de programa ca o que s ao implementadas com divis ao inteira. P, D int P/D int; (2.3)

e P/D o quociente na divis ao de P por D. Exerc cios 19 (Tutorial) Sobre a divis ao 1. Rode e depois leia o programa divisao01.cc. 2. O operador % calcula o resto da divis ao, leia o programa divisao02.cc, rode, e depois leia este programa. 3. O algoritmo da divis ao euclidiana se apresenta assim: P = D*Q + R ;

Q = P/D ; R = P%D ; leia o programa divisao03.cc, rode, e depois releia o programa. 4. Se, entretanto, os n umeros P, D n ao forem inteiros, (forem reais), g++ calcular a o n umero racional P/D. O programa divisao04.cc exemplica esta quest ao, rode, e depois leia o programa. Voc e deve ter lido a observa ca o ao nal de divisao04.cc. Quando g++ entra em cena, quando voc e o chama, ele prepara uma regi ao de mem oria com dados que foram lidos em bibliotecas. Alguns dados s ao padr ao e n ao precisam ser lidos de nenhuma biblioteca exterior, mas s ao lidos de uma biblioteca natural associada a linguagem e que foi compilada junto quando g++ foi instalado. Assim ele sabe qual e o maior o e menor13 inteiro. Leia os coment arios iniciais do 14 programa real01.cc. Os n umeros racionais, os chamados float, formam uma progress ao aritm etica, consultando o ndice remissivo voc e vai encontrar a tabela que descreve os n umeros racionais: float. Existe um menor n umero racional15 positivo: = 1.2 1037 outro qualquer e um termo de uma p.a.16 usando este como raz ao.
n ao! int, o tipo de dados. os coment arios iniciais se encontra o m etodo de compila ca o, se voc e n ao o levar a s erio haver a erro. Leia direito. 15 Em computa ca o isto e verdade, mas depende do tipo, consulte a tabela 16 Desaconselhamos que voc e fa ca um programa para listar os termos desta progress ao aritm etica! Pode ser muito demorado!
14 Entre 13 Inteiro,

58

2.1.6

Os atalhos ++...

Em C++ existem alguns atalhos para algumas opera co es. A lista destes atalhos se encontra na tabela abaixo com o signicado deles aplicados ` as vari aveis a,b atalho expans ao descri ca o a++ a = a + 1; p os incremento ++a a = a + 1; pr e incremento a-a = a - 1; p os incremento --a a = a - 1; pr e incremento a+=b a = a + b; incremento de b a-=b a = a - b; decremento de b a*=b a = a*b; multiplica ca o por b a/=b a = a/b; divis ao por b a%=b a = a%b; resto na divis ao por b ; a,b e int a>>=b a = a>>b; deslocamento (shift) ` a direita de b a<<=b a = a<<b; deslocamento (shift) ` a esquerda de b Tem uma diferen ca sutil entre ++a; e a++; que vamos explorar no pr oximo tutorial. Exerc cios 20 (Tutorial n++ e ++n) Sobre atalho p os e pr e 1. Leia e rode o programa atalho01.cc. 2. O compilador reclama, warning (aviso). Se voc e prestou aten c ao, o programa parece est upido. De fato e! Mas se encontra dentro dos nossos objetivos17 . Ignore os avisos do compilador, mas ele tem raz ao dizendo que o valor das vari aveis e incerto. Neste programa voc e pode ignorar esta advert encia tranquilamente. 3. o p os incremento n++ Analise o que aconteceu no primeiro bloco de atalho01.cc com n++. 4. Como o programa parou voc e ter a tempo para analisar a listagem e ver que o que vai acontecer no segundo bloco (leia o programa)
O valor da vari avel m e << m << agora ++m e << ++m<<endl;

e um u nico18 comando. 5. o p os incremento n++ Num comando composto e preciso compreender qual e a parte mais interna do comando, qual vai ser executada primeiro. As linguagens de programa c ao avaliam da direita para esquerda, ent ao m++ ao ser avaliado ainda tem o seu valor primitivo mas m j a tem o valor incrementado. Analise a listagem para ver que de fato isto ocorreu. e enter para continuar a listagem do programa. 6. o pr e incremento ++m. D Voc e agora tem
17 Eras! 18 Mas

A estupidez e um objetivo neste livro! e um comando composto.

59

O valor da vari avel m e << m << agora ++m e << ++m << endl;

o primeiro a ser executado sendo ++m e escrito o valor incrementado da vari avel m e depois repetido quando se manda imprimir m. Dois valores iguais saem na listagem. 7. Altere o programa atalho01.cc quebrando cada um dos comandos em dois. No primeiro while() um para imprimir n e outro para imprimir n++. Fa ca o mesmo com o segundo while(). Compile e rode para ver o que acontece. Solu c ao: atalho02.cc. 8. Transforme os blocos do programa atalho02.cc em fun c oes, n ao se esque ca de passar as vari aveis para as fun c oes criadas, se voc e esquecer o programa vai car errado e voc e vai se dar contas, nunca tema os erros. 9. Leia o programa atalho02.cc, e aparentemente id entico a atalho01.cc, em dois comandos o que era um u nico. Portanto quando apenas divid imprimir n++ o valor ainda ser a o mesmo de n do comando anterior, porque o incremento s o ir a ocorrer depois que o valor for impresso. 10. Rode e leia novamente atalho02.cc para que que claro o que aconteceu. No segundo while() quando imprimir ++m primeiro incrementa (pr eincremento) e depois imprime, deixando o valor maior do que o de m no comando anterior. 11. Rode e leia atalho03.cc que d a outro exemplo do uso de pr e e p os incremento. Leia os coment arios no programa (ao nal). Conclus ao: se poss vel, evite de usar atalhos, se usar coloque coment arios praticamente imposs indicando o que est a acontecendo. E vel evitar de usar atalhos, eles s ao elegantes e nos economisam a digita ca o, e s ao mais r apidos que suas expans oes em mais de um comando. Mas em alguns casos e essencial deixar coment arios. H a dois atalhos, em C++ para substituir n = n + 1. Na tabela acima eles s ao descritos como p os incremento ou pr e incremento. Esta diferen ca e explicada pelos programas atalho*.cc. O p os incremento, n++, primeiro executa a tarefa sobre a vari avel, depois o que o programa atalho01.cc ilustra no primeiro while(). a incrementa. E O pr e incremento, ++m, primeiro incrementa para depois executar a tarefa o que o segundo while() de atalho01.cc ilustra sobre a vari avel, (imprimir). E e que vou detalhar com algumas observa co es: C++, como a maioria das linguagens de programa ca o, avaliam as express oes de dentro para fora. A parte avaliada inicialmente e a mais interna, e voc e precisa aprender a avaliar o que e mais interno e mais externo; a parte mais interna desta express ao se encontra no nal, e n++. No in cio da execu ca o do la co, n vale zero. Como n++ e p os incremento, a vari avel e 60

incrementada, depois de usada, e conseq uentemente, quando for impressa novamente, j a estar a com valor maior de uma unidade. E est a e a raz ao pela qual qual o valor vari avel agora e 1. na segunda parte do programa estou usando ++m, o pr e incremento. Quer dizer, primeiro a vari avel e incrementada, depois se efetuam as opera co es sobre ela. Novamente, e preciso vericar qual e a parte mais interna da opera ca o "O valor da vari avel m e < m << "agora ++m e < ++m; que, como no caso anterior, se encontra no nal da linha: ++m ent ao, o programa come ca por efetuar o incremento de uma unidade na vari avel m produzindo, na primeira rodada do la co O valor da vari avel m e 1, agora ++m e 1 que novamente parece absurdo, porque deveria ser zero. Observe que com os atalhos os programas cam mais curtos; tamb em, com os atalhos, os programas cam mais dif ceis de serem compreendidos, compare em atalho03.cc os dois la cos equivalentes; hoje, com a grande expans ao de mem oria dos computadores, perderam em import ancia os programas curtos e ileg veis e mais importante escrever programas compreens veis, com mais vari aveis, com mais linhas de c odigo. Eu j a lhe disse que e dif cil deixar de usar um atalho que torna um programa mais bonito e mais eciente19 , resta uma alternativa, escrever coment arios que indiquem o que est a sendo feito. Os coment arios desaparecem do programa quando o compilador cria o execut avel portanto eles n ao tornam o programa mais longo, a n ao ser a vers ao texto guardado em disco, e e esta que voc e vai ler. H a pouco o que acrescentar sobre os atalhos m--, --m, os decrementos. Exerc cios 21 (Tutorial) Sobre atalho para decrementar 1. Altere os programas atalho01.cc . . . atalho03.cc para exemplicar p os e pr e decremento m--, --m. 2. Escreva um programa que apresente os termos de uma p.a. de raz ao 3 cujo primeiro termo seja 5. Solu c ao errada: sucessao11.cc 3. Ao compilar o programa sucessao11.cc o gcc lhe faz uma advert encia: sucessao11.cc:22: warning: operation on i may be undefined procure descobrir porque esta advert encia (que tamb em aparece quando voc e compilou atalho01.cc). Solu c ao ainda errada: sucessao111.cc
19 Mais

eciente porque com u nico comando faz o efeito de dois.

61

4. Leia os coment ario ao nal de sucessao111.cc e siga as intru c oes do coment ario (10), voltando a compilar e rodar o programa. 5. O erro nos programas Os programas sucessao111.cc ou sucessao11.cc escrevem a sucess ao com ndice errado, corrija isto. 6. O erro nos programas Os programas sucessao111.cc ou sucessao11.cc tem comandos depois do comando return(). S ao comandos in uteis. Solu c ao ainda errada! sucessao112.cc 7. Escreva um programa que apresente os termos de uma p.a. de raz ao 3 cujo primeiro termo seja 5 mas que tenha 11 termos. Solu c ao: sucessao12.cc 8. Escreva um programa que apresente os termos de uma p.g. de raz ao 3 cujo primeiro termo seja 5 mas que tenha 11 termos. Solu c ao: sucessao13.cc ca a compara c ao entre 9. Progress ao geom etrica Escreva um programa que fa 100 reais colocados na caderneta de poupan ca no dia 01 de Janeiro de 2006 e 100 reais tomados ao cheque especial durante o ano. Considere que a caderneta de poupan ca pague %0.5 de juros enquanto que o cheque especial cobre %6.5 de juros. Solu c ao: poupanca01.cc 10. O programa poupanca01.cc usa uma forma muito r apida de fazer os c alculo ecientemente, mas leia o coment ario (30) dentro do programa e melhore o programa. Solu c ao: poupanca02.cc 11. Formata c ao de dados O programa poupanca02.cc escreve o dinheiro de forma feia e errada (com muitas casas decimais). Corrija isto, se inspire no programa vetor01.cc Solu c ao: poupanca03.cc 12. Formata c ao de dados O programa poupanca03.cc escreve o dinheiro de forma errada com ponto em vez de usar o nosso h abito que e a v rgula. Corrija isto. Solu c ao: poupanca04.cc 13. Se voc e comparar com poupanca01.cc, ver a que em poupanca04.cc tem erro de centavos e est a mal escrito. Por exemplo escreve 104.07 como 104, 7. O autor n ao teve a coragem de se apurar na solu c ao do problema, d e-lhe uma ajuda e lhe envie o programa correto... basta corrigir a fun c ao imprime(). Primeira solu c ao: dinheiro.cc M etodo: 62

Use o programa teste.cc. Cole dentro dele entra dados.cc apagando o que n ao interessar; Analise como foram calculadas em poupanca04.cc as partes inteira e decimal de um n umero, e desenvolva estes c alculos em teste.cc. Grave este programa com nome dinheiro.cc Compile, rode, teste e volte a corrigir at e que voc e obtenha o resultado esperado. Crie o m etodo dinheiro(float x) e coloque na classe Ambiente para uso geral. Aplique-o nos programas poupanca.cc e dinheiro.cc. Primeira vers ao: dinheiro.cc 14. O programa dinheiro.cc apresenta p essimo resultado se voc e fornecer a quantia 18283.394531 porque ele n ao sabe colocar os pontos de milhares. Corrija isto, dever a escrever 18.283, 39 Sugest ao: Crie uma fun c ao mil que quebre uma quantia qualquer em seus milhares. Use % Solu c ao: dinheiro01.cc As diculdades em resolver a quest ao de escrever dinheiro ` a moda brasileira podem ser vencidas usando vetores de caracteres. Voltarei a esta quest ao no cap tulo 8.

2.2

Os operadores l ogicos

Em Matem atica20 se confundem as duas opera co es: 1. atribui ca o de dados, que e feito em, C++, com o s mbolo = 2. teste l ogico, que em Matem atica se usa o mesmo s mbolo, mas em C++ se usa o s mbolo == Em Matem atica, a express ao 3x + 4 = 0 (2.4)

e uma senten ca dita aberta, e com isto se quer dizer, podemos testar se um determinado valor dado ` a vari avel x torna esta senten ca verdadeira ou falsa. Em C++ n ao teria sentido escrever esta express ao sem primeiro atribuir um valor a x. Em suma, em C++ podemos fazer: x = 10; (3x + 4 == 0)
20 porque

(2.5) (2.6)

os humanos s ao inteligentes e conseguem tirar conclus oes da confus ao de dados a partir do contexto

63

para vericar se a senten ca e verdadeira para o valor 10 dado a x. Observe que os par enteses s ao um operador da linguagem C++, o operador avalia c ao, eles for cam o c alculo do seu conte udo. Voc e pode ver isto no programa logica08.cc. Tamb em com calc, por exemplo21 e execute as seguintes linhas: x=3 3*x+4==0 Depois de digitada a u ltima linha, calc responder a com 0 porque ter a vericado que ` a direita e ` a esquerda de == se encontram objetos diferentes: 3x + 4 vale 13 = 0 3x + 4 == 0 e falso. (2.7)

Em C++ o zero e falso, e tudo que for diferente de zero e verdadeiro. Ainda me lembro, nos primeiros dias em que comecei a programar, a diculdade de entender o signicado da equa ca o x = x + 1; e tenho sentido esta diculdade presente na cabe ca de estudantes mesmo depois de algum tempo envolvidos com programa ca o. Existe uma frase muito comum na linguagem Matem atca que traduz este comando de computa c ao: fazendo x igual a x + C++ precisa de dois s mbolos, um para atribuir, que corresponde ` a frase Matem atica fazendo x igual a x+ e que se expressa no comando da linguagem como x = x + e o teste l ogico x == que vai ser calculado para vericar se tem valor falso ou verdadeiro. Em Matem atica estas diferen cas sutis t em que ser determinadas a partir do contexto pelos humanos. Em C++, cujos programas s ao escritos para as m aquinas, estes detalhes t em que ser cuidadosamente diferenciados. A diferen ca entre os operadores aritm eticos e os operadores l ogicos e que estes u ltimos devem produzir, como resultado: ametro for falso; 1. zero se o valor do par 2. diferente de zero (com freq u encia 1) se o valor do par ametro for verdadeiro.

2.2.1

As desigualdades

Podemos testar
21 Na aus encia do calc, fa ca um pequeno programa contendo somente estas linhas, reserve teste.cc para isto.

64

Matem atica < >

C++ < <= > >=

descri ca o menor do que menor do que ou igual maior do que maior do que ou igual

Leia e rode o programa logica08.cc. O ponto central do programa e o teste marcado com o coment ario (10). Vou analisar, passo a passo, como funciona o teste l ogico. Acompanhe lendo o programa logica08.cc. Depois rode o programa e volte a ler at e que tudo que claro. A fun ca o l ogica if() recebe o valor (quantidade > k)22 ; Quando j produzir um valor que torne (quantidade > k) verdadeiro23 a fun ca o break e executada for cando a sa da do for(); O controle do programa passa para a fun ca o seguinte que e a mensagem nal. O programa logica08.cc, lhe mostra o uso do operador l ogico > . Os demais operadores l ogicos que testam desigualdades, t em um signicado muito pr oximo das desigualdades em Matem atica, observada a diferen ca de graa, como no caso de

em Matem atica e

<= em C++. Os exerc cios devem conduz -lo, como um tutorial, a dominar este uso. Exerc cios 22 (Tutorial) verdadeiro ou falso 1. Altere o programa logica08.cc para que o verdadeiro e o falso sejam impressos. Solu c ao: logica18.cc 2. Altere logica18.cc para que os valores l ogicos, sejam atribuidos a duas vari aveis, falso, verdadeiro e os valores destas vari aveis sejam impressos. Solu c ao: logica28.cc 3. Infelizmente o programa logica28.cc est a errado, resolve a desigualdade mas erra o teste nal. Corrija o programa. Solu c ao: logica38.cc
22 Observe que (quantidade > k) e mesmo um valor passado ` a if(), os parenteses avaliam esta express ao como 0 ou 1. 23 Em C++ isto vai ser 1.

65

4. Leia e altere os programas da s erie logica*.cc para entender o signicado do valor l ogico atribu do a uma vari avel. Inclua cout << s em alguns pontos dos programas para testar os valores. 5. Melhore estes programas criando fun c oes para executar as partes dos programas. Solu c ao: logica48.cc

2.2.2

Teste l ogico de igualdade

Comentei que 3x + 4 = 0 e, para a Matem atica, uma senten ca aberta. O objetivo com este tipo de senten ca e descobrir o conjunto maior poss vel a que x perten ca que torne esta senten ca verdadeira. Em Matem atica isto e dito com a frase resolver uma equa ca o. Em C++ o teste de igualdade e feito, com n umeros, usando o operador == Estude o programa alarme11.cc, procure o coment ario (90). Os testes de igualdade t em uso relativamente pequeno. Praticamente voc e ir a fazer um teste deste tipo para vericar se, num pequeno n umero de casos, h a uma coincid encia. Exerc cios 23 (Tutorial) Como teste de igualdade falha 1. Igualdade e pouco prov avel Rode o programa equacao.cc e depois leia o programa. 2. Altere o programa para que ele fa ca 500 vareduras do intervalo alterando randomicamente o valor do passo e mostre uma estat stica de sucesso/insucesso na busca de ra zes. [Sugest ao: leia o programa somerapido02.cc]. Solu c ao: equacao01.cc O programa equacao01.cc mostra porque as igualdades s ao pouco prov aveis. mais prov E avel voc e encontrar uma desigualdade do que uma igualdade. Deixemos de lado as ra zes, que usamos apenas para dar exemplo de uso do teste de igualdade num caso em que ele e pouco u til. Voltemos agora aos casos em que tem utilidade. Estude o programa menu02.cc. Este programa e uma forma piorada de menu.cc para servir de exemplo para o operador ==. Quando voc e quiser fazer um menu, use menu.cc como modelo. Exerc cios 24 (Tutorial) Alterando menu02.cc 1. Rode e leia menu02.cc. 2. Crie uma fun c ao que calcule a area de c rculos, dado o raio, e complete o programa menu02.cc para que ele saiba fazer isto. 3. Usando menu12.cc como exemplo, complete este programa para executar as tarefas a que ele se prop oe. 66

4. Complete agora menu.cc para executar as tarefas a que ele se prop oe. 5. Complete menu.cc para obter um programa que calcule todas as areas habituais. N ao igual != Este e um caso mais freq uente, descobrir quando (valor1 != valor2) e verdadeiro. a incompleto, e um Analise o programa deve haver.cc. Este programa est exerc cio que ca ` a margem do objetivo deste livro, mas que pode interessar a algum dos leitores como motiva ca o pessoal para dominar a linguagem: fazer o seu caixa. Rode o programa e voc e vai encontrar algumas frases t picas de planejamento vazio... Observe que o operador ! tem uso pr oprio. Ele serve para negar.

2.2.3

O operador&&
AeB (2.8) (2.9)

Em C++ a senten ca se escreve (A && B) e observe que os par enteses s ao necess arios. Um par de par enteses tem o signicado de um operador avalia c ao, diz ao ggc que a express ao nele contida deve ser calculada. Se voc e n ao colocar par enteses, o compilador ir a reclamar. Esta senten ca e verdadeira quando as duas senten cas, A,B, forem verdadeiras simultaneamente. ario (10). Ele est a marLeia o programa deve haver.cc e procure o coment cando uma senten ca formada pela conjun ca o de 6 senten cas. Leia o coment ario equivalente a disjun (10) que explica que o par ametro do while(). E c~ ao l ogica.

2.2.4

A disjun c ao l ogica ||
A ou B (2.10) (2.11)

Em C++ a senten ca se escreve Esta senten ca e verdadeira se uma das senten cas, A, B o for. Exerc cios 25 (Tutorial) Disjun c ao l ogica ario 1. Altere deve haver.cc para substituir no local marcado pelo coment (10) a conjun ca o l ogica por uma disjun ca o l ogica Solu c ao: deve haver01.cc 67 (A || B)

2. Rode o programa deve haver01.cc para vericar que ele sai do ar imediatamente sem mostrar as op c oes do sistema. Descubra o que houve. ario (10) no programa. Solu c ao: Leia o coment 3. Corrija o programa deve haver01.cc usando a sugest ao que ele cont em no coment ario (10). Solu c ao: deve haver02.cc O exemplo dos programas deve haver01.cc e deve haver02.cc mostra o poder da nega c ao l ogica como forma elegante e simples de resolver probe dif cil de ser explicada, enquanto que lemas. A solu ca o deve haver02.cc deve haver.cc e bastante simples.

2.3

Lista dos operadores aritm eticos e l ogicos

Em C++ existem alguns operadores , que vamos descrever detalhadamente abaixo incluindo exemplos. Se voc e tiver chegado at e aqui linearmente, muitos deles j a ser ao seus conhecidos, porque voc e os encontrou nos programas. operador l 1. ! E ogico, not. O n ao l ogico; a nega ca o do operador l ogico igual. O diferente de; 2. != E 3. & o operador l E ogico e para operar sobre bits. Baixo n vel. o operador endere E co. & vari avel tem como resposta o endere co de vari avel. o e l ogico. Se as vari aveis var1, var2 forem verdadeiras (quer 4. && E dizer, diferentes de zero), var1 && var2 ser a verdadeira (quer dizer, diferente de zero). um operador que consideramos ultrapassado e que serve para conec5. , E tar duas senten cas como se fossem uma. O mais importante neste registro e que voc e pode receber uma mensagem de erro, por alguma v rgula esquecida, dizendo que ela n ao ter a nenhum efeito... Procure a v rgula, apague-a e esque ca este operador at e o pr oximo erro. 6. \ Operador para permitir a impress ao de sinais especiais, escape characters. Exemplos: \b - volta um caractere, (backspace), \f passa uma p agina na impressora (form feed), \n nova linha (new line), \a - aciona o som do sistema para fazer um beep, \0 - observa ca o, 0 e o zero e n ao o o mai usculo, - caractere nulo.

68

7. = N ao e um operador aritm etico, e um comando da linguagem C++algumas vezes identicado como atribui ca o. Sobre tudo observe que e diferente de == que aparece mais abaixo. e a divis ao inteira. As duas formas abaixo s ao 8. % O operador mod, equivalentes: r = mod(a, b) r = a%b; (2.12) tem como resultado o resto na divis ao de a por b. int resto(int a, int b) { printf("Resto de %d dividido por %d e %d ",a,b,mod(a,b)) return 0; } resto(4,6) -> Resto de 4 dividido por 5 e 4 H a diversas aplica co es para esta fun ca o, uma delas na valida ca o de c odigos, como CPF em que o d gito pode ser o resto na divis ao do n umero formado pelos outros algarismos por um quociente escolhido. Assim se pode vericar se um n umero apresentado como CPF tem legitimidade ou n ao. O quociente, o segundo par ametro em mod(a,b), deve ser grande, em geral, para aumentar a seguran ca, ou diminuir a chance nas tentativas falsas. ao comum se faz com o operador / e ainda h a uma divis ao 9. / A divis inteira que com o operador //. Assim, o valor de teste no c alculo seguinte teste = ((13//5)*5 + mod(8,5)) == 13 ser a1 10. // A divis ao inteira. ((13//5)*5 + mod(8,5)) 13

Experimente calcular esta express ao usando calc. 13//5 calcula o quociente na divis ao de 13 por 5 e mod(8,5) calcula o resto nesta divis ao. A express ao do teste e a equa ca o da divis ao euclidiana: divisor quociente + resto = dividendo (2.13)

Se voc e copiar esta express ao para a folha do calc, n ao se esquecendo de dar previamente valores ` as vari aveis divisor, quociente, resto, dividendo, ao dar enter ter a como resposta: 1 porque a avalia ca o l ogica entre as duas express oes resultou em verdadeiro. 11. * O operador multiplica ca o; Este operador e da multiplica ca o em C++ como na maioria das linguagens de programa ca o. Como a adi ca o, a opera ca o * se parece com a multiplica ca o da Matem atica. 69

Se parece porque em Matem atica, sempre podemos calcular ab

dados dois n umeros. Em C++, depende do limite na mem oria do computador. Este seria um dos diferenciadores, C++ foi projetado para trabalhar com n umeros inteiros dentro de uma faixa de grandeza. Al em desta faixa de grandeza os resultados voltam a se repetir ciclicamente. Apenas para podermos exemplicar com valores pequenos, suponhamos que o C++ com que voc e estivesse trabalhando se encontrasse limitado aos inteiros de 10 at e 9. Este tipo de dados seria formado dos n umeros {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9} (2.14) Neste caso, 3 2 = 6; 3 5 = (15 10) 5 10 = 5; 3 6 = (18 10) 8 10 = 2 q = (q p 10) = r r 10 (2.15) (2.16) (2.17) (2.18)

3*2 estaria no universo (tipo de dado) dos inteiros positivos;

3*5 = 15 produziria um overow 15-10=5. Porque o maior n umero inteiro positivo seria 9. Ai come caria a contagem do menor inteiro poss vel, -10 +5 = -5 e o resultado da opera ca o;

3*6 = 18 produziria um overow de 8. Ai come caria a contagem do menor inteiro poss vel, -10 +8 = -2 e o resultado da opera ca o; este C++ faria as contas e usaria o dez fora para dar a resposta, mas aceitando resultados entre -10 e 9. Porque, considerando a equa ca o (18), Procuramos o maior inteiro p tal que 10 p seja menor do que q e ao euclidcalculamos a diferen ca r que corresponde ao resto na divis iana; Somamos este resto ao in cio do intervalo: r 10 Exerc cio Fa ca um programa para construir esta aritm etica, com sinal, m odulo 10. Solu c ao: modulo10.cc Rode e leia o programa novefora.cc que mostra o que acontece com int. Ele executa a experi encia descrita acima, com um tipo de dado existente em C++. 70

12. + O operador adi ca o; Este e operador de adi ca o valendo os mesmo coment arios que zemos com respeito ` a multiplica ca o comparada com esta opera ca o na Matem atica. o operador incremento. Fica denido pela seguinte identidade: 13. ++ E a++ e id entico a a=a+1 ao usar deixe um coment ario usando a express ao expandida equivalente. 14. atribui c~ ao com incremento x += numero equivale a x=x+numero; x -= numero equivale a x=x-numero; Ao usar coloque um coment ario. Gostamos de fazer refer encia a este operador como incremento seguido de atribui c ao, porque e nesta ordem que as opera co es s ao executadas. Observe que mesmo no caso em que se dena float x, gcc prossegue somando uma unidade a x. Alguns autores indicam que no caso de += a hierarquia da opera ca o se d a da direita para esquerda. Discordamos da arma ca o! Tudo que deve ser observado e a equival encia indicada acima e desta forma, primeiro e executada a adi c~ ao e depois a atribui c~ ao (o que justica a arma ca o de que houve uma exce ca o na hierarquia operat oria). Preferimos n ao ver esta exce ca o, mas a equival encia, prevalecendo ent ao a regra operat oria da esquerda para direita sempre. 15. - O operador subtra ca o; Este e operador de subtra ca o valendo os mesmos coment arios que zemos com respeito ` a multiplica ca o comparada com esta opera ca o na Matem atica. semelhante ao ++ para fazer subtra 16. -- O operador decremento; E co es. Sintaxe x-- equivale a x=x-1 17. -> Operador para acessar um elemento de uma classe ou de uma estrutura; ao ; Este e operador de divis ao inteira quer dizer que 18. / O operador divis a/b calcula apenas o quociente na divis ao entre os dois n umeros inteiros a,b. Se um dos n umeros for do tipo float o operador imediatamente

71

se acomoda ao tipo mais amplo, oat, tendo como resultado o n umero . racional a b Al em disto valem os coment arios que zemos com respeito ` a multiplica ca o comparada com esta opera ca o na Matem atica. um operador l 19. < Operador l ogico menor do que ; E ogico, quando C++ avalia a<b o resultado ser a 0 ou 1 conforme esta express ao seja falsa ou verdadeira. a esquerda ; Voc e nunca vai precisar deste op20. << Operador shift ` erador a n ao ser que voc e deseje criar programas que ningu em entenda. Eles s ao de muito baixo n vel e foram muito importantes numa epoca em que qualquer detalhe que pudesse agilizar o processamento, era crucial (mais forte do que importante). Tome conhecimento deles e eventualmente voc e poder a achar alguma utilidade interessante para eles em exemplos ou contra-exemplos. Se voc e conhece (viu) aquelas antigas m aquinas de calcular com manivela e duas orelhas que permitiam correr o carro para direita ou para esquerda, observe a Figura ?? na p agina ??, ent ao voc e tem aqui um exemplo computacional. << corre o carro para esquerda, mas de forma bin aria. Por exemplo, 4 100

aumenta uma casa posicional no n umero (em seu formato bin ario). Como vivemos numa cultura decimal, estes operadores n ao est ao diretamente ligados com as nossas necessidades. Exemplos: 3 11 3 << 1 11 << 1 = 110 6 (2.19) (2.20) (2.21) (2.22) (2.23) (2.24) (2.25)

a direita a express ` ao deste n umero em bin ario. 4<<1 100<<1 = 1000 8

4 100 4 << 1 100 << 1 = 1000 8 8 1000 8 << 1 1000 << 1 = 10000 16 7 111 7 << 1 111 << 1 = 1110 14 5 101 5 << 2 101 << 2 = 10100 20 7 111 7 << 2 111 << 2 = 11100 = 10000 + 1000 + 100 16 + 8 + 4 = 28

Nas equa co es acima estamos usando para traduzir, nos dois sentidos, de decimal para bin ario ou vice-versa. Observe que em a<<b, exatamente, o carro anda b casas posicionais para esquerda, sempre na express ao bin aria do n umero a. Os operadores bit-l ogicos 72

s ao opera co es de baixo n vel e conseq uentemente muito r apidos. Os dois operadores shift (transla ca o) podem ser utilizados para multiplicar ou dividir. S ao usados em c alculo l ogicos tamb em uma vez que eles se aplicam aos caracteres. 21. >> Operador shift ` a direita ; Voc e nunca vai precisar deste operador, certamente. Serve para agilizar opera co es aritm eticas e l ogicas e tornar os programas mais complicados, tamb em mais ageis. Aqui voc e tem o operador que corre o carro para a direita. Conseq uentemente ele e destrutivo o que n ao acontece com as m aquinas de balc ao, elas n ao correm o carro e voc e pode simplesmente voltar o carro atr as. a>>b corre o carropara direita, o n umero de casas indicadas pelo par ametro b, at e consumir a. Por exemplo, a direita a express ` ao deste n umero em bin ario. 4>>1 100>>1 = 10 2 Exemplos: 4 100 4 >> 1 100 >> 1 = 10 2 8 1000 8 >> 1 1000 >> 1 = 100 4 7 111 7 >> 1 111 >> 1 = 11 3 5 101 5 >> 2 101 >> 2 = 1 1 7 111 7 >> 2 111 >> 2 = 1 3 11 3 >> 1 11 >> 1 = 1 1 (2.26) (2.27) (2.28) (2.29) (2.30) (2.31) 4 100

aumenta uma casa posicional no n umero (em seu formato bin ario).

Nas equa co es acima estamos usando para traduzir, nos dois sentidos, de decimal para bin ario ou vice-versa. Observe que em a>>b, exatamente, o carro anda b casas posicionais para esquerda, sempre na express ao bin aria do n umero a. ogico menor do que ou igual; 22. <= Operador l Associa ` a express ao a<=b um dos valores 0,1 conforme ela seja verdadeira ou falsa considerando os dados guardados nas vari aveis a,b. Algumas vezes os programadores s ao tentados a deixar dentro dos progra uma forma de garantir que mas chaves secretas que eles conhecem. E ningu em venha a substitu -lo na manuten ca o de um programa. Observe esta forma maldosa de atribuir zero a uma vari avel a = (5<=3); Como 5<=3 ser a avaliada como falsa, o resultado, depois de calculados os par enteses, e zero que ser a atribu do ` a vari avel a. Esta linha perdida entre uma centena de linhas, e uma chave secreta violenta. 73

P essimo exemplo, n ao siga. Mas eventualmente ele pode ser u til, neste caso coloque coment arios dizendo o que est a fazendo. 23. == Operador l ogico igual; Diferente de =. e igual a b. a==b serve para testar se a 24. > Operador l ogico maior do que ; Releia <= substituindo este por > com a leitura adequada.... 25. >= Operador l ogico maior do que ou igual; Releia <= substituindo este por >= com a leitura adequada.... ao; 26. ?: Condicional dentro de uma express De mau estilo, torna o programa ileg vel. Analise o segmento de programa:

a = 3; b = 7; a > b? printf(verdade):printf(falso); f also ou ainda (a>b)? printf("verdade"):printf("falso");

(2.32) (2.33) (2.34) (2.35)

Equivale a if() else, portanto use o if() else. Um outro exemplo se encontra no programa condicional.cc 27. O operador bit-l ogico xor (ou exclusivo); 28. { 29. } Chaves - para delimitar blocos l ogicos de um programa;

O operador bit-l ogico or (ou) ; O operador l ogico or (ou) ;

30. ||

ogico n ao (calcula o complemento de todos os bits, 31. O operador bit-l onde estiver 0 coloca 1 e vice versa.) ; Se voc e for fazer algum programa para Internet talvez voc e precise deste operador... 32. define Diretiva de compila ca o. Uso: #define nome macro texto dene uma macro. Estudamos macro no Cap tulo 4. Voc e precisa tamb em de ifdef, endif, ifndef, undef E uma forma obscura de programar emC++, use fun co es e boas vari aveis em lugar disto, mas n ao e poss vel esconder que agiliza o processamento. 74

33. include Diretiva de compila ca o. Uso: #include nome biblioteca - inclui nome biblioteca no in cio do c odigo. 34. input Diretiva de compila ca o. Uso: #input nome arq - inclui nome arq neste ponto do c odigo. Evite usar. Use bibliotecas em vez desta diretiva, observe include.

75

Cap tulo 3

L ogica de programa c ao

Aqui come ca programa ca o: a l ogica por tr as de qualquer programa, em qualquer linguagem de programa ca o do tipo imperativo. Depois deste cap tulo voc e estar a preparado para programar em v arias linguagens, apenas observando as ligeiras modica co es t picas de cada uma delas.

3.1

O que e um programa

Responder esta pergunta1 e muito dif cil e corro o risco de divagar em torno de id eias que nunca se concretizem. Sem muitos rodeios, todo mundo que precise usar um computador, deseja que um programa seja um conjunto de regras que fa ca com que a m aquina trabalhe para produzir um resultado esperado. Ent ao digitando ls no terminal voc e usou um programa. Aqui est a acontecendo algo muito especial, quando voc e liga o computador, o sistema operacional passa o controle da m aquina para uma linguagem interpretada, em Linux e o bash ou alguma variante desta linguagem. bash e como calc, voc e digita um comando e ela executa. C++ e mais complicado! Preciso escrever um programa, grav a-lo no disco, compilar o programa criando um execut avel2 ,
1 H a um c elebre livro de R. Courant com o t tulo Que e Matem atica ? que n ao responde ` a pergunta mas diz muita coisa sobre Matem atica. O risco seria escrever um livro sobre o que e um programa... 2 Eu sempre uso o nome prog para o execut avel, mas n ao precisa ser assim.

76

executar o programa criado: prog. Eu j a disse anteriormente, at e parece que desejo desmerecer as linguagens compiladas, em favor das interpretadas. N ao e bem assim! Com a exce ca o do item compila c ao, o processo acima e usado para programas sob linguagens interpretadas tamb em. Mas, retornando ` a pergunta: que e um programa? Observe que esperamos um resultado e n ao que a m aquina invente alguma id eia nova! No m aximo desejamos testar algum resultado sobre o qual n ao temos certeza ou uma grande quantidade de resultados cujos testes manuais demandariam muito tempo. Um programa seria um roteiro de trabalho para a m aquina. Se voc e propuser um roteiro para um indiv duo simples, sem grandes horizontes, ent ao voc e tem que lhe passar um conjunto de instru co es bem claras, impositivas mesmo. Os computadores est ao nesta classe, s ao muito simples. J a houve uma evolu ca o grande durante os 60 anos de computa ca o, o programa (4.1) que voc e encontra na p agina 115, e um exemplo dos prim ordios da computa c ao em que um programa era uma simples lista de comandos. Programa ca o atingiu um n vel grande de abstra ca o nestes 60 anos.

3.1.1

O primeiro passo na escala da abstra c ao

O uso de vari aveis, discutidas no cap tulo 5, foi uma inova ca o que permitiu um avan co importante na abstra c ao permitindo que pudessemos discutir quando um certo evento seria verdadeiro, foi o primeiro passo na abstra ca o em que adquirimos a capacidade de substituir endere co de mem oria por uma palavra semelhante ` as que usamos na linguagem. Agora podemos dizer numero = 34; antes escreviamos no programa sto 34 000001 a palavra sto era um comando do assembler da m aquina e esta frase signica guarde 34 no endere co 000001. Voc e pode facilmente imaginar a confus ao num programa para guardar v arios valores em distintos endere cos e depois tentar se lembrar onde estaria cada um dos valores. O avan co produzido pela inven ca o das vari aveis foi produzido por uma simples tabela do tipo

77

vari avel numero1 numero2 pessoa1 pessoa2

endere co 000010 000030 000135 000315

no programa voc e escreve comandos parecidos com frases da linguagem (inglesa) e a linguagem de programa ca o executa frases do assembler.

3.1.2

O segundo passo na escala da abstra c ao

O comando sto do assembler foi substituido por uma express ao com apar encia de Matem atica numero = 34 e assim foi feito com o restante dos comandos do assembler. Para somar dois n umeros era preciso uma lista de opera co es: sto 34 000001 sto 35 000010 add 000010 000001 mov 000001 000030 esta sucess ao de instru co es foi substituido por numero3 = numero1 + numero2 Esta u ltima frase, a mais moderna, n ao e somente menor, d a um sensa ca o de que estamos falando Matem atica. Nesta nova escala de abstra ca o os operadores adquiriram formato de verbos da linguagem.

3.1.3

O terceiro passo na evolu c ao da abstra c ao

Finalmente veio a s ntese das decis oes l ogicas sob a forma de predicados da linguagem.

S ao os pontos de decis ao, quando os programas passaram a poder escolher sozinhos alternativas para serem executadas quando alguma vari avel fosse alterada pelo processamento. disto que vou tratar neste cap E tulo, a capacidade de tomar decis oes. As palavras-chave deste cap tulo s ao:

78

if() if()/else switch(), case while() do while() for() break return()

se() se()/senao escolha(), caso enquanto() fa ca enquanto() para() pare voltar()

Com estas palavras se fazem programas, portanto com elas podemos construir as senten cas com que vamos instruir um computador a processar os dados que lhe entregarmos. a sintaxe desta comunica E ca o que vai ser estudada neste cap tulo, e isto que muitas vezes e chamado de l ogica de programa ca o. Neste cap tulo vou lhe mostrar como se desenvolve a l ogica para transformar um algoritmo num programa de computador. No primeiro cap tulo j a lhe pedi diversas vezes que viesse at e aqui para ver como estes conectores l ogicos funcionavam, usei este cap tulo como refer encia. Agora, numa leitura pr opria do cap tulo, voc e vai aprofundar o seu estudo das palavras chave que comp oem a linguagem C++. Estas s ao as ferramentas com que construimos os algoritmos, as fun c oes, os novos comandos da linguagem, os nossos comandos. Os m etodos que voc e encontra em Ambiente.h s ao exemplos desta constru ca o. Se voc e quiser programar em portugu es, leia a biblioteca traducao.h para ver como fazer. Basta incluir esta bilioteca e usar as fun coes da linguagem em nossa lingua. Lendo traducao.h voc e v e como fazer e como ir mais al em. Eu escrevi v arios programas em portugu es, e se voc e tiver interesse me pe ca. Eles rodam perfeitamente, mas neste livro eu n ao vou me dedicar a este assunto. Sim, voc e deve estar se perguntando, e a sequ encia dos passos de abstra ca o das linguagens de programa ca o. Esta hist oria continua no cap tulo 7, voc e pode dar uma volta at e l a, se ainda n ao tiver feito isto. Agora vou conduz -l@ na discuss ao da l ogica de programa ca o.

3.2

O condicional if() (se())


se() se(verdadeiro) fa ca(); fa ca() se() sen ao se(verdadeiro) fa ca(); fa ca(); sen ao fa ca outra coisa(); 79 fa ca outra coisa();

Vou come car com duas estruturas de controle do uxo: 1) if() if(verdadeiro) 2) if() else if(verdadeiro) else

A fun ca o if() recebe um par ametro e o avalia. Se esta avalia ca o resultar em verdadeiro3 o resto do comando associado ser a executado. Por exemplo, o seguinte bloco Exemplo 1 (se()) Exemplo de if()

cout << Forne ca-me um n umero maior do 100 << endl; if(numero > 100 ) { cout << OK ! voc^ e obedeceu ao combinado << endl; } Um bloco parecido com este, est a implementado no programa terceiro01.cc . Leia e rode o programa. O par ametro das fun co es l ogicas4 assumem dois valores poss veis: verdadeiro que pode ser qualquer coisa diferente de zero, ou o valor bool true; falso, que e o zero ou o valor bool false. Em C++ o falso e o zero tamb em associado ao valor false, do tipo bool (booleano); qualquer valor diferente de zero e verdadeiro, tamb em existe o valor true do tipo bool. Embora muito simples, isto funciona! Leia e rode os programas verdadeiro.cc, boolean.cc A gura (3.1) p agina 81, representa gracamente este teste. Nela h a uma condi c ao, que poder a ser verdadeira, falsa. Em qualquer hip otese, verdadeira ou falsa, o programa deve parar, mas, se condicao assumir o valor verdadeiro alguma coisa deve ser feito antes de parar o programa. Obviamente este diagrama poderia estar inclu do em outro maior ou mais complexo em que, em lugar do pare() houvesse outra possibilidade de processamento. O diagrama da gura (3.1) apenas ilustra um if().
rode e leia o programa terceiro01.cc sobre verdade e falsidade em C. do que e uma fun ca o, mas chamamos de operador pelo modo de usar, o s mbolo da fun ca o e colocado entre os par ametros
4 menor 3 leia,

80

F condio pare();

faa alguma coisa

pare();

Figura 3.1:

if()

Exerc cios 26 (Tutorial) O programa terceiro0*.cc 1. Dissemos, no exemplo 1, 80, que havia uma ocorr encia de if() parecido no programa terceiro01.cc. Na verdade e uma esp ecie de inverso do que e discutido no exemplo. Altere terceiro01.cc para o exemplo 1 que correto. Solu c ao: terceiro011.cc 2. O programa terceiro011.cc n ao fala nada se o usu ario desobedecer o pedido. Corrija isto. Solu c ao: terceiro012.cc 3. Os programas terceiro011.cc, terceiro012.cc n ao prestam aten c ao que o usu ario pode ainda errar se responder 100. Corrija isto. Solu c ao: terceiro013.cc 4. O programa terceiro014.cc tem um erro, mas ele mesmo se explica num coment ario. Rode o programa e depois o leia tamb em. Compare com terceiro013.cc . 5. vari avel n ao inicilizada No programa terceiro02.cc, a vari avel numero n ao foi inicializada5 pelo programador. Rode o programa e analise o que acontece. Leia o coment ario (40), a nota de rodap e tem raz ao! 6. Se voc e ainda n ao transformou a linha com o coment ario (30) em terceiro02.cc fa ca-o agora e depois compile o programa.
5o

autor est a errado, leia o coment ario dentro do programa...

81

7. Voc e pode tamb em alterar o tipo de dado de main() para void e deixar o coment ario (30) na linha do return(). N ao haver a mais mensagem de erro. Experimente. Mas voc e estar a rompendo com uma tradi c ao dos programas, sempre main() deve ser do tipo int, sempre deve devolver um n umero inteiro positivo (zero e positivo...). 8. O programa terceiro02.cc d a-lhe outro exemplo do erro que pode haver um erro no uso do else: se houver um comando entre if() e else. E muito comum, apague a marca de coment ario (21) e compile o programa. Leia os coment arios tamb em. Observa c ao 3 Erros e a an alise do compilador A busca de erros de sintaxe pelos compiladores ainda e fraca apesar de que eles tenham evoluido muito, eles ainda se perdem. O caso do ponto-ev rgula e proverbial. Apague um ponto-e-v rgula num programa e compile, muito provavelmente a montanha de erros ser a t ao grande que e praticamente imposs vel de descobrir alguma coisa interessante na an alise. Se acostume com esta id eia e v a logo dar uma busca em todos os ponto-ev rgulas que deveria haver, antes de sofrer lendo a listagem de erros. Existem v arios mecanismo para auxiliar o programador a encontrar erros nos programas, mas n ao tenho d uvidas em dizer que o melhor sistema consiste em fazer fun c oes pequenas e bem testadas chamadas por uma fun c ao main() tamb em pequena que possa car toda vis vel num terminal. Isto nem e poss vel conseguir, mas deve ser um objetivo. Grandes programas ser ao ent ao aglomerados de pequenos m odulos sem erros, se for poss vel!

3.2.1

Se() senao, completando o if()

No programa terceiro01.cc, se o usu ario fornecer um numero menor do 100 ter a desobedecido ao combinado, mas o programa n ao premia com louvores a alternativa else do if() de que o usu ario que obedece ao combinado. E preciso para completar este processo. Vou discutir o programa terceiro02.cc. Leia e rode este programa. Em qualquer caso, se o usu ario respeitar ou n ao o pedido, o programa saber a fazer um coment ario adequado. A express ao se(numero < 100) ser a avaliada como falsa, portanto, zero, e a frase voc e obedeceu ao combi necess nado n ao ser a impressa. E ario uma alternativa, pelo menos para dizer voc e desobedeceu ao combinado!. Exerc cios 27 (Tutorial) A alternativa else a er1. Compile, rode e leia o programa falta return.cc. O programa est rado, mas o compilador n ao detecta o erro. No caso em que o usu ario forne ca um n umero n umero menor do que 100, deveria haver uma alternativa (que est a desativada por um coment ario). Analise o programa. 82

2. Corrija o programa falta return.cc. 3. Leia o coment ario (30) em terceiro02.cc. Retire6 a linha onde est ao coment ario (30) e compile o programa. Voc e vai receber a mensagem sobre a falta do return() numa fun c ao n ao vazia. 4. Experimente o programa se nada.cc compile, rode e leia! Leia os coment arios no programa. Se voc e n ao atender o pedido do programa, um n umero maior do que 10, o programa vai parar, silenciosamente. Para completar o if() falta uma alternativa. Aqui entra else para criar uma alternativa uma vez que este programa n ao faria nada quando voc e desobedecesse ` a regra. Nenhuma advert encia, sequer. Vou completar o esquema.

cout << Forne ca-me dois n umeros << endl; cout << O segundo numero deve ser maior do que o primeiro << endl; if(numero1 < numero2 ) { cout << OK ! voc^ e obedeceu ao combinado << endl; } else cout << Voc^ e desobedeceu ao combinado ! << endl;

Se a condi ca o testada pelo if() se vericar falsa, o programa se conecta, imediatamente, a um else que se encontra depois do if(). Observe o uso do ponto-e-v rgula no (if(); else). Antes do else tem ponto-e-v rgula. Esta observa ca o e importante para programadores em Pascal porque (no caso do Pascal) n ao tem ponto-e-v rgula antes do else. Em C++, tem! Em outras palavras: o comando iniciado com else deve vir em seguida ao um comando iniciado por um if(). Se voc e, por engano, colocar algum comando entre o nal do if() e o else haver a uma mensagem de erro indicando isto. O programa terceiro02.cc
6 observe

que voc e n ao precisa apagar, basta colocar o s mbolo // no in cio da linha

83

est a preparado para lhe mostrar este este erro, basta apagar o coment ario antes ario do else. O programa lhe diz o que fazer, leia o programa, procure o coment (21), apague o coment ario, (apenas o s mbolo //), compile o programa. Experimente! e, ent ao, A sintaxe do if()-else if(condicao) comando; else outro comando; Leia e experimente com o coment ario (21) do programa terceiro02.cc que implementa o if()/else. Leia o programa num terminal enquanto ele roda noutro terminal. Leia, rode, leia e volte a rod a-lo... Observa c ao 4 M ultiplos return() Ent ao a fun c ao return() tem que aparecer dentro das duas sa das, tanto no caso F como no caso V. Este e um erro muito freq u ente, erro de l ogica de programa ca o. O programador esquece de fazer uma an alise l ogica do uxo e se perde nas sa das do programa. A reclama c ao do compilador e de que voc e est a executando uma fun c ao sem retorno de dados: warning: control reaches end of non-void function o controle chegou ao nal de uma fun c ao n ao vazia, quer dizer que n ao encontrou um return(0) ao nal de uma fun c ao, que n ao sendo vazia, tem um tipo de dado (n ao vazio)7 que deve produzir um return(). Mas n ao e sempre que o compilador consegue perceber este erro, na lista um erro muito no e os compiladores ainda de exerc cios voc e ver a isto. E n ao atingiram um ponto de desenvolvimento para conseguir perceber todos os poss veis erros que um programador pode cometer. Os programas desta lista de exerc cios, est ao incompletos. Ainda e preciso mais um pouco de l ogica de programa c ao para produzir programas u teis. O objetivo aqui e apenas treinar o uso do if(). Voltarei a tratar dos mesmos assuntos mais a frente, com programas completos. N ao que apressado, mas se quiser resolver os problemas que vou mencionar aqui, recorra ao cap tulo 4. Exerc cios 28 (Tutorial) if()/else e ainda n ao rodou e leu o programa terceiro02.cc, 1. O ponto-e-v rgula Se voc fa ca o agora. 2. O ponto-e-v rgula Ainda no programa terceiro02.cc, apague o coment ario da linha que precede o else, leia o coment ario (21), e compile o programa. Ele vai reclamar dizendo que h a um erro antes do else (else). 3. Altere o programa terceiro03.cc para ele diga8 que sabe calcular o fatorial de n e se o usu ario apresentar um n umero maior do que 13 responda
contradi ca o nesta frase, o vazio, void, e um tipo de dado... voc e vai ver um programa para calcular fatorial, por enquanto fa ca apenas o planejamento vazio
8 logo 7 uma

84

que ele, o usu ario, est a tentando fraudar o sistema aritm etico. Leia os coment arios ao nal do programa. solu c ao terceiro031.cc 4. Estude terceiro031.cc, observe que tem return(), duas vezes, com valores diferentes. Leia os coment arios do programa. Por que? Observe que terceiro031.cc e um exemplo de planejamento vazio. 5. Estude terceiro031.cc, leia o coment ario (2) e compreenda porque o comando marcado por este coment ario n ao ser a executado. Altere isto para que o programa saia deixando o terminal limpo. solu c ao terceiro032.cc 6. Planeje um programa para calcular a divis ao exata de dois n umeros inteiros, o dividendo pelo divisor. Se o usu ario fornecer um divisor maior do que o dividendo diga que e imposs vel. solu c ao terceiro033.cc 7. Altere o programa terceiro033.cc pedindo que o usu ario forne ca mais alguns n umeros e fa ca mais alguns testes para treinar o uso de if()/else experimente omitir return(). Experimente voltar outros valores inteiros. 8. Altere terceiro033.cc fazendo que o programa volte um valor n ao inteiro. Vai dar erro, analise por que? solu c ao a fun c ao main() e do tipo inteiro. 9. apagando return() Experimente, apague um return() nos programas da s erie terceiro03*.cc e compile. Analise o resultado. N ao precisa fazer isto se j a souber o resultado. Mais um exemplo com fatorial9 .

if(n<10) { }

fatorial(n);

ir a tentar o c alculo do fatorial mesmo quando n for menor do que zero. Como n ao existe o fatorial de n umeros negativos, este algoritmo precisa ser melhor especicado pois ele n ao duvidaria em calcular o fatorial de 1 se o n umero n = 1 lhe fosse apresentado.
9 preciso de while() ( enquanto()) para calcular o fatorial. Ser a apenas planejamento vazio. . .

85

Observa c ao 5 Planejamento vazio Preciso de mais algumas estruturas de controle de uxo para resolver o problema do fatorial. Vou fazer isto no cap tulo 4. Se estiver curioso, leia o programa fatorial01.cc mas voc e pode resolver os exerc cios desta se c ao sem resolver inteiramente o problema: planejamentos vazios. Se habitue a esta id eia que ela e essencial em programa c ao. Sempre fa co planejamentos vazios10 numa primeira etapa, e esta se c ao traz v arios exemplos. Sem brincadeira, eles s ao importantes para uma constru c ao da l ogica do problema. Voc e logo ver a, em v arios dos nossos programas, exemplos iniciais do planejamento do trabalho analise menu.cc, cujas op c oes todas t em, como resposta, uma frase polida: por favor, volte depois, o trabalho est a em andamento A verdade mesmo e que o trabalho nem come cou! foi feito somente o planejamento. Claro! estou em contradi c ao, o planejamento faz parte do trabalho. Esta e a primeira etapa, e sem d uvida nenhuma, a mais importante. Analisei o problema e o quebrei em peda cos t ao pequenos quanto poss vel, (lembre-se, um programa deve car no m aximo do tamanho da tela, para que se possa ver todos os defeitos, os insetos11 ). Depois e que vou iniciar a constru c ao de cada m odulo. Isto somente vai car inteiramente claro depois do cap tulo 4. Voc e vai ver que as fun c oes tem o papel de modularizar o trabalho de programa c ao. Cada fun c ao e um novo comando. Leia apeteco2(), estude12 a biblioteca Ambiente.h, se ainda n ao houver feito isto. Exerc cios 29 (Tutorial) Fatorial incompleto 1. Escreva o programa fat inc.cc que execute o algoritmo incompleto acima. A solu c ao est a no disco... (inc e abrevia c ao de incompleto). ario (20) em 2. atribui c ao Entenda a linha marcada com o coment fat inc.cc N ao e uma equa c ao matem atica que se encontra ali, mas sim duas opera c oes de computa c ao: a primeira e prod*n, o produto de n por prod;

a segunda est a representada pela igualdade e quer dizer que ser a atribu do ` a vari avel prod o resultado de prod*n. Em Pascal isto se escreve assim: prod := prod*n; em que := se l e recebe. Acho que esta eau nica vantagem de Pascal sobre a linguagem C++.
os governantes dos nossos pa ses, como etapas denitivas!

10 Como

11 bugs.... 12 Estudar n ao quer dizer, procure entender tudo... quer sempre dizer, leia e procure entender alguma coisa!

86

3. atribui c ao Estude o programa soma01.cc em que voc e encontra a atribui c ao soma = soma + n1 leia o coment ario (20). ca uma lista 4. atribui c ao Altere o programa soma01.cc para que ele lhe pe de cinco n umeros: n1,n2,n3,n4,n5 cuja soma deve ser calculada. 5. atribui c ao Altere o programa soma01.cc para calcular a m edia aritm etica de cinco n umeros. solu c ao: soma02.cc 6. Porque em soma02.cc o c alculo da m edia e feita com a divis ao por 5.0 e n ao por 54 ? ario em soma02.cc solu c ao: Ver coment 7. Porque, no caso de soma02.cc seria equivalente calcular soma/5 ou soma/5.0 ario em soma02.cc solu c ao: Ver coment Estudei atribui c~ ao no cap tulo 2 e voc e pode relembrar o assunto com outra visita a este cap tulo, mas volte logo para c a. A atribui ca o e um dos operadores13 da linguagem C++. Vou melhorar um pouco o planejamento do fatorial. Em fatorial01.cc voc e encontra uma vers ao mais completa.

if( n >= 0 ) { fatorial(n); } if( n<0 ) { cout << n~ ao existe o fatorial de << n << endl; }

Exerc cios 30 (Tutorial) Melhorando o fatorial 1. usando fun c ao


13 Dizemos operador quando deveriamos dizer fun c ao, mas este e o h abito porque colocamos o s mbolo da fun ca o entre os par ametros

87

Sobre fun c oes leia o cap tulo 4, fa ca uma primeira leitura da parte inicial e volte para c a. Transforme o esquema acima num programa fat inc02.cc a segunda vers ao do fatorial. 2. O programa fat inc02.cc usa if/else em lugar de dois ifs, verique isto. 3. O programa fat inc02.cc est a errado. Experimente calcular o fatorial de um n umero maior do que 12. Analise o erro e o corrija. Solu c ao: fat inc021.cc c oes, v a ao cap tulo 4 para uma breve fat inc02*.cc fazem uso de fun leitura sobre fun c oes para entender a solu c ao. Observa c ao 6 Para que servem as fun c oes As fun c oes servem para quebrar um programa em m odulos e para estabelecer comunica c ao entre os v arios m odulos passando valores entre eles.

3.2.2

Fluxogramas: mapas dos programas

Os esquemas gr acos que usei nas guras (3.1), p agina 81, (3.2), p agina 89, (3.3), p agina 90, se chamam fluxogramas. Eles nos permitem uma visualiza ca o do uxo l ogico. Voc e pode, com aux lio de fluxogramas, representar um programa bastante complexo como se fosse um mapa do programa. N ao pretendo conduzir a discuss ao nesta dire ca o, prero propor a constru ca o de programas menos complexos inicialmente. Quando voc e se encontrar no n vel de programa c ao que exija uma tal visualiza ca o, voc e ter a tamb em experi encia para construir este planejamento visual a partir dos casos simples discutidos aqui. Os itens de um uxograma correspondem ` as fun co es da linguagem, ou algumas vezes a diversos programas aglomerados num u nico uxograma, e uma arte importante a de produzir oxogramas que evoluiu para uma metalinguagem de programa ca o chamada (entre outros nomes) UML - Universal Modeling Language - programar independentemente da linguagem. N ao voltarei a tratar disto neste livro. ao representadas por c rculos ou elipses; entrada de dados s condicionais s ao representados pelos paralelogramos com lados n ao horizontais, chamados de diamantes; processos s ao representados por ret angulos com um lado horizontal.

88

Habitue-se a fazer fluxogramas dos seus programas para adquirir mais experi encia com o uso deles, voc e logo ver a que e uma forma interessante de analisar a l ogica de um programa. As guras (3.1),(3.2) (3.3) mostram a evolu ca o de um programa, ver p aginas 81, 89, 90. A gura 3.1 representa o teste l ogico mais simples, um u nico if() sem alternativas. A gura 3.2 cont em o planejamento para o caso de n < 0 indicando que o processo deve parar, com uma alternativa (else) para caso de que n! ultrapasse a capacidade da m aquina. Observe que no primeiro caso o processo para, apenas se n > 10, mas a m aquina tentaria calcular (1)!, o fatorial de n umero negativo. um A gura 3.3 contempla uma entrada de dados e uma sa da de dados. E programa completo.

F (n < 0)
senao

F (n > 13000)
senao

pare();

fatorial(n)

Figura 3.2:

Fluxograma com dois if()

Exerc cios 31 (Tutorial) Fluxograma 1. Os programas terceiro02.cc terceiro03*.cc terceiro04.cc todos tem a estrutura l ogica da gura (3.2) p agina 89. Construa os uxogramas para os programas terceiro02.cc terceiro03*.cc terceiro04.cc. 2. Fa ca um uxograma para a divis~ ao euclidiana considerando uma entrada de dados com dois n umeros dividendo, divisor. Quando for necess ario usar dois if(), um completando o outro, ent ao possivelmente e melhor usar if()/ else: if(verdadeiro) fa ca; else fa ca outra coisa 89

else ( n < 0 ) ( n > 13)

else

fatorial(n) pare();

Figura 3.3:

Fluxograma com dois if(), uma entrada e uma sa da dados

O exemplo do fatorial caria agora melhor descrito assim:


if(n >= 0) cout << n << fatorial(n) << endl; else cout << n~ ao h a fatorial de n umeros negativos << endl;

supondo que fatorial() seja uma fun ca o denida em alguma biblioteca. Exerc cios 32 (Tutorial) Melhorando o fatorial 1. imprimindo o falso Experimente o programa l ogica01.cc, rode-o e depois leia-o. Este programa imprime tanto o falso como o verdadeiro (depende da resposta que voc e der). 2. imprimindo o falso Observe a express ao (primeiro==segundo) dada como par ametro ao imprima. Substitua (primeiro==segundo) por (primeiro=segundo), rode o programa e analise a diferen ca. Leia o programa terceiro014.cc. Substitua tamb em como par ametro do if() e descubra que diferen ca isto faz. 3. Estude o programa fatorial04.cc: rode e leia o programa. Experimente retirar algumas chaves (pares de chaves) para ver a diferen ca. Ignore por enquanto as outras vers oes de fatorial. 4. Em logica01.cc a fun c ao if() que ir a avaliar uma express ao . O programa vai imprimir o valor do falso e do verdadeiro. Rode e depois leia o programa. 90

5. Em logica01.cc h a um truque para escrever linhas longas evitando a quebra de linha, mudan ca de linha. O coment ario (100), no programa explica isto. Leia e fa ca algumas experi encias eliminando quebras de linha com a contra-barra. 6. O programa logica01.cc n ao usa vari aveis. Se voc e eliminar o s mbolo de coment ario no in cio da linha com coment ario (10), o compilador vai lhe dizer que estas vari aveis n ao foram usadas. N ao ser a um erro, apenas uma advert encia. 7. Altere logica01.cc fazendo uso das vari aveis declaradas na linha com coment ario (10). Solu c ao: logica02.cc 8. Em logica02.cc a fun c ao if() que ir a avaliar uma express ao (observe que o par ametro e abstrato...). Experimente fornecer ao programa dados n ao num ericos, frases. 9. (primeiro == segundo) e uma opera c ao l ogica seguida de uma14 avalia ca o: os par enteses. Coloque um alguns imprimas em logica01.cc para testar os valores de (primeiro == segundo). 10. Rode diversas vezes o programa e tente encontrar uma lei de forma c ao para o valor de (primeiro==segundo) 11. No programa logica01 1.cc usei (primeiro = segundo) como par ametro do if(). Verique que o compilador g++ vai avis a-lo do risco, mas o programa vai rodar. Se voc e fornecer ao programa os n umeros 1,0 nesta seq u encia, ele responder a que os n umeros s ao iguais. Por que ? A resposta est a nos coment arios do programa. 12. erros que enganam o compilador. Rode um programa com o seguinte comando: imprime(primeiro=segundo) depois de denidas as vari aveis, naturalmente, e observe o coment ario absurdo do compilador. Objetivo do exerc cio: prepar a-lo para procurar erros em local diferente do apontado pelo compilador... 13. efeitos colaterais. Escreva um programa que iguale duas vari aveis inteiras, se elas forem diferentes, e nada fa ca se elas forem iguais.
14 um

de par enteses, em C++ e um operador, ele for ca a avalia ca o do seu conte udo

91

Observa c ao 7 Erros l ogicos, de sintaxe e efeito colateral Num dos exerc cios anteriores lhe pedi que substitu sse (primeiro==segundo) por (primeiro=segundo). Este e um exemplo de erro l ogico que n ao e erro de sintaxe. A express ao (primeiro=segundo) se constitui de dois operadores: operador atribui c ao, operador avalia c ao. No nosso sistema de computadores do tipo seq uenciais,(Von Neuman), a CPU15 tem que fazer opera c oes em seq u encia, come cando sempre da parte interna de uma express ao no modelo matem atico de fun c ao composta: (entrada) x : x f (g (h(x))) = f (g (y )) = f (z ) = w (sa da) w (3.1) (3.2) (3.3)

A CPU se utiliza de um sistema de mem oria onde c alculos intermedi arios s ao guardados. Se voc e tiver a curiosidade de ler um trecho de programa em assembler, ver a uma lista de opera c oes semelhantes ` a seq u encia de equa c oes acima, apenas usando palavras como sto, abrevia c ao de store, do ingl es, que signica guardar, seguida de um endere co de mem oria. Este sistema continua em uso, apenas o programador escreve numa linguagem de alto n vel, como C + +, e o compilador da linguagem cria o programa no assembler da m aguina, quando o c odigo escrito pelo programador for compilado. Qualquer linguagem de processamento (do tipo imperativo)16 faz uso deste sistema, de acordo com o modelo acima descrito, no c alculo de w, w e conseq u encia dos c alculos intermedi arios sobre as vari aveis x, y, z . Sendo wau ltima, e passada para o standard output, (sa da padr ao) que pode ser o pr oximo comando a ser processado, (observe que x est a sendo passado para o pr oximo comando, assim como y ) o v deo; a impressora; um arquivo em disco, etc... No caso (primeiro=segundo), o resultado desta opera c ao composta e o valor de segundo. Porque a opera c ao mais interna e a atribui c ao que, ao ser executada, produz este valor (faz parte da engenharia do compilador C++).
de processamento central basicamente dois tipos de linguagens, imperativas e declarativas prolog e um exemplo de linguagem declarativa.
16 h a 15 unidade

92

Todas as opera c oes ao serem executadas produzem valores e este e o segredo dos efeitos colaterais: nem sempre este valor produzido e claro, muitas vezes sendo um valor secund ario efetuado por uma opera c ao primitiva pode dar um ganho no programa, em velocidade17 . Essencialmente verdadeiro, tudo isto. Muito bonito se n ao produzisse algoritmos dif ceis de serem lidos e interpretados. Esta velocidade pode ser consumida depois durante o trabalho de manuten c ao de um programa cheio de atalhos tortuosos. Embora se (primeiro=segundo) possa ser considerado um erro de sintaxe, o g++18 n ao tem condi c oes de detectar isto, uma vez que o resultado desta opera c ao, sendo uma express ao v alida para o g++, pode ser passada como par ametro ` a fun c ao if(). Ex mios programadores usam estes artif cios para conseguirem melhor desempenho em seus programas e infelizmente n ao conseguem mais entend e-los duas ou tr es semanas depois... (nem eles e nem os seus companheiros de equipe), o que d a exist encia, provavelmente, a sistemas operacionais bonitos, mas emperrados, e cheios de erros... praticamente imposs veis de serem encontrados, at e porque n ao s ao erros, s ao efeitos colaterais. Os efeitos colaterais19 s ao um risco em programa c ao e sem d uvida devem ser evitados a todo custo. Programa c ao n ao precisa mais ser econ omica, como nos primeiros dias de sua exist encia. A economia a ser feita deve ser no trabalho do programador que, e o item caro nesta area de trabalho. Computadores s ao relativamente baratos, tem bastante mem oria e velocidade, o que permite que os programas possam ser mais leg veis e f aceis de serem mantidos. Programa c ao e coisa s eria, n ao e brincadeira, de um programa mal feito podem depender vidas, elei c oes... N ao posso deixar de convid a-lo a fazer experi encias diversas para descobrir detalhes sobre os efeitos colaterais ... eles s ao m ultiplos e trazem preciosas li c oes que podem evitar horas perdidas na corre c ao de programas, muito em particular a troca de == por =. S ao exemplos dos tais insetos, (bugs), que infectam programas enormes. Mas nenhum programador ca imune ` a tenta c ao de um bom efeito colateral. Quando usar um, deixe marcado, coloque coment arios que eles n ao custam absolutamente nada e podem evitar perdas de tempo depois. C++ e uma linguagem imperativa, quer dizer que nela existem apenas duas op co es: Dada uma rela ca o, ela ser a: verdadeira ou, exclusivamente,
pode tamb em criar programas que nem o autor consiga entender uma semana depois. escrever sempre g++ em vez de compilador da linguagem C++ de agora em diante 19 E dif cil se livrar totalmente de efeitos colaterais, mas quando usados eles devem ser documentados.
18 vou 17 Mas

falsa.

93

Para o g++, falso ca caracterizado pelo zero, qualquer outro valor diferente de zero representa o verdadeiro. Este e um ponto que voc e deve incorporar em sua l ogica pessoal ao se tornar um C++-programmer... Exerc cios 33 (Tutorial) Efeitos colaterais e coment arios Programar sem efeitos colaterais e dif cil. No momento em que voc e se tornar um bom programador, dicilmente vai evitar de faz e-lo, entretanto, n ao se esque ca de que uma boa companhia para um efeito colateral e um coment ario, que explique o que est a acontecendo, inclusive para voc e mesmo, algum tempo depois... Nos exerc cios abaixo estou lhe dando exemplos de efeitos colaterais, habituese, aqui nos exerc cios, a escrever o c odigo incluindo os coment arios explicativos, mesmo que o exerc cio n ao lhe pe ca para faz e-lo. 1. Escreva alguns pequenos programas, (reciclagem de logica01.cc), para testar que, poss veis combina c oes de dos operadores =, ==, tem sentido, como em: (primeiro==segundo=primeiro) e determine o valor que resulta destas combina c oes. Use printf() para ver o resultado. Solu c ao: logica02.cc 2. Justique o resultado impresso por logica02.cc. 3. * Altere logica02.cc para que o programa sempre minta: quando os n umeros forem iguais, ele responda que n ao s ao e quando forem iguais ele responda que n ao s ao. Sugest ao: escolha, no capitulo 5, algum operador l ogico adequado! Solu c ao: logica021.cc 4. Construa um programa que pe ca dois n umeros mas que sempre o teste do se seja zero, (falso), qualquer que sejam os valores atribu dos ` as duas vari aveis. Justique como este programa pode servir para derrotar um candidato nas elei c oes eletr onicas. 5. Rode e leia sonho.cc. Fa ca outros programas conversacionais, como sonho.cc, para adquirir pr atica com if()/else. Leia sonho01.cc.

94

3.3

La cos com while()

La cos s ao um tipo de estrutura de uxo de dados em que alguma coisa acontece durante algum tempo. H a diversas formas de contruir la cos em C++, aqui vamos estudar while, cuja tradu ca o e enquanto. H a autores que dizem que alguma a c ao se repete. Isto e inexato porque a maioria das vezes a a c ao sofre modica co es que s ao testadas e, dependendo do resultado do teste, outras a co es continuam a ser executadas, mas raramente s ao repeti co es. enquanto(o teste for verdadeiro). . . Por exemplo, enquanto (estiver na minha frente) { eu vou te olhar nos olhos; ai! maldosa, voc^ e aos poucos; aos poucos se afasta; } Claro, perderemos de vista o olhar quando (os olhos sairem do ao alcance dos nossos). Vamos ver alguns exemplos menos sublimes.

Observa c ao 8 Letra mai uscula ou min uscula Observe que while() sempre se escreve com letra min uscula, mesmo no in cio de uma frase. C++ n ao entenderia While(). Esta e uma diferen ca fundamental entre C++ e Pascal. Em Pascal n ao h a diferen ca entre letra mai uscula ou min uscula, em C++ tem. Dizemos que C++ e sens vel ` a caixa alta/caixa baixa, faz diferen ca entre letra mai uscula e m nuscula. Portanto while() e diferente de While(), e While() n ao existe em C++. A fun ca o while() analisa uma express ao e, se ela for verdadeira, executa o comando que vem em seguida. Estude exemplos nos programas logica06 63.cc, logica06 64.cc, logica06 7.cc, logica06 71.cc

3.3.1

Como e que funciona ?

Leia o arquivo sequencia.cc para acompanhar o que estamos dizendo. while() e uma fun ca o, (leia a respeito de fun co es no Cap tulo 4, leia rapidinho e volte logo para c a). As fun co es denem m odulos de computa ca o, ou ainda blocos l ogicos20 . Depois do par ametro (i < 10) tem um par { } marcando o m odulo: o conjunto de comandos que ser ao executados sob controle de while(). Pode ser um u nico comando, neste caso o par de chaves e dispens avel, mas coloc a-lo algumas vezes torna o programa mais l egivel, decida como fazer.
20 Falamos

de blocos l ogicos no Cap tulo 1.

95

while(i < 10) os comandos que cam neste m odulo ser ao executados. Um deles e i = i + 1; e ele altera o valor de i a cada passo do la co. Quando (i < 10) se tornar falso, isto e, quando i=10, o controle do while() se rompe e o valor que estiver acumulado dentro de soma ser a impresso. Por exemplo, o seguinte algoritmo calcula a soma dos 9 primeiros n umeros inteiros estritamente positivos (a partir de 1). Observe os coment arios logo a seguir. A numera ca o dos coment arios coincide com a numera ca o das linhas do programa. Este programa est a no arquivo

(1) (2) (3) (4) (5) (6) (7)

soma = 0 i = 1 while( i < 10 ) { soma = soma i = i + 1; }

i;

Figura 3.4:

while()

sequencia.cc. Leia, compile e rode. Coment arios: 1. Inicializa vari avel. Inicializa a vari avel soma com zero. Estamos come cando a discutir processamento de dados soma e um buffer, um local onde se armazenam dados para uso posterior. Alguns diriam que soma e um acumulador. Os valores a serem somados v ao ser acumulados nesta vari avel, logo ela tem que ser inicializada com zero. Se f ossemos fazer multiplica co es sucessivas, a inicializa ca o do buffer se faria com 1. Porque, zero e o elemento neutro da adi ca o, e

um e o elemento neutro da multiplica ca o.

96

2. Inicializa vari avel. Inicializa a vari avel i com 1, porque e um contador. N os, os humanos, normalmente, contamos de um em diante. N ao se esque ca de que C++ conta de zero em diante. 21 . Dizemos que C++ e de base 0. Fizemos um coment ario t pico de programador de C++ cl assico. Hoje tem bastante mem oria e devemos fazer programas que quem claros. Algumas vezes ser a melhor come car de 1, apesar de que C++ prera come car de zero. Ignore esta prefer encia de C++ e deixe espa co vago na mem oria, se o programa car mais claro, perder 4 bytes22 em fun ca o da clareza, n ao e uma perda, e um ganho. ca o while() e uma fun ca o que recebe uma vari avel 3. Teste l ogico. A fun l ogica, com valores 0,1. Verica se i passa de 10, quando isto acontecer encerra o la co. A vari avel i e23 um contador. 4. Come co do bloco l ogico. { (abre chave) marca o come co de um bloco l ogico. 5. Atualiza vari avel. Incrementa soma com o valor de i; avel i descreve os 6. Atualiza vari avel. Incrementa i de uma unidade. A vari termos de uma progress ao aritm etica de raz ao 1. Estou usando o atalho i++ que e equivalente a i = i + 1 como est a indicado no coment ario. 7. Fim do bloco l ogico. } (fecha chave) marca o ponto nal de um bloco l ogico. Uma das diculdades do iniciante em computa ca o s ao os comandos nos itens (5) e (6). N ao se tratam de igualdades matem aticas ou equa co es, s ao comandos. O operador =, em algumas linguagens de computador, signica uma atribui ca o. H a linguagens de computador que t em um s mbolo diferente para este operador, em algumas e uma seta, em outras, como Pascal, Maple, MuPAD, e o s mbolo := em C++ soma = soma + i; Assim soma = soma + i e um comando que se constitui da composi ca o de dois operadores: primeira opera ca o a ser executada soma + i que adiciona o valor de i ao valor de soma;
21 Isto n ao interessa muito aqui s o e importante quando se tratar de vetores, mas se preocupe com este fato e entenda isto no Cap tulo 5 22 Porque um inteiro, no caso o zero, ocupa 4 bytes 23 Pess ma escolha de nome para vari avel, porque o autor n ao escolheu contador em vez de i, caria mais claro.

em Pascal soma := soma + i;

97

segunda opera ca o a ser executada soma = soma + i que atribui o valor calculado anteriormente, soma + i ` a soma, alterando, assim, o valor guardado em soma. A linguagem Pascal24 induziu o verbo recebe para mostrar que a express ao soma = soma + i, escrita, em Pascal soma := soma + i n ao era uma equa c ao matem atica. Programando em C++ nada o impede de falar soma recebe i quando disser esta senten ca. Anal Wirth construiu Pascal como um exemplo do seu trabalho de professor universit ario, e podemos usar livremente as suas id eias para melhor entender os conceitos de programa ca o25. Use free pascal! O la co descrito abaixo vai ser executado 9 vezes, se a vari avel i for inicializada com o valor 1, antes da entrada do la co. while( i < 11); Exerc cios 34 (Tutorial) An alise do programa while() 1. O programa while.cc vai lhe mostrar o que acontece com cada uma das vari aveis ao longo de um la co. Rode o programa. Ele cria um quadro mostrando, a cada passo, qual e o valor de soma, do acr escimo e do valor atualizado de soma. 2. O programa while.cc deixa o status da opera c ao colado comum dos valores, acrescente um espa co na impress ao. 3. Experimente, rode, leia o programa, rode o programa enquanto o mantem editado em um terminal para acompanhar o que acontece. 4. Supondo que voc e tenha criado o execut avel prog, rode prog > teste e d e enter quando n ao acontecer nada. Depois edite o arquivo teste. 5. Por que ser a que houve uma aparente travada no programa no caso anterior ? Leia os coment arios dentro do programa. 6. O programa while01.cc imprime os dados com tabula c ao e com alguma formata c ao dos dados. As etiquetas para fazer isto se encontram na biblioteca iomanip, leia a observa c ao (30) no programa para aprender como usar estas mensagens a serem enviadas para cout. Melhore o programa. ca outras experi encias para descobrir como funciona a tab7. tabula c ao Fa ula c ao. 8. Se voc e tiver joe
foi construida por Niklaus Wirth, em 1970. mulnaticional deve ganhar por dia o que Wirth recebe ou ter a recebido durante toda a sua vida, vendendo o que ele construiu.
25 Uma 24 Que

98

Compile:

gcc -Wall -oprog while.cc

Dentro do joe acione ESC !, ele vai perguntar-lhe Program to run: resoponda: prog. Termine o programa com <enter>, como ele pede. Voc e est a editando a sa da de dados do programa com joe. Com Ctrl K X voc e pode guardar o resultado num arquivo que lhe interesse. 9. formata c ao de dados com printf() O programa while02.cc imprime apenas um peda c ao da palavra continua, mas ela foi denida corretamente. O respons avel e o formatador %.7s. Altere de 7para 12 e rode o programa. 10. formata c ao de dados com printf() O signicado do pontona m ascara de forma c ao. Tire o ponto para ver o resultado (tire em alguns e deixe nos outros). 11. formata c ao de dados com printf() Estude como while02.cc cria os dados tabulados, usando uma express ao a.b antes do tipo de dados, d ou s. No programa n ao tem a, tem apenas .b. Experimente colocar um valor inteiro para a, por exemplo 0.12%d. 12. tabula c ao Fa ca outras experi encias para descobrir como funciona a tabula c ao. Alguns dos exerc cios acima lhe mostram uma alternativa para formata ca o de dados usando uma fun ca o da antiga linguagem C que se encontra tamb em dispon vel para C++. Entretanto, tudo que se pode fazer com printf() tamb em se pode obter com usando as etiquetas de formata ca o da biblioteca iomanip. No coment ario (30) de while01.cc voc e encontra mais informa co es de como usar esta biblioteca. O la co, em while.cc calcula a soma dos termos de uma progress ao aritm etica de raz ao 1, desde o primeiro termo 1 at e o termo 10. Observe na Figura (3.5), o uxograma correspondente ao programa while.cc. Leia e rode o programa fatorial02.cc, ele d a um exemplo de while() com o problema do fatorial. Exerc cios 35 (Tutorial) Sucess oes, seq u encias 1. Altere sequencia.cc para imprimir apenas os termos da progress ao aritm etica. Solu c ao: sequencia01.cc 99

Chame joe num terminal;

F i < 11

imprima soma

soma = soma + i; i = i + 1;

Figura 3.5:

Fluxograma de uma soma - um la co

2. Testando com uso de coment arios Se voc e n ao tiver observado, verique isto agora, o programa sequencia01.cc foi obtido de sequencia.cc apenas com o uso de coment arios. Esta e uma forma u til de alterar programas para testar parte dos resultados. ao usa a vari avel 3. O compilador n ao reclamou O programa sequencia01.cc n soma e o compilador n ao reclama. Porque? ario (30) Solu c ao: coment 4. Melhore sequencia01.cc retirando o que for in util. 5. Altere sequencia01.cc para imprimir os termos de uma progress ao aritm etica de raz ao 3.5. Solu c ao: sequencia02.cc 6. Melhore a formata c ao de dados do programa sequencia02.cc 7. Altere sequencia02.cc para imprimir os termos de uma progress ao aritm etica de raz ao 3.5 cujo primeiro termo seja 5. Solu c ao: sequencia03.cc 8. Escreva um programa que imprima os termos de uma p.a. recebendo o primeiro termo, a raz ao e o n umero de termos pelo teclado. Solu c ao: logica07.cc 9. Programa p essimo, logica07.cc. Defeitos: Repete mensagens, o coment ario (50).

Aparecem n umeros extranhos... coment ario (60). 100

Experimente usar raz ao negativa! e descubra porque o programa n ao imprime nada. Coment ario (70) Melhore o programa. 10. Layout do programa (a) Melhore o programa logica07.cc criando mensagens e di alogos com o usu ario; (b) Melhore programa logica07.cc para que ele imprima os dados da p.a. em linhas separadas. Acrescente tamb em linhas separadoras como =============== c ao (c) Use a m etodo limpa janela() para limpar o terreno e tirar a polui visual da tela. Este m etodo, limpa janela(), est a denida na biblioteca Ambiente.h; (d) Use o m etodo apeteco2() para provocar paradas na execu c ao do programa e permitir que o usu ario leia melhor o conte udo das mensagens, prosseguindo quando lhe parecer adequado. apeteco() est a denido na biblioteca Ambiente.h. Verique que h a dois tipos de apeteco(). Solu c ao: logica07 1.cc 11. O programa logica07 1.cc est a errado. ario (30). Solu c ao: coment 12. Reutilize programa logica07.cc para calcular os termos de uma p.g. solu c ao errada: sequencia04.cc 13. Compile o programa sequencia04.cc, o compilador vai observar que tem um erro (erro secund ario). Leia o programa e corrija o erro, ele est a registrado num coment ario. 14. Experimente rodar sequencia04.cc dando o n umero de termos = 30. Analise o resultado. Altere sequencia04.cc com as instru c oes que se encontram dentro do programa, procure o coment ario (100): troque %f \n por %20.16f \n. Compile, rode e estude a diferen ca. 15. Altere sequencia04.cc de modo que voc e possa ver os termos da progress ao, pausadamente, na tela. Solu c ao: sequencia041.cc 16. Fa ca um programa que compare o que acontece, se voc e colocar 100 reais na poupan ca ou pegar 100 no cheque especial. observe que as vari aveis ter ao que ser do tipo float. Sobre tudo na poupan ca em que o incremento e de 0.5% ao m es! 101

sugest ao estude o programa juros.c solu c ao: sequencia05.cc 17. Fa ca um programa que simule o crivo de Erast otenes (determinar a lista dos n umeros primos). solu c ao: primo.cc Observe que logica07 1.cc e a segunda vers ao de logica07.cc. O primeiro, logica07.cc, cabe inteiramente dentro da tela, sem os coment arios. Ele foi cuidadosamente depurado. Depois, na segunda vers ao, foram inclu das mensagens explicativas ou auxiliares para conduzir o usu ario a fornecer os dados. Como logica07.cc e pequeno e cabe inteiramente na tela, facilmente pudemos encontrar os erros cometidos e corrig -los todos. Depois que um programa estiver funcionando, sem erros, podemos fazer-lhe uma segunda vers ao incluindo enfeites; mensagens de comunica ca o com o usu ario; incluir os coment arios. Tudo isto e necess ario, mesmo que o programa que um pouco maior do que a tela. Agora estamos melhorando um programa que j a funciona, mas teremos controle da situa ca o. Muitas vezes e esta a hora de incluir mais coment arios porque o programa est a funcionando e j a conclu mos os truques para que ele casse menor (os efeitos colaterais). Voc e foi conduzido a estudar a biblioteca ambiente.h. Quase todas as fun co es da linguagem C++ se encontram denidas em alguma biblioteca. A linguagem mesmo, sem as bibliotecas, e m nima. Vamos discutir o assunto biblioteca no Cap tulo 11, e naturalmente voc e pode fazer uma visita a este cap tulo agora, mas retorne r apido para c a. Experimente apagar (j a lhe pedimos que zesse esta experi encia no Cap tulo 1, se voc e j a fez, n ao precisa repetir). # include <stdio.h> que se encontra em todos os programas e depois compil a-lo, estude o que acontece.

3.3.2

Primeiro roda, depois testa

H a ocasi oes em que voc e deseja que o la co primeiro seja executado (fa ca alguma coisa) e somente depois seja feito o teste. Para isto existe a estrutura de controle do while() cuja sintaxe e 102

do { comandos; } while(condicao); neste formato os comandos ser ao inicialmente executados ao nal dos quais ser a vericada a condicao e o la co continuar a sendo executado enquanto a condicao for verdadeira. Em outras palavras, p ara a execu ca o quando condicao for falsa mas primeiro d a uma rodada no la co. Estude um exemplo deste controle de uxo no programa fatorial021.cc. Os programas fatorial02.cc fatorial021.cc s ao equivalentes o que mostra que o uso de while() { }; do { } while(); e uma escolha puramente psicol ogica, mas isto e comum nas linguagens de programa ca o, a presen ca de diversas estruturas para atender ` as necessidade psicol ogicas das distintas programadoras. Como as linguagens naturais, anal, as linguagens articiais t em que ser pleon asticas, programas s ao feitos por humanos para serem lidos por humanos e executados por m aquinas, por tanto devem ser bonitos e claros, e corretos para que as m aquinas os possam executar. E as linguagens de programa ca o devem ser de alto n vel para reduzir o stress no trabalho de escrever programas.

3.4

O controle switch()
Quando quisermos fazer m ultiplas escolhas podemos fazer uma cascata de if()/elses ou usar a fun ca o switch() traduzida por escolha() em traducao.h, leia [13].

Quando se tratar de fazer m ultiplas escolhas h a duas solu co es: uma cascata de if()-elses; a fun ca o switch(). Rode o programa switch01.cc para uma compara ca o. N ao vale a pena ler este programa, basta rod a-lo, ele e um tutorial. Compile e rode: g++ -Wall -oprog switch01.cc ./prog A fun ca o switch() recebe um par ametro que deve ser um inteiro ou um caractere (que no fundo tamb em e inteiro) e seleciona, segundo o seu valor um case, como voc e viu rodando switch01.cc. A sintaxe de switch() e Voc e encontra este texto no arquivo switch.cc, que n ao e um programa, serve apenas para que voc e inclua no seu programa para n ao come car do zero. 103

switch(opcao) { case +: adicao(); break; case *: produto(); break; default : saida(); break; } // fim do switch()

Figura 3.6:

switch()

Em cada op ca o de switch() pode ter uma fun ca o break. Na aus encia de break em um case selecionado, o seguinte ser a executado tamb em. Isto pode ser usado para executar duas op co es que devam funcionar em conjunto, no caso de que a primeira26 seja selecionada. Por exemplo, na vers ao seguinte de switch(), se o case valor2 for selecionado, ser ao executados comando21, comando31.

switch(opcao) { case valor1: comando11; break; case valor2: comando21; case valor3: comando31; break; ... ... ... default: comando; break; } Se default estiver presente, caso nenhum dos anteriores case seja selecionado, ele ser a executado. Observe que a presen ca da fun ca o break no case default, se esta for a u lima op ca o, e desnecess aria, porque, em n ao havendo nenhum case posterior, o controle do processamento j a ir a sair do switch depois de executar o case default, ver switch02.cc.
26 Melhor

dito, uma anterior seja selecionada.

104

Se n ao houver default e nenhum case for selecionado, a fun ca o switch() nada far a. Se n ao houver break em nenhum case, depois que o primeiro for selecionado, todos os casos ser ao tamb em executados. Embora o break seja desnecess ario no default colocado por u ltimo, tenha o h abito de colocar o break, pois voc e poder a alterar a posi ca o do default. Se n ao precisar de break, use coment ario em vez de apag a-lo. Algumas vezes voc e pode precisar de voltar atr as. Observe que as chaves s ao desnecess arias para delimitar os comandos dentro de um case. Desnecess arias, mas voc e pode us a-las, se quiser. Vamos aprender a usar switch() com uma lista de exerc cios. Exerc cios 36 (Tutorial) switch() 1. O programa logica04.cc e antigo, ainda usa uma entrada de dados complicada. Modernize a entrada de dados do programa para usar entrada inteira() denida em ambiente.h Solu c ao: logica041.cc 2. Corrija o programa logica041.cc am de que ele de fato adivinhe que n umero voc e digitou, neste momento ele parece que mistura as coisas. Solu c ao: logica04 1.cc 3. O programa logica04 1.cc tem excesso de apeteco2()s. Apague os desnecess arios. Solu c ao: logica042.cc 4. O case chamado default n ao precisa car na u ltima posi c ao, pode car em qualquer posi c ao. Altere logica042.cc colocando default mais acima, entre os casos. N ao use break no default. Experimente. ario (7) em logica043.cc Solu c ao: leia o coment 5. Rode logica06.cc e depois o leia para vericar porque est a errado. Corrijao. Solu c ao: logica061.cc 6. O programa switch02.cc est a preparado para lhe mostrar que a op c ao default n ao e exclusiva (precisa da fun c ao break). Observe o coment ario (10) dentro do programa. 7. Em switch02.cc, mova a op c ao default para a u tima posi c ao e verique que o break, neste caso e desnecess ario. Entretanto, e aconselh avel mant e-lo porque se voc e decidir alterar a ordem das op c oes, cortar e colar, o break vai junto. Como ele n ao atrapalha, ca a regra, em toda o c ao de switch deve ter break a n ao se que voc e precise que seja diferente. 105

3.5
3.5.1

Os la cos com for()


La cos com for()

Outro m etodo de fazer la cos e o for(): for (i=0; i<10; i=i+1) cout o termo << i+1 << da sequencia e --> << 2*i+3 << endl; que vamos estudar neste par agrafo.

O efeito desta express ao e imprimir sucessivamente os valores do ndice, i+1 e dos valores da sucess ao si = 2 i + 3. Este programa est a implementado em sequencia06.cc.

3.5.2

Calc, C++ interpretado

Nas distribui co es de LinuX existe um programa chamado calc que e muito semelhante com a linguagem C++, mas e interpretado. Isto signica que se voc e escrever um comando em calc, ele imediatamente o executa (interpreta) sem compilar. Isto lhe permite testar linhas de programa ca o da linguagem C++, usando calc. Observe o seguinte exemplo produzido por calc que e gerado pelo arquivo for.calc e que voc e pode executar com calc < for.calc for(i=0; i<=10; i=i+1) printf(o termo %d da sucess~ ao eh s[%d] = %d",i, i, ,2*i+3); O resultado e a listagem dos termos de uma progress ao aritm etica. Uma outra forma de repetir a experi encia acima pode ser a seguinte. Analise os passos: Chame calc numa shell; digite (ou passe o ratinho em cima do texto no arquivo e cole no terminal do calc); for(i=0; i<10; i=i+1) printf(o termo %d da sucess~ ao eh s[%d]=%d\n",i,i,2*i+3); enter; 106

calc < for.calc o o o o o o o o o o 1 termo da sucessao > 3 2 termo da sucessao > 5 3 termo da sucessao > 7 4 termo da sucessao > 9 5 termo da sucessao > 11 6 termo da sucessao > 13 7 termo da sucessao > 15 8 termo da sucessao > 17 9 termo da sucessao > 19 10 termo da sucessao > 21

Figura 3.7:

Usando for() em calc

e voc e ver a se repetir a experi encia acima, se calc estiver instalado em seu sistema. Se n ao estiver, consulte um humano, por perto, para ver como o poder a instalar. . . Esta experi encia e o primeiro exerc cio da lista que vem a seguir. Se calc estiver instalado, voc e pode fazer algumas experi encias interessantes, por exemplo, marque com o ratinho um peda co de programa (um comando, na verdade) e o cole no terminal do calc. O resultado ser a uma avalia ca o imediata do comando. N ao se esque ca de denir, na linha anterior, alguma vari avel que esteja presente dentro do comando. uma forma r E apida de testar peda cos de programas. Exerc cios 37 (Tutorial) Rode usando calc 1. Rode a express ao abaixo com calc for(i=0; i<10; i=i+1) printf(o termo %d da sucess~ ao eh --> %d\n",i+1,2*i+3); Basta chamar calc, escrever o texto acima no terminal do calc e dar um <enter> para ver os termos da progress ao aritm etica se sucedendo no terminal. 2. Porque imprimiu somente at e o 9o e n ao at e o 10o termo ? 3. Altere a express ao para que calc imprima at e o 10o termo. 4. Usando calc apresente os termos de uma progress ao aritm etica de raz ao 0.5 com primeiro termo 3. Solu c ao: for(i=0; i<10; i=i+1) printf(o termo %d da sucess~ ao --> %f\n",i+1,0.5*i-3); 107

3.5.3

Diferen ca entre os m etodos for(), while()

Observe as diferen cas entre while() e for(). Todos os dados necess arios ao funcionamento de for() devem ser fornecidos como par ametros: o valor inicial do contador; o teste para nalizar o processo; o m etodo para fazer incrementos. Em suma, for() exige tr es par ametros. Voc e pode eliminar alguns dos par ametros, mas n ao o ponto-e-v rgula que marca a presen ca deles. Experimente rodar (com calc) for(i=0;;i=i+1) printf(o termo %d da sucess~ ao --> %f\n",i+1,0.5*i-3);

e voc e vai ter que parar o programa com ctrl-C porque n ao cou explicitado um teste de parada: (i < 10) . Este exemplo se encontra no arquivo for01.calc, basta digitar calc < for01.calc para execut a-lo. Pare-o com ctrl-c, mas antes divirta-se monitorando em quanto tempo calc atinge o milhon esimo termo27 da sucess ao. Este exemplo mostra porque muitos programadores preferem for() ` a while(). A fun ca o for() os obriga a incluir o teste de parada do la co, enquanto que o while() n ao tem este dispositivo inclu do na sintaxe sendo comum que nos esque camos de incluir o teste de parada num while(). Em C++ existe um atalho para fazer incrementos do tipo i = i + 1: for(i=0; i<10; i++) printf(o termo %d da sucess~ ao eh --> %d\n", i+1,2*i+3); As duas express oes i = i+1 ; i++ s ao equivalentes. H a v arios atalhos destes tipo reconhecidos pelo gcc que vamos discutir no Cap tulo 5, quando estudarmos os operadores aritm eticos. O seu uso deve ser feito com restri ca o, porque pode tornar o programa ileg vel. Obviamente que o atalho ser a executado com mais rapidez, mas o programa car a mais dif cil de ser lido. Infelizmente eles s ao muito atraentes para que deixemos de us a-los, mas e preciso, pelo menos, colocar coment arios, quando eles forem usados em locais que tornem o programa dif cil de ser compreendido. Ou, simplesmente, sempre colocar coment arios. Um bom h abito e fazer assim:
27 Num

Athlon64 a 3GHz levou 11 segundos (tempo de CPU) medido com top.

108

i++; // i = i + 1 e, desta forma nos beneciamos com um comando r apido e conciso, mas deixamos um aviso do que est a sendo feito. Observe no Cap tulo 11 o que o compilador faz com os coment arios, procure coment arios no ndice remissivo. A principal regra em programa ca o e escrever c odigos claros e bem explicados. Caso contr ario a pr oxima v tima pode ser voc e, que escreveu o programa. Os exerc cios lhe dar ao mais experi encia no uso de for() que mil palavras lhe poderiam dar. Exerc cios 38 (Tutorial) Mais loops 1. Antes de fazer este exerc cio, pesquise no manual do compilador28 como ativar o ctrl-c. Procure tamb em, no ndice remissivo ctrl-c. Isto pode ser feito com uma instru c ao de compila c ao, colocada no cabe calho do programa. Experimente compilar e rodar o programa logica06 6.cc. Ele n ao para nunca, a n ao ser que voc e o pare com ctrl-c. Leia o programa e analise porque isto acontece. Verique o primeiro while(). 2. Altere logica06 6.cc trocando while(1) while (t)

denindo t como inteiro em linha anterior, inicializando com o valor t=1.

Compile e rode o programa. A u nica maneira de par a-lo e com ctrl-c, novamente. Por qu e? 3. Agora troque t por opcao e observe que o programa p ara digitando 0 como op c ao n ao solicitada no menu. Experimente! Observe logica06 61.cc e leia ao nal dos coment arios. da 4. Corrija o programa logica06 61.cc para o menu informar que a sa do programa se d a com opcao = 0 Solu c ao: logica06 62.cc 5. Corrija agora o programa logica06 2.cc para que ele que no ar indenidamente at e que opcao = 0 seja escolhida. Solu c ao: logica06 63.cc 6. Corrija agora o programa logica06 5.cc incluindo no menu a op c ao 0 para que o sistema pare. Solu c ao: logica06 71.cc 7. Por que n ao teria sentido resolver os exerc cios deste bloco usando for()?
compiladores deixam ctrl-c desativados para permitir mais velocidade na execu ca o do programa.
28 Alguns

109

8. Resolva todos os exerc cios deste bloco usando for() para ver que e poss vel (mas ca feio). Solu c ao: logica06 72.cc 9. Traduza logica06 71 p.cc para C++. Solu c ao: logica06 71.cc

3.6

Parando no meio de um bloco.


A fun ca o break for ca uma sa da de um bloco e a fun ca o return() indica o m do programa. O papel de return() est a muito limitado nesta descri ca o, ainda vamos falar mais sobre isto.

3.6.1

Blocos l ogicos

Em C, quando voc e abre uma chave { voc e est a abrindo um bloco l ogico. Quando gcc encontrar a chave-fechando } ele ir a destruir todas as vari aveis locais criadas neste bloco, leia no programa polped01.cc os coment arios (50) e (51). Este programa e um pouco avan cado para quem est a lendo este cap tulo, o que interessa e o bloco l ogico nele denido. Os blocos l ogicos servem, basicamente, para denir feixes de fun co es que precisam ser executadas em conjunto, dentro de la cos. Mas podem ter outras utilidades, at e mesmo para isolar uma parte do programa criando fun co es sem nome, an onimas. Aqui estamos usando este conceito para marcar o conjunto de fun co es que devem ser executadas sob o controle de for() ou while().

3.6.2

Parada for cada, break

J a usei esta fun ca o quando estudei switch() e ali o seu uso e sentido eo mesmo que vou agora descrever aqui. Com freq u encia, dentro de um la co, e preciso interromp e-lo, abruptamente, sem que as demais fun co es sejam executadas. Quem faz isto e a fun ca o break. Ao encontrar esta fun ca o, gcc encerra o processo que estiver sendo executado dentro de um bloco e passa o controle do uxo para a pr oxima fun ca o imediatamente ap os este bloco. A Figura (3.8), p agina 111, e uma ilustra ca o gr aca deste processo. Observe que return() n ao serve para este m, esta fun ca o encerra a execu ca o do programa. exatamente este uso que foi feito do break nos casos dentro do switch(). E Um caso e um bloco l ogico (mesmo que n ao use chaves), e quando houver um break o controle leva o processamento para fora do switch(). Vai sair do la co quando i = 9 sem executar os comandos internos para este valor de i. Este la co resolve, portando, a desigualdade 3i + 1 > 20 110

for(j=0; ( j<100 );j=j+1) { valor = 3*j5; printf("%d ", valor); if(valor > 20) break; } printf("%d",j);

Figura 3.8:
bloco.

Ao encontrar break o uxo e desviado para ` a pr oxima fun ca o externa ao

no conjunto dos inteiros, imprimindo 9, o primeiro n umero inteiro i que a torna verdadeira. Rode o programa logica08.cc, respondendo com 20, para repetir o que acabamos de descrever. Leia tamb em o programa. Nos programas logica08 3.cc zemos uso dos atalhos k-=0.01 equivalente a k = k - 0.01; k+=0.01 equivalente a k = k + 0.01; j++ equivalente a j = j+1. Estude, no Cap tulo 5, sobre atalhos aritm eticos, ou procure no ndice remissivo, atalhos. Exerc cios 39 (Tutorial) Parando para resolver desigualdades 1. Melhore o programa logica08.cc incluindo mensagens adequadas de comunica c ao com usu ario. 2. Escreva todos os coment arios necess arios ` a boa compreens ao do programa logica08.cc. 3. Identique, nos programas logica0*.cc, onde estiverem sendo usados atalhos aritm eticos29 e coloque coment arios explicativos ao lado de cada um deles. 4. Resolva as seguintes desigualdades, usando programas em C. (a) 3k + 2 > 100; k Z;
29 Leia,

no cap tulo 2, sobre estes atalhos.

111

(b) 10 < 3k + 2 < 200; k Z;

(c) 10.5 < 3x + 2 < 20.7; x R;

Solu c ao: logica08 1.c; logica08 2.c; logica08 3.c Para resolver a u ltima desigualdade voc e vai precisar de usar float em vez de int, como tipo de dado. Estude o Cap tulo 5, a respeito de tipos de dados. 5. Melhore os programas logica08 X.cc escrevendo coment arios e incluindo os mon ologos de comunica c ao com o usu ario, paradas, limpezas de tela etc... 6. Melhore os programas logica08 X.cc fazendo que saiam deixando a tela limpa, mas permitindo que o usu ario consiga ler os dados.

3.7

Vocabul ario e resumo do cap tulo

abstra c~ ao, abulo e usado em computa ca o com um sentido muito abstra c ao este voc apropriado, bem diferente da linguagem corrente em que assum alguns aspectos mitol ogicos, difusos e metaf sicos. Em computa ca o e abstrato se for um modelo, quer dizer, se aplicar a uma variedade de exemplos. O primeiro n vel de abstra ca o podemos dizer que foi a inven ca o de vari aveis. Quando dizemos que um numero e do tipo int queremos dizer que qualquer dado deste tipo pode ser associado com esta vari avel. Antes tinhamos que procurar um certo endere co de mem oria para descobrir o que estava l a na guardado. Agora n ao precisamos saber qual e o endere co que esta assoao parecida ciado ` a um numero e aparentemente executamos uma express com express oes matem aticas: um numero = 30 para colocar o valor 30 em um certo local de mem oria da m aquina que em geral ignoramos qual e. O cap tulo 7 aprofunda este conceito de abstra ca o, denindo objetos que tem propriedades.

112

Cap tulo 4

Fun c ao
Em Matem atica, a express ao y = f (x) signica executar sobre x as opera c oes colecionadas sob o nome f , gerando um novo dado que chamamos y ou f (x). V arias linguagens de computa ca o adotaram esta semelhan ca com a Matem atica criando processos chamados fun c oes. Na linguagem C++ tudo e fun ca o, a diferen ca, com a Matematica, e que algumas fun co es n ao produzem um resultado apenas fazem alguma coisa. y e a imagem de x por f . Resumimos no s mbolo f um conjunto de opera co es, numa linguagem de programa ca o ca associada com o nome f uma segmento de mem oria com uma seq u encia de instru co es para serem executadas. O signicado de fun c ao, para uma linguagem de programa ca o n ao e exatamente o mesmo da Matem atica, mas se encontra bem pr oximo no sentido de resumir um conjunto de opera c oes com um s mbolo. Em computa ca o, como em Matem atica, a deni ca o de fun co es acrescenta novos voc abulos ` a linguagem, novos comandos, dizemos em computa ca o. O menor m odulo execut avel e uma fun ca o e qualquer programa se constitu de uma fun ca o principal, main(), que pode chamar uma lista de outras fun co es denidas no mesmo arquivo ou em alguma biblioteca inclu da no come co do arquivo. este o assunto deste cap E tulo.

4.1

As fun c oes e os m etodos

Nesta primeira se ca o vou fazer um pouquinho da hist oria que conduziu as fun c oes a serem os m etodos usados, efetivamente, a partir do cap tulo 7, mas que estamos usando desde o cap tulo 1 ao fazer uso da classe Ambiente. Este e um cap tulo em que voc e vai praticar o uso de fun co es mas vou come car com uma introdu ca o hist orica, vou mostrar-lhe como surgiu o conceito de subrotina que e um precursor do conceito de fun ca o. Se voc e n ao se sentir motivado para a leitura, passe para a pr oxima se ca o em que vou ser mais pr atico deixando a primeira se ca o para uma leitura posterior. No come co os programas eram longas tiras1 de comandos.
1 no come co mesmo, com Babage, eram tiras de papel com buraquinhos, os buraquinhos eram os comandos, ver [6, cap tulo 1] ou [17, buscar Babage].

113

Quando veio Fortran, a primeira linguagem de alto n vel, cada comando era uma linha. As linhas eram numeradas, e havia um importante comando, gosub2 que permitia que saltassemos de uma linha para outra. Nesta epoca se tornou poss vel dar um pouco mais de estrutura aos programas: havia a parte do programa de 000 at e 1000; uma outra parte do programa que ia de 1001 at e 10000; possivelmente uma outra parte do programa que indo de 20000 at e 50000. e assim podiamos identicar blocos nos programas, seriam as fun co es que temos hoje. Por exemplo, um conjunto de opera co es que sempre fosse necess ario executar caria nas linhas de 1010 at e 1050, e outra nas linhas de 1100 at e 1150. A numera ca o podia dar saltos o que ajudava a denir areas do programa. As linhas tinam que ser numeradas em ordem crescente, mas n ao de um em um. A numera ca o podia dar saltos, e isto era importante porque poderiamos assim inserir algumas coisas que estivessem faltando. Havia mesmo um h abito de numerar de 10 em 10, j a separando espa co para os remendos. Voc e pode ver que isto aconteceu no programa basic.txt que aparece na gura (4.1). Este programa se encontra no disco que acompanha o livro. Na u ltima linha de um bloco em que estivesse denida uma rotina, tinha que ter o comando return para voltar para o ponto imediatamente posterior ao gosub de onde se houvesse sa do. O programa em BASIC, gura (g. 4.1) pode ser interpretado com yabasic3 que e distribuido com Debian/Gnu/Linux. O programa vai da linha 10 a 70, e termina nesta linha com o comando exit. As linhas posteriores ` a 70 formam uma subrotina. Em algumas implmenta co es de BASIC se usa quit para sair do programa, poriso eu deixei a linha 70 com dois formatos que voc e pode escolher caso o interpretador acuse erro nesta linha. Nas linhas 500-501 podemos ver um bloco, uma sub-rotina, que dene a fun ca o 3x + 5 f (x) = 1 + x2 que e chamada em dois pontos do programa, na linha 20 e na linha 50 para calcular o valor de y . O programa se encontra no arquivo basic.txt A primeira linha do programa e um coment ario informando como rodar o programa. Instale yabasic e rode o programa para ver como funciona. Para rodar, basta digitar: yabasic basic.txt A forma de fazer coment arios em yabasic e parecida com a que se usa em C++, mas tamb em tem o comando rem, colocado no in cio da linha, transformandoa em coment ario.
2 gosub 3 yabasic

signica v a para a subrotina quer dizer yet another basic, porque h a tantos. . .

114

Figura 4.1:

Um programa em BASIC

Eu estou usando BASIC neste exemplo, mas poderia ter usado FORTRAN que tamb em e distribuido em Debian/Gnu/Linux. Vou transformar este programa em dois programas numa sucess ao de melhoras que voc e poder a agora acompanhar. Exerc cios 40 (Tutorial) Transformando sub-rotina em fun c ao 1. Voc e roda o programa basic.txt com yabasic assim: yabasic basic.txt experimente, se voc e tiver o yabsic4 instalado. 2. basic01.cc Leia o programa e rode-o, possivelmente, para comprar com o resultado de basic.txt. Veja as diferen cas Em C++ se dene sempre as vari aveis antes de come car a us a-las.

A sub-rotina que ca nas linhas 500-501 de basic.txt est a representada em basic01.cc pela fun c ao f. As subrotinas dos programas em BASIC s ao fun c oes num programa em C++. Observe que uma fun c ao em C++ n ao precisa terminar com o comando return(). Se terminar, n ao tem o mesmo efeito que o return que se encontra na linha 501 de basic.txt. O efeito do return do BASIC est a automatizado na deni c ao de fun c ao, sempre que uma fun c ao encerra a sua execu c ao, o controle do programa retorna para o ponto seguinte ` aquele em que a fun c ao foi chamada. Procure entender isto.
pelo menos um outro BASIC nas distribui co es Linux, bwbasic. Altere basic.txt substituindo exit por quit e rode bwbasic basic.txt
4 H a

115

3. basic02.cc Leia o programa e fa ca uma lista das diferen cas entre este e o anterior, basic01.cc. solu c ao leia os coment arios em basic02.cc

4.2

A estrutura de uma fun c ao

Deni c ao 1 Estrutura de uma fun c ao tipo de dado nome da funcao( lista de parametros) { bloco de comandos que a fun c ao deve executar return(dado do tipo especicado) } Se o tipo de dados for void ent ao n ao pode haver o comando return(), se houver vai gerar um erro de sintaxe. O programa funcao void.cc mostra como fun co es do tipo void n ao devem ter o comando return(), leia e rode o programa, tamb em fa ca o que est a sugerido no coment ario da fun ca o testando(). Exemplo 2 Fun c ao Leia o programa basic01.cc. Nele voc e encontra, na parte nal, a fun c ao da gura ( 4.2) p agina 116, H a uma diferen ca entre o texto que se encontra

Figura 4.2:

Uma fun ca o

na gura ( 4.2) e que est a no arquivo basic01.cc. A diferen ca e intencional porque vai fazer parte da discuss ao que vou agora fazer sobre a estrutura desta fun c ao e vou assim mostrar-lhe uma forma opcional de programar. 116

tipo de dado e float. Quer dizer que o par ametro do return() dever a ser um n umero real, corrigindo, um dado do tipo float5; nome da fun ca o f ; bloco de comandos que a fun c ao deve executar est a marcado por abre/fecha chaves e neste caso se comp oes de dois comandos calcular o valor de y ; return(y). Observa c ao 9 (Vari avel local) Vari aveis locais a um bloco
H a uma diferen ca entre a gura (4.2) e a presente discuss ao, a vari avel local y. No arquivo basic01.cc n ao tem a vari avel y e voc e pode ver que ela e perfeitamente desnecess aria. Ainda vou retornar, v arias vezes, ao assunto vari avel local, mas est a no momento de chamar sua aten c ao para estas vari aveis. Abrir e fechar chaves, em C++, cria um bloco l ogico, quer dizer, faz com que o compilador reserve um setor de mem oria tempor ario para registrar a tabela de vari aveis relativa a este bloco, que ser a destruida quando for ultrapassado a chave-fechando. Quer dizer que a vari avel y tem exist encia ef emera, ser a usada apenas para facilitar a compreens ao de quem l e o programa, e tamb em nos c alculos internos deste bloco, e n ao vai tornar o programa muito mais pesado. H a v arias raz oes de natureza pedag ogica ou organizacional que justicam a presen ca de vari aveis locais, a principal delas certamente e facilitar a compreens ao do algoritmo. Vou dar um exemplo francamente exagerado, para que voc e observe e decida como fazer em casos concretos. float f(float x) { float numerador = (3*x + 5); float denominador = (1 + x*x); float y = numerador/denominador; return(y); }

em que usei, para calcular y, duas vari aveis guardando os c alculos intermedi arios. Se eu quiser trocar apenas o numerador vai car claro para mim o que devo procurar, ou para qualquer outro colaborador que venha a alterar este programa. A frase troque o numerador na fun ca o f, n ao pode deixar ningu em em d uvida sobre o que fazer. Como eu comecei dizendo, e um exemplo exagerado.

Usamos uma maneira de falar bloco de comandos. Em C ++ quando voce abre/fecha chaves voc e cria um bloco l ogico. A linguagem identica o que estiver entre chaves como um u nico comando. Assim, ao abrir chaves, voc e cria um bloco l ogico e a linguagem permite que, neste bloco, voc e dena vari aveis locais ao bloco. Estas vari aveis ser ao destruidas quando o programa sair do bloco, ao fechar as chaves. A fun c ao que denimos poderia ser mais simples:
5 Vou evitar este coment ario no futuro, que que claro: em computa ca o n ao h a n umeros reais, ou inteiros e sim tipos de dados que simulam estes n umeros.

117

float f(float x) { return((3*x + 5)/(1 + x*x)); } sem denir a vari avel local y . Prero fazer desta maneira, usando a vari avel local y, porque acho que ca mais leg vel, e a leg bilidade de um programa e um objetivo em si mesmo. Retornando ao programa basic01.cc, dentro da fun c ao main() z uma chamada ` a fun c ao f passando-lhe o valor da vari avel x. O programa que se encontra na gura (4.3) p agina 118, e o mais simples que e poss vel se fazer. ele, simplesmente, imprime, na tela, o valor de f (10)

Figura 4.3:

O menor programa

da fun c ao f denida dentro do programa. este o esquema l E ogico de qualquer linguagem de programa ca o imperativa das que usamos hoje. Mudam um poco os nomes, nem todas as linguagens tem uma fun ca o principal, mas todas t em algo equivalente, que chama os pequenos algoritmos que comp oem o programa. Uma fun ca o, em C ++ executa o esquema seguinte: x y 118
f

(4.1)

y = f (x) y tipo de dado produzido por f x tipo de dado que f recebe

(4.2) (4.3) (4.4)

como em Matem atica. E tamb em, como em Matem atica, uma fun ca o pode ter v arios par ametros. Em C++ as fun co es devolvem um u nico resultado (ou nenhum), tem um tipo de fun ca o muito estranho, s ao as fun c oes vazias, de tipo void. Elas s ao mudas, n ao devolvem nada. Voltaremos a discutir este tipo de fun ca o mais a frente. Elas s ao estranhas se comparadas com o conceito fun c ao da Matem atica. Para a Computa ca o elas s ao apenas um algoritmo que executa alguma coisa, nada estranho. Podemos ver aqui uma outra vantagem de Pascal sobre C++, muito pequena para justicar que se programe em Pascal... em Pascal h a dois tipos de rotinas: function, procedure. As procedures s ao as fun co es do tipo void que usamos em C++.

4.2.1

Passando valores

Com as fun co es do tipo y = f (x), que n ao sejam6 de tipo void, voc e pode fazer composi ca o de fun co es como e comum em Matem atica: w = f (g (h(x))) (4.5)

que poderia ser escrito de forma menos econ omica, apresentando as vari aveis intermedi arias: y = h(x); z = g (y ); w = f (z ); (4.6) (4.7) (4.8)

egivel. E tenha pesente que, ao usar Menos econ omica, por em muito mais l vari aveis locais, voc e j a estar a fazendo economia, uma vez que este tipo de vari avel tem uma vida ef emera: quando o programa sai do escopo do bloco em que elas estiverem denidas, elas s ao destru das. A economia e a de tempo para entender o que voc e tiver escrito e planejado... dias atr as. Se voc e escrever um programa muito simples, muito otimizado, poder a perder, depois, horas para conseguir entender o que o programa faz, mesmo tendo sido voc e que o fez. Procure se lembrar sempre disto. preciso ter cuidado as facilidades que se encontram ` E a nossa disposi ca o, porque elas podem criar programas cuja leitura se torne muito dif cil. Voc e vai ver exemplos deste uso com observa co es criticando o seu uso. As vezes a forma elegante de resolver problemas que deve ser acompanhada com coment arios, que n ao alteram o tamanho do programa mas podem garantir que voc e perca tempo, depois, para entender o que fez.
6 eis

uma raz ao para evitar fun co es do tipo void

119

Em Computa ca o usamos uma forma de expressar ligeiramente diferente da Matem atica. Na express ao z = g (h(x)) (4.9)

dizemos que passamos o valor x para g . Observe que linguagem ca incompleta porque n ao zemos refer encia ` a fun ca o h. Isto tem o que ver com forma elegante e econ omica de fazer. Se tivessemos escrito y = h(x) ; z = g (y ) (4.10)

diriamos que passamos o valor x para h e o valor de y para g . H a uma outra forma de passar valores, indireta, usando o endere co da vari avel, que discutiremos no cap tulo 5, quando estudarmos par ametros e fun c oes do tipo ponteiros. Exerc cios 41 (Tutorial) Quando precisamos de fun c oes 1. criando uma fun c ao Leia e rode o programa primeiro071.cc. Observe que ele tem uma mensagem explicativa que pode ser chamada como fun c ao. Fa ca isto, crie a fun c ao mensagem(). Solu c ao: primeiro073.cc 2. passando valores O programa primeiro073.cc tem uma mensagem nal construa uma fun c ao para produzir esta mensagem nal. Observe que voc e vai precisar de passar alguns valores para mensagem nal. Crie a fun c ao laudo final(x1,x2,x3,y1,y2,y3), que deve calcular m1, m2. Solu c ao: primeiro074.cc 3. O programa primeiro074.cc usa duas express c oes alg ebricas para calcular pontos sobre retas. Dena as fun c oes f 1 e f 2 para fazer isto. Solu c ao: primeiro075.cc Observa c ao 10 Abrir e fechar chaves - criando blocos l ogicos Observe que abrir chaves, criando blocos l ogicos n ao vale apenas para fun c oes, se em qualquer lugar do programa voc e abrir e fechar chaves, voc e ter a criado um bloco l ogico onde voc e tem o direito de denir vari aveis locais, e voc e deve ter cuidado para n ao abusar desta facilidade. Na verdade, quando voc e zer isto, abrir/fechar chaves para criar um bloco l ogico pense se n ao deveria criar uma fun c ao, muito poss velmente a resposta deve ser sim. Observa c ao 11 Evitar as fun c oes do tipo void Existem duas grandes classes de fun c oes em C ++, ao retornam nenhum valor, mas consideramos void (vazio) um void que n tipo de dados . . . 120

com tipo que retornam um valor de um determinado tipo, diferente do void. H a uma tend encia entre os programadores em evitar as fun c oes vazias porque o valor que elas retornam pode ser u til at e para descobrir erros no programa. A id eia e a de que toda fun c ao que seria declarada como void seja declarada como int e, se n ao houver uma id eia clara de que n umero deva ser retornado, ent ao return(0). H a algumas conven c oes sobre a gravidade de um erro assim como quem desenvolve um sistema pode estabelecer o seu pr oprio c odigo de erros. Quando o usu ario encontra um erro, deve informar ao programador que n umero o programa informa7 ao nalizar. Leia mais a este respeito no u ltimo cap tulo, no ndice remissivo voc e encontra como descobrir (recuperar) os valores que os programas devolvem. Resumindo, ca o principal, A fun c ao principal um programa se constitue de uma fun main() que gerencia a execu ca o chamando as demais fun co es que executam tarefas espec cas de acordo com um projeto. A fun c ao principal e o planejamento A pr opria fun ca o main() representa as grandes linhas do planejamento.

O primeiro passo no planejamento consiste em escrever a fun ca o main() como uma lista de a co es que devem conduzir ao objetivo que o programa tiver. passagem de valores A passagem de valores nos programas se faz atrav es das fun c oes de tipo diferente do void ((n ao vazias).

A pr oxima lista de exerc cios vai conduz -lo a compreender o programa menu01.cc que faz o que descremos acima, o planejamento de um projeto. Neste caso o projeto consiste de alguma opera co es geom etricas simples. O programa menu01.cc depende da fun ca o switch() a respeito da qual voc e pode ler no cap tulo 2. Veja como se faz um planejamento vazio. Exerc cios 42 (Tutorial) Um planejamento vazio - mas importante 1. Leia o programa menu01.cc e rode o programa. 2. O programa menu01.cc se comp oe da fun c ao main() que apresenta as op c oes do programa e recebe a entrada de dados, a sua ecolha. Crie uma fun c ao para receber a entrada dados. Solu c ao: menu01a.cc
at e sistemas operacionais que indicam na tela os erros que seus processo produzem, at e mesmo porque tem muito erro nestes sistemas...
7 Tem

121

3. compondo fun c oes Podemos eliminar a vari avel opcao na fun c ao main(), economizando mem oria e deixando o programa mais dif cil. Use a fun c ao entrada como par ametro da fun c ao executa. Solu c ao: menu01b.cc Observe que o programa menu01b.cc est a perfeito;

funciona sem erros, testamos cuidadosamente a comunica c ao com o usu ario e as resposta que ele deve dar ao programa; falta somente fazer os c alculos a que ele se prop oe, cada uma dessas etapas vai agora ser resolvida por uma fun c ao e cada uma delas vai ser testada individualmente.

4. area de ret angulos (a) escreva uma fun c ao que calcule areas de ret angulos (b) escreva a entrada de dados necess aria - fornecimento dos lados; (c) complete a etapa r do programa menu01b.cc Solu c ao: menu01c.cc 5. termine o programa de geometria resolvendo cada uma das opera c oes a que ele se prop oe e naturalmente gravando com um nome mais adequado do que menu.cc. Solu c ao: areas.cc 6. Melhorando o layout O programa areas.cc funciona sem erros, foi feita cada etapa em particular eliminando os erros pequenos que surgiam (vari avel n ao declarada, por exemplo). N os cometemos estes erros, talvez voc e n ao os tenha cometido. Mas o programa e feio! N ao limpa a tela quando sai e nem quando entra. Somente agradece o uso se a op c ao r for utilizada. Melhore isto8 . Solu c ao: envie para o autor, colabore com o livro. 7. Junte todas as fun c oes do programa e as coloque numa biblioteca, por exemplo areas.h, e crie um novo programa usando esta bilioteca #include areas.h. 8. Transforme a biblioteca areas.h na classe Areas.h e crie um programa orientado a objetos usando esta nova classe e tamb em a classe Ambiente. Solu c ao: envie para o autor, colabore com o livro.
8 Esta

e a a hora, quando o programa est a funcionando sem erros.

122

4.3

Fun c oes numa biblioteca

Vamos analisar a biblioteca ambiente.h que evoluiu para se transformou na classe Ambiente.h. O nosso objetivo e conduz -lo a dominar a t ecnica de constru ca o de biliotecas como o passo, imediatamente anterior, ` a constru ca o de classes.

Vamos usar o arquivo ambiente.h como material de trabalho nesta se ca o. Esta e uma biblioteca escrita para programas em C e adaptada para C++ quando virou a classe Ambiente. N ao considere um ponto de honra entender tudo que tiver em ambiente.h, n ao se esque ca da metologia do livro, aprenda a programar como voc e aprendeu a falar. Uma biblioteca e um arquivo em colocamos fun c oes que funcionam bem e que executam tarefas semelhantes, todas voltadas para um mesmo objetivo. Por exemplo, Ambiente.h e a classe (leia biblioteca temporariamente) que guardam todos os m etodos (leia fun co es) voltadas para comunica co es com os usu arios dos meus programas. Voltarei a esta descri ca o algumas vezes. S ao as partes de um programa que ser ao chamadas pela fun ca o principal. Num dos programas sobre areas de guras planas n os lhe pedimos que criasse a biblioteca contendo as fun co es do programa. No come ca o apresentamos o programa mais simples. Agora vamos apresentar o programa padr ao. # include < iostream > // biblioteca do sistema # include < biblioteca1 > // biblioteca do sistema # include minha biblioteca// uma biblioteca minha using namespace std; // aderindo a uma sintaxe do compilador int main() { uma funcao das minhas( parametros); outra funcao das minhas( parametros); return(0); }

Este programa aparenta ter somente a fun ca o main() quando na verdade ele tem ` a sua disposi ca o todas as fun co es denidas nas tr es bibliotecas que foram inclu das nas primeiras linhas. e uma fun ca o que deve estar denida Por exemplo, uma funcao das minhas() em minha biblioteca. Em iostream 123

i - de input - entrada de dados; o - de output - sa da de dados; stream - um conceito nebuloso9 em computa ca o que signica com frequ encia uma sequ encia de caracteres, a forma t pica dos dados em um arquivo de disco, mas pode signicar tamb em a sequ encia de caracteres que ser a enviada para a tela do computador, em C++ em iostream est ao denidos os objetos cin, cout aos quais est ao associados os m etodos << , >> O conceito stream em C++ e uma classe que produz os objetos que vamos usar para nos comunicar com os perif ericos. Nada nebuloso em C++. Releia ambiente.h e veja que todas as fun co es l a denidas tem o mesmo objetivo: a comunica ca o com o usu ario dos nossos programas. Exce ca o para compara() que deveria estar em outra biblioteca. Esta e a tecnologia para programar, construindo pequenas fun co es que executam tarefas espec cas e que ser ao chamadas pela fun ca o main(). Sempre que voc e abrir uma chave se pergunte se n ao deveria denir uma fun ca o.

4.3.1

Construindo a biblioteca areas.h

Vamos faz e-lo em forma de um tutorial. Exerc cios 43 (Tutorial) Tutorial - construindo biblioteca 1. Fa ca uma c opia de areas.cc para areas.h. Compare com ambiente.h e deduza qual deve ser a organiza c ao de areas.h (n ao se perca nos detalhes). Solu c ao: areas.h 2. Limpe o arquivo areas.cc de todas as fun c oes (exceto main()), fa ca nele a inclus ao de areas.h e o grave como areas milenium.cc. Compile para ver se funciona e siga as intru c oes do compilador para corrigir algum erro. Solu c ao: areas v01.cc 3. Compare areas.h com Ambiente.h e transforme a biblioteca em uma classe Areas.h Solu c ao: Areas.h 4. Crie a vers ao 0.2 do programa de areas usando a classe Areas. Solu c ao: areas v02.cc 5. Crie a vers ao areas v03.cc do programa de areas utilizando os m etodos de Ambiente. Acrescente mais m etodos ao programa. oxima edi c~ ao do livro Solu c ao: envie para a pr
e tudo aquilo que a gente n ao v e bem...ou enquanto n ao vemos bem, stream nada tem de nebuloso!
9 Nebuloso

124

4.4

Vari aveis locais de uma fun c ao


Vamos discutir nesta dois tr es aspectos do uso das vari aveis numa fun ca o: vari avies locais, vari aveis de passagem de dados

J a falamos, no cap tulo 5, sobre os conceitos vari avel local e vari avel global mas estes conceitos s ao natos de um cap tulo sobre fun co es, porque s ao as fun co es que devem10 localizar as vari aveis. Quando voc e abre uma chave, portanto, quando voc e dene um bloco l ogico11 pode denir vari aveis neste ambiente restrito, que ser ao autom aticamente destru das quando a chave for fechada. Porisso a nota de rodap e, sempre intrometida, j a se manifestou dizendo que n ao eram somente as fun co es que tinham o privil egio de denir vari aveis locais. Quando, num programa, voc e abir e fechar chaves, ter a criado um bloco l ogico e poder a a criar vari aveis que ser ao locais a este bloco. Pior, as vari aveis podem ser criadas em qualquer lugar do bloco, mas voc e pode aprender a ser organizado e denir vari aveis apenas no come co do bloco. A utiliza ca o mais importante para as vari aveis numa fun ca o e a passagem de dados. O programa menu01b.cc apresenta o exemplo executa(entrada(opcao)); em que um valor e recebido pela fun ca o entrada() e repassado para a fun ca o executa(), sem vari aveis intermedi arias. Compare com o programa menu01d.cc em que usamos tr es nomes diferentes buffer, opcao, resposta. Isto lhe prova que as tr es vari aveis, com o mesmo nome opcao, no programa menu01b.cc s ao diferentes, para o caso de voc e ter ainda alguma d uvida a este respeito. Analise agora o programa menu01e.cc em que eliminamos a vari avel opcao da fun ca o principal. Observe que a fun ca o main() agora n ao toma conhecimento da vari avel opcao. Voc e v e nestes tr es exemplos quais s ao as suas possiblidades no uso de vari aveis. O conceito de vari avel local produz economia uma vez que as vari aveis s ao destruidas (reduz o uso de mem oria) quando o bloco em que elas foram denidas, deixa de ser usado. Assim voc e n ao precisa se for car a ser econ omico, use vari aveis para que o programa que claro e bem escrito, apenas tenha o cuidado de que elas sejam locais, quem dentro de uma fun ca o. Vantagens e desvantagens desta facilidade (vari aveis locais com mesmo nome): umero de nomes que temos que ter na cabe ca para vantagem reduz o n utilizar em programas e portanto um esfor co de mem oria a menos; ao quanto a compreens ao do programa. desvantagem pode causar confus Embora exista uma desvantagem obvia, que poderia ser resolvida com uso de prexos, como j a observamos, a pr atica de programar termina diluindo a
10 devem, 11 E

n ao precisa ser assim, mas deveria! deveria, possivelmente, denir uma fun ca o.

125

desvantagem. Tamb em as fun co es cam em biliotecas depois de vericadas e testadas e consequentemente ningu em precisa saber quais as vari aveis que elas usam, se tornam nomes esquecidos, an onimos, sobre tudo se as fun co es funcionarem bem, se forem intesivamente testadas antes de serem arquivadas numa biblioteca12 . Somente crie bibliotecas com fun co es testadas. Ent ao os nomes das vari aveis cam invis veis para os programadores que v ao usar as fun co es que, se estiverem operando como planejado, o nome das vari aveis ca irrelevante. Preste aten cao ao exemplo menu01e.cc. Observe que ao declarar uma fun ca o, coment ario (05), executa(), o nome da vari avel foi omitido. Ele n ao e obrigat orio na declara ca o (prot otipo), o que torna mais f acil o entendimento do uso das fun co es: esta fun ca o recebe uma vari avel do tipo char, n ao interessa o nome que a vari avel tem. Vamos ver como isto acontece na pr atica. Voc e deve ter notado que no in cio de ambiente.h tem uma listagem das fun co es implementadas na biblioteca com uma breve descri ca o do que elas fazem e com a indica ca o das vari aveis que lhe deverm ser passadas. A fun ca o translata() e um contra-exemplo. O nome dela n ao diz nada. Na verdade ela j a deveria ter sido apagada porque h a outra que a substitui que e quatrolinhas(), mas como ela e utilizada em algum programa ainda est a cando. Apertando uma tecla para continuar - apeteco Por exemplo, quem precisar de usar uma fun ca o que emita duas mensagens com tamanho m aximo de uma linha cada, pode fazer uso de apeteco(). Como usar apeteco() ? O sum ario diz que ela recebe duas mensagens, cada uma com no m aximo 70 caracteres. Deveria ter cado claro no seu uso. J a apeteco2(), apetecof() t em mensagens-padr ao pr e-denidas, porque o sum ario diz que elas n ao recebem vari aveis (par ametros). Entrada de dados ario diz que ela recebe duas vari aveis: Saltando para entrada float(). O sum uma mensagem com tamanho m aximo de 80 caracteres; um n umero real. Aqui voc e v e uma regra na constru ca o de bibliotecas, elas devem ter um ndice que explica o que fazem as fun co es da bilioteca ajudando o us ario. Algumas programadoras cortam o arquivo de bibliotecas em dois, um que tem a extens ao .h, e se chama de arquivo de cabe calhos (header file), e outro, com a extens ao .o em que ca a implementa ca o das fun co es (m etodos). Havia duas raz oes para isto que a programa ca o orientada a objetos vai tornar raz oes antigas: (1) organiza ca o do trabalho, (2) dizer para os usu arios das
12 Ou

virarem m etodos de uma classe

126

fun co es que eles n ao devem mexer naquilo que est a funcionando corretamente. N ao devem, mas podem, n ao se trata de proibi ca o nem de esconder o jogo. Para grande projetos esta forma de trabalhar e muito importante, as duas raz oes acima s ao signicativas, quem constroi uma fun ca o e a torna p ublica para uso, deve garantir que est a bem feito e que ningu em precisa ver como ele foi construida, pode usar.

4.4.1

Vari avel com valor padr ao

Aqui podemos identicar um defeito, do sum ario, em ambiente.h. Vamos ver o que acontece com a fun ca o entrada float(). Estamos discutindo uma fun ca o que se chama entradae tem como par ametro um n umero real que e, exatamente, o que ela deve receber. Isto parece uma con tradi ca o e o sum ario deveria observar de maneira mais incisiva, porque isto. E a forma de criar valor padr ao e talvez uma observa ca o devesse indicar isto melhor. Uma facilidade importante de C++, voc e pode denir um valor padr ao (default) para uma vari avel. Veja o programa terceiro09.cc. Este programa usa a classe Ambiente.h em vez de usar a biblioteca ambiente.h. E tem uma diferen ca de sintaxe no uso que voc e j a deve conhecer de cap tulos anteriores. Em vez de chamar entrada float() chamamos Tela.entrada float() porque estamos usando um m etodo13 denido em Ambiente.h que e herdado por Tela. Se estivessemos usando ambiente.h o peda co do programa que nos interessa estaria assim a= entrada_float(" A b= entrada_float(" B c= entrada_float(" C = " , a); = " , b); = " , c);

porque demos valores iniciais ` as vari aveis a,b,c que o usu ario poder a usar quando apenas desejar experimentar o programa para ver como funciona. Ao passar neste ponto, dando enter, o programa usa os valores-padr ao para as vari aveis. Observa c ao 12 Manuten c ao e re-utiliza c ao de programas
Quando vamos escrever um programa a primeira que coisa que fazemos e procurar algum programa que fa ca algo parecido com o que desejamos. Os nossos programas j a lhe oferecem uma facilidade neste sentido uma vez que tem um sistema de palavras-chave para ajud a-lo nesta busca. Mas o que interessa aqui e refor car o defeito da biblioteca ambiente.h que n ao explica de modo mais claro o uso de suas fun c oes. Isto pode torn a-la in util, porque ningu em consegue encontrar o que lhe possa interessar. Este e objetivo das bibliotecas, evitar que estejamos sempre inventando a roda. Este livro tem por objetivo ensinar a programar em C++, e programar bem, ent ao os defeitos devem ser apontados para que voc e n ao os cometa. Nunca e pouco chamar sua aten c ao para o uso de coment arios, ou uso de nomes (identicadores) adequados para as fun c oes e vari aveis. Este cuidado torna mais f acil a manuten c ao dos programas ou a reutiliza c ao dos mesmos, dois aspectos essenciais na vida de uma programadora.
13 a

partir do cap tulo 7 chamaremos as fun co es de m etodos...

127

4.5

A linha de comandos de main()

A fun ca o main() pode receber vari aveis pela linha de comandos e este e um dos aspectos mais interessantes da programa ca o com C++. Com esta facilidade, se prog for um execut avel feito com C++, ent ao voc e poder a cham a-lo com a linha prog arg1, arg2, ..., argn em que a quantidade de argumentos pode ser arbitr aria.

H a programas cujo nome j a diz tudo sobre eles, por exemplo, fatorial. Um programa, como este nome, fatorial, a gente espera que saiba calcular o fatorial de um n umero inteiro qualquer (coisa dif cil com C++). Gostariamos de usar este programa assim: fatorial 10 e ter o fatorial de 10 calculado. O par ametro 10 acima se diz um par ametro na linha de comando. Chamamos o programa lhe passando logo um par ametro. O programa fatorial.cc faz isto14 , mas este programa n ao e t ao simples, vamos retornar para discut -lo mais a frente. Talvez n ao valha a pena l e-lo agora, mas ca ` a seu crit erio. Vamos discutir um programa mais simples com o objetivo de ver como funcionam os par ametros na linha de comandos. Exerc cios 44 (Tutorial) Argumentos na linha de comandos N ao se esque ca de ler os coment arios nos programas, eles completam o texto do livro. 1. Leia e rode (compile primeiro) o programa arg comando01.cc. 2. Leia os coment arios no programa arg comando01.cc para entender o que representam os argumentos argc, argv de main(). 3. Se voc e tiver fornecido apenas o nome do programa, ent ao argc == 1 e verdade, mas o programa arg comando01.cc estar a falando portugues errado. Altere o di alogo do programa para evitar um erro de sintaxe da lingua portuguesa (possivelmente usando um if()...). Solu c ao: arg comando02.cc e 4. A decep c ao do programa arg comando02.cc se deve ao fato de que este um tutorial sobre comandos na linha de argumentos. Voc e rodou o programa sem argumentos (al em do pr oprio programa, que e um argumento). Mas o programa ainda cou errado. N ao tem sentido continuar rodando o programa se voc e n ao tiver fornecido argumentos (al em do programa). Corrija isto com um else. Solu c ao: arg comando03.cc
14 Experimente:

compile e rode.

128

5. Quando houver apenas duas op c oes o else e desnecess ario, dois return()s resolvem. Otimize o programa arg comando03.cc. Solu c ao: arg comando04.cc 6. No programa arg comando04.cc usamos o valor de argv para rolar um loop, while(), e mostrar os valores contidos em argv. Use o u ltimo valor de um vetor, NULL, para parar o while(). Solu c ao: arg comando05.cc 7. No programa fatorial01.cc construa uma fun c ao rotulo() para apresentar o programa. 8. No programa fatorial01.cc o else e desnecess ario, verique isto, altere o programa. Mas o programa ca menos leg vel, deixe um coment ario indicativo. Leia os coment arios no programa. 9. O programa fatorial02.cc recebe o argumento para o fatorial na linha de comandos. Compile e rode o programa para ver como funciona. Depois leia o programa. 10. O programa fatorial02.cc tem uma defesa para o caso de o usu ario n ao fornecer o inteiro cujo fatorial deseja, na linha de comandos. Esta e uma prote c ao natural dos programas que esperam par ametros na linha de comando. c ao da vari avel (a) O programa arg comando04.cc lhe mostrou a fun argc. Veja como fatorial02.cc verica se o usu ario n ao forneceu o inteiro. (b) Supondo que voc e compilou fatorial02.cc com g++ -Wall -oprog fatorial02.cc experimente prog qwert e voc e v e que o programa n ao verica todas as possibilidades de tentativas que o usu ario possa tentar! Portanto um defeito do programa. A fun c ao isalpha(), veja 11, verique se um caractere e de tipo alfanum erico, com ela voc e pode detectar se algu em digitou fatorial qwert em vez de fatorial 10. Solu c ao: fatorial03.cc 11. O programa fatorial02.cc usa a fun c ao atol() para transformar em n umero aquilo que o usu ario digitou na linha de comandos. Uma fun c ao mais completa e strtol(). Estude esta fun c ao15 sua substitua atol() por strtol(). Solu c ao: fatorial03.cc
info strtol num terminal do Linux para ver uma tela de ajuda sobre esta fun ca o e suas irm as. Fale com o administrador se n ao sair nada.
15 Digite

129

12. Como o fatorial est a sendo calculado com C++ apenas para pequenos n umeros inteiros, o uso de long int e um exagero, corrija isto em fatorial03.cc. 13. H a elses desnecess arios em fatorial03.cc, veja quais e os elimine (n ao elimine, transforme em coment ario, para garantir a legibilidade do programa). 14. dif cil, mas n ao desista Modularize fatorial03.cc. Solu c ao: envie para o autor, se for aprovada, sai sob seu nome, na pr oxima edi c ao. Observa c ao 13 (Quantidade dos argumentos) na linha de comandos
Aqui tem uma facilidade que se pode transformar num erro desagrad avel, e a programadora deve ter cuidado com este problema. A fun c ao main() se receber argumentos pela linha de comando, pode receber uma quantidade arbitr aria deles. N ao tem como controlar isto a n ao ser no c odigo da fun c ao. O programa fatorial.cc est a incompleto porque n ao faz isto, e poss vel que algu em digite prog 3 4 em que estou supondo que a compila cao foi a que costumo fazer g++ -Wall -oprog -lm fatorial.cc tendo sido criado o execut avel prog. O programa vai calcular 3! e ignorar o quatro, quando deveria reclamar que est a recebendo dois par ametros em vez de um u nico. Basta incluir um if() para detectar quando argc >= 3 for verdadeira, de modo que o programa diga que espera um u nico argumento inteiro quando o usu ario digitar dois n umeros ou mais.

Exerc cios 45 (Desao) Um programa mal feito O programa fatorial.cc tem um erro que n ao consegui corrigir, pode ser at e uma bobagem, mas eu ainda n ao consegui dar um jeito nisto. Examine a sa da de dados do programa: prog 6

6! = 720

e agora 15! =

1307674368000

A diferen ca entre os dois casos e que no segundo, quando n > 12, o programa chama calc para calcular exatamente o fatorial. Mas ainda assim deveria sair 15! = 1307674368000 como nos demais casos. Eu n ao consegui resolver isto. Eu n ao consegui resolver isto, se voc e resolver, me envie a resposta.

130

Cap tulo 5

Vari aveis
Neste cap tulo vou discutir vari aveis e tipos de dados. As vari aveis s ao uma forma de abstra ca o elas associam um setor de endere cos na mem oria do computador em que ca guardado um tipo de dado com uma tabela chamada espa co de nomes permitindo que os programadores pensem de forma mais humana. Vamos tamb em entender porque as vari aveis t em tipo numa linguagem como C++, e o conceito que permite ao compilador determinar o endere co inicial e o nal em que ele deve guardar um tipo de dado. Depois do cap tulo 7 passaremos a chamar as vari aveis de objetos membros de uma certa classe. Se voc e ainda n ao tiver visitado o cap tulo 7, visite-o rapidamente agora. Ainda que possamos considerar o conceito de vari avel um certo atrazo, a linguagem da ci encia da computa ca o est a impregnada com este conceito e e dif cil romper radicalemente com esta terminologia. Mesmos assim eu considero que este cap tulo pode ter algum proveito, mas se prepare para aos poucos passar de vari avel para objeto.

Algu em j a disse1 que quando descobrimos a estrutura certa para uma vari avel, resolvemos o problema. as vari E aveis tem uma estrutura com a qual elas modelam o objetivo do problema, e as fun c oes s ao respons aveis por alterar os dados contidos nas vari aveis ou transmitir estes dados para uma outra fun ca o dentro do programa. Desde o primeiro cap tulo que estamos usando vari aveis que guardam dados dos tipos int, char, float. Aqui vou discutir em maior detalhe o que signicam estes tipos de vari aveis. Uma confus ao dif cil de evitar: dado e vari avel. S ao dois conceitos que andam juntos sendo dif cil, na linguagem, separ a-los. O contexto em que eles aparecem deixa claro o que se quer dizer. A raz ao da confus ao se prende a uma necessidade t ecnica: precisamos guardar dados em vari aveis e o tipo dos dados tem que coincidir com o tipo da vari avel. Um pertence ao mundo externo que nossos programas v ao modelar, os dados. O outro s ao a representa ca o dos aspectos do mundo externo em nossos programas as vari aveis.
1 Pe co

perd ao por n ao poder fazer refer encia a ` fonte.

131

Por exemplo, tem uma diferen ca fundamental entre os tipos de dados int e oat e os objetos matem aticos que eles representam, um n umero inteiro ou um n umero racional. Voc e pode escrever, com um programa de computador, todos os inteiros2 que a linguagem de programa ca o conhecer, isto n ao seria poss vel fazer com o correspondente objeto matem atico, enquanto que os n umeros3 do tipo float fazem parte de uma malha com uma certa precis ao e tamb em h a uma quantidade nita deles. Fora desta precis ao n ao e poss vel escrever os n umeros racionais chamados de float, uma diferen ca fundamental entre os racionais e os dados do tipo float: entre dois racionais sempre podemos escrever outro racional (em Matem atica). De uma forma mais simples poderiamos parafrasear o par agrafo acima dizendo que os dados do tipo int s ao precisos, embora em n umero nito, enquanto que os dados do tipo float podem ser apresentados at e uma certa precis ao denida por constantes que se encontram numa biblioteca da linguagem. Estes dois tipos de dados s ao fundamentais para muitos problemas que se podem resolver com programas escritos em C++ mas h a outros tipos de dados que ser ao discutidos aqui assim como a abstra ca o que e poss vel fazer deles com as vari aveis. Isto para lhe dizer que o tipo de dado int n ao s ao os inteiros da Matem atica assim como o tipo de dado oat n ao s ao os n umeros racionais. Ambos s ao uma boa representa ca o destes objetos matem aticos ainda que limitada. Vamos come car falando de vari aveis e depois voltaremos aos tipos de dados. Esta primeira se ca o n ao foi escrita para ser lida uma u nica vez, fa ca uma leitura r apida e volte quando se sentir motivado, o ndice remissivo lhe d a sugest oes de como voltar para esta se ca o, assim como para outras se co es do livro. Mas e importante fazer uma primeira leitura dela agora.

5.1

O nome das vari aveis

Um manual da linguagem LISP come ca dizendo que tudo nela s ao s mbolos. A pr aticaa em C++ n ao permite que se diga exatamente o mesmo, mas a id eia de que s mbolo e um conceito b asico em programa ca o e verdadeira. Que e s mbolo ? uma pergunta dif cil de responder. Melhor aceitar que voc e sabe o que e um s mbolo e come car escrevendo frases em torno da id eia de modo a sintoniz a-l@ com o autor, porque, certamente, duas pessoas quaisquer t em id eias ligeiramente diferentes do que seja um s mbolo. Vamos acertar o passo, eu e voc e, inicialmente.
a uma das raz oes desta pr atica e a de que LISP e interpretada, mesmo que haja compilador para linguagem, o que signica que o programador vive em um ambiente LISP. Em LISP um progrma pode ser um dado que outro programa recebe fazendo de LISP o que se chama de linguagem de m aquina da intelig encia articial. 2 Eu

3 Outro

deveria dizer todos os dados do tipo int que a linguagem conhecer erro, deveria ter dito dados do tipo float.

132

5.1.1

S mbolo

Esta se ca o trata de id eias que se encontram no limiar da linguagem t ecnica, e ela cont em conceitos difusos. Ao passar por aqui pela primeira vez, fa ca apenas uma primeira leitura desta se ca o indo rapidamente para a segunda. Volte aqui sempre que se sentir motivado, ou precisar de alguma informa ca o. Um n umero e um s mbolo. Uma bandeira e um s mbolo. E certamente nestas duas frases usamos a palavra s mbolo de forma ligeiramente diferente, mas n ao profundamente diferente. Um cone na tela do computador e um s mbolo. Os s mbolos guardam id eias de forma concentrada e n os temos um sistema l ogico que opera com eles de forma a produzir as informa co es, guardar as informa co es ou transmit -las. Como em 3+5=8 (5.1)

em que usamos cinco s mbolos para formar uma senten ca que voc e leu e provavelmente mexeu a cabe ca aprovando: voc e concordou comigo, o que signica que voc e, como eu, pensamos que esta senten ca e verdadeira. J a aqui temos uma variedade muito grande de situa co es (mesmo assim a diverg encia entre o signicado de s mbolo n ao e grande). Um cone na tela do computador e um s mbolo assim como cursor que representa na tela do computador o ratinho tamb em e um simbolo e voc e pode relacionar estes dois s mbolos com uma opera c ao: a sele ca o de um processo. 3,+,5,=,8 s ao s mbolos que voc e pode relacionar numa opera c ao A verdade e um outro s mbolo que est a associada aos dois exemplos acima, um programa de computador entende que e verdade que o ratinho clicou no s mbolo na tela do computador num certo momento o que signica em um certo momento, em uma determinada localiza ca o de mem oria (endere co) o computador vai encontrar o s mbolo 1 identicado com a a ca o (s mbolo) de clicar no ratinho. A verdade e um outro s mbolo, alguns diriam um valor. O falso e outro s mbolo que colocamos em oposi ca o a verdade. O tutorial seguinte reduz os valores los ocos verdade, falso ` a constantes num ericas. Exerc cios 46 (Tutorial) Verdade e falso - dois valores 1. Rode e leia o programa verdade.cc. 2. Fa ca mais algumas experi encias com os valores true, false alterando o programa verdade.cc

133

Para expressar os s mbolos usamos alguns s mbolos4 b asicos: D gitos, {0, 1, 2, , 9} e eu poder a ter inclu do os d gitos hexadecimais {A, B, C, D, E, F }; caracteres do alfabeto de uma certa l ngua humana; sons, cores; voc e pode ver que at e mesmo falando de caracteres b asicos a lista pode se alongar. At e h a 50 anos atr as com um som curto e outro alongado (c odigo morse) t nhamos uma codica ca o suciente para as comunica co es, usando apenas dois s mbolos. Hoje enviamos p aginas codicadas com d gitos, digitalizadas, novamente usando apenas dois s mbolos: 0,1. Alguns, certamente iriam dizer que escolhemos um c odigo, ou um alfabeto com com estes dois s mbolos. A acrescentariamos: um c odigo, ou um alfabeto e uma estrutura composta de um conjunto b asico de s mbolos, mais uma sintaxe que governa o uso dos mesmos. Uma linguagem ? Isto lhe mostra que nos encontramos na fronteira dos conceitos o que nos leva de volta a observa ca o de que e prefer vel trabalhar com exemplos para encontrar pontos de acordo... Ent ao para encurtar a hist oria, com {0, 1} podemos dizer tudo. Para n ao car muito dif cil a comunica ca o, codicamos com {0, 1} as letras e o resto dos d gitos e deixamos os programas de computador com a leitura de aglomerados de {0, 1} com a obriga ca o de nos oferecer p aginas gr acas em que vamos ler as palavras de nossa l ngua, os gr acos estat sticos: ele deve codicar e decodicar. Eu poder a continuar assim, losofando, por mais umas 300 p aginas. Mas o objetivo foi mesmo somente convenc e-lo de que h a muitas nuances por tr as apenas da id eia de s mbolo para que quemos de lados opostos. Vamos evit a-lo e aceitar, pelo menos inicialmente, que Deni c ao 2 S mbolo N umeros, s ao s mbolos; letras s ao s mbolos; certos agregados de n umeros e letras s ao s mbolos; e precisamos de algumas regras de conviv encia, por exemplo, para nos comunicarmos com uma determinada linguagem5 de computa ca o, por exemplo C++, que precisa traduzir o c odigo que escrevermos numa outra linguagem de comunica ca o com o sistema operacional. Estas regras de conviv encia com os s mbolos formam a sintaxe. Precisamos de regras inclusive para criar novos s mbolos. Por exemplo 1234 n ao seria um s mbolo novo legal, porque ele j a e um s mbolo existente. Mas a1234 s eria um novo s mbolo legal.
4 Eta 5 Nos

que tautologia brutal, em outras palavras c clo vicioso. comunicarmos com o compilador/interpretador da linguagem

134

Vou deixar de usar a palavra s mbolo e em seu lugar usar a palavra vari avel. Elas n ao s ao equivalentes, por exemplo 1 e um s mbolo e n ao queremos que 1 seja uma vari avel. Mas a1234 e uma vari avel que tamb em podemos chamar de s mbolo. Quer dizer que desejamos que o conceito de s mbolo seja mais amplo. LISP e uma linguagem simb olica. C++ n ao e uma linguagem simb olica. Em C++ trabalhamos com vari aveis. As vari aveis s ao constru das com agregados dos s mbolos b asicos, os dois primeiros6 na deni ca o 2. Vou dizer que a1234 e o s mbolo de uma vari avel, e em geral direi apenas que a1234 e uma vari avel, ou algumas vezes direi que e o nome de uma vari avel. Vamos adotar um acordo, aceitar que nome seja um sin onimo para s mbolo pela raz ao simples de que vamos precisar de um nome para nos referirmos a qualquer s mbolo. Este acordo e razo avel apesar de que neste momento voc e esteja querendo se manifestar lembrando que as nossas pobres linguagens humanas usam um u nico nome para representar distintas id eias, um defeito muito bem explorado pelos poetas e literatos, que apenas caracteriza a pobreza vocabular mas, indiscutivelmente, deixa belas as poesias, porque poesia se faz com el pses, com sentido gurado ou d ubio. Programas n ao, por enquanto n ao!

5.1.2

A codica c ao dos caracteres

A codica ca o dos caracteres e uma das complica co es que temos que enfrentar. O pr oximo tutorial usa os programas da suite ascii*.cc para complementar as id eias do texto com uma pr atica iterativa com a m aquina. Neles estou usando a estrutura de controle for, leia a respeito desta estrutura de controle no cap tulo 3. Exerc cios 47 (Tutorial) A tabela ASCII 1. Rode e leia o programa ascii01.cc. 2. O programa ascii01.cc sugere que h a caracteres que n ao podem ser impressos, por exemplo o de mudan ca de linha... fa ca experi encias com ascii01.cc para descobrir de que ndice e at e que ndice os caracteres podem ser impressos. 3. Altere ascii01.cc para que todos os caracteres, a partir de um certo ndice inicial, sejam impressos, pausadamente. Solu c ao: ascii02.cc
deni ca o 2 e tecnicamente defeituso por incluir a express ao certas, cou vaga o que e inaceit avel.
6A

135

Os caracteres impressos pelo programa ascii02.cc dependem da codica ca o que a m aquina tiver dos caracteres. Esta codica ca o est a associada ` a uma regi ao lingu stica, e ela que dene a associa ca o das teclas com os caracteres. Se voc e trocar o teclado no micro, por exemplo usar um teclado vendido em Portugal, deixar a de ser poss vel escrever devido ` a permuta ca o que os caracteres sofrer ao. H a alguns caracteres que tem uma codica ca o xa em consequ encia de que os americanos deniram um padr ao, a tabela ASCII7 , parte desta tabela e aceita por todos os pa ses.

5.1.3

As regras

Denidos os caracteres (codicados) podemos escrever os nomes das vari aveis com seq u encia de caracteres e para isto a sintaxe da lingua j a come ca a intervir denindo regras. Para construir os nomes das vari aveis, o primeiro s mbolo n ao deve ser um d gito e sim uma letra; n ao podemos usar os s mbolos {+, , /, , $, %, #, @, !, } porque eles representam operadores. O s mbolo #, antes da fun ca o8 main(), indica que uma macro ser a denida ou uma diretiva de compila ca o (por exemplo include). n ao pode conter espa co; o s mbolo n ao e proibido, mas deve ser evitado. O s mbolo . vai ter um uso particular e deve assim ser evitado inicialmente, e o s mbolo e usado para diferenciar vari aveis ou criar nomes compostos como multipla soma que e um nome legal; uma regra restritiva, mas de boa pr atica, seria, podemos usar todas as letras do alfabeto e mais o s mbolo e qualquer n umero, desde que iniciando sempre com uma letra; por raz oes l ogicas (e o compilador vai interferir se voc e n ao levar a s erio), n ao podemos usar as palavras chave9 da linguagem e elas s ao and, asm, auto, bool,bitand, bitor, break, case, catch, char, class, const, cast, continue, default, delete, do, double, dynamic, else, enum, explicit, extern, false, oat, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, or, public, private, protected, register, reinterpret, return, short, signed, sizeof, static, struct, switch, template, this, throw, try, typedef, typename, union, unsigned, using, virtual, void, volatile, xor
Standard Code for Information Interchange que come camos a construir a sintaxe da linguagem C++ 9 quando escrever programas, use um editor pr oprio para programas porque, uma das prote co es que ele lhe d a e tornar em negrito as palavras chave da linguagem
8 observe 7 American

136

letras mai usculas e min usculas s ao diferentes, assim os nomes Abracadabra e abracadabra representam duas vari aveis diferentes. e consequentemente voc e poderia usar as vari aveis AUTO, BOOL, FOR, FLOAT, ... mas seria de muito mau gosto, ou possivelmente, grande falta de imagina ca o. O s mbolo \ se chama escape caractere e tem um uso especial, serve para passar ao g++ um caractere especial, como a mudan ca de linha que voc e j a viu sendo usada como forma alternativa ao endl ao acessar o objeto cout. Se voc e quiser imprimir \ voc e tem que digitar \\. mbolo % serve para denir tipos de Exclusivamente com printf() O s dados, para a antiga fun ca o printf()10se voc e quiser imprimir % ter a que escrever %% dentro de um printf(), veja no programa divisao01.cc, um exemplo. Em C++ o operador de acesso << do objeto cout imprime o s mbolo % livremente, dentro de um texto. A formata ca o dos dados em C++ e feita por outros m etodos, mas dentro de um printf() a regra acima segue v alida. Se achar que precisa usar printf(), eu duvido, voc e pode encontrar com grep "printf()"*.cc programas que d ao exemplo de uso desta fun ca o. Observe que na linha acima, como grep, as aspas duplas s ao necess arias devido ao uso dos parentesis. Se n ao colocar os parentesis, n ao precisa de usar aspas. Os s mbolos a1234 e a1234 s ao diferentes. O primeiro, a1234 e um vetor de caracteres, ou um texto. Quer dizer se denirmos o vetor = a123411, ent ao as seguintes senten cas ser ao verdadeira: 1. vetor[0] = a 2. vetor[1] = 1 3. vetor[2] = 2 4. vetor[3] = 3 5. vetor[4] = 4
n ao precisa usar printf(), use o objeto cout com o acesso <<. declara ca o e legal denir char vetor=a1234, mas a atribui ca o tem que ser feita com strcpy(vetor, a1234).
11 Na 10 Voc e

137

observe que o primeiro ndice e o zero. Observe tamb em que as aspas duplas fazem parte da deni ca o do s mbolo do tipo vetor de caracteres, tamb em chamado de C-strings. Os dois s mbolos a e a s ao diferentes. O primeiro representa o caractere primeira letra do alfabeto portugu es, enquanto que o segundo representa um vetor de caracteres de tamanho 1. Em C++ tem um tipo de dados, um objeto, string que vou discutir no cap tulo 6 que e a forma alternativa com que C++ trata texto. Portanto h a dois tipos de texto que convivem, C-string, string. As C-strings s ao um tipo de dados, e portanto de vari avel. As strings s ao objetos que tem propriedades e m etodos, no cap tulo 6 discutirei melhor esta quest ao. O que vai alterar o comportamento da linguagem C++ frente ao texto, consider a-lo como C-string ou string e a declara ca o da vari avel que contenha o texto: e uma vari avel do tipo texto, um vetor C-string char texto[80] de caracteres com 80 lugares; C++ string string texto que tem uma limita ca o quanto ` a quantidade de caracteres, denida na contante max size e que depende da implementa ca o do compilador. Em geral se pensa colocar numa string o conte udo de uma linha, portanto uma texto com 80 a 100 caracteres. cout << "max size: < str.max size() << " n"; produz o seu valor que depende da implementa ca o. Aqui voc e uma diferen ca e uma limita ca o das C-strings, elas t em que ser declaradas com um tamanho exato. As C-string podem ser muito grandes, mas voc e n ao supor que sejam indenidas e se manter num tamanho razo avel - uma linha de caracteres. Mas um dos usos das C++ strings e para trabalhar com n umeros de grande porte. Eu n ao vou tratar disto neste livro. Vou discutir mais sobre os dois tipos de strings numa se ca o mais para o nal do cap tulo. Caracteres num ericos: 0,1,2, . . . , 9. Observe que 0 e diferente de 0. Os caracteres est ao designados todos numa tabela chamada ASCII12. Os outros, incluindo os num ericos, completando alguma coisa da ordem de 256 = 28 caracteres. O teclado do computador, tem, por exemplo 101 teclas. Mas a e A s ao dois caracteres diferentes obtidos apertando ou n ao shif junto com a tecla a. Com a tecla ctrl voc e pode obter novos caracteres e assim por diante. O que caracteriza um caractere e sua escritura entre aspas simples. Assim 3 e um caractere, como a e 3
12 American

Standard Code for Information Interchange

138

e um vetor de caracteres. Os vetores de caracteres s ao aglomerados de caracteres colocados entre aspas. Tenha cuidado com estas combina co es, ctrl-X, alt-X alguns destes caracteres de controle podem, simplesmente, travar o programa que voc e estiver usando... alt-X parece ser sempre inofensivo, mas n ao e o caso de ctrl-X. Em C++ usamos, al em de vari aveis, a palavra macro que est a associada a um tipo de vari avel que representa uma fun ca o, ou um processo. As macros s ao execut aveis, dentro uma fun ca o ou dentro de um programa. Se voc e armar que a linguagem que usei nesta se ca o e imprecisa, eu concordarei com voc e. Estamos no limiar dos conceitos da ci encia da informa ca o, onde e dif cil distinguir a linguagem humana da linguagem que vamos usar para nos comunicar com as m aquinas. Mas, acredite, vai funcionar, se conseguirmos superar esta primeira etapa.

5.1.4

O espa co de nomes

Vamos considerar esta quest ao, da codica ca o dos caracteres, como uma curiosidade observando apenas que voc e n ao deve trocar o teclado sen ao o C++ vai deixar13 de funcionar! Vamos discutir uma nova codica ca o, que em um certo sentido e de mais alto n vel do que a codica ca o dos caracteres. Estamos dizendo que codica ca o dos caracteres e um n vel14 mais baixo no sentido de que ela est a mais pr oxima do funcionamento da m aquina, a m aquina depende dela: n ao troque o teclado! a n ao ser que seja por outro igual ao anterior. Espa co de nomes Vamos discutir o espa co de nomes. Qualquer linguagem de programa ca o, ao compilar um programa, ela cria uma tabela (uma codica ca o) ligando os nomes das vari aveis a um endere co de mem oria. Isto tamb em voc e pode considerar uma curiosidade e ignorar totalmente o que vou dizer nas pr oxima linhas, ou mesmo salt a-las sem nenhum prejuizo para o seus programas. Mas e bom que voc e saiba que isto existe. Quando uma linguagem de programa ca o entra em a ca o (ou um programa, anal uma linguagem de programa ca o e apenas mais um dos programas que a m aquina est a rodando), ela recebe do sistema operacional um intervalo de endere cos na mem oria que e calculado por um sistem bastante complexo de otimiza co es e frente ao um pedido da linguagem do espa co que ela precisa. Do
dif cil voc e descobrir g++ no novo teclado... predicados n vel alto, n vel baixo dizem respeito a uma forma mais f acil para o humano usar um c odigo, os de mais alto n vel s ao mais pr oximos da linguagem humana.
14 Os 13 Ficaria

139

ponto de vista da linguagem (leia do programa) isto e xo, digamos15 , vai da 16 mem oria 000000 at e a mem oria aaa , por exemplo. Nesta regi ao ca o c odigo da linguagem (leia programa) e os dados que forem necess arios guardar e modicar. Se o espa co de nomes for ocupar muito espa co o sistema operacional ir a avisar que o programa e muito grande para a mem oria17 e a sa da e recongurar a linguagem de programa ca o para que ela pe ca mais mem oria ao sistema. O tamanho dos dados Cada linguagem (leia programa) deve gerenciar o recurso mem oria de forma bem otimizada porque o sistema operacional vai ser muito r gido com esta distribui ca o de recursos. Se um programa tentar escrever fora do que lhe for permitido, vem um corte o que pode signicar para a linguagem ser tirada do ar, ou travar! Em geral o sistema operacional simplesmente mata o faltoso em alguns casos o faltoso trabalha sob um sub-sistema que envia uma mensagem para o usu ario pedindo desculpas. S ao as programadoras que devem se ocupar desta gentileza. Suponhamos que n ao haver a escritas fora do espa co permitido, se houver voc e pode receber uma mensagem do tipo segmentation fault, ou seja quebra do espa co de mem oria alocado, ou menos educamente, o programa trava. Vamos esquecer este incidente, neste momento, e pouco prov avel que voc e encontre este tipo de problemas dentro do escopo deste livro, e quando encontrar j a ter a experi encia para encontrar a solu ca o. Retornando ao come co, a linguagem entrou em a cao, recebeu um segmento de mem oria e voc e deniu uma vari avel. Ent ao come ca a ser criado o espa co de nomes, a tabela que associa cada vari avel com um intervalo de mem oria. Uma vari avel usa uma sucess ao de endere cos, e n ao um s o. Um caractere, que e o tipo de dado que ocupa menos espa co, usa um u nico endere co, outros tipos de dados usam uma sucess ao de endere cos em fun ca o do espa co que eles v ao ocupar. Isto e importante com programas grandes, escolher o tipo de dado mais econ omico pode resultar em melhor performance. porisso que muitas linguagem de programa E ca o precisam de tipos de dados de que vamos tratar mais a frente neste cap tulo, pelo espa co que a vari avel vai ocupar, a quantidade em bytes. Antes dos bytes vem os bits. Um bit e a menor unidade de espa co de mem oria, mas n os usamos aglomerados de bits, oito bits formando um byte. Quer dizer que um byte e um arranjo com repeti ca o dos s mbolos 0,1 tomados 8 a 8 o que nos d a 256 possibilidades diferentes, exatamente o tamanho da tabela ASCII. Leia e rode o programa ascii02.cc para ver um pouco mais do que os caracteres que e poss vel gerar com um teclado de computador.
15 Estamos falando de gerenciamento de mem oria, uma das artes mais dif ceis do sistema operacional 16 Os endere cos de mem oria s ao registrados em hexadecimal e os valores aqui indicados s ao ct cios. 17 Program to big t in memory

140

Se falarmos ` a maneira antiga que um byte e formado de l ampadas acesas ou apagadas (n ao e mais isto) ent ao a cada uma dessas possibilidades corresponde um caractere. Depois vem uma nova m edida de informa ca o e a palavra (word) que e um aglomerado de bytes que o processador l e em cada ciclo, e aqui vem a denomina ca o das m aquinas de 8 bits, 16 bits, 32 bits ou 64 bits - quantos bits representa uma palavra. Em geral se diz 1 byte, 2 bytes, 4 bytes ou 8 bytes. Numa m aquina de 64 bits, o processador l e uma palavra de 64 bits a cada ciclo. Parte do espa co de nomes j a foi ocupado18 pelos nomes dos comandos da linguagem. O resto vai ser ocupado pelas vari aveis que voc e denir no programa. Antigamente era um stress a preocupa ca o com denir vari aveis, para n ao esgotar o espa co de mem oria alocado. Hoje, em termos de mem oria, temos um recurso bem amplo, n ao se preocupe muito com a quantidade de vari aveis, se preocupe com a clareza do programa (para n ao perder tempo depois). Dena bastante vari aveis, com nomes bem claros e signicativos, dicilmente voc e ir a entalar a m aquina com suas vari aveis. Mas tenha em mente uma preocupa ca o, transforme-a numa obssess ao, denir apenas vari aveis locais. Logo eu voltarei a discutir este conceito. Vamos continuar a discuss ao de forma mais espec ca, aliada aos tipos de dados que as vari aveis v ao representar.

5.2

Os tipos de dados

O tipo de dado e a forma de denir o espa co que os dados, a informa ca o, vai ocupar na mem oria, claro isto e uma forma de ver tipo de dado. Logo voc e ver a que podemos ver o tipo de dado pela sua estrutura que e o aspecto que mais vai nos interessar como programadores. Estamos come cando do come co! O tipo mais simples de dados (que ningu em usa) e um bit, ( e usado indiretamente). Come camos a fazer uso dos bytes, um aglomerado de 8 bits. O tipo mais simples de dado e caractere, ocupa um byte. Come camos a usar c elulas el etricas de 8 bits, os bytes, e o tipo mais simples dados e um caracter, qualquer um dos arranjos com repeti ca o tomados oito a oito de bits19 . Isto d a 28 = 256 que e a capacidade de representar da tabela ASCII que tem 256 posi co es.

5.2.1

Tipos b asicos de dados

Depois vem os arranjos com repeti ca o quatro a quatro dos caracteres 0,1,2,3,4,5,6,7,8,9
que come camos dizendo quando a linguagem de programa ca o entrou em a ca o... 19 Luz acesa ou luz apagada, falando ` a moda antiga.
18 Lembre-se

141

o que d a 2564 = 4294967296 que s ao os dados do tipo int. A forma de obter os inteiros e por meio de uma codica ca o designada por PBCD - Packed Binary Coded Decimal e voc e pode eia consiste ler mais a respeito na Wikipedia, [17, Binary-coded decimal]. A id de evitar o uso simplesmente dos bin arios e tentar evitar a perda de espa co na mem oria. Lendo a respeito vai car claro o c alculo acima ou voc e pode simples ignorar este detalhe se aceitar que os inteiros ocupam 4 bytes. Em C++ este tido de dados est a divido entre 2147483648 inteiros negativos e 2147483647 positivos porque precisamos de um bit para representar o sinal negativo. Quer dizer que em GNU C++ tem mais n umeros negativos do tipo int do que positivos, um a mais. Aqui voc e v e a raz ao porque j a dissemos antes que n ao trabalhamos com n umeros inteiros em C++ e sim com o tipos de dados chamado int do qual existem 4294967296 - 1 = 4294967295 ( a soma da quantidade de numeros20negativos e positivos. Ent ao, quando denirmos int numero; o compilador separa 4 endere cos de mem oria para colocar os valores que voc e decidir guardar nesta vari avel e a inicializa (acendendo algumas das l ampadas), n ao se esque ca disto, se voc e denir uma vari avel sem a inicializar o compilador o far a por voc e. Um problema t pico consiste quando desejamos guardar os resultados de uma soma na vari avel sum. Esquecendo de inicializ a-la com zero pode resultar num valor errado para a soma. Exerc cios 48 (Tutorial) A inicializa c ao de vari aveis 1. O programa soma01.cc pretende calcular a soma de alguns inteiros, mas ele tem v arios erros (explicados nos coment arios). Corrija o programa. Solu c ao: soma02.cc 2. O programa soma04.cc tem um erro devido a m a utiliza c ao que faz do m etodo entrada int() denido em Ambiente.h. Descubra a raz ao do erro e corrija o programa. Solu c ao: soma05.cc Se voc e precisar duma listagem, por exemplo, dos alunos de sua turma, n ao use int, use short int que logo vamos descrever. O programa vai rodar mais r apido.
20 N ao s ao n umeros, e um tipo de dados que tem a estrutura alg ebrica isomorfa a dos inteiros m odulo 4294967295.

142

Um tipo particularmente importante para fazer contas e o float, n umero com ponto utuante. Eles ocupam o mesmo espa co que um inteiro, t em a mesma quantidade de d gitos que os inteiros21 e mais o ponto utuante. Um outro tipo de n umero racional e double que ocupa 8 bytes e seria o tipo dado importante para trabalhar com alt ssima precis ao, n ao sendo o caso use float que o programa car a mais r apido. A tabela seguinte descreve os tamanhos dos tipos de dados b asicos. Apresentamos os nomes em ingl es porque n ao tem sentido a tradu ca o destes nomes, a n ao ser que voc e v a programar22 em portugu es. tipo char bool unsigned short int short int unsigned int int oat double wchar t tamanho 1 byte 1 byte 2 bytes 2 bytes 4 bytes 4 bytes 4 bytes 8 bytes 2 ou 4 bytes varia ca o o que sai do teclado True, False 0. . . 65.535 = 216 1 -32.768 . . . 32.767 = 28 1 0 . . . 4294967295 2.147.483.648 . . . 2147483648 1.2e38 . . . 3.4e38 7 d gitos 2.2e308 . . . 1.8e308 15 d gitos

Ao declarar um n umero inteiro, voc e pode for ca -lo a ser sem sinal ou short com os suxos u, l, ul. Por exemplo int n=75u; para declarar n como inteiro sem sinal. O mesmo pode ser feito com os dados tipo float usand os suxos l, f.

5.2.2

Outros tipos de dados

Nem caberia aqui o t tulo desta se ca o, mas n ao encontrei um t tulo melhor. Qualquer tipo de informa ca o pode ser representada com um tipo dado construido a partir dos tipos b asicos de dados. No fundo eles ser ao arranjos ou produtos de arranjos dos tipos b asicos de dados. Algumas vezes um desses recebe um nome particular para simplicar a nomenclatura. Vamos ver alguns exemplos destas constru co es e logo voc e ver a que o limite est a em sua imagina ca o. Resolvemos, no nal do cap tulo 1 o problema da agenda telef onica usando um m etodo muito simples: editando uma linha de dados com o nome e o telefone de cada um dos contactos. O tutorial seguinte vai ampliar as possibilidades da agenda telef onica com um novo tipo de dados. Exerc cios 49 (Tutorial) Estrutura ou registro 1. Rode e depois leia o programa estrutura01.cc. Leia os coment arios no programa.
21 Porque, para os n umeros do tipo int, se guarda um byte para o sinal e nos do tipo float este espa co ca o para o ponto. 22 e isto e perfeitamente poss vel, consulte [13].

143

2. Transforme o programa estrutura01.cc criando as fun c oes que executam as diversas opera c oes do programa. Solu c ao: estrutura02.cc, estrutura03.cc 3. Altere estrutura.cc para reetir as suas necessidades de uma agenda, denindo melhor o tipo de dado pessoa

criando uma vari avel item, do tipo pessoa para organizar melhor o processamento. Fa ca a sua agenda de endere cos usando como modelos os programas estrutura05.cc - estrutura10.cc .

Leia um pouco mais a seguir sobre matrizes que elas podem ser u teis na constru c ao da agenda. 4. Rode e leia o programa tamanho.cc. O programa est a mal feito, em parte porque usa a biblioteca ambiente.h, altere-o para usar a classe Ambiente. 5. O programa tamanho.cc tem uma p essima apresenta c ao (layout) melhore isto, divida melhor as frases e as mudan cas de linha. 6. tipo de dado mais inteligente Podemos construir dados que carregam os seus m etodos23 consigo. Construa um tipo de dado, ponto, no plano, com duas coordenadas, x, y e um m etodo desenhar() - n ao se preocupe agora com a implementa c ao do m etodo desenhar(). Solu c ao: ponto.cc 7. Termine o planejamento do m etodo desenha() no programa ponto.cc fazendo com que as coordenadas do ponto apare cam na tela; Solu c ao: ponto01.cc, ponto02.cc O tutorial sobre estrutura lhe mostrou que e poss vel construir um tipo de dado usando o modelo struct. Voc e pode denir, com struct tipos formado de campos heterog eneos (ou n ao), as tabelas.

5.2.3

Tipo de dado mais evolu do

O exerc cio 6 e o que logo lhe sucede, na p agina 144, mostram como podemos construir um tipo de dado mais inteligente, contendo um m etodo encapsulado junto com o tipo de dado. O ponto, constru do no programa ponto.cc. Nos programas ponto01.cc, ponto02.cc s ao feitas duas implementa co es do m etodo desenha() apenas para mostrar duas maneiras de fazer e introduzir o comando inline e o operador :: de associa ca o hier arquica que faz a liga ca o entre vari aveis e estruturas (ou classes) a que elas pertencem.
23 Leia

mais sobre m etodo no cap tulo 7.

144

Este exemplo ainda lhe mostra uma forma de programar bem natural em programa c ao24 orientada a objeto: denimos um m etodo que n ao faz nada, foi feito assim em ponto.cc deixando para terminar a sua deni ca o em momento posterior. Esta forma de fazer representa um planejamento das a co es deixando que as pr oprias a co es sejam bem denidas por um membro espec co da equipe, sem que a equipe toda precise tomar conhecimento da forma como isto ser a feito. Quando os dados forem homog eneos Existe um tipo de dados b asico formado de campos homog eneos, a matriz, muito parecido com a matriz da Matem atica. Uma matriz com uma u nica linha simula os vetores e assim n ao precisamos de um tipo dado espec co para vetores. Os programas vetor01.cc, vetor02.cc mostram como voc e pode criar e mostrar matrizes. Neles tamb em voc e encontra como usar a formata ca o de n umeros decimais enviando para cout uma mensagem, coment ario (10). As matrizes em C++ usam o nome ingl es para matrizes, array e podem ser de int, float ou char ou de qualquer outro tipo de dados que voc e desejar. As matrizes, array, como tipo de dado em programa ca o s ao tabelas de dados homog eneos, qualquer tipo de dado que voc e desejar, apenas deve ser o mesmo tipo de dado em todas as entradas da matriz. A sintaxe e tipo de dado array[dimensao] em que dimens ao e quantidade elementos na matriz. Pode ser uma matriz multidimensional tipo de dado array[dimensao1][dimensao2][dimensao3] Por exemplo em estrutura05.cc denimos um tipo de dados pessoa uma tabela de m ultipla entrada pessoa array[30] que e uma matriz cujos campos ser ao do tipo pessoa, cada campo e uma tabela contendo um item da agenda telef onica. Isto somente e v alido dentro usando uma classe onde a tabela pessoa esteja denida, ou dentro de um programa, telefone05.cc, em que a tabela pessoa esteja denida, porque pessoa e um tipo de dado que denimos (n ao e um dado padronizado). A seguinte descri ca o lhe d a alguns exemplos de como construir matrizes: e uma cadeia de caracteres com 10 posi co es De caracteres. char array[9] (a primeira e zero, a u ltima e 9). De int. int array[49] e uma matriz de inteiros com 50 posi co es. Em C++ os ndices come cam de zero e n ao fazer uso correto disto implica em perda de espa co na mem oria.
24 Mas

que n ao pertence a POO, pode ser feita em programa tradicional.

145

De float. float array[9][19] e uma matriz de n umeros racionais com dimens ao 10 x 20 porque os ndices come cam em zero. De dados para uma agenda. Supondo que voc e tenha denido o tipo de dados pessoa ent ao pessoa array[49] lhe permitira construir uma agenda telef onica com 50 entradas do tipo pessoa. Precisa usar uma classe em que o objeto pessoa esteja denido. Neste ponto voc e tem tudo que precisa para terminar uma agenda telef onica, sem d uvida com uma boa quantidade de trabalho pela frente. Um tal projeto vai lhe dar uma boa experi encia no uso de classes e de orienta ca o a objeto. As combina co es dos tipos b asicos de dados os caracteres, char; as cadeias de caracteres (que na verdade s ao matrizes) de caracteres; os n umeros, int, float com suas varia co es; as matrizes, arrays; com o modelo struct permite que representemos qualquer tipo de objeto do mundo real num programa de computa ca o.

5.3

Vari avel global e local

As linguagens modernas de programa ca oa t em um conceito especial de vari avel local que se op oe ao conceito de vari avel global. Os exemplos v ao lhe deixar claro o que signicam estes conceitos e vou partir da an alise de exemplos para construir o conceito. As primeiras se co es fazem an alise do assunto e levantam a poeira, na u ltima eu xo os detalhes, mas sugiro que a u ltima seja lida numa segunda leitura. Depois do cap tulo 7, muito do que esta sendo dito neste cap tulo vai perder import ancia uma vez que as vari aveis car ao naturalmente localizadas em capsulas chamadas objetos. Entretanto, momentaneamente, ainda e importante fazer esta discuss ao.
a Deni ca o

aquilo que usamos e atualizamos hoje... de moderno? E

Se voc e usar uma vari avel sem den -la, g++ vai dizer-lhe que encontrou um nome desconhecido. Experimente, apague a declara ca o de alguma vari avel em um programa e execute a compila ca o. Por exemplo, em primeiro08.cc apague25 a linha int t=-1; e compile o programa. O resultado e primeiro08.cc:34: error: t undeclared (first use in this function)
25 N ao

e necess ario apagar, basta colocar o s mbolo de coment ario.

146

Antes26 todas as vari aveis eram globais, quer dizer, podiam ser vistas27 em qualquer parte do programa. Com a modulariza ca o, com o conceito de fun ca o, as vari aveis podem agora pertencer ao interior de um m odulo de programa ca o, e C++ joga forte com este conceito:

Quando voc e abrir um par de chaves, criou um m odulo e pode, no come co deste novo bloco l ogico, criar vari aveis que ser ao destru das fora das chaves (quando este bloco l ogico estiver fora de uso). Leia os programas bloco0*.cc.

N ao se trata apenas de exist encia e destrui c ao, que s ao as id eias centrais da frase anterior. Claro, isto faz parte do pr oprio conceito28 de vari avel local Se trata tamb em de uma forma de agir, pensar e usar um mecanismo para evitar que dados quem sem controle dentro de um sistema. Tenho que insistir neste ponto de vista porque ele representa uma forma mais segura de programar: evite as vari aveis globais. Esta se ca o pretende deixar claro este conceito e o incentivo ` a esta atitude, de evitar vari aveis globais. Voc e ver a, depois do cap tulo 7 que a programa ca o orientada a objeto naturalmente conduz ` a elimina ca o de vari aveis globais, mas elas podem ainda existir e o programador deve ter cuidado extremo com elas. Exerc cios 50 (Tutorial) Vari aveis locais 1. Rode o programa bloco01.cc. Leia o programa e os coment arios que ele encerra. Volte a rodar o programa e l e-lo at e compreender o signicado das vari aveis locais. 2. Altere o programa bloco01.cc dando nomes diferentes para as vari aveis na fun c ao main() - numero e na fun c ao bloco logico() - numero. Use, por exemplo numero01, numero02. Solu c ao errada: bloco02.cc 3. Leia o programa bloco02.cc, nele o coment ario (40) explica o erro. Corrija o programa bloco02.cc. Solu c ao: bloco03.cc 4. Veja no programa bloco04.cc uma forma esquisita de criar blocos l ogicos que C++ admite, simplesmente abrindo e fechando chaves. Leia os coment arios no programa, rode o programa e volte a l e-lo.
autor quer dizer nos prim ordios da computa ca o.... podiam exercer inu encia. 28 e da sistem atica do compilador, o compilador destroi as vari aveis locais quando o bloco em que elas estiverem denidas deixa de ser usado.
27 Pior, 26 O

147

Adjetivei de esquisito o processo que C++ admite para cria ca o de vari aveis locais dentro de um bloco l ogico denido pela abertura e fechamento de chaves. Leve a s erio este coment ario porque certamente voc e ir a em algum momento ser levado a criar tais blocos l ogicos, e inevit avel29 . N ao se esque ca de colocar coment arios na abertura e no fechamento. Esta localiza ca o das vari aveis protege o programa contra a exist encia de vari aveis que quem zanzando quais zumbis, perdidas dentro do programa... Em suma, e preciso convenc e-lo de que as vari aveis globais podem representar riscos muito grandes e devem ser evitadas a todo custo. Eu j a disse antes, estou repetindo, que quando voc e precisar denir uma vari avel global, deixe um coment ario a respeito no cabe calho do programa e ao lado da deni ca o da vari avel int numero; // vari avel global !!! que lhe sirva de alerta para que, se poss vel, alterar o status de vari avel global. A gura 5.1 mostra a rela ca o entre uma vari avel local e uma vari avel global denidas em um m odulo e um subm odulo do programa.

int numero=2; int numero=20; int numero=30;

Aqui numero vale 2

Aqui numero vale 20

Figura 5.1:

Vari avel global e vari avel local.

Na gura 5.1 voc e pode identicar tr es regi oes, O ambiente do programa todo, designado como externo;
numa primeira vers ao de um m etodo em que voc e est a trabalhando mas como boa programadora voc e deve deixar um coment ario dizendo evite esta coisa horr vel.
29 Inevit avel

Um m odulo;

148

Um subm odulo. O m odulo interno e chamado pelo externo, esta e uma situa ca o comum, e pode ser uma u nica linha de programa, um loop, por exemplo. A gura 5.1 pode representar, numa forma esquem atica, o programa bloco04.cc H a diversos fatos que posso salientar com respeito ` a vari avel numero: numero no bloco interno, nada tem o que ver com numero no bloco intermedi ario. As duas podem at e ter tipos diferentes, o que n ao seria nada aconselh avel. Neste caso deveriam ter identicadores diferentes. O valor que numero tem no bloco intermedi ario, conseq uentemente, e diferente do que a outra tem no bloco interno. H a raz oes fortes para que voc e tenha vari aveis t ao distintas mas com o mesmo nome. Se voc e estiver calculando uma soma, gostar a certamente de chamar sempre a vari avel que acumula os valores de soma. preciso ser cuidadoso com esta facilidade para n E ao pecar contra a legibilidade do programa, a sua compreens ao. Coment arios sempre ajudam. Suxos permitem que voc e use o nome adequado adaptado ao m odulo em que estiver a vari avel, por exemplo soma interna, soma externa. Quase todas as observa co es que foram feitas acima desaparecem quando voc e programar usando pequenas fun co es que resolvam pequenas tarefas. Todas as variaveis ser ao localizadas e o nome delas pode ser signicativo, repetido, sem nenhum risco, nem de compreens ao ou de confus ao. Vou repetir uma regra de trabalho: quando voc e abrir uma chave, pense se n ao deveria denir uma fun ca o. Quase sempre a resposta seria sim. Exerc cios 51 (Tutorial) Vari avel local ou autom atica 1. Leia e rode o programa fatorial023.cc. 2. O programa fatorial023.cc tem coment arios indicando pontos em que voc e deve ativar/desativar coment arios, eles servem para salientar o valor de uma vari avel dentro dos diversos blocos. Ative/desative os coment arios, e rode o programa, (ou copie o programa para teste.cc e neste novo programa apague os coment arios nos pontos indicados). Compile e rode o programa. 3. Analise no programa fatorial023.cc o uso dos coment arios que cont em um tipo de uso de coment a frase deixe esta marca.... E arios u til na etapa de desenvolvimentos, serve para sugerir pontos em que pode haver erro no programa (n ao e o caso aqui). 4. Transforme os coment arios com a marca deixe esta marca... no programa fatorial023.cc em fun c oes. Raz ao: o programa vai car mais limpo e leg vel. Isto vai for c a-lo a estudar no cap tulo 4 o assunto - passagem de valor. 149

5. Fa ca um uxograma para fatorial023.cc indicando os valores que a vari avel pode assumir em cada um dos blocos l ogicos do uxograma. 6. Leia e rode o programa var local.cc. Resumindo, voc e pode fazer o que a gura 5.1 sugere, mas n ao deve. O compilador ir a advert -lo dizendo que o valor de numero ensombreia30 o valor de numero, quando analisar o sub-m odulo. Embora as tr es vari aveis numero sejam tr es vari aveis diferentes, evite fazer isto. Use numero1, numero2, numero3 ou mesmo nomes mais sugestivos numero de fora, numero do meio, numero de dentro nunca esquecendo que a regra e que o programa que leg vel. Se numero representa a quantidade de gr aos de feij ao que o programa est a contabilizando, porque n ao chamar esta vari avel de numero grao feijao ? O programa var local.cc ilustra inclusive os riscos que fazem da linguagem C++ um ambiente de programa ca o delicioso. Rode o programa var local.cc e depois o leia. Fa ca isto diversas vezes at e que que claro o signicado de vari avel local e global. Exerc cios 52 (Tutorial) Tr es vari aveis com o mesmo nome es n veis em que a 1. Leia o programa global 01.cc e nele identique os tr vari avel numero est a denida. 2. Loop innito O programa global 01.cc n ao para31 (a n ao ser com ctrl-c). Altere as vari aveis, escolha outros nomes, de modo que o programa saia do loop. Sugest oes no coment ario (50). 3. O programa global 01.cc mostra como se pode usar de forma abusiva a deni c ao de vari aveis locais. Coloque alguns printf()s para detectar os valores que a vari avel numero tem no programa, indique quando imprimir em que se c ao ocorre o valor. 4. O uso de um mesmo nome para vari aveis diferentes ( e o caso, numero designa tr es vari aveis diferentes) e um fato positivo nas linguagens modernas, mas que pode se voltar contra a programadora. Leia global 01.cc e justique os coment arios (41), (42) e (43). O exemplo, no exerc cio anterior e uma representa ca o perfeita da gura 5.1 em que uma vari avel designada pelo nome numero existe em tr es ambientes distintos. Neste exemplo temos tr es ambientes dentro do grande ambiente representado pelo programa, queremos nos referir ao arquivo onde est a esta fun ca o e o cabe calho do programa. Analise global 01.cc. A vari avel numero est a
30 warning: 31 O

the variavel XXX shadows the variable XXX . programa pode estar alterado no disco, leia o coment ario (50)

150

denida em tr es ambientes. Rigorosamente falando, o singular est a errado. S ao tr es vari aveis denidas em tr es espa cos de nomes, com endere cos diferentes na mem oria. Rode e leia o programa fatorial023.cc, ele vai lhe exemplicar esta quest ao das vari aveis distintas com mesmo nome. O programa vai lhe mostrar os endere cos das vari aveis. Dentro do while() a vari avel tem um valor que se encontra em permanente altera ca o e nada tem o que ver com a vari avel que controla o la co. Conseq uentemente este programa n ao para nunca a n ao ser com ctrl-c. Rode e analise como os valores se alteram dentro do la co. Observe outro fato: no bloco interno a vari avel numero n ao foi inicializada e o compilador lhe atribui um valor sobre o qual a programadora n ao tem controle. Observa c ao 14 (Confus ao com vari aveis) A solu c ao
Programe construindo fun c oes, quebrando o programa em m odulos (leia fun c oes). Isto vai deix a-l@ preparad@ para trabalhar com orienta c ao ` a objeto.

Exerc cios 53 (Tutorial) Vari avel global e local 1. Modique o programa global 01.cc para que ele pare sozinho, acrescentando uma vari avel contador para controlar o while(). 2. Altere global 02.cc para que voc e possa ver as mensagens fora do la co e vericar assim que as vari aveis numero s ao diferentes. Solu c ao: global 03.cc 3. Por que o 9 e impresso seguidamente por global 03.cc ? 4. O programa32 polped.cc tem um erro s util que est a marcado com o coment ario (300). Leia o programa e o coment ario. A solu c ao do erro se encontra no programa polped 1.cc.

5.3.1

Coment arios sobre os exerc cios

Em global 01.cc, no in cio do ambiente interno, denimos a vari avel local numero, que se encontra representada pelo mesmo nome que a vari avel global denida no ambiente externo. Para C++, se trata de duas vari aveis diferentes. Quando o compilador inicia o processamento do ambiente (bloco) interno, cria um novo espa co de nomes onde registra a nova vari avel numero que acontece de ser designada pelo mesmo nome que a vari avel denida anteriormente. At e este momento nenhum problema. A coisa at e pode ser assim mesmo. Podemos e at e devemos usar o mesmo nome para vari aveis que venham a ter a mesma fun ca o em um m odulo interno de um programa. Isto pode tornar as coisas menos claras, mas tem suas raz oes, e um coment ario resolve este problema.
32 Este

programa ser a estudado no cap tulo 10, e um programa grande.

151

Esta e uma elipse da arte de programar. Mas n ao podemos considerar esta maneira de fazer como um m etodo de bem programar. A maneira de programar bem sugere que no bloco interno se acrescente um suxo ao identicador da vari avel.

Muito melhor do que esta confus ao provocada com o uso do mesmo identicador, seria usar uma pequena variante do nome: numero, numero local, numeroL por exemplo. Com a nova variante ca f acil identicar quem faz o que e se guarda o esp rito do nome: soma, numero, contador. Uma vari avel que deve contar, tem que ser chamada de contador, mas uma vari avel local que for contar pode ser chamada de contador local.

Anal, as mesmas facilidades que temos nos permitem construir um n umero grande de vari aveis, com nomes parecidos, mas indicadores da funcionalidade da vari avel: numero graos, numero bages, diferenciados por suxos que indiquem em que bloco, no programa, as vari aveis t em seus endere cos: soma parcial, soma total, soma cheques. O objetivo aqui, entretanto, e discutir o conceito de vari avel local em oposi ca o a vari ` avel global. O exemplo, embora grotesco, ilustra o fato. Ao entrar em um bloco interno, C++ permite que novas vari aveis sejam criadas. As vari aveis criadas em um bloco interno s ao locais, como dissemos acima. Novo espa co de nomes e criado e nova refer encia e assim feita entre estas vari aveis e seus valores. Assim que o programa abandona o bloco, as vari aveis ali criadas s ao destru das. Deixam de existir. Refer encias a nomes iguais, como no programa acima, v ao ter valores diferentes dentro do bloco l ogico, onde vale o valor local, ou fora do bloco l ogico o que voc onde vale o valor global. E e pode ver ao rodar global 01.cc.

Quando voc e abrir uma chave, num programa em C++, um novo espa co de nomes ser a criado. Voc e pode denir novas vari aveis neste bloco. Uma das vantagens de C++ e que voc e pode denir as novas vari aveis em qualquer lugar no bloco. Embora isto seja permitido, evite de fazer assim por uma quest ao de organiza c ao do trabalho. Siga a regra da velha linguagem C que estabelecia que novas vari aveis deveriam ser denidas no in cio de cada bloco. 152

Embora seja uma repeti ca o, vou dizer: Adquira um h abito. Sempre que for abrir uma nova chave, se pergunte se n ao deveria denir uma nova fun ca o... O h abito de construir fun co es para executar pequenas tarefas elimina muitos dos problemas que estou discutindo aqui. As fun co es s ao um processo natural de localiza c ao dos dados (das vari aveis). Logo vou usar m etodo, em vez de fun c ao, preferencialmente. Os m etodos, s ao as fun co es denidas dentro dos objetos.

O conceito global e relativo. Imagine tr es blocos de programa, um inserido no seguinte. A gura 5.2 p agina 153, mostra isto.

int numero=2; B int numero=20; D int numero=300;

C int numero=30;

Figura 5.2:

Vari avel global e local

Vari aveis denidas no bloco m edio ser ao globais relativamente ao bloco mais interno, e locais relativamente ao bloco mais externo. Ainda tomando como refer encia a gura 5.2, uma vari avel denida no bloco l ogico A e vis vel nos blocos l ogicos B,C,D a n ao ser que haja outra vari avel com mesmo nome em alguma destas regi oes interiores. Se houver uma vari avel com o mesmo nome, denida num bloco interno, os valores desta nova vari avel v ao se sobrepor ao da vari avel externa, dentro do bloco. Sublinhando a u ltima frase. Uma vari avel numero denida em A ser a sobreposta por outra, de nome numero denida em B. O programa global 02.cc ilustra isto muito bem. 153

Uma vari avel denida no bloco l ogico D n ao existe nos blocos l ogicos A,B,C. Ela ser a destru da quando o programa sair do bloco D. Um exemplo desta situa ca o pode ser vista no programa global 04.cc. Rode o programa e o leia para vericar que confere. A situa ca o descrita no exemplo acima, de vari aveis com exatamente o mesmo nome em m odulos encaixados, deve ser evitada. N ao conseguimos imaginar nenhuma situa ca o interessante em que este exemplo possa ser usado sem riscos (confus ao). Au nica utilidade deste exemplo, e voc e deve rodar programa global 01.cc para ver o que acontece, e alert a-lo para n ao correr este risco. Mas importante do que discutir o exemplo e compreender a import ancia do conceito e da metodologia que ele encerra. Observemos algumas conseq u encias que podemos deduzir do experimento feito acima. As vari aveis locais t em vida limitada, relativamente curta, produzem, portanto, economia de processamento, importante em grandes programas. As vari aveis locais tendo vida local, permitem um controle mais efetivo dos seus valores. Sabemos exatamente em que m odulo, programa, elas se encontram (ou pelo menos poderemos saber...). Uma grave confus ao pode se originar de vari aveis locais com nomes id enticos aos de vari aveis globais. O uso de suxos local ou L nos nomes das vari aveis tornam os nomes diferentes, guardando o sentido que estes nomes tiverem. Se evitarmos a identidade de nomes entre vari aveis locais e globais, podemos concluir que o uso deste tipo de vari avel e recomendado. Devemos tomar como metodologia sempre que for poss vel adotar vari aveis locais e evitar o uso de vari aveis globais. Observa c ao 15 (Ainda...) Os nomes das vari aveis
importante garantir a legibilTudo que foi dito sobre os nomes das vari aveis, procede. E idade de um programa evitando que vari aveis distintas, que aparecem em distintos ambientes l ogicos, tenham o mesmo nome. coes - os m etodos. Entretanto a solu c ao denitiva para este problema vem no uso de fun Ao transferir todas as vari aveis para os m etodos o programador esconde dos seus colegas de trabalho as vari aveis que estiver usando e neste momento n ao interessa mais que nomes estiver usando. O conceito esconder aqui entra perfeitamente dentro do conceito de encapsulamento discutido no cap tulo 7. N ao se trata de esconder ou proibir nada de ningu em, a palavra correta seria proteger. Existe uma frase muito comum entre os habitantes do mundo do LinuX que traduz bem isto: n ao mexa, a n ao ser que saiba o que est a fazendo. Quer dizer: pode mexer, sim! mas se voc e souber o que est a fazendo. As fun c oes escritas por um programador, e testadas exaustivamente por seus colegas de trabalho, viram os m etodos de uma classe, tem todas as suas vari aveis protegidas, e se tudo estiver funcionando bem, ningu em precisa saber qual e o nome que as identica e estes mesmos nomes podem voltar a ser usados com qualquer vari avel, em outro m etodo da mesma classe. Esta e a solu c ao denitiva!

154

5.3.2

Erro com vari aveis locais polped.cc

Este programa vai voltar a ser discutido no cap tulo 10, neste momento ele representa apenas um exemplo de cria ca o de vari aveis locais com abertura/fechamento de chaves para criar um bloco l ogico. Voc e certamente precisar a de usar esta t ecnica e pode agora ver um exemplo dela. O programa polped.cc usa uma t ecnica interessante. Usa chaves para dentro delas, logo no come co, denir diversas vari aveis locais que facilitam a solu ca o de um sistema de equa co es. uma forma de fazer um borr E ao dentro do pr oprio programa, guardando a informa ca o de como foram feitos os c alculos. Analise no Cap tulo 11 o que acontece com os coment arios. As vari aveis locais servem para isto, tamb em. Quando o compilador entra no bloco, cria um espa co separado onde faz uma tabela de aloca ca o para as vari aveis ali denidas, j a dissemos isto, e depois as destr oi quando se fechar a chave (m do bloco l ogico). O erro do programador se deu porque, por uma casualidade (o programa e pequeno) as vari aveis A,B,C,D voltam a receber os mesmos valores que tinham antes. O programa tem uma forma de lhe mostrar que e assim, deixei um coment ario para provar-lhe o efeito se colocarmos valores absurdos para as vari aveis C,D. Procure o coment ario (301) e ative a linha indicada, compile e rode o programa. A corre ca o do erro se encontra no programa polped 1.cc. N os voltaremos a discutir este erro no Cap tulo 10, quando este programa vai ser estudado junto com a solu ca o nal que e polped02.cc. Exerc cios 54 (Tutorial) Profundidade de um algoritmo 1. Fa ca um diagrama, como na gura 5.1 para representar os programas dos exerc cios. 2. Chamamos n vel de profundidade de um programa ao n umero inteiro que me ca a maior quantidade de blocos encaixados num programa. A gura 5.1 mostra um programa cujo n vel de profundidade e dois. Calcule o n vel de profundidade dos programas dos exerc cios. 3. Calcule o n vel de profundidade de alguns dos programas da s erie prog*.cc. O n vel de profundidade e uma medida para analisar a complexidade de programas.

5.4

T ecnicas com o uso de vari aveis locais

Na introdu ca o, que por sinal estaria no momento oportuno para ser lida, insisti numa t ecnica de bem programar. A seguinte frase pertence a um outro autor e e repetida, com nuances diferentes, em todo livro de programa ca o: e t ao dif cil corrigir-se um programa ruim, que e melhor voltar a aprender a programar e fazer outro programa. 155

N ao h a nada mais verdadeiro, apenas e preciso n ao cair no mau h abito de preciso aprender a fazer coisas corsempre querer estar fazendo tudo de novo. E retamente desde o come co, em particular na arte de programar computadores33 . Programar e uma arte inserida na Ci encia dos Computadores. Um dos par ametros para medir se um programa e bom, indiscutivelmente e a beleza. Observe que n ao me rero ao resultado do programa na tela, e isto tamb em e importante. O c odigo do programa deve ser bonito, agrad avel ` a vis ao; deve ser f acil de ler, evitar que os coment arios poluam o aspecto visual; deve ser escrito de tal forma que outras pessoas o consigam entender e possam alter a-lo com facilidade; deve ser escrito de tal forma que possa ser reciclado. O contr ario desta lista de caracter sticas seria um programa que somente o autor consiga ler. O resultado, necessariamente, ser a um c odigo que nem o autor conseguir a ler algumas semanas depois. Programar computadores e uma arte e, conseq uentemente, e dif cil de ensin a-las a outras pessoas. Como arte, e uma quest ao pessoal, no sentido de que duas pessoas que resolvam o mesmo problema, computacionalmente, quase com certeza, v ao escrever c odigos distintos. Quase com certeza, tamb em, os programas v ao coincidir nos aspectos fundamentais, mas haver a detalhes diferentes. Voc e vai ter que desenvolver sua pr opria arte em programa c ao como cada programador desenvolveu a sua. Isto n ao nos impede, e muito pelo contr ario, e necess ario, lermos os programas feitos por outros programadores para com eles dominar os detalhes iniciais e os avan cados. Este algoritmo comportamental n ao e meu, o tirei de algum texto referente aos s abios monges tibetanos ou budistas, s abios e pacientes:

Quando ainda n ao soubermos, temos que acompanhar os mestres. Quando j a formos mestres, temos que car atentos nas diculdades dos disc pulos para manter acesa a capacidade de cr tica de nossos pr oprios m etodos. A arrog ancia, sem d uvida, e um ind cio de corrup ca o! E tome a palavra corrup c ao no sentido que voc e quiser. Funciona! Ao nal desta se ca o, vou transformar um programa extenso em m odulos mostrando-lhe como eliminar as vari aveis globais. Analisando um exemplo de programa que executa um item de um menu. O programa est a incompleto, falta a implementa ca o das fun co es: executa item do menu(inteiro item);
de um livro de Donald Knutt.

33 T tulo

156

apresentacao(). Vou transform a-lo eliminando a vari avel global. Exemplo 3 Programa com um u nica vari avel global na Figura 5.3 p agina 157,

1) 2) 3 4) 5) 6) 7) 8)

int main() { int item; apresentacao(); item = menu_do_programa(); executa_item_do_menu(item); return(item); }

Figura 5.3:

Uma vari avel em main().

Este programa tem apenas uma vari avel global, item, e se poss vel, devo elimin a-la. Este e um padr ao b asico de programas. Digamos que ele representa o planejamento inicial de qualquer projeto. Vou analis a-lo tendo sempre em mente a quest ao das vari aveis. int main(); Porque todo programa, todo projeto, falando de forma mais correta, tem uma fun c ao main()34 que ca no arquivo principal do projeto. E a gerente do sistema de programas que formam o projeto. No meio dos que programam em C++ e comum a arma c ao de que o tipo da fun c ao principal deve ser inteiro. O compilador do C++ reclama, se n ao for. int item; Uma vari avel global que vai servir de liga c ao entre o menu do programa(); au e a fun c ao que executa as op c oes do menu. E nica vari avel global do sistema. A fun c ao menu do programa(); apresenta as possibilidades do projeto e recebe do usu ario a sua inten c ao sob forma de um n umero inteiro que vai passar para executa item do menu(item); apresentacao(); Faz uma descri c ao do sistema. menu do programa(); O menu j a descrito. executa item do menu(item); Quem faz o trabalho.
34 Se o programa tiver uma mascara gr aca ele e produzida pela fun ca o main() que cont em os bot oes que ativam as outras a co es do programa.

157

return( tipo de dados); Todo programa deve terminar com este comando. Num aut entico programa em C++ deve ser sempre um inteiro, seguindo a tradi c ao. Este n umero deve informar ao sistema operacional se a execu c ao do programa35 foi feita corretamente, e em caso contr ario, informar o n vel de falha na execu c ao do programa. N ao precisamos, para um grande programa, mais do que uma vari avel global, e mesmo assim, uma, e muito. Todos os dados ser ao gerenciados localmente por fun co es espec cas chamadas a partir do menu que resolver ao todas as quest oes com as vari aveis enquanto elas estiverem no ar, deixar ao todos os dados gravados em disco antes de sa rem do ar, de modo que n ao haver a nenhum valor zanzando pela mem oria sem controle. Exemplo 4 Eliminando a vari avel global Compare o programa do Exemplo 5.3. Numeramos as linhas e agora algumas linhas v ao car faltando, porque foram eliminadas de um exemplo para o outro: e o objetivo, voc e identicar o que foi cortado.
1) 2) 4) 6) 7) 8) int main() { apresentacao(); executa_item_do_menu(menu_do_programa()); return(0); }

Figura 5.4:

Nova vers ao do programa

Na linha (1), denimos o tipo de dados da fun c ao main() como int. Observe que na linha (7) agora est a retornando 0. N ao precisava ser zero, poderia ser um n umero calculado dentro do programa que indicasse ao sistema operacional o n vel de funcionamento do programa, este e um detalhe mais especializado... Desapareceu a linha 3, porque n ao precisamos de vari avel global. Desapareceu a linha 5, porque a fun c ao menu do programa() foi parar dentro da area de par ametros de executa item do menu(). Desta forma, em vez de guardar a resposta de menu do programa() em uma vari avel global, repassamos esta resposta diretamente para a fun c ao executa item do menu(menu do programa() ) sendo assim desnecess ario o uso de vari aveis globais.
35 Veja

a deni c ao de programa no ndice remissivo, e a fun ca o main().

158

preciso observar que o programa cou menos leg E vel. Agora estamos usando o conceito fun ca o composta para eliminar vari aveis globais. Em computa c ao este assunto e registrado sob a rubrica passagem de valor . Isto deixa a l ogica do programa mais dif cil de entender. H a duas formas de resolver este novo problema: 1. Coment arios explicativos colocados nos pontos cr ticos do programa; 2. Uso de identificadores mais claros. Isto zemos no programa acima: executa item do menu(), diz, com o seu nome, que ela rea-la. cebe a escolha feita em menu do programa() e vai execut O tamanho dos identificadores e praticamente ilimitado: 256 caracteres (tr es linhas). Ningu em precisa de algo t ao grande, mas podem ser frases inteiras como executa item do menu(). A u ltima modica c ao, agora no nome de uma das fun c oes. Poderia car assim: apresentacao(); Faz uma descri c ao do sistema. menu do programa(); O menu j a descrito. executa item do(menu do programa() ); Quem faz o trabalho. Veja porque (a apar encia truncada do nome da u ltima fun c ao): A gura (5.5) p agina 159,

int main() { apresentacao(); executa_item_do( menu_do_programa() ); return(0); }

Figura 5.5:

Tecnicas para elimina ca o de vari aveis globais

Este programa existe, leia pensionato.cc. Leia-o! Eliminamos a vari avel global. Esta regra se propaga para dentro das fun co es particulares do sistema. Um bom sistema e feito de uma multid ao de pequenas fun co es cuja reda ca o deve caber na tela e que tenha controle completo de todas as vari aveis envolvidas. Se algum dado for enviado para outra fun ca o devemos nos arranjar para que 159

a fun ca o interessada receba este dado diretamente e voc e est a vendo aqui uma das principais fun co es do comando return ao nal de cada fun ca o. Eis um sistema seguro, eis uma forma avan cada de programar, mas observe melhor que algumas vezes pode produzir programas dif ceis de serem lidos. E n ao omitir vari aveis se isto for verdade, o use coment arios para indicar o que est a acontecendo. Vamos discutir na se ca o nal deste cap tulo como C++ transfere valores entre as fun co es. Exerc cios 55 (Tutorial) Transformando global em local 1. Leia e rode o programa padrao.cc. 2. Transforme padrao.cc num programa que fa ca alguma coisa. 3. Fa ca uma c opia do programa contabilidade.cc em outro arquivo, por exemplo teste.cc e transforme as etapas do programa em fun c oes, pelo menos tr es: apresentacao();

executa contabilidade(); passe o valor de opcao para uma vari avel inteira da fun c ao principal e passe esta vari avel como par ametro para executa contabilidade(). 4. Elimine a vari avel que recebe a op c ao de menu contabilidade usando esta fun c ao diretamente como par ametro de executa contabilidade(). Solu c ao: pensionato.cc 5. Erro de compila c ao No programa pensionato.cc, identique na fun c ao principal() a linha fim = executa pensionato(menu pensionato()); e nela troque menu pensionato() por menu pensionato rode o programa e analise a mensagem de erro produzida. Tente dar uma explica c ao para a mensagem de erro. ndice remissivo,ponteiros,tutorial. Solu c ao:

menu contabilidade();

160

5.5

Vari aveis globais

Discutimos o que eram vari aveis locais e conseq uentemente caria claro o que e uma vari avel global. Vamos, ainda assim, falar um pouco sobre este tipo de vari avel apenas para conscientiz a-lo de que quando denir uma vari avel deste tipo, deve-se colocar no programa uma mensagem alertando-o para o perigo em que voc e est a incorrendo. Se voc e estiver consciente disto, abandone esta se ca o, passe para a seguinte.

As vari aveis globais s ao todas que n ao se encontram dentro de um bloco l ogico. Quer dizer que dentro de uma fun ca o, sobre tudo em main() pode haver uma vari avel global, e estas s ao indesej aveis, mas algumas vezes e dif cil de evitar a sua exist encia. Mas quando nos rerimos a vari aveis globais queremos indicar aquelas que estiverem denidas no cabe calho do programa, antes da fun ca o principal() (main()). Voc e n ao viu nenhum exemplo disto em nossos programas. Durante toda a vida do programa, elas existem e t em um determinado valor que ca dif cil de ser controlado e s ao algumas das principais fontes de erro em programa ca o. Se voc e chegou at e aqui e uma prova de que n ao est a convencido de que as vari aveis globais s ao um mal desnecess ario. Ent ao precisamos lhe sugerir que fa ca os exerc cios da pr oxima lista para convenc e-lo do contr ario. Os programas que servem de base desta lista de exerc cios, com exce ca o de um, s ao todos exemplos de programas mal escritos, e este e, de fato, o objetivo. Exerc cios 56 (Tutorial) Problemas com vari aveis globais 1. Leia e rode o programa global 01.cc. A vari avel global nele denida n ao tem nenhuma import ancia, apague-a e volte a rodar o programa (basta colocar um coment ario na linha onde ela est a denida). Ela e in util. Este programa para com ctrl-c. a em loop innito36 . Altere o programa 2. O programa global 01.cc est para que ele fa ca alguma coisa interessante. Solu c ao: global 02.cc 3. No programa global 02.cc acontecem algumas coisas interessantes e voc e j a deve t e-lo rodado. Rode novamente e observe que g++ d a um novo valor para numero a cada rodada do la co mas o faz de forma coerente: mant em o valor antigo calculado por numero--. Analise a diferen ca em global 03.cc. 4. O programa global 04.cc tem diversos defeitos. Leia e rode o programa. Ao compil a-lo, g++ come ca por advert -lo de que a deni c ao de uma vari avel ensombreia a vari avel numero (shadows). Corrija isto com um coment ario no local certo. Ver coment ario (50). Ele sempre vai observar isto quando voc e denir um par ametro com mesmo nome de uma
36 Dizemos

isto quando um programa entrou num la co do qual n ao poder a sair.

161

vari avel local. Qual foi o n umero que o programa imprimiu? Se voc e desejasse que 10 fosse impresso, (como quer amos...) n ao daria certo! 5. Rode e leia o programa global 05.cc. Descubra porque ele diz que imprimiu os dados de uma sucess ao, mas isto n ao aconteceu. Solu c ao: global 06.cc 6. Rode e leia o programa global 07.cc. Observe que no prot otipo as vari aveis podem ser declaradas sem nomes. Leia o coment ario no programa. 7. Os programas global 05.cc , global 06.cc, global 07.cc n ao usam a classe Ambiente. Altere isto e melhore estes programas. 8. Os programas global*.cc n ao tem indica c oes sobre quem e o autor e n ao apresentam uma introdu c ao explicando o que far ao, altere-os incluindo fun c oes rotulo(), copyleft() para oferecer estas informa c oes ao usu ario. Deixe copyleft() protegida por uma pergunta que permita o usu ario n ao ser incomodado com repetidas informa c oes sobre o autor.

5.5.1

Constantes, um tipo de vari avel global

Esta se ca o poderia parecer em contradi ca o com o que dissemos sobre vari aveis globais, que devem ser evitadas a qualquer custo. Isto nem sempre e poss vel porque existem valores que devemos colocar em vari aveis - para que n ao sejam vari aveis e sim constantes. Num programa que use o n umero real , voc e poder a denir no come co do programa uma vari avel para guardar uma boa aproxima ca o deste n umero real e voc e n ao vai querer que mude de valor. Nestes casos voc e pode declarar float const pi = 3.14159265358979323848 que protege esta vari avel contra troca de valor. uma vari E avel global!

5.6

Ponteiro

Ponteiro e apenas o endere co de uma vari avel. Mais exatamente, criamos vari aveis de tipo ponteiro para guardar o endere co de outras vari aveis. Isto permite acesso indireto ` as vari aveis e tamb em acesso direto ` a mem oria da m aquina...

H a um preconceito que precisa ser combatido: um programa em C++ sempre se deve usar ponteiros. N ao precisa, nem sempre deve! 162

Ponteiro e uma facilidade que a linguagem oferece que voc e deve ter cuidado no seu uso, se realmente precisar usar. Eu n ao poderia omitir este assunto sem deixar uma lacuna importante num livro sobre C++, e alguma vez voc e pode necessitar de usar ponteiros. Na parte nal desta se ca o vou mostrar a forma mais evoluida que C++ tem para usar ponteiros. As vari aveis do tipo ponteiro guardam endere cos na mem oria que ser ao associados ` as outras vari aveis. Esta e uma forma r apida de acesso ` as vari aveis e de muita import ancia para programas que devem ordenar dados. Exemplo 5 (Ordenando o acerto) da prefeitura A prefeitura da cidade tem um importante acervo de pianos e outros objetos art sticos que cam guardados em um grande pr edio com sal oes amplos e arejados. Estes objetos saem regularmente deste local para serem usados em escolas37 , no teatro da cidade, em eventos. Seria dif cil mant e-los sempre no mesmo lugar, mais f no retorno. E acil alocar-lhes um endere co no retorno e manter uma tabela de endere cos, sempre ordenada, de modo a poder rapidamente localizar o objeto desejado. Os endere cos s ao sempre arrumados de modo que os objetos quem sempre (logicamente) na mesma ordem, por exemplo, em ordem alfab etica, naturalmente, numa p agina editada com um editor (n ao precisa ser em papel - vamos evitar de matar as arvores). exatamente o que pode acontecer com um programa de banco de dados. E Em vez de ordenarem-se os dados, ordenam-se os endere cos (os ponteiros). Mas voc e pode programar muito bem em C++ e usar raramente ponteiros. Vai depender do tipo de programa que voc e zer. Como os ponteiros usam o endere co f sico da m aquina, e preciso ter cuidado com eles e aprender a us a-los corretamente. Eles representam a u nico risco38 s erio em programas escritos em C++. Tenha cuidado e, inicialmente, n ao use ponteiros, pelo menos enquanto n ao sentir seguran ca no que estiver fazendo. Os exemplos seguintes v ao deixar bem claro o que e ponteiro. O importante nesta introdu ca o e desmisticar e ao mesmo tempo mostrar a import ancia deste tipo de dado. Uma vari avel do tipo ponteiro aponta para um endere co inicial de mem oria para guardar (ou acessar) um tipo de dado: int, float, etc... Observa c ao 16 Forma errada de falar Dizer que uma vari avel e do tipo ponteiro e uma maneira errada de falar, apesar de ser usual. Devemos sempre dizer ponteiro para um determinado tipo de dado porque frequentemente o dado em quest ao ocupa um segmento de mem oria, n ao um u nico endere co, ent ao e preciso ter consci encia de que
voc e souber onde ca esta prefeitura, me mande o endere co. raz oes s ao, que voc e pode extrapolar o espa co do programa, ou esquecer de apagar um link para um endere co, e o chamado vazamento de mem oria.
38 As 37 Se

163

poder a39 ser necess ario uma sucess ao de ponteiros (endere cos) para fazer refer encia a este tipo de dado. e um ponteiro que poder a40 estar apontando para ponteiro do tipo int um endere co onde car a guardada uma vari avel do tipo int; ponteiro do tipo float que poder a estar apontando para um endere co onde esteja guardado um dado do tipo float, quando voc e o sincronizar com uma vari avel do tipo float.

5.6.1

Referenciando dados via ponteiro

Come cando com um exemplo. Um dado do tipo int, por exemplo, ocupa 4 bytes, quer dizer, quatro endere cos consecutivos na mem oria. Vamos ver como fazer refer encia, via ponteiro, a este tipo de dado. Primeiro voc e dene duas vari aveis int numero; int *numero ptr; O asterisco e que indica para o compilador que a vari avel numero ptr vai guardar um endere co. Poderia ter sido int *numero2, mas os programadores tem o bom h abito de usar o suxo ptr para uma vari avel do mesmo do tipo de dado a que pretendem fazer refer encia indireta. Em algum ponto do ponto programa fazemos a sincroniza c ao numero ptr = &numero; A partir deste ponto no programa est a feita associa ca o, a vari avel numero ptr guarda o endere co inicial da vari avel numero. Podemos acessar o valor de numero indiretamente com o operador * cout << *numero ptr envia para a sa da de dados padr ao41 o dado do tipo int armazenado a partir daquele endere co. De forma mais geral, voc e pode criar uma vari avel do tipo ponteiro com a seguinte declara ca o: Com esta declara ca o, voc e
geral os m etodos para sa da de dados controlam bem o tamanho do dado como o programa ponteiros01.cc mostra. Algumas vezes e preciso contruir a sucess ao de endere cos. 40 Sim, poder a, porque quando voc e cria um ponteiro, ele aponta para o NULL, depois e voc e quem vai sincroniz a-lo com algum endere co. 41 sa da de dados padr ao indicando que voc e pode alterar para onde ser ao encaminhados os dados, pode ser para um arquivo em disco.
39 Em

164

um_tipo nome, *nomeptr; // uma varivel do tipo ponteiro

Figura 5.6:

Vari avel ponteiro do tipo XX

Criou a vari avel nome do tipo um tipo; nomeprt criou um ponteiro para guardar o endere co de uma vari avel, do tipo um tipo; e deve ter observado que h a apenas uma declara ca o Uma u nica declara ca o. Voc para as duas vari aveis, mas isto diminue a legibilidade do programa e duas declara co es n ao aumentam em nada o tamanho do programa. O que indica que nomeptr e um ponteiro e o asterisco que aparece na e apenas uma declara ca o antecedendo o nome da vari avel. O suxo ptr conven ca o que a maioria dos programadores adota para chamar aten ca o de que se trata de um ponteiro. N ao sigo, elmente, em meus programas, esta conven ca o, mas coloco coment arios indicativos, por em e um erro n ao acompanhar a experi encia que os outros t em. N ao me acompanhe nos meus erros! Separou na mem oria espa co suciente e necess ario para associar com a vari avel nome. Por exemplo, se nome for do tipo int haver a 4 bytes separados a partir de um ponto inicial de mem oria; Em algum momento, no c odigo do programa, voc e dever a incluir o seguinte comando: nomeptr = &nome;

que far a a associa c ao entre nome e os endere cos reservados por nomeptr. somente a partir deste momento que ca feita associa E ca o entre nome e o endere co nomeptr. Analise um exemplo em ponteiros071.cc, procure o coment ario (20) Mas, como sempre, melhor mesmo e ver programas rodando. E voc e tem mais de uma dezena de programas sobre ponteiros no disco que voc e recebeu com este livro. Experimente ls pont*.cc Os exerc cios que seguem tem o objetivo de dar-lhe algum treinamento no uso de ponteiros, entretanto um dom nio do assunto vir a quando houver uma motiva ca o adequada, e haver a bastante na segunda parte do livro. Neste momento voc e ser a convidado a rodar os programas ls ponteiros*.cc, novamente. 165

Exerc cios 57 (Tutorial) Ponteiros Vou trabalhar com os programas ponteirosXX.cc 1. Rode e depois leia ponteiros.cc. Leia tamb em os coment arios do programa e volte a rodar o programa. 2. Rode e leia o programa ponteiros071.cc. 3. Observe tamb em as considera c oes nais do programa ponteiros071.cc e tome uma posi c ao a respeito, por exemplo, transforme-o em aut entico programa orientado a objeto usando Ambiente.h. 4. Leia e rode o programa trocatroca.cc. 5. Experimente imprimir com printf() o nome de alguma fun c ao e analise o resultado. Por exemplo, altere a fun c ao main() dentro do programa menu.cc para que ela contenha apenas o comando: printf(executa); Solu c ao: menu end.cc 6. Altere menu end.cc denindo mais algumas fun c oes e mande imprimir os seus endere cos. Observe que o resultado deste tutorial e que os nomes das fun c oes s ao ponteiros. 7. Rode o programa ponteiros011.cc. Ele e uma altera c ao de ponteiros01.cc para exibir o comando e o resultado. 8. Altere o programa ponteiros01.cc incluindo novas vari aveis (com os respectivos ponteiros) para que voc e entenda como est a utilizando ponteiros. 9. Melhore ponteiros01.cc incluindo mensagem indicativa de que tipo de dado o programa espera. N ao se esque ca de alterar o nome do programa, os programas erradost em uma fun c ao espec ca de laborat orio e n ao devem ser alterados. De qualquer forma os programas originais se encontram no CD... 10. Altere ponteiros01.cc solicitando outros tipos de dados, como caracteres, n umero real, etc... N ao se esque ca de alterar o nome do programa. N ao se esque ca de declarar corretamente as vari aveis observando-lhes os tipos. 11. Leia, rode e leia o programa ponteiros02.cc. Acrescente novas vari aveis, rode novamente o programa at e que que claro o uso dos operadores & - endere camento , * refer^ encia. 12. Leia e rode os programas ponteiros03.cc e suas altera c oes que s ao os programas ponteiros031.cc, ponteiros032.cc 166

Com ls ponteiro*.cc voc e vai encontrar uma cole ca o de programas que fazem diversas experi encias com ponteiros. Alguns deles cont em erros e um coment ario dizendo qual e o erro que eles cometem. Possivelmente voc e n ao vai precisar de experimentar todos este programas, e porisso que eles n ao est ao sendo citados diretamente no texto. Observa c ao 17 Identicadores de fun c oes Os identicadores das fun c oes s ao vari aveis do tipo ponteiro. Voc e deve ter visto isto no programa menu end.cc. Observa c ao 18 Os ponteiros s ao uma facilidade da linguagem. Com a capacidade de acessar e manipular os dados diretamente na mem oria, a linguagem ganha uma rapidez t pica da linguagem assembler que faz exclusivamente isto. Linguagens mais evolu das dentro da escala da abstra c ao n ao permitem que o programador acesse diretamente a mem oria, elas fazem isto por eles. Com isto se ganha em seguran ca que falta ao C++ . muito dif E cil evitar o uso dos ponteiros uma vez que o planejamento da linguagem foi feito com este objetivo. Quando usar de forma direta, deixe coment arios e use vari aveis indicativas e uma vari avel disto. Use o suxo ptr, como numero ptr indicando que apontando para um endere cco do tipo que numero tiver. Quando denir numero ptr, dena tamb em numero, de prefer encia em linhas separadas, mas logo a seguir. Nunca use um ponteiro como uma vari avel global. Como j a disse anteriormente, se voc e declarar uma vari avel como int, e nela guardar um n umero em formato de ponto utuante, o risco mais elementar que o seu programa pode correr e que os dados quem corrompidos porque vai se processar um arrendondamento do n umero real que voc e certamente n ao esperava. Mas se voc e zer isto usando ponteiros pode haver uma superposi c ao de dados ou um estouro de mem oria. H a diversos exemplos disto entre os programas ponteiros*.cc com os quais voc e pode experimentar tranquilamente porque s ao pequenos e os erros est ao controlados. Em LinuX um programa que contenha este tipo de erro ser a parado pelo sistema com a mensagem Segmentation fault que signica que houve uma falta por tentativa de acessar uma parte da mem oria al em do segmento alocado para o programa. Um risco maior e que o setor de mem oria reservado ao C++ seja estourado e outros programas do sistema venham a ser corrompidos e conseq uentemente o computador que pendurado. Mas o sistema operacional cuida disto e n ao permite que nenhum programa ultrapasse o espa co que lhe for alocado a n ao ser um programa muito malicioso. 167

Portanto, todo cuidado e pouco no uso de ponteiros, e por outro lado, se perde uma grande possibilidade da linguagem se eliminarmos o uso dos ponteiros, ao programar em C++ . Mas voc e pode, literalmente, programar em C++ sem usar42 ponteiros. Alguns autores sugerem fortemente esta atitude. Sempre que poss vel evito o uso de ponteiros, se tiver outra alternativa, e uma delas consiste em guardar dados em arquivo, em disco, e traz e-los de volta quando necess ario. Claro, estou usando ponteiros indiretamente, porque a vari avel que aponta para um arquivo em disco e um ponteiro. Compare os programas agenda.cc que n ao usa ponteiros e nem serve para grande coisa, e agenda02.cc que dene uma vari avel do tipo FILE (leia o coment ario (3.1)). Procure o coment ario Lan cando os dados no arquivo. A partir deste momento o programa usa uma fun c ao semelhante a printf(), agora fprintf(), para escrever os dados da agenda em um arquivo em disco, e est a usando ponteiros. Este programa foge dos meus objetivos neste livro, mas ele tem coment arios em abund ancia de modo que se voc e quiser us a-lo para fazer sua agenda de endere cos, ser a certamente f acil, sobre tudo se voc e tiver esta motiva c ao. Observe que numa mesma declara ca o e poss vel, com o uso da v rgula, declarar vari aveis do tipo ponteiro e do tipo comum: int *n,m ; n e do tipo ponteiro apontando para um n umero inteiro, e m e do tipo inteiro, guardando o valor de um n umero inteiro. Mas se trata de um mau h abito, porque as duas declara co es, a que est a acima, e a que vem logo abaixo int *nptr; int m; ocupam o mesmo espa co quando o programa for compilado e diferem de uma pequena quantidade de bytes43 quando guardadas em disco, entretanto a segunda e mais leg vel que a primeira e deve ser esta a forma de escrever-se um programa, da forma mais leg vel, para que os humanos consigam l e-los com mais facilidade, uma vez que, para as m aquinas, as duas formas s ao id enticas. N os escrevemos programas para que outras pessoas, que trabalham conosco, na mesma equipe, possam ler com mais facilidade e assim o trabalho em equipe possa uir. As seguintes declara co es podem ser encontradas nos programas: /* duas vari aveis do tipo ponteiro para guardar endere cos de mem oria onde est~ ao guardados n umeros inteiros. */ int *n,*m;
42 Isto 43 Um

e falso, o que se pode dizer e sem usar diretamente ponteiros. byte e formado de 8 bits, e um bit e um zero ou um 1. Os bytes s ao matrizes de 8

bits.

168

/* vari aveis de tipo inteiro. */ int l,p; char palavra[34];

/* vari avel de tipo ponteiro apontando para local de mem oria onde se encontra guardada uma vari avel de tipo vetor de caracteres */ char *frase; /* vari avel de tipo ponteiro apontando para local de mem oria onde se encontra guardada uma vari avel de tipo ponto flutuante. */ float *vetor; signicando respectivamente que se criaram vari aveis de tipos diversos algumas do tipo ponteiro, como est a indicado nas observa co es.

5.6.2

Opera c oes com ponteiros.

Crucial e o processo operat orio com ponteiros. Vou discutir isto em dois momentos: Acesso ` as vari aveis do tipo ponteiro; Opera co es aritm eticas com ponteiros; Acesso aos ponteiros. As opera co es de acesso aos ponteiros s ao: Atribuir um valor ao endere co apontado. Isto pode ser feito de duas formas: 1. Leia ponteiros01.cc numptr = &num; se houver algum valor atribu do a num, o que sempre44 h a, ent ao ca 45 indiretamente atribu do um valor ao endere co &numptr. Voc e pode acessar este valor com o operador * assim cout << *numptr 2. Leia ponteiro.cc *numptr = outro valor que vai atribuir, indiretamente, ` a vari avel num o valor outro valor. Em ambos os casos, mais do que atribuir um valor a um endere co o que est a sendo feito e associar um endere co a uma vari avel. De
44 Guarde isto em sua mem oria, sempre h a algum valor em uma vari avel, ou voc e escolhe o valor, ou o compilador escolhe! Escolha voc e! 45 Forma incorreta de falar. Ponteiro e uma vari avel que associa valores e vari aveis, mas e a maneira corrente de falar.

169

agora em diante mudan cas de valores em num s ao automaticamente associadas com o endere co &numptr. feito com o operador &. Explicitar o endere co. E Ir buscar um valor associado ao endere co apontado. operador *. Opera co es aritm eticas com ponteiros. Por raz oes obvias, s o h a tr es opera co es que se podem fazer com ponteiros: umero inteiro, Somar um inteiro a um ponteiro. Somar (ou subtrair) um n mas neste caso este inteiro vai ser soma multiplicado pelo quantidade bytes (c elulas de mem oria) que o tipo de dado do ponteiro ocupar. Lembre-se do exemplo da casa nos quarteiros bem planejados, casa + 3 signica casa + 3*20m porque cada casa tem 20m de frente. Comparar ponteiros. Comparar dois ponteiros (leia: comparar dois endere cos) para saber quem vem antes ou depois. Incrementar ponteiros. Alguma das opera co es numptr++, ++numptr, --numptr, numptr-que novamente signica somar ou subtrair uma unidade (multiplicada pela quantidade de bytes que o tipo de dado ocupa) ao endere co representado pelo ponteiro numptr. Relembre o exemplo das casas de 20m no quarteir ao: casa++ signica um salto de 20m Voc e faz usualmente estas opera co es quando est a andando numa rua em busca do endere co de algu em... (as tr es opera co es): co rua X numero tal. *variavel ? Quem reside no endere variavel + 500 Se voc e estiver em frente ` a casa 250 e procurar alguem que more na casa 750, voc e sabe (se estiver numa cidade organizada) que tem que andar 5 quarteir oes, porque cada quarteir ao mede46 100 metros. & variavel1 = & variavel2 Voc e compara o endere co que tem anotado com as placas nas portas das casas para saber se tem que andar mais para frente ou voltar um pouco. incremento com ponteiros. Uma das agilidades de C++ se encontra na sintese: x++ e o mesmo que x = x + 1. E se x for um ponteiro ? O resultado ser a o pr oximo endere co do tipo de x. Leia o programa ponteiros071.cc, ele lhe dar a este exemplo.
46 Onde

feito com o E

ca esta cidade ?

170

Ponteiro e endere co, e da mesma forma como n ao teria sentido somar endere cos de casas, n ao tem sentido somar ponteiros, mas tem sentido somar um n umero inteiro47 a um ponteiro, ou subtrair. N ao tem sentido voc e somar o endere co da casa do Jos e com o endere co da casa do Jo ao porque isto n ao vai identicar nenhuma casa em nenhuma rua. E um erro voc e tentar somar dois ponteiros, rode o programa ponteiros soma.cc, ele est a errado e o compilador vai lhe dizer isto, leia o programa depois. Tamb em a u nica opera ca o l ogica natural com ponteiros e a compara ca o para determinar a igualdade ou uma desigualdade entre os endere cos para os quais eles apontam. Exerc cios 58 (Tutorial) Ponteiros 1. Rode e leia ponteiro03.cc, fa ca o que o programa pede, e volte a rodar o programa. 2. Ao rodar ponteiro03.cc, voc e pensou nas respostas antes de olhar o programa? Justique os 20m. 3. Altere ponteiro03.cc considerando um bairro mais pobre em que as casas tem largura de 10m (todas de mesma largura), mas os quarteir oes continuam com 100 m. 4. O programa ponteiro04.cc n ao pode ser compilado. Observe qual o erro e o corrija. Depois de corrigido, rode o programa. N ao altere o programa, mude-lhe o nome. 5. Altere o valor da vari avel em ponteiro04.cc e volte a rodar o programa. Altere o valor da vari avel colocando nela uma frase que tenha sentido. Volte a rodar o programa. 6. Acrescente a mudan ca de linha no comando de impress ao de ponteiro04.cc, dentro do loop, e volte a rodar o programa. 7. Verique porque ponteiro05.cc n ao roda, corrija-o e depois rode o programa. A solu c ao se encontra no coment ario do programa. 8. Traduza para o ingl es todos os programas da suite ponteiro0XX.cc.

5.7

Apontando para o endere co

Tudo o que disse acima sobre ponteiros, t pico da linguagem C, vale para C++, entretanto agora temos uma forma mais agil de fazer refer encia ao endere co, sem precisar de criar vari aveis do tipo ponteiro. Oferece a mesma agilidade, com uma vari avel a menos. No pr oximo tutorial vou fazer uso dos programas valor ref01.cc valor ref02.cc
teria sentido somar ao endere co de uma casa 20 metros para saber onde come ca a pr oxima casa. Com ponteiros somamos o tamanho do tipo de dado.
47 Como

171

Exerc cios 59 (Tutorial) Passando valor por refer encia 1. Leia os programas valor ref01.cc valor ref02.cc inclusive os coment arios. 2. Compile e rode valor ref01.cc num terminal. 3. Compile e rode valor ref02.cc num terminal diferente daquele que em ao id enticos, que voc e rodou valor ref02.cc. Verique que os resultados s comn exce c ao da formata c ao dos dados. Mas e poss vel conseguir tamb em esta semelhan ca, eu n ao me preocupei com isto. 4. No programa valor ref01.cc eu usei ponteiro, o coment ario (10) indica onde criei uma vari avel-ponteiro para float. No programa valor ref02.cc eu n ao preciso de ponteiros. Na deni c ao de f() eu usei float & x que signica pegue o valor no endere co de x. Isto equivale a f(*ptr float) no programa valor ref01.cc. Procure o coment ario (50) neste programa. 5. Estou usando a fun c ao free(), coment ario (60) em valor ref01.cc, mas que e desnecess aria neste programa, e um programa muito pequeno, quando ele parar todos ponteiros por ele criado ser ao desativados. Mas em proe inteiramente gramas grandes isto e importante. Em valor ref02.cc desnecess ario.

5.8

Fun c ao ponteiro

Esta se ca o n ao ser a usada antes do cap tulo 9 onde ela ser a mencionada de formas que uma leitura r apida e aconselh avel quando voc e passar por aqui pela primeira vez.

Ponteiro e apenas um endere co, e isto e muito poderoso e pode ser perigoso. Aprenda primeiro a usar ponteiros, e quando for necess ario, use-os. Mas voc e pode programar sem usar ponteiros. Algumas vezes somos for cados a isto. Aqui vou apresentar-lhe um tipo de ponteiro, para uma fun ca o. Exerc cios 60 (Tutorial) Ponteiros para uma fun c ao 1. Rode o programa ponteiros28.cc e depois leia o programa. 2. O programa usa a biblioteca funcao.h Compile o programa ponteiros28.cc com g++ -Wall -oprog ponteiros28.cc e rode ./prog ou apenas prog se o sistema estiver bem instalado. leia e altere a equa c ao da fun c ao na biblioteca.

172

Volte a rodar ./prog sem compilar novamente. O resultado e que os n umeros obtidos s ao os antigos e portanto as modica c oes na biblioteca funcao.h foram ignoradas. Volte a compilar e rodar, agora voc e vai obter os resultados referentes a nova equa c ao que est a em funcao.h

5.8.1

Como funciona?

Quando voc e compila um programa, com comp la ca o est atica48 o compilador cria um execut avel que cont em o conte udo das bibliotecas incorporado ao programa. O comando de compila ca o, no tutorial, criou o execut avel prog. Ao alterar os dados na bilioteca funcao.h isto nada signica para o arquivo execut avel que j a foi criado. Au nica forma de que o programa registre as modica co es feitas na bilioteca funcao.h e se o programa for recompilado. No cap tulo 9 vou fazer uso disto com uma solu ca o que n ao e das melhores, mas e f acil de ser aplicada imediatamente. Porque e assim? Ao criar um execut avel, este programa, quando entrar em a ca o, solicita ao sistema operacional um segmento de mem oria em que ele vai trabalhar. Tudo se passa de forma muito parecida com os antigos programas em BASIC descritos no cap tulo 1. Esta e essencia do modelo de programa ca o que usamos (as m aquinas que usamos entendem). Um programa (depois de compilado) e uma tira semelhante a um programa em BASIC, apenas escrito no assembler da m aquina que voc e estiver usando. Um fun ca o, no programa, tem um endere co inicial, rode ./prog e verique isto. Pelo tipo de fun ca o o programa sabe tamb em onde termina o c odigo da fun ca o e l a tem uma instru ca o para que o programa pule de volta para o ponto imediatamente posterior ao de onde saiu para executar o c odigo da fun ca o. poristo que ao usar uma fun E ca o ponteiro e preciso dizer o tipo de dado que a fun ca o retorna e o tipo de dado da vari avel (ou das vari aveis) da fun ca o. Esta informa co es permitem que o compilador calcule o tamanho do espa co, na mem oria, que a fun ca o vai ocupar e possa determinar o endere co inicial e nal. Todos os endere cos mencionados acima s ao virtuais, o programa dorme a maioria do tempo, e entra em execu ca o quando o sistema operacional o chama para trabalhar, e neste momento o seu espa co em mem oria e realocado com o mesmo tamanho, mas com novos endere cos. Para o programa n ao mudou nada, ele apenas sabe que vai trabalhar da posi ca o 000000 at e a posi ca o faa00abcdef (valores ct cios) de mem oria, e o sistema operacional sabe onde, na mem oria, esta tira cont nua de endere cos de fato se encontra. E nesta tira o programa sabe onde se encontra o endere co inicial e nal da fun ca o chamada. preciso um pouco mais de elabora E ca o para ter bibliotecas linkadas em tempo de execu ca o que n ao vou discutir neste livro. Para evitar isto vou tra48 E

existe compila ca o din amica de que n ao vou tratar aqui.

173

balhar com dois programas, um programa escravo e outro master, no cap tulo 9. Procure, no ndice remissivo, programa master que se quiser ver, agora, como isto e feito.

5.9

Valores na linha de comando

Esta se ca o e um texto de refer encia e possivelmente somente deve ser lida quando voc e encontrar uma sugest ao de leitura apontando para c a. Mas voc e n ao deve se assustar com que o autor diz ou pensa, siga na leitura que vamos discutir aqui argumentos na linha de comando de um programa, um programa que roda assim: fatorial 4 e calcula o fatorial de 4. H a alguns programas na cole ca o que voc e recebeu que fazem uso de valores na linha de comandos: e um programa simples que continua a suite de pro fatorial04.cc este gramas fatorialXX.cc, alguns dos quais voc e j a deve ter estudado; lagrange01.cc este e um programa mais avan cado que vamos estudar detalhadamente nos Cap tulos 10 e 9. Depois de compilar qualquer um deles, voc e os vai rodar assim: prog x1 , . . . , xn em que x1 , . . . , xn s ao n umeros reais, no caso de lagrange01.cc, ou um u nico n umero inteiro positivo, no caso de fatorial04.cc. N ao se preocupe que o programa se manifesta49 e se recusa a trabalhar se voc e tentar us a-lo de forma errada. A quantidade de valores que uma fun ca o recebe na linha de comandos pode ser arbitr aria. Esta e uma funcionalidade excepcional da linguagem C++ permitindo que voc e forne ca uma quantidade indeterminada, mas nita, de dados para um programa. Um exemplo bem simples disto e printf() a quem voc e pode passar uma quantidade qualquer de valores. Este m etodo apresenta uma outra forma de criar dinamicamente espa co de mem oria nos programas de modo simples e muito eciente. Leia os programas listados abaixo e logo a seguir vamos expandir os coment arios feitos ao lado dos programas: 1. lagrange01.cc com prote ca o de baixa qualidade; 2. fat2.cc sem nenhuma prote ca o; 3. fatorial04.cc com uma razo avel prote ca o da linha de comandos.
49 Se

a programadora (o autor) tiver feito um trabalho bem feito...

174

Deia os programas indicados acima para compreender a discuss ao que segue. O m etodo descrito consiste em declarar dois tipos de argumento na fun ca o main(): Um argumento de tipo inteiro, tradicionalmente designado por argc; Um argumento vetorial, tradicionalmente designado por argv; Observe que os nomes argc, argv n ao s ao obrigat orios. Voc e pode dar os nomes que quiser a estes argumentos. Apenas h a um h abito entre os programadores de usar estes dois nomes. Desta forma todo mundo que ler um programa j a sabe do que se trata. Tamb em dentro do progrma estes dois argumentos tem uso espec co, e n os (os programadores) nos acostumamos a us a-los corretamente a partir dos nomes usados: e a sintaxe pelo contexto. O primeiro argumento conta os comandos que a fun ca o receber. Por exemplo se voc e digitar prog 1 2 3 4 5 6 supondo que prog seja um execut avel e que os n umeros 1 2 3 4 5 6 s ao argumentos passados na linha de comando para o execut avel. Em argc estar a registrado o n umero 7, que e a quantidade de argumentos que voc e escreveu, incluindo a palavra prog, e no vetor argv estar a: argv = [prog 1 2 3 4 5 6] quer dizer que argv[0] = prog, argv[1]=1, ..., argv[6]=6 Observe que argv e uma matriz50 de textos ( C-strings ). No programa fatorial.cc voc e tem um exemplo de como se faz esta transforma ca o de texto para int usando a fun ca o atoi(). Consulte o coment ario (100) neste programa onde h a uma refer encia de manual a respeito das fun coes atof(), atoi(), atol(). Este m etodo permite usos fant asticos da linguagem, mas infelizmente n ao vamos explor a-los neste livro, e certamente se voc e est a iniciando o seu aprendizado ainda dever a demorar um pouco a ter utilidade para eles. Os exemplos que estou lhe dando servir ao para que voc e tenha alguma id eia de onde isto pode ser usado para que voc e guarde na mem oria para uso posterior, e o caso de fatorial.cc. Suponha, agora, que voc e deseje criar um programa para resolver sistemas lineares. O programa n ao poder a saber de antem ao qual e a dimens ao do problema que voc e vai resolver (ou o usu ario do programa que voc e vai escrever). Se voc e for usar uma vari avel do tipo matriz float mat[30][40]
50 Tem

gente que chama vetor.

175

que representa uma matriz 30 x 40 cujos elementos s ao do tipo float o compilador vair separar 30 x 40 x 4 bytes para guardar estes dados. Poranto o compilador precisa, antecipadamente, saber qual e a dimens ao das vari aveis do tipo vetorial. E se voc e n ao puder responder a esta quest ao, como fazer um programa? Tem duas formas de resolver este problema, vou descrever uma delas na pr oxima se ca o, a outra maneira foi descrita acima: quando o usu ario rodar o programa indica, na linha de comandos, a quantidade n de vari aveis do sistema.

5.9.1

Usando uma fun c ao para alocar mem oria

C++ tem uma fun ca o, malloc() que permite a deni ca o de vetores com dimens ao din amica, quer dizer, quando o programa estiver rodando ele poder a estabelecer o tamanho das matrizes. Esta fun ca o deixa nas m aos do programador uma responsabilidade muito grande ao intervir no processo de aloca ca o de mem oria, e dever ser usada com extremo cuidado pois pode representar um dos problemas que o programador e um pequeno pode deixar para tr as... Leia o programa malloc tut.cc que tutorial sobre esta fun ca o. Observe sobre tudo o coment ario (20) que chama sua aten ca o para o uso do par de fun co es Se for necess ario usar, ela existe, mas h a meios melhores de programar. Deixe-me sugerir algumas diretivas que aumentam a seguran ca: malloc() separa espa co na mem oria; free() libera o espa co solicitado por malloc(); a apontando uma vari avel do tipo nptr = NULL garantindo para onde est ponteiro antes de liber a-la. Se habitue a escrever imediatamente, na linha seguinte, ao usar malloc(), free() com um coment ario. Uma sa da pode ser usar a linha de comandos de que os programas citados s ao exemplos iniciais. Um complemento para este m etodo ainda e a leitura de arquivos. No cap tulo 6 vou exemplicar a leitura e escritura de arquivos. Um dos programas do cap tulo 6 vai mostrar como voc e pode deixar dados em um arquivo que depois o programa poder a ler, e conseq uentemente abrir, dinamicamente51 , espa co na mem oria. Voc e poderia argumentar que este m etodo pode representar uma demora de processamento. Isto n ao precisa ser verdadeiro. Os dados podem estar numa mem oria ash ou na mem oria principal, hoje mem oria j a n ao e o problema...
51 De

forma bastante segura!

176

E se voc e colocar muita coisa na mem oria o sistema operacional ir a descarregar parte do que tiver na mem oria em arquivo em disco, e portanto, indiretamente, voc e estar a usando mem oria em disco, mesmo que n ao deseje. Ent ao, use, deliberadamente, mem oria em disco. Farei isto seguidamente a partir do cap tulo 10. E n ao h a perigo de car ponteiros fantasmas no seu programa. Se poss vel, evite52 usar ponteiros. Uma outra forma de alocar din amica mem oria e usando par ametros na linha de comando: int main(int argc, char * argv); como eu mencionei, rapidamente, no caso da dimens ao de matrizes.

5.10

Texto - sabor C

Nesta se ca o vou estudar o tipo de dado de que se constituem os textos na com o sabor tradicional da linguagem C que tamb em serve para C++. A u nica raz ao de ainda incluir esta forma de ver textos aqui, e que ainda preciso deste tipo de textos na fun ca o system(), para chamar programas externos. Vou dedicar uma se ca o no cap tulo, 6 ao tipo de dado texto pr oprio de C++. Voc e vai ver que h a m etodos bem melhores para manipular texto que os descritos nesta se ca o. Um editor de textos seria um programa que trabalharia com este tipo de dados, mas nao chegaremos a construir um editor de textos aqui. Vamos apenas mostrar como manipular, guardar e recuperar texto. As duas u ltimas opera co es s ao t picas de acesso a disco, ent ao vamos ver que tipo de dado serve para estas opera co es. Voc e possivelmente pode pular esta se ca o sem grave prejuizo deixando para l e-la em outra ocasi ao em que se sinta motivado a entender como C entende um texto. As palavras chave desta se ca o s ao string, uma cadeia de caracteres, tt iostream o tipo de dado para acessar arquivos em disco.

5.10.1

C-string

Texto devemos usar com o sabor de C++ entretanto seria um erro jogar fora tudo funciona em C, pelo menos por enquanto. Considere que h a dezenas de anos de programa ca o em que se usa a linguagem C com sucesso. Aos poucos ser a possivel reformar todo este material transformando-o em C++, entretanto, por enquanto ele existe e deve ser levado em considera ca o. Mas possivelmente voc e, leitor, deva saltar esta se ca o, como eu j a lhe disse. Existe uma fun ca o, pelo menos para mim, e para os meus programas, que me fazem precisar de texto do tipo C, e a fun ca o system(). Fa ca um grep e quando chamo rotinas ver a a import ancia desta fun ca o nos meus programas. E externas. A forma mais f acil de us a-las e transformar um nome de arquivo, C++-string, em C-string. Ela precisa que o nome do arquivo seja texto do C. Ent ao o mais c omodo era criar um m etodo para transformar C++-string em C-string
52 Dif cil, a linha de comandos e ponteiro... Vari avel de arquivo e ponteiro tamb em... Mas s ao formas mais seguras de usar ponteiros!

177

Se texto for C++-string, ent ao texto.c str() e C-string. Leia o programa getline03.cc. Para C, texto e uma matriz de caracteres e isto ca caracterizado com abrir e fechar aspas (duplas). char um texto = abacadabra declara a vari avel um texto como um vetor de caracteres. Se voc e executar cout << um texto[0] << endl o resultado e imprimir no terminal a. Leia e rode o programa abacadabra.cc. Ent ao texto para a antiga linguagem C e uma matriz de caracteres e isto complica muito as coisas, porque queremos juntar texto com outro texto e isto se torna muito complicado com matrizes, porque teremos que reciclar toda a indexa ca o. Foi mais f acil criar objetos da classe texto e um m etodo para voltar atr as para os textos do tipo matrizes quando necess ario.

5.11

Passando valores entre fun c oes

Nesta se ca o vou descrever o assunto: passando valores entre fun c oes. Espero que voc e rode e leia os programas na ordem como eles s ao sugeridos no texto, inclusive que voc e leia os coment arios contidos nos programas. Observe que os programas s ao parte integrante do texto do livro, embora distribu dos eletronicamente, em separado. Ningu em aprende a programar apenas lendo livros!

Esta se ca o envolve dois assuntos, fun c ao, variavel, eis a raz ao de que ela tenha sido colocada neste cap tulo. Esta divis ao de assuntos e sempre dif cil quando nos encontramos na fronteira dos assuntos. Em programa ca o moderna n ao h a vari aveis53 fora de fun co es. As vari aveis passam a ser estados dos objetos, ou algumas vezes podemos entender que s ao dados dos objetos. Esta forma de programar e muito mais segura, efetiva e din amica. Hist oricamente falando, em C++ existem apenas tr es tipos de dados: 1. N umeros e suas variantes: inteiros (int), (o que inclui caracteres, short int long int...) fracion arios (float, double), e 2. Caracteres cada tecla do teclado e um caractere incluindo aquelas que podem ser obtidas com as teclas modicadoras shift, alt e ctrl. 3. tabelas que s ao ponteiros, os objetos diretamente associados com um endere co inicial e outro nal (calculado a partir do tipo de dado). Listas de endere cos. Texto ca aqui neste tipo de dado e C++ tem um novo tipo de texto al em de usar o antigo tipo de texto de C.
53 Isto

e obviamente uma atitude pouco radical...o autor deveria dizer fora dos objetos!

178

Isto simplica um pouco o quadro. Voc e poderia perguntar: onde cam as matrizes?. As matrizes s ao um tipo de tabela com valores homog eneos em suas entradas. Bom, esta discuss ao pode ser alongar indenidamente e n ao seria bem objetivo. A raz ao desta se ca o e encontrar meios de passar rapidamente uma grande quantidade de dados de uma fun c ao para outra. Uma forma de fazer isto consiste em denir uma estrutura adequada para os dados. Um dos objetivos e atingir rapidez e esta quest ao termina nos conduzindo de volta ao exemplo do 5, p agina 163 e portanto aos ponteiros. Um tutorial vai lev a-lo a colocar a m ao na massa e depois alguns coment arios terminar ao por completar a parte te orica. Exerc cios 61 (Tutorial) Passando valores 1. Leia o programa passando valor01.cc. Compile e rode o programa para ver o que ele faz e volte a l e-lo, se precisar. 2. Falta uma mensagem, antes da sa da de dados, dizendo que o programa est a mostrando um vetor, complete isto. Compile e rode. 3. No in cio de passando valor01.cc, foi denido um vetor, usando typedef, analise como foi feito. 4. Leia o programa passando matriz.cc. Ele usa agora duas tabelas, a primeira e usada para a construir a segunda, procure os coment arios (10), (20). 5. O programa passando matriz.cc e semelhante ao programa anterior, passando valor01.cc com um diferen ca fundamental, ele cria uma tipo de dado mais complexo, matriz no sentido de que usa outro tipo de dado mais simples, vetor. Uma tabela de tabelas. 6. O programa passando matriz02.cc usa a passagem de dados por refer encia - passa o endere co e n ao o dado em si mesmo. Voc e n ao vai notar nenhuma diferen ca entre os dois programas, entretanto, se a quest ao envolver dados de grande magnitude vale a pena usar este m etodo uma vez que vai mover apenas endere co em vez de mover os dados. 7. O programa parabola.cc e a evolu c ao nal dos programas passando valor.cc passando matriz.cc digamos que para fazer parabola.cc eu constru as etapas necess arias, estes dois programas para nalmente produzir o terceiro. avel global e o coment ario 8. O programa deve haver02.cc tem uma vari (30) mostra como evit a-la. Fa ca isto. Se der erro, volte a ler coment ario (30). Solu c ao: deve haver03.cc

179

Se voc e zer grep passando *.cc voc e ir a encontrar todos os programas-exemplo em que a passagem de dados e feita. Em particular leia os programas ponteiro*.cc em que eu dou exemplos de uso de ponteiros. Vimos assim que h a duas formas de passar dados, na linguagem C++, encia, o endere co passando por refer encia na verdade passamos uma refer da vari avel. A maioria das linguagens de programa ca o n ao contam com este m etodo, ele e t pico da linguagem C++. H a linguagens que tem este m etodo mas ele e semelhante ao m etodo da antiga linguagem C usando ponteiros. Em C++ a metodologia e mais avan cada e segura. e passa o pr oprio objeto para a outra fun ca o. Isto passando por valor voc tem signicado (diferen ca) apenas quando os dados forem muito grandes, lembre o exemplo 5, p agina 163. Mesmo que em C++ o m etodo de passagem de dados por refer encia seja mais adequado, continua valendo o que eu sempre disse. Evite de usar sem necessidade. Mas se precisar, voc e encontra entre os meus programas um acervo consider avel de exemplos para que voc e possa selecionar o que lhe convier.

5.12

Acessando arquivos em disco


Para acessar arquivos em disco C++ usa a classe fstream, f de le e stream uma corrente de dados que simula a sa da de dados. Vou discutir nesta se ca o o acesso aos arquivos, para ler, escrever, ou acrescentar dados.

A l ogica do acesso aos arquivos em disco ou outro dispositivo, nas diversas linguagem de programa ca o, e muito semelhante apenas variando nos nomes utilizados. A id eia b asica e a seguinte: No programa denimos um objeto do tipo arquivo para o qual cout e direcionado. feita uma associa E ca o com este objeto de tipo arquivo com o nome de um arquivo em disco. Dentro do programa executamos os m etodos de acesso com objeto do tipo arquivo. Mais abaixo, leia o coment ario (20) no programa telefone02.cc, devemos fechar o arquivo. Exemplo 6 (arquivo) O acesso a um arquivo Acompanhe este exemplo lendo o programa telefone02.cc. Procure o coment ario (10). O comando ofstream nome arq(telefone, ios:app); 180

associa o nome telefone objeto nome arq que e um exemplo54 da classe ofstream - uma classe para sa da de dados (o put). Quando quisermos enviar algum dados para o arquivo telefone usamos o operador inser ca o dirigido para nome arq: nome arq << dados porque este objeto foi denido como uma sa da de dados. Observe que cout continua v alido como sa da de dados padr ao, em telefone02.cc voc e pode ver que foi enviada uma mensagem para cout. Terminado o acesso devemos fechar o arquivo e encerrar a associa c ao do arquivo em disco com o objeto de tipo arquivo. Veja o coment ario (20) no programa telefone02.cc. Vou usar uma linguagem mais simples e mais objetiva na contiua ca o: abrir o arquivo, mas na verdade nenhum arquivo e aberto diretamente, o acesso e feito com um objeto que e associado a um arquivo. poss E vel abrir o arquivo com as seguintes propriedades: para escrita, output e usamos a etiqueta ios::out, ent ao e poss vel lan car dados no dispositivo. para leitura, in e usamos a etiqueta ios::in, ent ao e poss vel ler dados do dispositivo, n ao sendo permitida a escrita. para acrescimos, app e usamos a etiqueta ios::app, ent ao e poss vel acrescentar dados do dispositivo, sem apagar o que l a j a estiver sido escrito. Leia mais a respeito no cap tulo 11, al voc e vai encontrar as demais etiquetas quando delas precisar. Estas que acabamos de descrever s ao as que tem uso mais frequente.

5.13

Matrizes heterog eneas, ou n ao

Se eu lhe disser que esta e a se ca o mais importante deste cap tulo voc e poderia se revoltar com a posi ca o dela, escondida, na parte nal do cap tulo. A sorte e que h a ponteiros para ela de diversos outros cap tulos. Vou discutir como podemos inventar novos tipos de dados.

Todos os tipos de dados discutidos at e o presente, neste cap tulo, s ao os tipos simples, os b asicos. Com os dois novos m etodos da linguagem C++ que vou apresentar aqui, podemos retratar (modelar) qualquer outro tipo de dado existente no Universo: typedef cria um novo tipo de dado, leia o programa estrutura06.cc como exemplo.
54 inst ancia

181

struct dene, em C++ uma tabela em que voc e vai selecionar o tipo de dado em cada um dos campos. Os dois programas telefone05.cc e telefone06.cc fazem uma compara ca o entre usar struct ou usar um arquivo em disco. Vou mostrar que a metodologia em telefone06.cc e mais poderosa e inclusive n ao elimina a facilidade de usar o arquivo em disco. O plano do trabalho nesta se ca o e o seguinte: vou escrever uma vers ao melhor de telefone06.cc envolvendo-@ no processo com um tutorial. O resultado ser a uma pr atica com os dois conceitos typedef e struct (embora em C++ typedef seja opcional). Isto vai ser feito com aux lio de um tutorial, e dentro do tutorial vou incluir um programa-tutorial para lhe mostrar como usar o typedef.

5.13.1

A diferen ca entre usar ou n ao typedef

avel estruturada, uma estrutura05.cc neste programa criamos uma vari tabela, com os campos nome - um vetor de caracteres com tamanho 80; telefone - um vetor de caracteres; email - um vetor de caracteres. A observa ca o (10), no programa, chama sua aten ca o para uma facilidade uma da linguagem que nos permite a libera ca o do uso do typedef. E facilidade que torna o programa menos leg vel. estrutura05.cc este programa e identico ao programa analisado no item anterior, estrutura03.cc. A diferen ca consistindo que neste programa eu usei typedef para criar um tipo de dado. Este m etodo e prefer vel, no meu entender, porque deixa o programa mais leg vel. A decis ao ca entre escrever mais uma palavra, que e um problema para quem n ao tem grande pr atica em digita ca o, e a legibilidade do programa, que e decisivo na manuten ca o dos programas.

5.13.2

Tutorial sobre estruturas

O programa telefone05.cc e o material inicial do trabalho. Abra, leia, e rode o programa. Exerc cios 62 (Tutorial sobre struct) Estrutura e den c ao de tipos 1. Rode e leia typedef tut.cc 2. O programa typedef tut.cc

182

3. O programa typedef tut01.cc est a voltado para os que usam C, se n ao for o seu caso voc e poder a ignor a-lo. Ele usa a tecnologia da linguagem C, al em disto n ao est a bem acabado. Comparando com typedef tut.cc voc e poder a melhor a-lo. 4. estudando typedef tut.cc (a) No cabe calho o programa dene dois novos tipos de dados, ponto e tabela veja como isto foi feito. (b) C++ considera o uso de typedef opcional, o programa typedef tut02.cc lhe mostra como. O autor desaconselha esta forma de programar, mas ela est a dispon vel. Leia mais a respeito no cap tulo 7. (c) Depois de denir a estrutura ponto eu a usei na deni c ao de tabela como um campo. Portanto podemos usar estruturas de estruturas e isto vai ser essencial na constru c ao de objetos mais complexos. c ao das fun c oes, separei as fun c oes em duas classes, (d) O projeto na deni as que conversam com o usu ario no bloco em que est a apresentacao() e as que s ao algor tmicas no bloco em que se encontra inicializa vetor(). (e) As vari aveis um vetor, uma tabela foram inicializadas no in cio de main() mas isto n ao utilizado pelo programa. Ficam como exemplos de incializa c ao de vari aveis do tipo struct. (f ) As fun c oes inicializa vetor(), inicializa tabela() poderiam ser entrada de dados. Altere isto! Solu c ao: typedef tut03.cc 5. telefone05.cc telefone06.cc Estes programas produzem o mesmo resultado, estude a diferen ca entre os programas. O coment ario (10) em telefone05.cc explica a diferen ca.

5.14

Como passar dados complexos

Nesta se ca o vamos ver como passar dados complexos (aqueles que n ao s ao simples). Por exemplo como passar uma tabela de uma fun ca o para outra.

Observa c ao 19 (Ponteiros) Uma t ecnica interessante


Uma forma alternativa de fazer a transfer encia de dados complexos entre fun c oes consiste no uso de ponteiros e eu n ao teria grande acr escimo a fazer aqui al em do que pode ser encontrado em v arios textos que tratam do assunto. Al em disto o meu ponto de vista e que isto deve ser evitado uma vez que e uma das partes mais complicadas da lnguagem pelo risco que termina representando se n ao for bem tratada. Ponteiro e simplesmente uma vari avel associa o endere co de um tipo de dado com uma vari avel chamado do tipo ponteiro, quando voc e tiver o seu conhecimento amadurecido poder a tomar a decis ao de enveredar por este tipo de t ecnica com as observa c oes:

183

vale a pena para grandes massas de dados, por exmplo para re-ordenar um arquivo ndexado, em vez de mexer com grande quantidade de dados, se re-ordenam apenas os endere cos, por em tem programas especializados para fazer isto... fazer troca de valor din amicamente, por exemplo a dimens ao de uma matriz, por em isto pode ser feito mais facilmente lendo um arquivo onde anal cam guardados os dados da matriz. nalmente uma aplica c ao para qual n ao h a uma alternativa simples, alterar a equa c ao de uma fun c ao, mas para isto existem leitores de equa c ao j a prontos. Tudo indica que voc e n ao deve precisar de ponteiros at e o nal deste livro, e quando precisar ter a maturidade para encontrar o caminho. um preconceito que precisa ser combatido de que programadores da linguagem C++ E necessariamente usam ponteiros em todos os seus programas, ali as Java foi criado para evitar este uso e C++ tem alternativas muito boas para evitar esta t ecnica.

As fun co es s ao o processo de transfer encia de dados entre as partes de um programa, eu j a disse isto.

5.15

Vocabul ario

Vocabul ario 2 abstra c ao, arquivo, caractere, caractere de controle, identicador, inline, LHS macro, NULL, operador de resolu c ao, palavra, ponteiro, RHS, s mbolo, vari avel, vari avel automatica, vetor de caracteres, word abstra c ao e sin omino de generaliza ca o na linguagem comum e este signicado vale em computa c ao tamb em. A hist oria da abstra ca o em computa c ao mostra um aprofundamento deste conceito. Primeiro foi poss vel substituir os n umeros por vari aveis e para isto criando uma tabela entre estas vari aveis e os locais de mem oria em que cam guardados os n umeros. Um exemplo explica melhor as coisas, nas guras (5.7), (5.8), voc e tem dois programas fazem exatamente a mesma coisa.

int main() { cout << "vou escrever um nmero " << 3.4 << endl; return(0); }

Figura 5.7:

imprime um n umero

Um deles e mais abstrato, (5.8), porque pode ser alterado para que o usu ario forne ca o n umero a ser escrito, pelo teclado. Com uma entrada de dados este programa pode escrever muito n umeros diferentes, ao passo

184

int main() { int numero = 3334; cout << "vou escrever um nmero " << numero << endl; return(0); }

Figura 5.8:

imprime um n umero guardado numa vari avel

que o outro, (5.7), voc e tem que editar, trocar o n umero, voltar a compilar e rodar se quiser escrever outro n umero com ele. O programa mais abstrato n ao guarda um u nico valor, ele tem a capacidade de aceitar valores e pass a-los ao comando de impress ao. O segundo passo na evolu c ao (e estamos dando um salto) foi o conceito de fun c ao que e uma vari avel que guarda um pequeno algoritmo e e capaz de passar o valor para outra fun c ao. Aqui voc e tem dois tipos de dados de qualidade diferentes: algoritmo, valor. Tem uma vari avel que pode guardar dados e processos (ou a c oes). Depois, e nalmente, temos vari aveis podem passar as suas informa c oes para outras vari aveis numa forma que se assemelha a divis ao de c elulas55 em biologia, os objetos, que t em dados e processos incorporados. Agora podemos simular melhor a realidade e criar um modelo de situa c oes. Leia o cap tulo 7 a este respeito. arquivo e area de mem oria em disco. Em geral ningu em chama este dispositivo de mem oria, hoje em dia. J a foi chamado, no come co da programa c ao, de mem oria de massa, talvez pelo material como eram feitos os dispositivos: discos e tas. Para acessar um arquivo (em algum dispositivo) e preciso associar este dispositivo com um objeto do tipo stream e neste caso C++ tem as seguintes classes: stream, fstream, ifstrem, ofstream. Veja no cap tulo 11 informa c oes mais detalhadas sobre o uso destes objetos. mbolos que e poss vel acionando uma tecla caractere qualquer um dos s (ou um conjunto de teclas de uma s o vez). Como o famoso ctrl-alt-del. O programa ascii.cc lhe mostra o que s ao caracteres, leia e rode o programa.
55 aqui

o autor exagerou na descri ca o da capacidade dos objetos.

185

caractere de controle Alguns caracteres que n ao podem ser impressos porque tem um signicado especial para o sistema operacional, como \n. A lista de alguns desses caracteres, com a forma de escrev e-los em programas e \n \r \t \v \b \f \a \ \ \? \\ newline (nova linha) carriage return (mudan ca de linha) tab (tabulador) vertical tab (tabula c ao vertical) backspace (um espa co para tr as) form feed (page feed) (nova p agina) alert (beep) (campainha do sistema) single quote () (aspas simples) double quote () (aspas duplas) question mark (?) (sinal de interroga c ao) backslash (barra reversa)

Observe que \n provoca uma mudan ca de linha se aparecer dentro de uma string. Efeito correspondente e o de cada um destes caracteres, dentro de uma string. oria e um dos recursos mais im gerenciamento da mem oria A mem portantes, e relativamente limitado, na m aquina. F sicamente e uma sucess ao numerada de endere cos em que podemos guardar dados (codicados), letras, palavras, imagens, som, v deo, tudo transformado listas de zeros e uns. No disco s ao setores, na RAM, s ao integrados em que os zeros, uns s ao produzidos pela tecnologia em curso que j a foi condensador carregado/descarregado (que chamavamos de luz acesa/apagada) e nos futuros computadores qu anticos dever a ser algum spin eletr onico alterado de estado... - podemos continuar falando de l ampada apagada/acesa em lugar da tecnologia de dia. Esta quest ao e muito envolvente e o autor n ao det em nem a tecnologia da constru c ao das mem orias e nem a do seu gerenciamento, por uma quest ao de escolha de area de trabalho. Mas isto n ao o impede de ter uma id eia do que acontece embora possa simplesmente ignorar este detalhe porque ele est a resolvido pelo compilador (ou interpretador), pelo sistema operacional e pelo fabricante do hardware. Guardar dados em disco, na RAM ou numa mem oria ash e id entico do ponto de vista do sistema operacional ou de um programa: acender ou apagar algumas l ampadas... Um vetor nada mais e do que uma sucess ao de dados em sequ encia na mem oria (mas a mem oria n ao pode ser usada assim, simplesmente, em sequ encia. Antes havia naquele lugar um dado que foi apagado deixando um buraco que n ao d a para guardar mais nada. A mem oria em cada momento e uma cole c ao de buracos desocupados. Guardar um novo dado signica ocupar um primeiro buraco e depois ir ocupando outros buracos at e acomodar o dado56 No u ltimo buraco
56 como ponteiros no m de cada buraco para o pr oximo, mas quem se ocupa disto e o sistema operacional, para o programa a sua mem oria e uma lista cont gua de endere cos

186

usado ao colocar o u ltimo item tem que se colocar uma marca de m de dado, e o NULL que se usa, uma marca de m de linha! Para o sistema operacional interessa pouco o que est a sendo guardado, m usica, texto... identicador e usado para fazer refer encia ao nome de uma vari avel e tamb em de fun c oes. c ao com o operador de resolu ca o (associa c ao com inline Usado em conjun a hier arquia de classes ou estruturas). Este comando informa ao C++ que um m etodo est a sendo denido mas que foi declarado em outro lugar. O operador :: faz associa c ao com a classe ou estrutura onde o m etodo foi declarado. Um exemplo, ponto02.cc. LHS - Left Hand Side - (membro ` a esquerda). Uma express ao comum em textos de computa c ao para fazer refer encia o membro a esquerda (left) de uma express ao. Veja RHS. macro e usada com freq u encia para representar o nome de uma rotina, de um programa. c ao da palavra NULL e nulo, e uma constante de C++ usada NULL A tradu para v arios pr opositos parecidos. A u ltima posi c aode um vetor e NULL, n ao se esque ca que um vetor nada mais e do que uma sucess ao de dados em sequ encia na mem oria (mas a mem oria n ao pode ser usada assim simplesmente, em sequ encia... (leia sobre mem oria), ent ao e preciso ter uma marca para indicar onde terminam as vari aveis. Um ponteiro que n ao estiver sendo usado deve apontar para o NULL tamb em, procure free(), malloc(), calloc(), realloc(), digite info malloc num terminal do Linux . operador de resolu c ao ::

Este operador associa um m etodo com uma determinada classe ou estrutura onde este m etodo foi denido. Na verdade da acesso ao espa co de nomes de uma determinada classe. comum voc E e encontrar programas em que aparece std::cout neste caso n ao e necess ario incluir iostream porque o operador :: d a acesso ao espa co de nomes da classe iostream. Eu n ao uso esta metodologia neste livro, mas algumas vezes ela pode ser necess aria.

palavra palavra e usada tamb em como medida da informa c ao junto com bit, byte, apenas mal denida, existem palavras de 16 bits e de 32 bytes. A id eia era que um bit, seria a menor medida da informa c ao,
virtuais.

187

um aglomerado de 8 bits formaria um byte. Isto pode ser pensado sicamente como um integrado contendo 8 di odos que possam energisados criando um total de 28 possibilidades; e 16 bytes formaria uma word, que e palavra em ingl es. Mas a prepot encia de certas rmas computacionais anarquizou esta conven c ao porque lan caram no mercado m aquinas, ou sistemas, arrogantemente dizendo, que a word era de 32 bytes... Uma outra ambiguidade persiste, nas linguagens humanas se tem o conceito de palavra reservado para um aglomerado de letras e possivelmente n umeros, como Pentium III, para representar os objetos ou as id eias que nos cercam e com os quais nos comunicamos formando as frases de nossa linguagem. Estamos usando aqui nome com este signicado. e apenas uma vari avel que guarda um endere co de outra vari avel. ponteiro Como o endere co de uma vari avel depende do seu tipo de dado (para denir o tamanho) ent ao h a ponteiros do tipo inteiro, que guarda endere cos de vari aveis do tipo inteiro, e assim por diante para todos os tipos de dados. Desta forma, quando voc e declara uma vari avel de um determinado tipo, o compilador sabe qual o espa co que a vari avel vai ocupar e portanto onde ela come ca e onde termina. Os ponteiros s ao um dos pontos mais quentes no processamento com as linguagens C ou C++, porque se bem usados permite alguns truques que aceleram os programas, mas se mal usados podem gerar graves tipos de confus ao: voc e poderia, por exemplo, acessar um endere co il egal corrompendo dados. Vou usar um ponteiro do tipo int na exemplica c ao. Suponha que voc e criou no programa int *variavelptr uma vari avel com o nome variavelptr - um ponteiro para um int. At e aqui n ao aconteceu nada, o suxo ptr e apenas um lembrete que a maioria dos programadores usa para n ao esquecer que variavelptr guardar a um endere co. Quem indica que a vari avel e do tipo ponteiro e o asterisco na frente do nome. Al em disto voc e dever a criar uma vari avel do tipo inteiro para usar o ponteiro rec em criado. int variavel co ` a vari avel: Associando o endere variavelptr = &variavel; e a forma como voc e guarda em variavelptr o endere co de variavel. O operador & acessa o endere co de variavel e a atribui c ao o coloca em variavelptr.

188

Para acessar o valor contido no endere co usamos o operador *, a partir desta associa c ao os resultados dos comandos: cout << *variavelptr << endl; cout << variavel << endl; e o mesmo. a direita. Express ao muito comum em RHS Right Hand Side - membro ` textos de computa c ao para se referir ao membro ` a direita numa express ao. Ver LHS. s mbolo e usado como sin onimo de identicador. vari avel tem uma concep c ao mais est avel, tem o signicado usado em Matem atica. Word Uma medida da informa c ao. Amb gua, ora signica 16 bytes, outras vezes 32 bytes. vari avel automatica E um sin onimo para vari avel local. Em C++ os programadores preferem usar esta denomina c ao porque ela indica o que acontece com as vari aveis locais: desaparecem autom aticamente quando o bloco l ogico em que elas estiverem denidas sai de execu c ao. Procure bloco l ogico. vetor de caracteres Um aglomerado de caracteres enfeixados entre aspas. Alguns dos caracteres de controle n ao podem ser inclu dos porque eles tem uso especial para comunica c ao com o sistema operacional, como \n que signica nova linha. c ao. Amb gua, ora signica 16 bytes, out word Uma medida da informa ras vezes 32 bytes, e j a agora, certamente 64 bytes, com os novos processadores...

189

Cap tulo 6

Um tipo de dado gen erico


Neste cap tulo vou descrever como C++ se comunica com arquivos em disco e objetos do tipo texto. De uma certa forma ser a com uma metodologia semelhante a esta que poderemos acessar outros dispositivos, para onde os programas v ao enviar ou de onde v ao receber v ao receber dados. No in cio a linguagema dene a entrada padr ao, o teclado, e a sa da padr ao o v deo - a tela do computador. Num momento adequado do programa voc e deve alterar isto redirecionando o output ou o input. Por exemplo para um arquivo em disco, como a s aida padr ao (output) ou a entrada padr ao (input). Ao faz e-lo voc e criou um exemplo de uma correnteb , stream, que pode ser fstream - f, de le, arquivo, ifstream - input-file - entrada de dados, ou ofstream - output-file - sa da de dados. Voc e j a deve ter feito uma leitura preliminar do cap tulo 7, isto ser a o suciente para trabalhar e usar as classes que simulam os perif ericos, como voc e j a vem fazendo com a classe Ambiente desde o primeiro cap tulo. Este cap tulo e um cap tulo de refer encia e est a planejado para lhe oferecer inicialmente uma primeira leitura sobre o assunto assim como tamb em para conduz -lo a um aprofundamento na segunda leitura. Na parte nal do cap tulo vou discutir a classe string como um complemento das classes streams. As strings s ao texto e o lugar natural para um texto e um arquivo em disco portanto e natural que esta discuss ao venha aqui.
a Uma corre ca o: n ao e a linguagem, e numa classe que se encontra numa biblioteca, com # include iostream no come co dos programas... b stream em ingl es signica corrente, como de agua, que ue.

6.1

Streams - a simula c ao dos perif ericos

Computa ca o e feita pelos que falam ingl es e eles traduzem para a tecnologia aquilo que a vida reete neles. Stream signica em ingl es, a corrente da agua do rio, um uxo, como da agua. o que acontece com os perif E ericos de um computador para onde v a uir (ou de onde venha a uir) uma corrente de dados. Ent ao tem sentido criar uma classe para representar o uxo (da corrente): stream.

190

As classes s ao abstra c oes do mundo real dentro dos programas, e as diversas classes construidas sob este item, examine a gura (6.1) p agina 193, representam os diversos dispositivos f sicos ligados ao computador: impressora, tela, arquivos em discos, teclado ou outros que voc e queira representar. Em todos estes casos voc e precisa enviar um corrente de caracteres munida de algum tipo de l ogica ou sintaxe. A nota ca o e um reexo das origens, C++ faz parte do mundo do UNIX onde os s mbolos << >> o que voc dirigem alguma coisa para onde apontam. E e v e nos primeiros programas, quando usamos cout << qualquer coisa e viu qualquer coisa impressa na tela do computador, o uxo se dirigiu para cout. Ou cin >> UmaVariavel e voc e colocou um valor em UmaVariavel, o uxo veio do teclado para desembocar numa vari avel. <<, >> s ao operadores (m etodos) de cada um dos objetos cout, cin. Os objetos cout, cin representam cout a sa da padr ao, a tela do computador - standard output cin e a entrada padr ao do sistema, o teclado do computador - standard input. Os nomes destes objetos s ao formados das palavras C, out, in inclusive a pron uncia deles, em ingl es1 , reete esta origem, eles s ao pronunciados deixando o C aud vel - C - out e C - in. Basta que voc e altere a sa da ou a entrada para que os dados sigam em outra dire ca o. Isto voc e faz indicando no programa qual e o exemplo, (inst ancia) de stream que lhe interessa no momento, voc e ainda vai ver como fazer isto, com mais detalhes. A linguagem j a traz algumas classes derivadas prontas e voc e poder a construir outras. Em ofstream tem um objeto que representa um arquivo como s aida de dados; Em ifstream tem um objeto que representa um arquivo como entrada de dados.
1E

que nos imitamos em portugu es...

191

ofstream, ifstream s ao duas classes derivadas de stream assim como iostream que aparece nos primeiros programas. Os m etodos e os objetos p ublicos da classe m ae se propagam2 para as classes lhas. Ningu em usa (diretamente) a classe stream, seria um desperd cio de tempo. Leia mais sobre classes, objetos, m etodos no cap tulo 7. Vou prosseguir sob a hip otese de que voc e fez uma leitura preliminar do cap tulo 7.

6.2

Entrada e sa da de dados

Vou apresentar-lhe as classes para entrada e sa da de dados. Com frequ encia, no jarg ao de computa ca o se faz refer encia a io, as letras iniciais de input, output. A linguagem C++ n ao tem meios pr oprios para fazer entrada e sa da de dados. Em vez disto os planejadores da linguagem optaram por denir entrada e sa da de dados como um m odulo separado, e o que chamamos de biblioteca. Desdes os primeiros programas j a usamos # include iostream que fazia os programas reconhecerem os objetos cin, cout e voc e deve ter feito os exerc cios com a sugest ao de apagar (transformar em coment ario) esta inclus ao para ver que o compilador passava a reclamar da presen ca de s mbolos desconhecidos: cin, cout. A linguagem C++ foi escrita entre 1980 e 1985, nesta epoca explodiram semin arios nas Universidades em volta de uma forma revolucion aria de programar, programa c ao orientada a objetos, foi quando se consolidou a id eia de modulariza c ao: construir um corpo central de id eias capaz de aceitar m odulos que o complementem3 . Claro que esta losoa n ao e exclusiva de C++ e at e mesmo existe uma linguagem de programa ca o que se chama modula. A gura (6.1) p agina 193, lhe d a uma vis ao geral da saida e entrada de e um arquivo dados. Esta gura se encontra no arquivo streams01 01.eps, postscript que acompanha o livro no CD e voc e pode imprimir ou deixar num local de f acil acesso para chamar para a tela do computador, evitando de imprimir e gastar papel (e arvores). O arquivo tamb em se encontra no formato streams01 01.png. Estude a gura (6.1) com freq u encia at e que seus componentes lhe pare cam familiares, sem precisar decorar nada. Apenas mantenha um dos arquivos mencionados acima ao alcance dos seus olhos. Em (6.1) voc e tem a id eia hier arquica entre as classes criadas. Voc e nunca ao deve ir a usar, diretamente, ios base e sim alguma de suas classes4 lhas. N e mesmo porque se o zesse teria que criar os m etodos que j a usar ios base at existem em ios o que seria perda de tempo.
palavra t ecnica e heran ca. e um dos princ pios de Linux, m odulos que podem ser acrescentados ao kernel rodando, mas Linux est a escrito em C. 4 Eu sigo chamando a lha de uma lha de lha.
3 Este 2A

192

ios_base

input
ios rdbuf() streambuf*

output

istream

streambuf* filebuf* stringbuf*

ostream

ifstream

istringstream

ofstream

ostringstream

iostream fstream
Figura 6.1:

A l ogica: sa da, entrada de dados

Ent ao, para nos comunicarmos com perif ericos usamos alguma classe de entrada/sa da de dados, ou se for necess ario5 constru mos uma classe (derivada) para uma sa da de dados. Vou mostrar-lhe num tutorial a raz ao de classes do tipo basic tipo, como e o caso de ios base. O exemplo e simples, mas a leitura de um exemplo mais avan cado, como ios base n ao seria proveitoso neste est agio. Exerc cios 63 (Tutorial) Streams - entrada-sa da de dados Este tutorial vai lhe mostrar um exemplo de classe in util, na verdade uma classe do tipo basic class que se encontra na base de um sistema. Uma outra classe vem complet a-la e ser a esta que usaremos. As duas classes mencionadas no tutorial s ao
mais avan cado e voc e n ao ir a aprender a fazer isto neste livro, mas ao terminar este livro voc e conseguir a descobrir como faz e-lo.
5 Bem

193

a basic class complexo; a derivada Complexos Leia o arquivo Complexos.h,nele est ao denidas duas classes: complexo, Complexos. classe m ae complexo ; classe lha Complexos. Experimente apagar (coloque coment ario) no acesso public da classe complexo e compile6 o arquivo Complexos.h g++ -c -Wall Complexos.h e leia mais a respeito no cap tulo 7, procure no ndice remissivo, heran ca . 1. Use typedef para denir alguns tipos de dados simples, num programa. Solu c ao: typedef tut05.cc 2. Na biblioteca Complexos.h est ao denidas duas classes: complexo, Complexos. A primeira apenas dene um n umero complexo - sem propriedades (m etodos) a segunda, Complexos e uma classe lha da anterior, herda o tipo de dados complexo e dene propriedades dos n umeros complexos. Analise estas classes. 3. Os programas que usam a biblioteca Complexos.h s ao os programas da suite complexos00*.cc que ser ao estudados no cap tulo 8, leia agora rapidamente este programas apenas para entender o uso de uma in util classe basica - denida na biblioteca Complexos.h 4. Na biblioteca Complexos.h voc e pode ver uma alternativa, usando typedef para denir o tipo de dados complexo, esta alternativa est a desligada (coment ario). Experimente uma alternativa diferente: descomente o typedef que dene complexo e coloque-o fora da deni c ao da classe tranforme a classe complexo em coment ario. compile e rode o programa calculadora.cc Solu c ao: Complexos01.h, use esta bilioteca em calculadora.cc em lugar de Complexos.h. 5. Estude novamente a gura (6.1). Estude signica, olhe . . .
uma biblioteca n ao cria um execut avel, apenas verica se a sintaxe da biblioteca est a correta. Observe a instru ca o -c na linha de compila ca o.
6 Compilar

194

O tutorial 63, sobre uma classe b asica, lhe mostra mais um exemplo dos conceitos que num primeiro momento parecem in uteis: porque n ao escrevemos logo o modelo completo ? Neste processo modularizado, os elementos representam os passos na constru ca o da abstra c ao e isto e importante mesmo que alguns de seus aspectos pare cam in uteis. N ao se preocupe muito em entender, de uma vez, estes detalhes. Siga usando que aos poucos elas ir ao adquirir a clareza que merecem. Mas a id eia central e a constru ca o de pequenos m odulos que v ao se completando at e construir o mosaico completo: Se cada pequeno peda co estiver bem denido e coerente, se as estruturas forem cando mais complexas levando em conta a l ogica dos seus elementos, o resultado nal ir a funcionar. A gura (6.2) p agina 195, foi obtida no site [3] onde voc e tamb em pode

Figura 6.2:

www.cplusplus.com

encontrar farto material sobre C++. O pr oximo tutorial ir a conduz -lo a compreender os objetos e seus membros e metodos que simulam para C++ o mundo externo para onde os dados ir ao correr assim como os canais desta comunica ca o. Neste livro, este mundo externo ser ao os arquivos em disco, mas, na medida em que voc e precisar, ir a encontrar na 195

bibliograa como alterar o destino ou fonte para enviar ou receber informa co es. Ir a ver que e uma simples modica ca o para substituir arquivo por outra coisa. Por isto, vou come car por mostrar-lhe como usar arquivvos. Exerc cios 64 (Tutorial) Usando arquivos 1. Abrindo arquivo para leitura 2. Leia e rode o existe arquivo.cc 3. O programa existe arquivo.cc pede um nome de arquivo e verica se o arquivo existe ou n ao e diz isto. 4. Uso de C strings Verique que existe arquivo.cc usa o m etodo c str() 7 da classe string no objeto nome arq. Apague .c str() e rode o programa. c ao l e uma linha de um arquivo, sintaxe 5. fun c ao getline() Esta fun getline(ifstream, string) Altere existe arquivo.cc para que sejam lidas as linhas do arquivo passado para o programa. Solu c ao: existe arquivo01.cc 6. No exerc cio anterior mencionei a fun ca o getline() em vez do m etodo getline(), leia o coment ario (40) no programa existe arquivo01.cc. 7. O programa existe arquivo01.cc tem um defeito: as linhas do arquivo s ao lidas todas de uma s o vez tornando imposs vel a sua leitura. Coloque um contador no programa um if() em local adequado para que o programa leia uma quantidade linhas poss vel de aparecer no terminal, continuando a leitura depois que o usu ario der enter. Solu c ao: existe arquivo02.cc 8. Leia o coment ario (130) no programa existe arquivo02.cc em que ele explica o uso do resto na divis ao para controlar um la co. L a se mostra uma alternativa, use esta alternativa para obter o mesmo resultado, mas e mais evolu do. se conven ca de o programa existe arquivo02.cc Solu c ao:existe arquivo03.cc 9. No programa existe arquivo.cc , use o m etodo fail() em vez de good(), observe que ser a preciso inverter o sinal l ogico com o operador !. Solu c ao: falha arquivo().cc 10. Leia o programa falha arquivo().cc, em particlar analise o uso do operador !. Compare com existe arquivo.cc
7 N ao

precisa apagar, basta transformar em coment ario.

196

11. Altere o programa falha arquivo.cc evitando o operador !, embora n ao haja nenhum defeito em seu uso. Solu c ao: falha arquivo02.cc 12. Crie um arquivo chamado teste (use um editor e coloque texto no arquivo, no modo8 texto). Rode falha arquivo02.cc observando que ele tem um nome de arquivo pr e-denido, teste. Use valor pr e-denido dando enter na pergunta sobre nome de arquivo. O programa n ao vai entender e dir a que o arquivo n ao existe. A raz ao disto e que nomes de arquivos devem ser C-strings. Crie uma C-string e altere o programa para que ele aceite o valor padr ao teste. Solu c ao: falha arquivo03.cc 13. Estude o programa falha arquivo02.cc, verique que ele cont em diversas op c oes, protegidas por coment arios, que podem ser utilizadas para fazer experi encias com as C-strings. Fa ca as suas experi encas alterando os coment arios. O item 4 do tutorial mostra um uso pr atico do m etodo c str() da classe strings que transforma, momentaneamente, uma C++-string em uma C-string. Os nomes de arquivo s ao cadeias de caracteres, quer dizer C-string. H a outras formas de fazer refer encia a nome de arquivo, mas esta e, certamente, a mais simples. No exerc cio 6 eu z refer encia a uma fun c ao global, a fun ca o getline na pr oxima se ca o voltarei a este tipo de fun ca o que complementam os m etodos dos objetos da classe stream.

6.3

Entrada de sa da de dados

Vou aprofundar um pouco o estudo da biblioteca iostream. Esta se ca o nal est a divida em duas subse co es, na primeira um tutorial sobre uso dos m etodos e fun co es globais da classe; a segunda subse ca o e uma listagem com coment arios r apidos dos m etodos e fun co es globais da classe. Eu tinha que decidir por uma arruma ca o. Se eu colocasse logo a listagem me parece que o tutorial perderia import ancia. Ao avis a-lo desta forma de arrumar, voc e ca sabendo que pode recorrer ` a subse ca o nal para procurar informa co es na execu ca o do itens do tutorial. Espero que d e certo! Examinando a gura (6.2) p agina 195, podemos ver toda a hierarquia de constru co es do sistema de entrada e sa da de dados ` a disposi ca o da linguagem
8 Se voc e deixar os caracteres de controle, que formatam o texto, podem ocorrer problemas dif ceis de prever, como travamento de terminais. Procure entender o signicado de no modo texto.

197

C++. Praticamente no centro se encontra a classe iostream que ocupa uma biblioteca. N ao vou discutir os antecedentes desta classe que algum dia voc e dever a estudar, ao se aprofundar mais na linguagem, estudando os modelos templates que se encontram num n vel de abstra ca o superior ` as classes. Vou me concentrar no que utilizarei diretamente nos programas construindo objetos que fazem entrada e sa da de dados. Vou inclusive ignorar na discuss ao os objetos prexados com w, os chamados objetos largos (do ingl es wide). No momento certo9 voc e vai encontrar refer encia a eles. Os m etodos da classe s ao frequentemente sobrecarregados, quer dizer que h a em geral pelo menos duas vers oes de cada m etodo com uso de dois a tr es par ametros. Eu nem sempre vou fazer refer encia a todas as possibilidades, mas com o uso, e consulta as fontes listadas na bibliograa, muitas s ao sites de aux lio ao programador, voc e poder a completar, no momento certo, as informa co es que car ao faltando aqui.

6.3.1

iostream

Esta classe vem sendo usada desde os primeiros programas e agora uma vis ao mais aprofundada da mesma e necess aria. Ainda assim este livro n ao pode lhe mostrar tudo, uma pequena visita ao site [3, procure as bibliotecas] lhe pode mostrar que seria desastroso, para um projeto de livro, tentar descrever detalhadamente apenas esta classe. Tudo que se pode fazer, pegagogicamente, e sugerir alguns desenvolvimentos e na medida que voc e precise de processos mais avan cados, as refer encias que voc e vai encontrar aqui, servir ao de ponto de apoio para o seu desenvolvimento. C++ e um grande projeto em andamento e foi muito bem elaborado de par uma linguagem bem abstrata, e isto quer dizer, tida. E e um grande modelo. Assim que voc e terminar esta introdu ca o ` a linguagem deve estudar os templates - os moldes que se encontram anteriores ` as classes no processo de abstra ca o. Na constru ca o de uma classe se come cam com estes moldes que n ao cam vis veis para o programador mas sim as classes que deles resultam. Voc e pode encontrar uma pista destes moldes na gura (6.2), p agina 195, ios base, ios, que voc e nunca ver a em nenhum programa, diretamente... Uma visita a [3], buscando iostream ser a instrutiva, e aqui um guia para que voc e n ao se perca, voc e vai encontrar uma p agina contendo logo no come co a informa ca o que aparece na gura (6.3), p agina 199, que e a deni ca o das diversas formas (overload) de cin, >>. Tamb em nesta p agina tem uma observa ca o, procure a biblioteca iostrem com um link que pode ser acionado para lev a-lo para as informa co es efetivas, isto e, aquilo que voc e vai usar de imediato em programas. Observe que um erro de avalia ca o em que voc e pode incorrer e que eu estou lhe sugerindo (e eu n ao estou fazendo isto) que a parte abstrata da linguagem e
9 Eles

s ao usados em programas gr acos.

198

Figura 6.3:

Sobrecarregamento de cin

irrelevante. Apenas eu acho que ela deve vir depois que voc e estiver dominando os aspectos concretos da linguagem: fazendo programas e vendo resultados. Um tutorial sobre as fun co es globais e os m etodos da classe. Exerc cios 65 (Tutorial) Uso da classe iostream ogica de uma 1. boolalpha, noboolalpha ativa (ou desativa) a etiqueta l vari avel do tipo bool para que ela seja impressa (enviada ao cout ou outra sa da) como true, false ou 1, 0. Compile, rode e leia boolalpha.cc 2. dec fun c ao global manipuladora, liga a sa da de inteiros para o formato decimal. O programa campo base.cc exemplica o uso desta fun c ao manipuladora. Este programa est a errado, e sua corre c ao se encontra em e mesmo antes de ler o programa campo base01.cc. Mas tente corrigir voc corrigido. 3. No programa campo base01.cc usei a fun c ao dec uma vez inutilmente. Corrija isto. Solu c ao: campo base02.cc. 4. endl envia um m de linha para a sa da padr ao, ver primeiro07.cc em que e usado endl ou \n, para produzir m de linha. 5. flush, da palavra inglesa que signica soltar o uxo, por exemplo quando se aperta a descarga do sanit ario soltando o uxo da agua. Objetivo, limpar o buer de entrada de dados do teclado e evitar que algum dado ainda n ao lido atrapalhe uma leitura subsequente. Com grep flush *.cc | more e voc e vai encontrar diversos programas usando flush. 6. hex fun c ao manipuladora exemplicada em dec. 7. noboolalpha Rode e leia o programa boolaplha.cc. Desliga a express ao boleana para imprimir o valor num erico. 8. noshowbase Rode o leia o programa campo base.cc. Omite o indicativo de base. 9. noshowpoint Rode e leia noshowpoint.cc, esta fun c ao manipuladora serve para omitir a parte decimal quando ela for nula. N ao omite quando for diferente de zero. Neste caso fa ca um cast para inteiro se quiser ter apenas a parte inteira. 199

10. noshowpos Rode e leia o programa noshowpos.cc 11. noskipws Rode e leia o programa noskipws.cc, esta fun c ao serve para n ao omitir os espa cos em branco. 12. showpoint Rode e leia noshowpoint.cc, esta fun c ao manipuladora serve para omitir a parte decimal quando ela for nula. N ao omite quando for diferente de zero. Neste caso fa ca um cast para inteiro se quiser ter apenas a parte inteira. 13. skipws Rode e leia o programa noskipws.cc, esta fun c ao serve para omitir os espa cos em branco. 14. showpos Rode e leia o programa noshowpos.cc

6.3.2

Formatando os dados

S ao fun co es da biblioteca iostreams, portanto fun co es globais - n ao s ao m etodos, quer dizer, voc e n ao as vai usar com o ponto de refer encia ao objeto, servem para formatar os dados. Esta tabela foi copiada de [?, Cplusplus] z a tradu ca o com troca de express oes de forma semi-autom atica, usando os m etodos do editor de textos joe, espero que tenham cado claras as descri co es das fun co es.

200

boolalpha valores alfanum erico-l ogicos (bool) (fun ca o manipuladora) dec Usar base decimal (fun ca o manipuladora) endl Insere nova linha e limpa (o buer) (fun ca o manipuladora) ends Insere caractere nulo (fun ca o manipuladora) xed Usar nota ca o com ponto xo (fun ca o manipuladora) ush Limpa buer dos perif ericos (fun ca o manipuladora) hex Usar base hexadecimal (fun ca o manipuladora) internal Ajuste de campos com caracteres (fun ca o manipuladora) left Ajuste a esquerda (fun ca o manipuladora) noboolalpha N ao e valor l ogico-alfanumerico (fun ca o manipuladora) noshowbase Omite prexo num erico de bases (fun ca o manipuladora) noshowpoint Omite ponto decimal (fun ca o manipuladora) noshowpos Omite sinal positivo (fun ca o manipuladora) noskipws N ao omite espa co em branco (fun ca o manipuladora) nounitbuf N ao for ca limpesa depois de inser ca o (fun ca o manipuladora) nouppercase N ao gera letras mai usculas (fun ca o manipuladora) oct Usar base octal (fun ca o manipuladora) resetiosags Limpa as etiquetas de formata ca o (fun ca o manipuladora) right Ajuste a direita (fun ca o manipuladora) scientic Usar nota ca o cient ca (fun ca o manipuladora) setbase Liga a etiqueta do campo base (fun ca o manipuladora) setll Dene caractere de preenchimento (fun ca o manipuladora) setiosags Liga etiquetas de formata ca o (fun ca o manipuladora) setprecision Liga precis ao decimal (fun ca o manipuladora) setw Liga o campo largura (fun ca o manipuladora) showbase Mostra prexos numericos de base (fun ca o manipuladora) showpoint Mostra ponto decimal (fun ca o manipuladora) showpos Mostra sinal positivo (fun ca o manipuladora) skipws Omite espa cos em branco (fun ca o manipuladora) unitbuf Limpa buer depois de inserir (fun ca o manipuladora) uppercase Gera letras mai usculas (fun ca o manipuladora) ws Retira espa cos em branco (fun ca o manipuladora) Vou dar um exemplo de uso, em suas necessidades de formata ca o de dados voc e facilmente encontrar a um exemplo mais pr oximo em algum dos programas que acompanham o livro, por exemplo fazendo a busca grep setprecision *.cc voc e vai encontrar alguns programas que selecionam a precis ao dos dados num ericos. cout << "(" << setprecision(2) << setiosflags(ios::fixed) << setw(8) << x << "," << setw(8) << y << ")" << endl; imprime os valores dos n umeros racionais10 x ,y em campos com largura de 8 caracteres com duas casas decimais depois da v rgula.
10 n umeros

com ponto utuante

201

Em C++ tem uma classe voltada para tratar texto. Quando voc e denir um tipo de dados como texto e um objeto da classe string que voc e est a denindo. Embora eu somente apresente as classes no cap tulo 7, j a estou usando este conceito desde o primeiro cap tulo e assim n ao e muito grave come car a trabalhar com mais uma classe antes do cap tulo ocial sobre o assunto. Na verdade vou apenas usar a classe String, como j a venho usando a classe Ambiente. Seguindo o projeto, C++ tem um m etodo desta classe que cria um tipo de dado equivalente aos vetores de caracteres da linguagem C, um peda co de texto: um vetor de caracteres, ou como ainda se chama, uma cadeia de caracteres terminada com o caractere EOL. Vou minimizar esta discuss ao aqui, mas n ao vou elimin a-la totalmente. Este se ca o est a organizada assim: 1. Um tutorial de uso da classe string 2. Uma pequena lista de m etodos da classe string 3. Apresenta ca o de algumas fun co es globais da classe string e neste momento uma explica ca o sobre o que e fun c ao global.

No par agrafo sobre cadeias de caracteres no cap tulo 7 eu mostrei o tipo de dados para textos da linguagem C e os programas da s erie string0*.cc mostram a transi ca o dos objetos da classe string para o tipo de dados texto da linguagem C. O pr oximo tutorial vai lidar com pequenos programas para ensin a-lo a trabalhar com texto em C++. Inicialmente vou mostrar a diferen ca e porque C++ reconhece, tem m etodos, para usar a estrutura de texto da linguagem C. Mas meu objetivo e apenas exemplicar e ao mesmo tempo insistir num ponto, se voc e n ao for um programador em C, n ao se preocupe, n ao e preciso aprender C para depois aprender C++. Entretanto C++ e uma expans ao de C que permite aos programadores em C evoluirem para uma nova metodologia de programa ca o. Eu n ao poderia deixar de incluir esta disucuss ao aqui, sem ofender o objetivo dos que projetaram a linguagem C++, apenas isto. Os programas nesta se ca o come cam com a s erie 11, string1**.cc se tiver curiosidade leia a s erie zero em que foram usados com texto com a tecnologia da linguagem C. Alguma vez na vida voc e pode precisar desta metodologia e os programas se encontram aqui como exemplos. Vou apresentar-lhe texto, mas os textos n ao cam soltos no espa co, eles cam dentro de arquivos, consequentemente os programas t em, al em de objetos da classe string, os objetos da classe stream - arquivos - onde o texto ca guardado. Leia tamb em sobre streams no cap tulo 7, procure no ndice remissivo, estou tratando l a, mais detalhadamente como acessar (ler de ou escrever em) arquivos.

6.4

Tutorial sobre strings

Se voc e estiver fazendo a sua primeira visita a esta cap tulo, uma primeira leitura, tome uma decis ao: pule o tutorial inicial sobre texto e passe para a segunda se ca o, ou, 202

tente logo entender como e que se faz tratamento de texto numa linguagem orientada a objeto, em que um texto e um objeto, logo tem m etodos, al em de apenas ser uma vari avel onde guardar palavras. Exerc cios 66 (Tutorial) Texto - string 1. Rode e leia o programa string11.cc. 2. Fa ca algumas altera c oes no programa, melhore o layout. 3. Um dos defeitos do programa string11.cc: as vari aveis s ao reutilizadas e consequentemente ca lixo na nova pergunta. Limpe as vari aveis, como uma igualdade adequada, antes de nova utiliza c ao. Solu c ao: string12.cc 4. No programa string12.cc eu z a limpesa das vari aveis, (reset) colocando nelas um texto nulo. Isto gera um outro problema no qual e preciso pensar: a concatena c ao junta as frases, se voc e mesmo n ao colocar espa co no in cio de cada uma. Rode novamente o programa para experimentar a falta de espa co, ou espa co indevido. 5. Quando voc e denir uma vari avel de arquivo na verdade voc e est a criando um objeto da classe arquivo que tem m etodos11 como open(), close(), fail(). Se dados for um objeto da classe arquivo dados.fail() ser a verdadeiro ou falso conforme o arquivo exista ou n ao. Fa ca um programa que pe ca um nome de arquivo e verique se o arquivo existe. Solu c ao: string14.cc 6. Coloque um la co em string14.cc e fa ca um prgrama que leia o conte udo de um arquivo (verique que o arquivo contenha texto, caso contr ario voc e extraga o terminal12 ). 7. Se o arquivo for grande os dados lhe passar ao ante os olhos sem que voc e os possa ver. Rode o programa com prog more mas voc e n ao poder a ver o nome do arquivo que voc e vai digitar. Alternativa: coloque um if() dentro do la co controlando um contador... de modo que o programa pare, digamos, a cada 10 linhas. Solu c ao: string16.cc 8. Compare com os dois programas less e more. Ambos l eem um texto parando a cada por c ao de texto. Um deles lhe permite voltar atr as na leitura do texto, o outro n ao.
11 Leia 12 Sem

o coment ario (40) em telefone05.cc receios, basta fechar o terminal e abrir outro...

203

9. Copie um arquivo de texto para lixo113. Fa ca que um programa que leia uma linha de lixo1 e copie esta linha ao nal de lixo2: voc e vai precisar da etiqueta ios::app que altera o m etodo de acesso ao arquivo. 10. cin.getline() pode receber texto de um arquivo, dena uma vari avel de arquivo consulte um dos programas telefone*.cc e fa ca um programa que leia linhas de um arquivo.

6.5

string

Vou discutir detalhadamente os elementos da biblioteca string.h onde se encontra denida a classe string. A forma como vou discutir o assunto depende de uma leitura preliminar do cap tulo 7 e portanto voc e deve pelo menos fazer uma leitura daquele cap tulo, ou melhor, l e-lo e voltar a rel e-lo quando se sentir motivado ao longo da leitura deste. Eu acredito que voc e j a deve ter feito esta primeira leitura do cap tulo 7 motivado pelo primeiro cap tulo. Esta classe e inclu da num programa usando-se a diretiva de compila ca o # include <string> Um objeto da classe string deve guardar dados14 que s ao do tipo vetores de caracteres e generalizam este tipo dados, relativamente ` a linguagem C, agora e um objeto: tem m etodos. Quando voc e declarar string texto voc e poder a usar: texto.empty() a vazio ou n ao. O objeto texto da classe string que ir a testar se texto est herdou o m etodo empty()15.

Duas situa co es semelhantes: Tela.apeteco2(), texto.empty() o que tamb E em acontece num programa em que estou usando a classe Ambiente. Primeiro declaro no come co do programa (ou nalguma biblioteca) Ambiente Tela; Depois uso Tela.apeteco2() porque Tela herdou todos os m etodos de Ambiente um dos quais e apeteco2(). Uma observa ca o, para programadores em C, entre os m etodos, de um objeto desta classe, podemos encontrar aqueles que permitem a convers ao entre C strings e C++ strings caso isto seja necess ario. Se voc e n ao for um programador da linguagem C, pode ignorar esta observa ca o.
13 O nome e sugestivo, voc e pode estragar arquivos com este programa, ent ao escolha um arquivo de texto e troque o nome: cp um arquivo lixo1 14 ter membros, e como se fala dos dados em programa c ao orientada a objetos. 15 Em ingl es, empty, signica vazio.

204

Como objetos as C++ strings tem m etodos que vou lhe mostrar, um deles para transformar strings em C strings: string uma string; uma string.c str(); em que deni um objeto da classe string e depois o transformei, usando o m etodo c str() numa string da linguagem C. preciso que exista este tipo de transforma E ca o, porque, a linguagem C++ veio transformar a linguagem C e portanto ela est a preparada para adaptar a grande quantidade de programas que existe em C para uma nova tecnologia. Mas, possivelmente, voc e que est a se desenvolvendo em C++, raramente16 venha precisar de usar este m etodo. Entretanto ele est a dispon vel e e preciso que voc e saiba disto. Vou come car por lhe apresentar uma lista de m etodos, alguns deles ser ao melhor discutidos, posteriormente e em alguns casos h a um programa-exemplo. bom ter uma lista dos m E etodos dispon veis, mas n ao e u til fazer aqui no livro uma descri ca o de todos, porque voc e encontra esta informa ca o em diversas p aginas na Internet, algumas delas se encontram na bibliograa. O objetivo e apenas mostrar os m etodos existentes para evitar que voc e invente a roda novamente: se precisar de um m etodo, procure primeiro entre os existentes. Certamente ir a encontrar o que precisa. Boa parte destes m etodos se encontra exemplicado em programas que se encontram no CD e uma forma de encontr a-los (que j a foi mais de uma vez indicada no livro) consiste em gerar um arquivo contendo as palavras chave dos programas: grep chave *.cc > chaves Este comando do sistema17 faz uma listagem de todas linhas contendo a palavra chave e coloca esta lista no arquivo chaves que voc e pode pesquisar com um editor de textos. operator= Faz atribui ca o em objeto do tipo String (m etodo p ublico) Iteratores: Posi ca o do iterador (o ponteiro de posi ca o) begin Devolve iterador para o in cio (m etodo p ublico) end Devolve iterador para o nal (m etodo p ublico) rbegin Desfaz a revers ao do begin (m etodo p ublico) rend Desfaz a revers ao do end (m etodo p ublico) Espa co: size Devolve tamanho do texto (m etodo p ublico) length Devolve tamanho do texto (m etodo p ublico)
nunca venha a precisar de transformar strings em vetores de caracteres autor insiste em errar, e um comando da linguagem de terminais, do bash, o sistema operacional n ao tem comandos...
17 O 16 Possivelmente,

205

max size Devolve tamanho m aximo do texto (m etodo p ublico) resize Redimensiona texto (m etodo p ublico) capacity Devolve tamanho do espa co alocado (m etodo p ublico) reserve requesita aumento de espa co (m etodo p ublico) clear Limpa o texto (m etodo p ublico) empty Testa se texto est a vazio (m etodo p ublico) Acesso a elemento: operator[] Pega um caracter em texto (m etodo p ublico) at Pega um caracter em texto (m etodo p ublico) Modificadores: operator+= Acrescenta texto (m etodo p ublico) append Acrescenta texto (m etodo p ublico) push back Acrescenta um caracter ao texto (m etodo p ublico) assign Coloca um valor (texto) em texto (m etodo p ublico) insert Insere mais texto (m etodo p ublico) erase Apaga caracteres de texto (m etodo p ublico) replace Substitui parte do texto (m etodo p ublico) copy Copia uma sequencia de caracteres do texto (m etodo p ublico) swap Troca conte udo entre textos (m etodo p ublico) Opera c~ oes com texto: etodo p ublico) c str Transforma C++ texto em C texto (m data Pega o texto na mem oria (m etodo p ublico) Rode e leia string data.cc. getline Leitura de dados (m etodo p ublico) Rode e leia abre arquivo05.cc find Procura parte de texto dentro de outro texto (m etodo p ublico) rfind Procura u ltima ocorr encia de um texto (m etodo p ublico) etodo p ublico) find first of Procura caracter em texto (m etodo find last of Procura caracter em texto a partir do nal (m p ublico) find first not of Procura absence of character em texto encia de caracter em texto partindo find last not of Detecta aus do nal (m etodo p ublico) substr Gera subtexto (m etodo p ublico) compare Compara textos (m etodo p ublico)

206

Eu j a observei anteriormente que em C++ existem18 fun co es globais. Por exemplo, while() e uma fun cao global, n ao e um m etodo de uma determinada classe, existe tamb em em Java cujos adeptos insistem em dizer que e uma linguagem puramente orientada a objetos. Mas em C++ existem fun co es globais das classes, como as fun co es das bibliotecas da programa ca o tradicional. Tamb em e o caso das fun co es da linguagem C que foram absorvidas por C++ e que neste livro eu estou usando sem dizer que pertenceram19 ` a linguagem C. Esta e, possivelmente, uma das diculdades b asicas de quem est a come cando a estudar a linguagem: quando usar num programa getline(cin, texto); ou texto.getline(); porque tanto existe o m etodo getline() como a fun ca o global getline(). Depois de compreender, e car sabendo, que em C++ existe este conceito, fun c oes globais, ca mais f acil o aprendizado.

6.5.1

Fun c oes globais da classe string

Vou apresentar algumas fun co es globais da classe string, pelo menos aquelas necess arias logo nos primeiros programas. Dominando estas, e com uma procura adequada na Internet, voc e resolve os problemas que precisar e n ao deve esquecer de criar os seus pr oprios programas-exemplo com palavras chave adequadas para enlarguecer o sistema de ajuda que o livro lhe fornece. getline # include <string> istream\& getline ( istream\& is, string\& str, char delim ); istream\& getline ( istream\& is, string\& str ); que portanto existe em duas vers oes (polimorsmo). Ela devolve uma refer encia (ender ec o) Pega uma linha de uma stream Extrai caractres de is e os guarda em str at e que um delimitador seja encontrado. O caractere de delimita ca o e delim para a primeira vers ao da fun ca o, e \n (caractere de nova linha) para a segunda. Para de extrair caracteres quando encontrar o m de linha o se ocorrer algum erro na entrada de dados. Se encontrar o delimitador o descarta e recome ca nova opera ca o depois dele. Par ametros (compare com a especica ca o acima, estou usando os nomes de vari aveis na explica ca o).
18 Tamb em 19 Porque

existe em qualquer linguagem orientada a objeto, mas em C++ isto e mais forte adoto a pol tica ningu em precisa aprender C como pre-requesito para C++.

207

is - istream o objeto sobre o qual a extra ca o se d a, uma string para input. str - string o objeto em que o conte udo extra do ca guardado. delim o caractere delimitador, a marca (procurada) no texto, por onde para o processo de extra exemplo, um ponto, uma v rgula. E ca o, quando este caractere for lido. Valor de retorno Id entico ao par ametro is. Observa c ao 20 (Etiquetas) Registros ou etiquetas
H a um sistema muito ecaz de vari aveis internas nos m etodos e fun c oes das diversas classes que tratam de texto20 . Estas vari aveis internas s ao chamadas, em ingl es de ags que eu estou traduzindo por etiquetas por n ao encontrar melhor tradu c ao em portugu es. Elas n ao s ao chamadas de vari aveis porque seus valores s ao atribuidos automaticamente como resultado do processamento. A palavra registro talvez fosse a melhor tradu c ao, mas esta palavra j a tem um uso bem denido em programa c ao. Vou apresentar algumas dessas etiquetas.

Os erros s ao indicados por modica ca o das etiquetas internas (ags) de estado: flag eofbit failbit badbit erro O m do uxo dos caracteres foi encontrado. Nenhum caractere foi extra do, m chegou prematuramente. Alguns eofbit provocam que seja ativado o failbit. aconteceu erro diferente dos anteriores.

6.5.2

A classe stringstream

Em C++ existe uma classe que simula entrada de dados a partir de uma linha de textos coisa que e bem comum em arquivos de dados. Inclua esta bilioteca: #include <sstream> A classe stringstream oferece o que na linguagem C se consegue com a fun ca o sscanf() que portanto n ao precisa ser usada em programas-C++. Ela faz uma associa ca o de uma string, texto com um objeto do tipo stream permitindo leituras de dados como se viessem de um terminal, por exemplo, de um arquivo em disco, simula a entrada padr ao cin. Portanto e poss vel extrair dados de uma linha de texto usando o operador Alguns dos m etodos dos objetos desta classe s ao clear() limpa o bit de erros de um objeto da classe permitindo sua re necess utiliza ca o. E ario chamar este m etodo para garantir um estado adequado do objeto. str() retorna a string associada ao objeto.
20 E este sistema de vari aveis internas n ao e exclusivo destas classes, e uma sitem atica comum dos m etodos e fun co es globais de C++

208

str(s) faz a associ ca o de uma string com objeto da classe stringstream. operator<< inclui uma string a um objeto da classe. operator>> L e alguma coisa de um objeto da classe. Um exemplo de uso pode ser encontrado no programa getline05.cc As an example, suppose you were told that each test case will be a single Exerc cios 67 (Tutorial) getline() 1. Leia o programa getline01.cc. Este programa lhe permite fazer alguns experimentos com getline.cc, os exerc cios v ao lhe sugerir algumas modica c oes, n ao se limite a elas. 2. O programa getline01.cc tem um erro indicado pelo compilador leia o coment ario (30) e siga suas instru c oes para corrigir o erro. ao o leia que e puro texto, 3. Rode o programa, getline resposta01.cc, n compile e rode. 4. Leia agora o programa getline resposta01.cc e coloque nele mais exemplos de objetos da classe string frase03, frase04 ... e execute mais algumas concatena c oes, talvez a partir de uma nova fun c ao que voc e poder a denir. 5. O programa tem uma mensagem denida na fun c ao main() que e passada para a fun c ao recebe linha(), rode novamente getline resposta01.cc se n ao tiver cado claro como isto e feito. 6. Leia main() e verique onde ela chama recebe linha(). Leia esta fun c ao e tente fazer altera c oes e volte a rodar o programa. Procure entender como funciona a fun c ao alterando-a. 7. Leia o programa getline02.cc e depois o compile e rode. 8. Rode o programa getline resposta02.cc ele explica detalhadamente getline02.cc, compile e rode. 9. Rode o programa getline resposta03.cc, ele explica detalhadamente o programa getline03.cc 10. O programa getline04.cc tem mais um item al em do programa getline03.cc e n ao justicaria que eu criasse um programa para explic a-lo. Leia o coment ario (50) em getline04.cc.

Rode o programa usando o arquivo matriz que acompanha o livro. Observe como o programa consegue ler as linhas da matriz e depois cada elemento a matriz. 209

Atenda o que diz o coment ario (51) no programa getline04.cc e verique por que, agora, o programa imprime as linhas da matriz uma u nica vez. Descubra por que. O programa getline05.cc n ao usa nenhuma fun c ao da antiga linguagem C, mas usa a classe stringstream que e discutida mais acima neste par agrafo. Descubra a diferen ca entre os dois programas, getline05.cc, getline04.cc.

210

Cap tulo 7

Classe
As classes cont em os m etodos e os membros que s ao as pe cas para construir programas em uma linguagem orientada a objetos. Nesta sec ca o vamos ilustrar isto partindo de exemplos, pequenas constru co es, para lhe mostrar como s ao as classes, como montamos os objetos a partir das classes para escrever programas em C++.

A organiza ca o do cap tulo e a seguinte. Uma discuss ao geral sobre classes. Apresenta ca o de dois exemplos, a classe Ambiente e a classe Garrafa. Complementa ca o da teoria sobre classes. Exerc cios Vocabul ario Sugiro que, numa primeira leitura, sobretudo as leituras que voc e zer deste cap tulo por sugest ao de cap tulos anteriores, voc e leia a parte introdut oria rapidamente e passe direto aos dois exemplos, Ambiente e Garrafa deixando o resto para uma segunda leitura.

7.1

Classes, prot otipos de programas

O arquiteto de C++, Bjarne Stroustrup, fez um plano cujo sucesso cou demonstrado na ampla aceita ca o da linguagem: fazer a expans ao de uma linguagem muito usada e testada, C, de tal modo que permitisse aos C-programadores evoluirem para uma nova forma de programar. Java e outra linguagem produzida, acidentalmente, com o mesmo objetivo e que chega a representar uma concorrente forte para a linguagem C++ sobretudo porque por tr as dela se encontra uma empressa de hardware que e muito signicativa. Recentemente Java passou a ser de c odigo aberto o que poder a lhe dar um avan co compar avel ao de C++. 211

O ponto chave nesta expans ao se constituiu de usar a estrutura de dados struct com a capacidade de modelar processos. e ir a entender rapSe voc e analisar comigo o programa typedef tut.cc voc idamente a estrat egia de Stroustrup. Abra o programa com um editor de textos e me acompanhe na analise.

7.1.1

Sub-estrutura

Procure ponto, que e a deni ca o de uma matriz com quatro campos, todos do tipo float. O nome do tipo de dados aparece ao nal, depois de fechadas as chaves. Em qualquer posi ca o desta folha de trabalho1 , posso criar uma vari avel do tipo ponto: ponto um vetor; depois do que posso acessar os campos de um vetor com as etiquetas escolhidas por mim para denomin a-las: x,y,z,w. O coment ario (50), dentro do programa typedef tut.cc, explica isto: um vetor.x um vetor.y um vetor.z um vetor.w uma outra ma Procure tabela, logo abaixo da deni ca o de ponto. E triz cujos campos s ao heterog eneos e poristo mesmo n ao se chama mais a estrutura matriz. O nome t ecnico para estruturas deste tipo e tabela. E de dados das planilhas, e formada de c elulas ( e o que estou chamando de campo) que em conjunto formam um tipo de dado e recebem um nome. Podemos acessar cada c elula individualmente com um ndice. Aqui o ndice e o nome do campo e o operador ponto faz este acesso: Em algum momento no programa crio um vari avel do tipo tabela tabela uma tabela que ter a quatro campos titulo arqgraf papel vetor da tabela e do tipo ponto portanto e agora observe que o campo vetor da tabela ele vai ter quatro campos designados pelas etiquetas x,y,z,w. Procure o coment ario (51), no programa typedef tut.cc, para ver o acesso aos
1 Um arquivo e uma folha de trabalho, estou me referindo ao arquivo typedef tut.cc onde h a v arias deni co e produzindo um programa

212

sub-campos do campo vetor da tabela. Voc e vai ver o que voc e j a est a habituado a encontrar na Internet que e uma grande cole ca o de estruturas, cada um dos grandes n os da rede, os dom nios prim arios, br, cl , uk, us, ... nos quais est ao pendurados os dom nios locais de cada pa s br.gov o dom nio do governo brasileiro e obviamente o uso e invertido o que n ao altera em nada a discuss ao que estou fazendo. Foi denida uma sintaxe, na linguagem da Internet, em que quanto mais alto for o dom nio, mais ` a direita deve car: camara.gov.br, senado.gov.br, stj.gov.br, sead.ce.gov.br ou ltimo exemplo acima e uma secret aria de governo do Estado do Cear a. Qualquer departamento do governo do Estado do Cear a estar a pendurado no n o ce.gov.br. Assim, a medida que estrutura admnistrativa do pa s vai se organizando, car a mais f acil encontrar os seus departamentos. Possivelmente, sead.pi.gov.br deve ser o dom nio da Secretaria de Administra c ao do governo do Estado do Piau , e edu.mg.gov.br deve ser o dom nio da Secretaria de Educa ca o do Estado de Minas Gerais. Assim a Internet e uma estrutura, formada pelos dom nios prim arios, com as sub-estruturas, formadas pelos dom nios nacionais, onde h a uma arvore de sub-estruturas. Que podemos concluir desta descri ca o? Pelo menos duas li co es: 1. Que devemos descobrir quais s ao as partes mais simpels de uma grande estrutura para den -las inicialmente; 2. Grandes estruturas s ao melhor descritas quando usamos sub-estruturas convenientes, e mais simples, para indenticar as suas partes. Mas isto e uma id eia que j a existia bem antes de Stroustrup nascer, ela surgiu em Matem atica com a estruturas alg ebricas em que grandes estruturas s ao aglomerados de estruturas mais simples. Tamb em, dentro das estruturas matem aticas existe o outro componente que Stroustrup foi buscar para descrever as classes de C, em Matem atica se chamam morsmos, em C se chamam-se m etodos e o objetivo e o mesmo. Ent ao Stroustrup criou uma nova estrutura, a classe que e uma antiga struct em que ele incluiu os m etodos que servem para acessar, alterar, fazer comunica c ao externa-interna com os membros de uma classe. Assim, enquanto as antigas structs tinham apenas membros, as classes tem ao os dep ositos em que car ao os dados; membros que s ao o meio de para acessar, alterar, fazer comunica c ao externa m etodos que s interna com o membros da classe. 213

Desta forma uma classe e um modelo completo de uma determinada entidade para qual desejamos construir um programa. O programa typedef tut.cc tem um defeito que deve ser evitado, usamos o identicador tabela para a estrutura e depois precisamos usar a mesma palavra para criar exemplos de tabelas. Uma tarefa sempre dif cil, esta de encontrar nomes adequados para o modelo para deixar que nomes espec cos quem para os exempls do modelo, chamados de inst ancias na linguagem dos programadores.

7.1.2

Classes e objetos

Vou apresentar-lhe as id eias fundamentais da programa ca o orientada a objetos que em C++ se traduz com a constru ca o de classes e depois lhe vamos apresentar dois exemplos um dos quais j a nos vem acompanhando desde o primeiro cap tulo, a classe Ambiente. Nos exerc cios voc e vai encontrar ainda exemplos de uso direto do conceito de classes. Fa ca uma primeira leitura colocando as m aos na massa, examinando os exemplos e rodando programas que lhe vamos propor. Depois fa ca uma segunda leitura mais em profundidade procurando ent ao entender os motivos desta forma mais abstrata de programar. As classes s ao generaliza co es2 das structs. Uma classe e uma abstra c ao computacional de uma entidade do mundo real3 . As classes n ao s ao programas mas sim a descri ca o de um objeto, suas propriedades (m etodos) e os seus dados (membros) um modelo que vamos fazer funcionar com programas, aqui est a a base da abstra c ao. Voc e nunca ir a compilar4 uma classe. Fa ca as seguintes experi encias: g++ -Wall -o prog Areas.h Se voc e digitar depois ./prog o sistema vai lhe responder que n ao pode executar este programa. Porque e um programa. Um programa, em C++ tem que ter a fun ca o main() n ao chamando outras fun co es. No arquivo Areas.h n ao existe nenhuma fun ca o main(). g++ -Wall -c Areas.h

For ca o compilador do C++ a fazer uma an alise sint atica do arquivo Areas.h e se houver erros de sintaxe, apresent a-los.

O arquivo Areas.h foi constru do no tutorial 43, 124, sobre fun co es e m etodos, no cap tulo 4, n ao cont em um programa e sim m etodos que podem servir para
parece um texto escrito por um matem atico... se um programa n ao fosse parte do mundo real... 4 Mas voc e pedir que gcc analise sintaticamente uma classe, por exemplo gcc -c -Wall Ambiente.h , experimente!
3 como 2 Isto

214

construir um programa. Um exemplo de programa montado usando os m etodos da classe Areas e areas v02.cc resultado do mesmo tutorial referido acima. As classes n ao s ao programas, elas cont em os componentes para fazer um programa, e podem (e devem) ser u teis na constru ca o de diversos programas. Compara co es s ao sempre defeituosas, mas podemos comparar a forma de programar orientado a objeto com uma grande ind ustria que produz diversos tipos de produtos. Para montar os seus produtos ela recorre ` a ind ustria de pe cas selecionando o que houver de melhor e mais bem testado no mercado e desta forma tem a certeza de que o seu produto nal ser a de boa qualidade: porque est a usando pe cas testadas. assim que se montam computadores, se escolhe um bom fabricante de E placas m ae, se decide qual o processador, o HD, o teclado, etc... e se monta o computador, colocando ao nal a etiqueta DOLL, o melhor micro computador do mercado. Embora estejamos sugerindo que seja uma forma f acil de programar, esta id eia n ao e verdadeira. D a trabalho ir atr as dos melhores componentes para um programa e algumas vezes terminamos escrevendo n os mesmos as classes desejadas. No nal, aplicamos esta id eia, mais facilmente, dentro do grupo de trabalho a que pertencemos, mesmo assim j a apresenta uma grande vantagem esta forma de produzir. Ao construirmos trechos de programas que sirvam a diversos objetivos, eles podem ser mais efetivamente ser testados e no nal de contas sempre encontramos pe cas de programas, funcionando, para n ao come car do zero: basta adapt a-las acrescentando m etodos ou membros necess arios aos objetivos que agora tivermos. Para ver que isto e verdade e come car a dar os seus primeiros passos na constru ca o de programas, visite [14, o site da programa ca o], onde voc e vai logo encontrar na p agina de abertura a arma ca o (v alida no momento em estamos escrevendo estas linhas) Registered Projects: 167,643 Registered Users: 1,776,806 ou seja, 167.643 projetos registrados e com 1.776.806 usu arios. Vale a pena visitar para ir se acostumando, n os aprendemos um bocado com estas visitas e seguiremos aprendendo porque estamos entre os 1.776.8065 membros daquela comunidade.

7.1.3

A produ c ao de software

As bibliotecas, que antecederam as classes na evolu ca o computacional, tamb em serviam a este m, e quando voc e executou as tarefas do tutorial 43 na p agina 124 voc e foi buscar na classe Areas os m etodos que lhe interessavam para con claro que n struir o seu programa. E ao foi exatamente assim porque construimos Areas para reetir um programa existente. muito dif Mas n ao e desta forma que se produz software hoje em dia. E cil descrever tudo que ocorre no mundo da produ ca o de programas, n ao existe
5 Valor

v alido para 20 de Janeiro de 2008....

215

uma receita f acil para atingirmos os nossos objetivos, mas de forma ideal, o planejamento passaria pelas seguintes etapas (n ao sequ enciais). Vamos pensar numa equipe de produ ca o de programas com uma determinada nalidade, que o problema seja Geometria, mas, facilmente voc e pode alterar a nossa conversa de formas que o texto seguir a valendo para Contabilidade Geral. Equipe da entrada de dados

Mesmo que os programas tenham todos um objetivo central, qualquer programa precisa de um unidade de comunica ca o com o usu ario e parte da equipe se dedica a isto para se especializar na produ ca o de p aginas agrad aveis onde car ao os bot oes que representam os itens do menu do programa. Voc e j a passou por alguns menus na leitura deste livro, certo? Eles representam a entrada dados dos programas. Se algu em tiver uma id eia interessante de problema geom etrico, talvez rota c oes de hiper-cubos solicita ao pessoal do menu um item para esta rotina, que poder a ser um cone numa p agina. A forma como o menu vai ser apresenta ca por conta do planejamento, O planejamento da p agina de acesso e uma arte especial que alguns dominam.

Equipe algoritmica

Parte da equipe vai se especilizar na solu ca o de problemas relativos ao objetivo em quest ao. Suponhamos que o planejamento decida que, para esta primeira vers ao do programa, as quest oes ser ao apenas areas das guras planas. Isto j a e um bocado de trabalho para uma primeira vers ao: c rculos, elipses, trap esios ou area de um terreno localizado na serra... A medida que o trabalho se desenvolve v ao pedindo a inclus ao de itens ao pessoal da p agina de acesso. O problema e deles6 e arrumar as coisas de forma bonita! sem polui ca o visual.

Equipe da sa da de dados

Depois de um problema resolvido e necess ario apresentar o resultado, imprimir os n umeros, as area das guras geom etricas e possivelmente fazer um desenho das mesmas. no caso do terreno na serra, por exemplo. Uma outra equipe se ocupa disto. Tamb em precisa de um bocado de arte e paci encia para apresentar bem os resultados.

Apresentamos uma divis ao tradicional do trabalho: entrada de dados, uma equipe formada de gente agrad avel, de bom trato e boas conversas para cativar o cliente; algoritmo em geral um grupo de cabeludos, que se vestem mal e trabalham at e tarde da noite e sempre se acordam depois das 10 horas da manh a; Em geral eles se consideram g enios!
6 do

pessoal da p agina de acesso...

216

sa da de dados este e um grupo que n ao precisa trabalhar at e tarde da noite e nem precisa se vestir muito bem. Deixemos claro que os coment arios desairosos sobre as equipes de trabalho foram escritos pela mesma pessoa que escreve as notas de rodap e! N ao a leve a s erio! Mas o projeto pode requerer outras a co es que precisariam de uma equipe dedicada, por exemplo, uma p agina na internet mostrando exemplos do trabalho, recebendo pedidos etc...esta equipe seria criada ou o trabalho alocado a uma das equipes existentes. O resultado do trabalho destas equipes e de suas sub-equipes e uma classe (ou v arias classes) contendo os m etodos e os membros que ir ao compor a primeira vers ao do programa mais alguns que poder ao ser u teis em outras situa co es7 . Quando o programa evoluir, se o trabalho tiver sido bem feito, apenas ser ao inclu dos novos m etodos (fun co es) ou membros (vari aveis e dados) e talvez uma nova p agina de rosto, e, de repente, mais aquela id eia revolucion aria que ningu em sabia exatamente para que serviria. Ao longo do trabalho, cada equipe se encarrega de produzir os m etodos que lhe compete e, ao denir vari aveis (membros). E aqui est a uma das grandes vantagens do m etodo, as vari aveis, que guardam os dados, e que agora chamammos de membros, cam encapsuladas com os m etodos e ningu em precisa saber sequer os nomes destas vari aveis. Fa ca uma leitura do cap tulo 7 para se recordar do stress que colocamos na escolha dos nomes das vari aveis. Muitas das preocupa co es que descrevemos al , cam agora simplicadas, porque cada objeto carrega o seu pr oprio espa co de nomes localizando as vari aveis, nenhuma das programadoras da equipe precisa se preocupar com evitar nomes iguais aos que suas colegas de trabalho tiverem usado em outras partes do programa. O programa ideal8 n ao precisa ter uma u nica vari avel, se resumir a a chamar os atores que dialogar ao com o usu ario recebendo deles, localmente, os dados dif e executando as tarefas que lhe forem espec cas. E cil atingir este ideal de uma fun ca o main() sem vari aveis. N ao h a nenhum exemplo assim neste livro, mas e poss vel. As classes s ao uma evolu ca o em profundidade de uma t ecnica que cou antiga, as bibliotecas. Ainda usamos bibliotecas, mas nela colocamos as classes. Uma biblioteca e um arquivo onde denimos fun co es para quais podemos ter uso em diversos programas. Assim eu re-utilizo uma velha fun c ao que funciona muito bem apenas incluindo no programa a biblioteca em que ela est a denida. Continuamos a usar bibliotecas, mas em vez de termos fun co es na biblioteca, criamos classes, podem ser v arias classes numa mesma biblioteca, que s ao aglomerados de vari aveis e fun co es. Agora chamamos as fun co es de m etodos e as vari aveis de membros de um determinado objeto, porque estas fun co es ser ao
7 Alguma 8o

id eia revolucion aria sem aplica ca o imediata. programa e a fun ca o main()

217

privativas9 destes objetos. Elas s ao o os m etodos de acesso e transforma ca o destes objetos. Mas n ao se trata apenas de mudan ca de nomes: c~ ao de fun avel de vari de biblioteca para m etodo; para membro; para classe.

As classes formam uma c apsula que sabe como executar em um certo n umero de tarefas, representadas pelos m etodos, e tem suas informa co es particulares, representadas pelas vari aveis e dados. Quando voc e precisa usar uma certa classe, voc e cria um exemplo10 desta classe que chamamos de um objeto. Uma p agina na Internet e um bom exemplo de um objeto: s ao todas semelhantes, portanto todas exemplos da classe p agina11 . Dizemos inst^ ancias da classe p agina. Seus m etodos, os bot oes, fazem a comunica ca o do usu ario com os dados que a p agina cont em, e esta e a u nica forma de fazer isto. Isto d a seguran ca ao conte udo do site porque o usu ario somente pode mexer no que for permitido e na forma como interessar aos que planejaram o site. Mas programas orientado a objeto n ao quer dizer programar usando bot oes ou cliques de mouse, isto pode ser feito com programa ca o cl assica (n ao orientada a objetos) tamb em. O pr oximo exemplo vai tornar estas id eias mais concretas.

7.2

A classe ambiente

Desde o primeiro cap tulo estivemos usando a classe Ambiente12 que e uma simples evolu ca o da biblioteca ambiente.h que zemos para os nossos programas em C. Voc e encontra no disco os dois arquivos, ambiente.h e Ambiente.h e pode assim ver o que estamos dizendo. H a pequenas diferen cas porque Ambiente.h seguiu evoluindo enquanto que ambiente.h cou parada no tempo. Mas se voc e quiser comparar, a diferen ca principal entre as duas bibliotecas consiste13 em criando uma class Ambiente.h come ca (depois dos coment arios) com a palavra chave class seguida do nome Ambiente. Se voc e comparar, no cap tulo 7, com a constru ca o de um struct, ver a uma semelhan ca no m etodo. Uma classe e uma struct mais inteligente, ou
9 Isto e um qualicativo lingu stico, n ao e a palavra t ecnica private de que falaremos mais a frente. 10 A palavra t ecnica e inst^ ancia 11 Neste caso a denomina ca o n ao e bem p agina e sim folha de estilo e a linguagem usada e o HTML ou alguma de suas variantes. 12 h a um h abito de designar as classes com a primeira letra mai uscula 13 N ao se esque ca da regra, abra o arquivo para acompanh a-lo na leitura

218

melhor, C++ e uma linguagem mais inteligente no uso desta nova estrutura, porque agora podemos criar c opias (inst ancias) da estrutura. Al em do mais e uma estrutura formadas de dados (membros) e de fun coes (m etodos). Ambiente n ao tem membros, apenas m etodos. terminando a deni ca o de uma class Ambiente.h termina com uma chave, ponto-e-virgula e um coment ario dizendo que al termina a classe Ambiente.h. Fica obvio que o coment ario ao nal n ao faz parte da deni ca o, mas e uma boa id eia a de sempre coloc a-lo ao nal, at e mesmo porque no arquivo Ambiente.h pode haver14 v arias classes. estrutura das classes As classes s ao formadas15 de campos, como os registros (struct). Esses campos s ao co es, n ao se eque ca de que agora as fun c oes se chamam m etodos as fun m etodos; membros as vari aveis, que agora chamamos de membros. A palavra objeto e utilizada, algumas vezes, como sin onimo de membro, mas n os vamos evitar de us a-la neste sentido. m etodos modicam membros.

Criamos os m etodos para alterar (modicar) os membros da classe. Neste caso dizemos que um determinado m etodo XX() modica o membro XX. Pode haver m etodos que alterem a pr opria classe, ou simplesmente que se comuniquem com ela. Por exemplo, voce pode clicar num bot ao, numa p agina, para fazer o download de um arquivo. Voc e est a recebendo um dado (uma c opia de um membro) sem alterar a p agina (o objeto). A classe Ambiente e um exemplo de classe cujos metodos n ao alteram nenhum membro, eles servem apenas de comunica ca o do usu ario com outros objetos (inst ancias de outra classe) sob o comando de um programa, main().

As classes s ao os prot otipos Observe que n ao usamos as classes, e sim objetos, que criamos como representa ca o (inst ancia) de uma classe. Volte a analisar a constru ca o do programa areas v02.cc e da classe Areas na p agina 124. Ou talvez voc e esteja cansado de ver a inst ancia Tela de Ambiente que polue16 todos os nossos programas. objetos Os objetos s ao uma inst ancia (exemplo) de uma classe. Veja o programa segundo03.cc, procure o coment ario (5.1), em que denimos o objeto Tela como um exemplo (inst ancia) de Ambiente. Tela e um objeto uma inst ancia de Ambiente.
14 A denomina co es e que estaria infeliz... chame o arquivo de ClassesGerais e nele coloque a classe Ambiente 15 No arquivo struct01.cc voc e encontra um exemplo de struct ou execute grep struct *.cc no diret orio em que voc e tiver gravado os programas que recebeu com este livro. 16 Acho que o autor quer dizer polulam...

219

No programa areas v02.cc, Geometria e um objeto, uma inst ancia da classe Areas. A classe Ambiente.h e um exemplo absolutamente simples. Possivelmente voc e pode saltar para a pr oxima se ca o se j a tiver feito uso desta classe. Vamos analisar de perto a classe Ambiente.h com o objetivo de que voc e aprenda a us a-la. Voc e deve decidir se compensa ou n ao ler (ou reler) esta se ca o. N ao perca tempo fazendo ou lendo coisas que voc e j a sabe.

7.2.1

Aprendendo a usar Ambiente.h

Leia Ambiente.h. Observe que os coment ario iniciais cont em uma esp ecie de ndice dos membros e m etodos denidos na classe. An alise os m etodos e retorne ao ndice para analis a-los de forma cr tica, por exemplo, acrescente mais coment arios se julgar que estes s ao necess arios, tanto na parte introdut oria como junto dos membros e m etodos. A classe Ambiente.h agora e sua! E, se voc e se arrepender de alguma modica ca o feita, pegue uma nova c opia17 no disco, a u nica forma de aprender e experimentando e os erros fazem parte do processo. Controle de acesso entendendo private

A primeira palavra-chave de Ambiente.h e public, que signica p ublico. Existe uma outra palavra que voc e n ao vai encontrar em Ambiente.h que e private que signica privado. Voltaremos a discutir estas declara co es mais a fundo, mas elas signicam que o que for declarado private e para uso interno da classe. Numa compara ca o, quando voc e compra um computador numa casa de com ercio, eles colocam um selo nas tampas da m aquina dizendo que ea garantia. Com isto querem lhe dizer que voc e n ao deve abrir o computador porque l a dentro n ao tem pe cas que o usu ario deva mexer. Portanto no seu computador s ao p ublicos o teclado, o ratinho, os bot oes para ligar e acionar discos e os conectores da usb, da placa de rede, da placa de som. Mas a placa de som, a placa de rede, a placa da usb s ao privados. O resto e privado, para uso interno da m aquina. Como vivemos com software livre e preciso complementar esta explica ca o inicial. Ao etiquetar os componentes de uma classe como privados queremos dizer mexa, se voc e souber mesmo o que est a fazendo, porque estes componentes foram planejados para que a classe funcionasse. Voltando ` a compara ca o com o computador, ele pode travar porque tem humidade na conex ao da placa de rede, num nal de semana, e se voc e

bom adquirir o h abito de fazer c opia de reserva (backup) porque voltar, sempre, ao ponto zero, pegado outra c opia no disco, pode representar uma grande perda de tempo.

17 E

220

abrir e desconectar a placa de rede e voltar conect a-la a m aquina voltar aa funcionar. Voc e n ao alterou a placa de rede! mas quebrou a c apsula e viu onde estava a placa de rede e a desconectou e voltou a conectar. O mesmo voc e pode fazer com os componentes de um objeto, se voc e souber o que est a fazendo. No caso dos m etodos e membros privados, o que o autor do programa quer dizer e que estes componentes n ao devem ser usados externamente por nenhum programa, porque e desnecess ario! n ao e uma proibi ca o! No caso da placa de rede, no exemplo acima, voc e perdeu a garantia, se trata portanto de uma proibi ca o. Experimente agora, apague (use coment ario) a palavra chave public em Ambiente.h e compile o programa segundo03.cc. O resultado ser a uma lista de reclama co es porque todos os m etodos e membros da classe viram privados. Quer dizer que o controle de acesso private e o natural, ou default. Se n ao forem declarados como public todos os m etodos e membros da classe ser ao privates. H a um h abito de come car coms os m etodos p ublicos, at e mesmo porque cam no in cio e ca mais f acil comprender a classe. A partir do momento que voc e colocar o acesso private ca tudo privado at e que voc e altere com novo controle de acesso. Ambiente.h tem apenas m etodos. Para usar Ambiente.h, inclua a biblioteca Ambiente.h e depois dena um exemplo de ambiente. Veja segundo03.cc, em que denimos Ambiente Tela; de forma semelhante como deniriamos uma variavel: Tipo nome da variavel; apeteco quer dizer aperte uma tecla para continuar mas esta tecla tem indispens que ser enter. E avel em uma programa a frase aperte uma tecla para continuar. Resolvemos isto de uma vez por todas quando ainda programavamos em Pascal. Os nomes e que caram dif ceis de se entender. Por que apeteco() tem duas mensagens pr oprias (que voc e pode ou deve alterar) e apeteco2() tem somente uma ? A raz ao e porque apeteco2() veio depois! Em Ambiente tem tr es tipos de apeteco, leia e veja a diferen ca entre eles. Quando formos usar um destes m etodos em um programa chamamos Tela.apeteco2(); querendo dizer que estamos usando o m etodo apeteco2() do exemplo (inst ancia) de Ambiente que criamos, o objeto Tela. 221

compara() e um exemplo de animal fora do ninho. Foi cando a quando deveria estar em outra classe. Corrige a l ogica da fun ca o strcmp() que em certos momentos parece terr vel, embora tenha uma raz ao bem l ogica. Tr es m etodos para entrada de dados que tamb em deveriam estar em outro lugar, possivelmente junto com compara(). Talvez voc e deva come car melhorando a sua Ambiente. Para n os ca dif cil pelo n umero de programas que j a temos funcionando. Voc e pode ver os erros que salientamos no planejamento de Ambiente, aprenda com os nossos erros. Exerc cios 68 (Tutorial) Usando Ambiente 1. 2.

7.3

A classe garrafa

Ambiente e uma classe de baixa qualidade e serviu apenas para introduzir o assunto. Vamos agora apresentar-lhe uma classe mais s eria, como a pr opria gura (7.1) bem o indica. Na gura (7.1), p agina 222, voc e pode ver o prot otipo de uma garrafa projeA classe garrafa e os seus mtodos mtodo fechador

mtodo medidor do contedo

mtodo trans portador

mtodo medidor da temperatura

Figura 7.1: tado por um f abrica. Um das programadoras de nossa equipe conseguiu trazer o desenho secreto num pen-drive cuidadosamente escondido. O prot otipo e feito em papel e traz as id eias b asicas do tipo de garrafas que esta f abrica pretende fazer. Eventualmente a f abrica decidir a fazer uma garrafa com mais m etodos (com mais funcionalidade), por exemplo, 222

ir a substituir o m etodo fechador por outro m etodo mais avan cado que, al em de fechar a garrafa, tamb em permita ejectar o conte udo da garrafa; poder a substitui o m etodo transportador por um outro que al em de transportar tamb em sirva de suporte com rodas para deslizar garrafa em superf cies planas como mesas ou balc oes. Veja que o planejamento de um prot otipo tem que ser sucientemente simples para que possa ser imediatamente constru do o primeiro objeto (inst ancia) da classe, mas esteja de tal modo planejado para que novos m etodos ou membros possam ser inclu dos18 .

Voc e logo ver a que esta e a chave de um conceito essencial em programa c ao orientada a objeto, classes bem simples, que funcionam, ` as quais se vai acrescentando propriedades e assim produzindo classes derivadas, mais complexas. o conceito de heran E ca. Voc e pode ver que estas duas melhorias no projeto est ao perfeitamente contempladas no prot otipo inicial. Basta retirar o m etodo fechador, que e muito simples, e substitu -lo pela vers ao mais avan cada sem nenhuma altera ca o na estrutura geral da garrafa. Inclusive os consumidores que quiserem uma nova vers ao da garrafa ter ao apenas que pagar pelo novo m etodo sem nenhum custo adicional pelo restante da garrafa que continuar a com todas as demais funcionalidades do projeto inicial: o consumidor devolve o m etodo antigo a f abrica que lhe entrega o novo m etodo contra uma pequena cobran ca porque ela continuar a usando o m etodo antigo em garrafas mais baratas. Tanto o m etodo fechador como o m etodo transportador foram projetados para serem facilmente substituidos por vers oes mais avan cadas no corpo de um garrafa existente, reciclagem, que e um conceito essencial, n ao somente para programa ca o como para a prote ca o do meio ambiente. Feito o projeto, tr es c opias do mesmo foram despachadas para produ c ao, com o objetivo de construir o primeiro modelo real; departamento de engenharia el etrica para analisar e produzir os circuitos necess arios da garrafa; departamento de computa c ao, com o objetivo de criar uma classe computacional para produzir o software que acompanharia a garrafa. Vamos ver agora o que os programadores da empresa zeram com a garrafa.
o que zemos com o nosso programa sobre geometria, preparamos logo uma vers ao simples que j a se encontra a venda junto com este livro.
18 Foi

223

7.3.1

A classe computacional da garrafa

O programador tem que escrever um c odigo que crie para um computador o prot otipo produzido pelos planejadores da empresa. Isto tem que ser feito numa linguagem de programa ca o. Aqui entra C + +.

O c odigo come ca com a palavra-chave class seguida do nome da classe: A gura (7.2) p agina 224, mostra o esqueleto de uma classe, temos este

/* classes diversas (inclusive a classe Garrafa) autor equipe da empresa de garrafas */ class Garrafa { public: // aqui os membros e os mtodos pblicos private: // aqui os membros e mtodos privados (uso interno) }; // fim da classe Garrafa

Figura 7.2:

uma classe esqueleto para fazer classes

a arquivo j a pronto para ser copiado: classes esqueleto.h19. Observe o que j dissemos antes, em um mesmo arquivo podemos ter diversas classes declaradas e implementadas. Observa c ao 21 in line H a v arias metodologias para construir classes, uma delas e a que usamos aqui, outra se constitue de declarar a classe num arquivo e colocar a implementa c ao em outro arquivo. Aqui estamos usando implementa c ao in line. Quando voc e estiver trabalhando num grande projeto ter a interessa em entender melhor esta diferen ca porque ela tem implica c oes na performance do programa, procure ent ao a palavra chave inline para decidir como planejar o trabalho. Entre as chaves vai ser colocado o c odigo fonte da classe que posteriormente deve ser transformado em um circuito el etrico e impresso no material em que a garrafa ser a feita, interligando os m etodos planejados. Obviamente esta etapa ser a um trabalho conjunto do departamento de computa c ao com o departamento de engenharia el etrica da empresa.
19 Este

arquivo se encontra no CD que acompanha o livro.

224

Uns entendem de computa ca o, e os outros entendem de circuitos impressos. Numa primeira fase os programadores v ao elaborar tamb em um prot otipo computacional que depois ser a discutido com os outros departamentos da empresa para ser adequado ` a realidade. Por exemplo, os programadores j a telefonaram ao departamento de engenharia el etrica para obter dados sobre o sensor t ermico porque perceberam um problema preliminar: o l quido, na garrafa, poderia n ao ter uma temperatura homog enea, poderia estar mais frio na base e mais quente no topo e caram sabendo que o sensor teria ser m ultiplo, com tomadas de dados em v arios pontos da garrafa, com um c alculo complicado de m edia aritm etica ponderada para obter a temperatura m edia do l quido, processo j a idealizado pelo matem atico do departamento de engenharia el etrica onde o prot otipo j a estava sendo estudado. A classe computacional da garrafa O resultado inicial do departamento de computa c ao est a na gura (7.3), p agina 225.
class Garrafa { public: int fechador(int testa_tampa){ return testa_tampa; } float mede_conteudo(float conteudo) { return conteudo; } float mede_temperatura(float sensor1 float sensor2) { float media; float peso1=5, peso2=10; media= (peso1*sensor1 + peso2*sensor2)/(peso1+peso2); return media; } int mensagem_ao_publico(){ cout << Nova garrafa trmica << endl; return(0); } int atualiza_estoque(int valor) { estoque = valor; return(0); } private: int transportador(int testa_transporte) { return testa_transporte; } int mensagem_aa_administracao() { cout << Numero de garrafas no estoque: << estoque << endl; return(0); } int estoque; // este mtodo no est concludo }; // fim da classe Garrafa

Figura 7.3:

A classe Garrafa

um prot N ao que surpreso, mas isto n ao e um programa. E otipo de programa. Sim, em C + +, como em qualquer linguagem orientada a objetos, se fazem primeiro os modelos, depois os programas v ao lan car m ao destes modelos. Esta n ao e a linguagem precisa, depois explicaremos melhor o m etodo e ent ao

225

usaremos uma linguagem mais t ecnica. Se voc e estiver impaciente, ande algumas p aginas mais a frente e encontrar a um programa que funciona, e depois volte a ler a partir daqui, este ir e vir20 funciona para muitas pessoas: avance um pouco, leia um programa que funciona, e depois volte para estudar o planejamento.

1 class Garrafa 2 { 3 public: 4 int fechador(int testa_tampa) 5 { 6 return testa_tampa; 7 } 8 float mede_conteudo(float conteudo) 9 { 10 return conteudo; 11 } 12 float mede_temperatura(float sensor1 float sensor2) 13 { 14 float media; 15 float peso1=5, peso2=10; 16 media= (peso1*sensor1 + peso2*sensor2)/(peso1+peso2); 17 return media; 18 } 19 int mensagem_ao_publico() 20 { 21 cout $<<$ "Nova garrafa termica " $<<$ endl; 22 return(0); 23 } 24 int atualiza_estoque(int valor) 25 { 26 estoque = valor; 27 return(0); 28 } 29 private: 30 int transportador(int testa_transporte) 31 { 32 return testa_transporte; 33 } 34 int mensagem_aa_administracao() 35 { 36 cout $<<$ "Numero de garrafas no estoque: " $<<$ esto 37 return(0); 38 } 39 int estoque; 40 } // fim da classe Garrafa a palavra chave class

Figura 7.4:

A classe Garrafa

Vamos discutir cada etapa deste planejamento. Primeiro vamos alter a-lo colocando n umeros em cada linha para fazer as referencias, voc e pode ver isto na gura A gura (7.4) p agina 226, Observe que n umeros nas linhas n ao existem num programa em C + + (nem em Java) e nem em nenhuma linguagem de programa ca o moderna. ca o de uma classe em 1. class Garrafa A palavra-chave class inicia a deni
cabe ca e uma senten ca, diz um ditado popular, a sua l ogica seguramente e diferente da l ogica do autor, use o livro como lhe parecer melhor
20 cada

226

C + + em em outras linguagens orientadas a objeto tamb em. H a um h abito de denominar as classes com a primeira letra mai uscula. Observe que C + + e sens vel ao tipo de letra, mai uscula ou min uscula. Ou seja, Garrafa n ao e o mesmo que garrafa. 2. { marca o in cio da classe. Observe que esta chave se encontra fechada no item 40 e as duas se encontram no mesmo n vel de tabula ca o.
A tabula ca o se encontra a para os humanos. O compilador ignora tabula co es assim como espa cos. Na verdade um espa co ou v arios espa cos seguidos, contam como um espa co para o compilador. Podemos usar espa cos para enfatizar a l ogica do programa j a que os compiladores n ao aceitariam negritos ou outros adere cos tipogr acos. E comum os livros de programa ca o fazerem refer encia a uma guerra santa entre programador@s quanto ao estilo de tabula ca o, a verdade e que cada um de n os tem uma forma para salientar a l ogica. Encontre a sua, mas n ao se esque ca de que programas s ao escritos para outras pessoas lerem, pelo menos @s outr@s programador@s de sua equipe de trabalho.

3. public: e uma palavra-chave que libera o uso dos itens da classe para uso externo. Veja o item 29, private:, que restringe o uso desta parte da classe para uso interno da pr opria classe. Os dois pontos fazem parte da sintaxe, vem da linguagem C para caracterizar etiquetas dentro de um programa. 4. int fechador(int testa tampa) marca o in cio da deni ca o do m etodo fechador, do tipo int. A chave que vem a seguir, item 5 (fechada no item 7, marca a area do c odigo deste m etodo. Este m etodo recebe (certamente) de um sensor eletr onico a informa ca o sobre a tampa, se esta corretamente colocada. Se estiver retorna o valor 1, caso contr ario retorna o valor 0 e o pessoal da eletr onica dever a preparar um led vermelho para acender quando o resultado de fechador for zero. Nesta parte do c odigo deveria constar esta observa ca o. As Observa co es (coment arios), nos programas, servem para justicar as decis oes que @ programad@r tomou. Portanto os itens de 4-7 deveriam estar assim: int fechador(int testa_tampa) { // pessoal da eletronica deve preparar um led vermelho // para acenter quando teste_tampa == 0 return testa_tampa; { quando aparecer // o compilador ignora o que estiver na linha at e o nal da mesma. As duas linhas acima ser ao ignoradas pelo compilador. cio do c odigo de fechador 5. { in 6. return testa tampa; e tudo que fechador far a, retornar o valor que vem do sensor.

227

7. } m do c odigo de fechador

Aqui voc e v e que os m etodos s ao as fun co es de que j a falamos desde o primeiro cap tulo. O que muda aqui e que todas as fun coes (m etodos) aqui est ao feitas para resolver quest oes ligadas um mesmo objeto21 neste caso, a garrafa, uma inst ancia da classe Garrafa.

ca o de um novo m etodo, 8. float mede conteudo(float conteudo) declara do tipo float que dever a reagir a um sensor anal ogico lendo a quantidade de l qudido no interior da garrafa. Aqui nova mensagem deveria car no texto do programa dizendo // atencao pessoal da eletrica: sensor analogico 9. { chave iniciando o corpo do m etodo 10. return conteudo; o m etodo apenas devolve um n umero que deve aparecer num LCD indicando a quantidade de litros que tem na garrafa. Este n umero n ao e certamente inteiro, eis a raz ao porque o m etodo e do tipo float. 11. } m do c odigo mede conteudo ca o de um novo 12. oat mede temperatura(oat sensor1 oat sensor2) declara m etodo, do tipo float. 13. } chave abrindo o corpo do m etodo fechada no item 18. Este m etodo recebe, de sensores distribuidos na parte interna da superf cie da garrafa, os valores da temperatura. Calcula a m edia aritm etica ponderada destes valores, e consequentemente n ao deve ser um n umero inteiro, eis porque o m etodo e do tipo float. Planejamos apenas dois ponos de medi ca o, o pessoal da engenharia deve decidir se e preciso mais do que dois. Aqui vemos um erro do planejamento da classe. Este m etodo deveria estar dentro da area etiquetada como private, ver item 29, porque ele n ao deve ter acesso externo: Ningu em deve ter permiss ao para alterar o c alculo da temperatura. Vamos deixar o c odigo assim mesmo para voc e veja que os erros aparecem durante o processo. Depois, com um editor de textos, e f acil corrigir este erro. Observe que se tivessemos colocado aqui o controle de acesso private, este tipo de controle se propagaria para todos os m etodos e membros que viessem depois. Esta e a raz ao pela qual se tem o h abito de come car com p ublic e a partir de um certo ponto mudarmos o controle de acesso para private. 14. float media; declara ca o de uma vari avel do tipo real. Esta vari avel (membro) tamb em e de natureza private.
21 A

palavra objeto est a sendo utilizada com duplo sentido, e valem os dois sentidos.

228

15. oat peso1=5, peso2=10; declara ca o de duas vari aveis do tipo real. Observe que as tres vari aveis podem ser declaradas em uma u nica linha, mas e conveniente, separ a-las, pedagogicamente, em duas linhas porque elas tem objetivos diferentes. Estas vari aveis tamb em s ao de natureza private assim como o pr oximo m etodo. 16. c alculo da m edia 17. return media; a resposta do m etodo para que o pessoal da engenharia prepare um LCD no corpo da garrafa com este resultado. As vari aveis sensor1, sensor2, media s ao vari aveis locais deste m etodo. Mais adiante vamos discutir o signicado de vari aveis locais, neste momento apenas chamamos aten ca o para sua exist encia. etodo. 18. } m do corpo do m 19. int mensagem ao publico() deni ca o de um novo m etodo que o pessoal do departamento de propaganda ainda vai ser contactado para denir o que ele vai fazer. Neste momento preparamos uma mensagem simples dizendo um m que nova garrafa est a pronta para ser vendida. E etodo do tipo int porque, quando n ao houver um tipo preciso para o m etodo, por h abito, escolhemos o int. Voc e ver a mais a frente que h a raz oes mais fortes do que h abito para fazer assim, os valores produzidos pelos comandos podem ser recuperados pelo sistema operacional e servem para descobrir tipos de erros cometidos. cio do c odigo do m etodo. 20. { in 21. a mensagem simples este m etodo deve ser refeito de acordo com o pessoal do departamento de propaganda. etodo deve devolver algum valor. Se n ao houver nen22. return(0); Todo m hum valor espec co, como e o caso da temperatura ou do m etodo que verica a tampa da garrafa, ent ao colocamos return(0); Este valor tem uma fun ca o mais profunda, ele e ecoado para o sistema operacional que o guarda em alguma vari avel22 . 23. } m do c odigo do m etodo. 24. int atualiza estoque(int valor) declara ca o de um novo m etodo. Do tipo int . cio do c odigo do m etodo. 25. { in 26. estoque = valor; o m etodo atualiza uma vari avel global da classe, a vari avel estoque. Ver item 39. Este valor vai ser comunicado ` a administra ca o ou pode ser requisitado usando este m etodo da garrafa, pela administra ca o.
valor e guardado, em Linux, na vari avel ? e voc e pode recuper a-lo com o comando system(echo $?)
22 Este

229

27. valor padr ao de retorno. 28. } m do c odigo do m etodo. odigo da classe que somente pode ser 29. private: Marca uma parte do c manipulada pelos m etodos da pr opria classe. Daqui em diante, e at e que novamente apare ca outro tipo de autoriza c ao , esta parte do c odigo est a protegida para uso interno da classe. O m etodo que calcula a temperatura dever a ser transferido para c a quando rezermos o programa. 30. int transportador(int testa transporte) m etodo do tipo int, de tipo l ogico com apenas dois valores 0, 1 para representar verdadeiro, falso para acender um led caso a garrafa entre em movimento. cio do c odigo do m etodo. 31. { in 32. return testa transporte; o valor de retorno pode ser 0, 1 e deve ser usado para acender um led vermelho indicando que a garrafa se encontra em movimento. 33. } m do c odigo deste m etodo. 34. int mensagem aa administracao() deni ca o de um m etodo do int. Privado porque n ao tem sentido ser acionado externamente. Possivelmente ele ser a usado automaticamente por um programa para alertar a administra ca o, quando o estoque da garrafa atingir um n vel cr tico. N ao se esque ca que uma classe n ao e um programa, ela ser a usada por um programa. cio do c odigo do m etodo. 35. { marcando o in 36. a sa da de dados do m etodo 37. return(0); valor padr ao de retorno. 38. } m do c odigo do m etodo. ca o de uma vari avel global da classe. Esta vari avel 39. int estoque; declara se encontra dispon vel para qualquer m etodo da classe. Tais vari aveis devem semprpe ser analisadas com cuidado, em princ pio devem ser evitadas. ca o da classe. Coloque sempre aqui um coment ario indi40. } m da deni cando isto.

7.3.2

Utilizando a classe da garrafa

Se uma classe n ao e um programa, para que servem as classes? Nesta sec ca o vamos dar uma resposta a esta quest ao usando a classe Garrafa que criamos anteriormente, para fazer um pequeno programa.

230

Vamos construir um pequeno programa que vai utilizar a classe Garrafa. O programa completo se encontra no disco, no arquivo garrafa1.cc. Aqui vamos apresentar-lhe apenas a fun ca o main(). Copie o programa para o seu computador para rod a-lo. Para compilar o programa, digite g++ -Wall -oprog garrafa1.cc g++ e o compilador do C + +; -oprog informa ao g + + que ele deve criar o arquivo prog execut avel; e o arquivo contendo o programa que vamos descrever abaixo; garrafa1.cc W all e uma diretiva de compila ca o para que os erros sejam apresentados. Execute g++ --help para ver uma lista das diretivas de compila ca o mais usadas. Garrafa.h e a biblioteca em que a classe Garrafa est a denida e que voc e tamb em deve copiar para o disco do computador. Ela est a incluida no programa garrafa1.cc. uma inst ancia de Garrafa foi criada no programa garrafa1.cc, dentro de main(). N ao se esque ca que os n umeros nas linhas foram colocados para facilitar nossa conversa. Voce pode ver o programa na gura (7.5) p agina 231,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# include <iostream.h> # include "Garrafa.h" int main() { Garrafa garrafa1; // define garrafa1 int aberta; cout << "Verifique se a garrafa esta aberta !" << endl; cout << "Escolha (1) garrafa aberta (2) garrafa fechada" << endl; cout << "Esta aberta ? "; cin >> aberta; if (aberta == 2) aberta = 0; if (garrafa1.fechador(aberta)) cout << "Ateno, a garrafa est aberta !" << endl; else cout << "Ok a garrafa est fechada !" << endl; return(0); }

Figura 7.5:

O objeto garrafa

Vamos desenvolver os coment arios linha por linha: 231

1. iostream.h e a biblioteca geral de entrada e sa da do GNU/C + +. O prexo ioindica23 isto; 2. Garrafa.h e a biblioteca em que denimos a classe Garrafa. Observe a diferen ca entre as biliotecas padr ao, declaradas usando os sinais de maior/menor e as bibliotecas do usu ario, que ser ao procuradas na area de trabalho do usu ario, declaradas usando aspas; 3. declara ca o da fun ca o principal; 4. abre-chave marcando o in cio do c odigo da fun ca o principal; aqui que ca o de objeto do tipo Garrafa. E 5. Garrafa garrafa1; declara come ca a hist oria. Entenda a l ogica das classes. Neste ponto estamos dizendo que garrafa1 e do tipo de Garrafa. Quer dizer, e uma c opia de todas as propriedade denidas naquela classe. Em qualquer programa que precisarmos de uma garrafa descrito por aquele prototipo, bastar a incluirmos esta linha no programa. 6. int aberta deni ca o de uma vari avel do tipo int; alogo (ou mon ologo) com o usu ario para saber se a garrafa est a 7. 7-9 di aberta. Neste momento a garrafa e terrivelmente rudimentar e n ao tem sensores funcionando, a solu ca o e perguntar a algu em que esteja por perto. 8. linha 10 se o informante responder que que a garrafa est a aberta, chamamos (linha 11) o m etodo garrafa1.fechador() que e o m etodo fechador() que garrafa1 herdou da classe Garrafa; Veja a sintaxe: garrafa1.fechador() Observe que o usu ario respondeu: 1 ou 2. N os transformamos o 2 em zero, os dois valores l ogicos para FALSO e VERDADEIRO. Existem dois valores tamb em usados true e false, entretanto continuamos a usar, se o que estamos fazendo aqui; quisermos, os valores 0, 1. E 9. linha 11 garrafa1.fechador() e um m etodo l ogico, serve para tomar decis oes. Se a garrafa estiver aberta ele emitira corrente para um led vermelho. Como a nossa garrafa ainda est a em estado primitivo, falaremos em voz alta: a garrafa est a aberta (linha 12). Se a resposta for 1, falaremos que a garrafa est a fechada (linha 13); 10. linha 14 o retorno padr ao; 11. linha 15 chave fechando a fun ca o principal. Com este exemplo voc e viu a l ogica de orienta ca o a objetos. H a muito mais o que dizer a respeito, o que faremos na parte nal deste cap tulo, mas certamente n ao poderiamos dizer tudo. Os exerc cios e os programas tutoriais representam
23 io

= input/output - entrada/sa da do g + +

232

uma fonte de informa ca o que a experi encia com os cap tulos anteriores j a lhe vem mostrando. Nos pr oximo exerc cios voc e ser a conduzido a usar mais alguns m etodos da classe Garrafa na constru ca o de outros pequenos programas. Class Garrafa { public: int fechador(int testa tampa) { return testa tampa; { oat mede conteudo(oat conteudo) { return conteudo; { oat mede temperatura(oat sensor1 oat sensor2) { oat media; oat peso1=5, peso2=10; media= (peso1*sensor1 + peso2*sensor2)/(peso1+peso2); return media; { int mensagem ao publico() { cout << Nova garrafa termica << endl; return(0); { int atualiza estoque(int valor) { estoque = valor; return(0); { private: int transportador(int testa transporte) { return testa transporte; { int mensagem aa administracao() { cout << Numero de garrafas no estoque: << estoque << endl; return(0); { int estoque; } } 233

Exerc cios 69 (Tutorial) Tutorial sobre classes 1. Rode e leia classe01.cc. Neste programa a classe Contador foi denida, um objeto que a exemplica (inst ancia) e denido, contador. (a) inicializador A classe Contador denida em classe01.cc tem um m etodo com o mesmo nome da classe. Leia o coment ario (10) dentro do programa, este m etodo e o inicializador de um objeto desta classe. Em ingl es, constructor (b) destrutor A classe Contador denida em classe01.cc tem um m etodo com o mesmo nome da classe, prexado pelo til, quando denimos um construtor devemos construir um destrutor. Leia o coment ario (20) dentro do programa, este m etodo limpa as vari aveis (a mem oria) quando um objeto desta classe deixar de ser usado. Em ingl es, destructor 2. Os programas que usam a classe denida em classe01.cc n ao tem um m etodo que incremente a vari avel que conta. Melhore a classe Contador incluindo um m etodo Incrementa Solu c ao, com um defeito: classe02.cc 3. O programador cometeu um erro de apresenta c ao dos dados, esqueceu um espa co ou uma mudan ca de linha, resultado, o programa imprime os dados colados um no outro. Analise onde est a o erro e corrija o programa. c ao: 4. heran ca Denimos uma classe derivada com a declara ClasseNova : public Classe Antiga Construa uma classe NovoContador que herde as propriedades de Contador, o antigo, denido em classe01.cc e nela dena um m etodo Incremento(). Para isto torne public todo o conte udo da classe. 5. heran ca Classe derivada reconhecendo membros privados (protected) Altere a classe Contador, denida em classe01.cc, substituindo private por protected e crie uma classe derivada acrescentando-lhe o m etodo Incrementa() com a declara c ao class NovoContador : public Contador Solu c ao: classe04.cc 6. Todos os prograqmas citados acima tem uma fun c ao rotulo() sem efeito. Descubra porque e corrija os programas. ario (200) Solu c ao: classe05.cc coment 7. Se o autor o aborrecer com as mensagens nais dos programas altere a fun c ao final() para que ela que mais silenciosa, de acordo com a vontade do usu ario. 234

8. Construa uma classe Geometria01 usando struct24 para denir pontos, e fa ca um programa que atribua valores a pontos.

7.4

Mais sobre classes


Vamos discutir aqui com um pouco mais de detalhes a tecnologia que a orienta c ao a objeto nos oferece para trabalharmos de forma mais elegante e avan cada na produ ca o de programas.

J a dissemos antes, uma classe e uma struct com capacidade de ser reproduzida, contendo m etodos que permitem acessar (ler ou modicar) os membros que ela contem, os dados. Da mesma forma como n ao rodamos structs, tamb em n ao podemos rodar as classes. Numa p essima compara ca o, as classes cont em os atores de um teatro autorit ario que apenas atuam quando o diretor os chama para entrar no cen ario. O diretor e a fun ca o main() que eventualmente delega os seus poderes autorit arios para gerentes locais do procesamento. Foi preciso chegar a orienta c ao a objeto para que surgissem os bot oes25 nos programas de computador... elas s ao a forma como o usu ario estimula a main() para que ela coloque os atores em cena.

7.5

Classes Vocabul ario

acesso, abstra c~ ao, derivada, encapsulamento, filha, fun c~ ao, heran ca, inst^ ancia, membro, m etodo, objeto, overload, polimorfismo abstra c ao A palavra evoluiu muito com o tempo. H a muito tempo atr as signicava descrever o inexistente, o impalp avel. As entidades abstratas eram aquelas que existiam apenas na mente. Claro que esta conceitua ca o ainda persiste mas existe uma nova forma de ver a abstra c ao como modelos. Em computa ca o a abstra c ao evoluiu com a pr opria codica ca o. Primeiro se codicavam dados quantitativamente apenas, como numa tabela de dupla entrada. Num momento posterior foram criadas tabelas de nomes permitindo que os programadores usassem palavras para etiquetar locais de mem oria e o pr oprio c odigo dos programas. Depois as fun co es passaram a representar as rotinas modularizando os programas e permitindo que eles ganhassem uma estrutura l ogica mais vis vel. Hoje fazemos modelos de programas que s ao as classes. acesso

C++ oferece v arios n vel de acesso aos membros e m etodos de uma classe, eles s ao: public, private, protected
precisa ser com struct, esta e uma sugest ao. usar bot oes num programa n ao signica que se est a programando orientado ` a objeto.

24 N ao 25 Mas

235

Cada uma destas palavras chave, iniciam um setor de uma classe estabelecendo o modo de acesso (permiss ao) das partes da classe que ela protege. e a parte da classe que est a dispon vel para todos os pro public: gramas; private: membros e m etodos declarados sob este etiqueta s ao de uso interno da classe; ao dispon veis para a pr opria classe e suas sub-classes, protected est aquelas que sejm denidas como lhas. Em C++ tamb em tem o conceito friends que s ao classes de mesmo n vel hier arquico dividindo uma com a outra os m etodos e membros da area private derivada, classe. Como as classes s ao simula co es de situa co es da vida real, podemos acrescentar propriedades novas a uma classe. Em vez de redenir uma classe, podemos criar uma classe derivada, chamamos tamb em classe lha, que j a tem todas as propriedade da classe m ae e lhe acrescentamos as propriedades que nos interessam no momento. Desta forma mantemos a classe inicial como um representamente mais geral da id eia e criamos inst ancias mais espec cas. Posso representar com um diagrama o conte udo desta id eia, na gura (7.6), p agina 237, O computador que voc e (provavelmente) est a cheio de janelas gr acas. Todas elas quando criadas, ao voc e apertar um bot ao em um cone, s ao lhas de uma mesma classe que se chama janela gr aca. Tudo que esta classe produz e um ret angulo insipido na tela do micro. Quando o programador quer uma janela com um certo objetivo, por exemplo, executar um programa dentro dela, ele acrescenta propriedades na forma de bot oes e coloca t tulos; executores; em cada um dos bot oes. Se voc e clicar num t tulo pode sair apenas uma frase lhe dizendo quem e o programa. Se voc e clicar num executor poder a um m odulo do programa ser executado. No exemplo gr aco acima, numa janela para editor de textos aparece um bot ao com a etiqueta arquivo que vai lhe pedir o nome do arquivo e abr -lo, outro cont em a etiqueta busca que corresponde a um m odulo do programa editor de textos que sabe procurar por palavras dentro do texto. S ao inst ancias da classe janela que n ao sabia fazer nada a n ao ser abrir um ret angulo na tela do micro, as classes lhas foram constru das com propriedades e a classe m ae continuar a abstrata apenas sabendo criar 236

janela grfica

janela grfica para executar programas


Figura 7.6:

janela grfica para editor de textos


Classe lha e classe m ae

ret angulos e pronta para produzir novas lhas que saibam executar tarefas espec cas. encapsulamento, quer dizer, colocar dentro de uma capsula. Quando programamos orientado ` a objeto criamos modelos gen ericos, as classes das quais criamos, em cada programa um exemplo, inst ancia, que e o que se usa efetivamente. Este exemplo e tamb em chamado um objeto daquela classe. S ao este objetos que s ao usados nos programas e substituem as antigas vari aveis, eles s ao capsulas, quer dizer, um env olucro fechado que tem vida pr opria e que reage dando respostas cada vez que e excitado por uma mensagem. As antigas vari aveis s ao os estados destas capsulas que chamamos de objetos, tornando o processamento muito mais seguro e efetivo. 237

Mais seguro porque os dados agora est ao localizados e associados a um certo objeto ao qual pertencem o que evita um dos graves problemas antigos em processamento de dados que eram vari aveis zanzando nos programas sem que a programadora tivesse seguran ca do seu valor. Como os dados se encontram localizados, e mais f acil ter controle sobre seus valores, e at e mesmo, se alguma coisa ocorrer errado, e relativamente mais f acil descobrir onde se encontra o erro. mais efetivo porque tudo se passa como se enviassemos mensagens para E um objeto que se deseja excitar, podemos usar esta linguagem. Eu j a disse v arias vezes que o objetivo deste encapsulamento n ao e o de esconder nada de ningu em, embora algumas palavras usadas possam sugerir esta id eia, como a palavra private que caracteriza alguns estados de um objeto, em aparente oposi ca o ` a public que faz refer encia a outros que podem ser manipulados por mensagens externas. apenas um n E vel maior de organiza ca o, algo semelhante com o que acontece com o organismo humano, por exemplo, em que h a org aos, vari aveis, que n ao est ao dispon veis para manipula ca o externa, como o f gado, cora ca o e tantos outros. Eu posso usar a minha boca e o meu nariz, mas n ao tenho acesso direto ao meu f gado, que e um org ao privado que somente pode ser acessado pelo processamento interno do meu corpo. Eu posso acessar o meu f gado diretamente, mas tenho que assumir as consequ encias deste desrespeito ` as regras de privacidade do funcionamento do meu corpo. Da mesma forma, quando a programadora seleciona alguns estados como private de uma capsula, ela est a dizendo que n ao h a raz oes para que se fa ca acesso direto a estes estados que ser ao usados no funcionamento interno da capsula, o objeto. Mas o programa deve estar sempre aberto e voc e mexer no que quiser, desde que saiba o que est a fazendo. lha, classe lha. Leia derivada fun c ao e m etodo, qual e a diferen ca. T ecnicamente apenas que m etodos s ao fun c oes denidas dentro de classes. Sem anticamente a diferen ca e que os m etodos est ao voltados para alterar os membros de uma classe, com isto se aumenta a seguran ca nos programas porque em princ pio h a menos vari aveis livres dentro deles. A quase totalidade das vari aveis se encontra dentro dos m etodos ou se encontra na area privada das classes, protegidas contra uso indevido. e a capacidade de uma classe denir uma nova classe que tenha heran ca todas as suas propriedades que n ao lhe sejam exclusivas, aqui entram em cena os c odigos de acesso public, private, protected. inst ancia e uma realiza ca o de uma classe, um exemplo da classe, um objeto. Fazemos isto de forma semelhante ` a deni ca o de tipos como foi

238

vista no cap tulo 7, e uma forma mais avan cada de denir vari aveis de um determinado tipo (classe). Em segundo03.cc voc e tem um exemplo de inst ancia da classe Ambiente, o objeto Tela. e uma vari avel dentro de uma classe, como cam encapsuladas membro dentro de classes, esta nova esp ecie de vari aveis, elas cam protegidas e escondidas dos usu arios e de outros programadores. Com isto aumenta signicantemente a seguran ca dos programas. m etodo e a funcionalidade que as fun c oes ganharam na programa ca o orientada a objeto. Elas existem dentro de classes com a co es espec cas da classe, para modicar os membros da classe ou para comunica co es espec cas (t picas de uma determinada classe) com o usu arios. S ao os m etodos de uma determinada classe. e um exemplo (inst ancia) de uma classe. As classes s aos os mod objeto elos de uma situa ca o para a qual desejamos fazer um programa, e quando fazemos um programa denimos um exemplo da classe da masma forma como denimos vari aveis de um determinado tipo, apenas de forma muito mais poderosa porque estas vari aveis assim denidas carregam consigo membros e m etodos overload Tem o que ver com polimorfismo, e a capacidade que t em os m etodos poder funcionar de forma distinta, podem ter um maior n umero de par ametros, e o compilador reconhece que tipo de m etodo est a sendo usado. A palavra overload signica que voc e pode sobre-carregar um m etodo for cando-o a ter outra atividade distinta da originalmente planejada. Na verdade e um outro m etodo apenas tem caracter stica semelhantes ao primitivo com mais potencialidade. e uma das caracter sticas polimorsmo Tem o que ver com overload, mais importantes da orienta ca o a objeto, os m etodos podem funcionar de forma distinta, podem ter um maior n umero de par ametros, e o compilador reconhece que tipo de m etodo est a sendo usado. Use com cuidado.

239

Parte II

Criando projetos

240

A segunda parte do livro voc e tem quatro cap tulos, cada um deles dedicado a um tipo de projeto, exceto o u ltimo que cont em apenas refer encias. S ao quatro cap tulos relativamente independentes que voc e poder a selecionar para ler em qualquer ordem. . Relativamente porque todos usam gnuplot para fazer gr acos e vou tratar mais de perto deste pacote no cap tulo 9. Os exerc cios tem por objetivo leva-l@ a compreender os projetos e induzi-l@ a alter a-los, n ao se esque ca, os programas s ao seus e sempre h a uma c opia de reserva no disco, use-os sem receio, mas aprenda tamb em a fazer usas pr oprias c opias de reserva para n ao estar sempre come cando do zero. O signicado desta observa ca o pode economizar-lhe algumas horas perdidas, ao modicar um programa ele pode deixar de funcionar, o que poder a obrig a-l@ a recome car tudo de novo a partir do programa inicial, depois de ter perdido algum tempo (horas ?) fazendo modica co es. Para evitar este desperd cio de tempo siga as seguintes regras: Ao alterar um programa, troque o seu nome, por exemplo, teste01.cc Fa ca pequenas modica co es e teste; Se tiver funcionando como espera, grave o programa como teste02.cc e siga modicando este, teste02.cc. Fa ca pequenas modica co es e teste; Se tiver funcionando como espera, grave o programa como teste03.cc Voc e deve ter descoberto qual a raz ao de numera ca o algumas vezes absurda que voc e pode encontrar nos programas no CD. O melhor programa, a o programa vers ao nal, n ao tem nenhum n umero. E teste.cc Agora uma breve descri ca o dos cap tulos nais. Mas antes uma recomenda ca o. O material neste cap tulos exige alguma Matem atica que eu diria do Ensino M edio com exce ca o no cap tulo 10 em que h a um pouco de Algebra Linear e faz uma constru ca o com polin omios. As aplica co es em Matem atica s ao a forma mais f acil de ensinar programa ca o. Qualquer outro tipo de aplicativo produz programas muito grandes, os aplicativos para Matem atica cam pequenos e posso atingir o objetivo que e ensinar programa ca o. Vou fazer uma pequena introdu ca o, ao descrever cada cap tulo, com o objetivo de reduzir a intimida ca o com a Matem atica necess aria. Entretanto, este livro est a voltado para estudantes universit arios que com certeza dominam a Matem atica de que necessito aqui. tulo, o cap tulo 8, vou construir algumas calculado1. Calculadora Neste cap ras que estar ao baseadas em classes que norteam o projeto da calculadora, em cada caso. Voc e estar a assim vendo que primeiro fazemos o projeto, que tipo de calculadora temos o interesse de construir, depois colocamos a calculadora para funcionar denindo a fun ca o main() num arquivo pr oprio. Este e o m etodo que usarei nos dois cap tulos seguintes. 241

Este cap tulo usa n umeros complexos, para se convencer de que vale a pena entender o que eu fa co aqui, rode o programa calculadora.cc e ver a que ele produz imagens de n umeros complexos interpretados como vetores do plano. Somas dois n umeros complexo signica somar dois vetores do plano. E a multiplica ca o, tamb em... tulo, 9, vou trabalhar com fun co es, para Matem atica e 2. Gr acos Neste cap mostrar-lhe como podemos fazer um pouco de C alculo com aux lio de um pacote externo, o gnuplot, especializado em apresentar gr acos. Este cap tulo mostra como fazer gr acos de fun co es. Necessita apenas do seu conhecimento de Matem atica do Ensino M edio. tulo 10, vou resolver sistemas de equa co es lineares e fazer 3. Sistemas No cap um pouco de Algebra Linear. Este cap tulo pode exigir conhecimentos de Matem atica um pouco al em do Ensino M edio, mas voc e pode se abstrair disto e ver o trabalho aqui como de resolu ca o de sistemas de equa co es para construir polin omios. 4. Refer encias O cap tulo 11 e uma listagem de refer encias onde voc e poder a ir procurar mais informa ca o. Voc e j a deve ter visitado v arias este cap tulo por sugest ao de cap tulos anteriores talvez seja um cap tulo que voc e mais vai usar, neste livro, no futuro. Espero que ele lhe seja u til.

242

Cap tulo 8

Aritm etica com C ++

Vou usar os n umeros complexos como motiva ca o para programar. A raz ao da escolha: e um t opico interessante do ponto de vista t ecnico que permite v arios desenvolvimentos gr acos e geom etricos e nos permite atingir um bom grau de abstra ca o. Ponto negativo da escolha: e geralmente considerado um assunto dif cil, mas e puro preconceito. Se voc e conseguir superar este preconceito pode adquirir uma boa experi encia com um material relativamente simples. Os n umeros complexos s ao uma inven ca o do matem atico italiano Gerolamo Cardano, que os chamou de cticios quando ele tentava resolver as equa co es do terceiro grau, [17, n umeros complexos]. Eles somente vieram se rmar na cultura t ecnica no s eculo 16 mas que, ainda hoje, encontra pouco espa co no curr culo escolar. Os n umeros complexos v em adquirindo grande import ancia nas areas te oricas de computa ca o depois de serem muito importantes em eletricidade. O plano do trabalho: Que s ao os n umeros complexos. Os primeiros programas com a algebra dos n umeros complexos Usar arquivos e chamar um programa externo: gnuplot A calculadora gr aca para n umeros complexos. An alise da classe Complexos denida em Complexos.h

8.1

Que s ao os n umeros complexos

Uma excelente introdu ca o aos n umeros complexos pode ser encontrada na Wikipedia, [17, n umeros complexos], e seria in util repet -la aqui. Uma forma 243

A f ormula de Baskhara conduz ao par (a, b) = a + bi = z para um n umero complexo, por exemplo, resolvendo a equa ca o x2 6x 13 = 0 ; = 36 52 = 16 = (1)(16) = 1 16 = 4 1 = 4i i x1 = 6+4 2 = 3 + 2i ; x1 = (a + bi) = 3 + 2i ; a = 3; b = 2 4i = 3 2i ; x2 = 6 2

da faz e-los surgir pedagogicamente e a solu ca o de uma equa ca o do segundo grau com discriminante negativo b b b2 4ac = (8.1) < 0 ;x = 2a 2a No s eculo 16 se inventou o n umero i = 1 tornando sempre verdadeira a regra ab = a b ; 3 = 1 3 = i 3 (8.2)

(8.3) (8.4) (8.5) (8.6) (8.7) (8.8) (8.9)

x2 = (c + di) = 3 2i ; c = 3; d = 2

A grande descoberta foi que estas express oes funcionam como polin omios e podemos multiplic a-las ou som a-las com as regras da Algebra em que v ao aparecer as pot encias de i. Estas pot encias se repetem, a gura (8.1) p agina 244, mostra isto para algumas pot encias de i, desde i0 at e i15 .

Figura 8.1:

n = 0; in+2 = i2 = 1; in+3 = i3 = i

Consequentemente, qualquer opera ca o aritm etica vai produzir apenas n umeros da forma a + bi pela repeti ca o dos valores das pot encias de i. 1, i, 1, i, 1, i, 1, i,

O quadrado de 3 + 2i pode ser visto na tabela seguinte 244

3 3 9 9 94 5

+ +

2i 2i 6i 6i 12i 12i 12i

4i2 4

todos os termos foram multiplicados i2 = 1; 4i2 = 4 reagrupamos termos semelhantes o resultado nal.

e o produto de 3 + 2i por 5 + 4i pode ser visto na pr oxima tabela 3 5 15 9 98 1 + + 2i 4i 10i 12i 22i 22i 22i

8i2 8

todos os termos foram multiplicados i2 = 1; 8i2 = 8 reagrupamos termos semelhantes o resultado nal.

Este tipo de n umero tem as mesmas propriedades dos n umeros reais: podemos multiplic a-los, som a-los, divid -los (desde que o divisor n ao seja o zero) e portanto resolver qualquer equa ca o com eles. Em particular, com os n umeros complexos, toda equa ca o do segundo grau tem duas solu co es e qualquer equa ca o de grau n tem n solu co es (algumas delas podem ser repetidas, ou m ultiplas). Nem sempre sabemos resolver, exatamente, as equa co es, mas elas todas tem solu ca o dentro dos n umeros complexos. O programa calculadora.cc pode lhe dar alguma experi encia com os n umeros complexos antes que voc e comece a ler a constru ca o da classe Complexos na qual ela est a baseada. Compile o programa com g++ -Wall -oprog -lm calculadora.cc observando que ele precisa das bibliotecas Ambiente.h, Complexos.h com os caminhos para os diret orios onde elas se encontram inclu dos no cabe calho. Exerc cios 70 (Tutorial) Experimentando a calculadora 1. Compile e rode o programa calculadora.cc. N ao leia agora o programa, apenas veja como ele funciona e ganhe alguma experi encia com o n umeros complexos. 2. Al em de somar e multiplicar n umeros complexos, a calculadora faz opera c oes que n ao s ao comuns com os n umeros reais: conjugado e m odulo. Experimente estas opera c oes.

245

3. A calculadora explora, geom etricamente, uma propriedade do inverso de um n umero complexo. Para os reais tudo que podemos dizer e 1 se |x| < 1 ent ao | | > 1 x Com os complexos acontece mais coisa, tudo acontece de dentro para fora do c rculo trigon ometrico. Calcule os inversos multiplicativos de alguns n umeros usando a calculadora:

Se z estiver no interior do c rculo unit ario (c rculo trigonom etrico) ent ao estar a fora do c rculo unit ario, e vice versa. O que podemos dizer sobre os n umeros reais a respeito do m odulo e do inverso multiplicativo, adquire um grau muito mais imponente com os complexos: se um n umero complexo estiver dentro c rculo unit ario, o seu inverso estar a fora do c rculo unit ario, e reciprocamente. A calculadora desenha tamb em o c rculo trigonom etrico, experimente, mostrando assim a rela ca o de um n umero com o seu inverso multiplicativo. Um n umero complexo e um par de n umeros reais o que torna o conjunto dos n umeros complexos semelhante ao plano, a gura (8.2) p agina 247, mostra isto. com estes n E umeros que desenvolvemos a calculadora. Vamos passar ao estudo da classe Complexos e mostrar como produzimos a calculadora gr aca com a classe dos n umeros complexos.

1 z

8.2

C alculadora aritm etica gr aca


O plano do trabalho: Conduz -l@ a compreender a classe Complexos, aprender a us a-la fazendo alguns programas simples e nalmente compreender o programa calculadora.cc.

N ao se esque ca do que leu no cap tulo 8, para fazer programas primeiro construimos um modelo, o modelo que construimos para trabalhar com n umeros complexos foi a classe Complexos. Exerc cios 71 (Tutorial) Tutorial sobre a classe Complexos 1. Leia rapidamente a biblioteca Complexos.h, vamos voltar ` a sua an alise, depois. Ela dene um tipo de dados, complexo que e um vetor de dimens ao dois de n umeros reais: quer dizer uma tabela com dois campos do tipo float. uma classe, Complexos.

246

iy z=(x,y)

z = x + iy

plano

complexo

Figura 8.2:

O plano complexo

2. Compile o programa complexos00.cc e leia os erros que o compilador apresenta: n ao sabe o que e Ambiente, Complexos, diz que estes tipos de da um problema que talvez voc dos n ao foram declarados. E e j a conhe ca, deve corrigir o caminho na inclus ao das bibliotecas Ambiente.h, Complexos.h no cabe calho do programa. 3. Leia e rode o programa complexos00.cc. Leia tamb em os coment arios. 4. Altere complexos00.cc para que lhe pe ca v arios n umeros para serem somados. Use while(resposta) e Tela.sim nao() para decidir quando terminar. Solu c ao: complexos001.cc

247

5. O programa complexos001.cc est a com p essima apresenta c ao, por exemplo, sai grosseiramente sem uma despedida, corrija isto. 6. Altere (a vers ao corrigida) de complexos001.cc para que ele fa ca adi c oes, multiplica c oes e divis oes de n umeros complexos. Observe que na algebra de complexos, Complexos.h, n ao tem a opera ca o de divis ao1 e voc e vai ter que usar o inverso multiplicativo (ou alterar a classe). 7. Estude a solu c ao complexos002.cc Foi criada uma fun c ao2 menu.h. Analise qual e objetivo desta fun c ao.

Foi criada uma fun c ao executa(char), descubra seu objetivo, decida se o nome est a adequado. Foram criadas tr es fun c oes, soma(), multiplica(), divide(). Estude como e que o programa para e como e executada a op c ao que o usu ario seleciona.

8. Verique se e verdade que no programa complexos002.cc a op c ao sair e uma op c ao padr ao. Se for, altere a mensagem adequada, no menu, indicando isto. 9. Altere complexos002.cc para incluir o c alculo do m odulo de um n umero complexo como op c ao do programa. Solu c ao: complexos002.cc 10. O programa complexos002.cc est a planejado para usar um aviso (procure com a busca do editor de textos), mas quando o usu ario tentar dividir por zero, apenas o avisa que e imposs vel e n ao lhe d a a oportunidade de continuar dividindo, altere isto! Observa c ao 22 Fun c ao e m etodo Voc e encontra no ndice remissivo uma chamada sobre fun co es e sua compara c ao com m etodos, mas resumidamente, os m etodos s ao as fun co es espec cas de uma determinada classe. J a dissemos muitas vezes mas nunca e pouco repetir, Complexos.h n ao e um programa. Podemos compilar, com op ca o -c , para vericar se a sintaxe est a correta. Complexos.h cont em o m odelo dos n umeros complexos. Vou explicar a arquitetura da classe Complexos. Seria interessante que voc e acompanhasse a leitura com o arquivo Complexos.h aberto em um editor de textos. Em vez de um editor de textos, e melhor usar less Complexos.h ou more Complexos.h. O programa less e mais perfeito, permite voc e rolar o texto com a seta para cima ou para baixo.
1 Porque 2 e

ela e in util, n ao e um erro do autor, e uma escolha! uma fun c ao, n ao e um m etodo! qual e a diferen ca?

248

1. Logo no come co foi denido, fora da classe, o tipo de dados complexo. Esta foi uma id eia que tive que faz com que nossa constru ca o que diferente das diversas que voc e pode encontrar na Internet, experimente ver3 outras. Em geral todas as constru co es que encontramos colocaram o tipo de dados complexo dentro da classe, o que torna deselegantes as opera co es, posteriormente. 2. Na classe Complexos denimos as propriedades do tipo de dados complexo: mais(), vezes(), modulo(), ... e comum voc e encontrar nas constru co es o operador + sendo sobrecarregado4 isto permite escrever z = 3 + 2i ; w = 4 + 5i ; z + w em meus programas tenho que escrever Alg.mais(z,w) em que Alg e o prexo que indica o objeto criado a partir da classe Complexos. Em compensa ca o, como denimos o tipo de dados complexo fora da classe, n ao precisamos usar Alg.complexo quando quisermos fazer uso deste tipo de dados. Fa ca uma nova leitura da classe Complexos que os pr oximos exerc cios v ao conduz -l@ a produ ca o de alguns programas. Voc e pode manter a classe sob os olhos se executar, num terminal less Complexos.h isto lhe vai permitir ler o conte udo do arquivo sem que ele que aberto. Na lista de exerc cios abaixo vou lhe pedir que fa ca muito do que j a est a feito nos programas complexos00*.cc que discutidos na lista anterior, o objetivo e que voc e fa ca voc e mesmo os programas e domine o uso da prexa ca o adequada. As quest oes n ao tem respostas porque voc e as pode encontrar todas nos programas j a discutidos. Exerc cios 72 (Tutorial) Construindo programas para algebra dos complexos ca um programa que some os n umeros complexos (4 3i) e (3i 1. adi c ao Fa 4). 2. sa da de dados Experimente construir voc e mesmo uma fun c ao que escreva n umeros complexos de forma bonita. Solu c ao (com um defeito): escreva() denida na classe Complexos.h, melhore-a quando descobrir o defeito.
3 Antes de inventarmos uma, primeiro fomos buscar o que j a houvesse sido feito, n ao encontrando nada que nos agradasse, construimos a nossa. 4 overloaded

249

3. multiplica c ao Fa ca um programa que multiplique os n umeros complexos (4 3i) e (4 + 3i) Use escreva() para obter uma sa da de dados decente. 4. Equa c ao do segundo grau Fa ca um programa que resolva qualquer equa c ao do segundo grau salientando quando a solu c ao for real ou complexa.

8.3

Usando um programa externo


Neste se ca o vamos criar uma representa ca o gr aca para os n umeros complexos usando um programa externo, gnuplot, que e um pacote distribuido livremente, na bibliograa [5] voc e pode ver como obter este programa. Objetivo: praticar o acesso a disco e uso de programas externos.

Como n ao podemos fazer tudo, e bom aprender a usar aquilo que outros programadores j a zeram, aqui vamos usar um programa externo, gnuplot, e o m etodo serve para aplicar em outros programas externos que voc e eventualmente precise. Para usar gnuplot vou criar um arquivo de comandos deste pacote e o que eu depois chamar o pacote passando-lhe o arquivo como par ametro. E faria se chamasse gnuplot num terminal. No CD que acompanha este livro h a o arquivo chamado transfere, e o nome que sempre uso para o arquivo de comandos do gnuplot. A pr oxima lista de exerc cios e um tutorial sobre como usar (inicialmente) gnuplot. Exerc cios 73 (Tutorial) Como usar gnuplot 1. Verique se gnuplot est a instalado no computador que voc e est a usando, se n ao estiver veja na bibliograa, [5] como baixar e instalar. gnuplot e um programa livre. 2. Leia o arquivo transfere pro, depois execute (se gnuplot) estiver instalado: gnuplot transfere pro a coment arios, marcados pelo jogo da velha, No arquivo transfere pro h que explicam o signicado dos comandos. Volte a executar gnuplot transfere pro e depois releia o arquivo de comandos. 3. Estudando alguns comandos do gnuplot (a) O comando set arrow desenha um segmento de reta entre dois pontos dados como par ametros. Altere os par ametros para obter os segmentos de reta: que parte de (from) (3, 4) e termina em (rto) (3, 5); outro partindo de (from) (3, 5) para (rto) (4, 8); 250

Grave o arquivo transfere pro e execute num terminal gnuplot transfere pro Como resultado deve aparecer um quadril atero. Altere os comandos para obter (1) um ret angulo, (2) um pent agono (n ao precisa ser regular que e muito dif cil), (3) um hex agogo. (b) Apague os comandos que produzem o quadril atero (copie transfere pro para outro arquivo cp transfere pro outro arquivo se desejar manter estas informa c oes). Inclua antes do comando plot os comandos: a = -3 delta = 2 f(x) = (x + 3)*(x - 4) df(x) = 2*x - 1 # a derivada de f g(x) = f(a) + df(a)*(x-a) # equa c ao da reta tangente a graf(f ) set xrange [-5:0] set arrow from a, f(a) rto a+delta, g(a+delta) head plot f(x),0 pause -2 # for ca o gnuplot a car parado

mais um partindo de (from) (4, 8) para (rto) (5, 10); e nalmente outro partindo de (from) (5, 10) para (rto) (3, 4)

execute: gnuplot transfere pro O resultado e o gr aco da fun c ao f no intervalo [5, 0] com o vetor tangente no ponto (3, f (3)). Estes comandos se encontram no arquivo transfere tangente. 4. Altere o arquivo transfere tangente a = -3

delta = -2

set xrange [-5:6] e execute num terminal gnuplot transfere tangente analise o resultado. Fa ca algumas outras modica c oes para entender como como colocar vetores tangentes no gr aco alterando a dire c ao. Eu lhe mostrei como escrever um arquivo de comandos para gnuplot, no pr oximo tutorial vou mostrar-lhe como automatizar, com um programa o processo de escrita do arquivo de comandos do gnuplot e a execu ca o do gnuplot, para que ele leia os comandos que est ao no arquivo. 251

Voc e vai ver que o programa far a o que zemos acima. Vou precisar das informa co es que se encontram no cap tulo 7, na parte nal, sobre vari aveis do tipo arquivo, procure arquivo no ndice remissivo e mantenha um olho no texto que explica como se comunicar com arquivos em disco. Os programas telefon*.cc tamb em fazem isto, voc e pode consult a-los para ver como se faz. Exerc cios 74 (Tutorial) Escrevendo e lendo arquivos 1. Usando a fun c ao system() Rode o programa complexos003.cc a fun e depois leia o programa. E c ao system() que chama programas externos. 2. Altere o arquivo transfere pro colocando nele outros comandos e volte a rodar complexos003.cc - observe que voc e n ao precisa compilar novamente o programa, rode o execut avel que ele criou. 3. A c oes destrutivas. Os comandos que vamos estudar agora v ao destruir o arquivo transfere pro5 . Altere complexos003.cc: Crie um objeto do tipo arquivo, nome arq, apontando para transfere pro com o m etodo out, vai limpar o arquivo e abr -lo para escrita. Consulte telefone03.cc6, mas use o m etodo out em vez de app. Observa c ao 23 (m etodos de acesso a arquivo) app, out

out, com este m etodo o arquivo e apagado, se existir, ou criado, se n ao exitir, app, com este m etodo o arquivo e aberto e ponteiro de posi cao de arquivo vai para a u ltima posi c ao de dados do arquivo e a escrito come ca deste ponto em diante. app e a abrevia c ao de append - vai acrescentar dados ao arquivo. Com o m etodo nome arq << coloque em transfere pro os seguintes comandos de gnuplot set arrow from -3,4 rto -3,-4 head set arrow from -3,-4 rto 3,-4 head set arrow from 3,-4 rto 3,4 head
5 Nenhum problema, h a outra c opia no CD, mas voc e perder coisas interessantes que voc e tenha criado, fa ca uma c opia noutro arquivo. 6 Com grep ofstream *.cc voc e vai encontrar todos os programas que acessam arquivo.

252

set arrow from 3,4 rto -3,4 head set xrange [-4:4] set yrange [-6:6] plot , 0 pause -2

n ao esquecendo das mudan cas de linha << endl ao nal de cada linha. N ao esquecer de incluir a biblioteca fstream caso contr ario C++ n ao ir a entender a classe ofstream (experimente). Altere complexos004.cc usando \n para mudar de linha em vez de endl. Solu c ao: complexos004.cc Altere complexos004.cc para que apare cam as diagonais do ret angulo. Altere complexos004.cc denindo no arquivo de comandos do gnuplot as equa c oes da par abolas f (x) = (x +3) (x 4), g (x) = (x +3) (4 x) e o comando plot f(x), g(x),0. Em todas as linhas deve ter mudan ca de linha. Altere complexos004.cc criando a fun c ao prepara chama gnuplot() que se ocupe dos comandos e de chamar gnuplot. Solu c ao: complexos005.cc Fa ca um programa que solicite do usu ario as equa c oes de duas fun c oes, e um intervalo e fa ca o gr aco destas equa c oes no intervalo solicitado. Se voc e reutilizar complexos005.cc, n ao se esque ca de alterar a fun c ao rotulo() para que ela diga quais os objetivos do programa. Consulte o programa string02.cc sobre concatena c ao de strings para construir as equa c oes das fun c oes. Solu c ao: complexos006.cc

8.4

Calculadora gr aca para os complexos


Nesta se ca o vou apresentar-lhe um menu de proposito geral que serve de base para o programa calculadora e depois vou passar a discuss ao nal do programa calculadora.cc, a calculadora gr aca para n umeros complexos.

Eu lhe apresentei nos par agrafos precedentes deste cap tulo os meios para preparar um arquivo de comandos a ser passado para um programa externo, gnuplot. Vou usar agora tr es classes Ambiente, Complexos, Menu na constru ca o de um pequeno projeto computacional que e a calculadora gr aca para n umeros complexos.

253

A primeira delas, Ambiente, j a vem sendo usada em quase todos os programas, a classe Complexos e o modelo da algebra dos n umeros complexos, e Menu e um modelo geral para menus. Vou juntar estes modelos para produzir um programa: a calculadora. O ponto de partida e Menu.h, um modelo gen erico para menus. Leia o arquivo Menu.h, possivelmente com less Menu.h que agora eu vou me ocupar dele e us a-lo nos pr oximos programas. Exerc cios 75 (Tutorial) O menu gen erico 1. Leia Menu.h, tem dois m etodos, procure entender o que fazem, os coment ario devem ajudar. 2. Verique que Menu.h tem 11 membros privados e como os m etodos fazem uso deles. Se conven ca que nenhum programa ir a fazer uso dos membros desta classe, somente os m etodos e que modicam os membros. 3. Leia calculadora.cc, Selecao e um objeto da classe Menu, verique isto. Identique o m etodo em calculadora.cc que passa a identica c ao do programa para o objeto Selecao. e o m etodo, do objeto Selecao, para transmitir para o 4. Descubra qual usu ario quais s ao as op c oes do programa. 5. Fa ca um programa usando a classe Menu. Solu c ao: calculadora001.cc 6. Altere calculadora001.cc para que o programa calcule somas de deois n umeros complexos. Fa ca a entrada de dados diretamente em uma fun c ao (n ao e um m etodo) que execute o m etodo mais() denido na classe Complexos - dena um objeto desta classe no programa. Solu c ao: calculadora002.cc 7. Melhore o programa calculadora002.cc apresentando o gr aco dos dois n umeros complexos que est ao sendo somados, voc e pode fazer isto alterando a pr opria fun c ao mais() incluindo nela um acesso ao arquivo de comandos do gnuplot, por exemplo, transfere, e depois usando a fun c ao system() para rodar gnuplot. Se voc e se esquecer de incluir fstream, vai dar erro! Solu c ao: calculadora003.cc 8. Melhore o programa calculadora003.cc criando uma fun c ao, prepara chama gnuplot() com os par ametros necess arios para que ela crie o arquivo de comandos do gnuplot e tamb em ela o chame, porque isto n ao e trabalho da fun c ao mais(). Solu c ao: calculadora004.cc

254

9. Tente fazer a sua calculadora, com a experi encia ganha nos programas complexos00*.cc e na suite de programas calculadora001.cc . . . calculadora004.cc usando a classe Menu. Se inspire no programa calculadora.cc quando precisar. Este exerc cio ser a discutido na pr oxima se c ao. A sucess ao de programas calculadora001.cc . . . calculadora004.cc lhe mostraram todas as etapas necess arias para colocar um projeto para funcionar. O programa calculadora001.cc n ao o menos importante deles todos, porque ele representa o teste inicial de que o menu gen erico est a funcionando, a evolu ca o nal e feita de pequenos passos que v ao completando a id eia geral.

8.4.1

O programa calculadora.cc

O programa calculadora.cc tem os seguintes itens Vari aveis globais

char tit[80], char id[80], char ver[80], char pri[80], char seg[80] char ter[80], char qua[80], char qui[80], char sai[80] char esc[80], char op=0 atrav es das quais transmite para o objeto Selecao os dados sobre o programa.

Tr es objetos Tela, exemplo de Ambiente, Alg, exemplo de Complexos, Selecao, um exemplo da classe Menu. As fun co es 1. fun co es executoras de m etodos mais(), vezes(), conjugado(), inverso mult(), modulo(). Elas s ao necess arias porque os m etodos que elas acionam n ao t em comunica ca o com o usu ario, para solicitar, por exemplo, o n umero complexo (ou os n umeros complexo) sobre os quais desejo executar uma opera ca o aritm etica. Elas s ao meios de comunica ca o entre o programa e um determinado m etodo dos n umeros complexos. Nem sempre que um programa precisar de executar o m etodo mais() de um objeto da classe Complexos ser a preciso chamar uma fun ca o como mais(), mas quando for necess ario uma comunica ca o com o m etodo mais(), ent ao sim, ser a preciso criar uma fun ca o para fazer esta comunica ca o. A diferen ca entre fun c ao e m etodo se evidencia aqui. Em calculadora.cc mais() e uma fun ca o, e Alg.mais() e um m etodo do objeto Alg que e uma realiza ca o (inst ancia) da classe Complexos. 2. fun co es que executam o controle l ogico do programa, estas fun co es e que de fato denem a l ogica do programa. rotulo(), executa(), prepara chama gnuplot().

255

A fun ca o rotulo(), que aparece em quase todos os meus programas, e a que faz a apresenta ca o do projeto. A fun ca o, executa(), como o nome indica, e quem recebe a op ca o captada pelo m etodo Selecao.fala() e a executa. A fun ca o prepara chama gnuplot() tem o seu objetivo indicado no nome, prepara o arquivo de comandos e chama gnuplot para executar os comandos. Ela tem um par ametro logico, circulo que pode ser zero ou um que lhe e passado por quem precisar de usar o c rculo trigonom etrico, quem precisar passa o valor 1 usando esta vari avel, quem n ao precisar, passa o valor 0 e com isto ela decide a forma como vai criar o arquivo transfere. e criar a 3. uma fun ca o de apoio gr aco cria circulo() cuja objetivo tabela, (matriz) do c rculo unit ario que usado pelas fun co es conjugado(), modulo(), inverso mult() porque estas fun co es fazem compara ca o entre os n umeros complexos e o c rculo trigonom etrico. Ela e chamada no in cio de main() e cria o c rculo. 4. A fun ca o principal main() que faz o teatro funcionar. Mas tudo isto somente funciona porque os m etodos da algebra de n umeros complexos j a existem e se encontram na classe Complexos que vou descrever na pr oxima se ca o, e voc e ver a a import ancia que ela tem porque todas as id eias necess arias para trabalhar com n umeros complexos se encontram nela, como um modelo que posso aplicar em qualquer programa que precise do conceito de n umeros complexos, como venho fazendo, desde o come cao do livro com a classe Ambiente. A classe Complexos e o modelo de algebra dos n umeros complexos.

8.5

Um modelo para programar com n umeros complexos


A classe Complexos e um modelo para algebra dos n umeros complexos. Quando eu precisar de trabalhar com a lgebra dos n umeros complexos, crio um objeto pertencente a esta classe, como Alg, em calculadora.cc e todos os m etodos e membros da classe Complexos cam dispon veis para este objeto, exceto aqueles que estiverem denidos como privados, a classe Menu mostra a utilidade deste n vel de acesso restrito.

8.5.1

Tipo global relativamente ` a classe

Aqui e preciso observar que a biblioteca Complexos.h cont em a classe Complexos e um tipo de dado, complexo que n ao pertence ` a classe Complexos. Leia o arquivo Complexos.h para vericar isto. Antes de criar esta classe eu z uma pesquisa na Internet para ver alguma classe de n umeeros complexos criada por outro programador. Encontrei v arias, 256

se voc e zer uma busca com a palavra chave complex numbers ir a encontrar uma dezena de sites onde h a implementa co es dos n umeros complexos. Como n ao gostei da metodologia que encontrei, criei a minha, e isto n ao signica que sou pioneiro! pode haver outro modelo de n umeros complexos semelhante ao que criei, apenas eu n ao o encontrei. Em todos o tipo de dado complexo faz parte da classe, o que me obrigaria a usar Alg.complexo z para denir um n umero complexo. A forma como deni torna mais simples declara ca o de um n umero complexo e como ele usado na classe as deni co es caram mais simples.

8.5.2

Membros e m etodos da classe dos complexos

Tr es membros p ublicos complexo I, float a, b Construtor, destrutor Esta classe tem um construtor autom atico. Quando denimos um m etodo com o mesmo nome da classe, ele se chama um construtor e e executado logo que a classe entra em uso. Serve para inicializar alguns membros, aqui inicializa o n umero i que est a representado pela identicador I. Quando o objeto que pertence a esta classe sai de uso, o destrutor e acionado para limpar a mem oria. Um erro que est a comentado: foram denidas algumas fun co es (n ao s ao m etodos) dentro da classe, elas se encontram isoladas por coment arios para que voc e possa analisar e se convencer que elas n ao s ao m etodos dos n umeros complexos. Elas s ao fun co es complexas, fun co es que executam opera co es sobre a vari avel complexa. N ao s ao m etodos, n ao poderiam estar na classe dos complexos. ao M etodos da algebra dos complexos s mais(), vezes(), inverso multiplicativo(), menos(), conjugado(); m odulo, vezes escalar(),Re(), Im() utilit arios que n ao precisariam estar nesta classe, poderiam estar numa classe derivada, s ao escreve(), para representar de forma bonita, bem arrumada, um n umero complexo, por exemplo, n ao escrever 3 + 0i mas apenas 3. Este m etodo ainda n ao est a funcionando perfeitamente, ainda escreve algumas coisas esquisitas. recebe() que depois vi que era desnecess ario, mas ainda se encontra na classe porque h a um programa que faz uso dele.

257

faz complexo() para construir um n umero complexo dados as coordenadas reais. Voc e viu que h a alguma cr tica quanto arquitetura desta classe, ela precisa ser melhorada mas e pouco prov avel que eu fa ca isto, anal est a funcionando bem e h a programas que se encontram baseados nela.

258

Cap tulo 9

Gr acos de fun c oes


9.1 As classes para gr acos

Neste cap tulo vou construir duas classes com m etodos para fazer gr acos de fun co es univariadas ou bivariadas. Nestes programas vou usar um instrumento externo, [5, um pacote para fazer gr acos], voc e pode ler a mais a respeito dele, no vocabul ario, ao nal deste cap tulo. As classes constru das ser ao uma representa ca o de gnuplot dentro dos programas, elas v ao sabem usar gnuplot. Como este e um dos projetos que este livro descreve, voc e vai acompanhar a evolu ca o do trabalho, o planejamento e o replanejamento ao longo do cap tulo.

gnuplot e a arquitetura de computa ca o que vou usar para fazer gr acos. Como foi deixado em dom nio p ublico desde sua concep ca o inicial, gnuplot foi transportado para praticamente todas as maiores plataformas computacionais, em para particular para Linux para onde rapidamente migrou quando este sistema operacional surgiu. Eu conheci gnuplot em 1997 sem entender bem que tipo de pacote era, parecia uma linguagem rudimentar de programa ca o com a capacidade de fazer gr acos. N ao conhe co em profundidade o projeto para saber em que dire ca o ele ir a evoluir, mas hoje posso caracterizar gnuplot como uma calculadora gr aca que entende a maioria dos comandos b asicos das linguagens de programa ca o, e pode, assim, se comunicar com elas. Como e poss vel denir fun c oes em gnuplot, em particular fun c oes recursivas, ent ao e poss vel escrever programas em gnuplot que assim e uma linguagem dotado de algumas poderosas rotinas gr rudimentar de programa ca o. E acas que permitem apresentar em terminais do X-windows (e em v arios outros dispositivos gr acos) a interpreta ca o (gr aca) do resultado de programas. N ao seria poss vel produzir, neste livro, todas as classes para fazer um uso completo de gnuplot, sem descaracterizar o projeto do livro, mas certamente o leitor interessado conseguir a, a partir dos dois projetos que vou desenvolver aqui, construir outras classes que atendam ` as suas necessidades.

259

Voc e n ao precisa conhecer gnuplot para fazer os programas baseados nas classes aqui produzidas, mas pode, por outro lado, se beneciar dos meus programas para aprender a usar gnuplot uma vez que eles v ao criar arquivos de comandos para gnuplot. Se voc e desejar fazer alguma coisa mais signicativa, usando gnuplot, sem d uvida precisar a se aprofundar no uso do pacote, anal o programa que voc e zer e apenas uma forma automatizada do seu trabalho, n ao ser a o programa que conhecer a gnuplot e sim voc e. Um programa e uma representa ca o virtual da programadora! O plano do trabalho consiste em produzir duas classes. Uma classe que vai produzir matrizes n x 2 contendo em cada linha um ponto (x, f (x)) que gnuplot ir a interpretar como uma malha sobre o gr aco da fun ca o y = f (x). Ele ir a completar esta malha usando uma aproxima ca o polinomial. Outra classe que vai produzir os comandos com que gnuplot ir a completar as informa co es do gr aco. Inicialmente vou produzir uma u nica classe contendo os dois m etodos acima, depois vou especializar cada m etodo em sua pr opria classe. Um esbo co da classe que vai fazer gr acos de superf cies. Uma extens ao poss vel, e relativamente simples deste trabalho, e a constru ca o de uma classe que produza matrizes n x 3 que gnuplot interprete como uma malha sobre o gr aco de uma fun ca o bivariada, a superf cie graf (f ) ; z = f (x, y ) Vou apenas fazer um esbo co deste projeto para mostrar-lhe que e uma e extens ao relativamente simples do projeto univariado que est a bem desenvolvido aqui, embora voc e logo deve descubrir que ainda h a muitas coisas por fazer. A metodologia para desenvolver este projeto consiste de tutoriais em que @ leitor@ vai ser envolvid@ na constru ca o das classes cando assim habilitad@ a prosseguir o trabalho sozinh@.

9.2

Projeto: gr acos de fun c oes univariadas

Neste se ca o vou desenvolver parcialmente um programa que faz diversos gr acos de fun co es como motivacao para usar um objeto que cria gr acos com aux lio de gnuplot. Este programa estar a completo mais ` a frente no cap tulo. A vers ao inicial, incompleta, serve para que voc e acompanhe o planejamento e a produ ca o. A metodologia usada consiste na produ ca o de solu c oes incompletas que uma nova vers ao do programa termina deixando ainda defeitos a serem corrigidos na pr oxima vers ao, desta forma voc e acompanha a evolu ca o do programa em vez de se deparar abruptamente com um programa perfeito (se e que existem programas perfeitos?). O programa nal vai se compor tamb em de dois m odulos como os esbo cos apresentados nesta se ca o. Os tutoriais v ao conduz -l@ a compreender o sistema.

260

Os arquivos em que o programa se distribue s ao GrafunXX.h onde est a denida a classe Graco grafunXX.cc um programa master, um programa que compila o pr oximo programa e o chama. grafun execXX.cc um programa-escravo, que na verdade faz tudo sendo compilado e depois chamado pelo programa-master. Este programa usa a classe Graco. em que XX e 01,02,03,04 sendo 04 a vers ao mais avan cada do programa. funcaoYY.h bibliotecas em que est ao denidas as equa co es de v arias fun co es matem aticas, em que YY e 1,2,3,4,5 mas neste caso a numera ca o n ao representa vers oes e sim as bibliotecas que foram sendo criadas ` a medida que o programa evoluia. e os tutoriais v ao mostrar-lhe como foram arquitetados os componentes do programa. Para entender como foi constru do o projeto e preciso compreender como gnuplot faz gr acos, eu inclu alguns itens no primeiro tutorial com este objetivo. Observa c ao 24 (Software desej avel) Programas que o livro usa Editor joe Seria interessante ter o editor, [8, joe], instalado no sistema. um editor muito poderoso, de dom E nio p ublico com um ponto negativo (para a maioria dos usu arios) e tocado a base de comandos - n ao tem uma interface gr aca, mas, para ser usado interativamente por programas, e excelente, talvez, exatamente pelos defeitos apontados. joe e de dom nio p ublico, provavelmente1 distribuido sob GPL . Se voc e n ao puder ou n ao quiser instalar joe ser a preciso alterar a string joe nos programas para usar aquela que fa ca refer encia ao editor de sua escolha. Voc e ver a isto quando aparecer o erro command not found citando joe. Neste ponto corrija o programa, ou instale joe. a z uma r apida descri c ao do programa Programa gr aco gnuplot Eu j [5, gnuplot] no in cio deste cap tulo. Leia mais a respeito no vocabul ario deste cap tulo. Os meus programas envolvendo gr acos fazem uso deste aplicativo sendo portanto necess ario que ele esteja instalado no sistema. Como joe, gnuplot e distribuido livremente, na bibliograa voc e encontra como obt e-lo. A partir deste ponto tenho que supor que voc e instalou gnuplot, como j a supuz que voc e instalou g++.
1 N ao

consegui vericar qual e a licen ca, mas e de dom nio p ublico

261

Exerc cios 76 (Tutorial) O programa gnuplot Este tutorial e autorit ario, como costumam ser muitos professores... n ao se intimide e desobede ca o tutorial. Ele e apenas uma lista de passos para gui a-l@ na compreens ao do pacote, voc e poder a seguir caminhos alternativos, lhe dar a mais trabalho, mas o resultado ser a maior dom nio do conhecimento. 1. Experimente rodar na linha de comandos gnuplot transfere teste Os erros que podem ocorrer s ao conseq u encia da falta do arquivo transfere teste que providenciei para que se encontrasse no disco, copie este arquivo do CD para o diret orio onde se encontram os seus programas em C++. Da aus encia do gnuplot. Corrija isto e volte a executar o comando. Leia o arquivo transfere teste, ele tem dois comandos do gnuplot. 2. Edite transfere teste2 para incluir as linhas: f(x) = (x+3)*(x-4) g(x) = (x+4)*(x-3) logo no come co do arquivo. Altere a linha do plot para que que assim: plot "dados teste" with lines, f(x), g(x), 0 As aspas fazem parte do comando, se voc e n ao as colocar, gnuplot vai dizer-lhe que n ao encontrou o arquivo. Experimente, os erros sempre s ao positivos. Volte a rodar gnuplot transfere teste O que aconteceu ? Nas duas primeiras linhas voc e deniu uma fun c ao, a sintaxe e muito simples e se assemelha a que usamos com Matem atica. O arquivo dados teste foi gerado por um programa contendo uma matriz n x 2 de n umeros que gnuplot entende como sendo os pares (x, f (x)) de valores de uma fun c ao. O modicador with lines faz com que gnuplot ligue os pontos com uma linha (interpola c ao linear). 3. Altere transfere teste para obter outros gr acos, procure adquirir mais familiaridade com gnuplot, inclusive experimente, no terminal do programa: help
2E poss vel que ele esteja protegido contra escrita, altere isto com o comando chmod u+rw transfere teste.

262

e voc e vai ver o manual on line do programa. O nome do arquivo com comandos para gnuplot pode ser qualquer, a palavra transfere3 e sempre usada nos meus programas para denominar um arquivo de comandos do gnuplot, assim como dados guarda uma matriz com os pontos para o gr aco de uma fun c ao. 4. Compile e rode grafun exec01.cc g++ -Wall -oprog -lm grafun exec01.cc 5. Se voc e tiver rodado o programa apenas com prog recebeu uma mensagem dizendo que o programa precisa de um item e lhe sugere uma forma de rodar o programa. A raz ao disto e que este programa e um m odulo de outro programa, aceite a sugest ao e volte a rodar o programa. Este tutorial tem, entre os seus objetivos, mostrar-lhe a raz ao desta mensagem no program. Rode corretamente o programa e depois edite o arquivo transfere gerado pelo programa. 6. O programa grafun exec01.cc e o m odulo principal, quem faz tudo, entretanto o gerente4 do trabalho e grafun01.cc. Leia este programa agora. N ao deixe de ler os coment arios! 7. Rode o programa grafun01.cc e depois volte a l e-lo. (a) Releia tamb em o programa grafun exec01.cc procurando entender a rela c ao entre os dois programas. (b) Verique, em particular, que o execut avel grafun criado por grafun01.cc e o execut avel do programa grafun exec01.cc. (c) Volte para item (a) se achar que precisa entender melhor a rela c ao entre os grafun exec01.cc e grafun01.cc. 8. Compile diretamente o programa grafun exec01.cc. A linha de compila c ao est a dentro de grafun01.cc5, coment ario (20). Depois rode o programa. Se voc e esquecer o par ametro necess ario, ele vai avis a-l@ disto. Verique onde se encontra esta prote c ao no programa. 9. Apague a prote c ao inicial6 , procure o coment ario (10). Apague o else tamb em e as chaves. Compile7 e rode o programa sem nenhum par ametro. Leia os coment arios (20) e (10).
3 N preciso ter ao h a nenhuma raz ao para o nome, foi uma casualidade que virou h abito. E cuidado com estas casualidades. 4 Como todo bom gerente, este n ao faz muita coisa, apenas delega o trabalho e ca examinando se tudo corre bem. 5 Eu poderia copiar a linha de compila ca o aqui para o texto, mas o objetivo e mesmo envolv e-l@ na leitura do programa. 6 Sem receios, h a outra c opia do programa no CD. 7 Se der erros na compila ca o e porque voc e apagou destruindo l ogica, pegue outra c opia do programa e volte a apagar, este processo faz parte da an alise do programa.

263

10. make Outra forma de compilar e rodar programas e usando o utilit ario make. Experimente make prog -f make grafun (a) Estude um pouco sobre o utilit ario make no cap tulo 11, n ao se aprofunde agora, fa ca uma primeira leitura e v a usando e aprendendo. (b) Volte a ler make grafun, ele cont em etiquetas que gerenciam o pro uma makefile. As makefiles s cessamento. E ao roteiros que o utilitario make segue. Neste caso o comando make prog -f make grafun instruiu make para executar a se c ao etiquetada com prog. Experimente make clean -f make grafun e depois exexute ls prog. Ver a que prog n ao existe mais. Releia make grafun, procure a etiqueta clean. (c) Fa ca uma nova leitura r apida sobre make no cap tulo 11. Uma leitura r apida, volte logo para c a. 11. A classe Grafico se encontra no arquivo Grafun01.h. Leia este arquivo agora. Ela tem apenas tr es m etodos, para criar os arquivos dados e transfere e fazer a limpesa do sistema apagando os arquivos criados. (a) cria dados() cria um arquivo denominado dados com uma matriz n x 2 de pontos que gnuplot vai interpretar como os pares (x, y ) do gr aco de uma fun c ao (b) cria transfere() cria um arquivo denominado transfere com comandos do gnuplot. (c) limpa arquivos() Compile, rode grafun01.cc, leia Grafun01.h. Identique os m etodos identique os arquivos criados pelos m etodos e leia os arquivos. 12. Um desao. Altere os m etodos denidos em Grafun01.h, fa ca modica c oes no programa grafun01.cc e altere tamb em grafun exec01.cc. Sem receios, no CD voc e pode conseguir novamente as vers oes originais. O m aximo que poder a acontecer e que deixem de funcionar! Tenha apenas um cuidado, se houver advert encias - (warnings), leve-as a s erio, voc e pode ter esquecido algum item importante. Em geral, neste programa que e um pequeno programa, n ao haver a grandes riscos, mas, por exemplo, esquecer de usar transfere.close() depois de haver executado transfere.open() pode danicar arquivos gerando pelo menos lixo no HD. 264

9.3

Porque um sistema de programas

O programa na verdade seria granfun exec01.cc, entretanto este programa usa uma biblioteca funcao.h onde est a denida a equa ca o da fun ca o cujo gr aco se deseja. O usu ario pode querer alterar a equa ca o ent ao o programa tem que ser novamente compilado para que incorpore a nova vers ao da biblioteca funcao.h com a modica ca o feita na equa ca o da fun ca o. Isto ca pelo menos deselegante, do ponto de vista o usu ario que nem precisa saber compilar um programa. H a v arias solu co es para resolver este problema quando lidamos com uma linguagem compilada como e C++, uma delas e usar um m odulo leitor de equa co es que substitui o uso de uma biblioteca, como funcao.h. A outra solu ca o, mais simples, que estou usando aqui, e criar um programamaster, grafun01.cc que se ocupa do trabalho preliminar chamar um editor permitindo que o usu ario edite a equa ca o (ou as equa co es das fun co es); recompilar o programa-escravo que vai usar esta biblioteca, depois que ela for editada; chamar o programa-escravo como um processo externo. As se co es seguintes fazem uso signicativo de um tipo de ponteiro, ponteiro para uma fun c ao e sugiro que voc e fa ca uma nova leitura da se ca o 5.8, p agina 172, sobre ponteiro para fun ca o, no cap tulo 7.

9.4

Evolu c ao das classes gr acas

A sucess ao de bibliotecas GrafunX.h v ao introduzir as melhorias com que vou obter a vers ao nal Grafun.h. Voc e vai acompanhar esta evolu ca o ao longo desta se ca o.

A primeira modica ca o que vou fazer em Grafun01.h vai ser uma simples otimiza ca o denindo um membro8 privado para a classe um objeto da classe fstream de que os dois m etodos far ao uso. Leia Grafun02.h e compare com Grafun01.h. Observe que o programa grafun exec02.cc difere de grafun exec01.cc apenas no ponto marcado pelo coment ario (02) o uso da nova bilioteca Grafun02.h. Au nica utiliza ca o que vou fazer destes dois arquivos e esta, para mostrar-lhe como pequenas evolu co es numa classe (ou biblioteca) tem efeito imediato sobre um programa.
8 Para a classe Graco arquivo e um membro, relativamente ` a classe fstream arquivo e um objeto - e uma inst ancia desta classe.

265

Eu criei grafun exec02.cc apenas ilustrar isto uma vez que se eu tivesse a nos alterado grafun exec01.cc eu teria perdido todo o apoio que ele me d exerc cios do tutorial 76 na p agina 262. Os programas grafun exec02.cc grafun exec01.cc s ao id enticos com exce ca o da bilioteca em que a classe Graco est a denida. Falando de outra maneira, pela nova deni ca o da classe Graco. um exemplo de modica E ca o importante esta que z de de Grafun01.h para Grafun02.h, uma otimiza ca o uma vez que diminue o tamanho dos dois m etodos que v ao usar um membro comum na classe.

9.5

Vers ao beta do programa

Nesta se ca o voc e vai acompanhar a produ ca o do programa que faz gr acos de fun co es ele foi apenas planejado na primeira se ca o, mas o planejamento vai ser levemente alterado agora. N ao deixe de ler os coment arios dentro dos programas, s ao complementos para o texto do livro. Os programas s ao, e em geral, mais recentes que o livro.

9.5.1

O novo planejamento

Vou localizar a chamada ao editor de textos, para editar a equa ca o, ou as equa co es das fun co es, dentro de m odulos apropriados (fun co es) do programa-master, porque vai haver uma diferen ca importante quando formos fazer gr acos de equa co es param etricas: vou precisar uma biblioteca diferente para as equa co es param etricas para evitar uma polui ca o visual muito nociva para um usu ario leigo9 , os programas chamar ao pequenos arquivos especializados. Vou ter que criar m etodos melhores para produzir o arquivo de dados adequados para equa co es param etricas ou para o caso de equa co es com coordenadas polares. Isto ser a feito com passagem de par ametros adequados. A melhor forma de explicar como funciona e atrav es de coment arios dentro do programa, eles est ao l a, n ao deixe de l e-los. Os arquivos necess arios a nova vers ao do programa ser ao grafun04.cc o novo programa-master; grafun exec04.cc o novo programa-escravo; funcao1.h,funcao2.h,funcao2.h segundo for necess ario para fazer o gr aco de uma ou mais fun co es. equacao parametrica.h, quando a op ca o escolhida for equa c ao param etrica; polares.h quando a op ca o escolhida for gr aco com coordenadas polares;
9 n os programadores nunca podemos nos esquecer de que o usu ario dos programas, n ao e, em princ pio, um programador.

266

Grafun04.h onde estar a a nova classe Graco. O programa car a mais complicado, para o programador, mas car a mais simples para o usu ario. Numa vers ao10 deste programa, com uma m ascara gr aca, o usu ario seleciona sua op ca o clicando num bot ao, mas o que vai acontecer por tr as da m ascara gr aca e o que estou fazendo aqui. A vers ao tr^ es e intermedi aria e serviu apenas para fazer uma corre ca o na vers ao dois, esta corre ca o est a documentada em coment ario no arquivo Grafun03.cc. Na vers ao tr es comecei a usar fun ca o ponteiro e neste ponto e interessante que voc e volte a ler (ou leia) a se ca o sobre ponteiros para fun c ao no cap tulo 7. O tutorial vai conduz -lo a ` compreens ao deste tipo de ponteiros e a grande (e e realmente grande) diferen ca entre a vers ao dois para a tr es. Da vers ao tr es para quatro h a poucas modia co es. Estou usando programas id enticos aos da vers ao tr^ es na vers ao quatro apenas por uma quest ao de organiza ca o do trabalho, uma das raz oes e a de preservar os tutoriais do livro. Exerc cios 77 (Tutorial) Preparando a vers ao quatro 1. Compare os arquivos Grafun03.h e Grafun04.h. Em Grafun03.h se encontram marcas necess arias para compreender os erros de Grafun02.h que caram in uteis na nova vers ao. 2. Leia o programa grafun exec03.cc, procure o coment ario (30) mesmo que esta programa esteja desativada. Procure entender porque foi desativada. ario (30) h a v arias 3. Leia o programa grafun exec03.cc, procure o coment posi c oes em que ele se encontra. Ele marca uma vari avel que e um ponteiro para uma fun c ao. Leia sobre este assunto no cap tulo sobre vari aveis, procure no ndice remissivo ponteiros, fun ca o. da de dados indicando o endere co 4. Rode grafun exec03.cc11 e veja a sa das fun c oes. Volte a ler o programa e veja como z para imprimir o endere co (inicial) das fun c oes. O programa ponteiros28.cc tamb em faz isto. Compare os dois programas. 5. O programa-master e grafun03.cc, leia o programa e veja onde ele faz a compila c ao do programa-escravo. Os coment arios, no programa explicam como o programa se comporta. A vers ao quatro e apenas um simples arremate dos programas da vers ao tr es. Rode e leia os programas e vamos na pr oxima se ca o construir os gr acos de fun co es bivariadas, com gnuplot, e com aux lio do joe, o meu inestim avel editor de textos para programa ca o.
vers ao n ao dever a aparecer neste livro. e um programa-escravo, ele n ao foi feito para ser rodado isoladamente, mas ele mesmo explica como deve ser rodado....
11 Este 10 Esta

267

Mas antes de dar por terminada esta se ca o, vou fazer uma revis ao de todo o trabalho feito, uma esp ecie de resumo geral, ela vai justicar o trabalho que vou fazer com fun co es bivariadas e os seus gr acos, superf cies.

9.5.2

Como se obt em os gr acos

H a alguma repeti ca o de tudo que foi feito at e agora, nesta se ca o, mas este e o defeito dos resumos. Se voc e achar que n ao precisa, passe em frente, e n ao perca tempo. Compila ca o est atica cria um programa incluindo nele as biliotecas registradas no cabe calho e cria um programa grande e r gido. Compila ca o din amica e uma alternativa que n ao vou discutir neste livro, ela permite que as bibliotecas sejam incorporadas na execu ca o. Equa co es de fun co es nos programas deste livro est ao guardadas em bibliotecas, funcao1, funcao2, funcao3, funcao4, .... e s ao biblitecas est aticas, tem que ser inclu das no execut avel durante a compila ca o. Isto torna imposs vel alterar as equa co es das fun co es. O programa n ao reconheceria nenhuma mudan ca. Um par de progrmas escravo e master resolvem rapidmente este problema. O programa master chama um editor e permite que o usu ario altere as equa co es com que vai trabalhar. Depois o master recompila o programaescravo incluindo nele as bibliotecas necess arias, agora alteradas. O programa master tamb em chama o programa escravo e lhe pode passar comandos. Se voc e compilar grafun exec04.cc, chamando de prog ao execut avel, ao executar ./prog o programa lhe vai dizer que precisa de uma op ca o. Este trabalho e feito pelo programa-master: O coment ario (20), em grafun04.cc, mostra como o programa-master compila o escravo. O master lhe mostra o menu e recolhe a op ca o do usu ario, depois ele compila a op ca o dentro da string que vai rodar o programa escravo. Veja os coment arios (30) e (40) em grafun04.cc. Finalmente o programa-master pede que o sistema operacional rode o programa-escravo com a op ca o que o usu ario tiver escolhido, isto est a indicado no coment ario (40). Voc e pode fazer, voc e mesmo, tudo que o programa-master faz. Quase tudo! Compile grafun exec04.cc g++ -Wall -oprog -lm grafun exec04.cc e execute no terminal 268

prog 1, prog 2, ... prog 5. voc e ter a executado cada uma das op co es do menu. O programa master faz isto e ainda apresenta o menu de op co es do programa (do programa escravo)! O master e o gerente do processo, o escravo faz tudo. Na vida real o gerente e melhor pago e trabalha menos. Em computa ca o impera a justi ca e a igualdade: master e escravos s ao apenas nomes.

9.5.3

Otimiza c ao e robustez

No pr oximo tutorial vou fazer alguns ajustes nais no pacote Grafun tornandoo mais robusto entretanto menos leg vel, eliminando membros e m etodos da classe Grarfun. O coment ario (300), em Grafun04.h anuncia as melhoras que podem ser feitas. Exerc cios 78 (Tutorial) Otimiza c ao nal 1. Havia um erro em grafun03.cc que foi somente foi observado depois de v arios testes, est a documentado no coment ario (15). Fa ca v arios testes com este programa para observar o erro e leia o coment ario. Solu c ao em grafun04.cc. 2. Leia o coment ario (300) em Grafun04.h. 3. Os m etodos aplica(), aplica2() apenas intermediam a passagem de uma fun c ao. Eles foram eliminado de Grafun05.h, analise as mudan cas comparando as duas vers oes da classe Grafun denidas em Grafun04.h, Grafun05.h.

9.6

Fun c oes bivariadas

gnuplot sabe fazer gr acos de fun co es bivariadas, um tutorial vai mostrar-lhe como usar o gnuplot para que possamos, depois, ensinar isto aos programas.

Vou direto ao tutorial, mas alerta! e um pequeno tutorial sobre o que gnuplot pode fazer. Exerc cios 79 (Tutorial) Superf cies com gnuplot 1. Compile e rode o programa sugraf01.cc. Ele cria arquivos com comandos e dados para que gnuplot fa ca gr acos de superf cies. 2. Leia os arquivos dados supercie e sup transfere para ver os arquivos que o programa criou e como funciona gnuplot.

269

3. Rode gnuplot num terminal e veja em sua ajuda sobre o comando splot, o comando para fazer gr acos de superf cies do tipo graf (F ) help splot 4. Leia o programa sugraf01.cc , procure entend e-lo. O programa cria dois tipos de dados, ponto, malha se voc e tiver estudado calculadora.cc vai ver que e uma continua c ao das id eias do cap tulo anterior. A id eia e que malhas s ao ret angulos providos de um passo, criando os n os. Para denir o ret angulo estou usando os v ertices que se op oem pela diagonal, e pr atico, serve para denir inclusive segmentos de reta, basta fechar o ret angulo, colocando a diagonal sobre o eixo OX ou OY . 5. Volte a rodar o programa, e o leia novamente! Descubra, no programa, como ele chama gnuplot e execute este comando externamente num terminal. Use os arquivos que o programa criou. 6. Altere o programa sugraf01.cc para que ele fa ca os gr acos de outras supercies, n ao se esque ca de trocar a equa c ao da fun c ao F no arquivo funcao biv01.h; voltar a compilar o programa... por que ? 7. Desao Altere sugraf01.cc para que ele fa ca o gr aco de duas superf cies, graf (F ), graf (G) simultaneamente. N ao se esque ca de colocar algumas linhas em branco no arquivo de dados. Se voc e colocar os dados em dois arquivos diferentes gnuplot vai imprimir os gr acos com cores diferentes. 8. Outro desao Rode o programa sugraf01.cc duas vezes.

Antes de rodar pela segunda vez, altere o nome do arquivo dados superficie que o programa cria, por exemplo mv dados superficie dados superficie01 Altere a equa c ao da fun c ao no arquivo funcao biv01.h e volte a compilar o programa... por que ? Altere o arquivo sup transfere incluindo na linha do splot o nome alterado do antigo arquivo de dados. Execute gnuplot sup transfere para ver os gr acos de graf (F ) e de graf (G) simultaneamente. 270

O programa sugraf01.cc lhe mostra como funciona gnuplot para fazer gr acos de fun co es bivariadas. Se voc e tiver lido a primeira parte deste cap tulo, e feito todos os exerc cios (tutoriais), observou que a novidade neste ponto foi o uso do comando splot do gnuplot e que ele precisa de uma matriz n x 3 que vai interpretar as linhas desta matriz como sendo (x, y, f (x, y )) A palavra interpretar e uma palavra chave, todo o segredo em programa ca o consiste em codicar adequadamente os dados para que um programa consiga interpret a-los de forma a prodzir o que desejamos ver. Outro segredo consiste em darmos a vis ao correta do resultado para o usu ario e assumir todo o trabalho de codica ca o porque o usu ario e, potencialmente, algu em que pode estragar os dados. N ao podemos conar na experi encia do usu ario. Neste ponto do planejamento, eu tenho duas op co es (pelo menos): Fazer um acr escimo em Grafun04.h incluindo novos m etodos para fazer gr acos bivariados; Criar uma nova classe exclusiva para gr acos bivariados. Esta e uma decis ao a ser tomada pelo grupo que trabalha no projeto, precisa ser cuidadosamente analisada porque corre co es posteriores ser ao traum a- ticas. Vou optar pela primeira op ca o porque e mais simples para o desenvolvimento deste livro, tudo que vou fazer e criar os m etodos a partir do programa sugraf01.cc, mas ela n ao parece ser a melhor. Um tutorial pode se ocupar deste trabalho, sobretudo porque alterei a estrutura dos dados para acompanhar desenvolvimentos anteriores (da calculadora) e o programa sugraf01.cc ser a o processo de adapta ca o para a nova estrutura de dados. Exerc cios 80 (Tutorial) Fun c oes bivariadas 1. Leia o program sugraf01.cc 2.

9.7

Vocabulario

A CTAN, funcao, gnuplot, L TEX , membro, objeto, TEX

e um sistema de sites CTAN - Comprehensive TeX Archive Network - espelhados em v arias partes do mundo, contendo todos os programas relativos ao sistema para preparar documentos, em geral refer enciados como tex e apresentados com a logomarca TEX. Num destes sites, por exemplo [4], voc e pode encontrar a lista de espelhos, mas tamb em pode 271

encontrar documentos de todos os n veis, desde introdut orios at e listas de livros vendidos em livrarias sobre os v arios sistemas. e cada um dos m odulos em que um program se divide, e a subdi funcao vis ao t pica de um programa na linguagem C, mas esta modulariza ca o persiste em C++ representando um primeiro passo no processo de constru ca o dos m etodos de uma classe, por exemplo, sugraf01.cc, representa este primeiro passo. C++ admite um processo h brido de programa ca o em que podemos aliar a tecnologia de programa ca o orientada a objeto com programa ca o funcional. Muitas vezes este e o primeiro passo antes de criarmos classes adequadas, testando fun co es num programa que depois podem ser transformar em m etodos de uma classe. As classes e seus m etodos s ao uma abstra ca o computacional que algumas vezes surgem de experi encia adquirida passando a representar um modelo para distintas situa co es para as quais criamos programas na tecnologia tradicional. uma poderosa m gnuplot E aquina de calcular com o objetivo de apresentar o resultado dos c alculos em forma gr aca. Neste livro e o instrumento para obter os gr acos que os meus programas precisam. Este programa foi iniciado por volta de 1986 por Thomas Williams, Colin Kelley, gnuplot que, neste epoca foram um dos pioneiros12 do software livre quando ainda mal se falava em programas de dom nio p ublico, uma vez que j a deixaram o programa que eles estavam criando livre para quem quisesse copiar e usar. E colheram os benef cios desta liberdade conseguindo uma multid ao de colaboradores que tornaram gnuplot um padr ao para fazer gr acos de fun co es. Quem quer obter um gr aco de alta qualidade, prepara os dados e chama gnuplot para terminar o trabalho.
A e um pacote de macros que tornam mais f acil o uso do TEX. L TEX A H a v arios outros pacotes que implementam [10, L TEX ] para plataformas A computacionais espec cas. TEX, ou L TEX , s ao linguagens de computa ca o com um compilador que analisa o c ogigo fonte, um documento escrito com uma dessas linguagens e n ao encontrando erros produz uma saida de dados que e o arquivo com extens ao dvi - device indenpendent signicando com isto que est a pronto para ser reprocessado para produzir um documento para um certo tipo de dispositivo - uma impressora, ou a tela do computador. Abra a makefile que se encontra no CD e e procure a etiqueta livro: e voc e poder a ver a sucess ao de comandos para obter este livro pronto para enviar para a editora. A etiqueta livrof: produz a vers ao nal, um arquivo pdf.

Para produzir o livro digito make livro


funda ca o GNU foi criada tamb em nesta epoca e o TEX foi considerado terminado por seu autor, Donald Knuth, oito anos antes, em 1978.
12 A

272

num terminal referenciado ao diret orio em que o c odigo fonte deste livro se encontra. membro na terminologia de programa ca o orientada a objeto e uma vari avel de uma classe, acompanhe este exemplo lendo o arquivo Grafun.h. Esta forma de ver e relativa, na classe Graco arquivo e um membro. Relativamente ` a classe fstream arquivo e uma inst ancia desta classe portanto um objeto. Dentro da classe Graco a declara ca o fstream arquivo; dene uma inst ancia da classe fstream. Quer dizer que arquivo herda os m etodos denidos na classe fstream, o que torna poss vel no m etodo etodo cria transfere() executar o m arquivo.open("transfere", ios::out); abrindo o arquivo transfere com a propriedade de receber dados. e uma inst ancia de uma certa classe, na classe Graco eu uso isto objeto quando deno fstream arquivo; ent ao arquivo e um objeto da classe fstream. Relativamente a classe Graco arquivo seria um membro do tipo fstream. Isto justica certa confus ao que voc e pode encontrar em livros sobre programa ca o orientada a objetos em que o autor diz que os termos objeto e membro s ao usados de forma sin onima. N ao s ao, mas ser objeto ou membro e uma situa ca o relativa, como descrito acima. Isto permite que uma certa confus ao se estabele ca, fuja dela. e um compilador de textos produzido por Donald Knuth, dizem, para TEX um dos pioneiros criar o seu livro The Art of computer programming. E do software livre e do c ogigo aberto. O TEX cou pronto em 1978, depois disto vem sendo melhorado por uma s erie de pacotes que o utilizam como A programa b asico, um dos mais importantes, pelo uso, e o L TEX . Este A livro foi compilado com L TEX .

273

Cap tulo 10

Sistemas de equa c oes


O plano do trabalho: Vou construir um novo programa utilizando uma classe j a existente, e uma t ecnica chamada de reutiliza c ao de programas. Na se ca o seguinte vou construir um sistema de grande porte e no momento certo vou discutir a grandeza deste porte. Para fazer isto vou apresentar uma vers ao tradicional do sistema baseado no conceito de bilioteca. Finalmente vou transformar a bilioteca numa classe e apresentar-lhe o mesmo sistema inteiramente feito com a tecnologia de orienta c ao ` a objeto. Ao nal vou fazer alguns coment arios fechando alguma discuss oes gen ericas que foram cando para depois. O depois e agora neste cap tulo.

Vou come car dando um exemplo simples de reutiliza ca o de programas: nas equa co es do segundo grau, quando o delta for negativo, aparecem n umeros complexos. Se voc e tiver passado pelo cap tulo 9, viu que o programa desenvolvido naquele cap tulo usou a biblioteca Complexos.h onde est ao denidas duas classes, nelas tenho tudo que preciso para trabalhar com os n umeros complexos nos meus projetos em andamento e d a de sobra para resolver esta quest ao das equa c oes do segundo grau. Vou desenvoler inicialmente um programa simples, mas que lhe pode dar id eias para que voc e construa um tutorial para o ensino de Matem atica no Ensino Fundamental. Vou terminar com o desenvolvimento um projeto de largo porte usando-o como motiva ca o para um tutorial.

10.1

Resolvendo por Baskhara

Quero resolver uma equa ca o do segundo grau e como o delta pode ser negativo vai envolver n umeros complexos na solu ca o, isto n ao vai ser nenhum problema porque eu j a z tudo1 sobre n umeros complexos, agora e somente us a-los.
1 Que

ousadia!

274

Voc e est a vendo que a produ ca o de programas se d a pela constru ca o de pequenos m odulos que v ao se encaixando. Apenas os objetos s ao mais vivos que as vari aveis e neste cap tulo vou lev a-lo mais a fundo nesta pr atica. Reutilizar, uma t ecnica important ssima na produ cao de software: se voc e, ou algum membro de sua equipe de trabalho j a produziu alguns m etodos, depois de bem testados e aprovados pelo grupo, eles cam dispon veis para reutiliza c ao. Isto quer dizer, ningu em vai precisar repetir o trabalho. E aqui est a um dos segredos do software aberto, como o meu, outros fazem uso dele e me apontam defeitos, ou me trazem melhorias, e todos ganhamos com o resultado. Vou seguir usando a t ecnica do tutorial. Exerc cios 81 (Tutorial) A equa c ao do segundo grau 1. A equa c ao do segundo grau e uma equa c ao polinomial. Crie um programa (use struct) que dena uma matriz de coecientes e experimente o programa. Solu c ao: segundo grau01.cc 2. Leia segundo grau01.cc e verique que o programa pode ter uma fun c ao do tipo void para imprimir os coecientes da equa c ao: serve para o usu ario vericar se era isto mesmo que queria. c ao. Melhore segundo grau01.cc criando esta fun Solu c ao: segundo grau02.cc 3. Crie uma biblioteca, segundo grau.h e transra para ela a fun c ao void coeficientes(polinomio pol) N ao se esque ca de incluir a bilioteca na proxima vers ao do programa. Solu c ao: segundo grau03.cc, segundo grau.h 4. Leia a biblioteca segundo grau.h, observe que ela inclue todas as biliotecas que o programa segundo grau.cc vai precisar. H a fun c oes que ainda n ao est ao sendo utilizadas (e nem precisar ao nunca ser utilizadas por este programa que estou fazendo agora - podem ser usadas em outro). Voc e j a deve ter lido 00esqueleto.cc, foi com ele que comecei segundo grau.h fazendo algumas altera c oes. Analise os dois! Se voc e descer at e o nal do arquivo, em segundo grau.h vai encontrar todas as solu c oes deste tutorial escondidas como coment arios ao nal.. . . e um m etodo de trabalho. A gente tem id eias, as registra, e as deixa escondidas2 sob coment ario.
2 A palavra escondida pode sugerir uma forma errada de trabalhar. N ao tenho nada escondido de ningu em, eu deveria ter tido lixo recicl avel. Tamb em lixo e uma id eia antiga, e material recicl avel, que ainda pode ser utilizado.

275

5. Esta na hora de calcular o delta, fa ca uma fun c ao que calcule o , teste e depois a transra para a bilioteca. Solu c ao: segundo grau03.cc, segundo grau.h 6. J a podemos resolver equa c oes quando o > 0. (a) Se > 0 resolva a equa c ao; (b) Caso contr ario emita uma mensagem dizendo que isto somente pode ser resolvido na 8a. s erie! Solu c ao: segundo grau04.cc, segundo grau.h 7. Inclua a bilioteca Complexos.h em segundo grau.h e agora resolva a equa c ao do segundo grau usando um objeto complexo denido pela classe complexo. Leia calculadora.cc para ver como fazer. Nesta classe h a um m etodo para escrever corretamente os n umeros complexos. Tem tamb em o objeto complexo da Matem atica. Solu c ao: segundo grau05.cc, segundo grau.h 8. Nesta seq u encia de programas camos sempre com os dados do polin omio inalterados (alteramos manualmente para testar as duas fun c oes caso real ou caso complexo). Esta na hora de incluir uma entrada de dados, fa ca isto. Solu c ao: segundo grau06.cc, segundo grau.h

10.1.1

An alise do algoritmo

Vamos mostrar-lhe alguns defeitos neste programa, entretanto n ao vamos construir o c odigo otimizado. Isto caria bastante complicado para o n vel introdut orio deste livro3 . O programa calcula v arias vezes o - perda de tempo. Neste caso o c alculo e pequeno e uma otimiza ca o seria custosa para pouco resultado. Sa da: poderiamos criar uma estrutura de dados mais complexa - uma matriz a ser devolvida por delta() incluindo o byte l ogico {0, 1} e n umero real ; Outra sa da: criar uma fun ca o que resolva a equa ca o: resolve equacao(polinomio pol) que fa ca todo o trabalho depois da entrada de dados. O c odigo poderia car assim:
3 N ao e que este assunto, neste caso, seja dif cil, apenas seria uma fuga do objetivo principal, a pr opria an alise lhe mostra como resolver o problema.

276

resolve\_equacao(entrada_de_dados(pol)) com isto se economiza uma vari avel e uma transfer encia de dados. O programa ca um pouco mais dif cil de ser lido. Estas preocupa co es se tornam essenciais quando os c alculos forem cando mais intensos. N ao e este o caso com um sistema de equa co es do segundo grau, mas e importante que voc e que alerta para estas quest oes de otimiza ca o.
Vou construir nesta se ca o nal, dividindo-a em duas subse co es um sistema de porte maior. Voc e vai poder me acompanhar em todo o processo de planejamento que vai ser conduzido por alguns tutoriais. Neste projeto eu vou fazer uso de todas as t ecnicas que discuti no livro e vou lhe mostrar a minha forma de planejar um programa grande.

10.2
10.2.1

Planejamento de um aplicativo
Um planejamento

Grupos de trabalho em programa c ao Vou lhe mostrar aqui como eu, um programador, fa co um planejamento de um software de relativo grande porte. N ao pretendo com isto sugerir que voc e use a mesma metodologia, voc e ver a que a metodologia e um pouco pessoal. Mas tem algumas diretivas que todos n os, programadoras e programadores, aprendemos com a experi encia acumulada dos erros de fazer programas que se encontram registrados no trabalhos dos grupos de trabalho. preciso ler nos diversos sites, onde h E a grupos de trabalho em programa ca o, as diretivas de como programar bem. Voc e encontra na bibliograa deste livro diversas fontes para esta consulta. Infelizmente o exemplo que vou desenvolver aqui e de um u nico programador, o que de partida e muito ruim. Um trabalho de grande porte tem que ser feito por um grupo de pessoas. Observe que n ao estou dizendo que e e melhor que seja feito por um grupo de pessoas, estou dizendo claramente que tem que ser um trabalho em grupo. Ao analisar o trabalho que vou apresentar aqui, esteja alerta para procurar os seus defeitos, alguns at e eu vou salientar. Mas se eu tivesse descoberto todos os defeitos, voc e n ao encontraria nenhum. Au ltima frase n ao e uma tentativa de engan a-lo, sugerindo que deixei defeitos, didaticamente, para que voc e os encontrasse. Muito pelo contr ario, e para alert a-lo de que um trabalho de grande porte tem que ser feito por uma equipe o que inclui um grupo cuja u nica fun ca o e procurar os defeitos - o teste do programa. O ideal e que a equipe de teste n ao seja formada por programadoras, porque as programadoras e programadores, s ao viciados... as programadoras tem uma vis ao pr opria que e diferente da vis ao do usu ario que e objetivo nal de um programa. O melhor testador para um programa e o usu ario nal. 277

Ent ao, n ao seja complacente com o meu trabalho, critique-o. O correto n ao e deixar de criticar mas sim, criticar, e apresentar a cr tica, isto e lealdade. O projeto Vou come car descrevendo o projeto at e mesmo para torn a-lo mais f acil para algum usu ario menos envolvido com Matem atica que e o objetivo deste projeto. Um programador n ao pode conhecer todos tipos de problemas existentes, mas tem que saber programar para resolver qualquer tipo de problema. Este e uma das graves diculdades em programa ca o, uma area de trabalho que se aplica em todos os poss veis ramos de atividades humanas. Eu j a desenvolvi um programa para adminstra ca o de um consult orio m edico, sem entender nada de medicina a n ao ser aquelas id eias que todos temos sobre medicina, muitas delas extereotipadas. Todos nos consideramos m edicos natos, e isto e uma desastre para a sa ude. Cabe aqui dizer o que z como preliminar do trabalho para o consult orio m edico, que se aplica tamb em neste caso que vou desenvolver aqui. Prepara c ao para o planejamento Conversar com os envolvidos para saber o que desejam e fazer uma lista das tarefas que eles consideram essenciais. Retornar at e os envolvidos para lhes apresentar, com humildade, a sua vis ao do conjunto das tarefas e ouvir a cr tica sobre as prioridades com que voc e, programadora, organizou as tarefas. Esta prioridades n ao a programadora que dene, e o usu ario. As tarefas priorit arias, muito possivelmente v ao denir o menu principal do programa. Denir o objetivo da primeira vers ao e estabelecer o prazo de termino da mesma. A primeira vers ao, usualmente chamada de beta, deve ser feita com relativa rapidez e colocada em uso para que os usu arios comecem a fazer os testes. Eles devem ser informados de que se trata de uma vers ao beta, que tem defeitos e que pode travar, mas que e importante que entre em uso para redenir o planejamento. impor Redeni ca o do planejamento a partir das criticas dos usu arios. E tante que se tenha em mente que o objetivo n ao e convencer o usu ario a se adaptar ao programa e sim adaptar o programa aos desejos dos usu arios, por mais abusurdo que eles pare cam. Os testes do programa Do exposto voc e pode ver que fazer um programa n ao pode ser uma decis ao da programadora e dos programadores. Eles devem se sentir um grupo de apoio ao usu ario e produzir uma pe ca que os usu arios possam vestir com satisfa ca o.

278

A boa roupa e aquela que senta com gra ca em que a vai usar, e n ao aquela que exige do personagem que se adapte ao corte da roupa... Neste caso que vou come car a expor, existe um v cio fundamental que e importante alertar para agu car a sua cr tica: eu sou o usu ario e o programador. Mas voc e que est a lendo o livro pode atuar com membro do grupo de testes, e, como comprou o livro, adquiriu o direito de reclamar do programa, mesmo que n ao tenha comprado, que esteja lendo emprestado, tamb em tem este direito. Use o programa, teste, envie suas reclama co es, ou sugest oes ao autor, e um direito seu e eu agrade co a colabora ca o. Apenas n ao posso prometer o envio de uma nova vers ao do programa, imediatamente. Mas haver a uma nova vers ao baseada neste cr tica, sem d uvida. Denimos, assim um grupo de testes. Descri c ao do programa c ao polinomial, um fen omeno descrito por Objetivo Simular, com interpola alguns dados amostrais. Alguns sensores, podem ser pessoas, levantam dados sobre um acontecimento, quanticando-o, em alguns pontos. O programa usa estes dados para representar graca e polinomialmente (uma equa c ao alg ebrica) o evento. As etapas do planejamento do programa Um menu de op co es da vers ao beta; Vai descrever o que programa pretende fazer, resulta de uma conversa com usu arios potenciais do programa. Neste caso o objetivo e construir uma interpola ca o polinomial, a equa ca o, e o gr aco da interpola ca o. Preliminarmente denir um m etodo como os dados ser ao colhidos. As rotinas que comp oem cada uma das op co es do menu; Deni c ao das prioridades e das partes elementares do processamento. A programadora produz esta descri ca o que deve ser criticada pelos usu arios conduzindo isto a uma nova deni ca o das prioridades. No presente caso uma rotina gr aca, aqui vou usar gnuplot que j a foi apresentado no cap tulo 10. Depois dois tipos de entrada de dados, uma usando o teclado e outra usando um arquivo onde um sensor gravou os preciso compatibilizar estas duas forma de entrada de dados de dados. E tal modo que elas possam usar as rotinas comuns. Agrupamento de rotinas comuns; Busca de rotinas que sejam comuns ` as diversas fazes do processamento No presente caso, a rotina gr aca, e o arquivo em que os dados ser ao registrados. H a duas forma de produzir este arquivo a partir da entrada de dados pelo teclado como grava ca o autom atica feita por um sensor

279

Aqui voc e j a pode ver, mesmo num caso t ao simples como e este programa avan cado que estou lhe apresentando, como as quest oes de compatibiliza ca o s ao cruciais. Um ser humano vai fornecer os dados via teclado, e a pergunta e, ele (o ser humano) deve se adaptar para fazer o mesmo que o sensor faria?. A resposta deve ser um claro n ao, a esta pergunta. A adapta c ao tem que ser feita pelo programa. A programadora e que deve criar os meios adequados para que o ser humano, confortavelmente, entre com os dados, e o programa os disponha de modo semelhante ao que o sensor o faria. Por que? H a pelo menos duas respostas para esta pergunta: O ser humano trabalhando sob stress, obrigado a fornecer os dados de uma forma que n ao lhe seja natural, ou confort avel, pode facilmente cometer erros, comprometendo a conabilidade do processamento. Uma quest ao de qualidade de vida, se o processamento pode fazer as adapta co es, ent ao que o digitador trabalhe mais a vontade. Uma primeira vers ao da estrutura de dados. H a um dito muito comum entre as programadoras, quando descobrimos a forma certa para os dados, a estrutura dos dados, praticamente o problema foi resolvido. Isto nem sempre e poss vel conseguir antes da produ ca o da primeira vers ao. Muitas vezes e no teste se descobre uma outra estrutura de dados adequada. Mas e importante analisar os dados e ver como aglomer a-los numa estrutura adequada o que vai tornar f acil a transmiss ao dos dados entre as diversas rotinas. No presente caso h a dois tipos de dados que identiquei como frequentes: Os coecientes dos polin omios que v ao produzir a interpola ca o, eles dependem dos diversos sub-intervalos, os componentes da malha onde os dados s ao colhidos. Vou precisar de dois tipos de dados para conter estas informa co es. Os dados colhidos por um sensor ou uma pessoa, digitados manualmente, ou registrados autom aticamente. Decidi-me por representar este dados como um arquivo. Padronizei o nome do arquivo como leitura. No CD deve haver uma c opia desta arquivo, mas o programa cria uma vers ao do arquivo tamb em.

10.3

A vers ao beta

O pr oximo tutorial vai conduz -lo a compreender a vers ao inicial e induz -l@ a fazer algumas modica co es. O nome do programa e quase splines o que carece de um pequeno coment ario.

280

Observa c ao 25 (Quase splines) Quase Splines Splines s ao polin omios por peda cos com uma deni c ao bem precisa que n ao vem tanto ao caso discutir aqui. O objeto que estou construindo n ao tem todas as propriedades de um spline e ent ao eu criei uma denomina c ao indicando isto e que ao mesmo tempo diz que ele pretendem ser quase como splines. Voc e pode ler mais a respeito de quase splines no meu livro de C alculo Num erico [12, quase splines]. Os exerc cios deste tutorial, como de todos os demais tutoriais do livro, t em dois objetivos, conduz -l@ a entender um programa que est a feito e funcionando e aprender a fazer altera co es nos programas. Voc e j a fez isto muitas vezes, mas agora voc e vai alterar um sistema de programas e e preciso alert a-l@ para uma nova diculdade. V arios dos exerc cios lhe pedem que altere algum componente (m etodo) do programa. N ao duvide em faz e-lo, e teste o resultado compilando o programa. Os erros que voc e cometer ao alterar um destes componentes, ser a f acil de encontrar porque voc e j a sabe onde foi que errou. Para isto, altere apenas um m etodo de cada vez, n ao fa ca grandes altera co es trabalhando com v arios m etodos simult aneamente, porque, havendo erros em v arios m etodos, simultaneamente, ser a dif cil de encontr a-los e voc e pode ter que jogar fora seu trabalho retorando ` a vers ao primitiva do programa. Este processo faz parte do seu aprendizado de planejar programas. Exerc cios 82 (Tutorial) Quase splines 1. O programa. Leia o programa quase splines3.cc e verique que ele inclue duas bibliotecas. Leia rapidamente as bibliotecas inclu das pelo programa. 2. Leia a biblioteca Quase splines.h ela inclue Menu novo.h e possivelmente com um caminho errado: home/tarcisio/tex/c/cplus/Menu novo.h este caminho pode produzir erros na hora de compilar e como os meus programas se encontram ainda muito din amicos, podem ir errado para o disco. e uma biblioteca que cont em a deni c ao da 3. uso do menu Menu novo.h classe Menu, leia rapidamente este arquivo. Em princ pio, para aprender a usar, e suciente ler o coment ario inicial, se n ao for e um erro do programador. Identique como a classe Menu e usada pelo programa quase splines3.cc ario 100 Solu c ao: Coment 4. Fa ca um programa teste.cc que apenas apresente um menu na tela com frases apresentando desculpas porque o programa ainda n ao cou pronto. Solu c ao: sistema11.cc

281

5. dicil, mas n ao imposs vel Atere o programa sistema11.cc para que ele fa ca alguma coisa interessante, por exemplo resolver equa c oes do segundo grau com quatro op c oes, positivo, zero ou negativo e o gr aco da fun c ao do segundo grau usando gnuplot. Voc e pode pedir que o usu ario digite a equa c ao usando a sintaxe da linguagem C++ e se inspire no m etodo leitura do nome do arquivo(string nome arq); para fazer a leitura da equa c ao passando-a para gnuplot 6. As bibliotecas do programa O programa quase splines3.cc inclui dois arquivos (bibliotecas) verique quais s ao. Solu c ao: Coment arios (200) e (210) no programa. 7. Compile e rode o programa quase splines3.cc depois abrindo a biblioteca Quase splines.h identique cada vez que o programa parar, qual e o m etodo que est a sendo executado. Leia os coment arios que se encontram na biblioteca Quase splines.h 8. As bibliotecas do programa No coment ario inicial de Quase splines.h a programadora cometeu um erro ao descrever os tipo de dados coeficientes subintervalo Na verdade s ao duas classes. Mas se voc e pode encontrar a forma original no arquivo Quase splines01.h e neste caso inclua este arquivo em quase splines3.cc (basta ativar um coment ario e desativar outro) - coment ario (220) no programa. 9. chama gnuplot() O nome deste m etodo sugere que ele deve chamar o pacote gnuplot para fazer um gr aco. Analise o m etodo descreva o que le faz. Comment arios (321) - (337). 10. final() J a usei este m etodo em v arios programas, ele deveria ser incorporado ` a classe Ambiente. Fa ca isto. Explique porque melhorando assim Ambiente n ao ir a atrapalhar os programas (como este) que tem um m etodo final(). ario (400) Solu c ao: Coment 11. apaga arquivos tamb em e um m etodo que poderia ser incorporado ` a Ambiente. Mas seria preciso fazer uma altera c ao qual ? ario (500) Solu c ao: Coment 12. A fun c ao polinomial usa uma express ao esquisita para denir um polin omio, explique-a. Tente uma justicativa de porque ela produz um resultado mais r apido. Solu c ao: Coment ario (600)

282

13. escreve matriz dados e um m etodo natural deste sistema portanto um candidato a ser m etodo de uma classe que vamos construir para transformar este programa, efetivamente, em OO. Poderiamos, ou deveriamos algebrisar o nome do arquivo. Solu c ao: Coment ario (700) etodo e desnecess ario. 14. nova simulacao() Verique que este m ario (800) Solu c ao: Coment pico. Recebe uma determina decis ao do usu ario, 15. executa() tem um nome t como um nome de rotina que o usu ario escolher, e executa esta rotina usando um switch(). 16. A gura (10.1) p agina 283, cont em o uxograma deste programa. Identi(1) Entrada de dados pelo teclado (2) Entrada de dados de um arquivo (3) Breve tutorial sobre o programa (4) Instrues detalhadas sobre estrutura do arquivo (5) Os direitos do autor (f) Encerra
arquivos leitura dados transfere

Terminal de texto

< f_im >

gnuplot Terminal de texto programa grfico

Figura 10.1:

Fluxograma de quase splines3.cc

que quais s ao os m etodos constru dos no arquivo Quase splines.h que correspondem aos blocos deste uxograma. 17. Para uniformizar as rotinas de leitura pelo teclado e leitura do registro por um sensor o programa trabalha com tr es arquivos leitura, transfere, dados identique quais s ao os m etodos que criam estes arquivos. Solu c ao: Com um editor de textos... 283

Na pr oxima se ca o vou transformar todas as fun co es contidas na biblioteca etodos das classes necess arias para resolver criar os Quase splines.h nos m quase splines do terceiro grau. No tutorial eu estive chamando as fun c oes denidas neste biblioteca de m etodos porque primeiro crio fun co es que em seguida se metamorfoseam nos m etodos de uma classe. a minha forma de programar, que n E ao precisa ser a sua, mas voc e tem aqui uma metodologia para analisar e assim construir a sua.

10.4

Biblioteca transformada numa classe

Esta ea u ltima fase do grande projeto que havia prometido apresentar. J a observei que n ao e um projeto t ao grande assim, mas e preciso observar que grandes projetos s ao simples aglomerados de projetos do tamanho deste, quando um m odulo est a funcionando basta pindur a-lo no menu principal ou num sub-menu adequado, portanto entender como se pode planejar um trabalho deste porte e uma pr atica adequada. Vou mostrar-lhe como transformei o programa quase splines3.cc que discutimos no in cio do cap tulo, em um aut entico programa orientado ` a objeto. Ainda caram alguns defeitos que vou analisar ao longo do pr oximo tutorial mas eu preferi deixar assim para que voc e possa compreender certos erros de planejamento e n ao pensar que todo projeto resulta em um trabalho perfeito. O defeito a que me rero e o sobre o local ideal onde colocar um certo m etodo. N ao h a uma padroniza ca o clara para esta escolha, e uma decis ao que pertence ao grupo que planeja o trabalho. E porque defeito, e o que desejo salientar. Quem for usar este programa ou as bibliotecas que eu produzir, devem descobrir uma certa l ogica natural na coloca ca o dos m etodos, do contr ario ca dif cil a reutiliza c ao dos meus programas por outros colabodores, e eu tenho o maior interesse em que isto aconte ca porque representa uma troca de experi encia. Estou convencido de que este defeito tem uma fun ca o pedag ogica, e embora n ao tenha sido proposital, z a op ca o por n ao tentar aperfei coar o sistema de modo que voc e, leitor, pudesse usufruir desta diculdade de planejamento. Acho que voc e vai ganhar com a cr tica. Vamos ao trabalho, no pr oximo tutorial. Exerc cios 83 (Tutorial) Transforma c ao de biblioteca em classe 1. O programa e quase splines.cc veja quais s ao todas a bibliotecas que ele inclui. Solu c ao: Coment ario (1000) no programa 2. O Menu e uma classe. Descubra onde est a denida esta classe analisando as bibliotecas que o programa inclue. ario (3000) no programa Solu c ao: Coment

284

3. Tipos de dados e classes Na biblioteca Quase splines.h voc e tem a oportunidade de experimentar com typedef para produzir uma tabela ou uma classe. Para isto basta apagar coment arios numa linha e colocar em outra: coment ario (1000). Isto mostra que uma classe e apenas uma tabela. 4. Evolu c ao de biblioteca ` a classe (a) Diferen ca fundamental Leia os dois arquivos Quase splines.h, Quase splines01.h e descreva com suas palavras a diferen ca fundamental que existe entre eles usando as palavras fun ca o, m etodo - quem tem m etodos e quem tem fun co es. Solu c ao: Coment ario (1000) Quase splines01.h (b) Classes na biblioteca Quase splines01.h Verique quantas classes est ao denidas nesta bilioteca. ario inicial de Quase splines01.h Solu c ao: Coment 5. Onde declarar um objeto Verique onde est a declarado o objeto Selecao que e um exemplo (inst ancia) de Menu. ario (4000) quase splines.cc Solu c ao: Coment 6. As classes s ao tipos de dados Compare novamente Quase splines.h, Quase splines01.h a diferen ca entre coeficientes num e no outro caso e que no segundo caso e uma classe. Isto mostra que as classes s ao apenas uma forma mais avan cada de denir tipo de dado. 7. Vers ao nal da classe QuaseSplines Leia o arquivo QuaseSplines.h e compare com Quase splines01.h. Qual e a inova c ao apresentada em QuaseSplines.h ? ario (700) quase splines.cc Solu c ao: Coment

10.5

Revisando alguns conceitos

Est e o ep logo do livro. Eu quero aqui comentar diversos conceitos que foram cando para depois e chegou o momento nal para estes arremates. Aquilo que a introdu c ao foi incapaz de fazer eu espero que esta se ca o possa explicar. E poss vel que voc e n ao precise mais ler esta parte do livro, ou at e mesmo que a tenha lido durante a primeira leitura. Mas ele precisa ser escrita e o seu lugar e aqui.

10.5.1

As vari aveis e conceito de objeto

Um dos conceitos difusos na tecnologia de orienta c ao ` a objeto e o de objeto.

285

10.5.2

Nomes dos membros de um objeto

Em v arios momentos, nos cap tulos iniciais, discuti o cuidado que se deve ter com os nomes das vari aveis e das fun co es. Aqui podemos ver que esta discuss ao de uma certa forma n ao merecia tanto destaque. Os nomes s ao locais e est ao encapsulados em um objeto, basta-nos ter cuidado com os nomes dos objetos.

10.5.3

Objetos e classes

As classes s ao o paradigma, os objetos s ao exemplos concretos deste paradigma. Por exemplo deni a classe QuaseSplines e um objeto desta classe e comum ser chamado de MeuQuaseSplines, UmQuaseSplines para caracterizar que se trata de um exemplo de objeto daquela classe. Um objeto e um m odulo inteiramente funcional, um programa. Tudo que ser a necess ario e ativ a-lo com uma mensagem em que lhe d a uma informa ca o que ele dever a processar devolvendo um resultado. Leia novamente os exemplos, as classes complexos; coecientes; subintervalo; As classes s ao uma forma mais avan cada de denir tipo de dados, e assim criar vari aveis deste tipo (agora dizemos, desta classe). As classes s ao o paradigma, o modelo. Da mesma forma como em programa ca o tradicional n ao usamos os tipos de dados nos programas, diretamente. Usamos os tipos dados para denir vari aveis de um determinado tipo. Depois s ao estas vari aveis que receber ao dados. Com as classes tamb em e assim, elas denem o modelo, e depois realizamos o modelo com um objeto e dizemos que o objeto e uma inst ancia da classe.

10.5.4

Acesso private e public

As duas palavras chave public, private se dizem denidoras do n vel de acesso que os m etodos e objetos tem dentro de uma classe. O signicado destes dois m etodos de acesso e organizacional, e n ao o de criar n veis de segredo. A se ca o marcada com o acesso private: apenas indica que os objetos e m etodos desta se ca o ser ao de uso interno da classe, por exemplo os seus nomes n ao precisam ser publicados entre os membros de uma equipe de programa ca o. Somente interessam ` a programadora (ou a equipe de programadoras) que produziu aquela classe. Do ponto de vista da programadora, e uma organiza ca o para separar membros (m etodos e objetos) que realizem opera co es internas da classe.

286

Pensando desta forma a programadora ir a dividir melhor as tarefas e este e um ponto central da produ ca o de programas seguros: tarefas pequenas. As moca co es e melhoramentos feitos na se ca o private: de uma classe, em princ pio n ao alteram em nada o uso que antes se fazia desta classe, portanto e uma forma de programa pensando nas modica co es futuras da classe.

10.5.5

A diferen ca: fun c ao e m etodo

while() e uma fun ca o e n ao est a associada a nenhuma classe, n ao e um m etodo. Al em disto existem fun c oes globais. Ningu em diz que while() e uma fun c ao global, mas e. Em C++ o conceito de comando da linguagem se confunde com o coneito de fun c ao. Existem algumas fun co es globais que servem a todas as classes e seria pelo menos complicado que elas pertencendo a uma classe b asica tivesse que ser usada com prexos indicando que pertencem a esta classe. Possivelmente se resolveu assim com a introdu ca o do conceito de fun c ao global. J a falei disto no cap tulo 5, um dos exemplos e getlin(). Mas a grande maioria das vezes, voc e vai construir fun c oes dentro de uma classe para

287

Cap tulo 11

As informa c oes ?
11.1 Refer encias

Eu reuni aqui v arios t opicos que aparecem tamb em nos demais cap tulos, pelo menos alguns. Espero que esta repeti ca o lhe seja agrad avel quando voc e procurar um assunto e o encontrar em algum lugar na primeira busca. Voc e encontra aqui uma lista de palavras chave da linguagem C++, algumas refer encias sum arias indicando onde poder a procurar mais informa ca o sobre v arios t opicos. uma refer E encia incompleta e resumida mas espero que lhe seja u til, mais ou menos e uma lista das buscas que eu mesmo z ao escrever este livro.

Este livro tem, ao nal, um ndice remissivo que pode ajud a-lo a encontrar rapidamente um conceito que voc e precise. Os programas todos (pelo menos os mais recentes) tem, no in cio, a express ao palavras chave depois da qual eu coloquei os assuntos relevantes de cada programa. Se voc e executar grep chave *.cc voc e vai ter uma lista destes assuntos. Sugiro que voc e fa ca isto e coloque em um arquivo: grep chave *.cc > palavras chave O resultado do u ltimo comando e um arquivo chamado palavras chave com uma listagem de todas as linhas de programas contendo este verbete. Voc e pode editar este arquivo e imprimir o resultado para lhe servir de busca sobre assuntos que voc e precise, ou de um programa que talvez fa ca o que voc e deseja. Observe que este comando e destrutivo no sentido de que se o arquivo palavras chave j a existir, ele ser a substituido por uma nova vers ao. Em princ pio deve ser isto que voc e deseja, mas e bom ser avisado. Este cap tulo tem duplica ca o de informa co es porque foi necess ario falar dos mesmos itens em mais de um lugar, para dar exemplos. Tamb em eu queria garantir que voc e encontrasse rapidamente a informa ca o que voc e viesse a precisar, portanto e melhor que ela esteja em mais de um lugar e que voc e a encontre.

288

Voc e deve notar que isto n ao deixou o cap tulo menos claro, apenas um pouco maior do que deveria.

11.1.1

Palavras chave da linguagem

Ao denir novos objetos tenha o cuidado de n ao usar nenhuma palavra reservada da linguagem. Aqui esta a lista delas. asm, auto, bool, break, case, catch, char, class, const, const cast, continue, default, delete, do, double, dynamic cast, else, enum, explicit, export, extern, false, oat, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret cast, return, short, signed, sizeof, static, static cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar t, while, and, and eq, bitand, bitor, compl, not, not eq, or, or eq, xor, xor eq

11.1.2

man, info

Nos sistemas Unix de que Linux e o exemplo gratuito e possivelmente o mais difundido, existe um sistema de ajuda on line que e poss vel acessar com digitando man ou info num terminal. Em Linux o sistema info vem sendo considerado o preferencial, quer dizer que em m aquinas rodando Linux voc e pode encontrar os dois, mas e o sistema info que deve ser o padr ao em algum momento futuro. Vou me referir basicamente ao info mas aproximadamente vale tamb em para man com uma not avel diferen ca, o sistema info existe em diversos formatos e j a se encontra incorporado a muitos programas inclusive em formato html ou gr aco. Se voc e digitar apenas info em um terminal, voc e estar a diante de um manual geral do sistema e poder a passear por todas as informa co es existentes na m aquina. Gaste algum tempo aprendendo a usar este sistema inclusive voc e pode faz e-lo digitando info info e ent ao o info vai lhe explicar o que ele e... Se o sistema estiver bem instalado voc e tem uma grande quantidade informa co es on-line sem precisar estar conectado ` a Internet. Alguns sites uteis Estou listando aqui alguns sites onde voc e pode encontrar informa ca o. N ao posso garantir que um site exista quando voc e estiver lendo este livro, infelizmente os endere cos na rede se alteram com alguma frequ encia porque muitos s ao hospedados gratuitamente o que os for ca a mudar de hospedagem algumas

289

vezes. Mas e poss vel que voc e volte a encontr a-los fazendo uma busca com a parte signicativa do nome. Acrescentei alguma descri ca o sum aria em alguns casos. 1. http://library.gnome.org/ o site principal do sistema gnome se voc E e for produzir ou usar programas para desktop e um lugar onde fazer buscas. Tem uma p agina em portugu es do Brasil. 2. http://www.dreamincode.net/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 3. http://www.cis.udel.edu/ breech/progteam/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. 4. http://linuxgazette.net/ Sobre Linux. 5. http://math.nist.gov/ RPozo/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. 6. http://www.apl.jhu.edu/ paulmac/c++-references.html Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Lista de livros. 7. http://www.gnu.org/software/libc/manual/ O site ocial da funda ca o GNU onde voc e pode encontrar um manul do compilador e de bibliotecas. 8. http://www.cplusplus.com/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 9. http://www.newty.de/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 10. http://www.fredosaurus.com/notes-cpp/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 11. http://www.cprogramming.com/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 290

12. http://www.daniweb.com Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 13. http://www.icce.rug.nl/documents/cplusplus/ o site de um livro eletr E onico sobre C++, inclusive voc e pode baixar deste site o livro C++ Annotations. 14. http://www.yolinux.com/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 15. http://forums.devshed.com/ Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas. Voc e pode se associar ao site e ter um login nele. 16. http://library.thinkquest.org/C0111571/manual.php?tid=52 Um site em que voc e pode encontrar aux lio, tutoriais, exemplos de programas.

11.1.3

O programa make

Nesta se ca o vamos mostrar-lhe como automatizar o seu trabalho usando o make. Voc e vai encontrar um manual completo sobre este programa no sistema de informa co es de LinuX, digite info make para ler um pouco. Se voc e se der bem com o manual, ignore esta se ca o. O objetivo desta se ca o e de ser um tutorial para facilitar a sua leitura e posterior uso do info make uma vez que n ao e dif cil ter diculdades iniciais com a linguagem compacta do info. Mas info make e t ao importante que vale a pena ir em frente, depois desta pequena introdu ca o. Comece usando e aos poucos v a dominando esta ferramenta que lhe pode servir muito al em A de compilar programas em C++. Se voc e usar L TEX , voc e poder a automatizar o seu trabalho com make, tamb em.

O m etodo ser a o mesmo que usamos no livro inteiro, vamos come car induzindo o seu uso do make com um exemplo e depois indicar-lhe como aprender mais. Se achar que o autor est a muito te orico, salte um pouco mais a frente para trabalhar com um exemplo e recomece depois com uma segunda leitura. O que e o make Exerc cios 84 (Tutorial) Leia makefile 1. Leia Makefile, por exemplo execute cat Makefile | more a cada toque na barra de espa co voc e poder a ler uma p agina.

291

2. editores podem estragar textos Se o editor que voc e usou n ao descongurou o arquivo (isto pode acontecer) voc e ter a visto o mesmo que cat lhe mostrou, o que est a na Figura (11.1) p agina 292,

Figura 11.1:

Makefile

uma lista de comandos (regras), porque make e programa ca o em l ogica, usando uma arquivo de regras, que e Makefile. e um editor de textos pode corromper 3. editores podem estragar textos Por qu textos. Uma das raz oes e que n os usamos um sistema alfab etico diferente daquele que os americanos usam, e foram eles que zeram os editores de texto para o sistema de codica c ao da lingua deles que e muito simples. Dois editores diferentes podem estar codicando/decodicando o teclado que voc e estiver usando de modo diferente. Guarde um backup dos arquivos 292

para o caso de precisar recuperar o formato original. Ao trocar de editor, verique se houve altera c ao no texto, e decida se vai continuar usando ou n ao o novo editor. Evite de trocar de editor de texto ao longo de um mesmo trabalho. 4. analise a estrutura do arquivo Makefile. formado de regras. E

O que marca um conjunto de regras e uma etiqueta, uma palavra chave seguida de dois pontos. As regras s ao um conjunto de comandos da linguagem bash e observe que qualquer arquivo execut avel e incorporado ` a bash como um novo comando. O que marca o m de um conjunto de regras e a pr oxima etiqueta, e o conjunto de regras associadas com uma etiqueta devem ser dis tribuidas uma por linha sempre come cando com uma tabula c ao. E neste ponto que um editor de textos pode descongurar o arquivo Makefile, se ele n ao entender o c odigo de tabula c ao que voc e tiver colocado com outro editor de textos. A primeira etiqueta, na Figura (11.1), e prog: arios, ou um conjunto 5. pre-requesitos cada bloco de regras pode ter um, v vazio de pre-requesitos. Por exemplo, na Figura (11.1), o conjunto de regras etiquetadas por limpa: n ao tem pre-requesitos (um conjunto vazio de pre-requesitos), enquanto que as regras etiquetas por prog: tem o prerequesito $programa.cc e as regras desta etiqueta ir ao compilar e rodar este programa. Comece por entender o que signica $programa.cc. O sinal de cifr ao e um comando da linguagem1 bash para expandir o conte udo de uma vari avel. Quando passar neste ponto, make vai ler o conte udo da desta vari avel que voc e pode encontrar entre as primeiras linhas da Makefile. 6. experimente. Um erro ? Rode o programa fail02.cc digitando make -f Makefile prog e o resultado pode ter sido uma mensagem de erro se o arquivo prog tiver sido criado por outra compila c ao. Rode primeiro make -f Makefile clean cujo resultado e apagar prog. Depois volte a rodar make -f Makefile prog cujo efeito ser a compilar e rodar o programa fail02.cc.
1 Esta e a linguagem com quem voc e se comunica e que muitos pensam que e o sistema operacional com quem est ao falando....

293

Voc e poderia ter rodado make -f Makefile limpa em vez de make -f Makefile clean, observe assim, que a escolha da palavra chave clean foi minha. 7. Troque a primeira etiqueta por compila: e rode agora make -f Makele prog que n ao haver a o mesmo erro anterior. Em [11, p agina 843] encontramos a deni ca o de que make e uma outra componente para o desenvolvimento de projetos. Voc e pode ver, lendo um dos arquivos (ou os dois) Makefile, ou makefile que devem estar no CD que acompanha este livro, que usamos o make at e mesmo para imprimir uma lista de exerc cios e inclusive edit a-la, e vamos lhe mostrar aqui como. Mas o que est a dito em [11] e verdade. Com make podemos gerenciar a produ ca o de um pacote computacional, feito em C++, ou em qualquer outra linguagem de programa ca o, apenas, a comunidade dos C++-programmers est a bem afeita ao uso do make. Usando Makefile make e um programa origin ario dos sistemas Unix, e LinuX e Unix. Como praticamente tudo que roda em LinuX, foi desenvolvida uma vers ao do make que e o GnuMake que continua sendo rodado com o nome padr ao, make. Este programa l e um arquivo de congura ca o que tenha um dos nomes (nesta ordem) GNUmakele makele Makele Quer dizer que, se houver um arquivo com o nome GNUmakefile e outro com nome Makefile, ser a o GNUmakefile que ser a lido; se houver um arquivo com o nome makefile e outro com nome Makefile, ser a o makefile que ser a lido, que e o nosso caso porque usamos o arquivo makefile. Com certeza voc e tem o arquivo makefile no disco que acompanha o livro, e o que habitualmente usamos, e portanto n ao vale a pena falar dele uma vez que ele est a em constante evolu ca o. Leia este arquivo e observe que ele est a voltado para algum dos projetos deste livro. N ao altere este arquivo, apenas o leia. Altere Makefile a vontade, se car errado existe uma vers ao no CD. Se voc e mexer, indevidamente no makefile, h a tamb em uma vers ao no CD que voc e pode recuperar, a regra e, n ao tenha medo de experimentar, nem de 294

errar. Voc e somente vai aprender alguma coisa se aceitar cometer alguns erros. Alguns, n ao muitos! Vamos descrever o Makefile que, nunca usamos, e consequentemente est a congelado. Compare com makefile. Vamos lhe apresentar o arquivo chamado Makefile, por duas raz oes: qualquer altera ca o que fa camos nele por raz oes pedag ogicas, em nada afetar ao o nosso trabalho uma vez que ele tem baixa prioridade junto ao arquivo que usamos, makefile; logo podemos us a-lo para ns did aticos sem atrapalhar nossas rotinas; o arquivo makefile, que usamos, e mais recente e acompanhar a os demais programas distribu dos com o CD e voc e ter a assim uma vers ao mais recentes e mais testada para compara ca o. Mas o arquivo de dados makefile certamente ter a instru co es que n ao funcionar ao na m aquina que voc e estiver usando porque depende do conte udo das interessante, no seu aprenm aquinas que n os, os autores, estamos usando. E dizado, passar pelos erros que surgir ao ao usar o nosso makefile. J a zemos uma descri ca o inicial na lista de exerc cios. O arquivo consiste de diversas etiquetas que terminam com dois pontos. Voc e executa make indicando uma dessas etiquetas e ser a executada a parte de Makefile marcada pela etiqueta escolhida. A pr oxima lista de exerc cios vai funcionar como tutorial. Exerc cios 85 Tutorial sobre make 1. Experimente deslocar algum dos comandos do alinhamento do tab depois rode make -f Makefile prog O resultado deste comando e a compila c ao do programa fail02.cc que se encontra na etiqueta prog. poss 2. E vel obrigar o make a ler outro arquivo de congura c ao, dando-lhe a op c ao -f na linha de comando seguida do arquivo de congura c ao que se deseja, troque o nome Makefile por outro qualquer cp Makefile OutroQualquer e rode make -f OutroQualquer prog para ver que o resultado e o mesmo j a obtido antes. A vantagem dos nomes padronizado e que diminui a quantidade de texto para digitar. Digitando apenas make prog, no nosso caso, faz com que make use o nosso arquivo makefile.

295

3. Troque o programa fail02.cc na linha de pre-requesitos, por arquivo inexistente.cc (somente l a) e rode make -f Makefile prog o resultado e um erro, analise o erro e o signicado dos pre requesitos. 4. Inclua a regra rm prog no bloco de regras etiquetado por prog:. 5. Leia o Makefile cuja primeira etiqueta e prog:. Se voc e digitar make prog o programa ir a compilar fail02.cc e rodar o execut avel com uma lista de valores na linha de comandos. Os valores fazem parte do comando em Makefile. make clean ira apenas apagar o execut avel prog e parar. Voc e pode ver que temos diversos objetivos com Makefile, um deles e a edi ca o deste livro. Exerc cios 86 Usando make 1. Edite Makefile2 para editar, compilar e rodar o programa integral.cc 2. Crie as duas vari aveis CC=gcc, CFLAGS=-Wall -lm -oprog denidas no in cio de Makefile e altere o comando de compila c ao usando estas vari aveis. ao ir a procurar o arquivo Solu c ao: Makefile01 Observe que make n Makefile01 , se voc e quiser us a-lo, ter a que digitar make -f Makefile01 prog para compilar um programa usando Makefile01. Que e o make make e um aplicativo escrito na linguagem bash que e a shell do sistema operacional. make e um utilit ario escrito em bash, portanto us a-lo com as outras linguagens de shell pode ocasionar mal funcionamento. Aparentemente bash e o padr ao predominante de linguagem de script. Se voc e tornar Makefile execut avel, e rodar: chmod u+x Makefile ./Makefile
2 Se n ao houver outra das tr es, GNUmakefile, makefile, Makefile ser a esta a usada por make.

296

voc e vai ver que todos os comandos ser ao executados um em seguida ao outro. O make controla isto de modo que seja rodado apenas aquele que voc e tiver escolhido, quando, por exemplo, voc e digitar make prog ser ao apenas executados os comandos marcados pela etiqueta prog:. Como bash e um componente importante associado ao sistema operacional, sem d uvida e interessante compreender esta linguagem. Aprend e-la tem valor adicional. Como aprender a usar o make make usa tabulador como marca l ogica, portanto o que estiver indentado depende logicamente do conte udo da linha anterior. Leia Makefile01 observando que todos os comandos relativos prog, que formam o processo de edi ca o e compila ca o do programa fail02.cc. e o programa fail02.cc. Pr e-requesito Editor usa joe, troque pelo editor que voc e tem h abito de usar. Com esta regra edita o programa. es se chamam flags (marcadores) al Sistema de marcadores, que em ingl terando o modo de compila ca o. Observe que na primeira parte se encontram vari aveis (de bash que ser ao expandidas dentro das regras), veja como lendo Makefile01 na regra prog. Tr es regras marcadas por prog al em dos pr e-requesitos. A u ltima regra roda o execut avel criado pela regra anterior. cio de uma nova regra: edi ca o, a cria ca o do ex A tabula c ao marca o in ecut avel prog, execu ca o do programa compilado. Uma em cada linha, seq uencialmente. Linha muito grande Se uma linha precisar de ser muito grande (e desaparecer da janela de edi ca o) isto pode ser contornado com o comando (de bash) que e \que tem por efeito eliminar o line feed, o sinal de troca de linha produzido pelo enter. Analise o item backup em Makefile. Experimente fazer pequens altera co es, como colocar algum espa co antes de \ e rode make -f Makefile01 backup. A melhor forma de entender make e estudando bash. Se voc e quiser usar um atalho para evitar de estudar bash3, comece usando Makefile que est a no disco junto com os demais programas, e v a aos poucos alterando este exemplo para suas necessidades. Ser a como aprender a dirigir sem nunca tentar abrir o cap o do motor! Logo voc e vai se convencer de que um instrumento de grande valia, porque o ajuda a automatizar tarefas freq uentes e repetitivas.
3 Infelizmente

n ao podemos aprender tudo!

297

Finalmente, se voc e deseja aprender mais sobre make, leia o manual com info make e leve a s eria a observa ca o de ler apenas as primeira sess oes, numa primeira leitura deixando para se aprofundar numa segunda leitura. Voc e tamb em pode estudar a linguagem bash com o manual info digitando info bash

Um uso pr atico do make Vou ilustrar como usar make para construir um pequeno pacote. Depois disto voc e pode se aventurar (com cuidado) para entender alguns arquivos Makefile que voc e receba junto com programas que possa ter baixado na internet. Estes arquivos s ao exemplos avan cados de uso make, com aux lio de info make voc e poder a entend e-los. Observemos agora um exemplo que se encontra em Makefile02. Exerc cios 87 1. Rode make -f Makefile02 clean. O efeito ser a apagar algum execut avel de nome prog que exita no diret orio corrente. 2. Rode make -f Makefile02 prog. O efeito ser a compilar e rodar o programa raizesVar exec.cc . Este programa, ao rodar, faz duas coisas: edita a biblioteca funcao.h lhe permitindo alterar a equa c ao de uma fun c ao f ;

compila e roda o programa raizesVar.cc que faz uso da fun c ao f denida em funcao.h para calcular suas raizes, aproximadamente em um intervalo que voc e vai forncer. O arquivo Makefile02 roda depois o execut avel criado por raizesVar exec.cc. 3. Rode make -f Makefile02 edita, e voc e poder a ver o programa raizesVar.cc, se o editor joe estiver instalado no computador que voc e estiver usando. 4. Como compara c ao leia make grafico que n ao e um arquivo do tipo make. 5. Transforme make grafico em um arquivo do make Solu c ao: Makefile03

298

11.1.4

Onde procurar informa c oes - refer encias

Os dados que estou apresentando aqui foram colhidos basicamente de um site de refer encia, www.cplusplus.com. Vou me xar, nesta se ca o, num dos pontos mais obscuros nos livros de C++, e este aqui n ao foge a esta regra, que e a refer encia aos comandos acr escidos ` a linguagem, pelas bibliotecas. As raz oes para isto s ao simples: um livro de refer encia teria bem mais de mil p aginas, um verdadeiro cat alogo telef onico4 e ningu em est a disposto a escrever este livro. podemos encontrar em diversos sites, na Internet, estas refer encias e copi alas parcialemnte para arquivos para atender as nossas necessidades imediatas. Vou apenas mostrar um pouco do que voc e mesmo pode ir buscar atendendo ao que voc e precisar. A gura (6.1) p agina 193, e um exemplo disto, e tudo que z foi deix a-la melhor organizada para que voc e possa exib -la na tela do computador quando estiver estudando streams. Ela se encontra no CD num dos arquivos ios.png, ios.eps, portanto em dois formatos. Vou tamb em me concentrar nas informa co es desta gura, mas no site www.cplusplus.com voc e encontrar a refer encia para todas a bibliotecas da linguagem C++ o que inclue as biliotecas da linguagem C que fazem parte integrante de C++, est ao dispon veis. A linguagem dos textos em www.cplusplus.com e muito t ecnica e naturalmente a refer encia a este site est a bem colocada aqui no m do livro, para lhe indicar que a partir daqui voc e est a come cando a sua vida em C++. Mas n ao se assuste, eu ainda sou um aprendiz e venci h a pouco tempo as diculdades com a forma t ecnica com que as ajudas se apresentam. N ao h a outra sa da, tudo que tem ser dito, tem que ser feito em poucas palavras e n ao pode haver ambiguidade. Classes de i/o Uma lista das classes dispon veis e e um modelo Duas classes b asicas ios base, ios, na verdade a primeira uma forma para produzir classes, mais uma abstra ca o da linguagem que n ao foi discutida neste livro. As classes que os programas v ao usar: istream, ostream, iostream, ifstream, ofstream, fstream Classes para representar texto dirigido para os dispositivos, em geral arquivos em disco: istringstream, ostringstream, stringstream Classes para armazenamento tempor ario - associadas com o termo buffer: streambuf, filebuf, stringbuf Alguns objetos se encontram denidos, e os nossos programas j a zeram uso intensivo deles:
4E

os cat alogos telef onicos nem existem mais.

299

cin, cout, cerr, clog N ao teria sentido copiar aqui o que voc e pode ver comparecendo ` a p agina www.cplusplus.com. L a voc e pode encontrar a descri ca o e sintaxe destes elementos. Acho que cumpri com o meu objetivo lhe mostrando onde encontrar os dados. Vou me limitar a alguns exemplos para que voc e tenha uma id eia concreta do que pode encontrar.

Manipuladores: boolalpha dec endl ends xed ush hex internal left noboolalpha noshowbase noshowpoint noshowpos noskipws nounitbuf nouppercase oct resetiosags right scientic setbase Manipuladores: setll setiosags setprecision setw showbase showpoint showpos skipws unitbuf uppercase ws

alfanum erico, valores booleanos Usar base decimal Inserir caracter de nova linha e limpa Inserir caracter NULL usar nota ca o de ponto utuante limpa bufer de stream Usar base hexadecimal Ajuste do campo insere carateres em posi cao interna Aduste do output para esquerda n ao e valor alfanumerico booleano inibe a mostra de prexos de base num erica n ao mostra ponto decimal n ao mostra o sinal positivo n ao omite espa cos em branco n ao for ca limpeza depois de inser ca o n ao gera letra mai uscula Usar base octal reseta etiqueta de formata ca o Ajuste do output para direita Usar nota ca o cient ca liga etiqueta da base (numera ca o) dene caracter de preenchimento liga etiqueta de formata ca o liga precis ao decimal dene tamanho do campo mostra prexos de base num erica mostra ponto decimal mostra sinal positive pula espa cos em branco limpa buer depois de inser ca o Gera letra mai uscula Extrai espa cos em branco (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o

(fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o (fun ca o

descri ca o manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora)

descri ca o manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora) manipuladora)

11.1.5

O que e compilador

Vou falar aqui de compila c ao e sobre o sistema operacional . Qualquer destes dois assuntos merece um livro separado, portanto seja indulgente se voc e concluir que o autor e supercial.

Uma linguagem de programa ca o e uma linguagem articial, muito reduzida, 300

projetada para estabelecer a comunica ca o entre humanos e m aquinas. Como as m aquinas ainda n ao podem reconhecer (facilmente) a paisagem, nas linguagens de programa ca o ainda n ao tem comandos do tipo olhe. Os comandos s ao do tipo imperativos escreva, leia . . . l ogicos se, enquanto, . . . Um programa e o resultado de um processo de engenharia computacional em que a autora (programadora) pensou em todas as alternativas que o usu ario poderia precisar para que um certo objetivo fosse alcan cado. Por exemplo, um desses programas e o sistema operacional. Ele e construido com uma linguagem de programa ca o. Linux foi escrito em C, por exemplo, sendo mais espec co, Linux n ao foi escrito em C++! O sistema operacional O primeiro programa que o computador roda e o sistema operacional . E o programa que controla e organiza os recursos da m aquiona: tela, mem oria, discos, impressora, teclado, . . . enm, os dispostivos de entrada de dados; os dispostivos de sa da de dados. Por exemplo Linux e um sistema operacional de dom nio p ublico, voc e pode usar Linux apenas gastando dinheiro com a compra do meio em que ele e distribuido, alguns CDs (ou baixando na Internet). Mas o sistema operacional sabe gerenciar o computador, mas n ao sabe se preciso um segundo programa que comunicar com o usu ario do computador. E fa ca esta comunica ca o. Nos sistemas rodando Linux isto e feito com um programa chamado bash que e uma linguagem de programa c ao interpretada e uma linguagem de terminais, (em ingl es, shell language). Quando voc e liga o computador primeiro, um pequeno programa, produzido pelo fabricante da placa principal do computador, a placa m ae, verica se tudo est a OK e passa o controle para um disco, por exemplo o HD, onde ele espera que esteja o sistema operacional no disco, existe um primeiro setor que cont em o processo de incializa ca o do disco e passa o controle para um programa que se chama carregador de boots, em Linux costuma ser o grub ou LILO, porque voc e pode ter diversos sistemas instalados no disco. Este programa permite que voc e escolha qual sistema quer usar e passa o controle para este sistema.

301

se voc e escolher Linux ent ao este sistema e expandido para um setor da mem oria e o bash e chamado para fazer a comunica ca o entre o sistema e os diversos perif ericos (o que inclui, voc e, usu ario, atrav es do teclado, por exemplo). Foi uma descri ca o muito sum aria, porque ainda tem o sistema gr aco, o X que e o que usamos (aparentemente), porque na verdade estamos usando bash, ele que se manifesta quando h atrav es de janelas gr acas. E a um erro. bash Mas deixe-me falar um pouquinho do bash, n ao porque eu deseje que voc e domine esta linguagem, ou que isto seja necess ario, mas porque ela e uma linguagem interpretada e desejamos comparar com as linguagem compiladas como e o caso do C++. H a v arias linguagens interpretadas dispon veis, como Python, Perl, TCL ou bash. Quando uma linguagem interpretada e chamada, ela toma conta do computador ou de uma shell pelo menos. Ela passa a agir de forma interativa com o que faz calc, que voc o usu ario. E e j a deve ter usado diversas vezes. Voc e digita um comando, a e linguagem interpreta o comando, e lhe d a uma resposta. Quando voc e digita ls numa shell, ou dir, voc e se comunicou com bash, e um comando desta linguagem, que resulta numa listagens dos arquivos do diret orio corrente. Vc e est a falando com bash. Vamos ver a diferen ca com uma linguagem compilada, como C++. O compilador Escondi este t opico aqui, no nal do livro, anal no cap tulo de refer encias. Mas voc e poder a encontr a-lo de volta, a qualquer momento, usando o ndice remissivo. Vou falar aqui um pouco sobre o acontece com a compila ca o. Voc e pode ler muito mais a respeito consultando info gcc que e a minha fonte de consulta habitual. Observe que gcc inclui g++ ele pode chamar v arios compiladores. Voc e n ao se comunica diretamente com uma linguagem compilada. Primeiro voc e escreve um programa, usando um editor de textos e grava este programa num disco. Depois voc e chama o compilador, na verdade o compilador tem um nome, como gcc ou g++ que se transformou num comando do bash. com a linguagem bash que voc E e se comunica digitando g++ -Wall -oprog meu program.cc ela passa os comandos -Wall -oprog meu program.cc para um comando que ela conhece, g++, ao mesmo tempo que ela executa g++.

302

O resultado desta opera ca o e a cria ca o de um novo comando, prog que bash ir a reconhecer como execut avel, e que ir a executar quando voc e o acionar. Portanto as linguagem compiladas criam comandos que bash ir a executar. Claro, g++ n ao apenas cria um novo comando. O compilador examina o c odigo que voc e escreveu e verica se ele n ao tem erros de sintaxe da lingua, e eventualmente alguns erros l ogicos que ele pode detectar, e se a conclus ao for positiva, ele cria o execut avel prog. Ao criar o execut avel, g++, inclue todos os mecanismos da linguagem que forem necess arios e a partir deste momento voc e n ao precisa mais de g++ at e quando for criar um outro programa. E como prog foi criado em uma m aquina que roda Linux, ele ir a roda em qualquer outra m aquina do mesmo tipo, que rodar Linux. Ou ent ao voc e poder a voltar a compilar, usando g++, para criar um execut avel em outro tipo de m aquina. Usando g++, ou outro qualquer compilador da linguagem C++, porque h a v arios. Deixe-me sugerir um pequeno exerc cio5. Certo! Vou chamar de experimento. Escolha um programa qualquer, por exemplo polped.cc que tem mais coment arios do que c odigo. N ao z as contas, mas acho que 70% do texto do programa e coment ario. Experimente fazer o seguinte: g++ -c polped.cc- opolped.o -Wall e depois leia o arquivo polped.o com um editor de textos. Voc e vai logo encontrar no come co uma estat stica concisa dos recursos que o programa utiliza, as primeiras 10 linhas. Depois vir a uma an alise extensiva do programa que algum dia voc e poder a at e entender, mas n ao tente entend e-la agora. Fa ca uma primeira leitura, apenas! Mas o que desejo lhe mostrar e o nal do arquivo. V a para o nal do arquivo. L a no nal voc e vai encontrar o programa limpinho, sem nenhum coment ario. Verique! . Quer dizer, se por alguma raz ao os meus coment arios estiverem o incomodando, se voc e quiser ver o programa sem coment arios para que voc e pense sozinho no que est a acontecendo, execute g++ -c programa.cc -oprograma.o -Wall pule a parte inicial, ou mesmo apague a parte inicial de programa.o e voc e ter a ao nal o programa limpinho. Mas n ao era bem isto que eu queria dizer-lhe, o que eu queria era mostrarlhe o que o compilador faz com os coment arios: os ignora. Portanto coloque, abundantemente, coment arios em seus programas, para que voc e os consiga entender facilmente depois. Eles n ao representar ao absolutamente nada para compilador que, sem nenhuma cortesia, os vai apagar.
5 Um

exerc cio num cap tulo de refer encia ?

303

11.1.6

Para onde vai return(n)

Fiz v arias refer encias ao valor do return() nos programas. Aqui vou falar rapidamente, apenas para que voc e saiba que isto existe, e depois procure mais informa co es quando chegar a hora certa. Esta e uma caracteristica singular da linguagem C++, n ao conhe co outra linguagem de programa ca o que tenha esta propriedade de forma natural. Os programas podem registrar numa vari avel do sistema operacional um valor para ser usado em algum momento como informa ca o sobre o funcionamento do programa. Falei acima, na hora certa porque, para voc e que terminou de ler este livro (ou est a lendo este cap tulo numa primeira leitura) certamente vai ter pouca utilidade para esta funcionalidade de imediato. Programas mais complicados, em sua fase de produ ca o produzem mais erros que do que coisa u til, e e normal, n ao? ent ao as programadoras e programadores, precisam de obter informa ca o sobre como est a funcionando o programa, ou mais exatamente uma determinado m etodo. Uma forma simples de o fazer e colocar dentro do m etodo um switch() com alguns casos case poss veis (ou imposs veis) na part nal do m etodo, cada um contendo um return() com um n umero diferente. Desta forma a programadora pode depois identicar se o m etodo est a funcionando como se espera. Eu tenho certeza de que esta explica ca o n ao est a inteiramente clara, mas tamb em tenho certeza de que quando voc e precisar, ela vai lhe parecer clara. Anote onde se encontra no ndice remissivo e volte quando precisar. o valor do return() no E ndice remissivo. Em Linux este valor ca guardado na vari avel ?, e voc e o pode assessar com o comando echo $? Eu j a disse em v arios lugares no livro, quando voc e usa o sistema operacional, na verdade voc e n ao se comunica com o sistema e sim com uma linguagem de terminal - shell script, que nos sistemas rodando Linux e bash ou uma variante desta linguagem.

11.1.7

Entrada e sa da de dados

Etiquetas de acesso aos arquivos As constantes (etiquetas) da classe ios Modo de usar estas etiquestas: ios::etiqueta. 1. acrescentando nova informa ca o app 2. vai par m do arquivo ate - signica, em ingl es para o m - att the end. 3. abre o arquivo em modo bin ario binary em oposto ao modo texto que e o default

304

4. abre o arquivo para entrada de dados - input in 5. n ao cria arquivo novo nocreate 6. n ao substitui um arquivo existente noreplace 7. abre o arquivo para sa da de dados out 8. abre o arquivo e substitui os dados com os novos trunc Entrada de sa da de dados

11.2

Entrada e sa da de dados

Objeto que representa o uxo de entrada de dados padr ao. H a duas biliotecas da linguagem C que foram convenientemente aproveitadas pela linguagem C++ que s ao cstdio stdin A programadora e o programador em C++ n ao precisa saber nada de C para fazer uso destas biliotecas pois est ao traduzidas para a nova linguagem. E bom saber que elas existem. Em particular e bom saber como as coisas funcionam, mesmo que nunca se venha a fazer uso direto delas, e anal, se for preciso, saber onde podem ser encontradas. O padr ao de entrada de dados de qualquer sistema e o teclado, cin e a sa da de dados, cout o terminal de v deo ou cristal l quido. Mas h a muitos casos em que isto deve ser alterado. Os casos mais comuns para programas e que se alterem sa da ou entrada para arquivos. Com grep arquivo *.cc voc e vai ter uma grande quantidade de exemplos de como alterar a sa da ou a entrada de dados para um arquivo. Com grep cin *.cc voc e vai encontrar diversos programas mostrando-lhe o uso de cin e com grep cout *.cc voc e vai encontrar diversos programas mostrando-lhe o uso de cout.

11.2.1

Main() gr aca

Um dos desenvolvimentos que lhe podem interessar a partir deste livro e a produ ca o de m ascaras gr acas para programas escritos em C++ Vou me resumir a alguns indicativos.

A linguagem C++ est a preparada para ser imersa em uma m ascara gr aca que a fa ca funcionar com todos os efeitos de bot oes e tiras dos widgets.

305

widgets e uma palavra inventada, e possivelmente ningu em sabe quem eo autor e nem exatamente a etmologia. Possivelmente vem de windows e de get, procure na wikipedia e quer dizer uma janela com bot oes para acionar alguma coisa (aqui entra o get). H a algumas linguagens de programa ca o que foram desenvolvidas para preparar estes widgets. TCL - Tools Command Language, e possivelmente a mais antiga e um pouco rudimentar talvez, mas funciona bem para criar bot oes que com os quais se podem rodar os m etodos dos objetos de um programa. Algumas e referenciada como TCL-Tk. Este e um sistema inteiramente de c odigo aberto e distribuido sob a GPL GDK e um sistema que funciona no Gnome um dos sistemas gr acos que e usado para gerenciar o desktop nos computadores rodando Linux. Este e um sistema inteiramente de c odigo aberto e distribuido sob a GPL Qt 4 e a vers ao 4 do Qt e um outro sistema para fazer janelas gr acas. E vendido mas sempre a vers ao anterior e liberada como se fosse de dom nio p ublico. Com qualquer um dos sistemas que descrevi acima voc e pode substituir a fun ca o main() por uma m ascara gr aca para gerenciar o acesso aos distintos objetos do seu programa usando bot oes.

306

Refer encias Bibliogr acas


[1] C++ Annotations Vers ao 6.5.0 - 2006 Computing Center - Universidade de Groningen www.icce.rug.nl/documents/cplusplus/ [2] Bell, David I. e Landon Curt Noll et alli CALC - An arbitrary precision calculator - Debian GNULinux distribution http://www.debian.org ou a p agina do mantenedor do projeto, http://isthe.com/chongo/tech/comp/calc/ [3] Um site de refer encias r apidas - o cplusplus. http://www.cplusplus.com/ref [4] Comprehensive TeX Archive Network uma rede de sites-espelhos onde se A pode encontrar os programas dos sistemas TEX e L TEX. http://www.ctan.org/ [5] Thomas Williams, Colin Kelley e muitos outros gnuplot, um programa para fazer gr acos http://www.gnuplot.info/ [6] Hubbard, John R. Theory and Problems of Fundamentals of Computing with C++ Schaums outline series - McGraw-Hill - 1998 [7] Jargas, Aur elio M. Express oes regulares - Revista do Linux - Mar co 2000, p agina 48 e Julho 2000, p agina 32 [8] Joes Own Editor v3.5 http://sourceforge.net/projects/joe-editor

307

[9] Loudon, Kyle Mastering Algorithms with C - OReilly - 1999 - primeira edi ca o. - bem escrito, avan cado
A [10] L TEX Uma linguagem para preparar documentos

Leslie Lamport http://www.ctan.org/ [11] Bill Ball, Davis Pitts et al. Linux, Unleashed SAMS publishing - 1999. [12] Praciano-Pereira, T. C alculo Num erico Computacional Notas de aula http://www.lmc.sobralmatematica.org/livros [13] Praciano-Pereira, T. Universidade C Editora Digerati - S erie Universidade - 2005 - primeira leitura. [14] SourceForge O maior site para desenvolvimento de programa c ao aberta Worlds largest Open Source software development web site http://sourceforge.net/index.php [15] Tan Kiat Shi, Willi-Hans Steeb and Yorick Hardy Symbolic C++ an introduction to computer algebra using object oriented programming - 2nd extended and revised edition - Springer - 2000 - 671 p aginas. Os cinco primeiros cap tulos revisam, inutilmente, C++, Java Oberon, Smaltalk, Eifel, come cando com a introdu ca o de algebra computacional no sexto cap tulo, mas e interessante como uma amostra do uso de C++. [16] The Open Group, Making Standards Work http://www.opengroup.org [17] Wikipedia A enciclop edia livre na internet www.wikipedia.org [18] Uma plataforma para organizar e inclusive programar http://wiki.opengarden.org/Sandbox

308

Indice Remissivo
===, 93 ==, 92 , 74 , 74 ,, 68 ==, 93 ndice criando o seu, 288 \, 68 \n, 11 A L TEX , 271 TEX, 271 , 68 =, 67, 68 C++ string, 138 *, 69 *=, 59 +, 71 ++, 59, 71, 108 ++a, 59 +=, 59 -, 71 --, 59, 71 -=, 59 ->, 71 /, 69, 71 //, 69 /=, 59 <, 65, 72 <<, 72 <<=, 59 <=, 65, 73 =, 69 = e ==, 63 =<, 65 ==, 63, 66, 69, 74 =>, 65 >, 65, 74 >=, 65, 74 >>, 73 >>=, 59 ?:, 74 C-string, 138 C-strings C++strings, 175, 205 GDK, 306 Qt, 306 TCL, 306 %, 69 %=, 59 &&, 67 { } , 74 a++, 59 max size, 138 C++ entende C, 8 64 bits, 141 \, 137 a.out, 4 aberta senten ca, 66 abstra c~ ao, 49, 112, 131, 184, 191, 235 abstra c~ ao e seguran ca, 167 acervo ordena c~ ao, 163 prefeitura, 163 acessar arquivo, 180 acesso, 235 arquivo, 252 controle, 220, 221, 228 309

acesso a ponteiro, 169 acesso ao disco iostream, 177 acumulador, 96 adi c~ ao int, 55 limita c~ ao, 55 ponteiro, 171 advert^ encia, 264 erro, 91 agenda telef^ onica, 28, 146 alfabeto, 134 apagando a tela, 10 apeteco2() Ambiente.h, 86 app, 252 arquivo ap^ endice, 204 argc, argv, 175 argumento linha de comando, 128 aritm etica, xi aritm eticas opera c~ ao ponteiro, 169 opera c~ oes, 68 aritm eticos operadores, 68 arquivo, 28, 180, 184 ap^ endice ios::app, 204 exist^ encia, 203 uso de , 199 arquivos dados, 280 arquivos de texto entrada de dados, 208 arrog^ ancia corrup c~ ao, 156 ASCII, 136, 138, 140 tabela, 135 assembler, 92, 173 assunto programa, 50 atalho i++, 108

i++, 108 atalhos, 59, 111 atalhos aritm eticos, 59 atol(), 129 atribui c~ ao igualdade, 97 atribui c~ ao, 49, 69, 86, 87, 92 com incremento, 71 atribui c~ ao indireta, 169 atributo de arquivo, 41 autom atica vari avel, 189 autoriza c~ ao, 230 avalia c~ ao, 67, 92 operador, 64 aviso, 13 bash, 293, 298, 302--304 BASIC, 42 beep, 68 biblioteca, 102, 299 bibliotecas, 8 bit, 140, 141, 184 byte, 168 bit-l ogicos operadores, 72 bloco espa co de nomes, 152 vari avel local, 152 bloco l ogico, 117 bloco l ogico, 110, 120 break, 65, 104, 105, 110 desnecess ario, 104 return(), 110 break, pare, 79 budistas monges, 156 buffer, 96 aditivo, 96 multiplicativo, 96 bugs, 93 byte, 141, 184 bit, 168 C-string 310

string, 138 c str(), 177 c odigo, 134 c odigo fonte, 4, 24 c opias de reserva, 241 caixa alta, gcc, 95 baixa, gcc, 95 calc, 51, 53, 55, 69, 106, 107 main(), 53 struct, 53 calculadora, 24, 241, 253 calloc(), 187 capsula, 237 caractere, 134 de controle, 184 caracteres, 139 cadeias, 177 num ericos, 138 vetor, 138, 184 caracteres espciais, 186 caracteres especiais, 137 carro c~ ao, 56 cast, 55 type, 54 chave palavras, 50, 136, 205, 289 chaves bloco l ogico, 148 chmod, 41 cin, 41, 208, 305 cin.get(), 41 classe, 9, 16, 211, 237 string, 204 classe Areas, 124 classe derivada, 43 classe filha, 236 classe m~ ae, 236 classe-filha, 43 classe-m~ ae, 43 classes, xi prot otipo, 219 codificar, 134 colateral efeito, 91--94 coma

erro, 68 comando, 13 criar, 13 par^ ametro, 174 comando composto, 59 comandos arquivo de, 251 comandos, linha, 4 coment ario, 5, 93, 303 coment arios, 3, 61, 102 para testar, 100 perda de tempo, 119 que faz o compilador, 303 compila, 92 compila c~ ao, 4, 303 automatizada, 291 avisos, 91 diretiva, 74, 75 erro, 281 est atica, 173 op c~ oes, 4 compilada linguagem, 302 compilador, 4, 300, 302 coment arios, 303 enganado, 91 complexidade, 155 comportamento algoritmo, 156 composto comando, 59 const, 162 constantes, 162 constructor, 234 contador base 0, 97 base 1, 97 contexto sintaxe, 175 contra-barra mudan ca de linha, 91 controle caracteres de, 186 controle de acesso, 221, 228 convers~ ao dados, 55 311

cor, 134 corrup c~ ao arrog^ ancia, 156 cout, 41 CTAN, 271 ctrl-c, 109 d gito, 134 d gitos, 134 dados convers~ ao, 54, 55 entrada, 41, 76, 192 io, 192 sa da, 41, 192 tamanho, 140 tipo, 140, 178 tipo de, 49 tipos, 143 declarativa linguagem, 92 decodificar, 134 decremento, 61, 71 default, 104, 105 valor, 19, 127 define, 74 depura c~ ao de programas, 102 derivada classe, 223, 235 derivada, classe, 234 desigualdade, 22 dimens~ ao de matriz, 176 din^ amica mem oria, 174 din^ amico em disco, 176 mem oria, 176 diretiva de compila c~ ao, 8 disco acesso, 28 disjun c~ ao l ogica, 67 divis~ ao, 58 euclidiana, 69 divis~ ao inteira, 58 do while(), 103

do while(), fa ca enquanto(), 79 double tipo, 56 editor corromper, 292 efeito colateral, 92--94 else, 22, 81 ponto-e-v rgula, 22 encapsulamento, 43, 235, 237 endere co ponteiro, 163 endif, 74 enfeites, 102 enganando compilador, 91 enquanto(), 95, 109 enquanto(), while(), 79 entrada de dados, 41, 44, 76 texto, 208 equa c~ ao, 11 equa c~ oes sistemas, xi errado falando, 163 erro advert^ encia, 91 an alise do compilador, 82 compila c~ ao, 281 compilador, 84 de sintaxe, 92 em tempo de execu c~ ao, 31 experi^ encia, 294 l ogico, 92 ponto-e-v rgula, 82 programa, 166 sintaxe, 92 escape caractere, 137 escape characters, 68 escolha()/caso, switch()/case, 79 escravo programa, 174, 266 espa co de nomes, 151 espa co mem oria, 54 312

espa co de nomes, 139, 140, 151 especiais caracteres, 186 Espy, xii est atica compil c~ ao, 173 estrutura, 143 m etodo, 144 etiqueta flag, 208 euclidiana divis~ ao, 69 execu c~ ao erro, 31 ordem comando composto, 59 planejamento, 145 execut avel, 4, 41 g++, 7 gcc, 7 executa depois testa, 103 exemplo de fun c~ ao, 116 exist^ encia arquivo, 203 express~ ao avalia c~ ao, 92 extra c~ ao extraction cin >>, 124 operador, 44 extraction, 124 fa ca enquanto(), do while(), 79 falar como aprendeu, 8 falso, 133 em C, 80, 82, 89, 94 o valor de, 90 verdadeiro, 80 fatorial incompleto, 86 fault, segmentation, 140 feed line, 297 figura BASIC, 115 cin, 199

classe, 224 Garrafa, 225 classe derivada, 237 Fluxograma, 283 fluxograma, 89, 90, 100 programa c~ ao, 44 for(), calc, 107 funcao, 116 garra modelo, 222 Garrafa, 226 garrafa objeto, 231 i/o, 193 if()/else, 81 ios, 195 Makefile, 292 menu, 26 plano complexo, 247 ponteiro, 165 pot^ encias de i, 244 programa, 3, 118 programa em BASIC, 42 switch(), 27, 104 vari avel global, 157 vari avel, 184, 185 vari avel global, 159 Vari avel Local, 153 vari avel local, 158 while(), 96 FILE arquivo em disco, 168 filha classe, 235 flag etiqueta, 208 float, 22, 131, 132 fluxograma, 44, 88, 150 fluxogramas, 44 fonte c odigo, 4 for(), 106, 109 while, 108 for(), para(), 79 for cando sa da, 110 313

grep, 50 formata c~ ao grub, 301 n umeros, 145 fprintf() heran ca, 41, 223, 234, 235 arquivo, 168 protected, 234 frases, 28 hier arquica free(), 187 associa c~ ao, 144 malloc(), 176 hierarquia friends, 236 opera c~ oes, 49, 71 FSF, 50 opera c ~ oes aritm eticas, 49 fun c~ ao horas perdidas, 93 exemplo, 116 ponteiro, 166 i/o fun c~ ao-ponteiro, 172 entrada/sa da, 299 fun c~ ao, 12, 13, 41, 88, 235, 248 identificador, 184, 187, 189 e m etodo, 238 if() else passando valor, 178 ponto e v rgula, 83 tutorial, 13 if(), se(), 79 uso, 88 if(),else, 79 fun c~ ao composta, 159 if(),se(), 79 fun c~ ao e m etodo, 255 if()/else, 89 fun c~ ao manipuladora, 300 if()/else, se()/senao, 79 uma tabela, 300 if/else, 90 fun c~ ao ponteiro, 120 ifdef, 74 fun c~ oes, x ifndef, 74 fun c~ oes executoras, 255 igual fun cao, 12 n~ ao, 67, 68 funcao, 271 igualdade, 41, 43 atribui c~ ao, 97 g++, 4, 93 problema, 12 gcc, 8, 50 teste, 92 global imperativa vari avel, 161, 162 linguagem, 92, 93 global, vari avel, 147 imprimir %, 137 GNU, 4 in line, 224 GNUmakefile, 294 incializar vari avel, 142 gnuplot, 259, 262, 271 include, 8 calculadora gr afica, 259 incremento, 59, 71, 97 fun c~ oes recursivas, 259 seguido de atribui c~ ao, 71 linguagem de programa c~ ao, 259 indefinida gosub, 114 quantidade de argumentos, 130 GPL, 261 indireta gr afica atribui c~ ao, 169 calculadora, 253 infinito m ascara, 305 loop, 161 gr aficos, 242 info, 289, 298 gr agicos, xi 314

informa c~ ao tamanho, 184 inicializa c~ ao vari avel, 151 inicializa c~ ao, 96 inicializador, 234 inline, 144, 184, 187, 224 input, 44 inser c~ ao insertion,cout <<, 124 operador, 44 insertion, 124 insetos, 93 inst^ ancia, 9, 214, 223, 235 int, 131, 132 tipo de dado, 49 intermedi aria vari avel, 119 Internet programa c~ ao, 289 interpretada linguagem, 301, 302 interpretado calc, 106 interrup c~ ao, 110 io, 192 ios etiquetas, 304 iostream acesso ao disco, 177 Java, 211 joe, 261 Knuth web, 46 l ogico bloco, 117 bloco, come co, 97 bloco, fim, 97 l ogicos operadores, 63 l ogica, x, 76, 79, 94 conjun c~ ao, 22 disjun c~ ao, 67

programa c~ ao em, 292 l ogicas opera c~ oes, 68 l ogico bloco, 110, 120 l ogicos operadores, 68 la co, 106 condi c~ ao, 97 leitura, 280 letra, 134 mai uscula, gcc, 95 min uscula, gcc, 95 LHS RHS, 187 lhs, rhs, 41 LILO, 301 limpando coment arios, 303 limpeza tela, 11 line feed, 297 linguagem, 134 de terminal, 302 de programa c~ ao, 301 de terminal, 303 linguagem compilada, 302 linguagem interpretada, 302 linha quebra, 91 linha de comando argumentos, 128 par^ ametro, 128 valor, 175 linha de comandos, 4 Linux, 28, 301, 304 linux, 8 listagem programas, 50 local vari avel, 117 vari avel, 117, 229 loop, 106 condi c~ ao, 97 loop infinito, 150, 161

315

m ascara gr afica, 305 m edia aritm etica, 87 m etodo, 43, 235, 248 C-texto, C++-texto, 177 e fun c~ ao, 238 m etodo e fun c~ ao, 255 m etodos, 16, 211, 213, 219 m odulos, 192 m ultiplos return(), 84 macro, 74, 139, 184, 187, 189 mai uscula min uscula, 137 main() void, 82 make, 291, 298 Makefile, 291, 293, 294 makefile, 291, 293, 294 etiqueta, 293 o nome, 295, 296 regras, 292 tabulador, 293 malloc(), 187 free(), 176 man, 289 manipuladores sa da de dados, 200, 201 manual no micro, 289 manual do compilador, 4 manuten c~ ao programas, 127 massa mem oria de, 30, 31 master programa, 174, 266 matriz, 145, 146, 175 dimens~ ao, 176 float, 146 int, 145 pessoa, 146 mem oria din^ amica, 176 em disco, 176 gerenciamento, 186 mem oria de massa, 30, 31

mem oria, gerenciamento, 186 membro, 235, 271 membros, 211, 213, 219 mensagem para um objeto, 237 mensagens, 102 min uscula mai uscula, 137 modelo, 286 modula a linguagem, 192 modulariza c~ ao, 147 mudan ca de linha contra-barra, 91 n vel mais alto, 9 mais baixo, 9 n vel alto, 139 n vel baixo, 139 n umero, 49, 134 n umero inteiro, 132 n umeros formata c~ ao, 145 n~ ao igual, 67, 68 nega c~ ao, 67 nega c~ ao l ogica, 68 nome vari avel, 136, 154 nomes espa co de, 151 espa co, 151 espa co de, 140 nomes, espa co de, 139 not, 68 nota c~ ao polonesa, 282 nova linha, 297 NULL, 129, 187 nulo caractere, 68 numero racional, 132 numero ptr, 167 objeto, 8, 9, 43, 44, 219, 235, 271 capsula, 238 estado, 237 316

localiza c~ ao, 238 mensagem, 237, 238 private, 238 public, 238 objetos matem aticos, 132 op c~ oes compila c~ ao, 4 opera c~ ao preced^ encia, 56 opera c~ ao, ponteiro, 170 opera c~ oes aritm eticas, 68 hierarquia, 48, 49 l ogicas, 68 prioridade, 48 operacional sistem, 304 operador &&, 67 aritm etico, 48 atribui c~ ao, 49 avalia c~ ao, 64, 67 fun c~ ao, 87 funcao, 80 par^ enteses, 91 programa, 50 operador de resolu c~ ao, 184, 187 operador extra c~ ao, 41 operador inser c~ ao, 41 operadores, x, 47, 68 aritm eticas, 68 bit-l ogicos, 72 l ogicos, 63 l ogicos, 68 ordena c~ ao acervo, 163 out, 252 output, 44 overload, 53, 235, 249 p os incremento, 59 p ublic, 228 padr~ ao valor, 127 vari avel, 19 padroniza c~ ao, 171

palavra, 184 palavras, 28 palavras chave, 50, 136, 205, 288, 289 palavras reservadas, 289 par^ ametro linha de comando, 128 par^ enteses operador, 91 parada teste, 108 paradigma, 286 pare, 110 pare, break, 79 Pascal free, 98 livre, 98 passagem de valor, 159 return, 160 passando valores, 88 passando valor, 120 por refer^ encia, 172 pequenas altera c~ oes erros, 281 percentagem imprimir, 137 perda de tempo coment arios, 119 plajenamnto lista de tarefas, 278 primeira vers~ ao, 278 prioridades, 278 teste da vers~ ao beta, 278 vers~ ao beta, 278 planejamento, 41, 44, 121 execu c~ ao, 145 programa c~ ao, 278 vazio, 84--86 polimorfismo, 53, 207, 235 ponteiro, 162, 163, 165, 184 acesso, 169 associa c~ ao endere co, 169, 170 declara c~ ao, 164, 165 endere co, 165 317

FILE, 168 float, 164 fun c~ ao, 166 fun c~ ao, 120 int, 164 numero ptr, 167 opera c~ ao, 169, 170 opera c~ ao l ogica, 171 par^ ametro, 120 soma, 171 subtra c~ ao, 171 tutorial, 166 vari avel global, 167 ponteiros, 183 para fun c~ ao, 172 riscos, 163 vetores, 178 ponto e v rgula, 41, 45 ponto-e-v rgula, 5, 45 pot^ encia fun c~ ao, 56 pow(), 56 pr e incremento, 59 preced^ encia opera c~ oes, 56 printf() tabula c~ ao, 98, 99 private, 221, 228, 236 class, 220 corpo humano, 238 default, 221 objeto, 238 private: public:, 286 problema igualdade, 12 processamento interrup c~ ao, 110 produto, 56 profundidade n vel, 155 programa assunto, 50 depura c~ ao, 102 escravo, 174, 266 listagem, 50

master, 174, 266 operador, 50 primeiro, ix ruim, 155 programa c~ ao, 76 em l ogica, 292 Internet, 289 linguagem, 301 planejamento, 278 programas usados no livro, 261 programas, listagem, 50 programmer C, 94 projetos, xi, 241 prot otipo, 14, 126, 162, 222 prot otipos classes, 219 protected, 234, 236 public, 221, 236 class, 220 corpo humano, 238 objeto, 238 public: private:, 286 quantida de argumentos indefinida, 130 quebra de linha, 91 quociente resto, 69 realloc(), 187 recebe, 98 reciclagem, 223 recuperando return(), 229 refer^ encia passando valor, 172 refer^ encias, xi, 242, 288 registro, 143 rela c~ ao, 133 reservadas palavras, 289 resolu c~ ao 318

operador, 184, 187 resolver equa c~ ao, 66 resto quociente, 69 return passagem de valor, 160 significado, 158 return(), 41, 45, 304 break, 110 como recuperar, 229 m ultiplos, 84 onde vai o valor, 304 valor, 304 return(), voltar(), 79 reutiliza c~ ao, 34 programas, 127 RHS LHS, 189 rhs, lhs, 41 s mbolo, 189 s mbolo, 132--134, 184 ilegal, 134 legal, 134 s mbolos regras, 134 sa da padr~ ao, 92 sa da de dados, 41, 44 manipuladores, 200, 201 sa da for cada, 110 se(), if(), 79 se(),if(), 79 se(),senao, 79 se()/senao, if()/else, 79 secreta chave, 73 segmentation fault, 140, 167 seguran ca e abstra c~ ao, 167 senten ca, 133 senten cas, 5 shell, 3 language, 301 sintaxe, 79, 134 pelo contexto, 175

sistema de arquivos, 41 sistema operaciona, 304 sistema operacional, 300, 301 sistemas lineares, 242 sites uteis, 289 sobrecarga, 53, 249 som, 68, 134 sscanf(), 208 standard output, 92 stream, 124 Streams, 29 string, 54 C-string, 138 class, 204 lista de m etodos, 205 strings cadeia de caracteres, 177 stringstream, 208 Stroustrup,Bjarne, 211 strtol(), 129 struct, 144 subtra c~ ao, 57 ponteiro, 171 switch, 104, 105 switch(), 26, 110 switch()/case, escolha()/caso, 79 tabela, 144 fun c~ ao manipuladora, 300 tipos de dados, 143 tabela ASCII, 135 tabula c~ ao dados, 99 tamanho, 54 tamanho dos dados, 140 tamanho.cc, 54 tela limpeza, 11 telef^ onica agenda, 28 terminal, 3 linguagem, 301 testando coment arios, 100 testar trecho de programa, 107 319

teste de parada, 108 texto, 10, 28 sabor C, 177 tipo C, 29 texto para float, atof(), 175 inteiro, atoi(), 175 inteiro, atol(), 175 tibetanos monges, 156 tipo de dados, 49 double, 56 tipo de dado, x, 41, 131, 132 tipo de dados, 140 tabela, 143 tipo int, 49, 132 tipos de dados, 141, 143 resumo, 146 tabela, 143 top, 108 trecho programa, teste de, 107 tutorial, 50, 262, 269, 271 fun c~ ao, 13 ponteiro, 166 ponteiros, 160 undef, 74 uso de arquivo, 199 v rgula erro, 68 valor linha de comando, 175 passando, 120, 178 valor default, 19, 127 valor do falso, 90 valor do return(), 304 valor do verdadeiro, 90 valor padr~ ao vari avel, 19 valor, passagem, 159 valores passando, 88

vari avel, 189 autom atica, 189 vari avel local, 117 vari aveis, 10 onde definir, 127 regras, 134 vari avel, 131, 135, 184 autom atica, 149 cria c~ ao, 147 declara c~ ao, 126 destrui c~ ao, 147 eliminando, 158 endere co, 151 espa co de nomes, 151 estado do objeto, 237 fun c~ ao composta, 159 global, 146--148, 150 global local, 160 inicializa c~ ao, 151 inicializada, 142 intermedi aria, 119 local, 119, 146--150 local, denomina c~ ao, 149 nome, x, 154 passando valor, 178 tipo, x vari avel global, 125, 161 vari avel local, 117, 125 vazio planejamento, 84--86 velocidade, 9 verdade, 133 em C, 80, 82, 89, 94 verdadeiro falso, 80 o valor de, 90 vetor ultimo valor, 129 de caracteres, 184 vetor de caracteres, 54, 137--139 vetores, 145 ponteiros, 178 void main(), 82 warning, 13, 264 320

web, 41 Knuth, 46 while(), 95, 96, 109 for(), 108 while(), enquanto(), 79 widgets, 305 word, 141, 184

321