Você está na página 1de 470
PROG RAMAGAO C++ Conceitos basicos e Algoritmos Pimenta Rodrigues / Pedro Pereira Manuela Sousa FCA — EDITORA DE INFORMATICA RUA D. ESTEFANIA, 183-1.° ESQ, — 1000-154 LISBOA TEL, 21 35327 35 (S. Editorial) FAX 21 362 26 84 TEL. 21 351 14 48 (Servigo Clientes) E-mail: fca@fca.pt Visite a nossa pagina em http: // www.fca.pt site seguro (certificado pela Thawte) DISTRIBUICAO suse ~eaiien Temes, Ie LIVRARIAS: LISBOA: Avenida Praia da Vitéria, 14 — 1000-247 LISBOA — Telef, 21354 14 18 — Fax 21.35778.27 PORTO: Rua Damiio de Géis, 452 ~ 4050-226 PORTO — Telefs, 22 557 35 10 — Fax 22 55011 19 E-mail: lidel @tidel pe FC a, ‘Marea Registeda de FCA ~ Editora de Informéties, Lda, ° FUNMARIERTAL™ ssc Resists de FCA ~ Bor de norm, ta Depress BOM ©. stacs Rezistada de FCA ~ Editor de Tnformitics, La. © CD-ROM on disquete exemtuamenteinclutdota) na obra € oma oferta promecional come tal, cax0 seja detectda alguma incoreegdo ou falta de fcheios 2 FCA nia se obriga a subelitt fa) por ora) podendo a sou Livre arbirio substiuir © CD-ROM ou 8 disqvete ou ilizaroutrasolugae em ope tal como uisponibilizar es comecgées para download ne Internet. envio dos fichetes cm Talla Sou conresées por disquete ov outa tolugdo que mais se adnpte ts citcunstintax Copyright © FCA — EDITORA DE INFORMATICA LDA. - Setembro 1998 (Capa: Emilia Calgada ~ DesignXpress Pré-Impressio: Rabiscos de Luz Impressio e acabamento: Rolo & Filhos 1 8. ~ lndistrias Gréficas. E expressamemteproibido areprodugio, no todo ov em pare, da presente obra sem autoizagio da editora, de harmonia com a lei em vigor. Depésito Legal N° 254 605/07 ISBN 978-972-722-038.0 Este pictograma merece uma explicagao. O seu propdsito 6 alertar¢ lsitor para a ameaga cue reprosenta Para 0 fuluro da esorita, nomeadamente na area da edigdo éenica @ universildriz, o desenvolvimento massivo da fotocdpie. © Cédigo do Direito de Autor estabelece que é cxime punido por Iai, a fotocépla sem autorizagéo dos Propriotérios do copyright. No entanto, esta prética genaralizou-se eobretudo no ensino superior, rovocando uma queda substancial na compra do livros tecnices. Assim, num pais om que a literatura \cnica é to escasss, os autores nic senlem motivago para criar obras inécitas ¢ faz0-las publica, ficando os letores impossiblltados de ter bibliogratia em portugubs. Lemoramos porianto, que 6 expressamente proibida a reprodugao, no tode eu em parte, da presente ‘obra sem auicrizagdo da editor. PREFACIO Este livro constitui 0 primeiro de dois volumes que em seu conjunto se propdem tratar pedagogicamente os t6picos referentes ao desenvolvimento de aplicagdes em linguagem C++, usando o paradigma da Programagao Orientada por Objectos. Nao tem pressupostos de conhecimento prévio dos leitores quanto a programagao. Pode constituir-se manual de introdugao 4 programaco usando linguagem C++ em disciplinas curriculares de cursos de informatica; pode ser utilizado como texto orientador dos leitores que pretendam aprender a programar como auto- didactas; pode também ser utilizado por programadores experimentados em outras linguagens, para se familiarizarem com a linguagem C++ e com, o paradigma OOP (Object Oriented Programming). O texto tem vindo a ser testado (e optimizado) pelos autores (ao longo de cinco anos de docéncia) no Instituto Superior de Engenharia de Lisboa. Os dois volumes cobrem, no seu conjunto, os temas desenvolvidos nas trés disciplinas propedéuticas de programacao do curso de Electrénica e Comunica- gdes, nomeadamente Programagao, Algoritmos e Estruturas de Dados, ¢ Progra- macio Orientada por Objectos. Nao sendo ainda muito frequente em Portugal usar o C++ como a linguagem de imiciagio & programacio, os resultados pedagégicos obtidos com esta op¢ao revelaram-se, no entanto, bastante positivos. Tratando-se de uma linguagem complexa de dominar na sua globalidade, tem, no entanto, a virtude de proporcionar uma introdugao gradual da sua gramética - 4 medida que a formulagéo dos algoritmos o requeira. Por esse facto, a complexidade da linguagem nao acarreta substancial acréscimo 4 dificuldade intrinseca da assimilaciio dos conceitos basicos de programagao. Obviamente que nao é€ possivel aprender a programar (tal como nao se aprende a nadar ou a conduzir um automédvel) exclusivamente pela leitura dos manuais. Aprender a programar, subentende adquirir pratica, quer na leitura e interpretagio de programas e algoritmos, quer na escrita e teste de programas que obedegam a enunciados propostos. Andlise e sintese de programas devem ser tarefas entrosadas decorrentes em paralelo. Os aspectos mais relevantes da programagio em C++ sao abordados numa sequéncia diddctica, evitando expor o leitor a saltos bruscos de complexidade quanto aos exercicios propostos, no pressuposto que todos Ihes merecam atencio. Cada capitulo versa um novo tema e presumem que os anteriores foram esclarece- dores quanto aos objectivos a que se propunham. A abordagem de cada tema envolve o estudo dos algoritmos que esse tema recomenda, a introducao dos conceitos ¢ das regras (sintacticas e semanticas) da linguagem que a implementagio desses algoritmos requeita e programas que exemplifiquem 0 estilo de implementagao. Finalmente apresentam-se enunciados de objectivos para os quais se recomenda que o leitor implemente programas, entendendo-se como tal escrever, testar, eventualmente emendar e por tiltimo por em execugao, De uma forma pragmatica podemos dizer que cada um dos capitulos se destina a ensinar a implementar os programas nele propostos. E pressuposto que o leitor tenha disponivel um PC (Personal Computer) com um ambiente de desenvolvimento para programar em linguagem C++, como sejam o Borland C++ (3.1 ou seguintes), Visual C++ da Microsoft ou ambientes equivalentes oriundos de qualquer outro fabricante. Para comodidade dos leitores, 0 volume é acompanhado por um CO-ROM, onde constam todos os exemplos' de programas descritos ou invocados no texto, testados nos ambientes Borland C++ e Visual C++ da Microsoft. Realga-se que 0 interesse em dispor dos ficheiros fonte de programas, ndo se confina em poder constatar o resultado da sua execugio apés compilados. Prestam-se a estudar em pormenor os passos intermédios dos algoritmos, visualizando a sua execuc%o passo a passo; a introduzir sobre eles variantes de comportamento; a praticar reutilizagao de cédigo, organizando em bibliotecas, fungdes e classes que deles constem e cuja utilizagdo se reconheca ter genera- lidade, Aplicando os conceitos tratados nos capitulos anteriores, o tltimo capitulo deste volume ilustra, com varios exercicios, a abordagem de programas baseada em objectos. Os métodos e critérios propostos, constam como introdutérios ao paradigma da programagdo orientada por objectos, cuja adopgiio plena s6 vird a ser conseguida num .estégio mais avangado de conceitos e conhecimento da linguagem, tema do préximo volume. Exprimimos o nosso reconhecimento a todo um colectivo que tornou possivel escrever este livro. Agradecemos ao colectivo do Centro de Célculo do Instituto Superior de Engenharia de Lisboa (CCISEL) os recursos e o ambiente estimulante que nos proporcionou, nomeadamente as miiltiplas e acaloradas discussdes que os temas abordados neste livro suscitaram no seu seio. Agradecemos particularmente aos colegas Hernani Mergulhao, Carlos Martins e Jorge Martins a participagio empenhada que tiveram nas revisdes do texto, e no contributo que nos deram com criticas, comentarios e sugest5es. INDICE PREFACIO..... InvIce.. 1. GENERALIDADES 1.1 Introdugiio ........s0 1.2 Arquitectura Computacional basica 1.2.1 Organizagaio Hardware 1.2.2 Sistema Operativo.... 1.2.3 Ferramentas de desenvolvimento, 1.2.4 Programas de aplicagio... 1.2.5 Sistema Operativo MS-DOS.. 1.3 Algoritmos e linguagens..... 1.3.1 Algoritmos e linguagens estruturada: 1,3.2 O algoritmo de Euclides. 1.3.3 Constituintes dos algoritmo: 1.4 Paradigmas de programacao 1.4.1 Programagiio procediment 1.4.2 Programagao modular..... 1.4.3 Abstracgao de tipos de dados 1.4.4 Programagio orientada por objectos 1.5 As linguagens Ce C++... 1.6 Resumo.... 1.7 Exercicios... 2, INICIACAO A LINGUAGEM C++ 2.1 Introduca 2.2 Estrutura basica de um programa... 2.3 Ambiente integrado de desenvolvimento... 2.3.1 Editor. 2.3.2 Compilador © FCA-EDITORA DE INFORMATICA IX Programacao em C++ - Conceitos Basicos e Algoritmos 2.4 Tipos, Operadores e Expressoes..... 2.4.1 Tipo de dados e representagiio . 2.4.2 Representago de caracteres.. 2.4.3 Operadores, precedéncia ¢ ordem de avaliagio 2.4.4 Expressdes aritmética: 2.4.5 Incremento (++) e decremento (-. 2,5 Instrugdes de controlo de execugiio 2.5.1 Expressdes e Instrugdes compostas.. 2.5.2 Instrugio if-else 2.5.3 Instrugao switch . 2.5.4 Instrugao while 2.5.5 Instrugio for. 2.5.6 Instrugdo do-while. 2.5.7 Instrugdes break, continue e goto.. 2.6 Resumo... 2.7 Exercicios. 3. ENTRADA E SAIDA DE DADOS. 3.1 Introducio.... . 3.2 Biblioteca de streams do C++. 3.3 Entrada e Saida formatada... 3.3.1 Operador insersor <<") 3.3.2 Manipuladores...... 3.3.3 Operador extractor (“>>" 3.4 Entrada e Saida nao formatada .. 3.4.1 Método put () 3.4.2 Método get () 3.4.3 Método putback ( 3.4.4 Método getline ( 3.5 Acesso a ficheiros 3.5.1 Teste de erro na abertura de um £stream 3.5.2 Especificagio do modo de acesso . 3.5.3 Método write () 3.5.4 Método read () 3.5.5 Acesso aleatério a ficheiros 3.6 Conversao de e para texto, nas extracgées € 3.6.1 Conversio de valores inteiros para texto . X © FCA-EDITORA DE INFORMATICA 3.6.2 Conversio de texto para valores inteiros .... 3.6.3 Conversiio entre arrays de char e palavra: 3.7 Acgies de I/O directas sobre o terminal 3.7.1 Fungao getch () ... 3.7.2 Fungo getche () 3.7.3 Fungdo putch () 3.7.4 Fungéo kbhit () 3.8 Manipulagie de strings... 3.8.1 Fungo strlen () 3.8.2 Funcao strepy () 3.8.3 Fungaéo strcmp () 3.8.4 Fungio strcat () 3.8.5 Fungao strstr () 3.8.6 Fungio strchr () 3.9 Resumo.. 3.10 Exercicios. 4, DECLARACOES E DEFINICOES. 4,1 Introdugio.... 4.2 Declaragées versus Definigées.. 4.2.1 Alcance (scope) de um nome 4.2.2 Tempo de existéncia de um objecto. 4.3 Constantes .... 4.4 Enumeracées 4.5 Tipos de objectos. 4.5.1 Tipos fundamentais 4.5.2 Conversao implicita de tipos. 4.5.3 Tipos derivados.. 4.5.4 Conversao explicita de tipos 4.5.5 Tipo void 4.6 Apontadores 4.6.1 Apontadores para void. 4.6.2 Referéncias. 4.6.3 Diferenga entre refer8ncia e apontador 4.7 Definigao e Declaragiio de funcGes ..... 4.7.1 Argumentos de fungées. © FCA. EDITORA DE INFORMATICA XI Programacao em C++ - Conceitos Basicos ¢ Algoritmos 4.7.2 Retorno de valores ...... 4.7.3 Sobrecarga de um nome de fungi 4.7.4 Referéncia como argumento de fungées . 80 4.7.5 Referéncia como retorno de fungées. 182 4.8 Arrays 184 4.8.1 Iniciagao de arrays. 186 4.8.2. Apontadores e arrays. 187 4.8.3 Indexacio e aritmética de apontadores. 187 4.8.4 Array de caracteres e string. 190 4.8.5 Arrays multi-dimensionais 191 4.8.6 Array de apontadores .. .192 4.8.7 Apontadores e arrays bidimensionai: 193 4.9 Argumentos da linha de comando...... 201 4.10 Apontadores para funcdes 4.11 Declaragées complicadas. 4,12 Algoritmos recursivos... 4.12.1 Factorial ..... 4.12.2 Inversao de uma string .. 4.12.3 Soma de némeros inteiros 4.12.4 Converter ntimeros inteiros em strings 4.12.5 Versio recursiva do Bubblesort...... 4.12.6 Pesquisa dicotémica em arrays ordenados 4.12.7 Algoritmo de ordenagiéo quicksor: 4.12.8 Problema das Torres de Hanoi 4.13 Resumo.. 4.14 Exercicios.. 5. CLASSES... 5.1 Introducio.. 5.2 Paradigma ADT (Abstract Data Type) $.3 Estruturas e Classes... 5.3.1 Membros-dados e Membros-fungio .. 5.3.2 Acessibilidade....... 5.3.3 Aplicagéio envolvendo ntimeros complexos.. 5.3.4 Método: 5.3.5 Sobrecarga (overload) de nomes de método: XI © FCA - EDITORA DE INFORMATICA 5.3.9 Métodos inline 5.3.10 Palavra chave thi 5.3.11 Membros estatico: 5.4 Concepgio de classes ... 5.4.1 Classes Set (conjunto), 5.4.2 Classe CharSet — Conjunto de caracteres. 5.4.3 Classe UIntSet — Conjunto de inteiros positivo: 5.4.4 Algoritmo de Eratosthenes.. 5.5 Alojamento dos objectos..... 5.5.1 Modos de utilizagio da memori: 5.5.2 Operador new... 5.5.3 Operador delete 5.5.4 Alojamento na meméria livre 5.6 Atributos com alojamento dinamico... 5.6.1 Exigéncias das classes com atributos alojados dinamicamente 5.6.2 Stack — Classe CharStack... 5.6.3 Array dinamico — Class IntArray 5.6.4 Classe String dinamica.... 5.7 Listas ligadas..... 5.7.1 Array versus Lista 5.7.2 Lista ordenada simplesmente ligada ..... 5.7.3 Lista simplesmente ligada com sentinela, 5.7.4 Lista duplamente ligada com sentinela. 5.7.5 Exemplo de aplicagio .. 5.8 Resumo... 5.9 Exercicios 6. PROGRAMACAO COM CLASSES... 6.1 INtrodugao ...secsssoene 6.2 Biblioteca de classes auxiliares 6.2.1 Classe Point... 6.2.2 Classe Random. 6.2.3 Classe Display .. 6.2.4 Classe Keyboard... © FCA-EDITORADE INFORMATICA — XIII Programacao em C++ ~ Conceitos Basicos e Algoritmos 6.2.5 Classe DeltaTime 6.2.6 Classe bool... 6.3 Implementaciio do jogo dos Monstros 6.3.1 Descrig&o genérica..... 6.3.2 Enunciado narrativo da aplicagio .. 6.3.3 Descrigao da aplicacdo invocando objecto: 6.3.4 Representagio gréfica das classes 6.3.5 Fase de implementagao 6.4 Implementagiio do jogo Snake. 6.4.1 Descrigio genérica do jog 6.4.2 Enunciado narrativo da aplicagio 6.4.3 Descrigao da aplicagaio baseada em objectos 6.4.4 Defini¢ao das classes envolvidas .... 6.5 Visualizacio das Torres de Hanoi. 6.5.1 Enunciado..... 6.5.2 Tipos de objectos a adoptar no projecto.. 6.5.3 Classes auxiliares do projects 6.5.4 Classe Disk... 6.6 Implementaciio do jogo Tetris 6.6.1 Descrigdo genérica.... 6.6.2 Descrigo em ternios de objectos 416 6.6.3 Fase de implementagao 6.7 Resum 6.8 Exercicios.. BIBLIOGRAFIA INDICE DE FIGURAS..... Inpice DE ExEMPLos... INDICE REMIsSIVO.... XIV © FCA - EDITORA DE INFORMATICA eGeneralidades Objectivos « Familiarizago com a terminologia usada; © Conhecer a arquitectura bésica de um computador; © Conhecer os diferentes médulos de hardware e software que fazem. parte de um computador; * © Perceber para que serve 0 sistema operativo; © Entender o sistema de ficheiros; © Ser capaz de utilizar os comandos do MS-DOS; * Perceber o que é um algoritmo; © Ser capaz de descrever algoritmos de forma narrativa, em pseudo cédigo, ou através de fluxograma; © Conhecer os diversos patadigmas da programagio; « Ser capaz de descrever os paradigmas suportados pela linguagem C++; «© Conhecer a histéria da evolugio do C++. © FCA -EDITORA DE INFORMATICA Programagao em C++ - Conceitos Basicos e Algoritmos 1.1 Introdugéo Este capitulo destina-se aos leitores que nao tenham experiéncia de programacio e/ou nao conhegam a organizacao hardware e software de computadores. Um computador é um dispositivo demasiadamente complexo, para que a sua abordagem se faga por uma tinica via. E tio irrealista pensar que, para aprender a programar, se torna necessdrio “conhecer ao pormenor a estrutura interna de um computador”, como julgar que, para aprender a guiar um automével, é necessério “conhecer ao pormenor a constituigzo do seu motor”. ‘ Aprender a programar numa dada linguagem, e aprender a guiar um automdvel, sao ainda objectivos muito confinados a partir dos quais se pode posteriormente avangar para graus mais alargados de conhecimento. Quer num caso quer noutro, © que se Tequer ao novigo, é a capacidade de abstracgfio que lhe permita encarar os dispositivos através da interface que estes Ihe poem disponivel. No que se refere a aprendizagem de Pprogramagao, pretendemos realcar neste capitulo que o mais importante dessa aprendizagem é a formulagio algoritmica dos processos que se pretendam por em execugio, usando para tal os paradigmas mais adequados e uma linguagem que lhes dé suporte. A parte gramatical da linguagem (a sua sintaxe e a sua semantica) € conhecimento que, progressivamente, se vai adquirindo sem dificuldade de maior. 1.2 Arquitectura Computacional basica Um computador consiste numa arquitectura de componentes electrénicos e mecfnicos (hardware) e num conjunto de programas (software) localizados em discos ou em meméria permanente interna, A vocagao e a potencialidade de um computador dependem, nao sé, da estrutura dos seus dispositivos electrénicos, mas, fundamentalmente, dos programas que os instruem para realizar os objectivos que se pretendem. Presentemente € dificil imaginar um dominio da actividade humana onde a utilizagdo de computadores nao seja desejavel. Os programas consistem num conjunto ordenado de instrugdes que o hardware interpreta e cumpre, e estruturas de dados (informagio) adequadas a concretizagaio dos objectivos desejados. 2 © FCA-EDITORA DE INFORMATICA Generalidades O mesmo hardware poderd responder a um conjunto muito vasto e diverso de objectivos, consoante o software que lhe seja imposto para executar. Em paralelo com a engenharia de hardware que projecta e constréi as arquitectu- ras electrénicas dos computadores, desenvolve-se um ramo de engenharia de software que imagina novos objectivos, concebe os processos para os atingir e escreve os programas que levam 0 computador a executd-los. O dominio de aplicagio dos computadores é, substancialmente, ditado pela imaginacao e criatividade dos projectistas de software. De entre o software desenvolvido para os computadores, salientam-se trés tipos principais: * Sistemas operativos; * Ferramentas de desenvolvimento; * Programas de aplicagao. * 1.2.1 Organizacao Hardware A organizagio hardware basica dos computadores pessoais, conhecidos sob a sigla PC (Personal Computer), é descrita em forma modular pela Figura 1.1. TERMINAL Disco RIGIDO FLOPY-DISK RAM CD-ROM ENTRADA/SAIDA Figura 1.1 — Diagrama de blocos do hardware O CPU (Central Processing Unit), € 0 médulo “inteligente” da estrutura, isto porque é 0 tinico que toma iniciativa de actuagéio. © FCA-FDITORA DE INFORMATICA 3 Programagao em C++ - Conceitos Basicos e Algoritmos Todos os outros médulos podem considerar-se como recursos do CPU, aos quais cle recorre quando necessita ou, eventualmente, presta atengiio quando atender a um pedido de interrupgao que esses médulos Ihe requeiram. © médulo ROM (Read Only Memory) é uma meméria nao volatil, isto é, nao perde informacao pelo facto de Ihe ser retirada a alimentagao de energia. Contém © programa a ser executado pelo CPU apés ser ligada a energia ao computador. E denominada ROM boot (de iniciago), dado que nela se situam os programas de iniciagao dos chips periféricos programaveis e 0 programa que permite transferir para meméria RAM o software do sistema operativo, lido a partir de um disco rigido, de uma disquete presente no floppy disk drive ou do CD-ROM. B importante notar que este programa boot ocupa somente umas dezenas de Kilobytes da ROM, enquanto que o sistema operativo que ele vai transferir para RAM poderé ter uma dimens&o na ordem dos Megabytes. O médulo RAM (Random Access Memory) constitui a meméria interna voldtil, onde o CPU vai ler as instrugdes a cumprir e armazenar os dados envolvidos no processamento. De notar que a RAM tem natureza “volatil”, isto é, toda a informagao residente serd perdida no caso de interrupgdo no fornecimento de energia ao sistema. S6 apés ter sido feito o boot do sistema operativo para a RAM é que o computador passa a dispor das facilidades de comando ¢ controlo especificas desse sistema. Ea partir da RAM que corte o sistema operativo ¢ os programas de aplicacio. O médulo Disco rfgido (Hard disk) constitui a meméria de massa ou memoria secundaria onde reside em permanéncia todo 0 software do sistema, menos a Pequena parcela situada no médulo ROM a que ja atrés nos referimos. E constituido por um drive de discos magnéticos rigidos, nfo removiveis (e hermeticamente acondicionados), com capacidade de armazenamento de informagao que actualmente atinge a ordem dos Gigabytes. A informagao € registada em ambas as faces dos discos, ao longo de pistas concéntricas, por magnetizagiio da pelicula que os recobre. Os discos giram a uma velocidade de rotag%o constante e as cabecas de gravago/reprodugao posicionam-se em qualquer das pistas e mantém-se sobre elas.a flutuar, para evitar desgastes cumulativos ao longo do tempo. Associado ao drive existe um sistema electrénico controlador Hard disk controller que providencia a sincronizag&o e 0 comando automatico do drive, em todas as acg6es fisicas que este tenha de realizar. 4 © FCA- EDITORA DE INFORMATICA, Generalidades Floppy disk ou disquete significa disco flex{vel portatil, de baixo custo e reduzida dimensio, através do qual é possfvel 0 transporte e arquivo de ficheiros. As disquetes mais comuns de momento sio as de 3 1/2 polegadas de diametro, com capacidade de armazenamento de informagao de 1,8 Megabytes. O médulo CD-ROM (Compact Disk - Read Only Memory) permite a reprodugio de informagao digital, organizada em ficheiros de forma idéntica & disponibilizada pelos floppy disks e discos rigidos. Garantindo a mesma fiabilidade de reprodug&o e a mesma facilidade de transporte, © compact disk dispde de uma capacidade de armazenamento de informagio da ordem de 400 vezes maior que um floppy disk. O médulo Terminal permite a interacgao entre 0 utilizador e 0 sistema, através do monitor video (para visualizacio de mensagens) e e do teclado (para insergfo de dados no sistema). O médulo Entrada/safda (Input/outpur) destina-se a estabelecer comunicagdes com o exterior por canais digitais ou analégicos, a interligagao em rede de varios computadores, e a interacgfo com as actuais “auto-estradas de comunicagiio de dados” disseminadas por todo 0 mundo (Jnternet). 1.2.2 Sistema Operativo O sistema operativo é a camada de software que “transforma” aos olhos do utilizador a estrutura ffsica do computador, dando-Ihe capacidade de didlogo através do terminal (monitor de video, teclado e rato), e pondo disponivel um conjunto de comandos para aceder aos recursos hardware e software do sistema (meméria em disco ou disquete, impressoras, tragadores de grdficos, mesas digitalizadoras, scanners, etc.) [AMarques90]. Independentemente de como sao implementadas as accdes fisicas do computador (© pormenor ou as particularidades do hardware), 0 comando dessas acgdes apresenta-se ao utilizador, fungao do sistema operativo que lhe for instalado. A titulo de exemplo podemos citar dois sistemas operativos que podem ser instalados sobre um mesmo hardware, e dio interfaces com o utilizador drasticamente diferentes. Trata-se dos sistemas operativos MS-DOS e Windows95. © FCA-EDITORA DEINFORMATICA = 5 Programagao em C++ - Conceitos Basicos e Algoritmos Comandos | Aplicagao Aplicagao Aplicagao Sistema Operativo Hardware (RAM,ROM,CPU,Periféricos) Interface com 0 utilizador ( cada aplicagao tem a sua interface ). EE Figura 1.2 — Diagrama de blocos do Software Enquanto o primeiro configura o sistema para apenas executar um programa de cada vez (monoprogramagio), o segundo mostra-se ao utilizador como sendo capaz, de executar, simultaneamente, varios programas (multiprogramagio). O sistema operativo é, por assim dizer, 0 software que apés instalado sobre um dado hardware, Ihe comunica uma “heranga cultural” que o leva a entender e a saber cumprir uma linguageth de comandos, o ensina a emitir mensagens, e 0 educa a aceder e a utilizar os seus recursos em obediéncia a normas e rituais tidos como os mais recomendaveis. Assim como nas sociedades humanas coexistem muitas culturas, diferenciadas por critérios morais, habitos e jufzos estéticos, no mundo dos computadores coexistem muitos sistemas operativos, cada um deles reivindicando para si virtudes e qualidades. A perspectiva com que o utilizador encara um computador assemelha-se muito a perspectiva com que um socidlogo analisa os componentes de um dado tipo de sociedade: nao se interessa particularmente pela constituigio fisica do objecto em estudo, mas sim pelo comportamento que tem e pelo modo como se relaciona e Teage. Talvez que este ponto de vista parega estranho a um electrotécnico, habituado a estabelecer com o hardware uma relagio directa causa/efeito, como seja: se alguma coisa nao funciona bem, ent&o € porque algum elemento do circuito se 6 FCA - BDITORA DE INFORMATICA Generalidades deteriorou ou alterou as suas caracteristicas. No dominio dos computadores estas relagdes causa/efeito nao sao assim tao lineares. Na grande maioria das vezes que um computador nfo cumpre com os objectivos desejados, nfo se pode imputar esse facto a deterioragao de componentes, mas sim & ma concepg&o dos programas que lhe impusemos para cumprir. De entre as varias tarefas atribuidas a um sistema operativo, aquela que se torna mais evidente ao utilizador é a linguagem de comandos, através da qual podemos “ordenar” ao computador que execute acces, Actualmente os computadores pessoais, apesar de manterem disponivel uma interface de acesso para o sistema operativo MS-DOS, adoptam na generalidade o sistema operative Windows 95 ou Windows NT, cujas caracteristicas mais salientes ao utilizador é proporcionarem uma interface grafica de janelas através da qual (por acg%o sobre © rato ou sobre teclado) 0 utilizador comunica com o sistema, ¢ permitirem que varios programas possam ser postos simultaneamente em execucao. ‘ 1.2.3 Ferramentas de desenvolvimento As ferramentas de desenvolvimento sao 0 software, que proporciona ao utilizador facilidades ¢ comodidades para que ele préprio possa desenvolver programas de aplicago, em qualquer dominio que desejar. Com as ferramentas de desenvolvimento dispon{veis (ambientes de programaciio para varias linguagens, gestores de bases de dados, frameworks de interfaces de janelas, folhas de cAlculo) escrever um programa, mesmo que seja para um objectivo ambicioso, é tarefa que pode, na generalidade dos casos, confinar-se a poucos meses de trabalho. Basta que o utilizador esteja imbuido de espirito criativo e imaginagdo e que domine as linguagens formais de programagao, saiba formular os seus objectivos em termos de algoritmos e estruturas de dados ou em termos de transferéncia de mensagens entre objectos caso adopte o paradigma da Programagao Orientada por Objectos. 1.2.4 Programas de aplicagao Os programas de aplicagao consistem em software, que o utilizador pode adquirir ou desenvolver, através do qual o computador executa uma determinada tarefa. Actualmente esto disponfveis programas para um largo dominio de aplicacées: lidicas, de gestéo, edigio e formatagio de textos, desenho assistido por © FCA-EDITORADE INFORMATICA 7 Programagao em C++ = Conceitos Basicos e Algoritmos computador, ete. As ferramentas de desenvolvimento séo um caso particular de programas de aplicagao, vocacionados para desenvolver outras aplicagées. Os computadores so um factor multiplicativo da inteligéncia do homem, tal como as fontes energéticas e as m4quinas sao um factor multiplicativo da sua forga muscular. 1.2.5 Sistema Operativo MS-DOS Apesar de ultrapassado por outros sistemas operativos que entretanto se foram vulgarizando, tais como 0 Windows 95 ¢ o Windows NT, consideramos que 0 MS-DOS ainda mantém interesse pedagdgico, dado que se apresenta ao utilizador de uma forma menos abstracta do que os sistemas Windows. Os comandos usados no MS-DOS, que iremos descrever, permanecem disponiveis de uma forma directa ou indirectamente nos sistemas Windows. O sistema operativo MS-DOS foi desenvolvido no inicio da década de 80 pela firma Microsoft Corporation por encomenda da /BM, quando esta pretendeu langar no mercado o standard de computadores pessoais que hoje se referem genericamente por PCs. (monitor) ™ terminal floppy-disk cd-rom i (teclado) rato Figura 1.3 Computador pessoal Os PCs constituem actualmente a configuragio standard de computador mais vulgarizada no mundo. 8 @ FCA-EDITORA DE INFORMATICA Generalidades O sistema operativo MS-DOS e a arquitectura hardware PC compativel, tornaram-se rapidamente num standard “de facto”, que, ao longo da tiltima década, constantemente se foram optimizando, quer em hardware quer em software, constituindo-se suporte de uma comunidade de utilizadores que actualmente (1998) se contam por centenas de milhdes em todo o mundo. As caracteristicas do sistema operativo MS-DOS foram inspiradas em sistemas operativos anteriores, fundamentalmente no CP/M e UNIX, naturalmente que filtrados e complementados por forma a satisfazer 0 padrao de aplicagdes que a IBM procurou cobrir. No que se refere ao hardware, assistiu-se ao longo desta década a uma constante evolugio de caracteristicas, que encaradas em termos de CPU, percorreu sucessivas versdes da familia (APX86 da Intel, comegando pelo CPU 8088 e passando pelo 8086, 80286, 80386, 80486, situando-se actualmente nos CPUs da série Pentium. A rapidez de execugio duplicou de dois em dois anos ao longo da década, e o mesmo aconteceu no que se refere a capacidade de memoria interna e mem6ria de massa. Assiste-se hoje ao declinio do sistema operative MS-DOS, com o surgimento de novos sistemas operativos mais evoluidos, nomeadamente 0 Windows 95, Windows NT, e Linux (versio do UNIX de dominio piblico) suportados no hardware standard dos PCs compativeis. Os comandos que 0 DOS (modo abreviado de nos referirmos ao sistema operativo MS-DOS) nos pée disponiveis podem dividir-se em duas categorias: Comandos internos — Situados no ficheiro command . com que é carregado para a RAM logo que se faz boot do sistema. Comandos externos — Que correspondem a programas situados em ficheiros individualizados, ficheiros esses que terao de estar acessiveis (tém de constar dos discos ou disquetes presentes nos drivers), nO momento em que pretendemos que o comando seja executado. Os comandos externos podem corresponder a programas com trés tipos de extensio: -COM (comando) . EXE (executdvel) «BAT (batch) lista de comandos a executar sequencialmente pelo DOS. © FCA-EDITORA DEINFORMATICA 9 Programagio em C++ - Conceitos Basicos ¢ Algoritmos Os ficheiros COM e EXE s&o programas, ou comandos, prontos a serem executa- dos, ou seja, sio ficheiros executdveis j4 com as instrugdes que se executam no CPU da maquina. Um ficheiro BATCH (com extensio BAT) é fundamentalmente um ficheiro de texto constitufdo por uma lista de comandos que desejamos sejam executados em sequéncia. Caso nfo se pretenda essa sequéncia, explicita-se no batch (através de uma linguagem de comando batch) as condigées a que ficar4 condicionada a execugao. A informa¢ao em mem6ria secundaria est4 organizada em ficheiros ¢ estes por seu turno estdo situados em directérios ou nds, estruturados em forma arborescente como se mostra na Figura 1.4. A partir da raiz, podemos definir uma arborescéncia de directérios onde, com algum critério funcional, podemos situar ficheiros. Entende-se por ficheiro, um bloco de informagio coerente (texto, imagem, programa, etc.) a que € possivel aceder por nome e posicSo que ocupa na arborescéncia de directérios. - B TT D d.bat ( \A\B\D\d. bat ) Raiz A d.doc ( \A\B\d.doc ) —¢ aux { \A\Claux ) r, X.com (\Bix.com ) f- B —— xexe (\Blx.exe ) —C—— a Cla. _ conte a.cpp (\B\Cla.cpp ) ;— ash (\B\Cla.h ) f- conf.exe — bl BAC\b.| ' ‘— contexe bah (\BIC\b) Figura 1.4 — Organizagdo arborescente do sistema de ficheiros Ao pretender aceder a um desses ficheiros, teremos que, explicitamente, definir 0 percurso (path) que nos encaminha na drvore para esse ficheiro, a partir do ponto onde nos situamos (directério corrente). Se no nome do ficheiro substituirmos um cardcter por um ponto de interrogaciio (‘2’) ou um segmento de caracteres por um asterisco (‘*”), 0 comando em que esse nome se insere interpreta-o como correspondente a todos os ficheiros que tenham nomes que se ajustem com os simbolos de generalizagao (will cards) : ‘2? e “*’, 10 © FCA - EDITORA DE INFORMATICA, Generalidades Por exemplo se estiver situado na raiz: con?.exe — Ajusta-se aos ficheiros cujos nomes sejam por exemplo cont .exee conf.exe. conf. * — Ajusta-se a todos os ficheiros de nome conf, com qualquer extens&o, como por exemplo conf .c, conf .exe, O nome de ficheiro ponto (“.”) refere o direct6rio corrente, e o nome de ficheiro dois pontos (“. .”) refere o directério anterior. O DOS, permite definir variéveis de ambiente para controlar 0 comportamento de ficheiros batch e de programas. Existem algumas varidveis predefinidas, nomeadamente a varidvel de ambiente PATH, para instruir o DOS onde procurar um programa, ou a variével PROMPT que define o sinal de pronto (a indicagao que © sistema est pronto para executar mais um comando) do DOS. O DOS tem comandos disponiveis que nos permitem criar e remover ditectérios, e posicionar-nos em qualquer directério para aceder, criar ou remover ficheiros ou direct6rios. Os comandos variam com a versio do DOS utilizada, mas envolvem na generalidade os descritos na Tabela 1.1. O ficheiro command.com inclui 0 cédigo dos comandos mais frequentes (comandos internos). O programa command.com é carregado para RAM e & posto em execugio quando se faz boot ao sistema. E este programa que apresenta o sinal de pronto do DOS (tipicamente € do género “C:: \>”) e executa os comandos digitados pelo utilizador. Ao evocarmos qualquer comando, o command.com verifica se é um comando interno (que faz parte do préprio command. com), ¢ se nao for vai procurar nos directérios descritos na varidvel de ambiente PATH, um ficheiro que corresponda ao comando evocado (com extens&o COM, com extensfio EXE ou com extensio BAT por esta ordem). Na fase de boot do sistema operativo MS-DOS sao consultados dois ficheiros de texto, o config.sys e 0 autoexec.bat, localizados na raiz do sistema de ficheiros. config.sys — Permite a configuragiio de pardmetros internos ao sistema operativo e a instalagdo de periféricos (carregamento de. device drivers). © FCA-EDITORADE INFORMATICA 11 Programacao em C++ - Conceitos Basicos e Algoritmos autoexec.bat — Permite definir os primeiros comandos a serem executados pelo sistema operativo. Estes dois ficheiros permitem configurar o sistema, quer no que se refere a placas de hardware instaladas, quer a varidveis de ambiente adequadas as aplicagdes que se pretende executar. Comando BREAK (ON/OFF) Descrigao Testa ou néio periodicamente a tecla break (controle C) CD/CHDIR Muda o directério corrente CLS Apaga o ecra COPY <£ich> Copia ficheiros DATE Mostra ou altera a data corrente DEL/ERASE ‘Apaga ficheiros DIR Mostra 0 nome dos ficheiros do directério corrente ECHO (ON/OFF) Mostra ou nao os comandos executados por um ficheiro . BAT MD/MKDIR Cria um novo directério no disco RD/RMDIR Remove um directério do disco REN/RENAME | Muda o nome de um ficheiro TIME : TYPE Mostra ou altera a hora corrente Mostra o contetido de um ficheiro de texto SET = Mostra ou altera uma varidvel de ambiente PROMPT Altera a variavel de ambiente PROMPT, sinal de pronto do DOS (equivalente a SET PROMPTS ...) PATH Altera a varidvel de ambiente PATH, que indica ao DOS onde procurar um programa (equivalente a SET PATHE...) HELP Disponibiliza informacao completa sobre todos 08 comandos disponiveis, pelo que nos limitamos a citar 05 mais comuns. S6 a partir da versio 5.0 do MS-DOS. Tabela 1.1 — Comandos mais usados no DOS 12, © FCA-EDITORA DE INFORMATICA Generalidades 1.3 Algoritmos e linguagens A primeira barreira a vencer por quem se propde dar os primeiros passos na “arte da programac’o”, consiste em disciplinar o raciocinio por forma a traduzir algoritmicamente a resolugdo de um problema. Entende-se por processo, um conjunto ordenado de acgdes, sujeito a critérios de decisio condicionados a valores de varidveis, através do qual podemos atingir um dado objectivo. Define-se como algoritmo, [Knuth73v1] um conjunto finito de regras através das quais se pode dar execugao a um dado processo. Em programagio, podemos dizer que um algoritmo descreve a sequéncia légica de operagdes que devem ser executadas por um programa. A palavra “algoritmo” provém do nome do Mafemitico arabe do século IX (al-Abu Ja-Far Mohamede Khwarizmi) que escreveu um livro de cujo titulo “al-jabr” derivou a palavra “algebra”. Um algoritmo deve satisfazer aos seguintes atributos: + Ser finito. Terminar apds um numero finito de acgdes. * Ser inteligivel. As acgGes evocadas serem definidas sem ambiguidade. * Ser exequivel. As acgGes evocadas poderem realizar-se num lapso de tempo satisfatdrio. * Ser caracterizavel. Existir um conjunto de entradas (eventualmente vazio) do qual o processo dependa; existir um conjunto de safdas (resultados) de que se conheca a relago funcional com as entradas. Um algoritmo presta-se a varias formas de representagaio, como seja: ¢ A forma narrativa comum. * O fluxograma (flowchart). Forma grafica de representagio independente da sua implementacio. © FCA-EDITORADE INFORMATICA — 13 Programagao em C++ - Conceitos Basicos e Algoritmos * O pseudo cédigo. Forma narrativa sucinta, que exprima sem redundancia a sequéncia de acgdes € os critérios de decisiio envolvidos no algoritmo. * As linguagens de programaciio. Formas efectivas de cédigo de algoritmos, obedecendo a regras sintécticas ¢ semanticas perfeitamente definidas, nas quais se podem descrever os algoritmos, ¢ delas (de uma forma automatica) se pode extrair cédigo que torne esse algoritmo executdvel por um computador. Escrever um programa para um processo, consiste em criar um algoritmo em que €sse processo sé possa concretizar, e traduzir esse algoritmo na linguagem de programagao escolhida, obedecendo rigorosamente as suas regras sintdcticas e seminticas, Assim como para escrever um livro nao basta que se domine perfeitamente a gramAtica (sintaxe e seméntica) da lingua adoptada, escrever um programa requer, tal como para escrever um livro, que tenhamos previamente delineado os objectivos que nos propomos nele exprimir. A dificuldade basica da programagio consiste em conceber os algoritmos e escolher as estruturas de dados com as quais o computador possa executar 0 processo pretendido. 1.3.1 Algoritmos e linguagens estruturadas De entre os algoritmos (e consequentemente de entre as linguagens de programagio) destacam-se, pelo seu interesse, os algoritmos (e as linguagens) estruturados. Sendo S um conjunto de primitivas de controlo com um tinico ponto de entrada e um tinico ponto de safda, um algoritmo explicitado exclusivamente com essas primitivas diz-se estruturado em relacdo ao conjunto S. O conjunto S normalmente adoptado envolve as seguintes primitivas: ¢ Decisao bindria if (condigao) acgiol else acgio2 * Repeticao condicional while (condigao) accio 14 © FCA- EDITORA DE INFORMATICA Generalidades * Decisdo miltipla switch (expresso) {° case expressiol : acgiiol case expressdo2: accfio2 } 1.3.2 O algoritmo de Euclides Apesar da palavra algoritmo ser relativamente Tecente (adoptada na Europa a partir do século XVII), 0 conceito de algoritmo é velho‘como o mundo. Um algoritmo que ainda hoje é profusamente utilizado para calcular 0 maximo divisor comum (MDC) entre dois nimeros inteiros (m e n), foi desenvolvido em 600 AC pelo geémetra grego Euclides e é comummente referido como Algoritmo de Euclides. . O Algoritmo de Euclides pode ser descrito em varias formas de representagio como a seguir se mostra. 1.3.2.1 Forma narrativa abreviada Algoritmo E (Algoritmo de Euclides) : E 1: Encontrar o resto — Dividir m por n e afectar r com o resto (0<=r Jeantain( Point ) - paint paint containg Point) addPoint( Point } P a 1 Triangle Classe Legenda Herange Nome da classe Classe base alributo : tipo método( argumentos } : tipo_de_retorno T Classe derivada Agregagao Nome Classe A kc Nome __ es aage| Classe B Figura 1.6 — Relacionamento de classes Form 20 © FCA. EDITORA DE INFORMATICA Generalidades A classe base Form, constitui-se a “matriarca de uma familia de classes de objectos”, e consubstancia na sua estrutura (dados e métodos ou fungdes) as caracteristicas que todas as suas classes descendentes irao herdar e redefinir adequadamente. De uma classe podem derivar-se outras classes descendentes e criar tantos objectos quantos desejarmos. No entanto, casos ha em que se define como base de uma hierarquia, uma classe, denominada abstracta, que, sendo de facto o “germe” das outras, dela no se criam objectos. A sua definigSo destina-se exclusivamente a poder derivar dela outras classes, e dessas criar instancias (objectos dessas classes). A Figura 1.6 mostra, usando diagramas de classes [Destilled97], a classe abstracta Form, e varias classes dela descendentes, essas sim, efectivamente concretas. Os métodos contain() e paint () sao comums 4 classe base e a todas as classes derivadas, tendo no entanto desempenhos diferentes conforme os objectos sobre os quais so invocados, o que concita a adopt dos mecanismos de polimorfismo nesses métodos. 1.5 As linguagens C e C++ A linguagem C foi desenvolvida nos Laboratérios BELL em 1970 por B. W. Kernighan e D. M, Ritchie [Kernighan88]. Caracteriza-se como uma linguagem de relativamente baixo nivel (préxima da linguagem da mdquina), capaz de gerar cédigo eficiente em dimensao (ntimero de instrugdes-maquina geradas na compilacao) e rapidez de execugio. Em 1983, foi normalizada pela ANSI (American National Standards Institute), uma versio melhorada da linguagem C, o standard ANS/ C. Em 1988, também nos Laboratérios BELL, Bjarne Stroustrup [Stroustrup94} desenvolveu uma extensdo a linguagem ANSI C, destinada a suportar todos os paradigmas de programagao a que atras nos referimos, e que tomou a designagio de C++ Em Janeiro de 1997, Bjarne Stroustrup publicou uma terceira edig&o do seu livro [Stroustrup97] que actualiza a linguagem conforme 0 previsivel standard (ISO-ANS) que nesse momento se avizinhava. © FCA-EDITORADE INFORMATICA 21 Programa¢ao em C++ - Conceitos Basicos e Algoritmos Em Novembro de 1997, foi aprovado o Standard Internacional que abrange no s6 a linguagem C++ como as bibliotecas que a suportam. O C++ veio acrescentar novas potencialidades & linguagem C, e tem evolufdo no sentido de melhor responder &s necessidades actuais da engenharia de software, que Bjarne Stroustrup sintetiza da seguinte forma: * Refinar cada vez mais os conceitos de estruturacdo, por forma a que 0 trabalho de grandes equipas se possa harmonizar e compatibilizar com um minimo de desajustes (erros cometidos). * Atingir indices de reutilizagdo de cédigo mais elevados, por forma a que grande parte do trabalho que for desenvolvido para um dado objectivo, possa vir a ser utilizado noutros objectivos, sem que constantemente se tenha de “Teinventar a roda”. 1.6 Resumo Um computador consiste numa arquitectura de componentes electrénicos e mecinicos (hardware) e um conjunto de programas ‘{software) localizados em discos ou em memé6ria permanente interna. Os principais componentes hardware de um computador so 0 CPU (Central Processing Unit), a ROM (Read Only Memory), a RAM (Random Access Memory), o Terminal, 0 Disco Rigido, 0 floppy disk, 0 leitor de CD-ROMs e 0 médulo Entrada/saida destinailo a estabelecer comunicagdes com o exterior. Os componentes software principais de um computador sao: o sistema operativo, as ferramentas de desenvolvimento e os programas de aplicag&o. O sistema operativo MS-DOS, hoje em declinio, ainda se mantém disponivel em simultaneo com os mais actuais, com a vantagem pedagégica de apresentar uma interface de comandos com um menor nivel de abstracgaio. Num computador, a informagéo em meméria secundaria est4 organizada em ficheiros ¢ directérios estruturadas em forma arborescente. A primeira barreira a vencer por quem aprende a programar, consiste em disciplinar 0 raciocfnio por forma a’ traduzir algoritmicamente a resolucao de um problema. Define-se como algoritmo, um conjunto finito de regras através das quais se pode dar execugiio a um dado processo. 22 © FCA -EDITORA DE INFORMATICA Generalidades Um algoritmo deve satisfazer os requisitos de ser finito (terminar apés um mimero finito de accdes), ser inteligivel (as acgdes evocadas serem definidas sem ambiguidade), ser exequivel (as acgGes evocadas poderem realizar-se num lapso de tempo satisfatério) e ser caracterizdvel (existir um conjunto de entradas, eventualmente vazio, do qual o processo dependa e existir um conjunto de saidas ou resultados de que se conhega a relagiio funcional com as entradas). Os algoritmos podem ser representados em forma narrativa comum, fluxograma (flowchart) e pseudo cddigo. As linguagens de programagao constituem uma forma de representagio de algoritmos, segundo normas gramaticais rigorosas, que retine a virtude de poder ser convertida numa sequéncia de instrugdes através das quais 0 computador cumpre as regras nele preconizadas. A evolugao dos paradigmas de programagaéo tem acompanhado a evolugio em rapidez de desempenho dos computadores ¢ 0 ,correspondente aumento de complexidade das aplicagdes a desenvolver. Em sequéncia temporal, destacam-se como estilos ou paradigmas de programagao, a programagio nao estruturada, a programacdo procedimental, a programacio modular, a abstracgao de tipo de dados e a programagéio orientada por objectos. Bjarne Stroustrup desenvolveu em 1988 a linguagem C++ como uma extensio & linguagem C ANSI, por forma a suportar o paradigma da Programagao Orientada por Objectos e todos os anteriores. 1.7 Exercicios Usando a linguagem de comandos DOS ou a interface Windows que tenha disponivel, execute os seguintes exercicios: 1. Copiar para o disco rigido a estrutura de directérios, com os ficheiros fonte (“.cpp” e “.h’) dos exemplos situados no CD-ROM anexo. Acrescente na arborescéncia, em cada um dos directérios dos capitulos, um novo directério, com o nome Resol, onde coloque posteriormente os exercfcios propostos. 2. Os manuais de culindria sao, na sua esséncia, uma colectanea de algoritmos, descritos em forma narrativa abreviada. Tendo em conta os constituintes dos algoritmos estruturados, descreva formalmente (forma narrativa abreviada e fluxograma) o algoritmo correspondente a receita do seu petisco favorito. © FCA-EDITORA DE INFORMATICA — 23, Programacao em C++ - Conceitos Bésicos e Algoritmos 24 Descreva, em fluxograma, o algoritmo para estabelecer uma ligagao telef6nica, na rede piblica fixa, com o mimero N de 7 algarismos (N1, N2, +++ N7). O algoritmo deve descrever todos os passos a dar, desde “levantar o auscultador” até deixar de ouvir o “sinal de chamada” (ligagao estabelecida), ou até ouvir “sinal de impedido” (ligagdo impedida), ou, passado algum tempo, de no ouvir qualquer sinal (desisténcia). © FCA- EDITORA DE INFORMATICA eIniciagao a linguagem C++ Objectivos Familiarizagao com um ambiente de desenvolvimento de programas; . Compreender a estrutura bdsica de um programa em Crt, Conhecer os tipos basicos de varidveis; Saber declarar, definir e iniciar varidveis; Conhecer a representagaio, significado e precedéncia dos operadores; Saber escrever programas envolvendo expressdes aritméticas ¢ instrugGes de entrada e saida formatada; Saber usar as instrugdes de controlo de execugio, if-else, switch, while, do-while, foreo operador terndrio (““? :”); Conhecer 0 comportamento das instrugdes break, continue e goto; Familiarizar-se com 0 acesso por indice aos elementos de um array; Ser capaz de escrever pequenos programas, envolvendo instrugées de controlo de execugao. © FCA-EDITORA DE INFORMATICA 25 Programagao em C++ - Conceitos Basicos e Algoritmos 2.1 Introdugao Este capitulo esta organizado sem o pressuposto de conhecimentos prévios acerca de programacao da parte dos leitores. Daf alguns pormenores supérfluos pata quem j4 tenha experiéncia de programagiio com outras linguagens e pretenda aprender a Jinguagem C++. A esses, temos de pedir o incémodo de filtrar a leitura desses pormenores. Para os leitores novigos em programagao, este capitulo deve ser encarado como uma primeira abordagem, genérica e superficial, de conceitos que, posteriormente, terdio um tratamento mais pormenorizado e abrangente. No entanto, os objectivos que nele se pretendem atingir sio imprescindfveis para a continuidade da aprendizagem. Pressupde-se que 0s leitores disponham de uma plataforma de desenvolvimento de programas em C++ (Borland C++, Visual C++ ov qualquer outra) sobre um PC. A utilizagao dos ambientes integrados de desenvolvimento, requer informagao especifica do fabricante (ou de um utilizador ja experiente) que deixamos ao cuidado do leitor conseguir. O objectivo do capitulo s6 poderd ser atingido, se a sua leitura for acompanhada do teste em computador dos cerca de trinta exemplos de programas que dele constam, da experimentagiio de pequenas variantes de comportamento sobre cada um deles, e da implementagao dos exercicios do fim do capitulo. Atingir este objectivo, constituird um passo muito importante para um novigo que se proponha aprender a programar. O facto da linguagem C++ imergir inicialmente como uma extensio A linguagem C, implica que a fase inicial da aprendizagem da linguagem C++ incida sobre 0 subconjunto C em que 0 C++ se suporta. Os conceitos a assimilar pertencem, indistintamente, a linguagem Ce a linguagem C++. Os conceitos, definigdes e terminologia corrente acerca da linguagem vao sendo introduzidos de modo informal, a pretexto da andlise dos sucessivos exemplos de programas apresentados. Um dos problemas mais delicados na iniciagio a ProgramacgSo consiste na introdugao dos conceitos de “apontador” e “referéncia” para varidveis. O uso da linguagem C++ como suporte da aprendizagem de programacao tem a vantagem de permitir delegar para uma fase j4 adiantada da aprendizagem a introdugdo desses conceitos, dado que as primitivas de entrada/safda de que dispée dispensam a sua introdugao prematura. Daf que nao sejam abordados neste capitulo. 26 © FCA-EDITORA DE INFORMATICA Iniciagao a linguagem C++ © capitulo nao deve ser lido numa forma sequencial rigida. Sugere-se uma primeira leitura em que, eventualmente, se retenham algumas dtividas na interpretagio do texto (por demasiado sucintas as explicagGes) que na sequéncia da leitura venham a ser melhor esclarecidas. Isto porque os conceitos envolvidos est&io imbricados entre si e nao podem ser tratados em sequéncia. Sucessivas leituras permitirao a coeso entre esses conceitos esclarecendo diividas que anteriormente subsistiam. 2.2 Estrutura basica de um programa B tradicional propor como exercfcio introdutério ao estudo da linguagem C++, a andlise de um programa que mostra no ecra a mensagem de saudagio "Hello, World!" (herdado dos pedagogos da linguagem C e adequadamente adaptado para C++) — [Stroustrup92] , [Kernighan88]. : Exemplo 2,1 — Programa para mostrar no ecra uma mensagem #include /* Escrever na console output uma mensagem de saudacdo af int main () { // Mensagem a mostrar no ecra. cout << "Hello, World!"; return 0; Este pequeno programa, apesar de muito simples, serve de pretexto para realgar desde ja varias particularidades interessantes da linguagem, como sejam: * Um programa em C++ € constituido por varias fungées, uma das quais necessariamente tem a denominagdo main (), que, de todas as outras fungdes, seré sempre a primeira a ser posta em execucio. As outras fungdes entram em execug¢ao ao serem invocadas na fungao main() ou em qualquer fung&o que main () tenha previamente invocado; + A fungio main (), como qualquer outra funcio, é definida (descrita) com um cabecalho (header) e um corpo de declaragées, definigées ¢ instrugdes. O corpo da fungiio é escrito entre chavetas. Do cabegalho consta o tipo do valor que a fungao devolve, o seu nome e, entre paréntesis, os parametros formais que for usar, Em main() do Exemplo 2.1, o paréntesis existem para cumprir © FCA-EDITORADE INFORMATICA — 27 Programacao em C++ - Conceitos Basicos e Algoritmos a’sintaxe de fungdo e a omissdo de pardmetros significa em C++ a sua inexisténcia; * No caso das fungées retornarem um valor, o valor que retornam € 0 do argumento da instrugéo return invocada no seu corpo. No programa acima, a fungéo main() retorna o valor zero a fungao que a chama. Neste caso significa retornar ao sistema operativo o valor zero; * A linguagem C++ faz distingZo entre palavras escritas em maitisculas e mintisculas. Aceita letras maitisculas ou mindsculas em nomes de fungdes, nomes de varidveis e nomes de constantes. No entanto, as palavras chave, da linguagem, sao necessariamente escritas com letras mintisculas; * Os comentarios séo inseridos no programa antecedidos do preambulo “//” (duplo slash), que oculta ao compilador tudo o que se escreva entre esse predmbulo e o fim de linha corrente. Quando se pretenda inserir comentarios que ocupem varias linhas de texto, podemos envolver o comentdrio entre a marca de inicio “/*” e a marca de fim “* /”, Os comentirios a um programa, sfo segmentos de texto narrativo destinados a ajudar as pessoas que se proponham a analisar o programa (entender os algoritmos que Ihe est&o subjacentes), Séo uma componente muito importante do programa, dado que algumas subtilezas dos algoritmos necessitam de ser esclarecidas narrativamente para que possam ser facilmente entendidas, quer por outra pessoa, quer pela prépria uns tempos depois de as ter escrito. O estilo de um programa revela-se nao sé pelos algoritmos que envolve, como pelos comentérios que 0 apoiam. Os comentédrios devem ser pertinentes, sucintos e esclarecedores. Naturalmente que, nos exemplos de programas que itemos mostrar ao longo deste capitulo, incluiremos alguns comentarios que soam ingénuos (por 6bvios) a programadores mais experimentados. A linguagem C++ € tida como das mais portaveis, isto é, 0 cédigo desenvolvido em C++ é independente do sistema operativo e das caracteristicas especificas do hardware do sistema (processador, terminal, dispositivos de meméria secundaria, periféricos associados, etc.). Isto porque, quer as bibliotecas de fungdes que desempenham acgGes de entrada e saida de dados, quer as que sejam especificas do sistema em que o programa va ser executado, nao pertencem propriamente @ linguagem. 28 © FCA- EDITORA DF INFORMATICA Tniciagao a linguagem C++ Além da biblioteca standard de fungdes (standard library) que providencia fungdes normalizadas para muitos objectivos, todos os compiladores de C++ dispdem de outras bibliotecas para fins especificos, que variam conforme o sistema operativo e conforme 0 compilador. No programa anterior, consta logo na primeira linha a incluso do ficheiro header iostream.h, que é um ficheiro de texto contendo varios protétipos de fungGes, macro-instrugGes ¢ declarages de tipos, referentes a acgdes de entrada e safda de dados, quer por via da consola (monitor ¢ teclado), quer por via de meméria secundaria acedida sob a forma de ficheiro. - A linha de programa: #include € equivalente a escrever nesse local, todo o texto que consta do ficheiro iostream.h, situado num directorio “include” onde se situam vérios outros ficheiros com as declaragdes das fungdes de biblioteca. Sem esta inclusaio néo fazia sentido para o compilador (e daria erro de conipilagao) a instrugao: cout << "Hello, World!\n"; O operador “<<” (insersor) insere o segundo operando (neste caso a string "Hello, World! \n") no primeiro operando (0 objecto console output cout associado ao ecra). Uma constante string representa-se por uma sequéncia de caracteres envolvida por aspas. Um programa em C++ para objectivos ambiciosos (de complexidade elevada) descreve-se como um conjunto de declaragdes e definigées, situadas eventual- mente em diferentes ficheiros, que actuam como médulos e podem ser compilados separadamente. Na fase inicial de aprendizagem em que nos situamos, restringimos a nossa andlise € OS nossos conceitos, a programas muito simples constituidos exclusivamente pela fungio main() e por fungées predefinidas que constam das bibliotecas e cujas declaracdes so inclufdas automaticamente no programa através de direc- tivas #include destinadas ao pré-processador. Assim, 0 que se refere neste capitulo quanto a estrutura da linguagem, reflecte a simplicidade dos programas em estudo e iré sendo progressivamente complementado ao longo dos préximos capitulos, na medida em que se considere oportuno. O Exemplo 2.2 utiliza algumas das variantes possiveis do modo de representar quantidades ne sr, ¢ -»olve também a primitiva de repetigéo for. © FCA -EDITORA DE INFORMATICA = 29 Programagdo em C++ - Conceitos Basicos e Algoritmos Pretende-se, neste caso, mostrar no ecra um quadro que represente quantidades de 0a 16, nas bases de numeragio decimal, hexadecimal e octal. Exemplo 2.2 — Mostrar ntimeros em decimal, hexadecimal e octal #include #include void main() { // Primeira linha (declaragées e definigées). int lastNumber, inc, number; // Segunda linha (afectagdo de lastNumber) . lastNumber = 16; // Texrceira linha (afectac&o de ine). ine = 1; // Quarta linha (cabegalho da tabela a mostrar). cout << "dec\thex\toctal" << endl; //'\t' cardcter tab. // Quinta linha (instruca&o de repeticd&o for). for ( number = 0; number <= lastNumber; number = number + inc ) cout << dec << number << ‘\t' << hex << number << '\t! << oct << number << endl; Em C++, as varidveis tém de ser declaradas antes de serem usadas. A inclusio dos ficheiros de declaragdes iostream.h e iomanip.h permite que se possam invocar no programa instrugdes neles declaradas, que providenciam aescrita formatada no ecra, O corpo de main() situa-se entre chavetas e dele fazem parte declaragdes de varidveis, operagdes de afectacio, um ciclo de tepeticgfio for e expressdes de escrita formatada (safda de dados). Neste caso, a fungao main () foi declarada sem valor de retorno, o que em C++ é denotado com a palavra chave void antecedendo o nome da fungio. Este facto implica que deixa de constar do corpo da fungao a instrug3o return e que ndo seja retornado ao sistema operativo um valor explicito. Nos exemplos que se seguem, usaremos indistintamente a fungio main() com ou sem valor de retorno (retornando int ou void) dado ser indiferente para o sistema operativo uma ou cutra das alternativas. $6 no caso do programa vir a ser invocado no corpo de outro programa que utilize o valor de retorno, seria necessdrio explicitar esse valor. 30 © FCA-EDITORA DE INFORMATICA Iniciagio & linguagem C++ Na primeira linha de main(), consta a declaragio e definig&o das varidveis lastNumber, inc, e number, como sendo do tipo inteiro (int). Da segunda e terceira linhas consta a afectagio das varidveis LastNumber e inc com valores numéricos. Da quarta linha consta uma instrugiio de saida de dados que visa mostrar no ecra. a linha de texto: "dec hex octal" Da quinta linha consta uma instrug&éo for que impée sucessivas execugdes da instrugao situada no seu corpo. O ntimero de repetigdes é condicionado pelo valor da expressfo de teste - “enquanto o valor de number permanecer menor ou igual ao valor de LlastNumber, executa a instrugiio do seu corpo e incrementa de inc o valor de number”. O formato da instrugio for €: for (; ; ) Do corpo da instrugio for do Exemplo 2.2, consta uma instrugio-de sada de dados que visa mostrar no ecra, em linhas sucessivas, as quantidades de 1 a 16 expressas nas bases de numeragao decimal, hexadecimal ¢ octal. O operador “<<” (insersor) aplicado ao console output cout promove a escrita de dados no ecra. O formato da escrita (base de numeragao da representagao) é especificado invocando manipuladores. Da expressa cout << dec << num << “-" << hex << num << ‘-' << oct << num << endl; constam os manipuladores dec, hex e oct que modificam o formato de escrita de inteiros (na auséncia de manipulador, sao escritos na base decimal), e endl que provoca a mudanga de linha e garante que todos os dados anteriormente inseridos ficam visiveis no ecra (flush). 2.3 Ambiente integrado de desenvolvimento Os ambientes de desenvolvimento diferem entre si nalguns pormenores que se impée estudar através da respectiva documentacao. A alternativa (bastante mais cémoda) é pedir ajuda a um utilizador j4 experimentado no ambiente que se v4 utilizar. Da documentagiio dos ambientes constam exemplos de programas e a explicagéo do modo como devem ser compilados e postos em execugao. © FCA-EDITORADEINFORMATICA = 31 Programagao em C++ - Conceitos Basicos e Algoritmos A Figura 2.1 e a Figura 2.2 mostram o aspecto de dois ambientes integrados (dos mais utilizados em Computadores Pessoais) a correrem no Windows 95. Sener re mata) fenSagen a mostrar no ecran Cour << Mietiog worth include int main( ) { 77 Mensagex a nostrar no eoran| cout << “Hello, World! * return 0; [coupiling lel io.cpp [[iinking... WEello.exe'~ 0 error(s), Figura 2.2 — Ambiente integrado Microsoft Visual C++ (4.1) 32 © FCA-EDITORA DE INFORMATICA Iniciagdo a linguagem C++ Qualquer que seja o ambiente integrado de desenvolvimento usado, pde-nos disponfveis os seguintes médulos: * Editor de texto; * Compilador; * Linker, + Debugger (depurador de erros). A Figura 2.3 mostra as varias fases e operagdes envolvidas na obtengao de um ficheiro executavel. Modul saul Executavel| & Enunciado odulo ulo do Feu YM canst VCOMPMlAd TEP (EXE) ‘wary OK | problema ou (.CPP) (.OBu) «| (COM) Figura 2.3 — Fases envolvidas na obtengdo de um ficheiro executavel 2.3.1 Editor O editor destina-se a dar suporte a escrita de programas e¢ a criar os ficheiros fonte com © texto editado. Aos ficheiros fonte devem-se atribuir extensdes do nome normalizadas (“. cpp”, “.cc”, “.c”, etc.), que dependem do compilador que se utiliza. Durante a edi¢do é possivel substituir segmentos de texto, inserir ou apagar texto no meio de uma linha, acrescentar ou apagar linhas em qualquer sitio, partir ou juntar linhas, mover texto de um sitio para outro, acrescentar texto proveniente de outros ficheiros, etc. Os ficheiros fonte destinam-se a ser posteriormente compilados. 2.3.2 Compilador © compilador toma como entrada um ficheirofonte e gera como safda um ficheiro objecto (com o mesmo nome e com extensio “.obj”, “.o”, etc.) no qual o programa ja se encontra convertido em cédigo mAquina do CPU do sistema, mas ainda numa forma localizdvel. Para que se converta em cdédigo executdvel tera que, posteriormente, ser tratado pelo médulo linker. © FCA-EDITORA DB INFORMATICA — 33 Programagio em C++ - Conceitos Basicos e Algoritmos Um compilador é especifico para uma determinada linguagem e para um determinado Sistema Operativo/CPU. A partir das regras sintdcticas e semanticas da linguagem, analisa 0 texto do programa fonte e produz um conjunto ordenado de instrugées maquina localizéveis. As regras de uma linguagem de Programagao sao muito precisas e € comum o programador cometer erros de sintaxe e/on de seméantica quando escreve um Programa. O compilador assinala as violagdes as regras da linguagem que reconhece no texto, indicando 0 local em que ocorrem e a natureza do erro cometido. O reconhecimento pelo compilador da existéncia de erros, implica que se tenha de teeditar o ficheiro fonte, tantas vezes quantas o necessario, por forma a corrigir esses eros. Além dos erros, 0 compilador assinala também avisos (warnings) sempre que teconhece, no ficheiro fonte, usos pouco comuns das regras da jinguagem que, nio constituindo propriamente violagdes, podem indiciar enganos do programador. E recomendavel tomar também em consideragio esses avisos e eliminar do ficheiro fonte as suas causas. 2.3.3 Linker Um ficheiro biblioteca (com extensio “.1 ib”) contém médulos (cédigo méaquina localizdvel) com definigdes de fungGes e de objectos. O utilitério linker, tal como 0 compilador, quando encontra alguma condigio an6mala nos ficheiros sobre quais é aplicado, gera mensagens de erro. Sera por exemplo 0 caso de nao encontrar no ficheiro “.iib” (de library) as definigdes correspondentes as declaragées inclufdas no programa. Ao preparar o ambiente para desenvolver e executar um programa, o programador deve explicitar quais os directérios onde se situam os ficheiros incluédos C.n%ye os ficheiros bibliot ca (“. Lib”), Num programa envolvendo varios ficheiros fonte (0 que néio é 0 caso dos programas analisados neste capitulo), a obtengdo do fichciro executavel desse Programa implica a compilag&io de cada um dos ficheiros fonte constituintes, seguida da ligagao dos ficheiros objecto resultantes da compilacao. Este objectivo € facilitado pelos ambientes integrados de desenvolvimento, permitindo criar um ficheiro projecto (com extensio “prj”, “. ide”, “.mdp”, etc.) onde conste a lista dos ficheiros objecto ou dos ficheiros fonte constituintes do programa. 34 © FCA-EDITORA DE INFORMATICA Tniciagao a linguagem C++ 2.3.4 Debugger Podemos distinguir num programa trés tipos de erros: + Enros gramaticais reconhecidos ¢ assinalados pelo compilador; * Enrros de ligagio detectados pelo linker; * Erros ldgicos, s6 reconheciveis em run time (durante a execugio) devidos a enganos na concepcio ou codificagdo dos algoritmos. Nos exemplos de programa que nos propomos estudar neste e nos préximos dois capitulos, nio se revelam ainda grandes dificuldades quanto 4 depuragiio de quaisquer destes tipos de erros. No entanto, quando progredirmos para programas de maior complexidade, a fase de depuragio de erros (debugging) de um programa tende a demorar tanto tempo quanto © que demora a conceber e escrever 0 programa. Quanto ao primeiro tipo de eros, as ajudas do compilador s&o relevantes e simplificam muito a respectiva correcgiio. Quanto aos erros de ligagao detectados e identificados pelo linker, a sua correcg’io também nao constitui problema de monta. A parte mais dificil do debugging (em programas de média e grande complexi- dade) reside na correcgao dos erros légicos. Daf que o ambiente de desenvolvi- mento ponha disponfvel um grande nimero de recursos tendentes a ajudar o programador nessa tarefa. Os erros légicos podem traduzir-se, quer por falsos resultados quanto aos objectivos a que o programa se propée, quer por fazer abortar 0 programa (interromper a sua execugao) ou provocar ciclos infinitos de execuctio que exijam uma acgao de reser ao computador para que este retome a sua actividade normal. O médulo debugger do ambiente de desenvolvimento disponibiliza varios mecanismos de ajuda para detectar e emendar os erros Idgicos. Nomeadamente: * Poder correr (executar) 0 programa passo a passo (parando a execugdo em todas as linhas do programa); * Poder correr o programa até A linha onde se coloque o cursor; * Marcar varias linhas do programa como “pontos de paragem” (break points) por forma a que, sempre que o programa passe por essas linhas, pare a execucao. © FCA -EDITORA DE INFORMATICA — 35 Programagiio em C++ — Conceitos Basicos e Algoritmos Estes modos de fazer parar © programa, articulam-se com a possibilidade que 0 debugger também nos disponibiliza de poder visualizar o valor que as varidveis tomam nos sucessivos pontos de paragem e assim poder inferir o que esta a correr mal no programa. As técnicas de debugging constituem um aspecto muito importante na aprendiza- gem da programagdo. Mas releguemos isso para uma fase mais avancada do estudo, que “até 14, nfio nos doa a ndés a cabega”’. 2.4 Tipos, Operadores e Expressées Um nome ou identificador tem que ser declarado antes de poder ser usado. Isto 6, tem que se informar o compilador quanto ao tipo de entidade (varidvel, constante, fungio, etc.) que esse nome refere. Declarar uma entidade, consiste exclusivamente em anunciar a sua existéncia, explicitando-lhe o nome e 0 tipo. Por exemplo: * A declaragiio extern int x; anuncia que existe a definicZo de uma varidvel do tipo inteiro, de nome x; * A declaragao ou protétipo de fungao float sqrt ( float ); anuncia a existéncia de uma fungaio de nome sqrt, que recebe um parametro do tipo float e que retérna um valor do tipo float. A maior parte das declaragdes so também definigdes, isto é, definem a entidade que passa a ser designada por esse nome. Definir uma entidade, implica reservar espago em memiria onde essa entidade vai residir (caso das varidveis e constantes) ou explicitar as instrugdes que determi- nam o seu comportamento (caso das fungdes). A instrugdio: int y; // Varidvel y do tipo inteiro € simultaneamente uma declaragio e uma definigéio de varidvel, dado que, para além de declarar a sua existéncia, reserva espaco em meméria para ela residir, A instrugao: char ch = 'k!; declara e define uma varidvel de nome ch ¢ inicia essa varidvel com o cardcter 'k', 36 © FCA- EDITORA DE INFORMATICA Iniciagdo a linguagem C++ O nome a atribuir a constantes, varidveis e fungdes, deve constituir uma mneménica ou abreviatura sugestiva da acgaio ou do papel que essas entidades desempenham no programa. Adopta-se, normalmente, terminologia inglesa, dado © poder de sintese desta lingua. Os nomes a atribuir-s entidades do programa nunca poderao coincidir com as palavras chave da linguagem (palavras com significado especifico no C++). Caso esta regra nao seja cumprida, o compilador emite mensagens de erro dificilmente decifraveis (fica seriamente perturbado). O significado de cada uma das palavras chave vai sendo dado ao longo do texto, & medida que se tornar oportuno. A Tabela 2.1 resume as palavras chave do C++, que nao podem ser usadas para objectivos diversos do scu significado, Palavras chave do C++ asm auto break + case catch char class ‘const_cast continue default delete do double dynamic_cast |else enum explicit extern false float for friend goto if inline int mutable namespace |new operator private register reinterpret_cast [return short static static_cast struct switch this throw true try typedef typename union unsigned using virtual wehar_t while Tabela 2.1 — Palavras chave Quando se declara uma varidvel, o tipo dessa varidvel determina quais as operagées a que pode ser sujeita e 0 espaco na meméria necessério para a alojar. Como constituintes de um programa, podem constar também operadores aritméticos, ldgicos e relacionais (“+”, “-”, “*”, “/?, “=”, “&&”, “II”, etc). Com varidveis e operadores, constroem-se expressdes as quais fica associado um. valor. Numa expressio, o tipo dos operandos determina como deve ser interpretada e executada a operagao. © FCA-EDITORA DE INFORMATICA — 37 Programagao em C++ - Conceitos Basicos e Algoritmos Seja, por exemplo, um programa para calcular a drea de um circulo: Exemplo 2.3 — Calcular a 4rea de um circulo #include void main () { const float pi = 3,14159265¥; int radius; float area; cout << "Qual o raio do circulo? "; cin >> radius; area = pi * (radius * radius); cout << "A area e’ " << area << endl; A primeira linha de cédigo do programa: #include € uma directiva para o pré-processador que promove a inclusio no programa das declaragdes das acgdes de entrada e saida (input/output) de dados que vao ser invocadas em main () e que constam do ficheiro iostream.h. A mera incluséo deste ficheiro promove automaticamente a definigio de um objecto cin (console input) do tipo istream (canal de entrada sequencial de informagiio, normalmente associado ao teclado), e de um objecto cout (console output) do tipo ostream (canal de safda sequencial de informago normalmente associado ao ecra). . A instrugao: const float pi = 3.14159265F; declara, ¢ simultaneamente define e inicia, uma constante de nome pi do tipo float (virgula flutuante). As instrugdes: int radius; float area; declaram e definem as varidveis radius do tipo inteiro e area do tipo float. Na linha seguinte, a instrugao: cout << "Qual o raio do circulo? "; emite uma mensagem ao utilizador, perguntando-lhe qual o valor do raio da circunferéncia da qual deseja que seja calculada a area. 38, © FCA- EDITORA DE INFORMATICA Iniciagdo & linguagem C++ O operador inserser (“<<”) tendo como operando esquerdo 0 console output cout (associado ao ecra) e como operando direito uma string constante, mostra no ecra os caracteres que constam nessa string. Por string constante entende-se uma sequéncia ou cadeia de caracteres representa- da entre aspas. A instrugao da linha seguinte: cin >> radius; fica a aguardar que o utilizador introduza, através do teclado, o valor do raio desejado, seguido de um caracter terminador de ntimero, ou seja, qualquer cardcter que nio possa fazer parte do nimero, O operador extractor (“>>”) tendo como operando esquerdo 0 console input cin (associado ao teclado) e como operando direito a variével radius do tipo int, afecta a varidvel radius com 0 valor inteiro recolhido através do teclado. A linha seguinte do programa: area = pi * (radius * radius); é uma instrugdo expressao da qual constam um operador afectagiio “=" e dois operadores multiplicagao (“*”). A consequéncia desta instrug&o é afectar a varidvel area com o valor da expressao aritmética que se situa A sua dircita. Subjacente a esta expresso aritmética levanta-se o problema dos seus operandos nao serem todos do mesmo tipo: 0 radius é do tipo int e pi é do tipo Float. Naturalmente que a linguagem define regras, que resolvem circunsténcias como esta, da forma que intuitivamente se espera e que se descrevem mais adiante. E automaticamente feita a conversdo por forma a que as operagdes se realizem sobre varidveis do mesmo tipo. Retém-se, para j4, que a expressaio acima toma o tipo float (com parte inteira e parte decimal). A instrugo: cout << "A area e’ " << area << endl; € novamente uma instrugdo de safda de dados que tem por consequéncia mostrar no console output cout (no ecra) a mensagem que exibe o valor da area calculada pelo programa. 2.4.1 Tipo de dados e representacao O C++ disponibiliza um conjunto de tipos predefinidos que constam da ‘Tabela 2.2 e que se denominam tipos fundamentais (ou basicos). © FCA-EDITORA DE INFORMATICA — 39 Programagao em C++ - Conceitos Basicos e Algoritmos Tipos fundamentais Significado int inteiro char cardcter bool valor légico (Boolean) float virgula flutuante (floating point) de precisio simples double virgula flutuante de preciso dupla Tabela 2.2 — Tipos fundamentais (ou basicos) Estes tipos fundamentais admitem variantes, que podemos invocar através dos qualificadores que constam da Tabela 2.3. Qualificadores | Aplica-se a Representa short int menor dimensao Tabela 2.3 — Qualificadores de tipo Os qualificadores short e long tém, como finalidade, alterar as dimensGes (e 0 alcance) dos tipos a que sejam aplicados, enquanto que o qualificador unsigned da significado diferente a representago maquina de varidveis do tipo a que se aplica. Tipo ‘Ambiente 16 bits ‘Ambiente 32 bits signed int 2 bytes 4 bytes (de -32768 a +32767) (2 147 483 6482 +2 147 483 647) unsigned int 2 bytes 4 bytes (de 0 a 65535) (de 0a 4 194.967 295) Eloat 4 bytes 4 bytes (de 3.4E-38 a 3.4E+38) | (de 3.4E-38 a 3.4E+38) 40 © FCA-EDITORA DE INFORMATICA, Iniciagao a linguagem C++ Tipo ‘Ambiente 16 bits ‘Ambiente 32 bits bool L byte 1 byte (false, true) (Zalse, true) Signed char 1 byte T byte (de -128 a +127) (de -128 a +127) unsigned char L byte 1 byte (de 0a 255) (de 0 a 255) Short ou 2 bytes 2 bytes short int (de -32768 a +32767) _| (de -32768 a +32767) unsigned short ou |2 bytes 2 bytes unsigned short int |e 65535) (de 0 2 65535) Tong ou long int |4byres 4 bytes unsigned long int ou unsigned long double ou long double (de - 2 147 483 648 a : +2 147 483 647) 4 bytes (de 0 a4. 294 967 295) 8 bytes (de - 2 147 483 648 a +2 147 483 647) 4 bytes (de 0 a 4 294 967 295) 8 bytes (de 1.7E-308 a 1.78+308) | (de 1.7E-308 a 1.7E+308) Tabela 2.4 — Alcance e espaco de meméria ocupado pelos tipos basicos Para 0 caso dos computadores /BM compativeis, que pressupomos sejam o suporte das aplicagdes a desenvolver, o alcance ¢ 0 espaco de meméria ocupado pelos tipos predefinidos depende do tipo de plataforma para o qual se esté a desenvolver © programa (DOS, Win 32 ou outra). A Tabela 2.4 indica os valores correspon- dentes aos ambientes de 16 bits (DOS) e de 32 bits (Win 32). A partir dos tipos de varidveis basicos, definem-se outros tipos de varidveis ditos tipos derivados, tais como arrays, enumerados, apontadores, referéncias, classes, estruturas ¢ unides desses tipos basicos e aos quais adiante nos referiremos. Em C++, para além dos tipos basicos e derivados, 0 programador pode definir outros tipos (classes) e instincias desses tipos, genericamente referidas por objectos. O conceito de classe sera introduzido no capitulo V. O Exemplo 2.4 € um programa que mostra como sio formatados dados usando o formato por omissao de especificagao, e a forma como é possfvel mudar a forma- tagao. © FCA-EDITORADE INFORMATICA 411 Programagao em C++ - Conceitos Basicos e Algoritmos Exemplo 2.4 — Mostrar dados formatados #include #include void main () { int intNumber = 255; float floatNumber = 99.9989F; long bigNumber = 12505007L; // long int por omissao. cout << "12345678901234567890"; cout << intNumber << endl; cout << setw(6) << intNumber << endl; cout << bigNumber << endl; cout << floatNumber << endl; ° ecra, apds a execugao do Exemplo 2.4, tera o seguinte aspecto: 12345678901234567890 255 255 1250500750 99.9989 Deste programa, consta a declaragio e definicio da fungio main (), antecedida da inclusao do contetido dos ficheiros iostream.he iomanip.h. Do ficheiro iomanip.h consta a declaracio de manipuladores que podemos invocar nas acgGes de entrada e saida de dados, para impor variantes de formatagao. Na declaragao das varidveis utilizou-se a facilidade disponivel no C++ de simultaneamente definir ¢ iniciar varidveis com um dado valor. A varidvel intNumber 6 iniciada com o valor inteiro 255 correspondente a OOFF em hexadecimal [Pimenta96]. O operador “<<” (insersor) aplicado ao console output cout permite a escrita de dados no ecra, conforme o tipo do segundo operando (0 que se designa vulgarmente por escrita formatada). Se 0 segundo operando for do tipo int sera escrito um valor inteiro, se 0 segundo operando for um manipulador as escritas seguintes satisfazem as especificacdes do manipulador. Na expresso: cout << setw(6) << intNumber << endl o manipulador setw(6) especifica que, para o valor a mostrar no ecrA, deve ser 42 © FCA-EDITORA DE INFORMATICA Iniciacao a linguagem C++ reservado um espago de 6 caracteres, O manipulador end] provoca mudanga de linha e garante que a mensagem é de imediato mostrada no ecra. O Exemplo 2.5, 1é do console input (teclado) um valor inteiro, e escreve-o no console output nas bases octal, decimal e hexadecimal. Exemplo 2.5 — Ler umn ntimero e escrevé-lo em octal, decimal e hexadecimal #include #include void main () ¢ int number; cout << "Valor inteiro -> "; cin >> number; cout << "Em: " << endl; cout <<" oct "<< oct << number << endl; cout <<" dec "<< dec << number << endl; cout <<" hex "<< hex << number << endl; O operador extractor (“>>”) aplicado ao console input cin, lé texto do teclado e afecta varidveis de qualquer um dos tipos basicos que lhe sejam dadas como segundo operando, com valores correspondentes ao texto extraido. A varidvel number € do tipo int. A expressio: cin >> number afecta number com um valor inteiro correspondente aos caracteres “digito” extraidos do console input. Extrair o valor inteiro consiste em: * Consumir os caracteres separadores que antecedem os digitos. SAo separado- res: 0 espago (* '), o cardcter tab ('\t'), 0 carriage return (‘\r'), € 0 linefeed ('\n"); ¢ Construir o valor inteiro a partir dos dfgitos recolhidos, assumindo como terminador qualquer cardcter diferente de digito. Os manipuladores oct, dec, e hex, invocados na expresso de insergdo, especificam os formatos de escrita de number (tipo int). Na auséncia de manipuladores 0 C++ assume a base decimal. © FCA-EDITORADE INFORMATICA 43 Programagio em C++ - Conceitos Basicos ¢ Algoritmos 2.4.2 Representacao de caracteres Os caracteres so representados em meméria por valores numéricos do tipo char segundo uma correspondéncia definida pelo cédigo ASCII (American Standard Code for Information Interchange). O cédigo ASCII é um cédigo numérico, originalmente de sete bits mas que actualmente (no dominio da informatica) foi estendido a oito bits (am byte) por forma a representar 256 caracteres (os cédigos situam-se entre 0 e 255, alcance do tipo char). © sfmbolo do caracter entre plicas representa o valor numérico que lhe corresponde pelo cédigo ASCII. Por exemplo, na declaragao: char ch = 'z'; a varidvel ch € iniciada com 0 cédigo ASCII do cardcter 'z*. O operador insersor (“<<”) sobre cout, quando the seja dado como operando direito um valor do tipo char, mostra no ecra 0 simbolo do cardcter correspon- dente a esse valor. Por exemplo: char ch = 'z'; cout << ch; ‘ mostra no ecra o cardcter 'z'. Se previamente for executado um cast (coer¢ao) explicito para unsigned int da varidvel tipo char, o insersor toma comportamento diferente relativamente ao mesmo valor, mostrando nesse caso néo o cardcter 'z' mas sim 0 cédigo ASCII desse cardcter. Por exemplo: char ch = 'z'; cout << (unsigned int) ch; mostra no ecri o cédigo ASCII do cardcter 'z'. O Exemplo 2.6 mostra no console output 0 cédigo ASCII de todos os caracteres lidos do console input e termina a execugio quando for premida a tecla asterisco Cr). 44 © FCA- EDITORA DE INFORMATICA Iniciagao a linguagem C++ Este exemplo suscita os seguintes comentarios: * O operador insersor, tendo como operando esquerdo 0 cout ¢ como operando direito uma varidvel tipo char, mostra no ecr, nao o valor da varidvel mas sim 0 cardcter que tem por cédigo ASCII esse valor; * Para que o insersor aplicado ao cout mostre de facto o valor de uma varidvel tipo char e nfo o cardcter que Ihe corresponde, exige que se conyerta 0 tipo char para unsigned int através de um operador cast (mudanga de tipo de uma varidvel); * O operador extractor (“>>”), tendo como primeiro operando 0 cin ¢ como segundo operando uma varidvel ch do tipo char, afecta ch com o valor do cédigo ASCII do primeiro cardcter diferente de separador recolhido do teclado. Exemplo 2.6 — Mostrar 0 cédigo ASCII das teclas premidas #include void main () { char ch; cout << "Escrever caracteres (terminar com '*')." << endl; ein >> ch; // Recolhe o cardcter em ch. // Enquanto o cardcter recolhido ndo for '*', while (ch != '*') { cout << "O caracter " << ch << " tem o codigo ASCII " << (unsigned int) ch << endl; cin >> ch; No Exemplo 2.6 enquanto o cardcter lido for diferente de asterisco (a expressio “ch != '*'” for verdadeira) escreve o cardcter e o respectivo cédigo ASCII e 1é novo carécter (cin >> ch). A linguagem C++ dispée da instrugio de repetigio while que toma a forma geral: while () Neste caso, como no corpo do while se executa uma instrugao de escrita e uma de leitura (duas instrugGes), as instrugdes estdo envolvidas por chavetas. © FCA-EDITORA DE INFORMATICA 45 Programagao em C++ - Conceitos Basicos ¢ Algoritmos Para a generalidade das aplicagdes que envolvam representagiio de caracteres, nao € necessario conhecer 0 cédigo ASCII dos caracteres. Basta ter em consideragiio as seguintes particularidades deste cédigo: * Os primeiros 32 cédigos ASCi! (de 0 a 31) sao destinados a controlo ¢ néo correspondem a nenhum cardcter visivel no ecra. Provocam acgdes como por exemplo: mudanga de linha do cursor, posicionar 0 cursor no inicio da linha corrente, sinal sonoro, tabelamento, etc. * O cédigo ASCII dos caracteres numéricos seguem a ordem numérica dos caracteres que representam, tal que, por exemplo: "9! me '0' 4 9; ou seja, o cdédigo ASCII do cardcter nove ('9') € igual ao cédigo ASCil do caracter zero (‘0’), acrescido do valor 9. * O cédigo ASCII dos caracteres alfabéticos (maitisculos ou mimisculos) seguem também a ordem do abecedario, tomando os caracteres mimisculos cédigos ASCII maiores do que os maitisculos, tal que, sdo vélidas as seguintes relacdes: // Progresséo no alfabeto. tal 3 ss tat; // Convers&o para miniscula. "rt tat - At + IR // 26 caracteres alfabéticos. ‘gt - tat se 'Zt - At as (26 = 1); Exemplo 2.7.— Reconhecer se um cardcter é letra #include void main() { char ch; cout << "Prima uma tecla: cin >> ch; if (ch >= 'a! &@ ch <= tz! || // Letra mintiscula. ch >= 'A' && ch <= 'Z') = // Letra maidscula. cout << "E’ letra."; else cout << "Nao e’ letra."; cout << endl; Apés recolhido o cardcter do teclado, é executada a instrugiio if-else que condiciona a execugao de uma de duas acgdes, conforme o resultado da expressio de teste. 46 © FCA -EDITORA DE INFORMATICA Tniciagao a linguagem C++ A linguagem C++ dispde da instrugio de decisao bindria if_else que toma a forma geral: if () else Se a expressio de teste: (ch >= 'a' && ch <= 'z' || // Letra minuscula. ch >= 'A’ && ch <= 'Z') = // Letra maitiscula. for verdadeira, é escrita no ecra a frase “Bi letra.”, caso contrdrio sera escrita a frase “Nao é letra.”. Quer seja escrita uma ou outra das frases, a instrugdo seguinte provocard mudang¢a de linha (cout << endl). Entre as letras maitisculas e as letras mintisculas existem ('a'-'Z'-1) caracteres, por isso, para verificar se um cardcter é uma letra tem que se testar se é mintiscula ou maitiscula, Para verificar se um caracter € uma letra mintiscula temos que ver se 0 seu cédigo ASC/I é maior ou igual a 'a' e menor ou igual a ‘zh. O resultado de uma expressio em termos légicos (para testes de decisao bindria) é yerdadeira (true) se o seu valor for diferente de zero (!= 0) e falsa (false) se 0 valor for igual a zero (== 0). Exemplo 2.8 — Reconhecer se um cardcter € separador #include void main() { char ch; cout << "Prima uma tecla:"; ch = (char) cin.get();//cin >> ch néo recolhe separadores. if (ch == ' ' || ch "\t' [| ch == '\r' || ch == '\n') cout << "Nao e’"; cout << " separador." << endl; ‘Um caracter é separador se for espago (" '), tab ('\t'), carriage return (' \r') ou linefeed ('\n"). No Exemplo 2.8, quanto as instrugdes de entrada e saida, além das operagdes de insergio formatada em cout, invocamos também a fun¢gio membro get () declarada no ficheiro header iostream.h. Esta fungao, quando aplicada sobre o cin, recolhe um cardcter do teclado (separadores inclusive) e retorna o © FCA-EDITORADE INFORMATICA 47 Programacao em C++ - Conceitos Basicos e Algoritmos seu valor. A fungao s6 dé por concluida a sua execugio, quando se prime alguma tecla, tal como em exercicios anteriores acontecia com o operador extractor sobre ocin, Podemos dizer que o valor da fungio membro get () € 0 cédigo ASCH do caracter recolhido. 2.4.3 Operadores, precedéncia e ordem de avaliacdo A Tabela 2.5 mostra os operadores ordenados pela sua precedéncia, fazendo apenas uma breve descri¢io da operagéo realizada. Uma explicaciio mais aprofundada de cada um dos operadores seré feita, & medida que estes forem utilizados, nos exemplos apresentados, Caixas sucessivas tem precedéncias decrescentes, e os operadores dentro da mesma caixa tém idéntica precedéncia. | Simbolo Descrigio suméria | Forma de aplicagio Resolugao de alcance — [nome_classe :: membro refere nome global = nome => Seleceao de membro — apontador -> membro Oo Indexacao apontador [ exp ] 0 chamada a fungao exp ( lista_exp ) 0 construgaio de objecto | tipo ( lista_exp ) sizeof dimensio de objecto sizeof exp sizeof dimensao de tipo sizeof tipo ++ pés ou préincremento | Ivalor ++ ou ++ lvalor - p6s ou pré decremento [ivalor — ow — Ivalor ~ complemento bit a bit ~exp ! negagio légica Lexp - undrio menos - exp + undrio mais + exp & enderego de & Ivalor * desreferéncia *exp new criar , alojar new tipo delete destruir , desalojar delete apontador delete!) destruir array delete { } apontador 0) cast , conversao de tipo} tipo ) exp * multiplicar exp *exp / dividir exp /exp % médulo, resto exp % exp 48 © FCA-EDITORA DE INFORMATICA Iniciag&o a linguagem C++ Simbolo Descrigao suméria Forma de aplicacio Deslocar esquerda deslocar direita pe fe Diferente LC a po Re foo Operador condicional exp ? exp : exp ‘Afectagiio simples Ivalor = exp multiplica e afecta Ivalor * = exp divide e afecta Iwalor / = exp médulo e afecta soma e afecta subtrai e afecta desloca direita e afecta desloca esquerda e afecta AND e afecta bit a bit OR e afecta bit a bit XOR e afecta bit a bit Ivalor * = exp Tabela 2,5 — Operadores e precedéncia Os operadores unérios, os operadores de afectagfio e 0 operador terndrio sao associativos da direita para a esquerda. Todos os outros sfo associativos da esquerda para a direita. © FCA -EDITORA DE INFORMATICA 49 Programagao em C++ - Conceitos Basicos e Algoritmos Por exemplo: * O operador afectagao “=” é associativo a direita. a=be=c //Significa a = (b= c). * O operador bindrio “+” é associativo A esquerda. atbeora //Significa ((a + b)+ c)+ a. * Ooperador bindrio “*” tem mais alta precedéncia do que “+”. artb*e //Significa a + (b * c). * Os operadores “+” e “-” tém a mesma precedéncia e os operadores bindrios sao todos associativos 4 esquerda. atb-c //Significa (a +b) - ¢. * O operador undrio “++” (pré-incremento) € associativo a direita. +e tha //Significa ++(++a)s= ++(asa + 1) //a=(atayed. Na descri¢ao sucinta da forma de aplicagiio dos operadores da tabela, usam-se em itdlico as seguintes designagdes, com os seguintes significados: * nome — nome denotando um objecto, em que objecto é genericamente uma regiéio de meméria; * exp (expressio) — conjunto de operadores e operandos especificando um cdlculo. Eventualmente pode reduzir-se a um simples nome; * ivalor — valor que pode figurar no lado esquerdo de uma afectagiio, ou por outras palavras, nome de objecto que no esteja definido como constante; * lista_exp — conjunto dé expressdes separadas por virgula; * tpo— nome de um tipo predefinido na linguagem ou definido pelo utilizador. Quando entre paréntesis, pode ser também um tipo derivado (através de *, [], 0, & ete.); * nome_classe — nome de uma classe; * membro — nome de um membro de uma classe, estrutura ou uniao; * apontador —- expresso correspondente a um endereco onde se situa uma varidvel. A ordem temporal de avaliagio de expressdes ndo é determinada pela precedéncia e agrupamento dos operandos através de paréntesis. O C++ no especifica a ordem temporal de avaliag3o das operagées, sendo excepgao 0 “&&” (AND légico), “| |” (OR légico), “?:” (operador ternério) e a “,” (virgula), em que a avaliagdo se efectua sempre da esquerda para a direita. 50 © FCA-EDpITORA DE INFORMATICA, Tniciagao 4 linguagem C++ Por exemplo: int i = 07 vii] = ite; //Resuitado indefinido - v[{1]=1 ou v{2]=1. (i = 3, ++i} //Valor final dei é 4. 2.4.4 Expressées aritméticas A sintaxe das expressdes aritméticas pode causar alguma confusao aos novigos em informatica, na medida em que o seu significado difere do que Ihe é atribuido comummente em mateméatica. Assim, dadas as varidveis n e m declaradas, definidas e iniciadas como segue: int n= 5, m= 4; aexpressio nen+6 significa que n toma o valor 11. O valor de n é afectado com 0 seu valor actual (5) acrescido de 6. E como em C++ uma expressdo tem sempre valor, podemos escrever: int k = (n =n # 6) + 5; significando com isto que n toma o valor 11 € k é iniciado com 0 valor 16. Isto porque a expresso afectagZo toma o valor com que 0 membro esquerdo foi afectado. A expressio: neem é equivalentean = n + m e significa que n toma o valor actual somando com o valor de m. Tem significado também escrever int k =n ¢s m significando que k é declarado definido e iniciado com o valor n + me simultaneamente ao valor de n € adicionado o valor da variavel m. A expressao: int k =n << 1; //Equivaiente a int k=n* 2 significa que k é iniciado com o valor de n deslocado para a esquerda de 1 bit, que € equivalente a n * 2. O operador “<<” pode entio ser usado para multiplicar um inteiro por poténcias de 2, assim como o operador “>>” pode ser usado para dividir inteiros positivos por poténcias de 2 [Pimenta96]. © FCA-EDITORA DE INFORMATICA — SI Programacao em C++ - Conceitos Basicos e Algoritmos 2.4.5 Incremento (++) e decremento (--) O operador unério incremento (“++”) pode ser usado como prefixo ou como sufixo com significados diferentes. As instrugdes: int n= 5; en; //nened Jevam a que a varidvel n tome o valor 6. © operador incremento (“++”) € usado como ptefixo sobre a varidvel m na seguinte expresso: int n= 5, m= 6, k; ken * (++ m);, k toma o valor 35 (5 * 7) em toma 0 valor 7. Usado como sufixo seria: kos nm * (m +4); € neste caso, k tomava o valor 30 (5 * 6) e mo valor 7. Isto porque o operador undrio “++” usado como prefixo sobre m, incrementa m antes da varidvel m ser usada como operando por outros operadores. Quando o operador “++” for aplicado a m como sufixo, sé incrementa m depois desta varidvel ser usada como operando por outros operadores. O operador undtio decremento (“--”) tem um comportamento idéntico no que se refere A natureza prefixo ou sufixo. 2.5 Instrugdes de controlo de execucao As instrug6es de controlo de execucAo constituem 0 mecanismo fundamental das linguagens de programagao, para que através delas se possam exprimir algoritmos. Com efeito, como jé anteriormente referimos, o algoritmo de um processo implica que algumas das acgSes a executar (primitivas de acgao), sejam condicionadas a testes sobre expressdes (expresses de controlo), e que nos algoritmos estrutura- dos, essas primitivas se confinem a trés tipos: * Primitivas de decisiio bindria das quais resulte a execugdo, em alternativa, de um entre dois blocos de instrugées; * Primitivas de repetig&o condicional das quais resulte a repeticao de um dado bloco de cédigo enquanto uma expressfo obedecer a uma dada condig&o; 52 ) FCA - EDITORA DE INFORMATICA Iniciagdo a linguagem C++ * Primitivas de deciséo nuiltipla em que um subconjunto de varios blocos de accdes é executado, fungao do valor tomado por uma expressio de controlo. Em C++, as primitivas de decisio binaria traduzem-se na instrugio de decisio bindria if-else e no operador ternario (“? :”). As primitivas de repetig&o condicional traduzem-se pelas instrugdes for, while e do-while. As primitivas de decisio miltipla traduzem-se na instrugio switch. 2.5.1 Express6es e Instrucdes compostas Uma expressio converte-se numa instrugio quando terminada pelo caracter ponto e virgula ‘;’. Em C++, 0 ponto e virgula é 0 carécter terminador de instrugao. Varias expresses, transformam-se numa expressig composta, quando, associadas por operadores virgula (“,”) que significa “faz isto e a seguir faz ‘aquilo”. A expressaio composta toma o valor da tiltima expressdo componente. As chavetas (‘{’ e ‘}’) so usadas para agrupar varias instrugdes numa instrugdo composta, ou bloco, que é sintacticamente equivalente a uma tinica instrugéo. Uma instrugio composta nao necessita de terminador (‘;’) apés as chavetas de fecho. 2.5.2 Instrugdo if-else A sintaxe da instrugéo if-else em C++ toma a forma geral: if({ ) else ou if( ) A instrugio if impde a execugio da , se a expressio de for verdadeira. Caso contrério nao executa essa instrugio e passa a executara (se aaltemativa else existir). O resultado de uma expressao em termos légicos (para testes de decisio bindria) é interpretada como falsa se tomar o valor zero ou como verdadeira se tomar qualquer valor diferente de zero. © FCA-EDITORADE INFORMATICA 53 Programagiio em C++ - Conceitos Basicos e Algoritmos FALSE RUE if (A < B) cout << "A=B"; Figura 2.4 — Fluxograma e instrucao de decisao binaria em C++ O Exemplo 2.9 1é do console input um valor inteiro correspondente ao ano, verifica se este € ou nao bissexto e escreve no console output (ecr’) a frase “f um ano bissexto. ” se o ano for bissexto; caso contrario serd escrita a frase “Nao é um ano bissexto. ”. Para reconhecer se um ano € bissexto, usa-se a regra: “Sao bissextos os anos que sejam miltiplos de 4 sem serem miiltiplos de 100. Sendo miltiplos de 100, so bissextos os miiltiplos de 400”. A expresso: (year % 400 == 0 || year % 4 == 0 && year % 100 I= 0) cumpre a regra. Exemplo 2.9 — Verificar se um ano é bissexto #include void main() { int year; ‘ cout << "Ano -> ";‘cin >> year; if (year % 400 == 0 || year % 4 == 0 e& year % 100 != 0) cout << "E’"; else cout << "Nao e’"; cout << " um ano bissexto." << endl; 3 Na avaliagao duma expresso com 0 operador binaério OR légico (“| |”) se o primeiro operando é verdadeiro 0 segundo operando nem sequer € avaliado. Assim: if (A // B) ; é equivalente a if (A) ; else if (B) ; 54 © FCA- EDITORA DE INFORMATICA Iniciagdo & linguagem C++ Na avaliagdo duma expressao com o operador bindrio AND légico (“&&”) se o primeiro operando é falso o segundo operando nem sequer é avaliado. Assim: if (A && B ) ; € equivalente a if (A) E if (B) ; J} Se 0 corpo do if (ou do else) tiver de executar condicionalmente varias instrugSes, envolvem-se essas instrugdes por chavetas para as converter numa instrugao composta. O Exemplo 2.10 1é do console input dois valores inteiros e escreve no console output o maior valor, identificando a varidvel que o contém. Exemplo 2.10 — Maior de dois nimeros #include void main() { int a, b, bigNumber; char bigIdentifier; cout << "Escreve o maior de dois inteiros 'a' e 'b'"; cout << "a -> "; cin >> a; cout << "b -> "; cin >> b; if (a>b) ¢ bignumber = a; bigidentifier } else { bigNumber = b; bigidentifier = 'b'; } cout << "0 maior valor entre 'a' e 'b' corresponde a '" << bigidentifier <<"! que tem o valor "<< bigNumber << '.' << endl; 2.5.2.1 Operador condicional tern4rio (?:) O operador condicional terndrio (“? :”) constitui uma forma compacta de exprimir uma acciio condicional if-else. A forma geral da expressiio condicional é: ? : A é uma expressio légica, avaliada como verdadeira ou falsa. A expresso condicional (no seu todo) toma o valor da se a condi¢ao for verdadeira, ou o valor da se a condigio for falsa. © FCA-EDITORADE INFORMATICA = 55 Programagao em C++ - Conceitos Basicos e Algoritmos Assim: modulo_n = (n <0) ?-n: n; € equivalente a: if (n < 0) modulo_n = - n; else modulo_n = n; 2.5.3 Instrucao switch A instrugio switch é um teste de decisio miltipla, que numa sequéncia de instrugGes decide a partir de qual comega a execugao. A execuco comega, quando for encontrado um valor do case coincidente com o valor da expressiio de teste. A sua forma geral é a seguinte: switch (){ case : ; case : ; case : ; default: ; switch(i) { case 0: cout << case 1: cout << “um"; case 2: cout << "dois"; default: cout << "outro"; 0" F "dois": Figura 2.5 — Fluxograma e instrucao switch em C++ 56 © FCA-EDITORA DE INFORMATICA Tniciag4o a linguagem C++ Na instrugéo switch apresentada na Figura 2.5, se por exemplo, 0 valor da varidvel i tomar o valor 1 ser&o escritas no console output as strings "um", “dois",e "outro". Quando se pretenda que o switch cumpra sé a instrugo correspondente ao valor do case que coincide com a expressao em teste, utiliza-se a instrugéo break que impée o fim imediato da instrugo switch. ee TRUE FALSE case 12: cout << "doze"; break; cout << "dex"; FALSE break; casé 20: ores, FALSE default: cout << “outset, } Figura 2.6 — Fluxograma da instrugiio shitch em C++, usando break Na instrugio switch apresentada na Figura 2.6, se pot exemplo, o valor da varidvel i tomar o valor 10 sera escrita no console output a string "dez". O Exemplo 2.11 18 do console input trés valores inteiros correspondentes ao dia, més e ano duma data e escreve no console output o nimero de dias que faltam até ao fim do més se a data for valida. O algoritmo, além de reconhecer se 0 ano é bissexto (tema do Exemplo 2.9), especifica o ntimero de dias de cada més, segundo a regra que se recita na forma de quadra popular: Trinta dias tem Novembro, Abril, Junho e Setembro. De vinte e oito ha sé um, Os outros tém trinta e um. © FCA-EDITORADE INFORMATICA = 57 Programagao em C++ - Conceitos BAsicos e Algoritmos E como nfo ha regra sem excepefio, de vinte e oito h4 um, mas sé nos anos comuns. Em C++, uma expresso aritmética assume-se ter o valor légico verdadeiro quando tomar um valor diferente de zero; assume-se ter o valor légico falso quando tomar um valor igual a zero. As expressdes relacionais (com operadores SD" Da" We" “ "; cin >> day; cout << "Mes -> "; cin >> month; cout << "Ano -> "; cin >> year; 4£ (month > 0 && month <= 12) switch (month) { case 2 : numOfDays = 28 + (!(year % 400) || i{year % 4) && year % 100); break; case 4 case 6 case 9 case 11: numOfDays = 30; break; default: numOfDays = 31; } else numOfDays = 0; if (day > 0 && day <= numofpays) cout << "Faltam " << (numOfDays - day) << " dias para o fim do mes." << endl; else cout << "Data invalida." << endl; A expressio: year % 100 em termos ldgicos € verdadeira se year niio for mtiltiplo de 100 (resto da divisio € diferente de zero), a expressao: (year % 400) é verdadeira se year for muiltiplo de 400 (resto da divisiio igual a zero). 58 © FCA -#DITORA DE INFORMATICA Iniciagdo & linguagem C++ Na instrugao: int leapYear = !(year % 400) || i(year % 4) && year % 100; a varidvel leapYear é iniciada com o valor 1 se a expressio légica for verdadeira, caso contr4rio é iniciada com o valor 0. 2.5.4 Instrucao while A sintaxe da instrugdo while é a seguinte: while( ) Enquanto a expresso for verdadeira, 0 corpo da instrugéo while seré executado. Caso 0 corpo do while contenha mais do que uma instrugdo, envolvem-se por chavetas para que se constituam numa instruco composta. isa; while (i < 6) ( cout << "iz " << i << endl; ag Figura 2.7 — Fluxograma da instrugio while em C++ Exemplo 2.12 — Contar o ntimero de caracteres de uma linha #include void main() { ; ungigned numogchars = 0; € cout << "Escreva uma linha de texto:" << endl; while (cin.get() I= '\n') ++ num0£Chars; cout << "\nDigitou " << numOfChars << “ caracter" << ( mumofChars t= 17 "es." 2 "2" ) << endl; © FCA-EDITORA DE INFORMATICA — 59 Programagio em C++ - Conceitos Basicos e Algoritmos O valor da fungio-membro get () aplicada sobre cin, é 0 cédigo ASCH do cardcter recolhido, e como tal, a funcdo pode ser comparada com um valor tipo char, em termos de saber se é ou nao igual ao valor desse cardcter. Assim, a expresso de controlo da instrugiio while usada no Exemplo 2.12, cumpre, simultaneamente, dois objectivos por cada vez que é testada: * Recolhe um cardcter do teclado; * Testa se o cardcter recolhido € '\n' (carriage return) gerado pela actuacio da tecla Enter. Caso o caracter recolhido seja '\n', a expressiio de controlo toma 0 valor falso e faz terminar a instrugiio while. Caso se trate de um cardcter diferente de '\n', cumpre a instrugao do seu corpo, incrementando o contador de caracteres numO£Chars e volta a testar a expressio de controlo provocando a recolha de outro cardcter. Podemos dizer que os caracteres recolhidos siio langados no lixo, dado que niio afectamos nenhuma varidvel com 0 valor retornado pela fungéo membro get (). Para o objectivo a atingir pelo programa, é indiferente quais os caracteres que se recolhem, dado que somente nos interessa saber quantos foram recolhidos. Neste caso recolhidos é sinénimo de consumidos. Exemplo 2.13 — Contar caracteres diferentes de espaco, duma linha #include void main() ( int ch; //Variavel para recolher o cardcter. unsigned numOfChars=0; //Contador de caracteres != ' '. cout << "Escreva uma linha de texto:" << endl; while ((ch = cin.get()) != '\n') if (ch Is! ++ numofChars; cout << "\nA linha tem " << numOfChars << " caracter" << ( mumofChars!=1 ? "es." : "." ) << endl; No Exemplo 2.13, usamos também a funcio membro get (), mas, neste caso, temos necessidade de afectar uma varidvel com o valor da fungao (0 valor do caracter que recolhe do teclado) para posteriormente podermos realizar um segundo teste sobre esse valor. 60 © FCA -EDITORA DE INFORMATICA Tniciacdo a linguagem C++ A instrugio while, no que se refere & expresso de controlo, comporta-se como no Exemplo 2.12. No entanto, como a instrugio do seu corpo é uma instrugao if, © contador numOfChars s6 ser incrementado caso 0 cardcter recolhido seja diferente de espaco (' '). Dado que todos os caracteres séio recolhidos numa mesma varidvel ch, o valor de uma recolha esmaga (destréi) o valor anteriormente recolhido. 2.5.5 Instrugdo for A sintaxe da instrugdo for é a seguinte: for( ; ; } isa while (i < 6) { cout << "ie" ccd << endl; eed; = "< € avaliada uma Unica vez no inicio do for e normalmente é uma “atribuic&o de valor ao parametro de controlo do niimero de ciclos”. Em C++ poderd ser uma definigaio com iniciagio. A expressio é uma expressio avaliada antes da execugéo de um novo ciclo. Tal como acontece no ciclo da instrugao while, a iteragéo termina quando a expressio se toma falsa. © FCA-EDITORA DE INFORMATICA 61 Programagao em C++ - Conceitos Basicos e Algoritmos A expressio é executada no final de cada iteragdio. Presta-se a determinar o modo de evolugao do parametro de controlo ao longo dos sucessivos ciclos, podendo no entanto desempenhar outras tarefas. Existem linguagens em que a instrug’io for (Ex. Pascal) é determinista no que se refere ao nlimero de repetigdes do ciclo. Em C++ a instrugao for nao tem nenhuma restrigdo relativamente a instrug3o while. Pode dizer-se que um for em linguagem C++, é uma forma abreviada de se escrever um while. Com efeito: for ( ; ; ) € equivalente a: t ; while( ) { ; ; Exemplo 2.14 — Imprimir as letras do abecedério em maitisculas #include #include void main() { ‘ for (char i = ‘At; // No tentar executar este programa. void main() { for(i 7 ) cout << "Mensagem intermiriavel!"; ? Qualquer das expressdes de controlo da instrugéo for, pode ser omitida, permanecendo no entanto o ponto e virgula. Quando omitida, a expressio é tomada como trivialmente verdadeira. Exemplo 2.16 — Mostrar no ecri o caracter sucessor ao da tecla premida #include void main() { // Termina quando premida a tecla '*'. cout << "Escrever caracteres (terminar com '*')." << endl; for( int ch; (ch = cin.get()) f= '*'; cout << (ch f= '\n' ? char(ch + 1) : '\n') de // Corpo nulo. O Exemplo 2.16 realga as miltiplas variantes que a linguagem C++ permite instrugio for. Assim: Prescinde do parametro de controlo de ntimero de ciclos, logo nao utiliza a expressio A expressio de inclui uma afectagio (afecta ch com o valor da fung’o membro get ()) e compara o valor da afectagao com o do cardécter asterisco '*'. O valor da expressiio sera verdadeiro (diferente de zero) quando o caracter recolhido pela fungio membro get (} for diferente de '*' © FCA-EDITORADE INFORMATICA 63 Programagio em C++ - Conceitos Basicos e Algoritmos e sera falso (igual a zero) em caso contrario. O ciclo for termina quando ch foriguala'*'. * A expresso , paradoxalmente, nao incrementa coisa nenhu- ma é é utilizada para imprimir 0 cardcter cujo cédigo ASCII seja sucessor de ch. * Ocorpo do for é vazio, dado que tudo quanto se desejava fazer ficou feito nas préprias expressdes de controlo. Naturalmente que nao é recomendavel fazer malabarismos com a linguagem que torne o programa dificil de entender. O desejével é usar as facilidades da linguagem para exprimir algoritmos na forma mais natural e compreensivel possivel. 2.5.5.1 Acesso sequencial a arrays A partir dos tipos fundamentais podem derivar-se outros tipos, tais como arrays. Um array € uma sequéncia de n elementos, de um tnico tipo. Para um tipo T predefinido, a declaragio: T buffer [size]; significa que buffer é um array de size elementos do tipo T. Os elementos de um array so acedidos indexando de 0 a size-1. A linguagem C++ nao perntite afectagiio de arrays. No entanto, permite a sua iniciagado, no momento da definigo: int al4] = (1, 2, 3, 4 37 size —.wsS4"- al if[2f{s3/4 a[0] att] al2i als] Figura 2.9 — Representag&o do array em memoria O Exemplo 2.17 1é do console input 10 valores inteiros e escreve-os no console output por ordem inversa a da leitura. $6 depois de ler o tiltimo inteiro é que os valores podem comegar a ser escritos por ordem inversa. Por esse facto, os valores tem de ser armazenados (buffered) em registos temporarios A medida que sio lidos. 64 © FCA -EDITORA DE INFORMATICA. Iniciagao a linguagem C++ Exemplo 2.17 — Mostrar 10 inteiros pela ordem inversa da leitura #include void main() { int buffers{10]; //Define o array para 10 inteiros int i; cout << "Escreva 10 valores inteiros -> "; for(i = 0; i < 10) ++i) cin >> buffers[il; // Mostra 10 valores for(i = 9; i >= 0; --i) cout << buffers[i] << ' '7 cout< #include void main() {¢ char string[9] = "inverter"; cout << "A string \"" << string << "\" invertida e' \""; for(int 4 = 0, j = strlen(string)- 1; i < j; ## i, -~ 5) { //Troca stringlil com string[jl. char tmp = string[il; stringli] = stringlj string[j] = tmp; } cout << string << "\"." << endl; O operador “<<” (insersor) em cout, trata de um modo particular a insergao de strings. String € uma sequéncia de caracteres (array de elementos tipo char) terminada por um caracter '\0' (char de valor zero). © FCA-EDITORADEINFORMATICA 65 Programacdo em C++ - Conceitos Basicos e Algoritmos O operador “<<” (insersor) em cout quando recebe como operando direito uma varidvel do tipo array de char (ou do tipo char* como veremos no capitulo IV), mostra no ecrA a sequéncia de caracteres contidos no array, até que reconhecga a presenga do cardcter terminador '\0'. O operador “>>” (extractor) aplicado ao cin, também trata de um modo particular a Jeitura de strings. Quando o operando direito é uma varidvel do tipo array de char, recolhe uma sequéncia de caracteres até encontrar um separador, e termina a string com o caracter '\0'. © Exemplo , 2.18 realga particularidades importantes relativas a strings, nomeadamente: + Em C++, contrariamente a algumas outras linguagens, nao existe 0 tipo basico string, apesar de (paradoxalmente a primeira vista) existirem fungdes predefi- nidas que realizam operagées sobre strings; * A tinica condescendéncia que a linguagem C++ faz com cadeias de caracteres € permitir iniciar um array de char com o valor de uma cadeia que lhe seja dada entre aspas. A declaragio: char string[9] = "inverter"; constitui uma alternativa equivalente (simplificada) iniciagio genérica como array de chars: char string[9]= {1i', 'n', tet, ter, "Voy oir, Qualquer das duas declaragdes definem um array de elementos tipo char que se denomina string, de dimensio suficiente para conter os caracteres explicitos na constante de iniciagao mais o cardcter terminador '\0' (9 caracteres ao todo neste caso). A fungio strlen(s), predefinida em string-h, retorna o mimero de caracteres da string, no contando com o terminador '\0'. O bloco de instrugées: char tmp = string[il; string[i] = string[jl; string[j] = tmp; troca © cardcter que se encontra na posicao indice i da string com o que se encontra na posi¢ao indice j da mesma string. 66 = © FCA-EDITORA DE INFORMATICA Tniciagdo & linguagem C++ Algoritmo T (Algoritmo de troca em arrays) : * 11:Definir uma varidvel temporéria tmp do tipo char iniciada com o cardcter que se encontra na posig&o indice i da string; * T2:Copiar (afectar) para a posigdo fndice i da string o que se encontra na posigio indice 5; * T13:Finalmente afectar a posig&o indice j da string com tmp (cardcter que se encontrava inicialmente na posi¢ao indice i). Quando 0 corpo do for, for constituido por outras instrugdes for, diz-se que os ciclos for estio aninhados (nested). F. disso exemplo o programa para ordenar os caracteres de uma string, que implementa em C++ 0 algoritmo de ordenagao Bubblesort. Algoritmo B (Algoritmo Bubblesort): . * Blilnicia o alcance Assume inicialmente como alcance das acgGes a realizar o total dos elementos do array a ordenar. * B2: Arrasta para o ultimo indice do alcance o maior dos elementos Do primeiro ao pentiltimo indice do alcance, testa um par de elementos consecutivos e troca a posigaio do par, se a ordenagao estiver incorrecta, * B3:Diminuir 0 alcance Decrementa de um 0 alcance. Se o alcance é um, termina, senao volta ao passo B2. O algoritmo implica duas instrugdes for aninhadas, o for externo (pontos B1 e B3), para ir progressivamente reduzindo o alcance das acgdes. O for interno, para executar a acco que consiste em arrastar para a tiltima posigao do alcance o maior elemento encontrado (ponto B2). O operador undrio sizeof retorna 0 espago ocupado (em bytes) por um objecto. Neste exemplo pretende-se que seja o mimero de bytes da string. Aconselha-se o leitor a testar 0 Exemplo 2.19, passo a passo, no ambiente de desenvolvimento, pondo em observagio os sucessivos contetidos que a string vai tomando, e os indices ie j dos for aninhados. © FCA-EDITORA DEINFORMATICA 67 Programagiio em C++ ~ Conceitos Basicos e Algoritmos Exemplo 2.19 — Ordenar os caracteres de uma string #include void main() { char string[] = "zywxvutsrqponmlkjihgfedcba"; cout <<"Ordenando a string \""< 0; i- // Arrasta o maior para a direita. for (int j= 0; J <4 7 #45) //Compara caracteres. Af(stxing[j] > stringlj+1]){//Troca se ndo ordenados. char ch = string[j]; string[j]=string[j+1]; stringlj + 1] = ch; *y cout << string << endl; + 2.5.6 Instrucdo do-while A instrugao de repetic¢go do-while difere da instrugio while pelo facto do seu ciclo de instrug6es ser executado pelo menos uma vez, dado que a condigdo de repetigao sé é testada apés a conclusio de cada ciclo, A sintaxe geral desta instrugdio-é: do while( ); isa; do { cout << “is " ccd << endl; tea; } while (i < 6); Figura 2.10 — Fluxograma da instrugiio de repetigéo condicional do-while Enquanto nas instrugSes while e for, o teste da condigao de repetigdo era feito antes de realizar as accdes envolvidas no ciclo, neste caso esse teste s6 é feito depois de realizadas as acgdes do ciclo. 68 © FCA- EDITORA DE INFORMATICA Iniciagao a linguagem C++ O Exemplo 2.20 “adivinha” um ntimero de 0 a7 em trés perguntas com respostas sim ou nao. A concepeao deste algoritmo pode desenvolver-se em sucessivos passos de raciocinio, em que o primeiro consiste no seguinte: Os ntimeros de 0 a 7 tém uma representagao bindria a trés bits pelo que, conhecer 0 ntimero consiste em conhecer o valor desses trés bits, 0 que pode ser conseguido através de trés perguntas de resposta sim ou niio. De uma forma exaustiva, sem usar primitivas de repetigao miiltipla, o processo envolve a arborescéncia de testes de decisio bindria da Figura 2.11. A parte delicada do algoritmo consiste em converter esta versio “forga bruta” que nao tem generalidade para alcances superiores, num algoritmo envolvendo uma primitiva de repeticao. E em passagens como esta que reside a parte criativa da programacao, e que justifica referirmo-nos a ela como “arte”. Si °3 a o> i, FALSE TRUE: KOR TRUE ealse~ TRUE pases TRUE eatses Yt @) xe x=? wd G=1) Gs) Geb Figura 2.11 — Arborescéncia de testes de decisao bindria do Exemplo 2.20 Observando atentamente a arvore de questes a colocar ao utilizador, podemos constatar que todas elas se podem reduzir a uma sé, repetida quatro vezes, mantendo a dependéncia das respostas anteriores através de duas varidveis auxiliares, que caracterizam o estado do processo ao longo da evolu¢gio do algoritmo: a varidvel i que memoriza quantas vezes ja foi repetida a pergunta e a varidvel n que armazena a parte do valor que as respostas recebidas até ao momento ja garantem. Com as duas varidveis auxiliares i ¢ j, 0 algoritmo do processo fica extraordinariamente simplificado, com total equivaléncia ao anterior ¢ com a importante vantagem de ser generaliz4vel para poder adivinhar ntimero até qualquer limite (15, 31, 63, etc.), sem que com isso o algoritmo tenha de aumentar de complexidade. © FCA-EDITORA DEINFORMATILA = 69 Programagio em C++ ~ Conceitos Basicos e Algoritmos Figura 2.12 — Fluxograma do Exemplo 2.20 — Adivinhar um némero de 0 a7 Este algoritmo pode formalizar-se em linguagem C++ como segue. Exemplo 2.20 — Adivinhar um mimero de 0 a7 #include #include void main() { cout << "Pense num numero de 0 a 7 e prima uma tecla."; cin.get(); + // Adivinhar o niimero. ant number = 0; for(int f= 4; i > 0; i /= 2) char ch; cout << "\nE’ maior ou igual que " << (i + number) << " (S/N)?"; cin >> ch; if (toupper(ch) == 's') number += i; } cout <<"\nO numero que pensou e’ "<< number <<'.' << endl; A fungio toupper(char ch) converte o cédigo ASCII de uma letra mindscula no cédigo ASCi/ da correspondente maitiscula. O Exemplo 2.21 generaliza para ntimeros com qualquer limite. 70 @ FCA-BDITORA DE INFORMATICA Tniciagdo a linguagem C++ Exemplo 2.21 — Adivinhar um mimero positivo #include #include void main() { unsigned long mn, max=1, number = 0; char ch; cout<<"Quer que eu adivinhe numeros desde 0" " ate quanto? "; cin >> nj; do {// Arredondar para potencia inteira de 2. max *= 2; } while(max < n); for (unsigned long i = max / 2; i > 07 i /= 2) { cout << "\nE’ maior ou igual que “* << (i + number) <<" (S/N) ? "7 cin >> chy if (toupper(ch) == 'S') mumber += i; “ } . cout <<"\nO numero que pensou e’ "<< number << '.' < do for usa o operador i/=2 equivalente a i Dizem ironicamente os informaticos, que n&o existem programas sem erros (sem bugs). O que existe sao programas em que, eventualmente, ainda ninguém notou os erros. Obviamente que nao se referem a prograthas de tao pequena complexidade como aqueles que por enquanto nos esto a preocupar. Aconselhamos 0 leitor a envolver os algoritmos que queiram testar, num ciclo de repeti¢aéo do-while com o formato semelhante ao do Exemplo 2.22 (simplificado se preferirem), por forma a permitir que 0 teste se processe com varias condigSes de entrada, particularmente com aquelas que se imaginem mais adversas ou mais delicadas para o algoritmo em teste. Testar um algoritmo nao significa simplesmente experimentar se ele responde a uma condicio trivial. Pelo contrario, consiste em descobrir se existe alguma condigao singular em que o algoritmo falha. O tipo enum é uma alternativa para definir constantes. A declaracao: enum {A, E, I, 0, U, SPACE, OTHER}; é equivalente a: const int A= 0, E=1, I= 2,0=3,U=4, SPACE = 5, OTHER = 6; © FCA-EDITORA DE INFORMATICA = 71. Programacao em C++ - Conceitos Basicos e Algoritmos Exemplo 2.22 — Contar caracteres vogais, separadores e outros, numa linha #include #include #include void main() { char identifier[5]= ('A', 'H', 'I', '0', 'U1}; int counts[7], co; enum Vog{A, E, I, 0, U, SPACE, OTHER} ch; dot for(ch = A; ch <= OTHER; ch=(Vog) (ch+1)) counts [ch] =0; cout <<"\nDigite uma linha de texto." << endl; while ((c = toupper(cin.get())) An") € switch (c) { case 'A' : chsA; break; case 'E' : cheE; break; case 'I' ; ch=I; break; case '0' : ch=0; break; case 'U' : ch=U; break; case '\t': case’ ' : ch = SPACE; break; default =: ch = OTHER;break; } ++counts [ch]; + cout< "; cin.getline(sl, MAXSTR); cout << "String 2 -> "; cin.getline(s2, MAXSTR); for (int i = 0; sili] && s2[il; ++i) af (s1{i] != s2[i]) break; cout << si << ((sif[i] - s2fi] > 0) ? “ e’maior " ; (si[i] - s2[i] <0) ? " e’ menor que " : " igual a ") << 82 << '.! << endl; A fung’io membro get line(char buffer[], int maxBuffer) aplicado ao console input cin extrai da stream uma sequéncia de caracteres ¢ insere-os em posigGes sucessivas da string cujo primeira posi¢do € buffer. Os caracteres sio extraidos até que uma das seguintes condigées se verifique: * maxBuffer-1 caracteres sejam lidos; * no existam mais caracteres para ler (EOF — fim de ficheiro); * o cardcter lido seja o caracter fim de linha (' \n'). Neste caso, 0 caracter é lido do teclado mas nfo é inserido no buffer. No fim da sequéncia de caracteres 6 inserido o cardcter nulo ('\0'). © FCA-EDITORA DE INFORMATICA 73 Programagio em C++ - Conceitos Basicos e Algoritmos 2.5.7.2 Instrugao goto Se a instrugio break estiver situada numa estrutura de ciclos aninhados, s6 termina o ciclo que a contém. Quando se quiser terminar todos os ciclos aninhados, deverd ser usada a instrugdo goto. A instrugio goto impée ao programa um salto para a instrugdo seguinte a label (etiqueta) que Ihe for associada. Uma Jabel é um identificador seguido de dois pontos (“:”). A label tem que estar na mesma fungaio que a instrugdo goto. Por exemplo: for ( ... ) for (... ) if (disaster) goto error; error: // Salta para aqui. cout << "Algo correu mal! : Exemplo 2.24 — Verificar se um valor inteiro positivo é capicua #include #tinclude void main() { char ch; cout<<"0 programa verifica se um inteiro e' capicua.\n"; do { unsigned long number, invNumber = 0; cout <<"Escreva‘o inteiro - "; cin >> number; while ( number ) { int digit = (int) (number % 10); if ((number /= 10) == invwumber || number == (invNumber = invNumber * 10 + digit)) ¢ cout << "Muito bem, o inteiro escrito"; goto endProgram; , } cout << "Nao e' capicua.\nQuer tentar de novo (S/N) ? "; cin >> ch; } while (tolower(ch) == 's'); // Repetir até basta. cout << "Por exemplo 12321"; endProgram: cout << " e' capicua." << endl; 74 © FCA - EDITORA DE INFORMATICA IniciagSo a linguagem C++ Com algumas excepgGes como a que aqui foi apresentada, 0 cédigo que contém instrugdes goto é, em geral, mais dificil de entender e de manter. S6 em casos muito particulares se justifica utilizar a instrugéo goto. Um novigo em programagio, corre o risco de aplicar indevidamente esta instrugdo, isto ¢, aplicd-la onde nada o justifica. Dai a fama de maldita que lhe é langada. 2.5.7.3 Instrugéo continue A instrugio continue é usada em instrugdes de repetigio, e impde que seja executada de imediato a prdxima iteragio da instrugdo de repeticao. Nas instrugdes do-while e while o controlo é transferido para a expressiio de teste do ciclo de repetigéo, que é executada imediatamente; na instrugao for é executada imediatamente a expressao de incremento. A sintaxe desta instrugao é: ' continue; O Exemplo 2.25 1é do console input uma linha de texto e escreve no console output o nimero de caracteres e 0 nimero de palavras existentes na linha. Exemplo 2.25 —- Contar os caracteres e as palavras de uma linha #include #include void main() { char ch; do { unsigned numOfChars = 0, numOfWords = 0; unsigned char isWord = 0; // Estado inicial = 0. cout << "\nDigite uma linha de texto" << endl; while((ch =(char) cin.get()) != '\n') { ++ numofChars; // Conta caracteres if(isspace(ch)) { // Se ch igual a espaco isword = 0; // Esté fora da palavra continue; // Retoma novo ciclo y // ch e um cardcter diferente de espago // Se estava fora da palavra if (1 isWord) ( ++ numOfWords; // Conta palavra isWord = 1; — // Passa para dentro de palavra © FCA-EDITORADE INFORMATICA 75 Programagio em C++ ~ Conceitos Basicos e Algoritmos cout << "\nPalavras “ << numOfWords << “\nCaracteres " << numOfChars << endl; do { cout << "Quer continuar (S/N) ? "; cin >> ch; } while ((ch = (char)tolower(ch)) != 's' && ch I= 'n'); // Consumir todos os caracteres até ao fim da linha. while (cin.get(} != '\n'); } while (ch != 'n'); // Repetir até basta. } O Exemplo 2.25 é tipico de um algoritmo que deve a sua simplicidade ao facto de se utilizar uma flag de estado isWord que toma os valores 0 ou 1 (varidvel bindria) indicando se o analisador esta fora ou dentro de uma palavra. 2.6 Resumo Um programa em C++ é constitufdo por varias fungdes, uma das quais tem a denominagiio main () ¢ que serd a primeira a ser posta em execugio. Todas as entidades constituintes dum programa tém que ser declaradas antes de serem invocadas. A declaragao de uma fungio (que também se designa por protétipo da fungao) consiste em escrever 0 sew cabegalho (header) seguido de ponto e virgula. Destina-se a informar o compilador da sua existéncia e das suas caracteristicas. Do cabecalho da fungo consta o nome da fungio, o tipo do resultado e a lista de argumentos. Caso a fungdo nao necessite de argumentos, a lista é omitida. Da definigéio de uma fungio, consta o cabegalho ¢ o corpo de instrugdes que determinam as acgdes que realiza quando invocada em programa. Em exemplos muito simples, constituidos exclusivamente pela fungio main() e por fungdes predefinidas existentes nas bibliotecas da linguagem, as entidades componentes dos programas reflectem os constituintes basicos dos algoritmos (nomeadamente constantes, varidveis numéricas, operadores aritméticos, légicos e relacionais, afectagdes de valores a varidveis, expressdes e funcdes auxiliares predefinidas em biblioteca). Os atomos constituintes de um programa s&o as instrugdes (statements) e correspondem 4s primitivas no contexto dos algoritmos. 76 © FCA-EDITORA DE INFORMATICA Iniciagao a linguagem C++ Das instrugdes constituintes de um programa, constam declaragées, definigdes, express6es e instrugdes de controlo de execugiio. Declarar ¢ definir uma varidvel consiste em atribuir-lhe um nome, um tipo e eventualmente um valor inicial. Declarar uma entidade constituinte de um programa, significa informar o compilador da existéncia dessa entidade, do nome pelo qual vai ser invocada e das suas caracteristicas: tipo se for uma varidvel, tipo de parametros ¢ tipo de retorno se for uma fungao. Definir uma entidade, consiste (além da declaragao) em providenciar alojamento na meméria para essa entidade. No caso de uma fungdo, explicita as instrugdes constituintes do seu corpo. O tipo das varidveis determina 0 comportamento dos operadores que sobre elas actuam. : A linguagem C++ tem os seguintes tipos predefinidos ou bésicos: inteiro (int), virgula flutwante (float e double) e cardcter (char). Sobre estes tipos aceita variantes denotadas por prefixos, como seja: unsigned (valor sem sinal), short (de menor alcance) e Long (de maior alcance). A partir dos tipos basicos, definem-se tipos derivados tais como array. Um array consiste numa sequéncia de valores de um mesmo tipo, que podem ser acedidos por indexagio. Ao primeiro elemento do array corresponde o indice 0. Denomina-se string, um array de caracteres (tipo char) terminado pelo car4cter "\Or. As primitivas de controlo de execugio dos algoritmos estruturados, séo expressas em programa pelas instrugdes de decisio binéria if-else, pela instrugio de decisio muiltipla switch, e pelas instrugdes de repetigio condicional while, fore do-while. As instrugées if-else, mediante o valor légico da expresso de controlo, pdem em execucao uma de duas instrugSes: caso a expresso de controlo seja verdadeira (tome um valor diferente de zero) pdem em execug%o 0 corpo do if; caso contrério e exista corpo else, pde em execugiio esse corpo. As instrugées switch testam o valor numérico de uma expressiio e, conforme esse valor, assim determinam quais as instrugdes que pdem em execucio. © FCA-EDITORADE INFORMATICA 77 Programacao em C++ - Conceitos Basicos e Algoritmos A instrugio while testa uma expressao de controlo. Enquanto essa expressiio for verdadeira (diferente de zero), serao executadas ciclicamente as instrugdes do corpo. As instrugdes for constituem um modo alternativo de impor um comportamento idéntico ao das instrugSes while. A opgdo entre usar uma ou outra depende de qual das variantes se presta melhor ao algoritmo a satisfazer, em termos de clareza ¢ simplicidade de cédigo. As instrugdes do-while promovem também a execugio ciclica de um corpo de instrages, condicionada ao teste de uma expresso de controlo. Mas enquanto as instrugées while e for testam a expressao de controlo antes de executar cada ciclo, a instrugio do-while testa a expressaio de controlo apés a execugao de cada ciclo. A instrugiio break pode ser usada no corpo de uma instrugdo de repetig30 ou numa instrugio switch e provoca a safda imediata dessas instrucdes. A instrugio break pode ser usada no corpo de uma instrugdo de repeticdo ou numa instrug&io switch e provoca a safda imediata dessas instrugdes. Se a instrugio break estiver situada numa estrutura de ciclos aninhados, 6 termina 0 ciclo que a contém. Quando se quiser terminar todos os ciclos aninhados, deverd ser usada a instrugio goto. A instrugéo goto impée ao programa um salto para a instrugao seguinte a label (etiqueta) que lhe for associada. Uma /abel é um identificador seguido de dois pontos (:). A label tem que estar na mesma fungao que a instrugao goto. A instrugio continue é usada em instrugées de repeticao, e impde que seja executada de imediato a prdxima iteragiio da instrugdéo de repetig&io. Nas instruges do-while e while o controlo € transferido para a expresso de teste do ciclo de repetic¢ao, que é executada imediatamente; na instrugio for é executada imediatamente a expresso de incremento. As acgdes de recolha de dados a partir do teclado e¢ a visualizagio de mensagens no ecra sao delegadas para fungées de biblioteca especiatizadas nesses objectivos, declaradas nos ficheiros iostream.h, iomanip.h, fstream.h. 78 © FCA- EDITORA DE INFORMATICA Iniciagdo & linguagem C++ 2.7 Exercicios 1. Testar e rescrever o programa, substituindo a instrug’o for por while. #include void main() ¢ int for(i=0, cout << "Escreva uma linha de texto" << endl ; ein.get() I= "\n' 7 ted ve cout << "A linha tem" << i << " caracteres" << endl; + 2. Inferir e testar qual é 0 output do seguinte programa? #include #include void main() { char s[] = "retrevni a gnirt: for(int i = strlen(s); i >= 0 ; cout << sli], --i); + rod Analisar seguinte programa e inferir qual 0 seu comportamento se carregar nas teclas: 'A', 'b', Space, '$', Entere '.'. Testar em caso de dtivida. #include void main() { char c; cout << "Escreva texto texminado com <.>" << endl; for(s7) switch(c=cin.get()){ case * return; case ' ': case '\b': case '\t':case '\n': continue; case '!': case ' case '@': case '#' case '?': case '&* default: if (c >= ta! && c <= 'z') c= (char)(c -'a' + 'A'); d cout << oc; y —__} © FCA-EDITORA DE INFORMATICA 79 Programagao em C++ - Conceitos Basicos e Algoritmos 4. Qual os valores de a, b e c na instrugao de insergéio no cout? #include void main() ( int a= 0, b= att, c= +a; if (b) ++ 7 while (b < 10) ++ b; for( ; b >= 0 3 --b); + az cout << "a e void main() { unsigned number, val = 0; cout << "Escreva um valor inteiro " << endl;cin >> number; do { (val *= 10) += ( number % 10 ); number /= 10; } while ( number > 0 ); cout << val; ? a) Rescrever o programa substituindo 0 ciclo do-while por while-do. 80 © FCA-EDITORA DE INFORMATICA, Iniciagao a linguagem C++ 7. Verificar se o seguinte programa estd correcto. #include void main() { int ni, n2, n3, aux, less; cout << " Introduza trés inteixos" << endl; cin >> nl >> m2 >> n3; cout << "O maior dos inteiros " << nl <<", " << n2 << "e" << n3 << "e@’ " << (nl > (aux = (n2 > 3)? n2: 03) ? mi: aux)) << endl, 10. ll. Escrever um programa que leia do console input um némero inteiro positivo e escreva no console output se 0 nimero é par ou impar. Escrever um programa que leia do console input um ntimero inteiro positive e escreva no console output se o mimero é divisivel por 3, por 5, ou por 7, & apresente os restos das divisdes por 3, 5 ¢ 7, caso sejam diferentes de zero. Escrever um programa que mostre os 100 primeiros ntimeros primos. Escrever um programa que mostre o maximo divisor comum de dois némeros recolhidos do teclado. . Um palindromo (capicua) é um ntimero ou uma frase de texto simétrica. Por exemplo: 12321, 2222, 2992, “asa”. Escrever um programa que leia um inteiro positivo de cinco digitos e emita uma mensagem indicando se esse inteiro é ou nao palindromo. . Desenhar a imagem resultante do seguinte programa: #include void main() { for(int i = 1;4 <= 27 i ++) for(int j = <= 3; J +4) ¢ for(int k = 1; k <& 47k++) cout << "* cout << (§ % 27 "Nn": "); + cout << endl; 14. . Escrever um programa que recolha do console input os coeficientes de uma equacio de segundo grau, e mostre no console output as suas solucdes. © FCA-EDITORADEINFORMATICA 81. Programagao em C++ — Conceitos Basicos e Algoritmos 15. Escrever um programa que detecte a actuagio das teclas de acgiio: —, >, 1, T € mostre por extenso o seu significado (“seta para a esquerda”, “seta para a direita”, etc.). 16. Escrever um programa que mostre no console output o caracter recolhido do console input ou 0 correspondente maitisculo, caso exista. 17. Escrever um programa que leia uma linha de texto e mostre no ecra 0 eco da linha com todas as letras convertidas para maitisculas . 18. Escrever um programa que leia uma linha de texto e escreva em coluna as palavras (uma por linha) contidas no texto. 19, Escrever um programa que leia uma linha de texto e emita uma mensagem indicando o mimero de vogais encontradas (nao distinguindo maitisculas de minusculas). 20. Escrever um programa que lendo do teclado uma linha de texto, mostre posteriormente esse texto com o seguinte formato: — 86 subsista um tinico espago entre palavras; — A primeira letra de cada palavra seja maitiscula ¢ as seguintes mintisculas. 21. Escrever um programa que leia uma linha de texto correspondente ao nome por extenso de uma pessoa, e mostre posteriormente no ecrf, exclusivamente, 0 apelido seguido do nome préprio. 22. Escrever um programa que Jeia uma linha de texto e mostre no ecrai um histograma em asteriscos, indicando o néimero de ocorréncias de cada cardcter alfabético (nao distinguindo maitisculas de mintisculas). Por exemplo, para a linha de texto “Bom dia meus senhores”: * * * ee Ok Re RR ORR eek ABCDEFGHIJKLMNOPQRSTU ~ Teste também com a frase “The quick brown fox jumps over the lazy dog”. 23. Escrever um programa que leia do console input inteiros positivos e mostre uma mensagem no console output contendo os dez maiores valores lidos. 24. Escrever um programa que leia do console input uma data (ano, més e dia), recuse datas que nao sejam validas e a escreva no console output, por extenso, a data recolhida. 82 © FCA-EDITORA Dé INFORMATICA, Tniciagao 4 linguagem C++ 25. 26. Escrever um programa que, por acco das teclas “seta” (, >, 1, 1), faga viajar 0 caracter “*’, sem permitir que saia dos limites do ecra. Escrever um programa que mostre no console output a tabela do cédigo ASCil (referindo por NP os caracteres de controlo), a cinco colunas e vinte Jinhas por ecra, ordenado de cima para baixo e da esquerda para a direita. Ao fim de mostrar vinte linhas, 0 programa deve esperar a actuagaio de uma tecla para continuar, de modo a que o utilizador possa ler a tabela pagina a pagina. © FCA-EDITORA DE INFORMATICA = 83 eEntrada e Saida de Dados Objectivos © Compreender o conceito de stream; . * Saber usar streams associados a consola e a fichciros; * Conhecer os operadores de acesso formatado a streams; e Conhecer os manipuladores para formatar dados em streams de texto; © Conhecer os diferentes modos de abrir streams associados a ficheiros; « Conhecer os métodos de aceder a streams no modo nao formatado; © Saber processar caracteres, palavras, linhas de texto, strings e streams; « Saber testar as variantes de sinalizagao de fim de stream; * Conhecer as fungdes que testam 0 tipo de caracteres; * Conhecer as fungdes de manipulacdo de strings; e Saber utilizar fungdes do ficheiro conio.h. © FCA - BDITORA DE INFORMATICA 85 Programacao em C++ - Conceitos Basicos e Algoritmos 3.1 Introdugado Como ja anteriormente salientémos, as acgdes de entrada e safda de dados (input/output ou VO) nao fazem propriamente parte da linguagem C++. As funges ou operadores que desempenham essas tarefas constam de bibliotecas cujas declaragées (ficheiros header) teremos de incluir no programa através de directivas #include para o pré-processador. Nas bibliotecas de VO estio disponiveis dois tipos de instrugdes, para entrada e safda de dados: * Instrugdes sobre objectos streams (canais de comunicagao). * _Instrugdes de acesso directo a consola (terminal) e aos portos. A linguagem C++ dispde de uma biblioteca de classes stream, cujas declaracdes se situam no ficheiro iostream.h e que suporta a generalidade das acgGes de I/O, satisfazendo ao paradigma da Programacio Orientada por Objectos. As instrugGes de entrada ¢ de safda de dados sobre streams siio invocadas sempre da mesma forma, independentemente do tipo de dispositivo a que acedem (ecra, teclado ou ficheiros). As instrugGes para acesso directo ao terminal e aos Pportos, permitem ler e escrever dados niio formatados (na forma de bytes) sem edigio de linha, directamente de e Para o terminal (teclado/ecra) ou para um porto de comunicacao de dados com o exterior. ‘ As declarages das fungdes para acesso directo ao terminal ¢ portos, situam-se no ficheiro header conio.h. Este capitulo aborda a biblioteca de streams numa perspectiva de cookbook, mostrando como as acgdes mais comuns de entrada e safda podem ser programadas. Uma anilise mais profunda sobre a organizagao desta biblioteca s6 poderd ser feita em fase mais adiantada do estudo do paradigma OOP suportado na linguagem Crt. Por critério pedagégico, protelamos pata o proximo capitulo a introdugio dos conceitos de apontador ¢ referéncia para varidveis. Assim, tudo o que se refere heste capitulo relativamente a instrugdes e operadores para entrada e saida de dados toma em consideragao esse facto. 86 © FCA-EDITORA DE INFORMATICA Entrada e Saida de Dados 3.2 Biblioteca de streams do C++ Por forma a uniformizar as primitivas através das quais um programa invoca as acgdes de I/O (entrada e saida de dados) a linguagem C++ virtualiza todos os dispositivos envolvidos nestas acgdes como objectos streams. Disp6e para tal de uma biblioteca de classes stream, cujas declaragdes se situam nos ficheiros iostream.h, iomanip.h e fstream.h, satisfazendo ao paradigma da Programagio Orientada por Objectos. Todos os objectos streams sio semelhantes em comportamento e bastante independentes dos dispositivos reais a que esto associados, pelo que os métodos para ler ¢ esctever num stream associado a um ficheiro em disco, sio também aplicados aos streams associados ao teclado ou ao ecra do terminal. Um stream associado a ficheiro é declarado como fstream (ifstream quando exclusivamente para leitura, ofstream quando exclusivamente para escrita) e a sua definicdo requer a inclusao do ficheiro header fstream.h. Um fstream associa-se com um ficheiro através de uma operagio de abertura (open) e desassocia-se dele através de uma operaciio de fecho (close). Fechar um fstream, implica que todo o contetido do tampao (buffer) a ele associado seja transcrito para o proprio dispositivo, Esta acgdo de esgotar 0 buffer (flushing) garante que nenhuma informagao fica inadvertidamente nele retida. O Exemplo 3.1 é um programa para ler uma palavra de um ficheiro de texto cujo pathname seja “‘c:\doc.txt” e mostrar essa palavra no ecra. Num ficheiro de texto, entende-se de uma forma genérica por palavra, uma sequéncia de caracteres, separada por caracteres “separadores” tais como: 0 espago (' '), tab horizontal (' \t ') ou a mudanga de linha (' \n"). Dada a virtualizago em streams dos dispositivos de entrada e safda de dados envolvidos neste programa, podemos aplicar os operadores insersor (“<<”) e extractor (“>>”) indistintamente ao terminal e ao ficheiro. O programa envolve dois objectos streams. O stream cout que é criado automaticamente, cuja declaracao se encontra no ficheiro iostream.h, e 0 stream de entrada sourceTxt associado ao ficheiro “c:\doc.txt”. A criago de streams associados a ficheiros, implica a necessidade da inclusio do ficheiro header fstream.h. © FCA-EDITORADE INFORMATICA 87 Programacao em C++ ~ Conceitos Basicos e Algoritmos Exemplo 3.1 Extracgo e insergdo de palavras #include #include void main() { // Buffer para armazenar uma palavra. char word[41]; // Criar sourceTxt, associado ao ficheiro "doc.txt". // no directdério corrente. ifstream sourceTxt ("c:\\doc.txt"); // Bxtrair uma palavra para word. sourceTxt >> word ; // Mostrar a string word no ecré. cout << word; O programa define um array word com uma dimensio suficiente para conter palavras até 40 caracteres em forma de string (terminadas com 0 caracter nulo "\O'). Seguidamente o programa cria um objecto ifstream (stream associado a um ficheiro aberto para leitura) de nome sourceTxt (mneménica para “fonte de texto”) associado ao ficheiro preexistente com pathname “‘c:\doc.txt” (ficheito situado no direct6rio raiz do disco “c:” e cujo nome € “doc.txt”). Tnvoca-se 0 operador extractor tendo como operando esquerdo sourceTxt e como operando direito word. O operador extractor, reconhecendo que o seu operando direito é do tipo array de char (string), 18 do stream uma palavra de texto © insere os caracteres dessa palavra em fndices sucessivos de word, terminando com a insergao do cardcter nulo '\0'. Sempre que € invocado o operador extractor de um stream para um array de char (string), a sequéncia de acgdes que o operador executa é a seguinte: * Consome (1é e despreza) todos caracteres separadores de palavras (“espagos em branco”) que antecedam a palavra a recolher. * L& os caracteres seguintes para um array de char (sob a forma de String) até encontrar um cardcter separador de palavra ou o fim de stream. * Envia para a string, o caracter terminador nulo '\0'. Seguidamente o programa insere em cout a string situada em word. Na defini¢éio do objecto stream de entrada sourceTxt, associado ao ficheiro “c:\doc.txt”, 0 pathname deste ficheiro € dado como parametro na forma de string 88 © FCA-EDITORA DE INFORMATICA. Entrada e Safda de Dados constante “c: \\doc. txt”. A duplicagSo do cardcter backslash prende-se com 0 modo adoptado para a representagao de caracteres em strings constantes, a que adiante faremos referéncia mais detalhada. Para aplicagdes genéricas sobre streams, o programa deve incluir o ficheiro iostream.h. Aplicagdes mais especificas requerem a inclusdo de outros ficheiros header, nomeadamente: iomanip .h para acgdes de formatago através de manipuladores; strstream.h para usar streams em memoria (para formatar dados); fstream.h para usar streams associados a ficheiros. Logo que se inchia num programa C++ 0 ficheiro header iostrream.h, serio criados automaticamente, entre outros, um objecto istream de nome cin normalmente associado ao teclado e um objecto ostream de nome cout normalmente associado ao ecra, Os operadores insersor ¢ extractor, aplicados a streams tratam a informagéo de um modo dito formatado. No caso de streams associados a ficheiros de dados em que se pretenda tratar a informag’o de modo nao formatado, nao serao utilizados os operadores insersor e extractor, mas sim os métodos get(), getline(), put(),read() ewrite(). 3.3 Entrada e Saida formatada A entrada ou safda de dados formatados € feita de acordo com o tipo do operador (insersor ou extractor) e com o tipo do operando direito. Por exemplo, desconhecendo o tipo da varidvel x, nao conseguimos inferir qual 0 resultado das instrugdes x = 64; cout << x; mesmo sabendo que o valor da varidvel x € 64. Se x for do tipo int possivelmente serd apresentado em cout a sequéncia de caracteres “64”, mas se x for do tipo char sera apresentado apenas o cardcter ‘A’ (cujo o cédigo ASCII €é 64). O mesmo tipo de dtivida também existiria no caso de ser usado 0 operador extractor. A biblioteca de streams disponibiliza também um conjunto de manipuladores que condicionam 0 formato de apresentagao de valores no que diz respeito a base de numeragio, largura de campo, etc. © FCA-EDITORA DEINFORMATICA = 89 Programagao em C++ - Conceitos Basicos e Algoritmos Por exemplo, as seguintes instrugdes: double value = 3.14159; cout << setfill('*') << setw(9) << value << endl; cout << setprecision(2) << value << endl; cout << setiosflags(ios::scientific) << value << endl; mostram no ecra: w*3, 14a5: B.1d ; 3.142000 3.3.1 Operador insersor (“<<”) A interacgaio dos programas com os streams de sada pode ser efectuada através do operador insersor. int x= 27; stream cout cout << x; Hoperagao 1 cout << endl; #/ operagbes 2¢ 3 nos caracteres "24 colocd-los no buffer] *mudanga de linha no buffer’. OU seja, escrever todo © contetido do buffer no ecra Figura 3.1 — Acc@es envolvidas na insergao dum valor do tipo inteiro No ficheiro header iostream.h sio definidas varias versdes do operador insersor (“<<”), uma para cada tipo basico do C++. © operador insersor permite inserir valores formatados em qualquer objecto stream de saida, nomeadamente em cout . 90 © FCA-EDITORA DE INFORMATICA Entrada e Saida de Dados As acgdes envolvidas na insergio do valor de uma varidvel x tipo inteiro, sdo ilustradas na Figura 3.1. O operador insersor permite concatenar insergSes sucessivas numa mesma expressio. Existem insersores nas versdes signed e unsigned dos tipos short, int e long, e dos tipos float, double, long double e “array de char” (string). Da insergiio de tipos apontadores (pointers) trataremos no préximo capitulo. Exemplo 3.2 — Insergao de valores tipo int e double #include void main() { int i = 273; double d = 43.79865; cout << "i =" << i <<", d=" << d << endl; /* Equivalente a: ' cout << "i="; // Insere a string "i= ". cout << iz // Insere o valor inteiro de i. cout <<", d cout << d; // Insere 0 valor real de 4, cout << endl; // Insere 0 caracteres '\n' © // faz flush do buffer. a ° // Insere a string. ° ° “ef 3 Os operadores insersores tomam em consideragao 0 tipo dos valores que lhe sfo dados para inserir, por forma a promoyer a sua representaciio em forma de texto. Dada a virtualizagio em streams dos dispositivos de safda de dados, podemos aplicar o operador insersor indistintamente ao terminal ou ao ficheiro. O programa envolve o objecto stream de saida dest Txt associado ao ficheiro com pathname “c:\resuit.txt”. O programa do Exemplo 3.3 cria um objecto of stream (stream associado a um. ficheiro aberto para escrita) de nome destTxt (mneménica para “destino de texto”) criando o ficheiro situado no directério raiz do disco “‘c:” e cujo nome é “result.txt” (pathname “c:\result.txt”). Seguidamente invoca o operador insersor tendo como operando esquerdo destTxt e como operando direito x. O operador insersor, reconhecendo que o seu operando direito é do tipo int, escreve no stream a string correspondente ao valor inteiro de x (neste exemplo: “8”). © FCA-EDITORADE INFORMATICA 91 Programagao em C++ - Conceitos Basicos e Algoritmos Nas insergdes seguintes sera escrito 0 cardcter ‘*’, a string correspondente ao valor do floating point y e, finalmente, a string correspondente ao valor do floating point x*y. A multiplicagio x*y é de floating points porque existe conversao implicita do tipo de menor alcance (int da varidvel x) para o de maior alcance (double da varidvel y). Exemplo 3.3 — Insercao de expressdes #include void main() { double y = 1.23; int x = 8; //Criar sourceTxt, associado ao ficheiro ¢:\result.txt ofstream destTxt ("c:\\result.txt"); destTxt << x << '*! << y << te! ccm # y ce \nt; Da execugao do Exemplo 3.3 resulta no ficheiro de texto: 8*1.23=9.84 Também € permitido dar como operando direito ao operador insersor, um string por valor, tal como se mostra no Exemplo 3.4. Exemplo 3.4 — Insergao de mensagens #include , // Nas mensagens sé devemos usar caracteres ASCII até 127, // a extens&o a 255 depende da plataforma de execugéo. // Tente ... void main( ) { cout << "Adeus meu amigo..." << endl; cout << "O C++ tem conceitos muito interessantes" << endl; cout << "Concorda? " << endl; + Definida previamente a string char message[] = “Bom dia"; a operagaio: cout << message; // message é um valor do // tipo string (array de char // terminado por '\0"'). insere no ostream cout a cadeia de caracteres "Bom dia". 92 © FCA-EDITORA DE INFORMATICA Entrada e Saida de Dados O simbolo “<<” corresponde originalmente ao operador left shift e é sobrecarregado (overloaded) com 0 significado de insersor quando aplicado a um operando esquerdo do tipo ostream e um operando direito de qualquer dos tipos para os quais o insersor tenha sido sobrecarregado. O termo sobrecarga (overload) de um operador significa definir um novo comportamento a esse operador, no caso de the ser aplicado um novo tipo de operandos. Numa mesma expressio podem coexistir dois significados para o mesmo operador. O operador “<<” tanto pode ter o significado de insersor como 0 de left shift, como por exemplo: int i = 16; // 4 << 2 left shift i de dois bits (multiplicar por 2%), do // que resulta o valor 64 (16 x 4). cout << (i<<2) << "\n'; Como veremos numa fase mais adequada do estudo, a linguagem C++ permite tornar a sobrecarregar este operador para que ele possa alargar as suas acgdes de insergao a qualquer classe de objectos definida pelo utilizador. 3.3.2 Manipuladores Os manipuladores de safda mudam o formato das insergGes, relativamente aos valores a escrever num ostream. Os manipuladores de entrada mudam o formato das extracgies, relativamente aos valores a ler de um istream. Existem manipuladores exclusivamente de safda, de entrada, ou que indistinta- mente so utilizados numa ou noutra destas acgées. O modo mais simples de mudar a base de numeragio, a Jargura do campo e outras varidveis de formato, é usar manipuladores. Exemplo 3.5 — Visualizagio de inteiros em base decimal, hexadecimal e octal #include #include void main() { int value = 123; cout << "0 valor em decimal * << value << " corresponde em octal a " << oct << value <<" @ em hexadecimal a " << hex << value << endl; © FCA-BDITORA DB INFORMATICA 93. Programagiio em C++ - Conceitos Basicos ¢ Algoritmos No caso da insergaio ou extracgio de valores inteiros, podem evocar-se nos streams os manipuladores dec, oct e hex para especificar variantes de base de numera¢ao, na escrita ou leitura do valor desses operandos. O manipulador endl € exclusivamente de saida. Insere uma mudanga de linha e despeja o buffer para o dispositivo fisico (escreve um cardcter '\n' e faz flush). Os manipuladores mais comuns, declarados em) iomanip.h , so os que constam da Tabela 3.1. Inserir Esvaziar (flush) 0 buffer do ostream. Conversio para base decimal. Conversio para base hexadecimal, para terminar string. eee dec hex oct, [ ¥] | ce a ‘Conversio para base octal. [Eliminar caracteres separadores. Fixar a base de conversSo em b. ¥ resetiosflags(long b) ior ae ST ae wes Tabela 3.1 Desactivar bit-vector flags de acordo ‘com b. Ver Tabela 3.2 Activar os bit-vector flags de acordo com b, Ver Tabela 3.2 | {| Definir 0 cardcter de preenchimento de espagos do campo com (char) £ ¥ | Situar em n digitos a precistio de um | floating-point. ¥ [Colocar em n caracteres a largura do campo. Manipuladores Sugerimos ao leitor que escreva um pequeno programa para teste de todos os. manipuladores, tal como o Exemplo 3.6. O manipulador setw(int n) permite fixar, para o valor do parametro n, a largura do campo de formatagio. Este manipulador sé tem efeito durante a proxima acco de escrita formatada (usando o operador insersor). 94 © FCA-EDITORA DE INFORMATICA Entrada e Saida de Dados O manipulador setf£ill(char £111) permite definir o carécter de preenchimento de espagos do campo, que seré usado nas acces de escrita formatada que se Ihe sigam. Exemplo 3.6 — Utilizagiio de manipuladores #include #include void main() { aint i=123; double d=12345.6789; char s[]= "blabla"; cout<< setw(10) << s << endl << i << endl << setw(10) << i << endl << d << endl << setw(15) << setfill('*') << d << endl << setw(13) << setfill(' ')<< setprecision(3) << setiosflags(ios::left) << d <<'s << endl; De que resulta: O Exemplo 3.7 ilustra 0 modo de usar os manipuladores setw() ¢ set£ill() para desenhar formas geométricas. Exemplo 3.7 — Desenho duma drea triangular #include #include void main() { const int CENTER COLUMN = 25, NUMBER_OF_ROWS = 10; for(int row=0; row < NUMBER_OF_ROWS; ++row) cout<< setfill(' ') << setw(CENTER COLUMN - row) << ' ' << setfill('*') << setw(2 * row + 1) << '*'<< endl; + A instrucio for mostra, no ecr4, uma drea triangular preenchida com caracteres ecg © FCA-EDITORADE INFORMATICA — 95 Programacio em C++ - Conceitos Basicos e Algoritmos Para a escrita dos espacos iniciais, define-se como cardcter de preenchimento do campo 0 espago (set f£ill(' ')) e calcula-se o campo (mimero de espacos) a partir da linha corrente ¢ da coluna onde se quer centrar 0 triangulo: (CENTER_COLUMN - row) Para a escrita dos asteriscos (1 na primeira linha, 3 na segunda linha, 5 na terceira linha, etc.), define-se, como cardcter de preenchimento do campo, 0 asterisco (set£ill('*')) e calcula-se o campo (ntimero de asteriscos) a partir da linha corrente: (2 * row + 1) // Se row for iniciade a zero (0) O manipulador set iosflags () activa as flags de formatagao e 0 manipulador resetiosflags() desactiva-as. Normalmente s6 sio usados quando nfo exista um manipulador especifico para o mesmo efeito. O Exemplo 3.8 mostra o resultado da desactivagao da flag ios: :skipws, que normalmente esta activa. Exemplo 3.8 — Extracedo de caracteres sem descriminar separadores #include #include void main() ( { //Criagdo de um bloco de programa. ofstream £("frase.txt"); // Escrever no ficheiro de texto. £ << "Pode fazer-se reset na flag skipws." << endl; } // close implicito do ficheiro. char oc; ifstream f1("frase.txt"); // Ler do ficheiro de texte e escrever no console output. while( £1 >> ¢ ) cout << o7 cout << endl; ifstream £2("frase.txt"); £2 >> resetiosflags(ios::skipws) ; // Ler do ficheiro de texto e escrever no console output. while( £2 >> c ) cout << ¢7 O output resultante sera: Podefazer-seresetnaflagskipws. Pode fazer-se reset na flag skipws. As flags mais comuns s&o as que constam na Tabela 3.2. 96 © FCA - EDITORA DE INFORMATICA, Entrada e Safda de Dados [eT ios::left Espacos & esquerda. Espacos & direita. | ‘Usa representacao simbélica de true e y y g m ° a 2 ed a ios::internal B 3 3 g é 3 2 & ° 2 < 5 2 ios: :boolalpha ry 2 B o ® | o a dost: Conversfio para base decimal. jos: :hex Conversao para base hexadecimal. [Comersto para busedeciml, | [¥_ | _[Somversto mare base hexadecimal, | [Comensto pabase cera [Use a notte 123,45 pare os floating pout. [Use «nota 123452 para os floating pont [Porsavescntadabuse, [Fetsa wesc do ponte (eating point) | jos:: 9 Q a =] Conversao para base octal. os::fixed Usa a notacao 123.45 para os floating point. riscientific Usa a notacio T2345ED para os floating point, 7 showbase Forga a escrita da base. 7: Showpoant Forga a escrita do ponto (floating point). ios: :showpos | fy | ‘Adiciona 0 ‘+ nos inteiros positivos. tos: ruppercase Escreve em maitisculas quando a base € hexadecimal. Tabela 3.2 — Flags de formatagio ey) ey ey et] o] of o a] a] a 3.3.3 Operador extractor (“>>”) Streams de entrada (istreams) sao lidos usando o operador right shift (“>>”), sobrecarregado como operador extractor. O operador extractor (“>>”) toma como operando esquerdo um istream e como operando direito a varidvel que deve ser afectada com o valor extraido do istream. O operando dircito pode ser qualquer dos tipos intrinsecos do C++. Em iostream.h estao definidas varias versées do operador extractor, uma para cada tipo. Por omissao de manipulador especffico, o operador extractor (“>>”) salta espagos em branco (como definido na fungio isspace() declarada em ctype.h) lendo seguidamente os caracteres condizentes com 0 tipo de objecto que vai ser afectado. © FCA-EDITORA DE INFORMATICA — 97 Programagao em C++ - Conceitos Basicos e Algoritmos A Figura 3.2 mostra as varias accdes envolvidas na extracgao de um valor inteiro para a varidvel x (operago 2) e na extracgo de uma palavra de texto para o array de char y (opetagdo 3). Pressupée-se que o mimero de caracteres da palavra recolhida no ultrapasse a dimensiio do array y. int x; char v7 stream cin cin >> X;// operagao 2 CIN >> y; // operagao 3 27 * 0027 xpt¢" ignorou-se o espaco inicial e converteram-se os digitos ‘0','0','2','7' para o valor inteiro 27 1? Quando foi digitado o preencheu-se o buffer com a linha completa ignorou-se os espagos e leu-se as letras 'x','p','t','0' para 0 array colocando um a seguir ao 'o' para terminar a string, Figura 3.2 — Accées envolvidas na extracgao de um inteiro ¢ uma string O operador extractor aplicado sobre um istream, tendo como operando direito um array de caracteres, recolhe exclusivamente uma palavra (cadeia de caracteres diferentes de “espago em branco”) 0 que em principio provoca alguma perplexidade. No entanto, este critério é considerado como o mais conveniente para a generalidade das aplicacdes. O Exemplo 3.9 lé do istream cin uma palavra e um inteiro (primeiro nome e idade de uma pessoa) e escreve no ostream cout uma mensagem conforme & idade lida. Define-se um array name com uma dimensio suficiente para conter um primeiro nome até 15 caracteres, ¢ um inteiro age para conter a idade. Depois de enviar para o ostream cout uma mensagem para que seja escrito o primeiro nome, invoca-se duas vezes o operador extractor, tendo como operando 98 © FCA-EDITORA DE INFORMATICA

Você também pode gostar