~ linguagem de programacao e estruturas de

183

Upload: ivonmaiden2

Post on 18-Jun-2015

517 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: ~ Linguagem de Programacao e Estruturas De

LINGUAGEM DE PROGRAMAC� ~AO EESTRUTURAS DE DADOSBENEDITO MELO ACI�OLYVOLUME IFTC 2001

Page 2: ~ Linguagem de Programacao e Estruturas De

2

Page 3: ~ Linguagem de Programacao e Estruturas De

Conte�udo1 INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO 51.1 Processamento de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2 Organiza�c~ao de um computador . . . . . . . . . . . . . . . . . . . . . . . . 101.3 Sistema de programa�c~ao de apoio . . . . . . . . . . . . . . . . . . . . . . . 141.4 Constru�c~ao de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 ALGUNS ALGORITMOS SIMPLES 212.1 Problemas usando o tipo abstrato de dados inteiro . . . . . . . . . . . . . . 212.2 Exerc��cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3 Algoritmos estruturados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 COMANDOS ESTRUTURADOS 453.1 Estruturas de decis~ao de sele�c~ao ou de alternativas . . . . . . . . . . . . . 583.2 Exerc��cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 ALTERNATIVAS M�ULTIPLAS 794.1 Sele�c~ao m�ultipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794.2 Exerc��cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945 PROGRAMAC� ~AO MODULAR 975.1 Procedimentos e fun�c~oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.2 Procedimentos e fun�c~oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985.3 Exerc��cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176 DADOS ESTRUTURADOS 1196.1 Introdu�c~ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1196.2 Tipos abstratos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206.3 Tipos de dados b�asicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226.4 O tipo matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1376.5 Vari�aveis e literais de string . . . . . . . . . . . . . . . . . . . . . . . . . . 1416.6 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1483

Page 4: ~ Linguagem de Programacao e Estruturas De

4 CONTE�UDO6.7 Arquivos(File) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1496.8 Aplica�c~oes de matrizes e registros . . . . . . . . . . . . . . . . . . . . . . . 1536.9 Exerc��cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162Bibliogra�a 174

Page 5: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 1INTRODUC� ~AO:SOBRELINGUAGEM DEPROGRAMAC� ~AOO computador �e um instrumento imprescind��vel ao com�ercio, �a ind�ustria e �a pesquisacient���ca. Ele �e um automato1 que executa processos computacionais segundo regras pre-cisamente estabelecidas. O computador possui um repert�orio limitado de instru�c~oes ele-mentares que ele \entende" e �e capaz de obedecer. Essas instru�c~oes s~ao, por�em, executadascom rapidez e con�abilidade extraordin�arias. A utilidade do computador prov�em de suacapacidade de executar sequencias extremamente longas de instru�c~oes, que se traduzemem in�umeras a�c~oes elementares. O ato de agrupar tais sequencias de instru�c~oes em \re-ceitas" representando certa classe de processos computacionais �e chamado programa�c~ao.As id�eias b�asicas sobre as quais se apoia a constru�c~ao de programas podem ser explicadase compreendidas sem qualquer referencia ao computador.A seguir apresentaremos algumas no�c~oes b�asicas de programa�c~ao. Como elas s~aofundamentais, n~ao podem ser de�nidas formalmente em termos de outros conceitos. Ser~ao,apenas, explicadas e ilustradas por meios de exemplos.A�c~aoPodemos dizer de uma a�c~ao que:� tem dura�c~ao �nita;� tem um efeito esperado e bem de�nido;1Chamamos de automa�c~ao o processo em que uma tarefa deixa de ser desenvolvida pelo homem epassa a ser realizada por uma m�aquina. 5

Page 6: ~ Linguagem de Programacao e Estruturas De

6 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO� subentende a existencia de objetos sobre os quais ela �e executada e cujo efeito �ereconhecido como mudan�cas de estado desses objetos;� pode ser descrita em termos de uma linguagem ou sistema de f�ormulas;� sua descri�c~ao �e chamada comando;� pode ser simples ou composta.2 Uma a�c~ao composta �e tamb�em chamada processoou computa�c~ao.Se for poss��vel executar as partes de uma a�c~ao composta em ordem cronol�ogica ri-gorosa, de modo que duas quaisquer delas nunca sejam executadas simultaneamente, oprocesso �e chamado sequencial.Portanto, um programa�e um comando que descreve um processo composto. Em outraspalavras, um programa �e um conjunto de comandos cuja ordem em que s~ao escritos poden~ao coincidir com a ordem cronol�ogica das a�c~oes correspondentes.Podemos dizer de um processador que� ele �e a for�ca motriz que realmente executa as a�c~oes, segundo comandos espec���cos;� ele pode ser um ser um humano ou um automato.Toda a�c~ao requer uma certa quantidade de trabalho, dependendo do processador. Essaquantidade pode ser expressa em termos do tempo gasto pelo processador para executara a�c~ao. Esse intervalo de tempo, por sua vez, traduz-se mais ou menos diretamente emuma medida de custo.Portanto, �e importante conhecer o processador dispon��vel e, combase nessa informa�c~ao, procurar a solu�c~ao de menor custo.Exemplo 1 (Multiplica�c~ao)Considere o comando:multiplique os dois n�umeros naturais x e y;denote seu produto por z: (1.1)Se o processador dispon��vel entende este comando, isto �e, ele sabe o que se querdizer por \n�umero natural" e por \multiplica�c~ao", ent~ao qualquer elabora�c~ao ulterior �edesnecess�aria.Suponha, por�em, que o processador dispon��vel1. n~ao entende senten�cas em linguagem natural, e2Uma a�c~ao �e composta se ela puder ser decomposta em partes.

Page 7: ~ Linguagem de Programacao e Estruturas De

72. n~ao sabe multiplicar, mas, apenas, somar.Um programa para manipular n�umeros(ou letras) usa nomes gerais representandoobjetos vari�aveis. Esses nomes s~ao denominados vari�aveis. No in��cio de cada processo,os valores espec���cos(2 ou 'a', por exemplo) s~ao atribu��dos a essas vari�aveis. Essa a�c~ao deatribui�c~ao �e fundamental nos processos computacionais executadodos por computador.Uma vari�avel �e compar�avel a um quadro-negro: seu valor pode ser inspecionado(\lido")tantas vezes quanto desejadas, ou pode ser apagado e reescrito. A a�c~ao de reescrever, noentanto, causa a perda do valor anteriormente escrito. A atribui�c~ao de um valor k a umavari�avel v, ser�a denotado, de ora em diante, porv k (1.2)O s��mbolo �e chamado operador de atribui�c~ao.O comando 1.1 pode, agora, ser de�nido formalmente porz x � y (1.3)Se este comando for decomposto numa sequencia de a�c~oes que se sucedem cronolo-gicamente, ent~ao a a�c~ao de multiplica�c~ao torna-se um processo sequencial e o comando1.3 toma a forma de um programa. Informalmente,3 descreveremos esse programa comosegue: Passo 1 : z 0;u x;Passo 2 : repita as instru�c~oesz z + yu u� 1at�e que u=0.Quando forem dados valores determinados a x e a y, o processo correspondente podeser visualizado registrando-se os valores atribu��dos �as vari�aveis u e v, �a propo�c~ao que oprocesso transcorre no tempo. Com x = 5 e y = 13, obtemos a tabela(de rastreio) aseguir.3Por informalmente queremos signi�car que n~ao estamos usando uma linguagem de programa�c~ao paradescrever esse programa.

Page 8: ~ Linguagem de Programacao e Estruturas De

8 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AOPasso valor de z valor de u1 0 52 13 42 26 32 39 22 52 12 65 0Pelo passo 2, o processo termina assim que u = 0. Neste instante, z assume o valor�nal 65 = 5� 13.4Exemplo 2 (Divis~ao)Considere as seguintes instru�c~oes:1. divida o n�umero natural x pelo n�umero natural y;2. denote o quociente inteiro por q e o resto por r.A instru�c~ao (2) pode ser expressa pelas seguintes rela�c~oes:x = q � y + r e 0 � r < y (1.4)Introduzindo o operador de divis~ao div, a computa�c~ao pode ser descrita pelo seguintecomando formal de atribui�c~ao. (q; r) x div y (1.5)Novamente, para mostrar a possibilidade da transforma�c~ao do comando(constitu��dodas duas instru�c~oes acima) em programa, suponhamos que ele �e destinado a um proces-sador incapaz de dividir, isto �e, sem o operador div. Vamos supor que o processador �ecapaz de efetuar subtra�c~oes. Portanto, divis~oes devem ser decompostas em sequencias desubtra�c~oes. Passo 1 : q 0;r x;Passo 2 : enquanto r � y repitaq q + 1r r � y4Os objetos desta computa�c~ao s~ao n�umeros. Para se executar opera�c~oes sobre determinados n�umeros,�e necess�ario represent�a-los com uma nota�c~ao espec���ca.

Page 9: ~ Linguagem de Programacao e Estruturas De

9x e y denotam constantes que representam valores �xados de antem~ao. Com x = 100e y = 15 obtemos a seguinte tabela.Passo valor de q valor de r1 0 1002 1 852 2 702 3 552 4 402 5 252 6 10Ao se chegar a r < y o processo termina. Os resultados obtidos s~ao q = 6 e r = 10,satisfazendo as rela�c~oes 1.4:100 = 6 � 15 + 10 e 0 � 10 < 15 (1.6)Os exemplos 1 e 2, descritos acima, s~ao processos sequenciais nos quais as atribui�c~oess~ao feitas em estrita ordem cronol�ogica. Nestas notas, assim como no curso de linguagemde programa�c~ao 1, s�o discutiremos processos sequenciais, portanto, a palavra processosigni�car�a, para n�os, processo sequencial.Os exemplos que apresentamos mostram que todo programa descreve uma sequenciade mudan�cas de estados, do conjunto de suas vari�aveis. Se o programa for seguido duasvezes, com diferentes valores de x e y, n~ao seria correto a�rmar que os dois processos oucomputa�c~oes s~ao identicos. No entanto, eles s~ao regidos pelo mesmo padr~ao de compor-tamento. A descri�c~ao desse padr~ao de comportamento, indepentemente do processadorparticular, �e normalmente denominada algoritmo. O termo programa �e mais apropriadopara aqueles algoritmos, t~ao elaborados, que podem ser seguidos ou executados por umtipo particular de processador.Para construir programas execut�aveis por computadores autom�aticos, o programadordeve possuir algum conhecimento do processador(computador). Quanto mais preciso foro conhecimento que tiver do processador, melhor poder�a converter algoritmos em progra-mas que utilizem as caracter��scas partibulares desse processador. Por outro lado, quantomais ajustado e \sintonizado" ao processador for o algoritmo, maior o esfor�co dispendidona elabora�c~ao do programa. Embora n~ao pretendamos que o aluno sai conhecendo comprofundidade um computador, �e fundamental que ele conhe�ca as caracter��stcas mais im-portantes e comuns �a maioria dos computadores. A seguir descreveremos o que vem a sero conceito de processamento de dados e a estrutura b�asica dos computares.

Page 10: ~ Linguagem de Programacao e Estruturas De

10 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO1.1 Processamento de dadosAssim como a id�eia de a�c~ao, o conceito de informa�c~ao �e primitivo.5 Entendemos queuma informa�c~ao �e capaz de transmitir um conhecimento. Para que haja transmiss~ao deconhecimento, isto �e, para que haja informa�c~ao, �e necess�ario um emissor e um receptor.O emissor emite os dados, enquanto o receptor recebe os dados, interpretando-os paratransform�a-los em informa�c~ao. Os dados s~ao o suporte da informa�c~ao e representados pormeio de uma codi�ca�c~ao. Entretanto, para que haja informa�c~ao �e preciso que o receptorseja capaz de interpretar os dados atrav�es de uma decodi�ca�c~ao. A tarefa do computa-dor �e executar opera�c~oes com os dados, como, por exemplo, copiar, alterar, gravar, etc.Dizemos, ent~ao, que o computa�c~ao executa processamento de dados.Um computador digital �e capaz de representar dois tipos de dados b�asicos: os n�umerose as letras de algum alfabeto(caracteres). Podemos citar como exemplos de processamentode dados por um computador os seguintes.Exemplo 3 1. Imprimir uma rela�c~ao de nomes em ordem alfab�etica.2. Elaborar uma folha de pagamento.3. Achar a solu�c~ao de uma equa�c~ao de 2o grau.4. Imprimir os 50 primeiros n�umeros pares.1.2 Organiza�c~ao de um computadorAs partes principais de um computador s~ao o processador6(tamb�em conhecida como uni-dade l�ogica-aritm�etica) e a unidade mem�oria.Mem�oria e Processadorpartes principais do computadorPodemos a�rmar que1. a mem�oria abriga, em forma codi�cada, os objetos que ser~ao manipulados. Essesobjetos s~ao chamados dados. O desempenho da mem�oria �e medido pela sua ca-pacidade(tamanho) e pela velocidade como os dados s~ao nela armazenados e delaretirados. A mem�oria tem sempre capacidade �nita.5Um conceito �e primitivo se ele n~ao pode ser explicado em termos de outros mais simples.6O processador �e mais conhecido como unidade central de processamento(CPU-Central ProcessingUnit) MEM�ORIA E CPUpartes principais do computador .

Page 11: ~ Linguagem de Programacao e Estruturas De

1.2. ORGANIZAC� ~AO DE UM COMPUTADOR 112. O processador(unidade l�ogica-aritm�etica) executa adi�c~oes, multiplica�c~oes, compa-ra�c~oes, etc. Os dados s~ao buscados(lidos) na mem�oria para o processamento e, umavez obtido o resultado pela unidade l�ogica-artim�etica, armazenado novamente namem�oria(escritos).O processador possui seus pr�oprios elementos de mem�oria, chamados registradores.Em cada instante eles cont�em, apenas, os dados a serem imediatamente processados.Todos os outros dados s~ao deixados na mem�oria que, desse modo desempenha um papelan�alogo ao de uma geladeira.Para ilustrar como funciona o processamento na CPU, apresentaremos o c�alculo deuma express~ao aritm�etica, com v�arios operandos e resultados intermedi�arios.Exemplo 4 Calcular a express~ao aritm�eticaa� b+ c� d: (1.7)Para calcular essa express~ao usaremos, mais uma vez, a t�ecnica de decompo-si�c~ao de uma tarefa complicada em uma sequencia de tarefas mais simples.Usando essa t�ecnica, cada opera�c~ao aritm�etica �e efetuada sobre operandos to-mados dos registradores do processador, com a subsequente substitui�c~ao, nosregistros, dos resultados. AssimR1 aR2 bR1 R1 �R2z R1R1 cR2 dR1 R1 �R2R2 zR1 R1 +R2ondeR1 eR2 denotam registros do processador e z designa um resultado intermedi�ario,temporariamente depositado na mem�oria. O resultado �nal est�a no registro R1.Desse modo, o c�alculo da express~ao foi transformado em um programa, consistindo detres esp�ecies de instru�c~oes ou comandos:1. intru�c~oes que buscam os operandos na mem�oria;2. opera�c~oes(aritm�eticas) atuando exclusivamente sobre os registros do processador;

Page 12: ~ Linguagem de Programacao e Estruturas De

12 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO3. instru�c~oes que depositam resultados na mem�oria.Este exemplo mostra a necessidade de uma ��ntima conec�c~ao entre o processador e amem�oria, pois �e sempre muito grande o uxo de informa�c~oes entre essas duas unidades.A mem�oria cont�em objetos acess��veis atrav�es de nomes distintos(a, b, c, ...). Por isso�e preciso um crit�erio de disposi�c~ao dos elementos da mem�oria, parecido ao conjunto decaixas de correspondencia. Portanto, os objetos devem estar em um conjunto de posi�c~oesde mem�oria identi�cados de modo �unico, cada um deles possuindo um endere�co. Todoacesso �a mem�oria deve ser acompanhado da especi�ca�c~ao do endere�co da posi�c~ao demem�oria desejada.As posi�c~oes de mem�oria tem como �nalidade conter e preservar os objetos(dados). Acapacidade da mem�oria do computador de preservar dados n~ao �e baseada no fato de queela abriga �sicamente o objeto, mas porque certa codi�ca�c~ao do mesmo �e representadapelo o estado da posi�c~ao de mem�oria. Portanto, cada posi�c~ao de mem�oria deve ser capazde assumir um certo n�umero de estados. Nos computadores digitais os elementos demem�oria possuem somente dois estados distintos e, por isso, s~ao chamados elementos demem�oria bin�arios. Se um conjunto de n elementos de mem�oria bin�arios for agrupados, elepoder�a assumir 2n diferentes combina�c~oes de estados. Se este grupo for considerado comouma unidade, ent~ao ela representar�a uma posi�c~ao de mem�oria com 2n estados poss��veis.Exemplo 5 Codi�ca�c~ao de objetos em grupos de d��gitos bin�arios.Seja x = bn�1:::b1b0 (1.8)um n�umero bin�ario qualquer, com n d��gitos, na representa�c~ao posicional.7A regra de codi�ca�c~ao desses n�umeros(iclusive o 0) �e dada porx = b0 + 2b1 + :::+ 2n�1bn�1 (1.9)Esta regra n~ao �e a �unica poss��vel, mas, em muitos aspectos, �e a mais adequada.Ela �e a mesma em que se baseia a representa�c~ao decimal desses n�umeros, isto�e, se x = dm�1:::d1d0 (1.10)7Por exemplo, 1324 �e um n�umero natural decimal representado na forma posicional. Aqui, o d��gito3, como ocupa a segunda posi�c~ao, da esquerda para �a direita a contar de 0(portanto, a terceira posi�c~aocontanto de zero), representa o valor 300.

Page 13: ~ Linguagem de Programacao e Estruturas De

1.2. ORGANIZAC� ~AO DE UM COMPUTADOR 13ent~ao, x = d0 + 10 � d1 + 102 � d2 + :::+ 10m�1 � dm�1 (1.11)Exemplo 6 Alguns n�umeros codi�cados em bin�ario e decimal.Bin�aria Decimal1101 1310101 21111111 631101011 107Podemos observar deste exemplo que posi�c~oes de mem�orias �nitas, isto �e, posi�c~oes demem�orias capazes de assumir somente um n�umero �nito de estados diferentes, tem a pos-sibilidade de armazenar somente n�umeros pertencentes a um intervalo �nito de valores.O n�umero de elementos bin�arios de mem�oria, reunidos sob uma �unica posi�c~ao de mem�oriaendere�c�avel(palavra), �e conhecido como comprimento de palavra do computador. Os va-lores mais comuns de comprimentos de palavras s~ao: 8, 16, 32, 32 e 64, que correspondema conjuntos de 2n valores distintos, com n o comprimento da palavra.Para que o computador tivesse um acesso \f�acil" a um programa, para poder segui-lo,Jonh von Neumann teve a id�eia de armazen�a-lo na mem�oria. Portanto, a mem�oria �e usadatanto para guardar os objetos(dados), como a \receita" do processo computacional(oprograma).Como consequencia do conceito de computador de programa armazenado, as instru�c~oesprecisam tamb�em ser codi�cadas. No exemplo, 4 cada instru�c~ao �e represent�avel porum c�odigo de opera�c~ao8 e em alguns casos por um operando. Se os operandos foremrepresentados por endere�cos na posi�c~ao de mem�oria e se os endere�cos forem n�umerosinteiros 0, 1, 2, 3, ..., ent~ao o programa da codi�ca�c~ao de programas estar�a essencialementeresolvido: todo programa ser�a representado por uma sequencia de n�umeros(ou grupos den�umeros) e poder�a, portanto, ser depositado na mem�oria do computador.Outra consequencia do conceito de programa armazenado �e que todo programa ocu-par�a certo n�umero de posi�c~oes de mem�oria, isto �e, tomar�a certa por�c~ao de mem�oria. On�umero de posi�c~oes de mem�oria ocupadas, e que n~ao estar~ao dispon��veis para armazena-mento de dados, �e proporcional ao comprimento do programa. Portanto, �e importante terem vista que �e \melhor" aquele programa, dentre os programas que executam a mesmaa�c~ao, que seja mais conciso.A seguir apresentaremos um resumo das fun�c~oes de um computador que �e baseado noconceito de compartilhamento entre dados e programa.8Para especi�car o tipo de tarefa a ser executada, como leitura ou armazenamento de dados namem�oria, adi�c~ao, multiplica�c~ao, etc.

Page 14: ~ Linguagem de Programacao e Estruturas De

14 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO1. Assim que termina a execu�c~ao de um programa P , um novo programa Q pode seraceito na mem�oria para subsequente execu�c~ao( exibilida e vasta aplicabilidade).2. Um computador pode gerar(segundo um certo programa) uma sequencia de n�umerosque ele subsequentemente considerar�a e interpretar�a como instru�c~oes codi�cadas. Osdados gerados na primeira etapa formam um programa a ser seguido na segunda.3. Podemos instruir um computador X para considerar sequencias de n�umeros repre-sentando programas como se fossem dados, a serem transformados(segundo a algumprograma tradutor) em sequencias de n�umeros representando programas codi�cadospara um outro computador Y.Os dados, provinientes de um meio externo, s~ao \fornecidos" ao computador e arma-zenados na mem�oria atrav�es dos dispositivos de entradas.Os dados s~ao transmitidos da men�oria para algum meio externo atrav�es dos disposi-tivos de sa��da. ENTRADAS // MEM�ORIA E CPU // SA�IDASAlguns disposivos de entradas: teclado,disk driver.Aguns dispositivos de sa��das: monitor de v��deo, disk driver, impressora.1.3 Sistema de programa�c~ao de apoioAt�e a d�ecada de 60, programar consistia em fazer codi�ca�c~ao de longas sequencias deinstru�c~oes. Inicialmente, estas codi�ca�c~oes eram escritas em alguma nota�c~ao simb�olica,como os n�umeros na forma bin�aria, octal ou hexadecimal. Hoje esse tipo de atividade�e denominada codi�ca�c~ao, para distinguir de programa�c~ao que abrange a tarefa maisdif��cil de constru�c~ao de algoritmos. Com o aparecimento dos computadores mais r�apidos�cou evidente as de�ciencias desse processo de codi�ca�c~ao, dentre outras, pelas seguintesraz~oes.1. O codi�cador era for�cado a ajustar o programa �as caractr��sticas particulares docomputador de que dispunha. Portanto, ele tinha que levar em conta todos os por-menores da m�aquina, inclusive da organiza�c~ao de seu processador e de seu conjuntode instru�c~oes. O intercambio de programas entre diferentes m�aquinas era imposs��vel.Por isso, grande parte do conhecimento dos m�etodos de codi�ca�c~ao para uma dadam�aquina era praticamente in�util quando se passava para outro computador. Dessemodo, cada institui�c~ao construia seus pr�oprios programas e era for�cada a desfazer-sedos mesmo, e codi�car novos, sempre que um novo computador tomava lugar doantigo. Por tudo isso, �cou evidente que a adapta�c~ao e ajuste de algoritmos �as

Page 15: ~ Linguagem de Programacao e Estruturas De

1.3. SISTEMA DE PROGRAMAC� ~AO DE APOIO 15caracter��scas particulares de um computador espec���co representava um mal inves-timento da inteligencia humana.2. A subordina�c~ao do programador �as peculiariddes de um tipo de computador possi-bilitou e at�e estimulou a inven�c~ao e aplica�c~ao de toda sorte de truques para obter om�aximo de desempenho da m�aquina. Enquanto essa \trucologia" estava emmoda, oprogramador dispendia um tempo apreci�avel na constru�c~ao de programas \�otimos",cuja veri�ca�c~ao era geralmente muito dif��cil. Era praticamente imposs��vel descobriros princ��pios gerais de um programa constru��do por outra pessoa. Muitas vezes,era igualmente dif��cil explicar a estrutura de seus pr�oprios programas. Esta arteda codi�ca�c~ao perdeu atualmente quase toda a importancia. O programador expe-rimentado evita conscientemente o uso de truques, escolhemos, em contrapartida,solu�c~oes claras e sistem�aticas.3. O chamado c�odigo de m�aquina continha, apenas, um m��nimo de redundancias �abase das quais erros formais de codi�ca�c~ao poderiam ser detectados. Consequente-mente, mesmo os erros de digita�c~ao, que poderiam ter efeitos desastrosos quandoda execu�c~ao do programa, eram dif��ceis de ser descobertos.4. A representa�c~ao de um programa complexo como uma sequencia linear n~ao estru-turada de comandos �e uma forma muito inadequada de uma pessoa descrever oucompreender um processo complicado. A estrutura�c~ao do programa foi o primeiropasso a ajudar o programador a sintetizar sistematicamente e a manter uma vis~aode conjunto de programas complicados.Essas de�ciencias levaram ao desenvolvimento das chamadas linguagens de progra-ma�c~ao de \alto" n��vel. Essas linguagens possilitaram os meios de instruir computadorimagin�ario, hipot�etico, que �e projetado n~ao segundo as limita�c~oes da tecnologia atual,mas, de acordo com os h�abitos e possibilidades de o homem expressar seus pensamentos.Atualmente dispomos, ent~ao do seguinte cen�ario:- de um lado, temos uma m�aquina A, que �e economicamente exeq�u��vel, mas, cujo uson~ao �e conveniente nem estimulante,- de outro, um computador B que �e adequado �as necessidades humanas, mas existe,apenas, no papel.A ponte entre esses dois extremos �e feita, atualmente, por uma entidade chamada (emingles)software (programa�c~ao de apoio). Em contrapartida, a m�aquina f��sica �e chamadahardware. Um sistema de programa�c~ao de apoio(sistema de softtware) �e um programaC, que, quando executado pela m�aquina real A, capacita A a traduzir programas escritospara um computador hipot�etico B, em programas para a m�aquina A. O programa C �e

Page 16: ~ Linguagem de Programacao e Estruturas De

16 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AOchamado tradutor ou compilador. Ele permite que tudo se passe como se A fosse ocomputador ideal B.A utiliza�c~ao do compilador C alivia, assim, o programador da preocupa�c~ao de tersempre que levar em conta, em seus m��nimos detalhes, as caracter��sticas particulares de seucomputador A. Isto n~ao libera da obriga�c~ao do programador de estar permanentementeconsciente de que �e a m�aquina A que, a�nal, executar�a os programas e, que ela temlimita�c~oes b�em de�nidas, impostas por sua velocidade e capacidade de mem�oria �nitas.Normalmente, um sistema combinado de \hardware" e \software" processa um progra-ma P em duas etapas distintas, que se sucedem cronologicamente. Na primeira etapa, P�e traduzido pelo compilador C numa forma interpret�avel por A. Na segunda, o programatraduzido �e executado.A esta �ultima etapa chamamos execu�c~ao e �a primeira compila�c~ao.Compila�c~ao: programa = compilador Cdados de entrada = programa P em linguagem Bdados de sa��da(resultados) = programa P na linguagem A.Execu�c~ao: programa = P na linguagem Adados de entrada = argumentos X da computa�c~aodados de sa��da(resultados) = resultados Y da computa�c~ao.1.4 Constru�c~ao de programasJ�a sabemos que� o processamento de dados �e feito pela execu�c~ao de programas e,� um programa �e uma sequencia de instru�c~oes codi�cadas em uma linguagem deprograma�c~ao que,� para serem executadas precisam ser armazenadas na mem�oria de um computador.Portanto, a seguinte pergunta: para que serve um programa?A resposta seria, para resolver um problema. Esta resposta, por sua vez, suscita umaoutra pergunta: o que �e um problema? Existem muitas pesquisas para tentar responder oque um problema �e. No nosso caso, estamos interessados em problemas computacionais,aqueles relacionados com a manipula�c~ao de informa�c~ooes.Poder��amos dizer que um problema envolve \uma pergunta de car�ater geral a serrespondida". Segundo alguns autores, um problema �e descrito quando especi�camos aentrada(quais s~ao os poss��veis dados) e as condi�c~oes(ou rela�c~oes) que a sa��da deve satisfazerpara uma determinada entrada.Uma instancia de um problema �e obtida quando �xamos determinados valores paraos dados de entradas.

Page 17: ~ Linguagem de Programacao e Estruturas De

1.4. CONSTRUC� ~AO DE PROGRAMAS 17Os dados envolvidos em um problema pertencem a um determinado conjunto de valo-res, que podem ser organizados de formas diferentes. A resolu�c~ao do problema, em geral,exige que sejam efetuadas opera�c~oes sobre os dados ou que sejam veri�cadas rela�c~oes entreesses valores.Essas considera�c~oes nos permitem dizer que temos um tipo abstrato de dadosquando:� especi�camos um conjunto de valores munidos de algumas opera�c~oes e rela�c~oes,� enfatizando o comportamento dos elementos desse tipo e,� desprezando os detalhes de representa�c~ao.9J�a sabemos que um programa de computador �e descrito por uma linguagem de pro-grama�c~ao. Cada linguagem de programa�c~ao tem seus pr�oprios tipos de dados, isto �e,conjunto de valores, opera�c~oes e rela�c~oes j�a implementadas(dispon��veis para uso). Naimplementa�c~ao surge o conceito de dom��nio, isto �e, da limita�c~ao do conjunto de valoresdos elementos representados.Os tipos de dados existentes nas linguagens de programa�c~ao podem representar �el-mente ou n~ao os dados idealizados(tipos abstratos de dados). Por isso, faremos distin�c~aoentre os tipos de dados abstratos, relacionados diretamente com o problema, e os tiposde dados no n��vel concreto, quando representamos as abstra�c~oes na linguagem de progra-ma�c~ao utilizada.Durante a execu�c~ao do programa os dados s~ao armazenados na mem�oria do computa-dor. As localiza�c~oes de mem�oria em que esses dados s~ao armazenados s~ao denominadasestruturas de dados. As estruturas de dados s~ao organizadas conforme os tipos de da-dos dispon��veis na linguagem de programa�c~ao, de forma que elas representem, o mais�elemente poss��vel, os tipos abstratos de dados em considera�c~ao.T�ecnicas de programa�c~aoQuando estamos elaborando algoritmos complexos precisamos utilizarm�etodos sistem�aticosde programa�c~ao para obter programas con��aveis, ex��veis e e�cientes.Uma proposta de metodologia estabelece os seguintes passos:1. An�alise do problema.2. Projeto do programa: algoritmo e estrutura de dados.3. Implementa�c~ao(codi�ca�c~ao) e teste do programa.9com isto queremos signi�car que n~ao importa o nome do elemento nem sua representa�c~ao na mem�oria,feita por uma linguagem de programa�c~ao.

Page 18: ~ Linguagem de Programacao e Estruturas De

18 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO4. Veri�ca�c~ao do programa.A seguir analisaremos, sucintamente, cada um desses itens propostos. �E claro que cadaum desses itens se desdobram em um ou mais cursos. Por exemplo, o primeiro item podeser aprofundado num curso de an�alise de algoritmos, o item 2 em cursos como constru�c~aode programas e estruturas de dados, e assim por diante.An�alise do problemaEsta �e a fase inicial na elabora�c~ao de programas. Nesta fase procuramos� nos certi�car que compreendemos o problema corretamente, sem ambiguidades,� nos assegurar que entendemos completamente as especi�ca�c~oes das entradas e dassa��das.Para realizar esta fase precisamos seguir os seguintes passos:1. escolher uma amostra signi�cativa dos dados e de�nir as especi�ca�c~oes de entrada;2. determinar a sa��da desejada correspondente aos dados de entrada, de�nindo as es-peci�ca�c~oes de sa��da.�E bom observar que a escolha da amostra de entrada con�rma a compreens~ao corretado enunciado do problema.Projeto do programaEsta �e a fase mais importante no desenvolvimento de programas. Aqui estudamos m�etodosde resolu�c~ao de problemas e estabelecemos estrat�egias para suas solu�c~oes.A partir da estrat�egia de resolu�c~ao do problema desenvolvemos um algoritmo e de-�nimos as estruturas de dados que ser~ao utilizadas tendo em vista otimizar o binomioespa�co-tempo, isto �e, visando obter um programa que apresente um tempo de execu�c~aom��nimo e com o melhor aproveitamento de espa�co da mem�oria.Como o algoritmo �e um elemento importante nessa fase, a seguir apresentaremosalgumas de suas caracter��sticas e estrat�egias de constru�c~ao, necess�arias neste est�agio denosso estudo.Algoritmo - intuitivamente, �e uma sequencia �nita de instru�c~oes ou opera�c~oes b�asicas10cuja execu�c~ao, em tempo �nito, resolve um problema computacional, qualquer queseja sua instancia.1110Estas opera�c~oes devem ser de�nidas sem ambiguidade e execut�aveis em tempo �nito dispondo-se,apenas, de l�apis e papel.11A ordena�c~ao da sequencia de instru�c~oes do algoritmo �e apoiada na estrat�egia estabelecida durantea an�alise do problema. O desenvolvimento do algoritmo n~ao pode perder de vista os tipos de dadosconsiderados e a sua representa�c~ao.

Page 19: ~ Linguagem de Programacao e Estruturas De

1.4. CONSTRUC� ~AO DE PROGRAMAS 19Desenvolvimento top-down - esta t�ecnica consiste em dividir o problema em v�ariossubproblemas de resolu�c~ao mais simples. Para isso �e preciso identi�car partes ouetapas na estrat�egia de resolu�c~ao do problema, elaborando inicialmente um esbo�coda resolu�c~ao. Em seguida, �e detalhada sucessivamente cada etapa, re�nando oprocesso de resolu�c~ao, at�e chegar a uma sequencia de opera�c~oes b�asicas sobre ostipos de dados considerados.Descri�c~ao - um algoritmo pode ser descrito quer atrav�es de um pseudoc�odigo(linguagemalgor��tmica) quer atrav�es de uxogramas.12 No uxograma, cada opera�c~ao b�asica(instru�c~ao)�e representada por um desenho. Na linguagem algor��tmica cada opera�c~ao b�asica �eescrita em uma linguagem semelhante a linguagem natural, com algumas regrascomuns �as linguagens de programa�c~ao.Implementa�c~aoDenominamos implementa�c~ao de um algoritmo �a sua codi�ca�c~ao em uma linguagem deprograma�c~ao.O algoritmo pode ser implementado em qualquer linguagem de programa�c~ao. Essaimplementa�c~ao pode ser muito \f�acil", consistindo, em geral, numa transcri�c~ao de ope-ra�c~oes b�asicas. A implementa�c~ao se torna mais trabalhosa dependendo das caracter��sticasda linguagem escolhida e dos tipos de dados nela de�nidos.Veri�ca�c~ao de ProgramasA veri�ca�c~ao de um programa tem como objetivo demonstrar que o algoritmo realmenteresolve o problema proposto, qualquer que seja sua instancia. Este t�opico �e considera-do bastante mais avan�cado, requerendo do aluno muita maturidade, assim como basematem�atica e l�ogica.12Os uxogramas s~ao prefer��veis nos casos onde �e preciso uma visualiza�c~ao global do processo deresolu�c~ao e de suas partes. Por outro lado, a linguagem algor��tmica apresenta outras vantagens: emgeral, �e mais f�acil escrever do que desenhar e a codi�ca�c~ao em uma linguagem de programa acaba setornando uma simples transcri�c~ao de palavras-chave.

Page 20: ~ Linguagem de Programacao e Estruturas De

20 CAP�ITULO 1. INTRODUC� ~AO:SOBRE LINGUAGEM DE PROGRAMAC� ~AO

Page 21: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 2ALGUNS ALGORITMOS SIMPLESIntrodu�c~aoJ�a sabemos que um programa deve consistir de comandos formulados em nota�c~ao queo computador \entenda". Embora n~ao saibamos ainda que esp�ecies de comandos ouf�ormulas uma linguagem de programa�c~ao deva possuir, certamente sabemos que essescomando especi�car~ao as a�c~oes pretendidas. Essa necessidade de precis~ao provalementeconstitui o tra�co mais caracter��stico que distingue a comunica�c~ao entre seres humanos dacomunica�c~ao com m�aquinas. Lidar com computadores exige precis~ao e clareza. Incertezae ambiguidade s~ao abosolutamente proibidos.Nesta parte das notas de aula, desenvolveremos algoritmos onde procuraremos seguir,na medida de nossa base matem�atica, as etapas recomendadas na constru�c~ao de programasvisto em outra parte.1 Na etapa da implementa�c~ao poder��amos usar qualquer linguagemde programa�c~ao, mais amplamenente utilizada, como C, C++ ou Java. Usaremos o C++,sem, no entanto, explicar neste texto as caracter��sticas desta linguagem. O aluno deveseguir um outro texto de linguagem C++ ou j�a conhecer esta linguagem para tirar proveitoda fase de implementa�c~ao. Caso o aluno n~ao conhe�ca C++ ou n~ao esteja interessado emconhe�ce-la pode, simplesmente, pular a fase de implementa�c~ao.2.1 Problemas usando o tipo abstrato de dados in-teiroNesta se�c~ao s�o consideraremos problemas sobre a estruturas dos n�umeros inteiros, pro-blemas com outros tipos ser~ao considerados mais adiante. A seguir apresentaremos uma1N~ao abordaremos certos aspectos do desenvolvimentos de algoritmos como, por exemplo, verica�c~aoe an�alise de e�ciencia(complexidade). Como s�o abordaremos problemas muito simples, a fase de projeto�ca muito simplicada, parecendo at�e desnecess�aria.21

Page 22: ~ Linguagem de Programacao e Estruturas De

22 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESTipo abstrato inteiroObjetos: n�umeros inteirosOpera�c~oes/Nota�c~ao: adi�c~ao +subtra�c~ao -multiplica�c~ao �quociente inteiro divresto da divis~ao modRela�c~oes/Nota�c~ao menor <maior >diferente 6=menor ou igual �maior ou igual �Objetos constantes numerais inteiros comou sem sinal por exemplo,-34, 13, 0Figura 2.1: Tipo abstrato inteirotabela do tipo abstrado n�umero inteiro, com suas opera�c~oes e rela�c~oes.Exemplo 7 Enunciado do problema: Calcular a soma de dois n�umeros in-teiros.1. An�alise(do problema): lembramos que na fase de an�alise do problemadevemos especi�car a entrada, a sa��da e, uma rela�c~ao entre a entradae a sa��da, a qual chamaremos de m�etodo. Observe que a an�alise doproblema consiste da sua especi�ca�c~ao, segundo a de�ni�c~ao que apre-sentamos na primeira parte. �E bom observar que exitem v�arios formasde especi�ca�c~ao: informal(usando linguagem natural e, quando muito,matem�atica), temos a especi�ca�c~ao formal, usando l�ogica ou �algebras es-pec���cas, ou podemos usar uma linguagem(execut�avel pelo computador)de especi�ca�c~ao. Est�a fora de prop�osito, aqui, uma especi�ca�c~ao que n~aoseja informal, caso contr�ario ter��amos de fazer um curso de espec�ca�c~ao.(i) Entrada: um par de n�umeros inteiros.(ii) Sa��da: um n�umero inteiro.(iii) M�etodo: recebe um par de inteiros e devolve um inteiro.2. Projeto: Lembramos que na fase do projeto devemos quebrar, tantoquanto poss��vel, o problema em problemas \menores" cuja solu�c~ao seja

Page 23: ~ Linguagem de Programacao e Estruturas De

2.1. PROBLEMAS USANDO O TIPO ABSTRATO DE DADOS INTEIRO 23absolutamente �obvia. Embora esse problema seja muito simples, ele podeser quebrado em tres subproblemas ainda mais simples e b�asicos.(1) Leia dois n�umeros inteiros. Leitura de dados.(2) Some dois n�umeros inteiros. Soma dos valores lidos.(3) Devolva o resultado. Por exemplo, imprima o resultado, ou apresenteo resultado no visor, etc.3. Implementa�c~ao: Codi�car na linguagem C++.�E claro que para chegarmos na fase de implementa�c~ao devemos desenvolver comple-tamente o algoritmo, de modo que esta fase seja uma simples transcri�c~ao da linguagemalgor��tica para a linguagem de programa�c~ao. Na medida em que formos desenvolvendo afase de projeto iremos apresentando a nossa linguagem algor��tmica. Somente quando oalgoritmo estiver completamente projetado voltaremos a fase 3, de implementa�c~ao.Continuando o projeto, para ler dois n�umeros, de (1), precisamos de duas vari�aveisA e B, onde colocar os dois valores lidos. A a�c~ao de colocar(atrav�es da leitura) os doisinteiros nas vari�aveis A e B ser�a denotado porleia(A,B)Usaremos a vari�avel \soma" para colocar o resultado da adi�c~ao. Como estamos usandoo s��mbolo para denotar atribui�c~ao, o item (2), do projeto tem a seguinte descri�c~ao:soma A+BFinalmente, para representar a sa��da de informa�c~oes, correspondente ao item (3) doprojeto, utilizaremos a instru�c~ao de sa��da:imprima(soma)Essas tres instru�c~oes, escritas sequencialmente,2 nessa ordem, descrevem o projeto doalgoritmo de resolu�c~ao do problema proposto. Podemos escreve-las na mesma linha, comoa seguir, ou em linhas diferentes, com a separa�c~ao entre uma instru�c~ao e a seguinte sendofeita por um ponto e v��rgula:2Do ponto de vista l�ogico, um algoritmo �e constitu��do por tres estruturas l�ogicas: sequenciamen-to(sequencial), repetic~ao(repetitiva) e sele�c~ao(seletiva). Portanto, um algoritmo pode ser constitu��do porqualquer combina�c~ao dessas tres estruturas. O algoritmo que estamos considerando tem uma estruturasequencial, as a�c~oes que resolvem o problema, s~ao efetuadas em ordem sequencial, e na ordem em queaparecem no algoritmo. Mais adiante veremos algoritmos com estruturas l�ogicas al�em da sequencial.N~ao confundir sequencial, enquanto estrutura l�ogica do algoritmo, com o conceito, visto noutra parte, dealgoritmo sequencial, em contrapartida a algoritmo paralelo.

Page 24: ~ Linguagem de Programacao e Estruturas De

24 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESleia(A,B); soma(A,B); imprima(A,B);ouleia(A,B);soma(A,B);imprima(soma)A rigor, ao descrever um algoritmo, devemos especicar o seu objetivo, quais s~ao osdados de entradae/ou sa��da, al�em das instru�c~oes que o comp~oem. Devemos, tamb�em,dar um nome que identi�que o algoritmo. Finalmente, o nosso algoritmo deve tomar aseguinte forma:Algoritmo adi�c~aoObjetivo: dados dois n�umeros inteiros, calcular sua soma.Entrada: A, B(inteiros).Sa��da: soma(Inteiro)Adi�c~ao();leia(A,B);soma A+B;imprima(soma);Ap�os o nome adi�c~ao, que identi�ca o algoritmo, colocamos uma par de parenteses.Mais adiante, colocaremos parametros entre esses parenteses.Finalmente, apresentamos a implementa�c~ao.Implementa�c~ao#include <iostream.h>void main(){int A, B, soma;cin >> A >> B ;cout << soma = A + B << endl;}

Page 25: ~ Linguagem de Programacao e Estruturas De

2.1. PROBLEMAS USANDO O TIPO ABSTRATO DE DADOS INTEIRO 25Exemplo 8 Enunciado: Dado um n�umero inteiro obter seu �ultimo algarismoda direita.1. An�alise:� Entrada : Um n�umero entre 0 e 9999.� M�etodo: Escrevendo o n�umero no sistema decimal, o �ultimo algaris-mo da direita representa as unidades. Para obter esta unidade bastadividir o n�umero por 10. Logo, o m�etodo �e: calcule o resto da divis~aodo n�umero por 10.� Sa��da: O resto da divis~ao de um n�umero por 10.2. projeto: O problema �e divido nos seguintes subproblemas.leia um n�umero inteiro A, entre 0 e 9999.calcule A mod 10.imprima o resultado.Portanto, temos o seguinte algorimo.Algoritmo �ultimoObjetivo: Obter o �ultimo algarismo de um n�umeero dado.Entrada: A(inteiros).Sa��da: �ultimo(Inteiro)�ultimo();leia(A);unidade A+B;imprima(unidade);Implementa�c~ao.#include <iostream.h>void main(){ int A, unidade;cin >> A;

Page 26: ~ Linguagem de Programacao e Estruturas De

26 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESunidade = A % 10;cout << unidade << endl;} Em cada um dos exec��cicios, abaixo, fazer an�alise do problema, o projeto do algoritmoe a implementa�c~ao em C++.2.2 Exerc��cios1. Dado um n�umero inteiro de tres algarismos, inverter a ordem de seus algarismos.Os tres algarismos do n�umero dado s~ao diferentes.2. Dado um n�umero de tres algarismo construir outro n�umero de quatro algarismo deacordo com a seguinte regra:(a) os tres primeiros algarismos, contados da esquerda para a direita, s~ao iguais aodo n�umero dado;(b) o quarto algarismo �e um d��gito de controle calculado da seguinte forma: pri-meiro algarismo + segundo algarismo �3 + terceiro algarismo �5; o d��gito decontrole �e igual ao resto da divis~ao dessa soma por 7.3. Dado um n�umero inteiro de segundos, determinar o seu valor equivalente em graus,mimutos e segundos. Se a quantidade de segundos for insu�ciente para dar o valorem graus, o valor em graus deve ser zero. A mesma observa�c~ao continua v�alida emrela�c~ao a minutos e segundos. Por exemplo, 3.600 segundos = 1 grau, 0 minutos, 0segundos; 3500 segundos = 0 graus, 58 minutos, 20 segundos.4. Dadas duas fra�c~oes ordin�arias a=b e c=d, determinar a sua soma e o seu produto.5. Dado um n�umero inteiro que representa um n�umero bin�ario de cinco d��gitos, deter-minar o seu equivalente decimal6. Dado o primeiro termo e a raz~ao de uma prograss~ao aritm�etica, determinar a somade seus primeiros cinco termos.2.3 Algoritmos estruturadosExpress~oes e comandosUma express~ao �e uma combina�c~ao de vari�aveis, constantes e operadores que, uma vezavaliada, resulta um valor. Por exemplo,

Page 27: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 27(b� h)2 :Portanto, uma express~ao consiste de operandos e operadores. Os operandos s~ao ouconstante(por exemplo, n�umeros), ou vari�aveis, ou valores gerados por fun�c~oes. Usual-mente, os operadores se classi�cam como un�arios, como -, e bin�arios, como + e �. Alinguagem C++ possui um operador tern�ario, ?:. Sua sintaxe3, em geral, possui a seguinteconstru�c~ao: expr1 ? : expr2 : expr3. A semantica4 desse operador �e a seguinte: A expr1 �eavaliada primeiro. Se seu valor for diferente de zero(verdadeiro), a expr2 �e avaliada e seuresultado ser�a o valor da express~ao condicional toda. Se expr1 for zero(falsa), a expr3ser�a avaliada e seu valor ser�a o valor da express~ao condicional como um todo.Se v�arios operadores ocorrem em uma express~ao, �e preciso ser especi�cada uma or-dem de execu�c~ao, ou pelo emprego expl��cito de parenteses, ou por regras impl��citas nalinguagem. Na maioria das linguagens, os operadores bin�arios se subdividem em aditivose multiplicativos. Aos �ultimos �e atribu��da prioridade mais alta. Suporemos, tamb�em, queos operadores de igual prioridade ser~ao sempre executados da esquerda para a direita.Estas regras simples s~ao ilustradas nos exemplos a seguir:x+ y + z = (x+ y) + zx� y + z = (x� y) + zx+ y � z = x+ (y � z)x� y � z � w = (x� (y � z))� wx� y � z � w = (x� y)� (z � w)�x+ y=z = (�x) + (y=z)x� y=z = (x� y)=zx=y � z = (x=y)� zQuanto ao tipo de dados dos operandos, as express~oes podem ser:� aritm�eticas: quando os operandos s~ao aritm�eticos(inteiros ou reais).� l�ogicos: quando os operandos s~ao valores verdades, falso ou verdadeiro.� literais: quando os operandos s~ao letras ou palavras. Por exemplo, a express~aoconstitu��da do operador de concatena�c~ao(+) e as palavras \sonha" e \dor" . \sonha"+ \dor" resulta \sonhador".53Chamamos sintaxe a forma como comandos e express~oes na linguagem devem ser escritos a �m deque possam ser entendidos pelos tradutores de programas(interpretadores e copiladores.)4A semantica de um programa �e o seu signi�cado, isto �e, o conjunto de a�c~oes efetuadas pelo compu-tador duranto a execu�c~ao do referido programa.5Mais detalhes, sobre operadores, express~oes l�ogicas e literais, ver o livro de Viviane, cap��tulo 2, sobreoperadores.

Page 28: ~ Linguagem de Programacao e Estruturas De

28 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESA forma mais elementar de comando �e o comando de atribui�c~ao. Ele �e representadopor V Eonde V denota uma vari�avel e E, uma express~ao. Este comando indica que E deveser calculado e, ent~ao, seu valor atribu��do a V . Sempre que a express~ao E assumir umvalor o camando tem um efeito.J�a observamos que o comando fundamental de qualquer programa �e o comando deatribui�c~ao. Ou seja, o efeito do comando de atribui�c~ao �e uma a�c~ao simples, precisamenteo de tornar o valor da vari�avel V igual ao valor da express~ao E. Outras dois comandosb�asicos s~ao: o comando de leitura de dados, por exemplo, leia(A), no exemplo 24, e ocomando de sa��da de dados, por exemplo, imprima(soma), no exemplo 24.As a�c~oes compostas, que s~ao efeitos de comandos compostos, podem ser classi�cadasem tres tipos b�asicas: sequenciais, repetivas e alternativas. Os comandos correspon-tes(sequenciais, repetitivos e condicionais) s~ao conhecidos como comandos estruturados.6Existes seis formas b�asicas desses comandos estruturados: uma forma sequencial, duasrepetitivas ou formas de la�co(para e enquanto) e tres na forma alternativa( se ...ent~ao...; se ...ent~ao ..., sen~ao ... e caso i de L1:S1; ...;ln:Sn ). A seguir estudaremos cada umdesses como comando, procurando ilustr�a-los com exemplos.Estrutura sequencialNa estrutura sequencial cada comando �e executado somente ap�os o t�ermino do comandoanterior. Ele tem a forma In��ciocomando1;comando2;:::comandoN ;fimO separador \;" �e um operador de continua�c~ao. Ele ocasiona a execu�c~ao do comandosubsequente, por�em, somente ap�os terminada a execu�c~ao do comando precedente. As6Esses comandos s~ao tamb�em conhecidos como controle de uxo de execu�c~ao.

Page 29: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 29palavras in��cio e fim est~ao representando, aqui, o come�co de um bloco de comandos,que �e uma nova unidade ou comando composto.7 Comandos compostos podem, �as ve-zes, se constituir de um grande n�umero de comando b�asicos ou elementares, assumindotamanho consider�avel. �E, por isso, aconselh�avel que se destaque, visivelmente, os coman-dos parenteses(in��cio e fim), para, assim, se visualizar os agrupamentos de comandosconstituintes do comando composto.Os exemplos 24 e 25, vistos anteriormente, s~ao exemplos de estruturas sequeciais.Ali�as, qualquer programa que estudaremos, como j�a observamos na primeira parte destasnotas, �e uma estrutura sequencial. O que distingue os dois exemplos citados �e que eles elessomente s~ao constitu��dos por um uxo de controle sequencial, isto �e, n~ao existe nenhumcomando na sequencia, que por sua vez, tenha uma estrutura repetitiva ou alternativa,como teremos oportunida de observar em outros programas, mais adiante.Estruturas de repeti�c~ao(la�cos ou loops)A estrutura de la�co repete um trecho de programa um certo n�umeros de vezes. Essaestrutura se subdivide em dois tipos:1. Estrutura de la�co com vari�avel de controle e,2. Estruturas de la�cos condicionais.Procuraremos entender essas duas estruturas atrav�es de exemplos.Repetic~ao com vari�avel de controleSintaxe:para < var > de <in��cio> at�e < final > repita< comando� composto >;fim-paraSemantica: deveremos ter o seguinte entendimento desse trecho de programa.� De um valor inicial a vari�avel < var >, no in��cio;� de um valor �nal a vari�avel < var >;� enquanto a vari�avel < var > percorrer do valor inicial at�e o valor �nal(inclusive ovalores inicial e �nal) execute o bloco < comando � composto >.87Existe outras formas de indicar o in��cio e o �m de um bloco ou corpo de comandos, como veremosmais adiante. Esses duas palavras tamb�em s~ao conhecidas como comandos-parenteses.8�E claro que o comando < comando� composto > pode ser constitu��do de um �unico comando b�asico.

Page 30: ~ Linguagem de Programacao e Estruturas De

30 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESExemplo 9 Enunciado: Obter a soma dos n primeiros n�umeros pares posi-tivos.An�alise: Os exemplos abaixo nos ajuda a entender o enunciado do problema:n = 6 ! 2 + 4 + 6 + 8 + 10 = 42n = 3 ! 2 + 4 + 6 = 12n = 2 ! 2 + 4 = 6Obs: Todo n�umero par inteiro positivo pode ser escrito na forma 2i, ondei 2 N� = f1; 2; 3; :::g e a soma dos n primeiros n�umeros pares pode ser obitidopela f�ormula: S = nXi=1 2iPara calcular essa soma basta guardar cada resultado parcial obtido e somareste �ultimo resultado acumulado ao n�umero par seguinte, repetindo esta ope-ra�c~ao at�e o �ultimo n�umero. Portanto, podemos dizer que� Entrada: um n�umero natural positivo, n;� Sa��da: um n�umero natural positivo, o resulto da soma;� M�etodo: A cada n�umero natural positivo devolve um n�umero natural po-sitivo.Projeto:As estruturas presentes neste algoritmo s~ao, ent~ao, a sequencial e a repetitiva.Um esbo�co do algoritmo seriaEsbo�co do algoritmoentrada de dados(valor de n)repetir n vezes calcular um n�umero paracumular numa somasa��da do resultado

Page 31: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 31Podemos detalhar a estrat�egia:� para cada valor de i 2 f1; 2; 3:::; ng, calculamos o n�umero par. t, corres-pondente e,� adicionamos o valor da soma S, previamente de�nida com valor zero.Ou seja, devemos repetir n vezes as duas opera�c~oes:� calcular o n�umero par t, pela f�ormula t = 2i e,� somar t em S.Vamos representar essa opera�c~ao de repeti�c~ao porpara i de 1 at�e n repita < bloco >onde bloco �e uma sequencia de uma ou mais instru�c~oes: �e o la�co desse coman-do de repeti�c~ao. Dizemos que essa instru�c~ao(opera�c~ao b�asica) �e uma instru�c~aode repeti�c~ao controlada por vari�avel.Finalmente, o algoritmo tem a seguinte reda�c~ao:Algoritmo somaDePares()Objetivo: Dado um n�umero n, calcular a soma dos n primeiros n�umerospares.Entrada: n(inteiro).Sa��da: S(inteiro). somaDePares()leia(n);S 0;para i de 1 n at�e repita t 2 � i;S S + t;imprima(S);A instru�c~ao de repeti�c~ao, presente neste algoritmo, �e controlodada pela vari�aveli que �e denominada vari�avel de controle da instru�c~ao. A vari�avel i recebe ovalor inicial 1 e �e incrementada de uma unidade at�e atingir o valor �nal n.Enquanto o valor de i for maior ou igual que o valor de n, as instru�c~oescontidas no bloco s~ao executadas sucessivamente. Para cada valor atribu��do

Page 32: ~ Linguagem de Programacao e Estruturas De

32 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESa i, se esse valor n~ao superar n, as instru�c~oes do bloco s~ao executadas e,em seguida, o valor de i �e incrementado de uma unidade. As instru�c~oes queconstituem o bloco fazem o \loop"(la�co, malha, anel) da instru�c~ao.O n�umero de repeti�c~oes no la�co est�a previamente determinado pelo valor ini-cial e pelo valor �nal da vari�avel de controle. Nesse exemplo, o la�co �e execu-tado valor final � valor inicial = n� 1 + 1 = n vezesImplementa�c~ao.#include <iostream.h>void main(){int i, n, t, S; // declara as vari�aveis.cout << ``Entre com um valor n" << endl;cin >> n;for(i=1; i<=n; i++){ t = 2*i;S= S + t;}cout << S << endl;}Exerc��cios1. Calcular o fatorial de n (n!).2. Mesmo problema naterior, por�em, agora n! = n� (n� 1)� :::� 2 � 1:3. (i) Ache a soma de 10 n�umeros fornecidos pelo usu�ario.(ii) Imprima os n�umeros pares entre 20 e 50.

Page 33: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 33Exemplo 10 Enunciado: Imprimir os n primeiros n�umeros ��mpares positi-vos.An�aliseEste problema �e an�alogo ao anterior.� Entrada: um n�umero natural positivo, n;� Sa��da: um n�umero natural positivo ��mpar;� M�etodo: A cada n�umero natural positivo de entrada devolve um n�umero��mpar impresso(no visor).ProjetoCada n�umero ��mpar pode ser escrito pela f�ormula 2i�1, com i=1,2,3,... Paraque cada n�umero ��mpar calculado seja impresso, o la�co deve conter a instru�c~aode sa��da. A seguir apresentamos um esbo�co do algoritmo.Esbo�co do algoritmoentrada de dados(valor de n)repetir n vezes calcular um n�umero ��mpar timprimir tFinalmente, o algoritmo tem a seguinte reda�c~ao:Algoritmo imprime�ImparesObjetivo: Dado um n�umero n, imprimir os n primeiros n�umeros ��mpares.Entrada: n(inteiro).Sa��da: t(inteiro).imprime�Impares()leia(n);para i de 1 at�e n repita t 2� i� 1;imprima(t);Implementa�c~ao.

Page 34: ~ Linguagem de Programacao e Estruturas De

34 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLES#include <iostream.h>void main(){int i, n, t; // declara as vari�aveis.cout << ``Entre com um valor n" << endl;cin >> n;for(i=1; i<=n; i++){ t = 2*i-1;cout << t << endl;}}Exemplo 11 Enunciado: Imprimir os n primeiros n�umeros ��mpares em or-dem oposta.An�aliseAn�alogo o problema anterior, pois isso deixamos de apresentar.ProjetoGeramos os n�umeros ��mpares desde o n-�esimo at�e o primeiro. �A m�edida queeles s~ao gerados, eles s~ao impressos. Utilizaremos a instru�c~ao para-repitacom acr�essimo unit�ario negativo para descrever um la�co em que a vari�avel decontrole assume valores na ordem decrescente.n; n� 1; :::; 3; 2; 1Vamos indicar essa ordem escrevendo passo -1, antes da palavra repita:para i de n at�e 1 passo 1 repita < bloco >A vers~ao �nal do algoritmo pode escrito como segue.Algoritmo imprime�ImparesInvertidos

Page 35: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 35Objetivo: Dado um n�umero n, imprimir os n primeiros n�umeros ��mpares naordem oposta.Entrada: n(inteiro).Sa��da: t(inteiro).imprime�ImparesInvertidos()leia(n);para i de n at�e 1 repita t 2� i� 1;imprima(t);Implementa�c~ao.#include <iostream.h>void main(){int i, n, t; // declara as vari�aveis.cout << ``Entre com um valor n" << endl;cin >> n;for(i=n; i>=1; i--){ t = 2*i-1;cout << t << endl;}}Exemplo 12 Enunciado: Imprimir os n primeiros termos da sequenciayk+1 = yk + 2; :::; com y1 = 1An�alise� Entrada: um n�umero natural positivo, n;� Sa��da: uma sequencia de n�umeros naturais;

Page 36: ~ Linguagem de Programacao e Estruturas De

36 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLES� M�etodo: A cada n�umero natural positivo n, de entrada, devolve umasequencia de n�umeros naturais.Vejamos para n = 5. O primeiro termo �e de�nido pela condi�c~ao inicial e osdemais s~ao calculados pela rela�c~ao de recorrencia dada:y1 = 1y2 = y1 + 2 = 3y3 = y2 + 2 = 5y4 = y3 + 5 = 7y5 = y4 + 7 = 9Projeto:Cada termo da sequencia �e igual a soma do termo anterior com a constante 2.O primeiro termo �e dado e todos os demais s~ao calculados a partir dessa regra.No exemplo acima, desej�avamos obter os cinco primeiros termos da sequencia.Por isso, calculamos quatro valores y2; y3; y4 e y5 porque o primeiro termo, y1,da sequencia �e dado e n~ao calculado.Todos os 5 termos devem ser impressos. Portanto, assim que um elementofor obtido ele deve ser impresso.De uma forma geral, para imprimir os n primeiros termos, devemos imprimiro primeiro, que �e dado, e depois calcular e imprimir os n�1 termos seguintes,conforme ilustramos no seguinte esbo�co do algoritmo:Esbo�co do algoritmoleia nde�na o primeiro elementoimprima o primeiro elementopara i de 1 at�e n-1 repita calcule o elemento seguinteimprima esse elementoObserve que n~ao �e necess�ario guardar todos os elementos da sequencia. Po-demos calcular cada um deles pela rela�c~ao de recorrencia dada e imprimir ovalor calculado. A mesma vari�avel y que armazena o primeiro termo podeser utilizada para todos os demais, tendo o seu valor sucessivamente alteradoatrav�es da instru�c~ao y y + 2.

Page 37: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 37A vers~ao �nal do algoritmo �e portanto:Algoritmo n�umeros�ImparesObjetivo: Imprimir os n primeiros termos da sequenciayk+1 = yk + 2; k = 1; 2; 3; :::; com y1 = 1Entrada: n(inteiro).Sa��da: y(inteiro). n�umeros�Impares()leia(n);y 1; imprima(y);para i de 1 at�e n� 1 repita y y + 2;imprima(y);Observe que a sequencia de�nida pela rela�c~ao de recorrencia dada, de�ne emyk o k-�esimo n�umero ��mpar. Desse modo, atrav�es dessa rela�c~ao de recorrenciapodemos gerar os n primeiros n�umeros ��mpares.Implementa�c~ao.#include <iostream.h>void main(){int i, y, n; // declara as vari�aveis.cout << ``Entre com um valor n" << endl;cin >> n;y = 1;cout << y << endl;for(i=1; i<=n-1; i++){

Page 38: ~ Linguagem de Programacao e Estruturas De

38 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESTipo abstrato realObjetos: n�umeros racionaisOpera�c~oes/Nota�c~ao: adi�c~ao +subtra�c~ao -multiplica�c~ao �divis~ao /Rela�c~oes/Nota�c~ao menor <maior >diferente 6=menor ou igual �maior ou igual �Objetos constantes numerais racionais ponto �xo(13.5, 45.0)ou em ponto utuante com ou sem sinal6.023E54, -1.23E-2Figura 2.2: Tipo abstrato realy=y+2;cout << y << endl;}}De�ni�c~ao 1 Dizemos que dois algoritmos s~ao equivalentes quando para uma mesma en-trada produzem a mesma sa��da.Observe que os algoritmos 18 e 21 s~ao equivalentes, segundo essa de�ni�c~ao.Tipo abstrato de dados realA implementa�c~ao do tipo inteiro, assim como do tipo real, em uma linguagem deprograma�c~ao exige a de�ni�c~ao de um dom��nio, isto �e, um conjunto �nito de inteiros ouracionais, no caso de racionais escritos com uma quantidade �nita de algarismos sig-ni�cativos. Consequentemente, durante a computa�c~ao pode haver estouro(over ow) e,portanto, aproxima�c~ao dos valores exatos dos resultados.Exemplo 13 Enunciado: A sequencia99Um processo iterativo �e de�nido por uma rela�c~ao de recorrencia que relaciona dois ou mais valoresconsecutivos. Os valores calculados pela f�ormula de recorrencia chamam-se valores iterados. O processoiterativo, de�nido pela f�ormula de recorrencia do exemplo 22, �e uma aplica�c~ao do m�etodo de Newton-Raphson para o c�alculo de valores aproximados das ra��zes de f(x) = px.

Page 39: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 39xn+1 = 12(x+ Axn ); x0 = 1; n 2 Nconverge para a ra��z quadrada de A, sendo A > 0. Calcule um valor aproxi-mado da ra��z quadrada de A, atrav�es de 5 itera�c~oes.An�alise� Entrada: um n�umero real positivo, A;� Sa��da: um n�umero real positivo que represente um n�umero real aproxi-mado da ra��z quadrada de A;� M�etodo: A cada entra da um n�umero real positivo A, devolve um n�umeroreal.Vamos ilustrar o processo para A = 2, considerando-se os racionais escritoscom at�e 10 algarismos signi�cativos:x0 = 1x1 = (x0 + 2x0 )=2 = 1; 5x2 = (x1 + 2x1 )=2 = 1; 416 666 667x3 = (x2 + 2x2 )=2 = 1; 414 215 686x4 = (x3 + 2x3 )=2 = 1; 414 213 562x5 = (x4 + 2x4 )=2 = 1; 414 213 562O valor da ra��z quadrada de 2, obtido atrav�es da quinta itera�c~ao do processoiterativo de�nido pela rela�c~ao de recorrencia anterior, �e 1; 414 213 562:Esbo�co do algoritmoentrada de dados(valor de A)de�ni�c~ao do valor inicial de xpara i de 1 at�e 5 repita calcular xsa��da do resultadoObserve que somente o �ultimo valor calculado deve ser impresso, por isso ainstru�c~ao de sa��da deve ser colocada fora do la�co. A vari�avel identi�cada porx dever�a assumir, sucessivamente, o valor dos cinco primeiros elementos dasequencia gerada pela rela�c~ao de recorrencia dada.Portanto, o algoritmo tem o seguinte aspecto.

Page 40: ~ Linguagem de Programacao e Estruturas De

40 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESAlgoritmo ra��zQuadradaObjetivo: Calcular um valor aproximado da ra��z quadrada de umn�umero real dado.Entrada: A(real).Sa��da: x(real). ra��zQuadrada()leia(A);x 1;para i de 1 at�e 5 repita x (x+ Ax )=2imprima(x)Implementa�c~ao.#include <iostream.h>void main(){int x, A; // declara as vari�aveis.cout << ``Entre com um valor para A " << endl;cin >> A;x = 1;for(i=1; i<=5; i++){ y= (x+A/x)/2;}cout << x << endl;}Exemplo 14 Enunciado: Usando a rela�c~ao a rela�c~ao de recorrencia de�nidano exemplo 22, anterior, obter uma tabela de ra��zes quadradas dos n�umerosinteiros de dois 2 a 10. O valor aproximado de cada ra��z deve ser obtidoatrav�es de 5 itera�c~oes.An�alise

Page 41: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 41� Entrada: valores inteiros de A de 2 a 10;� Sa��da: uma tabela de n�umeros reais positivos que representam n�umerosreais aproximados da ra��zes quadradas de A, de 1 a 10;� M�etodo: A entrada dos n�umeros inteiros positivos A de 1 a 10, devolveuma tabela de n�umeros realis.Projeto:Esbo�co do algoritmopara i de 2 at�e 10 repita calcule a aproxima�c~ao x da ra��z quadrada de Asa��da do resultadoAlgoritmo tabelaDeRa��zQuadradaObjetivo: Obter uma tabela de ra��z quadrada dos n�umeros inteirosde 2 a 10.Entrada: Os dados de entrada s~ao gerado pelo pr�oprio algoritmo,sendo armazenado em A.Sa��da: (inteiro), x(real).tabelaDeRa��zQuadrada()para i de 2 at�e 10 repita x 1;para i de 1 at�e 5 repita x (x+ A2 )=2;imprima(A;x);

Page 42: ~ Linguagem de Programacao e Estruturas De

42 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLESExerc��ciosEm cada um dos exerc��cios proposto deve ser feita a an�alise do problema, o projeto doalgoritmo e a implementa�c~ao.1. Considere a progress~ao geom�etica(PG) 1, 2, 4, 8, 16, 32,..., e um inteiro positivo n.Pedimos que:a) Imprima os n primeiros termos.b) Calcule e imprima a soma dos n primeiros termos da PG sem utilizar a f�ormulada soma.2. Imprimir os n primeiros termos das sequencias de�nidas pelas rela�c~oes de recorrencia:(a) yk+1 = yk + k; k = 1; 2; 3; :::; y1 = 1(b) yk+1 = yk + (2k + 1); k = 0; 1; 2; :::; y0 = 1(c) yk+1 = yk + 3k2 + 3k + 1; k = 0; 1; 2; 3; :::; y0 = 1(d) yk+1 = 2yk; k = 1; 2; 3; :::; y1 = 13. Calcular as somas:a) S =P20k=1 b) T = P50k=5 k22k c) U = P100k=0 k4. Partindo-se de um �unico casal de coelhos �lhotes rec�em-nascidos e supondo que umcasal de coelhos se torna f�ertil ap�os dois meses de vida e, a partir de ent~ao, produzum novo casal a cada mes e que os coelhos nunca morrem, a quantidade de casal decoelhos ap�os n meses �e dado pelo n-�esimo termo da seguinte sequencia:Fn = Fn�2 + Fn�1; n � 2F0 = 1;F1 = 1Essa sequencia chama-se sequencia de Fibonacci.a) Mostre como os termos dessa s�erie correspondem �a solu�c~ao do problema propos-to.b) Redija um algoritmo para calcular a quantidade de casais de coelhos ap�os nmeses.5. Tabelar n! para n variando de 0 at�e 10. Por de�ni�c~ao k! = k(k � 1)(k � 2):::3:2:1para k 2 N� e 0! = 1.

Page 43: ~ Linguagem de Programacao e Estruturas De

2.3. ALGORITMOS ESTRUTURADOS 436. Dado um inteiro n tabelar n(k) para k variando de 1 at�e n. Por de�ni�c~ao, x(k) =x(x� 1)(x� 2):::(x� k + 1); x 2 R; k 2 N� e x0 = 1:Se x = n = k; n(n) = n(n � 1)(n � 2):::(n� n+ 1) = n!7. Em um campeonato de futebol cada time tem uma lista o�cial de 23 jogadores.Cada time prepara uma rela�c~ao contendo o peso e a idade de cada um de seusjogadores. Os 40 times que participam do torneio enviam listas para o CPD daconfeder�c~ao. Pede-se a seguinte informa�c~ao:a) o peso m�edio e a idade para cada um dos times.b) o peso e a idade m�edia de todos os participantes.8. Desenvolver um algoritmo para calcular a soma:1 � 1=2 + 1=4 � 1=6 + 1=8 � :::+ 1=200

Page 44: ~ Linguagem de Programacao e Estruturas De

44 CAP�ITULO 2. ALGUNS ALGORITMOS SIMPLES

Page 45: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 3COMANDOS ESTRUTURADOSLa�cos condicionais-A constru�c~ao enquantoSintaxe:enquanto < condi�c~ao > repita< comando� composto >fim-enquantoSemantica:Temos o seguinte entendimento dessa unidade de programa:� primeiro �e testada a < condi�c~ao >, que �e um valor verdadeiro ou falso;� se < condi�c~ao > for verdadeira, executar o corpo < comando� composto >;� volta a testar < condi�c~ao >, se ela for verdadeira, executar o corpo < comando �composto >;� volta a testar .....� at�e que < condi�c~ao > seja falsa, quando, ent~ao ser�a executada a pr�oxima instru�c~aoap�os fim-enquanto, isto �e, o controle sai do la�co \enquanto";A seguir apresentaremos alguns exemplos da constru�c~ao \enquanto".Exemplo 15 Enunciado: Dado um conjunto de n�umeros inteiros positivos,determinar os seus quadrados. 45

Page 46: ~ Linguagem de Programacao e Estruturas De

46 CAP�ITULO 3. COMANDOS ESTRUTURADOSAn�aliseA entrada consiste de uma lista de n�umeros para os quais desejamos calcularos seus quadrados. Assim, por exemplo, se os dados de entrada forem 3, 8, 4 e10 a sa��da deve ser 9, 64, 16 e 100. Se a entrada for a rela�c~ao de n�umeros 12,13, 17 pretendemos que a sa��da seja 144, 169, 289. Se a entrada for somenteo n�umero 11, desejamos obter a sa��da 121. Logo, para cada n�umero A dado,basta calcular o seu quadrado por meio de t = A�A e imprimir o resultado.Portanto,� Entrada: Um lista de n�umeros inteiros positivos.� Sa��da: uma listas de inteiros positivos.� M�etodo: Recebe como entrada uma lista de inteiros positivos e devolveuma lista de n�umeros inteiro positivos.Projeto:O problema �e dividido nos seguintes subproblemas.repetir para cada elemento da lista- leia um n�umero inteiro positivo A;- calcule A�A;- imprima o resultado.As estruturas presentes neste algoritmo s~ao, ent~ao, a sequencial e a repetitiva.Um esbo�co do algoritmo seriaEsbo�co do algoritmorepetir para cada elemento da lista Ler um n�umero ACalcular A�Aimprimir o resultadoO problema no projeto desse algoritmo �e saber quantas vezes executar a repe-ti�c~ao. Isto se d�a porque:

Page 47: ~ Linguagem de Programacao e Estruturas De

47� A lista de dados de entrada �e constitu��da por um n�umero desconhecido deelementos, isto �e, n~ao faz parte da entrada a informa�c~ao sobre quantosn�umeros existem na lista.� O que queremos �e repetir o bloco(leitura, c�alculo, sa��da), enquanto existirum n�umero na lista de entrada dos dados.1Para resolver esse problema introduzimos o conceito deSentinelaA estrat�egia para veri�car o �m dos dados �e utilizar um \sinal" de �m dedados, o qual denominaremos sentinela. Portanto, acrescentaremos no �nalda lista de n�umeros dados um valor que, reconhecidamente, n~ao perten�ca alista de valores poss��veis dos dados de entrada.No nosso exemplo, os dados s~ao n�umeros inteiros positivos, isto �e, a lista devalores permitidos para a entrada �e1; 2; 3; 4; :::Logo, podemos usar como sentinela qualquer n�umero que n~ao seja positivo.Por exemplo, o n�umero zero ou o n�umero -1.Desse modo, a entrada do algoritmo passa a ser a lista de n�umeros acrescidado valor sentinela.Com essa estrat�egia, podemos apresentar o seguinte esbo�co do algoritmo.Esbo�co do algoritmoLer o primeiro n�umeros da listaenquanto o n�umero for positivo repetir Calcular o quadradoimprimirler o pr�oximo n�umeroObserve que o n�umero de vezes em que la�co ser�a repetido depende do testede uma condi�c~ao. Por isso dizemos que a repeti�c~ao �e controlada por umacondi�c~ao.1Observe que a existencia �e mais f�acil de ser veri�cada que o contr�ario. Como seria poss��vel veri�carque n~ao existe nenhum n�umero inteiro positivo na entrada de dados?

Page 48: ~ Linguagem de Programacao e Estruturas De

48 CAP�ITULO 3. COMANDOS ESTRUTURADOSNa nossa linguagem algor��tmica representaremos essa estrutura de repeti�c~aoatrav�es de uma das duas instru�c~oes: enquanto-fa�ca ou repita-at�e-que.As duas instru�c~oes s~ao equivalentes no sentido de que representam a repeti�c~aocontrolada por condi�c~ao. Uma condi�c~ao �e o que chamamos umaExpress~ao booleanaEm nosso problema a condi�c~ao �e expressa por A > 0.Uma condi�c~ao �e expressa utilizando-se os operadores de rela�c~ao:<; >; =; �; � e 6=A express~ao que obteremos relacionando entre si vari�aveis e/ou constantespor meio de operadores de rela�c~ao denominamos express~ao booleana. Umaexpress~ao booleano assume somente um de dois valores mutuamente exclusivos:verdadeiro(true) ou falso(false).A instru�c~ao enquanto-fa�ca tem o seguinte formatoenquanto < condi�c~ao > fa�ca < bloco >Nesta instru�c~ao, < bloco > somente ser�a executado se < condi�c~ao > forverdadeira. < bloco > representar�a uma ou mais instru�c~oes e constitui o la�co.Antes de ser executado pela primeira vez �e necess�ario que a condi�c~ao estejade�nida. Se a primeira vez em que a < condi�c~ao > for testada ela for falsa,o la�co n~ao ser�a executado nenhuma vez. Dentro do la�co deve existir umainstru�c~ao que altere o valor da < condi�c~ao >, caso contr�ario o la�co pode setornar de execu�c~ao in�nita(n~ao parar).Em nosso problema a < condi�c~ao > para que as opera�c~oes de c�alculo e im-press~ao sejam executadas �e que o n�umero dado seja positivo. Cada n�umero daentrada, inclusive a sentinela, ser�a lida em uma mesma vari�avel. Chamemosde A essa vari�avel. Podemos, �nalmente, apresentar o projeto do algoritmocomo a seguir:Algoritmo quadradosObjetivo: Calcular os quadrados de uma lista de inteiros positivos,terminada com 0.

Page 49: ~ Linguagem de Programacao e Estruturas De

49Entrada: A(inteiro).Sa��da: A; t(inteiro).quadrados()leia(A);enquanto A > 0 fa�ca t A�A; imprima(A; t);leia(A);Observe que o algoritmo quadrados \funcionar�a" mesmo que seja colocadooutro valor como sentinela, desde que n~ao seja um n�umero positivo.Implementa�c~ao.#include <iostream.h>void main(){int A, t; // declara as vari�aveis.cout << ``Entre com um lista de n�umeros inteiros positivos,<< quando quiser terminar entre 0" << endl;cin >> A;while( A > 0 ){ t = A*A;cout << A << t;cin >> A;}}Apresentaremos, tamb�em, o projeto desse algoritmo, assim como sua imple-menta�c~ao, para o caso da instru�c~ao ser repita-at�e-que.Essa outra instru�c~ao de repeti�c~ao em que a repeti�c~ao �e controlado por instru�c~ao�e

Page 50: ~ Linguagem de Programacao e Estruturas De

50 CAP�ITULO 3. COMANDOS ESTRUTURADOSrepita < bloco > at�e que < condi�c~ao >Nesta instru�c~ao < bloco > ser�a executado pelo menos uma vez porque somenteap�os a sua execu�c~ao a < condi�c~ao > �e testada. Dentre as instru�c~oes de la�codeve existir pelo menos uma que altere o valor de < condi�c~ao >. Utilizandoessa instru�c~ao na resolu�c~ao do problema, obteremos o seguinte algoritmo.quadrados1()leia(A);repitat A�Aimprima(A; t)leia(A)at�e que A � 0Observe que a primeira estrutura de repeti�c~ao (enquanto-fa�ca) �e mais conve-niente para resolver o problema proposto. Se a sequencia de entrada for vaziae o primeiro valor lido for o valor sentinela, ocorrer�a indevidamente impress~aona tabela e a execu�c~ao �car�a interrompida por falta de dados na execu�c~ao dequadrados1().Do ponto de vista de formato, o la�co de repita-at�e-que n~ao precisa do dese-nho de bloco mesmo quando for constitu��do por uma sequencia de instru�c~oes,segundo a descri�c~ao acima. Isso porque as pr�oprias palavras-chave repita eat�e que servem de delimitadores de bloco.Para um mesmo problema as condi�c~oes de controle dos comandos enaquanto-fa�ca e repita-at�e-que s~ao complementares. Observe que a nega�c~ao de A > 0 �eA � 0 e vice-versa.Implementa�c~ao de quadrados1().#include <iostream.h>void main(){int A, t; // declara as vari�aveis.cout << ``Entre com um lista de n�umeros inteiros positivos,

Page 51: ~ Linguagem de Programacao e Estruturas De

51<< quando quiser terminar entre 0" << endl;cin >> A;do{ t = A*A;cout << A << t;cin >> A;} while(A>0);}Exemplo 16 Enunciado: Suponha que no ano N a popula�c~ao americana sejamaior que a brasileira. Sabendo-se que os Estados Unidos possuem um cres-cimento anual de 2% na sua popula�c~ao e que o Brasil tem um crescimentoanual de 4%, determinar o ano em que as duas popula�c~oes ser~ao iguais(emquantidade). S~ao dados os n�umeros de habitantes dos Estados Unidos e doBrasil no ano N .An�aliseA entrada consiste de tres n�umeros: ano, popula�c~ao brasileira e popula�c~aoamericana. Portanto, a sa��da deve ser um n�umero que corresponde ao anoem que as duas popula�c~oes se igualam. Assim,� Entrada: Um lista de tres n�umeros inteiros positivos.� Sa��da: um n�umero inteiro.� M�etodo: Recebe como entrada tres n�umeros positivos e devolve um n�umerointeiro positivo.Projeto:Devemos corrigir os valores das duas popula�c~oes para cada ano, a partir deum ano dado, at�e que o valor corrigido da popula�c~ao brasileira seja igual oumaior que o valor corrigido da popula�c~ao americana. Portanto, o problemadeve ser subdividido nos seguintes subproblemas:- corrigir a popula�c~ao brasileira (aumento 4%);- corrigir a popula�c~ao americana (aumento 2%);

Page 52: ~ Linguagem de Programacao e Estruturas De

52 CAP�ITULO 3. COMANDOS ESTRUTURADOS- passar para o ano seguinte.Repetir isto at�e que as duas popula�c~oes estejam iguais. Logo, a condi�c~ao quecontrola a repeti�c~ao �e a compara�c~ao entre as duas popula�c~oes.2Podemos, agora, apresentar o seguinte esbo�co para o algoritmo.Esbo�co do algoritmoleitura dos dadosrepetir corrigir popBrascorrigir popUsaincrementar anoat�e que popBras � popUsasa��da do resultadoA corre�c~ao do valor da popula�c~ao �e feita somando-se ao valor existente o valordo acr�essimo, que �e igual a taxa� popula�c~ao:Brasil: popBras + 0,04 � popBrasUsa : popUsa + 0,02 � popUsaPodemos, agora, apresentar o algoritmo na sua vers~ao �nal.Algoritmo popIguaisObjetivo: Determinar o ano em que a popula�c~ao brasileirasupera ou iguala a americana.Entrada: N(inteiro, Br;Usa(real).Sa��da: N(inteiro). popIguais1()leia(N,Br,Usa);repitaBr Br + 0:04 �Br;Usa Usa+ 0:02 � Usa;N N + 1;at�e que Br � Usa;imprima(\Ano",N)2Vamos usar a instru�c~ao repita-at�e-que porque as duas popula�c~oes, primeiro, sofre um acr�essimo de 4%e 2%, respectivamente, e somente, ent~ao, o teste da condi�c~ao ser�a executado. Esta instru�c~ao �e a indicadaporque sabemos, inicialmente, que a popula�c~ao americana �e maior que a brasileira. Caso contr�ario, seesses valores fossem desconhecidos, a instru�c~ao enquanto-fa�ca seria mais adequada, pois primeiro o testeda condi�c~ao seria efetuado e conforme seu resultado o bloco seria executado ou n~ao.

Page 53: ~ Linguagem de Programacao e Estruturas De

53Se usarmos a instru�c~ao enquanto-fa�ca, a condi�c~ao que controla o la�co ser�a anega�c~ao da condi�c~ao usada na instru�c~ao epita-at�e-que.popIguais2()leia(N;Br;Usa);enquanto Br < Usa fa�ca Br 0:04�Br;Usa 0:02� Usa;N N + 1;imprima(\Ano"; N);Na instru�c~ao de sa��da acrescentamos uma mensagem que esclarece o signi�-cado do valor de N . As mensagens que devem ser escritas s~ao colocadas sobaspas. A mensagem e o valor de N ser~ao impressos.3Implementa�c~ao.#include <iostream.h>void main(){int N;float Br, Usa;cout << "Entre com o ano, a popula�cao brasileira e a americana" << endl;cin >> N >> Br >> Usa;while (Br < Usa ){ Br <-- Br + 0.04 * Br;Usa<-- Usa + 0.02 * Usa;N <-- N + 1;}cout << "O ano �e" << N;}3Observe que o valor de N informa o ano em que ocorrer�a o empate, por�em at�e o �nal do ano N apopula�c~ao brasileira poder�a ter superada a popula�c~ao americana. Durante o ano N a popula�c~ao brasileirasofre um aumento de 4%, enquanto a americana de, apenas, 2%. Logo, chegar�a um momento, nesse ano,em que as popula�c~oes(brasileira e americana) se igualam.

Page 54: ~ Linguagem de Programacao e Estruturas De

54 CAP�ITULO 3. COMANDOS ESTRUTURADOSExemplo 17 Enunciado: Determinar o m�aximo divisor comum entre doisn�umeros inteiros positivos.An�alisePara determinar o mdc usaremos o algoritmo das divis~oes sucessivas(algoritmode Euclides) que ilustraremos abaixo.6 3 3126 20 6 26 2 0 = mdc(126,20)Na linha superior do dispositivo pr�atico registramos os quocientes obtidos, nalinha do meio os n�umeros que s~ao divididos(dividendo e divisor) e na linhainferior, os restos das divis~oes:quocientedividendo/divisorresto 6 3 3126 20 6 26 2 0Podemos a�rmar que� Entrada: Dois n�umeros inteiros positivos.� Sa��da: um inteiro positivo.� M�etodo: Para cada par de n�umeros inteiros positivos de entradadevolve seu mdc.Projeto:Na primeira divis~ao um dos dividendos �e um dos n�umeros dados e o divisor�e o outro. Nas divis~oes sucessivas o dividendo �e substitu��do pelo divisor e odivisor pelo resto. A �ultima divis~ao ocorre quando o respectivo resto for zero.O valor de mdc �e o valor do �ultimo divisor:

Page 55: ~ Linguagem de Programacao e Estruturas De

55dividendo divisor quociente resto126 20 6 620 6 3 26 2 3 0Portanto, o problema �e dividido nos seguintes subproblemas.- calcular o resto- de�nir pr�oximo dividendo- de�nir pr�oximo divisorResolver o problema consiste em repetir esses tres subproblemas(nesta ordem)at�e que o resto seja zero.O novo valor de dividendo �e o divisor anterior e o novo do divisor �e o restoanterior. Portanto, quando o resto for igual a zero, o novo valor do dividendo�e o valor do �ultimo divisor da sequencia de divis~oes, isto �e, �e o valor do mdc.Podemos apresentar o seginte esbo�co do algoritmoesbo�co do algoritmoleitura dos dadosde�ni�c~ao dos valores iniciais de dividendo e divisorrepita as opera�c~oes calcula o restosubstitui o dividendo pelo divisorsubstitui o divisor pelo restoat�e que resto = 0o valor do mdc �e o valor do �ultimo dividendoimpress~ao do mdcTendo em vista que a opera�c~ao mod fornece o resto da divis~ao entre doisn�umeros inteiros, podemos �nalmente apresenta o algoritmo que calcula o mdcde dois n�umeros inteiros positivos.Algoritmo mdcObjetivo: Calcular o m�aximo divisor comum entre dois n�umeros intei-ros positivos.Entrada: M;N(inteiros).

Page 56: ~ Linguagem de Programacao e Estruturas De

56 CAP�ITULO 3. COMANDOS ESTRUTURADOSSa��da: mdc(inteiro).mdc()leia(M,N);dividendo M ; divisor N ;repitaresto dividendo mod divisor;dividendo divisor;divisor resto;at�e que resto = 0imprima(mdc)Observe que o algoritmo funciona mesmo que M < N . Por exemplo, seM = 20 e N = 126, o resultado de mdc(20,126) �e 2.Implementa�c~ao.#include <iostream.h>void main(){int M, N;cout << "Entre dois inteiros positivos" << endl;cin >> N >> M;dividendo <-- M;divisor <-- N;while (resto /= 0 ){ resto <-- dividendo mod divisor;dividendo <-- divisor;divisor <-- resto;}mdc <-- dividendocout << mdc << endl;;}

Page 57: ~ Linguagem de Programacao e Estruturas De

57Exerc��ciosEm cada um dos exerc��cios abaixo, fazer a an�alise do problema, o projeto e implementa�c~aodo algoritmo.1. Dados os lados de quadrados, determinar suas �areas. Parar quando for informadode que lado=0.2. Determinar o n�umero de alunos de uma turma qualquer.3. Fazer um programa para validar notas, que v~ao de 0 at�e 10, de alunos de umainstitui�c~ao de ensino.4. O departamento de markting de uma editora est�a com o problema de calcular oponto de equil��brio para qualquer livro que se prop~oe a publicar. Isto �e, deveestabelecer o valor do pre�co de venda que cobre os custos de produ�c~ao. Os custosde produ�c~ao consistem em um custo �xo mais um custo de c�opia que depende don�umero de c�opias produzidas e do n�umero de p�aginas do livro.custo de produ�c~ao = custo �xo + (num de c�opias)� (num de p�ags.)� 0; 031Para cada livro que se pretenda publicar �e feita uma pesquisa de campo para sedeterminar o n�umero prov�avel de vendas. Esse n�umero �e utilizado como o n�umerode c�opias.Em seguida �e organizado uma lista dos livros que se pretende publicar contendo asseguintes informa�c~oes: n�umero de identi�ca�c~ao do livro, previs~ao de vendas, custo�xo e n�umero de p�aginas.Desenvolva um programa que, a partir dos dados dessa lista, emita um relat�oriocontendo o n�umero de identi�ca�c~ao do livro, as vendas previstas e o pre�co de vendado livro que cobre os custos de produ�c~ao. Para a leitura da lista �e preciso utilizaruma sentinela.5. Dados dois n�umeros inteiros positivos determinar quantas vezes o primeiro divideexatamente o segundo. Se o primeiro n~ao divide o segundo o n�umero de vezes �ezero.6. Dados dois n�umeros inteiros positivos determinar o valor da maior potencia doprimeiro que divide o segundo. Se o primeiro n~ao divide o segundo, a maior potencia�e de�nida como sendo igual a 1.7. Dados dois n�umeros reais positivos determinar o quociente inteiro do primeiro pelosegundo usando, apenas, os operadores aritm�eticos reais.

Page 58: ~ Linguagem de Programacao e Estruturas De

58 CAP�ITULO 3. COMANDOS ESTRUTURADOS8. Dado um n�umero real positivo determinar sua parte inteira e sua parte fracin�ariausando, apenas os operadores aritm�eticos reais.9. Dado um n�umero bin�ario inteiro positivo determinar a sua convers~ao para decimal.3.1 Estruturas de decis~ao de sele�c~ao ou de alternati-vasNas estruturas de dicis~ao(de sele�c~ao ou alternativa) o uxo de intru�c~oes a ser seguido �eescolhido em fun�c~ao do resultado da avalia�c~ao de uma mais condi�c~oes(express~ao booleanaou l�ogica). Podemos classi�car as estruturas de decis~ao, quando ao n�umero de condi�c~oesem � uma condi�c~ao(condi�c~ao simples) - se;� v�arias condi�c~oes(condi�c~oes m�ultiplas) - escolha(caso).Estruturas de decis~ao do tipo \se"Sintaxe:se <condi�c~ao> ent~ao<comando-composto1>sen~ao<comando-composto2>�m-seSemantica:Devemos ter o seguinte entendimento deste tipo de comando de decis~ao:1. Testar a condi�c~ao <condi�c~ao>, se ela for verdadeira2. executar o comando <comando-composto1>, caso contr�ario, isto �e, se <condi�c~ao>for falsa,3. executar <comando-composto2>.Exemplo 18 Enunciado: Dados dois n�umeros A e B distintos, determinarmaior.An�alisePodemos de in��cio identi�car a seguinte estrutura sequencial do algoritmo:

Page 59: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 59leitura dos dados(A,B)determinar o maiorsa��da do resultado(maior)Portanto,� Entrada: Dois n�umeros inteiros A;B.� Sa��da: Um n�umero inteiro, o maior dos dois.� M�etodo: Recebe como entrada dois n�umeros inteiros e devolve como sa��dao maior dos dois.ProjetoPara determinar o maior dos dois n�umeros A e B, �e preciso comparar A comB e, em fun�c~ao do resultado dessa compara�c~ao, o maior ser�a de�nido como ovalor de A ou o valor de B:leia(A,B)compare A com B, de�nindo o maiorimprima(maior)Para efetuar a compara�c~ao, podemos testar a condi�c~ao A > B. Se for verda-deira, o maior deve receber valor de A, caso contr�ario, o maior deve recebero valor de B. Isto signi�ca que existem duas alternativas ap�os o teste e quesomente uma das duas ser�a executada:A > B? � sim! o maior �e An~ao! o maior �e BDa descri�c~ao do algoritmo essa instru�c~ao �e descrita por:se A > B ent~aomaior Asen~aomaior BEssa instru�c~ao �e denominada instru�c~ao de sele�c~ao de dois ramos porque a suaexecu�c~ao, efetivamente, seleciona uma das duas alternativas: ou o ramo ent~aoou o ramo sen~ao, conforme o valor da condi�c~ao seja verdadeiro ou falso.Algoritmo maior

Page 60: ~ Linguagem de Programacao e Estruturas De

60 CAP�ITULO 3. COMANDOS ESTRUTURADOSObjetivo: Determinar o maior de dois n�umeros distintos.Entrada: A;B(real).Sa��da: Uma max(inteiro. maior1()leia(A,B);se (A>B ) ent~aomax A;sen~aomax B;imprima(max);Vejamos que modi�ca�c~ao deve sofrer o algoritmo maior1() se os n�umeros A eB n~ao forem necessariamente distintos. Antes vamos estabelecer que no casode igualdade desejamos que que a sa��da seja uma mensagem, por exemplo,\Valores iguais".Com esta modi�ca�c~ao a condi�c~ao a ser testada inicialmente �e a igualdade dosdois n�umeros dados. Conforme o valor dessa condi�c~ao devemos imprimir umamensagem ou ent~ao determinar o maior e imprim��-lo.esbo�co do algoritmoleitura dos dadosse A = B ent~aoimprimir mensagemsen~ao determinar o maiorimprimir o maiorO ramo sen~ao(<bloco2>) dessa instru�c~ao nada mais �e que o algoritmo ante-rior, sem a instru�c~ao de leitura. Portanto, temos o seguinte algoritmo:

Page 61: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 61maior2()leia(A,B);se A = B ent~aoimprimir(\Valores iguais');sen~ao se A > B ent~aomaior A;sen~aomaior B;imprimir(\maior=",maior);Implementa�c~ao: maior1()#include <iostream.h>void main(){float max, A, B;cout << "Digite dois n�umeros reais " << endl;cin >> A >> B;if (A > B )max = A;elsemax = B;cout << `` Maior = " << max << endl;}Implementa�c~ao: maior2()#include <iostream.h>void main(){float maior, A, B;cout << "Digite dois n�umeros reais " << endl;

Page 62: ~ Linguagem de Programacao e Estruturas De

62 CAP�ITULO 3. COMANDOS ESTRUTURADOScin >> A >> B;if (A = B )cout << ``Valores iguais" << endl;else{ if (A > B )maior = A;elsemaior = B;cout << ``Maior" << maior << endl;}}Exemplo 19 Enunciado: Determinar se uma pessoa �e maior ou menor deidade.An�aliseA entrada consiste de um n�umero que �e a idade algu�em, enquanto a sa��da deveser uma a cadeia constante \Maior de idade" ou \Menor de idade".� Entrada: Um n�umero inteiro positivo.� Sa��da: Uma cadeia constante.� M�etodo: Tem como entrada um inteiro positivo e devolve uma cadeiaconstante, \Maior de idade" ou \Menor de idade"Projeto:Este problema �e t~ao simples que escreveremos o algoritmo sem passar pela fasede esbo�co.Algoritmo maiorIdadeObjetivo: Veri�car se algu�em �e de maior idade, isto �e,tem idade maior ou igual a 18 anos.Entrada: N(inteiro).Sa��da: Uma cadeia constante.

Page 63: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 63maiorIdade()leia(idade);se (idade�18 )imprima(\ Maior de idade");sen~aoimprima(\Menor de idade");Implementa�c~ao.#include <iostream.h>void main(){int idade;cout << "Digite a idade" << endl;cin >> idade;if (idade >= 18 )cout << "Maior de idade" << endl;elsecout << "Menor de idade" << endl;}Exemplo 20 Enunciado: Numa pequena empresa, cada funcion�ario recebemensalmente o ordenado mais um premio referente a comiss~oes. S~ao dados osseguintes valores: sal�ario bruto e premio, al�em dos valores de base do INPS,base do imposto de renda e respectivas taxas(INPS E IR). Deseja-se emitiro demonstrativo do pagamento(contracheque) de um funcion�ario, contendo osvalores do sal�ario bruto, premio, rendimento, desconto de IR e sal�ario l��quido.Esclarecimento: O rendimento do funcion�ario �e a soma do sal�ario bruto como premio; o desconto do INPS somente incide se o rendimento for maior doque a base do INPS e o desconto do imposto de renda, somente se a diferen�caentre os valores do rendimento e o valor do desconto do INPS for maior doque a base do Imposto de Renda.An�alise

Page 64: ~ Linguagem de Programacao e Estruturas De

64 CAP�ITULO 3. COMANDOS ESTRUTURADOSVamos examinar um exemplo para con�rmar nossa compreens~ao do problema.Suponha que a entrada de valores num�ericos sejam as seguintes:Sal�ario bruto = 2000premio = 1000base INPS = 1500base IR = 2800taxa IR = 15%Inicialmente calculamos o rendimento atrav�es de:rendimento = sal�ario bruto + premio,Obtendo rendimento = 2000 + 1000 = 3000Logo a seguir veri�caremos se incide a taxa INPS sobre esse rendimento:base INPS = 1500rendimento = 3000 � ! rendimento > base INPSComo rendimento>base do INPS devemos calcular o desconto do INPS, que�e igual a 10% do rendimento:desconto INPS = 0; 10 � 3000 = 300Em seguida para veri�car se existe renten�c~ao de IR na fonte, subtraimos odesconto do INPS do valor do rendimento e comparamos essa diferen�ca como valor base IR:3000 � 300 = 2700base IR = 2800 � ! diferen�ca < base IRComo diferen�ca �e menor do que a base IR, n~ao existe desconto de IR, isto �e,o desconto de IR �e nulo. Finalmente temos:sal�ario l��quido = rendimento� desconto INPS � desconto IRsal�ario l��quido = 3000 � 300 � 0 = 2700Os valores de sa��da s~ao:

Page 65: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 65sal�ario bruto = 2000premio = 1000rendimento = 3000INPS = 300IR = 0sal�ario l��quido = 2700Portanto,� Entrada: Seis n�umeros reais, que s~ao sBruto, premio, baseINPS, ba-seIR, taxaINPS, taxaIR.� Sa��da: Seis n�umeros reais, que s~ao Sbruto, premio,R(sal�ario total), INPS, IR, sL��quido� M�etodo: Tem como entrada esses seis reais e devolve como seis n�umerosreais.Projeto:Analisando o processo executado observamos que o desconto do INPS s�o ocorrese o rendimento for maior que a base do INPS. Do mesmo modo, o descontodo IR s�o �e calculado se a diferen�ca(rendimento-desconto INPS) for maior quea base IR.Isto signi�ca que o calculo dos descontos depende do valor da condi�c~ao, masn~ao existem duas alternativas: se a condi�c~ao for verdadeira o c�alculo deve serefetuado, mas se acondi�c~ao for falsa nenhum c�alculo deve e ser executado:rendimento > base INPS? � sim : c�alculo do desconton~ao :nada a fazerNa descri�c~ao do algoritmo essa instru�c~ao �e descrita por:se <condi�c~ao> ent~ao<bloco>Essa intru�c~ao �e denominada instru�c~ao de sele�c~ao de um ramo porque a exe-cu�c~ao faz com que apenas uma �unica alternativa seja executada ou n~ao. Ap�oso teste do valor da condi�c~ao, o bloco somente �e executado se o valor do testefor verdadeiro.Observe que os dois testes devem ser feitos em sequencia, isto �e, ap�os ve-ri�car a condi�c~ao \rendimento > base INPS" deve ser veri�cada a condi�c~ao

Page 66: ~ Linguagem de Programacao e Estruturas De

66 CAP�ITULO 3. COMANDOS ESTRUTURADOS\(rendimento-desconto INPS)> base IR"independemente do resultado do testeanterior:O algoritmo, portanto, apresenta a seguinte estrutura l�ogica:esbo�co do algoritmoentrada de dadoscalcular rendimentocalcular desconto de INPS, se incidircalcular desconto IR, se incidircalcular sal�ario l��quidosa��da do resultadoPara identi�car os valores de entrada usaremos as vari�aveis: sBruto, premio,baseINPS, baseIR, taxaINPS, e para os valores de sa��da as vari�aveis: R,sL��quido, INPS e IR. O re�namento do esbo�co anterior �e o seguinte:refinamento do esbo�coleitura dos dadosR sBruto + premiose(R >INPS) ent~ao INPS taxaINPS�Rse(R>baseINPS) ent~ao IR taxaIr�(R-INPS)sL��quido R-INPS-Rsa��da do resultadoObserve que na pen�ultima instru�c~ao em que �e calculado o sL��quido, a exe-cu�c~ao s�o poder�a ser feita se as parcelas do INPS e IR estiverem com valoresde�nidos. Se as condi�c~oes que de�nem INPS e IR forem falsas nenhum valorser�a atribu��do a essas vari�aveis. Portanto, antes de testar as condi�c~oes deve-mos atribuir para essas vari�aveis valores iniciais iguais a zero. Esses valoressomente ser~ao modi�cados se as condi�c~oes que os de�nem forem verdadeiras.Finalmente, podemos escrever o algoritmo,Algoritmo contraChequeObjetivo: Calcular o rendimento, os decontos de INPS, de IR eimprimir o respectivo demonstrativo, de funcin�arioque recebe sal�ario e premio.Entrada: sBruto, premio, baseINPS, baseIR, taxaINPS, taxaIR(reaL).

Page 67: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 67Sa��da: sBruto, premio, R, INPS, IR, sL��quido(real)contraCheque()leia(sBruto,premio);leia(baseINPS,baseIR,taxaINPS,taxaIR);INPS 0; IR 0;R sBruto+premio;se R>baseINPS ent~aoINPS taxaINPS �R;se R-INPS>baseIR ent~aoIR taxaIR� (R� INPS);sL��quido R-INPS-IR;imprima(sBruto,premio,R,INPS,IR,sL��quido);Implementa�c~ao.#include <iostream.h>void main(){float sBruto, premio;float baseINPS, baseIR, taxaINPS, taxaIR, R, sL��quido;cout << "Digite sal�ario bruto e premio" << endl;cin >> sBruto >> premio;INPS = 0;IR = 0;if (R>baseINPS)INPS = taxaIR*R;if (R-INPS>baseIR)IR = taxaIR*(R-INPS);sL��quido = R - INPS - IR;cout << sBruto << premio << R<< INPS << IR << sL��quido << endl;

Page 68: ~ Linguagem de Programacao e Estruturas De

68 CAP�ITULO 3. COMANDOS ESTRUTURADOS}Tipos de dados booleano e caracteresA seguir apresentarem os tipos booleanos e caracteres necess�arios para os problemas aseguir.Tipos de dados booleano(l�ogico)Elementos : os valores l�ogicos verdadeiro(true) e falso(false)Opera�c~oes/Nota�c~ao : nega�c~ao n~ao: onjun�c~ao e: disjun�c~ao ouRela�c~oes/Nota�c~ao : igualdade =: desgualdade 6=Constantes : T e F, representando os valores true e false, resp.De�ni�c~ao das opera�c~oes l�ogicas pela tabela verdaden~aoF TT F e F TF F FT F T ou F TF F TT T TTipos de dados caractereElementos : os caracteres alfanum�ericos(letras latinas mai�usculas, letras latinas min�usculas, algarismosdecimais ar�abicos, sinais de pontua�c~ao e s��mbolos especiais)Opera�c~oes/Nota�c~ao : n~ao h�aRela�c~oes/Nota�c~ao : igualdade =: desigualdade 6=Constantes : caractere alfanum�ericos sob aspas simples, por exemplo `A',`2', `.', `<'A implementa�c~ao do tipo caractere numa liguagem de programa�c~ao representar�a oscaracteres em sistema de codi�ca�c~ao. O mais comum, principalmente, para os microcom-putadores �e o sistema ASCII(American Standard code for Interchase Information). Nessesistema �e introduzido uma rela�c~ao de ordem(<;�; > e �) entre os caracteres por meioda ordem associada a cada um dos 256 caracteres codi�cados. Essa rela�c~ao de ordempreserva a ordem alfab�etica e estabelece que os algarismos precedem as letras mai�usculase estas, as min�usculas.

Page 69: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 69Exemplo 21 Enunciado: �E dado o gabarito de uma prova que consta de tresquest~oes, cujas respostas podem ser qualquer uma de tres alternativas `A', `B'ou `C'. S~ao dadas tamb�em as respostas para as tres quest~oes fornecidadas porum estudante que se submeteu a prova.Desenvolver um algoritmo para imprimir o gabarito e a mensagem \elimina-do", caso estudante tenha errado todas as quest~oes, ou o gabarito e o n�umerodas quest~oes certas, caso o estudante tenha acertado alguma quest~ao.An�aliseOs dados consistem de tres letras que constituem o gabarito das tres quest~oes,e tres que formam a resposta do estudante.Exemplo de entrada e sa��das:entrada: (gabarito)B A C(resposta)B A Asa��da: gabarito: B A Cquest~ao 1, quest~ao 2entrada: (gabarito)B B B(resposta)A B Bsa��da: gabarito: B B Bquest~ao 2, quest~ao 3Observe que o gabarito ser�a impresso independentemente de acertos ou erros,isto �e, imediatamente ap�os a entrada dos dados. Em seguida existem somen-te duas possibilidades: ou a sa��da consiste da mensagem \eliminado" ou ouconsiste nos n�umeros das quest~oes certas. O que condiciona uma das duasalternativas �e o valor da condi�c~ao \errou as quest~oes":errou as 3 quest~oes? � sim! eliminadon~ao! veri�que quais as certasTemos, ent~ao a seguinte estrutura l�ogica:esbo�co do algoritmoentrada de dadosimprimir gabaritose errou as 3 quest~oes ent~aoimprimir mensagem \ELIMINADO"sen~aoveri�car quais as certas e imprimir os respectivos n�umeros

Page 70: ~ Linguagem de Programacao e Estruturas De

70 CAP�ITULO 3. COMANDOS ESTRUTURADOSPara veri�car quais as certas e imprimir os respectivos n�umeros, basta com-parar o gabarito com a resposta quest~ao por quest~ao, imprimindo o n�umero daquest~oes somente se o valor do gabarito for igual ao valor da resposta. Ap�osveri�car a quest~ao 1, devemos veri�car a quest~ao 2(n~ao importa se houve acer-to ou erro no teste da quest~ao 1)e em seguida, a quest~ao 3(idependentementedo resultado das quest~oes 1 e 2).Portanto, a estrutura l�ogica desse bloco �e uma sequencia de tres instru�c~oes desele�c~ao de um ramos, ou seja:refinamento do ebo�coentrada de dadosimprimir gabaritose errou as 3 quest~oes ent~aoimprimir mensagem \ELIMINADO"sen~aoimprimir \ACERTOU"se acertou a quest~ao 1 ent~aoimprimir \quest~ao 1"se acertou quest~ao 2 ent~aoimprimir \quest~ao 2"se acertou quest~ao 3 ent~aoimprimir \quest~ao 3"Sejam G1, G2 e G3 as vari�aveis que representam o gabarito e R1, R2 e R3as vari�aveis que representam as respostas do estudante. Essas vari�aves s~ao dotipo caractere.A condi�c~ao \errou as tres quest~oes" representa tres testes:R16=G1 e R26=G2 e R36=G3Finamente, podemos apresentar o algoritmoAlgoritmo exameFinalObjetivo: Dados os gabaritos de tres quest~oes e as resposta de um estudanteimprimir o gabarito ea mensagem \ELIMINADO" ou a mensagem \ACERTOU" e os n�umeros

Page 71: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 71da quest~oes certas, conforme o estudante tenha errado todasquest~oes ou n~ao.Entrada: G1, G2, G2, R1, R2, R3(caractere).Sa��da: G1, G2, G3(caractere), mensagem(cadeia de caractere).exameFinal()leia(G1,G2,G3,R1,R2,R3);imprimir(\gabarito: ", G1,G2,G3);se(R1neqG1) e (R26=G2) e (R36=G3) ent~aoimprima(\Eliminado");sen~aoimprima(\Acertou: ");se R1=G1 ent~aoimprima(\quest~ao 1");se R2=G2 ent~aoimprima(\quest~ao 2");se R3=G3 ent~aoimprim(\quest~ao 3");A condi�c~ao utilizada na instru�c~ao de sele�c~ao de dois ramos �e uma condi�c~aocomposta porque �e formada por condi�c~oes simples(escritas com operadores re-lacionais) que s~ao conectados pelo operador l�ogico \e".Implementa�c~ao.#include <iostream.h>void main(){char G1,G2,G3,R1,R2,R3;cout << "Digite os gabaritos G1, G2, G3: " << endl;cout << "Digite as respostas R1, R2, R2: " << endl;cin >> G1 >> G2 >> G3;cin >> R1 >> R2 >> R3;

Page 72: ~ Linguagem de Programacao e Estruturas De

72 CAP�ITULO 3. COMANDOS ESTRUTURADOScout << G1 << G2 << G3 << \endl;if (R1 /= G1 && R2 /= G2 && R3 /= G3)cout << "Eliminado" << endl;elsecout << "Acertou" << endl;if(R1=G1)cout << "quest~ao 1" << endl;if(R2=G2)cout << "quest~ao 2" << endl;if(R3=G3)cout << "quest~ao 3" << endl;}Exemplo 22 Enunciado: Suponha que em vez da resposta de um �unico estu-dante se tenha uma lista de respostas de n estudantes, dado o valor de n.Para repetir o processo acima n vezes �e preciso utilizar uma instru�c~ao derepeti�c~ao. Como essa repeti�c~ao deve ocorrer n vezes, a instru�c~ao adequada �ea repeti�c~ao controlada por vari�aveis:para aluno de 1 at�e n repita processo alunoComo o gabarito �e o mesmo para todos os estudantes, a leitura e a impress~aodo gabarito deve preceder a instru�c~ao de repeti�c~ao e o bloco \processa aluno"�e o algoritmo exameFinal tendo como entrada de dados apenas as respostasde cada aluno.

Page 73: ~ Linguagem de Programacao e Estruturas De

3.1. ESTRUTURAS DE DECIS ~AO DE SELEC� ~AO OU DE ALTERNATIVAS 73exameFinal1()leia(n);leia(G1,G2,G3);imprima(\gabarito: ");imprima(G1,G2,G3);para aluno de 1 at�e n repitaleia(R1,R2,R3);se (R16=G1)e(R26=G2)e(R36=G3) ent~aoimprima(\Eliminado");sen~aoimprima(\Acertou: ");se R1=G1 ent~aoimprima(`Q1');se R2=G2 ent~aoimprima(`Q2');se R3=G3 ent~aoimprima(`Q');Implementa�c~ao.#include <iostream.h>void main(){char G1,G2,G3,R1,R2,R3;int n, aluno;cout << ``Digite o n�umero de alunos: " << endl;cin >> n;cout << "Digite os gabaritos G1, G2, G3: " << endl;cin >> G1 >> G2 >> G3;cout << G1 << G2 << G3 << \endl;for (aluno=1; aluno<=n;aluno++){ cout << "Digite as respostas R1, R2, R2: " << endl;cin >> R1 >> R2 >> R3;if (R1 /= G1 && R2 /= G2 && R3 /= G3)cout << "Eliminado" << endl;else

Page 74: ~ Linguagem de Programacao e Estruturas De

74 CAP�ITULO 3. COMANDOS ESTRUTURADOS{ cout << "Acertou" << endl;if(R1=G1)cout << "quest~ao 1" << endl;if(R2=G2)cout << "quest~ao 2" << endl;if(R3=G3)cout << "quest~ao 3" << endl;}}}Fu�c~oes de bibliotecasAl�em das opera�c~oes de�nidas sobre os elementos do tipo inteiro e real, vamos considerar,a partir de agora, que temos dispon��vel uma biblioteca de fun�c~oes. Isto signi�ca que numprograma que for preciso usar uma ou mais dessas fun�c~oes tudo que �e preciso fazer �e for-necer os nomes das fun�c~oes com os argumentos correspontes. Chamemos essa bibliotecade bibliFunc e para que ela, efetivamente, funcione devemos colocar a instru�c~ao incluabiblifunc antes do programa \principal"(no preambulo) e as expeci�ca�c~oes das fun�c~oesque est~ao sendo usadas antes do programa. Vamos supor que essa biblioteca cont�emas fun�c~oes elementares da matem�atica, como, por exemplo, abs()(fun�c~ao valor absolu-to), sqrt()(fun�c~ao ra��z quadrada), ln()(logaritmo na base natural), exp()(exponencial),sin()(seno), cos()(coseno) etc. Podemos usar qualquer uma dessas fun�c~oes elementaresna biblioteca, mas, al�em de incluir a biblioteca no preambulo, �e preciso especi�car afun�c~ao que est�a sendo usada. Por exemplo, suponha que pretendemos usar a fun�c~ao ra��zquadrada, para isso devemos uncluir a sua especi�ca�c~ao(prot�otipo) sqrt : R+ �! R.4Exemplo 23 Enunciado: Dados tres n�umeros reais correspondentes, respec-tivamente, aos coe�cientes de uma equa�c~ao do segundo grau, ax2+bxx+c = 0,determinar e imprimir suas ra��zes nos seguintes casos: ra��zes reais distintas,ra��zes reais iguais e ra��zes complexas(complexas conjungadas). Imprimir men-sagem se a equa�c~ao n~ao for do segundo grau(a=0). Considerar dispon��veis embiblioteca as fun�c~oes srt()(ra��zQuadrada()) e abs()(valorAbsoluto()).O programa �nal que, deixaremos como exerc��cio, teria o seguinte aspectoincluir biblifunc4As fun�c~oes dinpon��veis, de fato, dependem da sua implementa�c~ao numa linguagem de programa�c~aoe fazem parte da biblioteca da linguagem.

Page 75: ~ Linguagem de Programacao e Estruturas De

3.2. EXERC�ICIOS 75ra��zQuadrada().............3.2 Exerc��ciosEm cada um dos exerc��cios abaixo apresentar a an�alise do problema, o projeto do algoritmoe a implementa�c~ao em C++.1. Dada uma sequencia de resultados da LOTO, identi�car se cada n�umero �e par,��mpar, m�ultiplos de 3, m�ultiplos de 5 ou m�ultiplos de 7. Por exemplo,Entrada: 27,16,42,30,10Sa��da: 27 �e ��mpar, m�ultiplo de 316 �e par42 �e par, m�ultiplo de 3, m�ultiplo de 730 �e par, multiplo de 3, m�ultiplo de 510 �e par, m�ultiplo de 52. Uma empresa decidiu dar uma grati�ca�c~ao de Natal a seus funcion�arios, baseada non�umero de horas extras e no n�umero de horas que o empregado faltou ao trabalho.O valor do premio �e obtido pela consulta a tabela I, em que H �e o n�umero de horas-extras subtra��do de dois ter�cos do n�umero de horas-faltas.tabela IH(horas) Premios(R$)(40,100] 100,00(30,40] 80,00(20,30] 60,00(10,20] 40,00(0,10] 20,00Dados os n�umeros de identi�ca�c~ao dos funcion�arios, o n�umero de horas extras e on�umero de horas-faltas, imprimir uma rela�c~ao com duas colunas, a primeira con-tendo o n�umero de funcion�ario e a segunda o valor do premio a que faz jus.3. O departamente do meio ambiente tem uma rela�c~ao de tres ind�ustrias altamentepoluentes, em constante estado de alerta. O ��ndice de polui�c~ao �e determinado regu-larmente na regi~ao e �e considerado normal o valor do ��ndice entre 0,05 e 0,25. Se o��ndice da polui�c~ao atingir 0,25 a situa�c~ao �e de alerta. Se atingir 0,30, a primei-ra ind�ustria da rela�c~ao �e chamada a suspender as atividades, se o ��ndice atingir0,40, a segunda ind�ustria tamb�em deve ser chamada a suspender as atividadese se o ��ndice exceder 0,50, a terceira ind�ustria tamb�em deve ser noti�cada. Asind�ustrias s~ao identi�cadas pelas letras A, B, C.

Page 76: ~ Linguagem de Programacao e Estruturas De

76 CAP�ITULO 3. COMANDOS ESTRUTURADOSFazer um programa para ler o ��ndice de polui�c~ao e emitir relat�orio noti�candoas ind�ustrias, caso seja necess�ario. Deve constar do relat�orio a situa�c~ao ocorri-da(abaixo do normal, norma ou alerta).4. Em um curso de ciencia da computa�c~ao a nota do estudante �e calculada a partir detres notas atribu��das, respectivamente, a um trabalho de laborat�orio, a uma avalia�c~aosemestral e a um exame �nal. As notas variam de 0 a 10 e a nota �nal �e a m�ediaponderada das tres notas mencionadas. A tabela abaixo fornece os pesos:laborat�orio peso 2avalia�c~ao semestral peso 3exame �nal peso 5Dada uma rela�c~ao de n estudantes, cada um com o respectivo n�umero de matr��culae as tres notas acima mencionadas, fa�ca um programa para calcular a nota �nal ea classi�ca�c~ao de cada estudante. A classi�ca�c~ao �e dada conforme a tabela abaixo.Imprimir a lista dos n estudantes, com o seu n�umero, nota �nal e classi�ca�c~ao.Nota �nal Classi�ca�c~ao[8; 10] A[7; 8) B[6; 7) C[5; 6) D[0; 5) R5. Cacular xn, supondo x um n�umero qualquer e n um inteiro n~ao negativo. Considerarn~ao dispon��vel em biblioteca a fun�c~ao de potencia�c~ao.6. Dados tres n�umeros inteiros correspondentes, respectivamente, ao dia, mes e ano donascimento de uma pesssoa e tres outros n�umeros correspondentes, respectivamente,ao dia, mes e ano corrente(por exemplo, dada de hoje), determinar e imprimira idade em anos completos(excluir meses e dias). Se a data do nascimento forposterior �a data corrente, deve ser impressa a mensagem alusiva.7. S~ao dados um n�umero n e quatro outros, a; b; c; d, correspondentes, respectivamente,as extremidades dos intervalos [a; b] e [c; d], sendo a < b, c < d e a < c. Determinarse n pertence somente ao intervalo [a; b] ou somente ao intervalo [c; d] ou, se npertence a ambos ou se n n~ao pertence a nenhum dos dois. Em cada caso imprimiruma mensagem conveniente.

Page 77: ~ Linguagem de Programacao e Estruturas De

3.2. EXERC�ICIOS 778. Durante os 31 dias do mes de julho foram tomadas as temperaturas m�edias di�ariasda cidade de Conquista. Determinar o n�umero de dias desse mes com temperaturasmenores ou iguais a 15 graus cent��grados e o n�umero de dias com temperaturasmaiores que 15 graus cent��grados.9. Uma loja de cal�cados anota diariamente a quantidade de pares vendidos. Determi-nar em que dia do mes de mar�co ocorreu a maior venda e qual foi a quantidadevendida nesse dia.10. Dados dois n�umeros inteiros e positivos, i e j, determinar e imprimir os n primeirosm�ultiplos de i ou de j ou de ambos.11. Um n�umero inteiro positivo �e triangular se ele �e o produto de tres n�umeros naturaisconsecutivos. Por exemplo, o n�umero 120 �e triangular porque 120 = 4 � 5 � 6.Dado um n�umero inteiro e positivo veri�car se ele �e ou n~ao triangular, imprimindomensagem.12. O governa da Rep�ublica das Bananas instituiu um controle de pre�cos e sal�arioslogo ap�os sua elei�c~ao. Uma previs~ao, baseada nas tendencias atuais, revela que ossal�arios v~ao aumentar anualmente de 5%, o custo de vida 10% e os impostos de15%. Por outro lado, existe uma previs~ao de que, se os impostos mais o custo devida consumirem mais do que 70% do sal�ario anual para um n�umero signi�cativode cidad~aos, o partido eleito ter�a problemas na pr�oxima elei�c~ao(em quatro anos), ese atingir 80% certamente n~ao ser�a vitorioso.A SIB(Secretaria de Inform�atica de Bananas) coletou os dados de uma amostra deseus eleitores, referente a sal�ario, imposta e custo de vida, e deseja determinar on�umero e a percentagem de cidad~aos da amostra que caem nas categorias de 75% a80%.Prever o m�etodo utilizado para assinalar o �m dos dados.13. A companhia de Pulveriza�c~ao PX Ltda executa pulveriza�c~ao de lavouras. Os cus-tos de pulveriza�c~ao dependem do tipo da praga e da �area da regi~ao que deve serpulverizada, conforme a seguinte tabela:C�odigo praga e pre�co por acre.A ervas daninha, 10,00 por acre.B gafanhotos, 20,00 por acre.C broca, 30,00 por acre.D tudo(os tres acima), 25,00 por acre,Se a �area a ser pulverizada possui mais do que 1.000 acres, existe o desconto de 5%.Se o custo de pulveriza�c~ao ultrapassar 25.000,00 h�a um desconto de 10%. Se ambosos descontos se aplicam, �e calculado em primeiro lugar o relacionado com a �area.

Page 78: ~ Linguagem de Programacao e Estruturas De

78 CAP�ITULO 3. COMANDOS ESTRUTURADOSO CPD dessa companhia recebe a rela�c~ao dos servi�cos contratados, contendo as in-forma�c~oes: n�umero de pedido, tipo de pulveriza�c~ao e �area pulverizada. O CPD deveemitir uma rela�c~ao da qual conste, em cada o valor da conta a pagar, correspondentea cada pedido de servi�co. Prever sentinela para �m de dados.14. Dado um n�umero inteiro e positivo determinar e imprimir o maior divisor n~ao-primo e o fator primo, excluindo em ambos os casos, ele pr�oprio.Por exemplo, se o n�umero for 12 dever~ao ser impressos 6(maior divisor n~ao-primo)e 3(maior divisor primo). Se o n�umero for 13, dever�a ser impresso \n~ao existemdivisores". Se o n�umero for 15, dever�a ser impresso apenas 5 e a mensagem \omaior divisor �e primo".15. Utilizar as informa�c~oes do exemplo 20 para imprimir a folha de pagamento dosfuncion�arios, al�em da emiss~ao do contracheque para cada um deles. Use sentinelapara assinalar �m de dados.16. Dado um n�umero inteiro maior que um, decomponha-o em seus fatores primos,imprimindo uma tabela contendo os fatores e os respectivos expoentes.

Page 79: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 4ALTERNATIVAS M�ULTIPLAS4.1 Sele�c~ao m�ultiplaSintaxe:Escolhacaso <condi�c~ao1><comando-composto1>caso <condi�c~ao2><comando-composto2>.......caso <condi�c~aoN><comando-compostoN>sen~ao<comando-compostoL>�m-Escolha.SemanticaEntramos com um valor constante de um tipo b�asico, chamado chave,� se ele for igual a <condi�c~ao1>, ent~ao executar <comando-composto1>;� se ele for igual a <condi�c~ao2>, ent~ao executar <comando-composto2>;� e assim continua at�e,� se ele for igual a <condi�c~aoN> executar <comando-compostoN>;� se nenhuma das condi�c~oes anteriors casar com a chave, ent~ao executar <comando-compostoL> 79

Page 80: ~ Linguagem de Programacao e Estruturas De

80 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLASObserve que pode n~ao existir o ramo sen~ao e, neste caso ser�a executado o pr�oximocomando ap�os o corpo de \Escolha". Al�em disso, se houver uma condi�c~ao que case coma chave, o camando correspondente �e executado e o controle sai do corpo de \Escolha" evai para o pr�oximo comando.Exemplo 24 Enunciado: No correio local s�o existem selos de 3 e de 5 cen-tavos. A taxa m��nima para correspondencia �e de 8 centavos. Desejamos de-terminar o menor n�umero de selos de 3 e 5 centavos que completam o valorde uma taxa dada.An�aliseO valor m��nimo da taxa �e 8 centavos e o valor m�aximo n~ao est�a especi�cado.Precisamos responder, inicialmente, a quest~ao de se, dado um n�umero inteiroqualquer, existem parcelas de 3 e/ou 5 cuja soma seja igual a esse n�umero.Isto corresponde a veri�car se existe solu�c~ao do problema.Na lista abaixo relacionamos a decomposi�c~ao de alguns n�umeros inteiros apartir de 8, em parcelas de 5 e/ou 3:8=3+59=3+3+510=5+511=3+812=3+913=3+1014=3+1115=3+1216=3+138=3+59=3+3+310=5+511=3+(3+5)12=3+(3+3+3)13=3+(5+5)14=3+3+(3+5)15=3+3+(3+3+3)16=3+3+(5+5) Observa�c~aosuc(5)=3+3 e suc(3+3+3)=5+5a=inicial8=3+3 b=suc(a)9=3+3+3 c=suc(b)10=5+511=3+(3+5).A partir de suc(c) o padr~ao se repete.A observa�c~ao nos permite concluir que os tres primeiros sucessivos de (3+3)est~ao escritos na forma de uma soma de 3 ou 5 e que o terceiro sucessivoreproduz, em sua decomposi�c~ao, novamente a parcela (3+5).Decorre deste �ultimo resultado que a constru�c~ao dos pr�oximos tres sucessivosmanter�a a decomposi�c~ao dos pr�oximos n�umeros consecutivos em parcelas de 3ou 5, reproduzindo novamente a parcela (3+5).Repetindo esse procedimento tantas vezes quantas forem necess�arias alcan�caremoso n�umero cuja decomposi�c~ao em parcelas de 3 ou 5 desejamos obter. A �unicarestri�c~ao que poder�a existir para o valor m�aximo da taxa ser�a a limita�c~ao dotipo de dados dispon��vel na linguagem de implementa�c~ao do algoritmo.Portanto, podemos concluir que o problema tem solu�c~ao e

Page 81: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 81� Entrada: Um n�umero n, a taxa a pagar.� Sa��da: Uma lista de dois naturais, quantas parcelas de 3 e quantas par-celas de 5.� M�etodo: Recebe como entrada um n�umero natural e devolve como sa��daum par de n�umeros naturais.ProjetoComo j�a concluimos, na fase de an�alise do problema, que ele tem solu�c~aoprecisamos agora encontrar um m�etodo para fornece-la.Se o valor da taxa fosse divis��vel por 5, a solu�c~ao seria obtida como o quocienteda divis~ao da taxa por 5: ter��amos a menor quantidade de selos de 5 cuja somafosse o valor da taxa. Se a divis~ao n~ao fosse exata e desse resto 1, por exemplo,n~ao obter��amos a decomposi�c~ao desejada. Neste caso, tent�avamos diminuir amenor quantidade poss��vel de selos de 5 que possibilitasse a solu�c~ao. Porexemplo, se a taxa fosse 11, retirar��amos apenas um selo de 5 sobrando 6sentavos. Como 6 �e um m�ultiplo de 3, a solu�c~ao seria encontrada.A seguir apresentamos alguns exemplos desse m�etodo para diferentes valoresde taxas:taxa=75: 15 selos de 5 e nenhum de 3.75 = 15 � 5 + 01taxa=76:14 selos de 5 e 2 selos de 3.75 = 14 � 5 + 1. Como 1 �! 5 e 15-1=14, temos 14 selos de 5e 2 de 3.taxa = 77: 13 selos de 5 e 4 de 3, pois77 = 15 � 5 + 2. Como 2 selos de 5 fazem 10, temos 10 + 2 =12 �! 3 selos de 3.Repetindo esse racic��nio para as taxas 78 e 79, e sabendo que 78 = 15� 5 + 3e 79 = 15 � 5 + 4, obteremos a seguinte tabela que relaciona o resto da taxapor 5 e as quantidades de selos de 5 e 3:1Estamos a f�ormula de que se D e D s~ao inteiros positivos ent~ao D = quociente � d+ resto; com �resto � quociente

Page 82: ~ Linguagem de Programacao e Estruturas De

82 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLASresto selos de 5 selos de 30 quociente 01 quociente - 1 22 quociente - 2 43 quociente 14 quociente - 1 3Estrat�egia 1A tabela, acima, sugere a seguinte estrat�egia:Determinar o quociente e o resto da taxa por 5.Veri�car qual alternativa ocorreu em fun�c~ao do resto econforme o caso, determinar o n�umero de selos de 5 e on�umero de selos de 3.Agora, temos uma situa�c~ao em que existem diversas alternativas(cinco) de-pendendo do valor de uma vari�avel que pode ter diversos valores(neste caso,s~ao somente cinco valores poss��veis).resto = 8>>>><>>>>: 0! selos de 5 = quociente e selos de 3 = 01! selos de 5 = quociente� 1 e selos de 3 = 22! selos de 5 = quociente� 2 e selos de 3 = 43! selos de 5 = quociente e selos de 3 = 14! selos de 5 = quociente� 1 e selos de 3 = 3A descri�c~ao dessa estrutura de sele�c~ao por meio da instru�c~ao de sele�c~ao dedois ramos levar�a a um encadeamente de intru�c~oes de sele�c~ao. Adotando umamaneira para simpli�car essa \cascata", temoscaso resto seja escolha0: selos de 5 quociente;selos de 3 0;1: selos de 5 quociente - 1;selos de 3 2;2: selos de 5 quociente - 2;selos de 3 4;3: selos de 5 quociente;selos de 3 1;4: selos de 5 quociente - 1;selos de 3 3;�m

Page 83: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 83Como vimos anteriormente, esta intru�c~ao �e denominada sele�c~ao m�ultipla, e avari�avel resto, cujos valores condicionam a sele�c~ao da alternativa, �e chamadoseletor.Algoritmo selosObjetivo: determinar o menor n�umero de selos de cinco oude tres unidades cuja seja o valor da taxa(taxa� 8).Entrada: taxa(inteiro).Sa��da: taxa, cinco, tres(Inteiro).selos();leia(taxa);quociente taxa div 5;resto taxa mod 5;caso resto seja escolha0: cinco quociente; tres 0;1: cinco quociente - 1; tres 2;2: cinco quociente - 2; tres 4;3: cinco quociente; tres 1;4: cinco quociente - 1; tres 3;�mimprima(taxa,cinco,tres);Observe que a mesma estrutura poderia ser descrita utilizando-se um ninhode instru�c~oes de sele�c~ao de dois ramos, em forma de cascata:se resto = 0ent~ao <bloco1>sen~ao se resto = 1ent~ao <bloco2>sen~ao se resto = 2ent~ao <bloco3>sen~ao se resto = 3ent~ao <bloco4>sen~ao <bloco5>Outra maneira de apresentar a instru�c~ao de sele�c~ao m�ultipla �e a seguinte:

Page 84: ~ Linguagem de Programacao e Estruturas De

84 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLAScaso seletor sejav1:<bloco1>;v2:<bloco2>;...vn:<blocon>;A vari�avel seletor s�o pode ser do tipo escalar(inteiro,caractere,booleano). Cadavalor v1,v2,...vn determina uma �unica das alternativa bloco 1,bloco 2,...,blocon, respectivamente.Se o seletor n~ao tiver nenhum dos valores especi�cados na instru�c~ao, nenhumbloco ser�a executado.Implementa�c~ao#include <iostream.h>void main(){int taxa, cinco, tres, quociente, resto;cout << "Digite a taxa: " << endl;cin >> taxa ;quociente = taxa/5;resto = taxa % 5;switch ( resto){case 0:cinco = quociente;tres = 0;break;case 1:cinco = quociente - 1;tres = 2;break;case 2:cinco = quociente - 2;

Page 85: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 85tres = 4;break;case 3:cinco = quociente;tres = 1;break;case 4:cinco = quociente - 1;tres = 3;break;}cout << taxa << cinco << tres << endl;}Estrat�egia 2Poder��amos usar outra abordagem para resolver esse problema, com segue.772 515 quociente15 resto2 observa�c~ao2 n~ao �e m�ultiplo de 3.14 7 subtra��mos 1 do quociente e somamos 5 ao resto;o novo resto 7 n~ao �e m�ultiplo de 3.13 12 subtra��mos 1 do quociente e somamos 5 ao resto,o novo resto 12 �e um m�ultiplo de 3.Logo, s~ao 13 os selos de 5, e 4 os selos de 3 porque o quociente de 12 por 3 �e4.Em resumo: inicialmente calculamos o quociente e o resto da divis~ao da taxapor 5. Em seguida, enquanto o resto n~ao for m�ultiplo de 3, diminuimos umaunidade do quociente e adicionamos 5 unidades ao resto. Quando o valormodi�cado do resto tornar-se m�ultiplo de 3 obteremos a solu�c~ao procurada: on�umero m��nimo de selos de 5 �e valor do \quociente modi�cado" e o n�umerom��nimo de selos de 3 �e o valor do quociente da divis~ao do \resto modi�cado"por 3.

Page 86: ~ Linguagem de Programacao e Estruturas De

86 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLASselos2();leia(taxa);quociente taxa div 5;resto taxa mod 5;enquanto resto mod 3 6= 0 fa�caquociente quociente - 1;resto resto + 5;cinco quociente;tres resto div 3;imprima(taxa,cinco,tres);Implementa�c~ao de selos2()#include <iostream.h>void main(){int taxa, cinco, tres, quociente, resto;cout << "Digite a taxa: " << endl;cin >> taxa ;quociente = taxa/5;resto = taxa % 5;while (resto % 3 /= 0){ quociente = quociente - 1;resto = resto + 5;}cinco = quociente;tres = resto/3;cout << taxa << cinco << tres << endl;}Exemplo 25 Enunciado: Dados tres valores a, b e c, em que a e b s~aon�umeros reais e c �e um caractere, imprimir o resultado da opera�c~ao de a por bse c for um s��mbolo de operador aritm�etico; caso contr�ario deve ser impressauma mensagem de operador n~ao de�nido.An�alise

Page 87: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 87Vamos considerar alguns exemplos de entradas:(a) entrada: a3 b5 c0+0 , sa��da: 3 + 5 = 8.(b) entrada: a2 b9 c0�0 , sa��da: 2 - 9 = -7.(c) entrada: a12 b0 c0=0 , sa��da: erro, divis~ao por 0.(d) entrada: a12 b4 c0d0 , sa��da: erro operador n~ao de�nido.Embora no enunciado do problema n~ao haja especi�ca�c~ao da sa��da desejadano caso de ocorrer divis~ao por zero, acrescentamos uma mensagem para essetipo de erro.� Entrada: a; b(real), c(caractere).� Sa��da: Um real ou uma mensagem.� M�etodo: Recebe como entrada dois n�umeros reais e um caractere e de-volve um real ou um caractere.ProjetoA sa��da depende basicamente do valor de c. Conforme o valor de c existem5 alternativas. Quatro correspondentes aos operadores arim�eticos e uma aosdemais s��mbolos que n~ao s~ao operadores aritm�eticos.c= 8>>>>>>>>>>>><>>>>>>>>>>>>: 0+0 calcular a + bimprimir o resultado0�0 calcular a - bimprimir o resultado0�0 calcular a� bimprimir o resultado0=0 se b 6= a calcule a=b e imprima o resultadocaso contr�ario, imprima mensagemn:o:a imprimir mensagemVamos descrever esse tipo de sele�c~ao na forma:

Page 88: ~ Linguagem de Programacao e Estruturas De

88 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLAScaso c seja0+0 : resultado a+ b;imprima(a; c; b;0=0; resultado);0�0 : resultado a� b;imprima(a; c; b;0=0; resultado);0�0 : resultado a� b;imprima(a; c; b;0=0; resultado);0=0 : se b 6= 0ent~aoresultado a=b;imprima(a; c; b;0=0; resultado);sen~aoimprima("erro : divis~ao por zero");sen~aoimprima("erro : operador n~ao de�nido");fimEssa instru�c~ao �e denominada instru�c~ao m�ultipla com ramo sen~ao. Seu formato�e: caso seletor sejav1:<bloco1>;v2:<bloco2>;...vN:<blocoN>;sen~ao <blocoF>�mSe a vari�avel seletor tiver um dos valores v1, v2,..,vN, ser�a executado o blo-co correspondente, mas se o seletor tiver valor diferente de todos os valoreseseci�cados na instru�c~ao, o bloco F ser�a executado.A sele�c~ao cont�em, portanto, n+1 alternativas:n correspondentes a cada uma das condi�c~oes seletor = vi com valor verda-deiro e i um dos n�umeros de 1 a n.1 correspondente �a condi�c~ao seletor = vi com valor falso para qualquer valorde i entre 1 e n.

Page 89: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 89Finalmente, podemos apresentar o algoritmo.Algoritmo opera�c~aoObjetivo: Dados dois n�umeros reais a e b e um caractere op, se op for ums��mbolo de opera�c~ao aritm�etica, calcular e imprimir oresultado; caso contr�ario imprimir mensagemEntrada: a; b(real), op(caractere).Sa��da: resultado(real) ou mensagem(cadeia de caractere).opera�c~ao();leia(a,op,b);caso op seja'+': resultado a + b;imprima(a,op,b,'=',resultado);'-': resultado a - b;imprima(a,op,b,'='resultado);'*': resultado a� b;imprima(a,op,b'=',resultado;'/': se b 6= 0 ent~aoresultado a/b;imprima(a,op,b,'='resultado;sen~aoimprima(\erro:divis~ao por zero");sen~aoimprimir(\erro:operador n~ao de�nido")�mImplementa�c~ao#include <iostream.h>void main(){int a, b;char op;cout << "Digite a, b e op: " << endl;

Page 90: ~ Linguagem de Programacao e Estruturas De

90 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLAScin >> a >> b >> op ;switch (op){case '+': cout << a + b; break;case '-': cout << a - b; break;case '*': cout << a*b; break;case '/':if (b /= 0)cout << a/b;elsecout << "erro: divis~ao por zero";break;default : cout << "erro: operador n~ao definido;}Exemplo 26 Enunciado: Uma companhia de seguros possui oito caterias deseguros baseados na idade e ocupa�c~ao do segurado. Somente pessoas com pelomenos 17 anos e n~ao mais de 70 poder~ao adquerir ap�olices de seguros. Quanto�as classes de ocupa�c~oes, foram de�nidos tres grupos de riscos. A tabela abaixofornece as categorias em fun�c~ao da faixa et�aria e dos grupos de risco. Dadosidade e grupo de risco, determinar a categoria.Grupo de riscoIdade Baixo M�edio alto17 a 20 1 2 321 a 24 2 3 425 a 34 3 4 535 a 64 4 5 665 a 70 7 8 9An�aliseA idade �e representada por um n�umero inteiros de anos, sendo, portanto, umvalor do tipo inteiro.

Page 91: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 91O grupo de risco gr, �e uma vari�avel do tipo caractere que pode assumir osvalores `B', `M', `A'.� Entrada: idade(real), gr(caractere).� Sa��da: categoria(cat).� M�etodo: Recebe como entrada um inteiro, representando a idade, eum caractere, representando o grupo de risco, e devolve um caractere,representando a categoria.ProjetoNa instru�c~ao de sele�c~ao m�ultipla vimos que cada valor do seletor selecionauma alternativa, isto �e, cada valor corresponde biuniocamente a uma �unicaalternativa.No nosso caso, desejamos que uma faixa de valores do seletor permitaselecionar uma mesma alternativa: para a idade na faixa de 17 a 20 anos,temos uma mesma alternativa, que �e a primeira linha da tabela dada.Na linha selecionada, por sua vez, temos novamente que selecionar uma detres alternativas, que �e a primeira linha da tabela dada.Na linha selecionada, por sua vez, temos novamente que selecionar uma dastres alternativas que depende do valor de um caractere(`B', `M',`A').Na intru�c~ao de sele�c~ao m�ultipla vamos descrever a faixa de valores escre-vendo o primeiro valor separado do �ultimo por dois pontos seguidos.Como a categoria depende da faixa et�aria combinada com o caratere do grupode risco, faremos uso de um ninho de instru�c~oes caso-seja.

Page 92: ~ Linguagem de Programacao e Estruturas De

92 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLASAlgoritmo seguroObjetivo: Calcular a categoria de seguro em fun�c~ao da idade e do grupo de risco.Entrada: idade(inteiro), gr(caractere).Sa��da: cat(inteiro).seguro();leia(idade,gr);caso idade seja17..20:caso gr seja`B':cat 1;`M':cat 2;`A':cat 3;�m;21..24:caso gr seja`B':cat 2;`M':cat 3;`A':cat 4;�m;25..34:caso gr seja`B':cat 3;`M':cat 4;`A':cat 5;�m;35..64:caso gr seja`B':cat 4;`M':cat 5;`A':cat 6;�m;65..70:caso gr seja`B':cat 7;`M':cat 8;`A':cat 9;�m;�m;imprimir(idade,gr,cat)Implementa�c~ao#include <iostream.h>

Page 93: ~ Linguagem de Programacao e Estruturas De

4.1. SELEC� ~AO M�ULTIPLA 93void main(){int idade, cat;char gr;cout << "Digite idade e grupo de risco: " << endl;cin >> idade >> gr;for(idade=17;idade<=20;idade++){ switch( gr )case:`B'cat = 1;case:`M'cat = 2;case:`A'cat = 3;}for(idade=21;idade<=24;idade++){ switch( gr )case:`B'cat = 2;case:`M'cat = 3;case:`A'cat = 4;}for(idade=25;idade<=34;idade++){ switch( gr )case:`B'cat = 3;case:`M'cat = 4;case:`A'cat = 5;}for(idade=35;idade<=64;idade++){

Page 94: ~ Linguagem de Programacao e Estruturas De

94 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLASswitch( gr )case:`B'cat = 4;case:`M'cat = 5;case:`A'cat = 6;}for(idade=65;idade<=70;idade++){ switch( gr )case:`B'cat = 7;case:`M'cat = 8;case:`A'cat = 9;}cout << idade << gr << cat;}4.2 Exerc��ciosEm cada um dos exerc��cios abaixo deve ser feito a an�alise do problema, o projeto doalgoritmo e a implementa�c~ao do algoritmo.1. Dada uma lista de datas de nasciemnto de v�arias pessoas imprimir a lista do tipo ca-racter��stico correspondente a cada data, de acordo com a regra abaixo.(n~ao esquecerde usar sentinela).Mensagens sobre a personalidade de pessoas s~ao estabelecidas de acordo com asseguintes regras:Seja D = dia do nascimento da pessoa(D = 1..31);M = mes do nascimento da pessoa(M = 1..12);A = ano do nascimento da pessoa(dado com 4 algarismos);N = n�umero formado pela justaposi�c~ao dos tres anteriores: DMA;Z = n�umeo obtido de N pela regra dos \noves-foras".A tabela abaixo fornece um tra�co marcante da personalidade da pessoa em conside-ra�c~ao:

Page 95: ~ Linguagem de Programacao e Estruturas De

4.2. EXERC�ICIOS 95Z tipo0 irrest��vel1 impetuoso2 discreto3 amoroso4 t��mido5 paquerador6 estudioso7 sonhador8 charmosoExemplo: Se uma pessoa nasceu em 30/10/1972, teremos D=30, M=10, e A=1972.Portanto, N=30101972. Aplicando a regra dos \noves-fora" temos Z=5, e portanto,seu tipo �e paquerador.Esclarecimento. Regras do noves-fora: somam-se os algarismos dos n�umeros en-quanto a soma for inferior a 9. Quando igualar a 9, subtrai-se 9 e continua-sesomando-se. No caso do exemplo, acima, os valores obtidos sucessivamente s~ao:3+0=3; 3+1=4; 4+0=4; 4+1=5; 5+9=14;, nove-fora, 5, 5+7=12, nove-fora, 3,3+2=5. A regra dos noves-fora pode ser implementada de v�arias outras maneiras.Uma delas �e considerar, simplesmente, o resto da divis~ao do n�umero Z por 9. A im-plementa�c~ao, neste caso, depende do dom��nio de�nido na linguagem de programa�c~aoutilizada.2. Uma loja utiliza os seguintes c�odigos para as transa�c~oes de cada dia:`*' signi�ca compra �a vista`+' signi�ca compra �a prazo`-' signi�ca pagamento efetuadoDada uma lista de transa�c~oes contendo o valor de cada transa�c~ao e o respectivoc�odigo, imprima um relat�orio com os totais de compras �a vista, compras �a prazo epagamentos efetuados. Usar o caractere zero como sentinela para o �m de dados.3. Dada a tabela abaixo, calcular e imprimir o sal�ario reajustado.Pro�ss~ao % de reajusteAgente t�ecnico 50%T�ecnico 40%Engenheiro 30%Outros 10%

Page 96: ~ Linguagem de Programacao e Estruturas De

96 CAP�ITULO 4. ALTERNATIVAS M�ULTIPLAS4. Dado o n�umero do mes, imprimir o seu nome. Por exemplo, dado 5, imprimirmaio.5. Dado o n�umero do dia da semana, imprimir seu nome.

Page 97: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 5PROGRAMAC� ~AO MODULAR5.1 Procedimentos e fun�c~oesNormalmente, come�camos aprendendo programa�c~ao escrevendo programas pequenos esimples que consistem somente de um programa principal, como temos visto at�e aquinestas notas. Aqui, \programa principal", signi�ca uma sequencia de comandos que mo-di�cam os dados, os quais s~ao globais atrav�es de todo o programa, no sentido de quequalquer comando do programa pode modi�car os dados. Esta t�ecnica de programa�c~ao,chamada n~ao estruturada, �e muito inconvinente quando o programa se torna razoavelmen-te grande. Por exemplo, se a mesma sequencia de comandos for necess�aria em diferenteslocais no programa, ela deveria ser copiada. Isto levou a id�eia de extrair essas sequencias,dar-lhes um nome, desenvolver uma t�ecnica para cham�a-las e retorn�a-las desses proce-dimentos. Com esse tipo de programa�c~ao procedural somos capazes de combinar eretornar sequencias de comandos em um �unico local. Uma chamada de procedimento �eusada para invocar o procedimento. Ap�os a sequencia ser processada, o uxo de controlevai para a posi�c~ao seguinte a que ele estava quando da chamado do procedimento. Intro-duzindo parametros, assim como procedimentos de procedimentos(subprocedimentos), osprogramas, agora, podem ser escritos de maneira mais estruturad0s e livres de erros. Porexemplo, se um procedimento estiver correto, toda vez que ele for usado ele produz resul-tados corretos. Por consequinte, em casos de erros podemos diminuir a busca daqueleslugares que resultaram na incorre�c~ao.Agora, um programa pode ser visto como uma sequencia de chamadas de procedimen-tos. O programa principal �e respons�avel de passar dados para as chamadas individuais,os dados s~ao processados pelos procedimentos e, uma vez o programa tenha terminado, osdados resultantes s~ao apresentados.Portanto, na programa�c~ao procedural temos um �unico programa dividido em pe�cas me-nores chamadas procedimentos. Para nos habilitar a usar um procedimento ou um grupode procedimentos em nossos programas, eles devem estar dispon��veis separadamente. Por97

Page 98: ~ Linguagem de Programacao e Estruturas De

98 CAP�ITULO 5. PROGRAMAC� ~AO MODULAResta raz~ao, a programa�c~ao modular nos permite agrupar procedimentos em m�odulos. Coma programa�c~ao modular os procedimentos com funcionalidades comuns s~ao agrupados emm�odulos separados. Um programa, portanto, n~ao consiste agora somente de uma �unicaparte. Ele consiste, agora, de v�arias pequenas partes que interagem atrav�es das chamadasde procedimentos, formando o programa todo. Cada m�odulo possui seus pr�oprios dados.Isso possibilita que cada m�odulo administre um estado interno que �e modi�cado por cha-madas de procedimentos deste m�odulo. Entretanto, existe um �unico estado por m�odulo ecada m�odulo existe no m�aximo uma vez no programa todo. A seguir analisaremos comum pouco mais de profundidade esse modo de fazer programa�c~ao.5.2 Procedimentos e fun�c~oesAntes de estudarmos os conceitos de fun�c~ao e procedimento revisitaremos o conceito debloco, introduzindo os conceitos de vari�avel local e \escopo" de vari�aveis.BlocosAt�e aqui usamos o conceito de bloco para agrupar comandos, com um in��cio e um �m.Neste sentido todo algoritmo �e um bloco.�As vezes, �e necess�ario declarar novas vari�aveis, ao longo do desenvolvimento do algo-ritmo. Para isso poder��amos retornar ao in��cio do algoritmo e fazer novas declara�c~oes.Podemos tamb�em usar o conceito de bloco para contornar esse problema.Como j�a sabemos, um bloco consiste de um conjunto de declara�c~oes e comandos delimi-tados, implicita ou explicitamente, pelas palavras in��cio e �m, como no seguinte exemplo:

Page 99: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 99in��cio< declara�c~oes >;c11;c12;...c1n;in��cio< declara�c~oes >;c21;c22;...c2m;in��cio< declara�c~oes >;c31;c32;...c3k;�mc2p;�mc1r;�mQuando um bloco come�ca a ser executado, as vari�aveis declaradas dentro dele s~aoativadas(isto �e, passam a existir efetivamente) e permanecem ativas at�e o t�ermino daexecu�c~ao do bloco. Ou seja, uma vari�avel declarada no in��cio de um bloco s�o existe dentrodele. Com isso, dizemos que as vari�aveis s~ao locais ao bloco, permitindo, desse modo,que elas s�o ocupem mem�oria quando necess�ario.Isso possibilita que o progamador gerencie a utiliza�c~ao de mem�oria.Escopo de vari�aveisDizemos que um bloco �e externo a um outro quando este faz parte dele. Neste sentido,uma vari�avel em bloco �e global a todos os blocos internos e local para o pr�oprio bloco.Podemos ter diversos blocos aninhados, conforme mostra a �gura a seguir.

Page 100: ~ Linguagem de Programacao e Estruturas De

100 CAP�ITULO 5. PROGRAMAC� ~AO MODULARM P A BQ RS n��vel0123 blocoMP, QA, R, SBP e Q s~ao internos a M M �e externo a P e QA �e interno a P P �e externo a AB �e interno a A A �e externo a BR e S s~ao internos a Q Q �e externo a R e SComo j�a observamos, uma vari�avel declarada dentro de um bloco s�o �e conhecida dentrodeste bloco.Se uma vai�avel A declarada em um bloco j�a foi declarada com o mesmo nome numbloco mais externo, a vari�avel ativa no bloco �e aquela declarada localmente. A vari�aveldeixa de ser global para aquele bloco.A seguir apresentamos exemplos de vari�aveis locais, globais e escopos de vari�aveis.Exemplo 27 in��cioint I, J;leia(I);J J � �;in��cioreal X;X J + 1;imprima(X);�mleia(J);I I � J ;�mNo exemplo 32, acima, I e J s~ao vari�aveis globais enquanto X �e uma vari�avel localao bloco interno.

Page 101: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 101Exemplo 28 in��cioint I, J;leia(I);J J � �;in��cioreal X, I;X J + 1;imprima(X);�mleia(J);I I � J ;�mNo exemplo 33, acima, I deixa de ser global porque foi declarada(com o mesmo nome)no bloco interno. �E como se X fosse uma nova vari�avel I 0.No exemplo a seguir, utilizamos o conceito de bloco para ilustrar como �e poss��vel en-conomizar mem�oria. Consideramos o problema de trocar os conte�udos de duas vari�aveisentre si. Mostraremos primeiro o algoritmo como tem sido feito e a nova vers~ao utilizandobloco:Exemplo 29 in��ciofsem bloco internogint aux, a , b;leia(a,b);aux a;a b;b aux;imprima(a,b);�min��ciofcom bloco internogint a , b;leia(a,b);in��cioint aux;aux a;a b;b aux;�mimprima(a,b);�mNesta segunda solu�c~ao a vari�avel aux s�o �e alocada no instante da troca. Isto se tornamais relevante num contexto onde a troca seja eventual, isto �e, pode acontecer ou n~aodependendo do teste.

Page 102: ~ Linguagem de Programacao e Estruturas De

102 CAP�ITULO 5. PROGRAMAC� ~AO MODULARM�odulosOs programas s~ao escritos, em geral, para resolver algum problema ou executar algumatarefa. Vejamos um exemplo. Uma livraria possui um arquivo organizada em t��tulose editores de cada livro vendido. A informa�c~ao entra na ordem em que os livros s~aovendidos. Em cada duas semanas o propriet�ario manualmente computa o n�umero dec�opias de cada t��tulo vendido e o n�umero de livros vendidos de cada editor. A lista �eorganizada em ordem alfab�etica e usada para o prop�osito de reordena�c~ao. Pretendemosdesenvolver um programa para realizar essa tarefa.Como j�a tivemos oportunidade de observar acima, um m�etodo de resolver um problemamaior �e quebr�a-lo em um n�umero de problemas menores, que constituir~ao os futurosm�odulos. Esperamos que estes problemas menores sejam mais f�aceis de resolver. Nonosso caso do problema da livraria, ele �e dividido em quatro subproblemas ou tarefasmenores:1. Ler no arquivo de vendas.2. contar as vendas por t��tulos e por editores.3. Ordenar os t��tulos por editor.4. Imprimir os resultados.Os itens 1, 2 e 4 representam problemas que j�a sabemos resolver. Eles n~ao precisamser mais quebrados em problemas menores. Entretanto, o item 3 �e um problema umpouco mais complexo do que os problemas que sabemos resolver. Ent~ao, aplicaremosnossa t�ecnica de re�namentos a este item:13a. Ordenar as vendas por editor.3b. Dentro de cada editor, ordenar as venda por t��tulo.1Observe que as t�ecnicas de re�namentos possibilitam ao programador, nas etapas inciais do desenvol-vimento do algoritmo, certas abstra�c~oes sobre o processo a serem descritos no algoritmo. Estas abstra�c~oess~ao de�nidas, apenas, pelo seu uso(ou efeito) e constituem uma de�ni�c~ao funcional do processo. Nas eta-pas posteriores, cada descri�c~ao funcional �e substitu��da por trechos mais detalhados que especi�cam asetapas do processo. Quando no processo de desenvolvimento do algoritmo optamos pelos re�namentossucessivos(que corresponde a quebrar o problema em subproblemas na fase de an�alise) este procedimentoconduz �a modulariza�c~ao da solu�c~ao do problema. Portanto, um m�odulo �e um grupo de comandos, cons-tituindo um trecho de algoritmo, com uma fun�c~ao bem de�nida. Dijkstra prop~oe a modulaiza�c~ao comoa regra �aurea da programa�c~ao: dividir para conquistar. Esta divis~ao da atividade de programa�c~aopermite, que a cada instante, toda aten�c~ao do programador esteja concentrada na solu�c~ao de cada pro-blema espec���co e bem de�nido. Isto se torna muito importante na fase de veri�ca�c~ao do programa, poispara veri�c�a-lo basta veri�car a corre�c~ao de cada m�odulo.

Page 103: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 1033e. Comparar t��tulos adjacentes dentro de cada grupo de editores. Para cada par quecasar, incrementar um contador de ocorrencia e remover o segundo.Os itens 3a, 3b e 3c representam, agora, problemas que sabemos como resolver. Comopoderemos resolver todos os subproblemas que geramos, resolvemos, de fato, o problemaoriginal, maior. Observamos, agora, que a ordem original das tarefas estavam incorretas.A sequencia de a�c~oes requeridas �e a seguinte:1. Ler no arquivo de vendas.2. Ordenar o arquivo de vendas. Primeiro por editor e, em seguida, por t��tulo dentrode cada editor.3. Compactar os t��tulos duplicados.4. Escrever os resultados dentro de um novo arquivo.Como j�a sabemos, essa sequencia de a�c~oes �e o que chamamos algoritmo e cada a�c~aoconstituinte um procedimento ou sub-rotina.O problema da livraria nos mostra que um procedimento �e uma ferramenta de progra-ma�c~ao que serve basicamente a dois prop�ositos:� evitar que uma certa sequencia de comandos que ocorre em v�arios locais de umalgoritmo tenha que ser escrita repetidamente nestes locais;� dividir e estruturar um algoritmo em partes fechadas e logicamente coerentes.Os algoritmos contem, muitas vezes, grupos de comandos iguais e repetidos em v�ariaspartes de seu corpo. Os procedimentos permitem economia de tempo de escrita e redu�c~aono tamanho do algoritmo, possibilitando a escrita dos comando repetidos apenas umavez. Nestes casos, a utiliza�c~ao de procedimentos permite tamb�em uma �unica escrita doscomandos que, ao serem executados, utilizam os paramentros ou operandos adequados acada ocorrencia.22Bem mais importante que esta utilidade do uso de procedimentos, o seu uso na modulariza�c~ao dealgoritmos torna-se uma ferrramenta indispens�avel na elabora�c~ao de algoritmos mais complexos e demaior tamanho. A divis~ao de estrutura�c~ao de algoritmos em partes l�ogicas �e uma t�ecnica indispens�avelem programa�c~ao estruturada.Wirth considera o conceito de procedimentos um dos poucos realmente fundamentais na arte e nat�ecnica da programa�c~ao cujo dom��nio exerce uma in uencia decisiva no estilo e na qualidade do trabalhode um programador. A divis~ao de um algoritmo em procedimentos, al�em de facilitar a elabora�c~ao doalgoritmo, permite uma melhor documenta�c~ao e veri�ca�c~ao de sua corre�c~ao. Cada m�odulo implementadocomo um procedimento deve conter sua pr�opria documenta�c~ao e pode ser veri�cado independetemente.Al�em disso, a modulariza�c~ao por procedimentos pode facilitar muito o trabalho de equipes de programa�c~aono sentido de que um algoritmo pode vir a ser dividido em partes e implementado, testado e catalogadoseparadamente.

Page 104: ~ Linguagem de Programacao e Estruturas De

104 CAP�ITULO 5. PROGRAMAC� ~AO MODULAREstrutura dos m�odulos de um algoritmoUm procedimento nada mais �e que um algoritmo hierarquicamente subordinado a um outroalgoritmo, comumente chamado de m�odulo principal. Analogamente, um procedimentopode conter outros aninhados, como observamos anteriormente.O conceito de objeto(vari�avel) local e global visto anteriormente, �e tamb�em v�alidopara procedimentos. Os procedimentos s~ao tamb�em objetos declarados em certos pontosde um algoritmo ou de outros procedimentos e, portanto, podendo ou n~ao ter-lhes acesso,dependendo de sua localiza�c~ao. Desse modo o algoritmo que resolve o problema da livrariaapresenta a seguinte estrutura.Exemplo 30 Algoritmo(M�odulo principal)in��cioleia();ordene();compacte();imprima();�mUtiliza�c~ao de procedimentosUm procedimento �e criado atrav�es de sua declara�c~ao em um algoritmo. �E um objetoest�atico no sentido de que, para ser executado, precisa de uma ativa�c~ao provocado por umcomando especial de chamada.A declara�c~ao de um procedimento deve ser feita como as demais declara�c~oes de objetose sempre na parte inicial de um algoritmo, um bloco ou outro procedimento.Uma declara�c~ao �e constitu��da de um cabe�calho(prot�otipo) e um corpo. O cabe�calhoidenti�ca o procedimento atrav�es de um nome e o corpo cont�em as declara�c~oes locais e oscomando do procedimento. A ativa�c~ao do procedimento �e feita atrav�es da referencia feitaao seu nome e ponto do algoritmo, respeitando as regras de escopo de objetos.Existem dois tipos b�asicos de procedimentos:� as sub-rotinas ou rotina ou procedimento propriamente dito;� as fun�c~oes.Sub-rotinasUma sub-routina �e declarada como a seguir:

Page 105: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 105sub-rotina nomedeclara�c~ao do objetos locais a subrotinacomandos da sub-rotina�m sub-rotinaonde \nome" �e o nome de referencia dado �a sub-rotina.A chamada de uma sub-rotina �e feita com uma referencia a seu nome, no local doprograma onde a sub-rotina deve ser ativada. Ou seja, onde a sua execu�c~ao deve seriniciada. Desse modo, a execu�c~ao de uma subrotina se constitui em uma transferenciatempor�aria da execu�c~ao do algoritmo chamador para a sub-rotina, retornando depois aoalgoritmo que chamou.Exemplo 31 No exemplo da livraria, ordene() �e uma sub-rotina e, portanto,segundo a estrutura�c~ao acima, temos:sub-rotina ordene()< corpo >Algoritmo(M�odulo principal)in��cioleia();ordene();compacte();imprima();�mFun�c~oesAs fun�c~oes constituem um tipo especial de procedimento, bastante semelhante as sub-rotinas. As fun�c~oes tem a caracter��stica especiail de retornar ao algoritmo chamado umvalor associado ao nome da fun�c~ao. Esta caracter��stica permite uma analogia com oconceito de fun�c~ao em matem�atica.Num dos cap��tulos anteriores, quando apresentamos as express~oes aritm�eticas usamosfun�c~oes como, por exemplo, abs()(fun�c~ao valor absoluto). Podemos utilizar fun�c~oes ma-tem�aticas no algoritmo, como, por exemplo, seno, tangente, ou qualquer outra fun�c~aoespecial, declarando um procedimento fun�c~ao. A declara�c~ao de uma fun�c~ao �e identica �ade uma sub-rotina, com exce�c~ao de que �e necess�ario especi�car na fun�c~ao os tipos dosargumentos de entrada e o tipo de retorno ou o tipo da fun�c~ao propriamente dito. Dei-xaremos os detalhes e exemplos de procedimentos fun�c~ao e mesmo sub-rotina para a suaimplementa�c~ao em C++.

Page 106: ~ Linguagem de Programacao e Estruturas De

106 CAP�ITULO 5. PROGRAMAC� ~AO MODULARFun�c~oes recursivasExistem casos em que um procedimento ou fun�c~ao chama a si pr�oprio. Dizemos ent~aoque o procedimento ou fun�c~ao �e recursivo. Por exemplo, o fatorial de um n�umero n podeser de�nido recursivamente, ou seja:n! = � n(n � 1)!; se n � 11; se n = 0Podemos escrever um algoritmo que implementa essa fun�c~ao de�nida recursivamente.int fat (int)in��cioint n;se n=0 ent~aofat 1;sen~aofat n � fat(n� 1);�mCodi�ca�c~ao em C++int fat (int n){ if (n=0)fat = 1;elsefat = n*fat(n-1);return fat;O fatorial de 3 ser�a calculada a partir da chamada �a fun�c~ao pelo comando, digamos,fat (3);que retornar�a em fat o valor 6.Implementa�c~ao de procedimentos em C++Inicialmente, observamos que o conceito de procedimento(fun�c~ao ou sub-rotina) em al-goritmo �e implementado em C++ pelo conceito de fun�c~ao. Como numa sub-rotina n~aoexistem os parametros de entrada ou de retorno, a linguagem C++ usa o tipo void parasimul�a-los. Portanto, quando, em C++, os valores de retorno ou de entrada for do tipovoid estamos diante de uma sub-routina.

Page 107: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 107Em C++, uma a�c~ao �e designada por uma express~ao. Uma express~ao terminada porum ponto e v��rgula �e um comando. Um comando �e a menor unidade idenpendente numprograma C++. Em linguagem natural o construto correspondente �e a senten�ca. Osseguintes, por exemplo, s~ao comandos em C++.int valor;valor = 7 + 1;cout << valor;Ao primeiro comando chamamos declara�c~ao. Ele de�ne uma �area de mem�oria docomputador associada ao nome \valor" de modo que possa conter qualquer valor inteiro.O segundo comando �e um comando de atribui�c~ao. Ele coloca na �area da mem�oria docomputador associada com o nome \valor" o resultado da soma de 7 com 1. O terceirocomando �e um comando de sa��da. cout �e o destino da sa��da associada ao terminal dousu�ario. O comando escreve em cout, isto �e, no teminal do usu�ario, o valor armazenadona �area de mem�oria do computador associada ao nome \valor".Os comandos est~ao logicamente agrupados em unidades chamadas fun�c~oes. Por exem-plo, todos os comandos necess�arios para ler no arquivo de vendas, no problema da livra-ria, est~ao organizadas numa fun�c~ao chamada leia(). Do mesmo modo, especi�camos umafun�c~ao chamada ordene(), uma compacte() e uma imprima().Em C++ todo programa deve conter uma fun�c~ao chamada main()(principal()), forne-cida pelo programador, antes do programa ser executado. Aqui est�a como a fun�c~ao maindeve ser de�nida para o algoritmo das vendas.void main(void){ leia();ordene();compacte();imprima();} Um programa C++ come�ca executando o primeiro comando de main(). No nossocaso, o comando come�ca executando a fun�c~ao leia(). A execu�c~ao do programa continuasequencialmente executando os comandos dentro de main().Uma fun�c~ao �e constitu��da de quatro partes: um tipo de retorno, o nome da fun�c~ao,uma lista de argumentos e o corpo da fun�c~ao. As tres primeiras, em grupo, �e chamada oprot�otipo da fun�c~ao. A lista de argumentos, que deve estar dentro de parenteses, cont�emuma lista de zero ou mais argumentos separados por v��rgula. O corpo da fun�c~ao est�a dentrode um par de chaves (f g). Ele consiste de uma sequencia de comandos do programa.No nosso exemplo, o corpo de main() chama para execu�c~ao as fun�c~oes leia(), ordene(),compacte() e imprima().

Page 108: ~ Linguagem de Programacao e Estruturas De

108 CAP�ITULO 5. PROGRAMAC� ~AO MODULARVejamos, agora, como providenciaremos para que o programa esteja pronto para exe-cu�c~ao. Primeiro devemos fornecer de�ni�c~oes de leia(), ordene(), compacte() e imprima().Neste ponto apresentaremos os exemplos \mudos" dessas fun�c~oes:void leia(void){ cout << cout << "leia()\n";}void ordene(void){cout << "ordene()\n";}void compacte(void){cout << "compacte()\n";}void imprima(void){cout << "imprima()\n";} void �e usado para especi�car uma fun�c~ao que implementa uma sub-rotina, isto �e, quen~ao fornece um valor de retorno ou n~ao recebe parametros de entrada. Cada fun�c~ao,como foi de�nida, simplesmente anunciar�a sua presen�ca no terminal do usu�ario, quandorequisitada por main(). Mais adiante trocaremos essas instancias mudas por de�ni�c~oes\reais" dessas fun�c~oes, quando elas forem implementadas. Essa maneira passo a passode construir programas �e o modo seguro de prevenir poss��veis erros de programa�c~ao, queinevitavelmente cometemos. Conseguir que um programa funcione n~ao �e uma tarefa t~aosimples como, a primeira vista, parece.A identi�ca�c~ao de um arquivo fonte de um programa �e constitu��da de duas partes: onome do arquivo e o su�xo do arquivo. O su�xo variar�a de acordo com as diferentesimplementa�c~oes de C++. Para diferenciar um arquivo fonte C++ de C, usaremos osu�xo cp ou cplus, dependendo do sistema operacional.Considere o seguinte programa completo num arquivo fonte C++:#include <iostream.h>

Page 109: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 109{ cout << cout << "leia()\n";}void ordene(void){cout << "ordene()\n";}void compacte(void){cout << "compacte()\n";}void imprima(void){cout << "imprima()\n";}void main(void){ leia();ordene();compacte();imprima();} A palavra \iostream.h" se refere ao arquivo de cabe�calho. ele cont�em informa�c~oessobre cout necess�arias ao nosso programa. #include se refere a uma diretiva do pre-processador. Essa diretiva tem como efeito que o conte�udo \iostream.h" seja lido dentrode nosso arquivo texto. Mais adiante discutiremos com mais detalhes as diretivas dopreprocessador.Uma vez que o programa esteja constitu��do num arquivo, o pr�oximo passo �e compil�a-lo. O nome do comando usado para chamar o compilador C++ depende do sistemaoperacional e, portanto, n~ao o discutiremos aqui. Discutiremos, apenas, o processo decompila�c~ao.Parte do trabalho do compilador �e analizar o texto do programa para dectar poss��veiserros. O compilador n~ao pode detectar se o signi�cado de um programa est�a correto, masele pode dectar erros na forma(errpsde sintaxe) do programa.Uma outra tarefa do compilador �e traduzir formalmente o texto do programa correto.Esta tradu�c~ao denominada gera�c~ao de c�odigo, gera objetos ou instru�c~oes em linguagem

Page 110: ~ Linguagem de Programacao e Estruturas De

110 CAP�ITULO 5. PROGRAMAC� ~AO MODULARde montagem entendida pelo computador, onde est�a sendo executado. O resultado de umacompila�c~ao bem sucedida �e um arquivo execut�avel.Al�em do compilador da linguagem e dos comandos C++, uma implementa�c~ao forne-ce um conjunto de bibliotecas padr~ao. As bibliotecas de programas s~ao uma cole�c~ao defun�c~oes precompiladas. Em C++, por exemplo, as entradas e as sa��das s~ao suportadaspela biblioteca padr~ao de C++. Os programadores podem usar fun�c~oes de biblioteca dentrode seus programas, do mesmo modo que usam fun�c~oes que eles de�nem.Na melhor das hip�oteses, uma biblioteca de programas permite a um especialista empa-cotar seus conhecimentos para serem usados por programadores. Uma boa biblioteca podeser t~ao f�acil e �util de usar quanto um interruptor de energia el�etrica, que nos permite,mesmo sem entender profundamente eletricidade, us�a-las para os mais diversos �ns.Entrada/sa��daAs entradas e sa��das n~ao fazem parte da linguagem C++, mas s~ao suportadas por umabiblioteca escrita em C++, conhecida como biblioteca iostream.As entradas provinientes do terminal do usu�ario s~ao denominadas entradas padr~ao(standartinput, em ingles). Elas s~ao associadas ao objeto de iostream cin. As sa��das direcionadasao terminal do usu�ario, denominadas sa��das padr~ao, est~ao associdas ao objeto cout.O operador de sa��da (<<) �e usado para direcionar a sa��da padr~ao. Por exemplo,cout << "A soma de 7 + 3 = ";cout << 7 + 3;cout << "\n";A sequencia de dois caracteres \nn" representa um caractere de nova linha. Quandoescrito, o caractere de nova linha tem como efeito que a sa��da seja direcionada �a pr�oximalinha. Em vez de escrever o caractere de nova linha explicitamente podemos aplicar omanipulador endl, prede�nido em iostream. endl insere um caractere de nova linha nacadeia de sa��da. Em vez de escrevercout << "\n";poderemos escrevercout << endl;As sucessivas ocorrencias do operador de sa��da podem ser concatenadas. Por exemplo,cout << "A soma 7 + 3 = " << 7 + 3 << endl;Cada operador de sa��da sucessivo �e aplicado em cout. Para n~ao perder a legibilidade,o comando de sa��da concatenado pode ser distribu��do em v�arias linhas. As tres linhas aseguir constituem um �unico comando.

Page 111: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 111cout << "A soma"<< v1 << "+"<< v2 << "= " << v1 + v2 << endl;Analogamente, o operador de entrada (>>) �e usado para ler um valor da entradapadr~ao. Por exemplo, o seguinte programa implementa um algoritmo para ler dois valores,determina o maior dos dois e escreve-o#include <iostream.h>void leia(int&, int&);int max(int, int);void escrevMax(int);main(){ int val1, val2, maxValor;leia(val1,val2);escrevaMax(maxVal);}void leia(int&,int&){ cout << "Por favor entre com dois n�umeros: ";cin >> v1 >> v2;}int max(int v1, int v2){ if( v1 > v2)return v1;elsereturn v2;}void escrevaMax(int val){cout << val<< "�e o maior valor."}

Page 112: ~ Linguagem de Programacao e Estruturas De

112 CAP�ITULO 5. PROGRAMAC� ~AO MODULARFaremos algumas observa�c~oes sobre esse programa. Os nomes das tres fun�c~oes fo-ram listadas antes da de�ni�c~ao de main(). Esta lista inicial, denominada declara�c~ao deprot�otipo, informa ao programa que essas fun�c~oes existem e suas de�ni�c~oes ocorrem emalgum lugar mais adiante do programa, ou num arquivo de biblioteca ou mesmo num ar-quivo separado constru��do pelo programador. Uma fun�c~ao deve, sempre, ser declarada aoprograma antes de ser chamada. Um prot�otipo �e uma maneira de conseguir isso. val1 eval2 s~ao denominadas vari�aveis simb�olicas. O comandoint val1, val2;de�ne essas vari�aveis para o programa. As vari�aveis tamb�em devem ser conhecidas doprograma antes dele vir a us�a-las.v1 e v2, designadas por argumentos formais, constituem a lista de argumentos paraleia() e max(). val �e o �unico argumento formal de escrevaMax().Quando esse programa for compilado e executado, ele fornece como sa��da o seguinte,na hip�otese de que usu�ario entrou com os valores 17 e 124.Por favor entre com dois n�umeros: 17 124124 �e o maior valorOs dois valores fornecidos pelo usu�ario, 17 e 124, est~ao separados por um brando. Osbrancos, tabs e novas linhas s~ao referidos como espa�cos em branco em C++. O comandocin >> v1 >> v2;le, corretamente, os dois valores porque o operador de entrada (\>>" ) desconhecequalquer esp�co em branco que ele encontra.As declara�c~oes de cin e cout est~ao no arquivo de biblioteca de C++, iostream.h. Seo programador esquecer de incluir esse arquivo, cada referencia a cin ou cout ser�a consi-derado pelo compilador como um erro. O armazenamento de prot�otipos �e o primeiro usode arquivos de cabe�calho.O terceiro iostream prede�nido, cerr, diz respeito ao erro padr~ao, ligado ao terminal dousu�ario. cerr �e usado para alertar o usu�ario de alguma condi�c~ao excepcional, que ocorredurante a execu�c~ao do programa. Por exemplo, o seguinte fragmento de c�odigo alerta oprogramador para uma tentativa de dividir por zero:if(v2==0){ cerr "erro: tente dividir por zero";return;}v3 = v1/v2;

Page 113: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 113O seguinte programa le, da entrada padr~ao, um caractere de cada vez at�e o �m-de-arquivo a ser encontrado. A sua sa��da �e a seguinte:contaLinha contaCaractereA sua implementa�c~ao �e a seguinte:#include <iostream.h>main(){ char ch;int contaLinha = 0, contaChar = 0;while(cin.get(ch) ){switch{case `\':case ` ':break;case `\':++contaLinha;break;default;++contaChar;}}cout << contaLinha << " " << endl;}get() �e uma fun�c~ao em iostream que le um caractere de cada vez, colocando essecaractere lido em seu argumento, no nosso caso ch. A sequencia de dois caracteres `nt"representa o caractere tab.O comando switch fornece uma forma condicional de testar um valor. Se o valorcasar com um caso explicitado, os comandos seguintes default ser~ao executados. Paracada caractere nova linha contaLinha �e incrementado de um. contaChar �e incrementadode um cada vez que �e lido um caractere que n~ao �e branco, tab ou novaLinha. O comandowhile, denominado la�co, prove uma repeti�c~ao da execu�c~ao de um conjunto de comandosdesde que a condi�c~ao seja verdadeira. Neste caso, o comando switch ser�a executadoenquanto get() le um caractere da entrda padr~ao.

Page 114: ~ Linguagem de Programacao e Estruturas De

114 CAP�ITULO 5. PROGRAMAC� ~AO MODULARUma palavra sobre coment�ariosComent�arios servem como uma ajuda ao leitor humano de um programa. Eles podemresumir o que faz um algoritmo, identi�car o pr�oposito de uma vari�avel, ou esclarecerum fragmento de c�odigo obscuro. Os coment�arios n~ao aumentam o tamanho do programaexecut�avel. Eles s~ao retirados pelo compilador antes da gera�c~ao de c�odigo.Existem dois delimitadores de coment�arios em C++. O primeiro deles, o par decoment�arios \/* */", �e o mesmo usado em C. O come�co de um coment�ario �e indicadopor \/*". O compilador tratar�a tudo que estiver entre\/*" e \*/". como coment�ario. Umcoment�ario pode ser colocado em qualquer lugar onde seja permitido um tab, um espa�coem branco ou uma nova linha e pode abranger muitas linhas do programa. Por exemplo,/** Este �e o primeiro contacto com a defini�c~ao de classe em C++.* Classes s~ao usadas tanto para abstra�c~ao de dados como* para programa�c~ao orientada a objeto. Uma implementa�c~ao* da classe tela ser�a apresentada num cap��tulo adiante.*/Classe tela{/* Isto �e denominado corpo da classe*/public:void casa() /* move o cursor para 0,0 */void refaz() /* redesenha a tela */private:/* Classes suportam "encapsulamento de informa�c~ao" *//* encapsulamento de informa�c�ao restringe que um programa *//* tenha acesso a uma representa�c~ao interna de *//* uma classe(seus dados). Isto �e realizado atrav�es do uso de/* private:" */char *cursor; /* posi�c~ao corrente da tela */} Existem muitos coment�arios entremeados com os c�odigos do programa, o que podeobscurecer o pr�oprio c�odigo. Por exemplo, a declara�c~ao de cursor est�a quase impercept��vel.Em geral, �e prefer��vel um bloco de coment�arios acima do texto que ele est�a explicando.Pares de coment�arios n~ao podem estar aninhados. Isto �e, um par de coment�arios n~aopode ocorrer dentro de um outro par.O segundo delimitador de coment�arios, indicado por uma dupla barra, (\//"), servepara delimitar uma �unica linha de coment�arios. Tudo na linha do programa �a direita dodelimitador �e tratado como um coment�ario e ignorado pelo cmpilador. Por exemplo,

Page 115: ~ Linguagem de Programacao e Estruturas De

5.2. PROCEDIMENTOS E FUNC� ~OES 115#include <iostream.h>#include "meu-io.h"int �e�Impar(int);main(){int v1, v2; // cont�em valores do usu�arioleia(v1,v2); // declarado em meu-io.hif(�e�Impar(v1) == 1)cout << v1<< "�e�Impar \n";if(�e�Impar(v2) == 1)cout << v2<< "�e�Impar\";}�e�Impar(int val){ /* retorna 1 se val �e ��mpar; caso contr�ario 0/* % �e o operador de m�odulo: 3%2 resulta 1. */return val % 2 !=0;}Este programa determina se os valores s~ao ��mpares. Ele reusa a fun�c~ao leia(), de�nidana se�c~ao anterior. O prot�otipo desta fun�c~ao foi armazenado num arquivo de cabe�calho,chamado meu-io.h. Quando o programa for compilado e executado sua sa��da tem a se-guinte aparencia, na hip�otes de que o usu�ario entrou com os valores 498 e -25:Por favor entre dois valores inteiros: 498 -25498 �e par-25 �e ��mparOs caracteres de ambos os delomitadores de coment�arios n~ao podem ser separados porespa�cos em branco. As duas linhas seguintes, por exemplo, n~ao podem ser consideradoscomo coment�arios, mas como um texto do programa:/* n~ao �e um coment�ario: espa�co em branco n~ao �e permitido */// tamb�em n~ao �e um coment�ario: deve ser //Os programas, tipicamente, cont�em uma mistura de ambos as formas de coment�arios.As explica�c~oes multilinhas s~ao, em geral, colocadas entre barras de cment�arios. Metadede linha e �unica linha s~ao, geralmente, comentados por barra dupla.

Page 116: ~ Linguagem de Programacao e Estruturas De

116 CAP�ITULO 5. PROGRAMAC� ~AO MODULARDiretivas do preprocessadorAs bibliotecas padr~ao s~ao um conjunto de arquivos de cabe�calhos padr~ao, tais como ios-tream.h. Esses arquivos de cabe�calhos cont�em todas as informa�c~oes requeridas pelo usu�ariode mdo a que ele fa�ca uso da biblioteca. Para poder acessar uma vari�avel ou uma fun�c~aode�nida na biblioteca padr~ao, devemos incluir no nosso programa o arquivo de cabe�calhocorrespondente.Os arquivos de cabe�calho tornam-se parte de nosso programa atrav�es da diretiva inclu-de. As diretivas s~ao especi�cadas colocando-se o sinal \#" no in��cio das linhas atrav�esdas quais queremos incluir, em nosso programa, algum arquivo.As diretivas s~ao processadas antes que o c�odigo fonte seja compilado. O programa quemanipula as diretivas �e denominado precompilador.A diretiva de #include le o conte�udo dos arquivos nomeados. Ela pode ter uma dasseguinte formas:#include <iostream.h>#include "meu-io.h"Se o nome do arquivo est�a entre < > presume-se que o arquivo seja de cabe�calhoprede�nido ou padr~ao. Para pesquisar sua localiza�c~ao o preprocessador examinar�a umconjunto prede�nido de localiza�c~oes.Se o nome do arquivo est�a sob aspas duplas, presume-se que o arquivo de cabe�calho�e fornecido pelo usu�ario. O arquivo inclu��do pode, ele pr�oprio, conter uma diretiva#include, e isto, em geral, causa problemas. Neste caso s~ao usados diretivas condicionaispara se evitar o m�ultiplo processamento de um arquivo de cabe�calho. Por exemplo,#ifndef STRING_H#define STRING_H/* O conte�udo de STRING.H vai aqui */#endifA diretiva condicional #ifndef �e avaliada como verdadeira se o nome que segue n~aoest�a ainda de�nido. Quando uma diretiva condicional for avaliada como verdadeira, aslinhas subsequentes at�e um #endif ser encontrada s~ao inclu��das. Se a diretiva condicionalfor avaliada falsa, as linhas entre ela e a diretiva #endif s~ao ignoradas.A diretiva#de�ne de�ne um nome que segue. No nosso exemplo, ela de�ne STRING H.Se o arquivo de cabe�calho string.h for inclu��do novamente a diretiva #ifndef ser�a avaliadafalso. O conte�udo de string.h n~ao ser�a mais inclu��do. Por exemplo,#ifdef u3b2/* c�odigo espec��fico do sistema* para computaores AT&T 3B vai aqui */

Page 117: ~ Linguagem de Programacao e Estruturas De

5.3. EXERC�ICIOS 117#endif#ifdef sun3/* c�odigo espec��fico do sistema* para a esta�c~ao de trabalho sun/3 vai aqui */C++ prede�ne o nome -cplusplus. O usu�ario que desejar misturar c�odigo de programaem C com o de C++ deve escrever o seguinte:#ifdef__cppextern min(int, int);int *pt = novo int;#elseextern min();int *pt;#endifOs comandos entre a diretiva #else e #endif ser~ao inclu��dos se a diretiva #ifdefou#ifndef for avaliada falso.5.3 Exerc��ciosViviane vol1 pag 180.

Page 118: ~ Linguagem de Programacao e Estruturas De

118 CAP�ITULO 5. PROGRAMAC� ~AO MODULAR

Page 119: ~ Linguagem de Programacao e Estruturas De

Cap��tulo 6DADOS ESTRUTURADOS6.1 Introdu�c~aoA ciencia da computa�c~ao poderia ser considerada como o estudo de algoritmos. Comoj�a sabemos, um algoritmo �e um conjunto bem determinado de instru�c~oes que, quandoseguidas desempenham um papel particular. Existe uma rela�c~ao bastante pr�oxima entrea estrutura�c~ao dos dados e a constru�c~ao de algoritmos. De fato, a estrutura de dados eo algoritmo devem ser considerados como unidade, nenhum dos dois faz sentido sem ooutro. Por exemplo, considere uma lista de m pares de nomes e n�umeros de telefones,f(n1; t1); (n2; t2); :::; (nm; tm)g, e suponha que pretendemos construir um programa que,dado o nome da pessoa imprime o n�umero do telefone dessa pessoa. A tarefa �e chamadade busca. A maneira de como escreveremos esse algoritmo depende de como os nomes eos n�umeros dos telefones estiverem armazenados ou estruturados.Todas as estruturas de dados podem ser razoavelmente constru��das dentro de umalinguagem de programa�c~ao convencional. A estrutura de dados deve ser projetada de modoque possamos saber o que ela faz(especi�ca�c~ao) e como ela vai faze-lo(implementa�c~ao).Uma estrutura de dados descreve o conjunto de opera�c~oes que podem ser aplicadaslegalmente aos objetos de dados. Por isso deveremos especi�car o conjunto de opera�c~oese explicar como elas funcionam. Por exemplo, para o tipo inteiro temos as opera�c~oesaritm�eticas +, �, �, = e mod e as rela�c~oes >, <, �, etc. Os objetos de dados n�umerosinteiros conjuntamente com a descri�c~ao de como se comportam as opera�c~oes e as rela�c~oesconstituem a de�ni�c~ao da estrutura de dados.Uma implementa�c~ao de uma estrutura de dados �e um mapeamento que especi�ca comocada objeto ser�a representado. Assim, os inteiros ser~ao representados pela s�erie de bits,os boleanos por zero e um e uma matriz por um conjunto de palavras consecutivas namem�oria. 119

Page 120: ~ Linguagem de Programacao e Estruturas De

120 CAP�ITULO 6. DADOS ESTRUTURADOS6.2 Tipos abstratos de dadosTipo de dados �e o termo que pode ser atribu��do aos grupos de dados, que podem ser su-portados pelas vari�aveis dentro de uma linguagem de programa�c~ao. Um tipo abstratode dados �e uma estrutura de objetos, opera�c~oes e rela�c~oes especi�cados por um formalis-mo matem�atico. Exemplos de tipos abstratos de dados s~ao: booleanos, n�umeros inteiros,n�umeros naturais, n�umeros reais, n�umeros complexos, vetores, grafos, �arvores, etc. Den-tro de cada linguagem de programa�c~ao existe embutida uma cole�c~ao de tipos de dados.Isto signi�ca que a linguagem permite �as vari�aveis nomear os dados de determinado tipoe fornecer um conjunto de opera�c~oes que manipulam essas vari�aveis.Alguns tipos de dados s~ao fornecidos de maneira simples, pois j�a est~ao embutidos noconjunto de instru�c~oes da m�aquina do computador ou �e inclu��do como um tipo abstratopelo usu�ario. Em outras palavras, para calcular o valor de uma express~ao constitu��da porvari�aveis de tipos de dados embutidos(prede�nidas) ou inclu��das pelo usu�ario(tipo abstra-do de�nido pelo usu�ario) tudo que precisamos fazer �e fornecer a express~ao a ser calculadaao compilador, sem necessidade, portanto, de construir um programa para calcular essaexpress~ao. Para esses tipos de dados tudo se passe como se o computador fosse umam�aquina de calcular. Exemplos de tipos embutidos na maioria das linguagens de progra-ma�c~ao s~ao: os n�umeros inteiros, os naturais, os reais etc. Outros tipos de dados precisamde um esfor�co consideravelmente maior para a sua implementa�c~ao. Em algumas lingua-gens existem dispositivos que permitem construir as combina�c~oes dos tipos embutidos.�E importante observar que a de�ni�c~ao(especi�ca�c~ao) de um tipo abstrato de dados n~aonos diz como ele ser�a implementado numa linguagem de programa�c~ao.Desenvolveremos algoritmos e estruturas de dados no contexto de orienta�c~ao a objetousando C++. Por isso projetaremos cada estrutura de dados como um tipo abstrato quede�ne tanto a organiza�c~ao dos dados quanto as opera�c~oes que manuseiam esses dados,assim como as rela�c~oes entre eles. Essa estrutura, chamada tipo abstrato de da-dos(TAD), �e um modelo abstrato que descreve a interface entre um cliente(o usu�ario) eos dados. A linguagem de programa�c~ao C++ providencia o conceito de classe(class) paraimplementar ou representar um TAD e os itens do tipo classe, chamado objetos, paraarmazenar e manuzear dados numa aplica�c~ao.A abstra�c~ao de�ne o dom��nio e a estrutura de dados, assim como uma cole�c~ao deopera�c~oes que acessam esses dados.Formato de um TADUm TAD �e constitu��do dos seguintes elementos:� o seu nome;� uma descri�c~ao dos tipos de dados;

Page 121: ~ Linguagem de Programacao e Estruturas De

6.2. TIPOS ABSTRATOS DE DADOS 121� uma lista de opera�c~oes;� uma lista de rela�c~oes.Para cada opera�c~ao(uma rela�c~ao ser�a vista como uma opera�c~ao booleana) deveremosespeci�car:� Os valores de entrada que s~ao fornecidos pelo cliente.� A precondi�c~ao que deve ser aplicada aos dados antes que a opera�c~ao possa serefetuada.� O processo que �e efetuado pela opera�c~ao.� Os valores de sa��da que s~ao retornados aos clientes.� A p�oscondi�c~ao que indica qualquer altera�c~ao nos dados.Muitos TAD's tem uma opera�c~ao de inicializa�c~ao, o inicializador que atribui valoresiniciais aos dados. No ambiente C++, o inicializador �e chamado um construtor.Assim um TAD tem o seguinte formato:

Page 122: ~ Linguagem de Programacao e Estruturas De

122 CAP�ITULO 6. DADOS ESTRUTURADOSTAD nomeDoTADDadosDescreve a estrutura dos dadosOpera�c~oesConstrutorValores iniciais: Dados usados para inicializar os objetos.Processo: Inicializa os objetos.Opera�c~ao1Entrada: Dados do cliente.Precondi�c~oes: O estado necess�ario do sistema antes de executar.a opera�c~ao.Processo: A�c~oes efetuadas sobre os dados.Sa��da: Dados retornados pelo cliente.P�oscondi�c~ao: O estado do sistema ap�os executar a opera�c~ao.Opera�c~ao2Opera�c~ao3...Opera�c~aoN�m nomeDoTAD6.3 Tipos de dados b�asicosA seguir, por quest~ao de completude, introduziremos uma s�erie de tipos de dados b�asicosque incluem os n�umeros, os caracteres, tipos enumerados de�nidos pelo usu�ario e pon-teiros. Estes tipos est~ao embutidos na maioria das linguagens de programa�c~ao. Cadatipo de dados b�asico inclui dados e opera�c~oes, os componentes de um tipo abstrato dedados(TAD). As linguagens de programa�c~ao implementam TAD's no computador usandodiferentes representa�c~oes para os dados, incluindo n�umeros bin�arios e o conjunto de carac-teres ASCII. Continuaremos usando a linguagem de programa�c~ao C++ para implementaros TAD's.Os tipos n�umeros, caracteres e ponteiros descrevem dados simples porque os objetosdesses tipos n~ao podem ser divididos em partes mais simples. Por outro lado, os tipos dedados estruturados tem componentes que s~ao constru��dos de tipos simples com regras parade�nir rela�c~oes entre suas componentes. Dentre os tipos estruturados est~ao as matrizes1,1Alguns autores chamam esses tipos de vetores. Usaremos sem nenhuma mens~ao expl��cita qualquer

Page 123: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 123strings(cadeias), registros(ou estruturas, como eles s~ao denominados em C++), arquivos,listas, pilhas, �las, �arvores, grafos e tabelas. Estudaremos os tres primeiros, deixandosos demais para o pr�oximo curso denominado \Algoritmo e estruturas de dados". Muitaslinguagens de programa�c~ao providenciam construtos ou biblioteca de fun�c~oes para mani-pular matrizes, strings, registros, arquivos. 2 Como tal, chamaremos esses tipos de dadosestruturados de tipos embutidos. Providenciaremos tipos de dados abstratos para essestipos estruturados embutidos e discutiremos suas implementa�c~oes em C++.Tipos inteirosOs inteiros positivos ou negativos consistem de um sinal e uma sequencia de d��gitos. Aosinteiros nos referiremos como n�umeros com sinal. Por exemplo, o que segue s~ao exemplosde valores inteiros espec���cos chamados constantes inteiras:+35; �278; 19(o sinal �e +); �28976510Quem estiver familiarizado com a aritm�etica elementar sabe que podemos de�nir umas�erie de operadores que resultam em novos valores inteiros. Operadores que recebem ouum simples operando(operadores un�arios) ou dois operandos(operadores bin�arios) criamexpress~oes inteiras:(Un�ario +) +35 = 35 (subtra�c~ao -) 73 - 50 = 23(Adi�c~ao +)4 + 6 = 10 (Multiplica�c~ao *) -3*7 = -21As express~oes inteiras podem ser usadas com os operadores relacionais da aritm�eticapara produzir um resultado que seja verdadeiro ou falso.(Menor do que relacional) 5 < 7 (verdade)(Maior do que ou igaul relacional) 10>=18 (falso)Teoricamente, os inteiros n~ao possuem limites de tamanho, um fato que est�a re etidona de�ni�c~ao do TAD.Os TAD's que providenciaremos para os tipos primitivos assumem que o aluno estejafamiliarizado com as precondi�c~oes, a entrada e as p�oscondi�c~oes para cada opera�c~ao. Porexemplo, uma especi�ca�c~ao da divis~ao inteira �e:Divis~ao inteiraEntrada: Dois valores inteiros u e v.Precondi�c~oes: O denominador v n~ao pode ser 0.um desses dois nomes.2Mais recentemente, a partir de 1998, a linguagem C++ est�a providenciando classes abstratas at�epara essas outras estruturas de dados.

Page 124: ~ Linguagem de Programacao e Estruturas De

124 CAP�ITULO 6. DADOS ESTRUTURADOSProcesso: Divide u por v, usando a divis~ao inteira.Sa��da: O valor do quociente.P�oscondi�c~oes: Vai existir uma condi�c~ao de erro se v=0.Em nossas especi�ca�c~oes, usaremos a nota�c~ao de operadores de C++ em lugar denomes de opera�c~oes gen�ericas e tamb�em somente descreveremos processo.O TAd inteiro �eDadoUm n�umero inteiro N com sinal.Opera�c~oesAssuma que u e v s~ao express~oes inteiras, e N �euma vari�avel inteira.Atribui�c~ao= N = u Atribui o valor da express~ao u �a vari�avel N.Operadores aritm�eticos bin�arios+ u + v Adiciona dois valores inteiros.- u - v Subtrai dois valores inteiros.* u * v Multiplica dois valores inteiros./ u / v Computa o quociente usando divis~ao inteira.% u % v Computa o resto usando divis~ao inteira.Operadores aritm�eticos un�arios- -u Troca o sinal (Menos un�ario).+ +u +u �e o mesmo que u (Mais un�ario).Operadores relacionais(A express~ao relacional �e verdadeira sob a condi�c~aodada.)== u == v Resulta verdadeiro se u �e igual a v.!= u != v Resulta verdadeiro se u n~ao for igual a v.< u < v Resulta verdadeiro se u for menor que v.<= u <= v Resulta verdadeiro se u for menor ou iguala v.> u > v Resulta verdadeiro se u for maior que v.>= u >= v Resulta verdadeiro se u for maior ou iguala v.fim TAD inteiro.

Page 125: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 125Exemplo 32 3 + 2 (A express~ao tem valor 5)val = 25 / 20 (val = 1)resto = 25 % 20 (resto = 5)Armazenamento dos inteiros no computadorA implementa�c~ao dos inteiros �e providenciada pelas declara�c~oes de tipo numa linguagemde programa�c~ao e o hardware do computador. Os sistemas de computa�c~ao armazenam osinteiros em blocos de mem�oria de tamanho �xo. O dom��nio de valores resultante pertencea um intervalo �nito. O tamanho do bloco de armazenamento e o intervalo de valoresdependem da implementa�c~ao. Para conseguir certa padroniza�c~ao, as linguagens de pro-grama�c~ao fornecem tipos de dados primitivos embutidos para os inteiros pequenos(short) egrandes(long). Quando s~ao necess�arios valores inteiros muito grande, uma aplica�c~ao de-ve fornecer uma biblioteca de subprogramas para efetuar essas opera�c~oes. Uma bibliotecade opera�c~oes sobre os inteiros pode estender a implementa�c~ao dos inteiros para qualquertamanho, embora usualmente as rotinas diminuam a e�ciencia de execu�c~ao de uma apli-ca�c~ao.Num computador, os inteiros s~ao armazenados como n�umeros bin�arios, que consis-tem de diferentes sequencias dos d��gitos 0 e 1. A representa�c~ao �e modelada na base 10ou sistema decimal, que usa os d��gitos 0, 1, 2, ..., 9. Um n�umero decimal �e armazenadoocomo um conjunto de d��gitos d0; d1; d2; etc., representando as potencias de dez. Porexemplo, o n�umero de k�d��gitosN10 = dk�1dk�2:::d1d0; para 0 � di � 9representaN10 = dk�1(10k�1) + dk�2(10k�2) + :::+ di(10i) + :::+ d1(101) + d0(100)O ��ndice 10 indica que N est�a escrito como um n�umero decimal. Por exemplo, on�umero inteiro de 4-d��gito 2589 representa258910 = 2(103) + 5(102) + 8(101) + 9(100) = 2(1000) + 5(100) + 8(10) + 9Os inteiros bin�arios usam os d��gitos 0 e 1 e as potencias de 2(20 = 1; 21 = 2; 22 =4; 23 = 8; 24 = 16; etc.). Por exemplo, 1310 tem a representa�c~ao bin�aria1310 = 1(23) + 1(22) + 0(21) + 1(20) = 11012Um d��gito bin�ario �e chamado um bit. Em geral, um n�umero bin�ario com k�d��gito ouk�bit tem a representa�c~ao

Page 126: ~ Linguagem de Programacao e Estruturas De

126 CAP�ITULO 6. DADOS ESTRUTURADOS0 0 1 0 0 0 1 1Figura 6.1: O n�umero 35 como um byteN2 = bk�1bk�2:::bi:::b1b0 = bk�1(2k�1) + bk�2(2k�2) + ::: + bi(2i) + ::: + b1(21) +b0(20); 0 � bi � 1O seguinte n�umero de 6-bit �e a representa�c~ao bin�aria de 42. O valor decimal de umn�umero bin�ario �e computado adicionando os termos na soma:1010102 = 1(25) + 0(24) + 1(23) + 0(22) + 1(21) + 0(20) = 4210Exemplo 33 Calcular o valor decimal do n�umero bin�ario:1. 1101012 = 1(25) + 1(24) + 0(23) + 0(21) + 1(22) + 1(20) = 53102. 100001102 = 1(27) + 1(22) + 1(21) = 13410A convers~ao de um n�umero decimal a seu equivalente bin�ario pode ser feito achandoa maior potencia de 2 que seja menor ou igual ao n�umero. A progress~ao das potencias de2 s~ao 1, 2, 4, 8, 16, 32, 64, etc. Isto fornece o d��gito principal na representa�c~ao bin�aria.Preenchendo o resto das potencias de 2 com 0. Por exemplo, considere o valor 35. Amaior potencia de 2 que �e menor que 35 �e 32 = 25, o que implica que 35 �e um n�umerobin�ario de 6 d��gitos:3510 = 1(32) + 0(16) + 0(4) + 1(2) + 1 = 1000112Os n�umeros bin�arios puros s~ao simplesmente a soma das potencias de 2. Eles n~aopossuem sinal e s~ao designados por n�umeros sem sinal(unsigned). Os n�umeros repre-sentam inteiros positivos. Os inteiros negativos usam a representa�c~ao do complemento dedois ou a magnitude de sinal. Em qualquer um desses formatos, um bit especial, chamadobit de sinal, indica o sinal do n�umero.Dados na mem�oriaOs n�umeros s~ao armazenados na mem�oria como sequencias de d��gitos bin�arios de com-primento �xo. Dentre os comprimento mais comuns est~ao 8, 16 e 32 bits. Uma sequenciade 8 bits �e chamada um byte.A tabela 6.1 fornece o intervalo dos n�umeros com sinal e sem sinal para os tamanhosmais comuns.

Page 127: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 127Tamanho intervalo dos n�umeros sem sinal intervalo dos n�umeros com sinal8(1 byte) 0 a 255 = 28 � 1 �27 = �128 a 127 = 27 � 116(2 bytes) 0 a 65.535=216 � 1 �215 = �32768 a 32767 = 215 � 132(4 bytes) 0 a 4.294.967.295=232 � 1 �231 a 231 � 1Tabela 6.1: Intervalos dos n�umeros e tamanho dos bitsendere�cos 01010111 00000001 111101000 1 2 3 4 5Figura 6.2: Uma vista da mem�oriaA mem�oria do computador �e uma sequencia de bytes referenciada pelos endere�cos 0, 1,2, 3, 4 e assim por diante. Na mem�oria, o endere�co do inteiros �e a localiza�c~ao do pri-meiro byte da sequecia. A �gura 6.4 ilustra uma vista da mem�oria com o n�umero 87710 =10101112 armazenado em um byte no endere�co 3, e o n�umero 50010 = 00000001111101002na mem�oria de endere�co 4.Representa�c~ao de inteiros em C++Os tipos inteiros em C++ s~ao int, short int e long int. O tipo short int(short) forneceum valor inteiro de 16-bits no intervalo -32768 a 32767. O tipo long int(long) forneceo maior intervalo de valores inteiros e na maioria dos sistemas �e implementado com 32bits(4 bytes), com um intervalo de �231 a 231 � 1.O tipo int, em geral, identi�ca os inteiros e s~ao dependentes da m�aquina e do com-pilador. Tipicamente, os compiladores usam inteiros de 16-bits ou 32-bits. Em algunscasos, o usu�ario pode selecionar o tamanho do inteiro como uma op�c~ao. Os tipos dedados inteiros especi�cam um dom��nio de valores de dados e um conjunto de operadoresaritm�eticos e relacionais. Cada tipo de dados fornece uma implementa�c~ao do TAD inteirocom a restri�c~ao de que os valores inteiros estejam no intervalo �nito.Tipos de caracteresOs tipos de dados caracteres incluem itens alfanum�ericos que de�nem as letras min�usculase mai�usculas, d��gitos, sinais de pontua�c~ao e alguns s��mbolos especiais. A ind�ustrias decomputadores usam representa�c~oes diferentes de caracteres nas aplica�c~oes. O conjuntode caracteres com 128 elementos na tabela ASCII tem a mais ampla aplica�c~ao no pro-cessamente de palavras, entrada e sa��da de textos e comunica�c~ao de dados. Usaremos oconjunto ASCII para nosso TAD de caracteres. Assim como os inteiros, os caracteresASCII cont�em uma rela�c~ao de ordem que de�ne uma s�erie de operadores relacionais. Pa-ra os caracteres alfanum�ericos, as letras seguem a ordem do dicion�ario. Nesta rela�c~ao,

Page 128: ~ Linguagem de Programacao e Estruturas De

128 CAP�ITULO 6. DADOS ESTRUTURADOStodas as letras mai�usculas s~ao menores que as letras min�usculas:T < W; b < d; T < bO TAD caracteres �eDadosO conjunto de caracteres da tabela ASCII.Opera�c~oesAtribui�c~aoUm valor de caractere pode ser atribu��do a uma vari�avelde caractere.RelacionalOs seis operadores relacionais padr~ao se aplicam a caracteresusando a rela�c~ao de ordem do dicion�ario da tabela ASCII.fim TAD caracteresOs caracteres ASCIIA maioria dos sistemas de computadores usam o esquema de c�odigo padr~ao ASCII paraa representa�c~ao de caracteres. Os caracteres ASCII s~ao armazenados como um c�odigo deinteiros de 7-bits em um n�umero de 8-bits. Os 27 = 128 c�odigos diferentes s~ao divididosem 95 caracteres imprim��veis e 33 caracteres de controles. Um caractere de controle �eusado em comunica�c~ao de dados e faz com que um dispositivo forne�ca uma fun�c~ao decontrole, como o movimento de um cursor para cima e para baixo na tela do monitor.A tabela 6.3 mostra o conjunto de caracteres imprim��veis ASCII. O caractere branco�e representado por }. O c�odigo decimal para cada caractere �e dado com os dez d��gitosnas linhas e um d��gito nas colunas. Por exemplo, O caractere `T' tem valor ASCII 8410e �e armazenado em bin�ario como 010101002 .Dentro do conjunto de caracteres ASCII, os d��gitos decimais e os caracteres alfab�eticoscaem dentro de um intervalo bem de�nido(tabela 6.2). Isto facilita a convers~ao entreletras mai�usculas e min�usculas e de um d��gito ASCII(`0', `1', ..., `9') ao n�umero corres-pondente(0, 1, ..., 9).Exemplo 34 Os valores ASCII para os d��gitos '0` �e 48. Os d��gitos s~aoordenados no intervalo de 48 a 57:D��gito ASCII: `3' �e 51(48 + 3)

Page 129: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 129D��gitos da direitaD��gitos da esquerda 0 1 2 3 4 5 6 7 8 93 } ! " # $ % & 04 ( ) � + ` � : = 0 15 2 3 4 5 6 7 8 9 : ;6 < = > ? @ A B C D E7 F G H I J K L M N O8 P Q R S T U V W X Y9 Z [ n ] ^ ` a b c10 d e f g h i j k l m11 n o p q r s t u v w12 x y z f j gFigura 6.3: Conjunto de caracteres ASCII imprim��veisCaracteres Decimal Bin�arioEspa�co em branco 32 00100000d��gitos decimais 48-57 00110000-00111001Letras mai�usculas 65-90 00110000-00111001Letras min�usculas 97-122 01100001-01111010Tabela 6.2: Intervalo dos caracteres ASCII

Page 130: ~ Linguagem de Programacao e Estruturas De

130 CAP�ITULO 6. DADOS ESTRUTURADOSOs d��gitos num�ericos correspondentes �e obtido subtraindo `0'(48 ASCII):D��gito num�erico: 3 = `3' - `0' = 51 = 48Para converter um caractere de min�uscula para mai�usculas, adicione 32ao valor ASCII do caracterre:ASCII(`A')=65 ASCII(`a') = 65 + 32 = 97Em C++, o tipo primito char �e usado para armazenar um caractere. Os c�odigosASCII est~ao no intervalo 0-127: entretanto, encontramos, com frequencia, dependentes-do-sistema, caracteres estendidos de�nidos para usar o resto dos valores no intervalo.Como um tipo de dados inteiros, o valor �e o c�odigo para o caractere.Tipos de dados reaisOs tipos inteiros, que nos referimos como tipos discretos, representam valores de dadosque podem ser contados, por exemplo, -2, -1, 0, 1, 2, 3, e assim por diante. Muitas apli-ca�c~oes requerem n�umeros que tem valores fracion�arios. Esses valores, chamados n�umerosreais, podem ser representados num formato de ponto �xo com uma parte inteira e umaparte fracion�aria: 9; 6789 � 6; 245 + 18; 23Os n�umeros reais podem ser escritos como n�umeros em ponto utuante em nota�c~aocient���ca. Este formato representa os n�umeros como uma s�erie de d��gitos chamados amantissa e o expoente, que representam uma potencia de 10. Por exemplo, 6,02 e 23tem uma mantissa de 6,02 e um expoente de 23. Um n�umero de ponto �xo �e exatamenteum caso particular de um n�umero em ponto utuante com um expoente 0. Exatamentecomo para os inteiros e os caracteres, os n�umeros reais constituem um tipo abstrato dedados. A aritm�etica padr~ao e as opera�c~oes racionais se aplicam com a divis~ao real usadano lugar da divis~ao inteira.1. O TAD real �eDadosN�umeros descritos com o formato ponto-fixo ou ponto flutuante.Opera�c~oesAtribui�c~oesUma express~ao real pode ser atribu��da a uma vari�avel real.

Page 131: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 131Operadores aritm�eticosAs opera�c~oes aritm�eticas padr~ao un�aria e bin�arias se aplicamcom a divis~ao real usada no lugar da divis~ao inteira. N~ao existeoperador de resto.Operadores relacionaisOs seis operadores relacionais padr~ao se aplicam aos n�umeros reais.fim TAD realRepresenta�c~ao dos n�umeros reaisExatamente como os inteiros, o dom��nio dos n�umeros reais n~ao tem limite. Os valores dosn�umeros s~ao ilimitados nas dire�c~oes negativas e positivas. A parte fracion�aria aplica osn�umeros reais sobre o cont��nuo de pontos numa linha reta. Os n�umeros reais s~ao imple-mentados num bloco de armazenamento �nito que limita o escopo dos valores, formandopontos discretos numa reta.Durante muitos anos, os pesquisadores de computadores tem usado v�arios tipos deformatos para armazenar os n�umeros em ponto utuantes. O formato IEEE(Instituteof Electrical and Eletronics Engineers) �e um padr~ao muito usado. Os n�umeros reais noformato em ponto-�xo s~ao separados numa parte inteira e numa parte fracion�aria cujosd��gitos s~ao multiplicados por 110, 1100, 11000, e assim por diante. Uma v��rgula decimalseparam as partes:25; 638 = 2(101) + 5(100) + 6(10�1) + 3(102) + 8(103)Assim como para os n�umeros inteiros, existem representa�c~oes bin�arias correspondentespara os n�umeros reais de ponto �xo. Essses n�umeros cont�em uma parte inteira, uma partede fra�c~ao bin�aria e uma v��rgula bin�aria, com os d��gitos fracion�arios correspondentes a 12 ,14 , 18 , e assim por diante. A forma geral para tal representa�c~ao �eN = bn:::b0:b�1b�2::: = bn2n + :::+ b020 + b�12�1 + b�22�2 + :::Por exemplo,10111; 11012 = 1(23) + 1(21) + 1(20) + 1(2�1) + 1(2�2) + 1(2�4) = 8 + 2 + 1 + 0; 5 +0; 25 + 0; 0625 = 11; 812510A convers~ao de n�umeros decimais para n�umeros bin�arios em ponto utuante usa algo-ritmos an�alogos �aqueles desenvolvidos para n�umeros inteiros. A convers~ao para n�umerosdecimais �e realizada adicionando os produtos dos d��gitos e as potencias de 10. O processo

Page 132: ~ Linguagem de Programacao e Estruturas De

132 CAP�ITULO 6. DADOS ESTRUTURADOSinverso �e mais complexo, pois os n�umeros podem precisar de uma representa�c~ao bin�ariain�nita para criar o n�umero em ponto utuante equivalente. No computador, o n�umero ded��gitos �e limitado pois somente s~ao usados n�umeros em ponto utuante de comprimento�xo.Exemplo 35 Converter um n�umero bin�ario em ponto �xo para decimal:1. 0; 011012 = 14 + 18 + 132 = 0; 25 + 0; 125 + 0; 03125 = 0; 4062510Converter o n�umero decimal para um n�umero bin�ario em ponto utuant.2. 4; 312510 = 4 + 0; 25 + 0; 0625 = 100; 010123. O n�umero decimal 0,15 n~ao tem uma fra�c~ao bin�aria de compriemento�xo equivalente. A convers~ao de um decimal para uma fra�c~ao bin�ariarequer uma expan�c~ao in�nita bin�aria. Pelo fato do armazenamento docomputador ser restrito a n�umeros de comprimento �xo, a cauda da ex-pan�c~ao in�nita �e uma soma parcial �nita que �e uma aproxima�c~ao dovalor decimal:0; 1510 = 18 + 164 + 1128 + 11024 + ::: = 0; 0010011001:::Muitos computadores armazenam n�umeros reais na forma bin�aria usando nota�c~aocient���ca, com um sinal, mantissa e expoente:N = +DnDn�1:::D1D0; d1d2:::dn � 2eC++ suporta tres tipos de dados reais, oat, double, e double long. O tipo doublelong est�a dispon��vel para c�alculos que requerem alta precis~ao e n~ao usaremos em nossasnotas. Com frequencia, o tipo oat �e implementado usando o formato IEEE de ponto utuante de 32-bits, enquanto o formato de 64-bits �e usado para o tipo double.Tipos enumeradosO conjunto de caracteres ASCII usa uma representa�c~ao inteira dos dados caracteres.Uma representa�c~ao similar pode ser usada para descrever conjuntos de dados de�nidospelo programador. Por exemplo, o que segue �e uma listas dos mezes de 30 dias:abril; junho; setembro; novembroO conjunto dos meses forma um tipo de dados enumerado. Para cada tipo, aordem dos itens �e determinado pela maneira como os itens s~ao listados. Por exemplo,

Page 133: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 133Cor do cabelopreto // primeiro valorloiro // segundo valorcastanho // terceiro valorfogo // quarto valorpreto loiro castanho fogoO tipo suporta uma opera�c~ao de atribui�c~ao e os operadores relacionais padr~ao.Por exemplo,preto<fogo // preto ocorre antes de fogocastanho>=loiro // castanho ocorre ap�os loiroUm tipo enumerado tem dados e operadores e portanto constitui um TAD.o TAD enumerado �eDadosLista de N itens distintos definidos pelo usu�ario.Opera�c~oesAtribui�c~aoQualquer item da lista pode ser atribu��do a uma vari�aveldo tipo enumerado.Operadores relacionaisOs seis operadores relacionais usam a rela�c~ao de ordem determinadapelos itens que s~ao listadas.fim do TAD enumeradoImplementa�c~ao em C++ do tipo enumeradoC++ tem um tipo enumerado que de�ne valores inteiros distintos referenciados pelasconstantes nomeadas.Exemplo 36 O tipo booleano pode ser declarado como um tipo enume-rado. O valor da constante falsa �e 0, e o valor de verdadeiro �e 1. Avari�avel pronto �e de�nida como booleana com valor inicial falsa.enum booleana {falsa, verdadeira};booleana pronto = falsa;

Page 134: ~ Linguagem de Programacao e Estruturas De

134 CAP�ITULO 6. DADOS ESTRUTURADOSchar=`A'5000(a) short int = 255000 5001(b)Figura 6.4: Tipo de dados ponteiroOs meses do ano s~ao declarados como um tipo enumerado. Por con-ven�c~ao, o valor inicial de janeiro �e 0. Entretanto, a sequencia inteirapode come�car num outro valor, contanto que se atribua esse valor ao pri-meiro item. Neste caso, jan �e 1 e os meses correspondem �a sequencia 1,2, ..., 12.1. enum mes {jan=1, fev, mar, abril, maio, jun, jul, aug, set, out, nov, dez};mes = dec;PonteirosO tipo de dados ponteiro �e fundamental em qualquer linguagem de programa�c~ao. Umponteiro �e um inteiro sem sinal que representa um endere�co de mem�oria. O ponteirotamb�em serve como uma referencia aos dados no endere�co. No endere�co do ponteiro, otipo do dado �e chamado um tipo base e �e usada na de�ni�c~ao do ponteiro. Por exemplo,descrevemos um ponteiro para um caractere, um ponteiro para um inteiro, e assim pordiante. Por exemplo, o ponteiro ptr tem valor 500 em cada um dos casos da �gura 6.4.Entretanto, em (a) o ponteiro referencia um caractere e em (b) o ponteiro referencia uminteiro short.Um ponteiro possibilita um acesso e�ciente aos itens numa lista e �e fundamental nodesenvolvimento de estruturas de dados dinamicas tais com listas encadeadas, �arvores egrafos.O TAD ponteiroExatamente como um n�umero, um ponteiroo faz uso de certos operadores aritm�eticos erelacionais. As opera�c~oes aritm�eticas requerem aten�c~ao especial. Um ponteiro pode serincrementado ou decrementado por um valor inteiro para referenciar um novo dado namem�oria. Adicionando 1 atualiza o ponteiro para referenciar o pr�oximo item daquela tipona mem�oria. Por exemplo, se ptr aponta para um objeto caractere, ptr + 1 aponta para opr�oximo byte na mem�oria. Adicionar k > 0 tem como efeito mover o ponteiro k posi�c~oesde dados para a direita. Por exemplo, se ptr aponta para um double, ptr + k referencia odouble:

Page 135: ~ Linguagem de Programacao e Estruturas De

6.3. TIPOS DE DADOS B�ASICOS 135N = sizeof(double) � k bytes a direita de pTipo de dados Endere�co corrente Novo endere�cochar p = 5000 p + 1 = 5001int (2 bytes) p = 5000 p + 3 = 5000 + 3*2 = 5006double (4 bytes) p = 5000 p - 6 = 5000 -6*4 = 4976Um ponteiro usa o operador de endere�co \&" que retorna o endere�co na mem�oria deum item de dado. Inversamente, o operador \*" referencia o dado associado ao valor deponteiro. Os ponteiros s~ao ordenados comparando seus valores inteiros sem sinal.A mem�oria dinamica �e uma nova mem�oria alocada durante a execu�c~ao de um pro-grama. A mem�oria dinamica difere da mem�oria est�atica cuja existencia �e determina-da a priori para come�car a execu�c~ao do programa. Discutiremos a mem�oria dinamicanum curso de estruturas de dados. O operador new aceita um tipo t, aloca mem�oriadinamicamente para um item do tipo t e retorna um ponteiro para a mem�oria alocada porele. O operador delete recebe um ponteiro como parametro e destroi a mem�oria dinamicaalocada previamente naquele endere�co.O TAD ponteiro �eDadosO conjunto de inteiros sem sinal que representam um endere�code mem�oria para um item de dado do tipo b�asico t.Opera�c~oesAssuma que u e v s~ao express~oes de ponteiros, i �e uma express~aointeira, ptr �e uma vari�avel de ponteiro, e var �e uma vari�avel do tipo t.Endere�co& ptr = &var Atribui o endere�co de var a ptr.Atribui�c~ao= ptr = u Atribui o valor de ponteiro u a ptr.Deferencia* var = *ptr Atribui o item do tipo t referenciado porptr �a vari�avel var.Aloca�c~ao de Mem�oria Dinamica e Desaloca�c~ao

Page 136: ~ Linguagem de Programacao e Estruturas De

136 CAP�ITULO 6. DADOS ESTRUTURADOSnew ptr = new t Cria mem�oria dinamica para um item do tipot e atribui seu endere�co a ptr.delete delete ptr Destroi a mem�oria dinamica alocada no endere�coptr.Aritm�etica+ u + i Aponta para o item localizado i itens de dados�a direita do item referenciado por u.- u - i Aponta para o item localizado i itens de dados�a esquerda do item refenciado por u.- u - v Retorna o n�umero de elementos do tipo base queest�a entre os dois ponteiros.Operadores relacionaisOs seis operadores relacionais padr~ao se aplicam a ponteiros comparandovalores inteiros sem sinal.fim do TAD ponteiroValores de ponteirosUm valor de ponteiro �e um endere�co de mem�oria que usa 16, 32 ou mais bits, dependendoda arquitetura da m�aquina. Como um exemplo, seja ptr1 um ponteiro para char(1 byte)e ptr2 um ponteiro para um int short(2 bytes).char str[] = "ABCDEFG";char *ptr1 = str; // ptr1 aponta para strshort x = 33;short *ptr2 = &x; // ptr2 aponta para short xOs comandos que seguem ilustram as opera�c~oes fundamentais sobre ponteiros.cout << *ptr1 << endl; // imprime 'A'ptr1+ = 4; // move ptr para a direita 4 caracterescout << *ptr1 << endl; // imprime 'E'ptr1--; // move ptr1 �a esquerda 1 caracterecout << *ptr1 << endl; // imprime 'D'cout << *ptr2 + 3 << endl;// imprime 36 = 33 + 3

Page 137: ~ Linguagem de Programacao e Estruturas De

6.4. O TIPO MATRIZ 137As opera�c~oes de ponteiro new e delete ser~ao discutidos nas notas de curso de estruturasde dados.6.4 O tipo matrizUma matriz �e um exemplo de uma cole�c~ao de dados. Uma matriz unidimensional �euma lista sequencial �nita de elementos do mesmo tipo de dados(matriz homogenea).A sequencia identi�ca o primeiro elemento, o segundo elemento, o terceiro elemento, eassim por diante. A cada elemento est�a associado um ��ndice que identi�ca a posi�c~aodo elemento na lista. Uma matriz tem um operador de ��ndice que possibilita um acessodireto aos elementos na lista para armazenar ou recuperar um item.a0 a1 a2 a3O TAD matriz �eDadosUma cole�c~ao de N itens do mesmo tipo de dados. Os ��ndices s~aoescolhidos no dom��nio de inteiros de 0 a N - 1, que identificama posi�c~ao de um item na lista e permitem acesso direto aos elementos.O ��ndice 0 referencia o primeiro item na lista, o ��ndice 1 referencia osegundo item, e assim por diante.Opera�c~oes�Indice [ ]Entrada: O ��ndicePrecondi�c~oes: O ��ndice est�a no dom��nio de 0 a N - 1.Processo: No lado direito de um comando de atribui�c~ao, o operadorde ��ndice recupera dados do item. No lado esquerdo de umcomando de atribui�c~ao, o operador de ��ndice retorna o endere�codo elemento da matriz que armazena o lado direito da express~ao.Sa��da: Se o operador de ��ndice estiver no lado direito de um comando deatribui�c~ao, a opera�c~ao recupera dados da matriz e retorna os dadosao cliente.P�oscondi�c~ao: Se a opera�c~ao de ��ndice estiver no lado esquerdo, o item da matriz correspondenteser�a alterado.fim do TAD matriz.

Page 138: ~ Linguagem de Programacao e Estruturas De

138 CAP�ITULO 6. DADOS ESTRUTURADOSO tipo matriz embutido em C++Como parte de sua sintaxe b�asica, C++ providencia um tipo matriz est�atica embutidaque de�ne uma lista de itens do mesmo tipo. A declara�c~ao fornece explicitamente otamanho constante N da matriz e especi�ca que os ��ndices est~ao no intervalo de 0 aN � 1. A declara�c~ao no exemplo 37, a seguir de�ne uma matriz est�atica em C++.Usando ponteiros, criaremos mais adiante, no curso de estruturas de dados, matrizesdinamicas.Exemplo 37 1. Declara duas matrizes do tipo double. A matriz x tem 50itens e a matriz y tem 200 itens:double x[50], y[200];2. Declara a matriz a long com tamanho de�nida pela constante inteiratamDaMatriz = 10.const int tamDaMatriz = 10;long a[tamDaMatriz];O ��ndice da matriz, no intervalo de 0 a tamDaMatriz - 1, �e usada para acessar oselementos individuais da matriz. Um elemento no ��ndice i �e representado por a[i].O ��ndice da matriz em C++ �e realizado usando o operador de ��ndice([ ]). Ele �e umoperador bin�ario cujo operando esquerdo �e o nome da matriz e o operando da direita �e aposi�c~ao do elemento na matriz. Os elementos na matriz podem ser acessados em ambosos lados de um operador de atribui�c~ao:a[i] = x; // atribui(armazena) x como dado ao elemento da matrizt = a[i]; // recupera o dado de a[i] e o atribui a vari�avel ta[i] = a[i+1] = x;// atribui x a a[i+1]. Uma segunda atribui�c~ao armazena osos dados de a[i+1] em a[i]Armazenamento numa matriz unidimensionalUma matriz unidimensional em C++ a �e logicamente armazenada como uma sequenciaconsecutiva de itens na mem�oria. Cada item �e do mesmo tipo de dado.a[0] .... a[i]" "endere�co a[0] endere�co a[i]Em C++, um nome de uma matriz �e uma constante e �e considerada como sendo oendere�co do primeiro elemento da matriz. Portanto, na declara�c~ao

Page 139: ~ Linguagem de Programacao e Estruturas De

6.4. O TIPO MATRIZ 139tipo a[tamDaMatriz];o nome, a, da matriz �e uma constante e �e a localiza�c~ao do primeiro elemento a[0].Os lementos a[1], a[2], e assim por diante seguem consecutivamente. Assumindo quesizeof(tipo) = M, a matriz toda, a, ocupa M*tamDaMatriz bytes.a[0] a[1] a[2] a[3]O compilador usa uma tabela para manter um registro das caracter��sticas da matriz.Essa tabela inclui a informa�c~ao do tamanho de cada item, o endere�co de in��cio da matrize o n�umero de elementos na matriz:Endere�co de in��cio: aN�umero de elementos da matriz: tamDaMatrizTamanho do tipo: M = sizeof(tipo)A tabela �e usada tamb�em pelo compilador para implementar uma fun�c~ao de aces-so que identi�ca o endere�co de um item na mem�oria. A fun�c~ao acessoDaMatriz usa oendere�co de in��cio da matriz e o tamanho do tipo de dado para mapear um ��ndice i noendere�co de a[i]:endere�co a[i] = acessoDaMatriz[(a, i, M)]acessoDaMatriz �e dada poracessoDaMatriz(a, i, M) = a + i*M;Exemplo 38 Assuma que oat �e armazenado usando 4 bytes(sizeof( oat)=4)e a altura da matriz come�ca na localiza�c~ao de mem�oria 20000.float altura[35];o elemento altura[18] da matriz est�a localizado no endere�co20000 + 18 � 4 = 20072Limites da matrizO TAD matriz assume que os ��ndices est~ao no intervalo de 0 a N - 1, onde N �e o tamanhoda matriz. C++ faz o mesmo. Na realidade, muitos compiladores C++ n~ao geramo c�odigo que testa se um ��ndice est�a fora do limite durante um acesso a matriz. Porexemplo, a sequencia a seguir seria aceita por muitos compiladores:

Page 140: ~ Linguagem de Programacao e Estruturas De

140 CAP�ITULO 6. DADOS ESTRUTURADOSint v = 20;int a[20]; // o tamanho da matriz �e 20. O ��ndice varia de 0 a 19a[v] = 0; // o ��ndice v �e maior do que o limite superiorUma matriz ocupa mem�oria do espa�co de dados do usu�ario. A fun�c~ao de acessoda matriz identi�ca o endere�co de mem�oria para um elemento particular. Geralmente,n~ao �e feito a checagem para veri�car que o endere�co, de fato, est�a dentro do intervalo doselementos da matriz. Disso resulta que um programa em C++ pode usar ��ndices que est~aofora do intervalo. Os endere�cos dos elementos que est~ao fora do intervalo ainda podemcair dentro do espa�co de dados do usu�ario. No processo, o programa pode sobrecarregaroutras vari�aveis e causar erros de execu�c~ao indesejados.Matrizes bidimensionaisUma matriz bidimensional, �e um tipo de dados estruturado que �e criado aninhando-sematrizes unidimensionais. Os itens s~ao acessados por ��ndices de linhas e colunas. Porexemplo, a matriz de 32 elementos, t, que segue tem 4 linhas e 8 colunas. O valor 10 �eacessado pelo par, (linha, coluna), (1,2) e -3 �e acessado pela par (2,6).0123 0 1 2 3 4 5 6 710 -3O conceito de uma matriz bidimensional pode ser estendida para matriz de qualquerdimens~ao, na qual os elementos s~ao acessados por tres ou mais ��ndices. Matrizes de duasdimens~oes tem aplica�c~oes desde processamento de dados at�e equa�c~oes diferenciais parcias.A declara�c~ao em C++ de matriz bidimensional, t, de�ne o n�umero de linhas, o n�umerode colunas, e o tipo de dados dos elementos:tipo t [contadorDeLinha][contadorDeColuna];Os elementos de t s~ao referenciados pelos ��ndices de linhas e colunas:t[i][j]; 0 � i � contadorDeLinha � 1; 0 � j � contadorDeColuna � 1Por exemplo, t �e uma matriz de inteiros 4 por 8:int t[4][8];

Page 141: ~ Linguagem de Programacao e Estruturas De

6.5. VARI �AVEIS E LITERAIS DE STRING 141O valores t[1][2] = 10 e t[2][6] = -3 s~ao, respectivamente, 10 �e o valor da segundalinha e terceira coluna, e -3 �e o valor na terceira linha e s�etima coluna.Poderemos pensar de uma matriz bidimensional como uma lista de matrizes unidi-mensional. Por exemplo, t[0] est�a na linha 0, que consiste de elementos individuais decontadorDeColuna. Este conceito �e �util quando uma matriz bidimensional �e passada comoparametro. A nato�c~ao int t[ ][8] indica que t �e uma lista de matrizes de 8 elementos.0 1 2 3 4 5 6 7t[0]t[1] 10t[2] -3t[3]Armazenamento de matrizes bidimensionaisUma matriz bidimensional pode ser inicializada atribuindo de cada vez uma linha aositens. Por exemplo, a matriz t especifca uma tabela 2 por 4:int t[3][4] = {{290,5,-30},{-40,13,32,8},{3,0,0,-1}};Como na matriz unidimensional, os itens s~ao armazenados na ordem primeira linha,segunda linha, terceira linha.6.5 Vari�aveis e literais de stringUma matriz �e um tipo de dados estruturado que cont�em uma lista homogenea de itens.Uma forma especial de matriz cont�em dados de caracteres que identi�cam nomes, pala-vras, senten�cas e assim por diante. Essa estrutura, chamada uma string(cadeia), trataos caracteres como uma �unica entidade e providencia opera�c~oes para acessar sequenciasde caracteres dentro da string. Uma string �e uma estrutura de dados cr��tica para mui-tas aplica�c~oes que usam dados alfanum�ericos. A estrutura �e necess�aria para manipularprocessamento de textos com suas opera�c~oes para editar, seus algoritmos para pesquisar-substituir e assim por diante. Por exemplo, um linguista pode precisar da informa�c~ao don�umero de vezes que uma certa palavra ocorre num documento ou um programador podeusar o padr~ao encontrar/substituir para alterar o c�odigo fonte num documento. Muitaslinguagens declaram a estrutura string, providenciam operadores embutidos e fun�c~oes debibliotecas para manipular strings.Para determinar o comprimento de uma string, a estrutura pode incluir um 0 no �m dastring(NULL-�m do string) ou um parametro de comprimento separado. A representa�c~aoda string seguinte cont�em o string de seis caracteres STRING.

Page 142: ~ Linguagem de Programacao e Estruturas De

142 CAP�ITULO 6. DADOS ESTRUTURADOSS T R I N G NULLContador de comprimento da string6comprimento S T R I N GUma s�erie de opera�c~oes processam uma string como um �unico bloco de catacteres.Por exemplo, podemos determinar o comprimento de uma string, copiar uma string emoutra, juntar(concatenar) strings, e processar substrings com inser�c~ao, remo�c~ao e ope-ra�c~oes de casamento de padr~ao. As strings tamb�em tem uma opera�c~ao de compara�c~aoque possibilitam a ordena�c~ao de strings. A opera�c~ao usa a ordem ASCII. Por exemplo,"Bernado" �e menor que "Martin" // B v�em antes de M"Smith" �e menor que "Smithson""Bernado" v�em antes de "bernado" // o B mai�usculo precede o b min�usculo"123Sim" �e menor que "AAA" // n�umeros precedem letrasO TAD string �eDadosUma string �e uma sequencia de caracteres com um comprimentoassociado. A estrutura string pode ter um caractere de termina�c~aoNULL ou um parametro de comprimento separado.Opera�c~oesComprimentoEntrada: NenhumaPrecondi�c~oes: NenhumaProcesso: Para uma string terminando em NULL, conta os caracteresat�e o caractere NULL. Para uma string com contador de comprimento,recupera o valor do comprimento.P�oscondi�c~oes: NenhumaSa��da: Retorna o comprimento a string.C�opiaEntrada: Duas strings str1 e str2. str2 �e a fonte e str1 o destino.Precondi�c~oes: NenhumaProcesso: Copia os caracteres de str2 para str1.P�oscondi�c~oes: �E criada uma nova string str1 com comprimento e dados obtidosde str2.

Page 143: ~ Linguagem de Programacao e Estruturas De

6.5. VARI �AVEIS E LITERAIS DE STRING 143Sa��da: Retorna o acesso a str1.Concatena�c~aoEntrada: Dois strings str1 e str2. Junta str2 na cauda de str1.P�oscondi�c~oes: Nenhuma.Processo: Achar o fim de str1. Copiar os caracteres de str2 na cauda de str1.Atualizar a informa�c~ao do comprimento de str1.P�oscondi�c~oes: str1 �e modificada.Sa��da: Retorna acesso a str1.CompareEntrada: Dois str1 e str2.Precondi�c~oes: Nenhuma.Processo: Aplicar a ordem da tabela ASCII para as strings.P�oscondi�c~oes: Nenhuma.Sa��da: Retorna um valor como segue:str1 menor que str2: retorna um valor negativo.str1 igual a str2: retorna valor 0str1 maior que str2: retorna um valor positivo.�IndiceEntrada: Uma string str e um �unico caractere ch.Precondi�c~oes: Nenhuma.Processo: Pesquisa str para a entrada ch.P�oscondi�c~oes: Nenhuma.Sa��da: Retorna o endere�co da localiza�c~ao contendoa primeira ocorrencia de ch em str ou 0 casoo caractere n~ao seja encontrado.��ndiceDaDireitaEntrada: Uma string str e um �unico caractere ch.Precondi�c~oes: Nenhuma.Processo Pesquisa str buscando a �ultima ocorrencia dedo caractere ch.P�oscondi�c~oes: Nenhuma.Sa��da: Retorna o endere�co da localiza�c~ao contendo a�ultima ocorrencia de ch em str ou 0 se caracteren~ao for encontrado.LeiaEntrada: O arquivo stream do qual os caracteres s~ao lidos euma string str contendo os caracteres.

Page 144: ~ Linguagem de Programacao e Estruturas De

144 CAP�ITULO 6. DADOS ESTRUTURADOSPrecondi�c~oes: Nenhuma.Processo: Le uma sequencia de caracteres de stream na string str.P�oscondi�c~oes: Ao string str �e atribu��do os caracteres lidos.Sa��da: Nenhuma.Escreva:Entrada: Uma string que cont�em caracteres para sa��da e uma streampara o qual os caracteres ser~ao escritos.Precondi�c~oes: Nenhuma.Processo: Envia os string de caracteres ao stream.P�oscondi�c~oes: Nenhuma.Sa��da: A stream de sa��da �e modificada.fim do TAD string.Strings em C++Numa outra oportunidade especi�caremos e implementaremos uma classe C++ string.Esta classe conter�a um conjunto estendido de operadores de compara�c~oes e opera�c~oesde E/S(Entrada/sa��da). Aqui, usaremos os strings de C++ com termina�c~ao NULL e abiblioteca de string C++ para implementar o TAD.Um string de C++ �e um string com termina�c~ao NULL com o 0 de ASCII designandoo caractere NULL. O compilador identi�ca um literal de string como uma sequenciade caracteres sob aspas duplas. Uma vari�avel de string �e uma matriz de caracteres quecont�em uma sequencia de caracteres terminando com NULL. A declara�c~ao seguinte criauma matriz de caracteres e atribui a ela um literal de string:char str[9] = "Uma string";A string "Uma string" �e armazenada na mem�oria como uma matriz de caracteres comonze elementos:U m a s t r i n g NULLC++ fornece alguns opradores de E/S para os streams cin(teclado), cout(tela), cerr(tela)e streams de arquivos de�nidos pelo usu�ario.A biblioteca de string C++ < string:h > cont�em uma cole�c~ao de fun�c~oes para ma-nipular strings bastante ex��vel que implementam diretamente muitas das opera�c~oes doTAD. A tabela 6.3 lista as fun�c~oes de strings principais.

Page 145: ~ Linguagem de Programacao e Estruturas De

6.5. VARI �AVEIS E LITERAIS DE STRING 145char s1[20] = \dir/bin/appl", s2[20] = \�le.asm", s3[20];char *p;int resultado;Exemplos1. Comprimento int strlen(char *s);cout << strlen(s1) << endl; // A sa��da �e 12cout << strlen(s2) << endl; // A sa��da �e 82. C�opia char *strcpy(char *s1, *s2);strcpy(s3,s1); // s3 = "dir/bin/appl"3. Concatena�c~ao char *strcat(char *s1, *s2);strcat(s2,"/");strcat(s3,s2); // s3 = "dir/bin/appl/file.asm"4. Compare int strcmp(char *s1, *s2);resultado = strcmp("bernado", "Bernado"); // resultado > 0resultado = strcmp("12", "12"); // resultado = 0resultado = strcmp("Joe", "Joseph"); // resultado < 05. �Indice char *strchr((char *s, int c);p = strchr(s2,'.'); // p aponta para '.' ap�os fileif (p)strcpy(p,".cpp"); // s2 = "file.cpp"6. �IndiceDaDireita char *strrchr(char *s, int c);p = strrchr(s1,'/'); // p aponta para '/' ap�os binif (p)*p = 0; // termina string ap�os bin// s2 = "dirbin"7. Leia vari�avelDeStream >> s;8. Escreva vari�avelDeStream << s;cin >> s1; // se a entrada for "alo mundo"cout << s1; // s1 �e "alo"// sa��da �e "alo"Tabela 6.3: Fun�c~oes de string em C++ e exemplos

Page 146: ~ Linguagem de Programacao e Estruturas De

146 CAP�ITULO 6. DADOS ESTRUTURADOSAplica�c~oes: Revertendo nomesUm programa de aplica�c~ao de string ilustra o uso das fun�c~oes de biblioteca de string C++.Na aplica�c~ao, as fun�c~oes strchr(), strcpy() e strcap() ser~ao combinadas de modo que umnome tal como \Jos�e Dau" seja copiado como \Dau, Jos�e" na string novoNome. Osseguintes comandos implementam o algoritmo.char nome[10] = "Jos�e Dau", novoNome[30];char *p;Comando 1: p = strchr(nome, ` ');Retorna um ponteiro p para o primeiro branco no nome. A primeiraletra do �ultimo nome come�ca no endere�co p + 1.J o s �e D a u NULComando 2: *p = 0; // substitui o branco pelo caractere NULL.J o s �e NULL D a u NULLComando 3: strcpy(novoNome,p+1); // copia o �ultimo nome em novoNomeJ o s �e NULL D a u NULLD a u NULLComando 4: strcat(novoNome, " "); // adiciona `,' e branco ao novoNomeD a u , NULLComando 5: strcat(novoNome, nme); // concatena o primeiro nomeJ o s �e NULLD a u , J o s �e NULLPrograma: Reverter um nomeO programa a seguir usa os comandos de 1 a 5 para reverter um nome. As etapas ser~aocodi�cadas na fun�c~ao reverteNome(). Um la�co testa o algoritmo para tres strings deentrada. Em cada a sa��da �e o nome revertido.

Page 147: ~ Linguagem de Programacao e Estruturas De

6.5. VARI �AVEIS E LITERAIS DE STRING 147#include <iostream.h>#include <string.h>// reverte o primeiro e �ultimo nomes e os separa com v��rgulas, copia// o resultado em novoNome.void reverteNome(char *nome, char *novoNome){ char *p;// busca o primeiro branco em nome e o substitui pelo caractere NULLp = strchr(nome, ` ');*p = 0;// copia o �ultimo nome em novoNome, acrescenta `,' e// concatena primeiro nome.strcpy(novoNome, p+1);strcat(novoNome,nome);strcat(novoNome,nome);// substitui o branco original pelo caractere NULL* = ` ';}void main(void){ char nome[32], novoNome[32];int i;// le e processa tres nomesfor (i = 0; i < 3 ; i++){ cin.getline (nome, 32, `/');reverteNome(nome,novoNome);cout << ``Nome revertido:" << endl << endl;}}Executando esse programa para a entrada ``Jos�e Dau", a sa��da ser�aDau, Jos�e.

Page 148: ~ Linguagem de Programacao e Estruturas De

148 CAP�ITULO 6. DADOS ESTRUTURADOS6.6 RegistrosUm registro �e uma estrutura que combina itens de tipos diferentes num �unico objeto.Os itens no registro s~ao chamados campos. Como na matriz(tamb�em conhecida comovetor ou array), um registro tem um operador de acesso que possibilita um acesso diretoa cada campo. Por exemplo, estudante �e um registro que descreve informa�c~oes sobre umestudante que frequenta uma escola. Dentre as informa�c~oes est~ao: o nome do aluno, oendere�co do local, a idade, curso, m�edia.nome endere�co do local idade curso m�ediaNeste exemplo, os campos nome e endere�co do local s~ao do tipo string, idade �e dotipo inteiro, curso do tipo enumera�c~ao e m�edia do tipo real. Assumindo que Toni �e umestudante, podemos acessar os campos individuais combinando o nome do registro com ocampo, usando o operador \.":Toni.nome Toni.idade Toni.m�edia Toni.cursoUm registro possibilita o agrupamento de tipos diferentes(tipos heterogeneos) naestrutura. Diferentemente da matriz, um registro descreve um valor �unico, em vez deuma lista de valores.O TAD registro �eDadosUm item contendo um conjunto de campos de tipos heterogeneos.Cada campo possui um nome que permite um acesso direto aos dados no campo.Opera�c~oesOperador de acessoPrecondi�c~oes: Nenhuma.Entrada: Nome do registro e do campo.Processo: Acessa os dados no campo.Sa��da: Quando recuperando dados, retorna o valor do campoao cliente.P�oscondi�c~oes: Quando armazenando dados, o registro �e alterado.C++ implementa registro com estruturaC++ possui o tipo embutido struct(estrutura) que representa um registro. Essa estrutura�e herdada da linguagem C com a qual continua compat��vel. C++ de�ne o tipo struct comoum caso especial de uma classe na qual todos os membros s~ao p�ublicos. Usamos o tipoestrutura nestas notas somente quando lidarmos com uma estrutura de registro.

Page 149: ~ Linguagem de Programacao e Estruturas De

6.7. ARQUIVOS(FILE) 149Exemplo 39 struct estudante{ int ident;char nome[30];}estudante s = {555, ``Dau, Samuel"};cout << s.ident << `` " << s.nome << endl;6.7 Arquivos(File)Muitas vezes em nosso curso estaremos interessados no projeto e implementa�c~ao de estru-turas de dados internas, que acessam informa�c~oes residentes na mem�oria. Nas apli-ca�c~oes, entretanto, assumiremos, com frequencia, que os dados estar~ao dispon��veis numdispositivo de armazenamento externo como um disco. O dispositivo(arquivo f��sico)armazena informa�c~oes numa stream(corrente) de caracteres e o sistema operacional pro-videncia uma s�erie de opera�c~oes para transferir para e da mem�oria. Isto nos possibilitaentrar e recuperar dados que possam estar permanentemente armazenados num disposi-tivo externo. Os dados armazenados conjuntamente com as opera�c~oes de transferenciade�ne uma estrutura de dados, chamada um arquivo(�le)(l�ogico), que tem a importantevantagem de manter uma grande quantidade de informa�c~oes que residiriam tipicamentena mem�oria.As linguagens de programa�c~ao proveem opera�c~oes de manipula�c~ao de arquivos em alton��vel para liberar o programador de ter que usar chamadas do sistema operacional de baixon��vel. As opera�c~oes de arquivos usam um dado stream que est�a logicamente conectadoao arquivo. O stream associado aos dados ui com o arquivo. Para a entrada, o streampossibilita que os dados uam do dispositivo externo para a mem�oria. O mesmo programapode recuperar informa�c~oes para o arquivo usando um stream de sa��da.�E �util de�nir um TAD para um arquivo. Os dados consistem de uma sequencia decaracteres que representam dados de texto ou bytes que representam dados bin�arios. Parao texto, os dados s~ao armazenados como uma sequencia de caracteres ASCII separadospelo caracre novaLinha. As opera�c~oes do TAD s~ao dados de modo que sejam bastantegerais, focalizando as opera�c~oes primitivas de E/S. A opera�c~ao de entrada Ler()(Read)extrai uma sequencia de caracteres do stream. A opera�c~ao de sa��da relacionada Escre-ver()(Write) insere uma sequencia de caracteres na stream. As opera�c~oes especiais Get()e Put() manipulam as E/S para um �unico caractere.Uma stream mant�em um ponteiro de arquivo que identi�ca a posi�c~ao corrente nastream. A entrada desloca do ponteiro de arquivo para o pr�oximo item de dado n~ao lido nastream. A sa��da localiza o ponteiro de arquivo na pr�oxima posi�c~ao da sa��da. Uma opera�c~aode procura nos possibilita posicionar o ponteiro de arquivo. Esta opera�c~ao assume que

Page 150: ~ Linguagem de Programacao e Estruturas De

150 CAP�ITULO 6. DADOS ESTRUTURADOStemos acesso a todos os caracteres no arquivo e podemos nos mover para diante, paratr�as, ou uma posi�c~ao intermedi�aria. Tipicamente, a opera�c~ao de procura �e usada para osarquivos de disco.Usualmente, um arquivo �e colocado num stream em um dos tres modos seguintes:ready-only(somente leitura), write-only(somente escrita) e ready-write(leitura escrita). Omodo ready-only e write-only especi�ca que o stream �e usado para entrada e sa��da, res-pectivamente. O modo ready-write possibilita o uxo dos dados em ambas as dire�c~oes.O TAD arquivo �eDadosUma identifica�c~ao do arquivo externo e a dire�c~ao do fluxo de dados. Uma sequencia de caracteres que s~ao lidas de ou escrita no arquivo.Opera�c~oesAbrirEntrada: Nome do arquivo e a dire�c~ao do fluxo.Precondi�c~ao: Para a entrada, o arquivo externo deve existir.Processo: Conecta um stream a um aruivo.Sa��da: Um aviso(flag) que indica que a opera�c~ao foi bem sucedida.P�oscondi�c~oes: Os dados podem fluir entre o arquivo externo e a mem�oria do sistemavia o stream.FecharEntrada: Nenhuma.Precondi�c~oes: Nenhuma.Processo: Desconecta o stream do arquivo.Sa��da: Nenhuma.P�oscondi�c~oes: Os dados n~ao podem mais fluir do arquivo externo viao stream entre o arquivo externo e a mem�oria do sistema.LerEntrada: Uma matriz contendo blocos de dados. Um contador N.Precondi�c~oes: O stream deve estar aberto com dire�c~ao ready-only ou ready-write.Processo: Entram N caracteres do stream na matriz.Para quando for encontrado fim-de-arquivo.Sa��da: Retorna o n�umero de caracteres que forem lidos.P�oscondi�c~oes: O ponteiro de arquivo �e movido para adiante N caracteres.EscreverEntrada: Uma matriz e um contador .Precondi�c~oes: O stream deve estar aberto para a dire�c~ao write-only

Page 151: ~ Linguagem de Programacao e Estruturas De

6.7. ARQUIVOS(FILE) 151ou ready-write.Processo: Sai N caracteres na stream.Sa��da: Retorna o n�umero de caracteres que foram lidos.P�oscondi�c~oes: O stream cont�em os dados de sa��da, e o ponteiro de arquivoavan�ca N caracteres.ProcurarEntrada: Parametros para reinicializar o ponteiro de arquivos.Precondi�c~oes: Nenhuma.Processo: Reinicializa o ponteiro de arquivo.Sa��da: Retorna uma mensagem(flag) que indica se a procurafoi bem sucedida.P�oscondi�c~oes: �E estabelecido um novo ponteiro de arquivo.fim do TAD arquivoHierarquia de stream em C++C++ providencia para que seja possivel manipular o arquivo com um sistema de streamE/S que �e implementado usando uma hierarquia de classe C++. Um stream C++ �e umobjeto correspondendo a uma classe na hierarquia. Cada stream identi�ca um arquivo ea dire�c~ao do uxo de dados.A classe ra��z na hierarquia �e ios, que cont�em dados e opera�c~oes para todas as classesderivadas. A classe cont�em mensagens que identi�cam atributos espec���cos do stream em�etodos de formatos que s~ao precisos para a entrada e sa��da. Por exemplo,cout.setf(ios::fixed);inicializa o modo display(visualiza�c~ao) para os n�umeros reais para o formato �xo emvez do formato cient���co.As classes istream e ostream providenciam opera�c~oes de entradas e sa��das b�asicasque ser~ao usadas como classes base para o resto da hierarquia de stream de E/S.A classe istream-withassigh �e uma variante do stream que possibilita atribui�c~ao deobjetos. O objeto prede�nido cin �e um dessa classe. Os objetos prede�nidos cout e cerrs~ao do tipo de classe ostream-wthassign. Em tempo de execu�c~ao, esses tres streamss~ao abertos para a entrada do teclado e sa��da pela tela. As declara�c~oes est~ao no arquivo< iostream:h >.A classe ifstream �e uma istream derivada usada para a entrada do arquivo de disco.Analogamente, ostream �e usado para a sa��da de arquivo de disco. Essas classes est~aodeclaradas no arquivo < fstream:h >. Ambas as classes cont�em a opera�c~ao abrir(open)para colocar um arquivo no stream e a opera�c~ao fechar(close) para separar um arquivo deum stream.

Page 152: ~ Linguagem de Programacao e Estruturas De

152 CAP�ITULO 6. DADOS ESTRUTURADOSOs dois tipos de arquivos de discos s~ao arquivos de textos e arquivos de bin�arios.Um arquivo de texto cont�em caracteres ASCII e �e imprim��vel, enquanto um arquivo debin�ario cont�em dados bin�arios puros. Por exemplo, um editor usa arquivo de texto eum programa de spreadsheet cria e usam arquivos bin�arios. A seguir apresentaremos umexemplo de um programa de E/S de arquivo de texto e de arquivos de bin�arios os quaisfuturamente ser~ao desenvolvidos como classes. A classe de arquivo bin�ario �e usada paraimplementar busca externa e algoritmos de ordena�c~ao.A classe fstream possibilita ao usu�ario criar e manter arquivos que requeram acessosde leitura e escrita.E/S baseadas em matriz est~ao implementadas pelas classes istream e ostream queest~ao declaradas no arquivo < iostream:h >. Aqui os dados s~ao lidos de uma matriz ouescritos na matriz por um dispositivo externo. Editores de textos usam com frequenciaE/S baseados em matriz para efetuarem opera�c~oes de formata�c~ao complexas.Programa: arquivo E/SEste programa ilustra os streams de C++, incluindo arquivo de texto e E/S baseadas emmatrizes.Este programa usa cout e cerr que est~ao inclu��dos em < iostream:h >. Entradas dearquivos de textos e sa��das baseadas em matrizes usam os arquivos < fstream:h > e< strstream:h >, respectivamente. O programa abre o arquivo e le cada linha contendoos pares vari�avel/valor nos formatos nome valor. Usando a opera�c~ao de stream baseadoem matriz, o par �e escrito na matriz outputstr no formato``nome = valor"e ent~ao com um comando cout. Por exemplo, as linhas de sa��dain��cio 55para 8.5s~ao impressos como os stringsin��cio = 55 pare = 8.5#include <iostream.h>#include <fstream.h>#include <strstream.h>#include <stdlib.h>#include <string.h>void main(void)

Page 153: ~ Linguagem de Programacao e Estruturas De

6.8. APLICAC� ~OES DE MATRIZES E REGISTROS 153{ // arquivo de entrada de texto contendo nomes e valoresifstream fin;// le idenficadores nos nomes e escreve os resultados no outputstrchar nome[30],// declara uma stream de sa��da baseada em matriz que usa outputstrostream outs(outputstr, sizeof(outputstr));double valor;// abre "nomes.dat" para input. Assegura que ele existe.fin.open("nomes.dat", ios::in | ios::nocreate);if (!fin){ cerr << "N~ao �e poss��vel abrir "nomes.dat" " << endl;exit(1);}// ler um nome e valor. Escreve para outs como "nome = valor"while (fin >> nome){ fin >> valor;outs << nome << " = " << valor << " ";}// termina em null o string de sa��daouts << ends;cout << outputstr << endl;}6.8 Aplica�c~oes de matrizes e registrosMatrizes e registros s~ao estruturas de dados embutidos em muitas das linguagens de pro-gama�c~ao. Nesta se�c~ao introduziremos TADs para essas estruturas e discutiremos suasimplementa�c~oes em C++. Usaremos essas estruturas de dados para desenvolver algunsalgoritmos importantes. Uma matriz �e uma estrutura de dados fundamental para listas.

Page 154: ~ Linguagem de Programacao e Estruturas De

154 CAP�ITULO 6. DADOS ESTRUTURADOSEm muitas aplica�c~oes, usaremos busca e ordena�c~ao por troca para encontrar um itemnuma lista baseada em matriz e para ordenar os dados. A seguir, introduzirems a buscasequencial e a ordena�c~ao por trooca que s~ao simples de codi�car e entender.Busca sequencialUma busca sequencial procura um item numa lista usando um valor chamado chave. Oalgoritmo come�ca com um ��ndice fornecido, chamado in��cio, e percorre os itens restantesna lista, comparando cada item com a chave. A pesquisa continua at�e que a chave sejaencontrada ou a lista tenha sido totalmente percorrida. Se a chave for encontrada, afun�c~ao retorna o ��ndice do elemento da lista que casou. Caso contr�ario, �e retornado ovalor -1. A fun�c~ao buscaSeq() requer quatro parametros, o endere�co da lista, o ��ndice dein��cio para a busca, o n�umero de elementos e a chave. Por exemplo, considere a seguintelista de inteiros contida na matriz a:a : 8 3 6 2 61. chave = 6, in��cio = 0, n = 5. Pesquisar a lista do in��cio, retornando o ��ndice daprimeira ocorrencia d o elemento 6.8 3 6 2 62. chave = 6, in��cio = 3, n = 2. Iniciar em a[3] e pesquisar a lista, retornando umponteiro para a primeira ocorrencia do elemento 6.3. chave = 9, in��cio = 0, n = 5. Iniciar no primeiro elemento e procurar na lista oelemento 9. Com ele n~ao ser�a encontrado, retornar o valor -1.O algoritmo da busca sequencial se aplica a qualquer matriz para o qual o operador\==" esteja de�nido para o tipo do item. Um caso mais geral ser�a discutido num cursode estruturas de dados.Fun�c~ao da busca sequencialint buscaSeq(int lista[], int in��cio, int n, int chave){ for (int i=in��cio; i < n; i++){ if (lista[i] == chave)return i;}return -1;}

Page 155: ~ Linguagem de Programacao e Estruturas De

6.8. APLICAC� ~OES DE MATRIZES E REGISTROS 155Programa da busca sequencialEste programa testa a busca sequencial contando o n�umero de ocorrencia de uma chavenuma lista. O programa principal primeiro fornece como entrada 10 inteiros numa mtriza e ent~ao procura uma chave.O programa faz rpetidas chamadas da fun�c~ao buscaSeq() usando diferentes ��ndices parain��cio. Inicialmente, come�camos no ��ndice 0, o come�co da matriz. Ap�os cada chamadade buscaSeq(), o o contador do n�umero de ocorrencias �e incrementado se a chave forencontrada: caso contr�ario a busca termina e o contador �e a sa��da. Se a chave forencontrada, o valor de retorno identi�ca sua posi�c~ao na lista. A pr�oxima chamada parabuscaSeq() �e feita com o in��cio no elemento imediatamente �a direita.#\include <iostream.h>// pesquisa a matriz de inteiros com n elementos procurando um elemento que case com a chave// retorna um ponteiro para o dado ou null caso a chave n~ao seja encontrada.int buscaSeq(int lista[], int in��cio, int n, int chave){ for(int i=in��cio;i < n; i++)if (lista[i] == chave)return i; // retorna o ��ndice do item que casreturn -1; // caso falhe, reorne -1}void main(void){ int a[10];int chave, contador=0, pos;// entra uma lista de 10 inteiroscout << "Entre uma lista com 10 inteiros:";for (pos=0; pos < 10; pos++)cin >> a[pos];cout << "Entre com uma chave:";cin >> chave;// incia a busca no primeiro elemento da matrizpos = 0;// move-se na lista at�e que a chave seja encontrada

Page 156: ~ Linguagem de Programacao e Estruturas De

156 CAP�ITULO 6. DADOS ESTRUTURADOSwhile ((pos = buscaSeq(a,pos,10,chave) !-1){ contador++;// move-se para o pr�oximo inteiro ap�os casarpos++;}cout << chave << "ocorre"<< contador<< "na lista." << endl;}Executando este programa:Entre uma lista com 10 inteiros: 5 2 9 8 1 5 8 7 5 3Entre com uma chave: 55 ocorr 3 vezes na listaOrdena�c~ao por trocaA ordena�c~ao dos itens numa lista �e importante em muitas aplica�c~oes. Por exemplo, umalista de invent�ario pode ordenar registros pelo seu n�umero de partes para permitir umr�apido acesso a um item, um dicion�ario cont�em palavras na ordem alfab�etica, e na ordemdo registro estudantes podem ser ordenados pelo cpf.Para criar uma lista ordenada, introduzimos um algoritmo de ordena�c~ao chamadoordPorTroca() que ordena os itens na ordem ascendente. O algoritmo �e ilustrado coma lista 8, 3, 6, 2 e produz a lista ordenada 2, 3, 6, 8.�Indice 0: Considere a lista completa 8, 3, 6, 2. O item no ��ndice 0 �e comparado comcada item subsequente na lista no ��ndice 1, 2, 3. Para cada compara�c~ao, se o ��ndicesubsequente for menor que o elemento no ��ndice 0, as duas entradas ser~ao trocadas. Ap�ostodas as compara�c~oes terem sidos feitas, o menor elemento estar�a localizado no ��ndice 0.Lista inicial A�c~ao Lista resultante��ndice 0 8 3 6 2 troca���! 3 8 6 23 8 6 2 troca���! 3 8 6 28 3 6 2 troca���! 2 8 6 3�Indice 1: Uma vez que o menor j�a est�a localizado no ��ndice 0, consideremos a sublista8, 6, 3. Somente os itens do ��ndice 1 em diante ser~ao considerados. O item no ��ndice1 �e comparado com os subsequentes itens nos ��ndices 2 e 3. Para cada compara�c~ao, seo maior estiver no item 1, as duas entradas ser~ao trocadas. Ap�os cada compara�c~ao, o

Page 157: ~ Linguagem de Programacao e Estruturas De

6.8. APLICAC� ~OES DE MATRIZES E REGISTROS 157segundo menor elelento na lista �e armazenado no ��ndice 1.Lista inicial A�c~ao Lista resultante��ndice 1 2 8 6 3 troca���! 2 6 8 32 6 8 3 troca���! 2 3 8 6��ndice 2: Considere a sublista 8, 6. O processo continua para a sublista de dosi itenscom ��ndices 2 e 3. Uma �unica compara�c~ao, resultando numa troca, �e feita entre essesitens. Lista inicial A�c~ao Lista resultante��ndice 2 8 3 8 6 troca���! 2 3 6 8Terminamos com somente um �unico item no ��ndice 3 e a lista est�a ordenada.Lista �nal ordenada2 3 6 8A fun�c~ao de C++ ordPorTroca() usa la�cos aninhados. Assuma que o tamanho dalista da lista �e dado n. O la�co mais externo incrementa o ��ndice i no intervalo de 0 a n -2 Para cada ��ndice i, compare os ��ndices subsequentes aos 'dices j = i + 1, i + 2, ..., n -1. Fa�ca a compara�c~ao e ent~ao troque os elementos se lista[i]> lista[j].Programa: Ordenando uma listaEste programa ilustra o algoritmo de ordena�c~ao. Uma lista �e constitu��da de 15 inteiros nointervalo de 0 a 99. A fun�c~ao ordPorTroca() ordena a lista, usando a fun�c~ao troca() paratrocar os elementos na matriz. O programa imprima a lista antes e ap�os a ordena�c~ao.#include <iostream.h>// troca os valores das duas vari�aveis inteiras x e y.void troca(int & x, int & y){ int temp = x; // armazena o valor original de xx = y; // troca o valor de x pelo de yy = temp; // atribu y ao valor original de x}// ordena a matriz inteira, a, de n elementos na ordem ascendentevoid ordPorTroca(int a[], int n)

Page 158: ~ Linguagem de Programacao e Estruturas De

158 CAP�ITULO 6. DADOS ESTRUTURADOS{int i, j// implementa n - 1 passos. Localiza os valores corretos em// a[0], ..., a[n-2].for (i=0; i < n-1; i++)// coloca o m��nimo de a[i+1],...,a[n-1] em a[i]for (j=i+1; j < n; j++0// troca se a[i] > a[j]if (a[i] > a[j])troca(a[i],a[j]);}// percorre a lista e imprime cada valorvoid imprimaLista(int a[], int n){ for (int i=0; i < n; i++)cout << a[i] << " ";cout << endl;}void main(void){int lista[15] = {38,58,13,15,51,27,10,19,12,86,49,67,84,60,25,};int i;cout << "Lista original \n"imprimaLista(lista,15);ordPorTroca(lista,15);cout << endl << "Lista ordenada:" << endl;imprimaLista(lista,15);}Executando este progragrama para a lista original38 58 13 15 51 27 10 19 12 86 49 67 84 60 25A lista ordenada10 12 13 15 19 25 27 38 49 51 58 60 67 84 86

Page 159: ~ Linguagem de Programacao e Estruturas De

6.8. APLICAC� ~OES DE MATRIZES E REGISTROS 159Contando palavras reservadas em C++Anteriormente discutimos o tipo de dados registro que �e implementado em C++ comouma estrutura(struct). Para ilustrar o uso de registros, um programa computa o n�umerode vezes que as palavras reservadas "else" "for" "if", \include" e "while" ocorrem numprograma C++. O programa usa vari�aveis de strings assim como uma matriz de registros.A principal estrutura de dados do programa �e a estrutura palavraChave cujos os cam-pos consistem da vari�avel de string PalavraChave e o inteiro contador:struct palavraChave{char PalavraChave[20];int contador;};A tabela para as cinco palavras reservadas �e criada na matriz tabDePalavrasChave.Cada item na tabela �e inicializado especi�cando a palavra reservada e um contador ini-cial de 0. Por exemplo, o primeiro inicializador de matriz f\else"; 0g faz com que atabDePalavrasChave[0] de entrada contenha o strint \else" com o contador 0:palavraChave tabDePalavrasChave[] ={ {"else",0},{"for",0},{"if",0},{"include",0},{"while",0}}; O programa le as palavras individuais num arquivo usando a fun�c~ao GetWord(). Umapalavra �e qualquer sequencia de caracteres come�cando com uma letra e continua com letrasou d��gitos. Por exemplo, quando �e apresentado a linha"Express~ao: 3 + 5 = 8 (N1 + N2 = N3) "A fun�c~ao GetWord() extrai as palavras \Express~ao", \N1", \N2" e \N3"e descarta osoutros s��mbolos.A fun�c~ao buscaSeq() percorre a tabela procurando por um item que case com a pala-vraChave. Quando ocorre o casamento, a fun�c~ao retorna o ��ndice do registro que casou,o qual pode, ent~ao, ter o seu campo contador incrementado.Programa: Contando palavras reservadasEste programa le seu pr�oprio c�odigo fonte como entrada. Um la�co le cada palavra e chamaa fun�c~ao buscaSeq() para determinar se a entrada casa com uma palavra reservada emtabDePalavrasChave. Se for o caso, incrementamos o campo de contador do registro. Ap�osa entrada estiver completada, �e impresso o n�umero de ocorrencias de cada palavraChave.O programa ilustra um comando interessante que computa dinamicamente o n�umerode elementos na matriz tabDePalavrasChave, usando a express~ao

Page 160: ~ Linguagem de Programacao e Estruturas De

160 CAP�ITULO 6. DADOS ESTRUTURADOSsizeof(tabDePalavrasChave)/sizeof(palavraChave)Esta express~ao prove um m�etodo de computar o n�umero de elementos numa matrizindependente da m�aquina. Se forem adicionadas outras palavras chave �a tabela, umacompila�c~ao subsequente gerar�a um novo contador de elementos.#include <iostream.h>#include <fstream.h>#include <string.h> // deve incluir as fun�c~oes de string usadas#include <ctype.h> // prove �eAlfa e �eD��gito#include <stdlib.h>// declara a estrutura de palavrasstruct palavraChave{ char PalavraChave[20];int contador;};// declara e inicializa a tabela de palavras chavepalavraChave tabDePalavrasChave[ ] ={ {"else",0},{"for",0},{"if",0},{"include",0},{"while",0}};// algoritmo de busca sequencial para palavras chaveint buscaSeq(palavraChave *tab, int n, char *palavra){ int i;// percorre a lista. Compara palavra com palavraChave no registro correntefor (i=0; i < n; i++, tab++)if (strcmp(palavra, tab->palavraChave == 0)return i; // retorna ��ndice se casarreturn -1; // n~ao casa}// extrai a palavra come�cando com uma letra e possivelmente// outras letras/d��gitosint GetWord (ifstream& fin, char w[]){

Page 161: ~ Linguagem de Programacao e Estruturas De

6.8. APLICAC� ~OES DE MATRIZES E REGISTROS 161char c;int i = 0;// pula entrada n~ao alfab�eticawhile ( fin.get(c) && !isalpha(c));// retorna 0(falha) no fim da fila.if (fin.eof())return 0;// registra a primeira letra da palavraw[i++] = c;// coleta letras e d��gitos e strings terminando com NULLwhile (fin.get(c) && (isalpha(c) || isdigit(c)))w[i++] = c;w[i] = "\n";return 1; // retorna 1 (sucesso)}void main(void){ const int tamM�aximo = 50; // tamanho m�aximo de cada palavra// declara o tamanho da tabela e inicializa seus valoresconst int NpalavrasChave = sizeof(tabDePalavrasChave)/sizeof(PalavraChave);int n;char palavra[tamM�aximo];ifstream fin;// abre arquivo com cheque de errofin.open("prog2_5.cpp",ios::in | ios::nocreate);if (!fin){ cerr << "N~ao �e possivel abrir arquivo 'prog2_5.cpp'" << endl;exit(1);}

Page 162: ~ Linguagem de Programacao e Estruturas De

162 CAP�ITULO 6. DADOS ESTRUTURADOS// extrai palavras at�e o fim da filawhile (GetWord(fin, palavra)// se casar na tabela de palavras chave, incrementar contadorif ((n = buscaSeq(tabDePalavrasChave, NpalavraChave, palavra)tabDePalavrasChave[n].contador++;// percorre a tabela de palavras chave e imprime campos do registrofor (n = 0; n < NpalavraChave; N++)if (tabDePalavrasChave[n].contador > 0){ cout << tabDePalavrasChave[n].contador;cout << " " << tabdepalavrasChave[n].palavraChave << endl;}fin.close();}Executando este programa tem a seguinte sa��da:1 else3 for9 if7 inlude4 while6.9 Exerc��cios1. Computar o valor decimal de cada n�umero bin�ario:(a) 101(b) 1110(c) 110111(d) 11111112. Escrever cada n�umero decimal em bin�ario:(a) 23 (b) 55 (c) 85 (d) 2533. Nos sistemas de computadores modernos, os endere�cos s~ao usualmente implementa-dos no n��vel de hardware como valores bin�arios de 16-bits ou 32-bits. �E natural lidar

Page 163: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 163com endere�cos em bin�arios em vez de converte-los em decimal. Como os n�umerosdesses tamanhos s~ao ruins de escreve-los como strings de d��gitos bin�arios, s~ao usadosos n�umeros na base 16 ou hexadecimais. Tais n�umeros referidos como n�umeroshex, s~ao representa�c~oes importantes para os inteiros permitindo uma convers~ao f�acilpara e de bin�arios. Muitos softwares lidam com endere�cos de m�aquinas em hex.Os n�umeros hex s~ao constru��dos de uma base de 16 d��gitos percorrendo de 0-15(decimal).Os primeiros dez d��gitos s~ao herdados dos n�umeros decimais: 0, 1, 2 ,3, 4, 5, 6, 7,8, 9. Os d��gito de 10 a 15 s~ao representados por A, B, C, D, E e F. As potenciasde 16 s~ao: 160 = 0 161 = 16 162 = 256 163 = 4096 e assim por diante. Na formade nota�c~ao posicional, exemplos de n�umeros s~ao: 17E, 48 e FFFF800. Os n�umeross~ao convertidos para decimal expandindo as potencias de 16 exatamente como paraas potencias de 2 s~ao expandidas para n�umeros bin�arios.Por exemplo, o n�umero hex 2A3F16 �e convertido para decimal expandindo as potenciasde 16.2A3F16 = 2(163) +A(162) + 3(161) + F (160) = 2(4096) + 10(256) + 3(16) + 15(1) =8192 + 2560 + 48 + 15 = 1018510Converter cada n�umero hex para decimal:(a) 1A (b) 41F (c) 10EC (d) FF (e) 100004. Converter cada n�umero decimal para hex:(f) 23 (g) 87 (h) 115 (i) 2555. O principal motivo para introduzir n�umeros hex �e sua correspondencia natural comos n�umeros bin�arios. Eles possibilitam uma representa�c~ao compacta de dados bin�ariose endere�cos de mem�oria. Os d��gitos hex tem uma representa�c~ao bin�aria de 4-bitsno intervalo 0-15. A tabela seguinte lista a correspondencia entre d��gitos bin�arios ehex.hex bin�ario hex bin�ario0 0000 8 10001 0001 9 10012 0010 A 10103 0011 B 10114 0100 C 11005 0101 D 11016 0101 E 11107 0111 F 1111

Page 164: ~ Linguagem de Programacao e Estruturas De

164 CAP�ITULO 6. DADOS ESTRUTURADOSPara representar um n�umero bin�ario em hex, come�car no �nal do lado direito don�umero e partir os bits em grupos de quatro, adicionando 0's no �ultimo grupo daesquerda, se for necess�ario. Escrever cada grupo de 4 bits como um d��gito hex. Porexemplo, 1111000111011112 = 0111 1000 1110 1110 = 78EE16Para converter de um n�umero hex para para um n�umero bin�ario, reverter o processoe escrever cada d��gito hex como 4 bits. Considere o seguinte exemplo:A78916 = 101 0111 1000 1001 = 10100111100010012Converter de bin�ario para hex(a) 1100 (b) 1010 0110 (c) 1111 0010 (d) 1011 1101 1110 0011Converter hex para bin�ario(e) 0610 � 16(f) AF20166. C++ permite ao programador entrar e sair n�umeros em hex. Colocando o manipu-lador \hex" no stream, o modo para a entrada ou sa��da de n�umeros �e hex. O modotem efeito at�e ele retornar o decimal com manipulador \dec". Por exemplo:cin >> hex >> t >> dec >> u; // t �e lido como hex e u �e lido como decimal< entrada; 100 256 > t = 10016 e u = 25610cout << hex << 100 << t << u; // a sa��da �e 64 100 100cout << dec << 100 << t << u; // a sa��da �e 100 256 256Considere a seguinte declara�c~ao e comando execut�aveis:int i j, k;cin >> i;cin >> hex >> j >> dec;cin >> k;Assuma que <entrada> �e 50 50 32. Qual �e a sa��da do comando?(a) cout << hex << i << " " << j << " " << dec << k << endl;(b) assuma que <entrada> �e 32 32 64. Qual �e a sa��da do comando?cout << dec << i << " " << hex << j << " " << k << endl;

Page 165: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 1657. Escrever uma especi�ca�c~ao completa para operador% no tipo de dados inteiro. Fa�cao mesmo para o operador de compara�c~ao !=.8. O tipo booleano de�ne dados que s~ao os valor verdadeiro ou falso. Algumas lingua-gens de programa�c~ao de�ne o tipo nativo Boolean com uma s�erie de fun�c~oes em-butidas para processar os dados. C++ associa um valor booleano a cada express~aonum�erica.(a) Defina um TAD booleano que descreve o dom��nio de dados e suas opera�c~oes.(b) Descreva uma implementa�c~ao do TAD usando os construtos da linguagem C++.9. (a) Que caractere ASCII corresponde ao n�umero decimal 78?(b) Qual caractere ASCII corresponde ao n�umero bin�ario 10010112?(c) Quais s~ao os c�odigos ASCII para os caracteres \*", \q" e o retorno do carro?De sua resposta em bin�ario e decimal.10. O que ser�a impresso a partir do seguinte fragmento de c�odigo?cout << char(86) << " " << int('q') << " " <<char(int("0") + 8) << endl;11. Explicar porque o operador %(resto)n~ao est�a dispon��vel no TAD n�umeros reais.12. Converter cada n�umero bin�ario de ponto �xo para deciamal:(a) 110,110(b) 1010,0101(c) 1110,00001(d) 11,111....111...(suagest~ao: usar a f�ormula para a soma de uma s�erie geom�etrica)13. Converter cada n�umero decimal de ponto �xo para bin�ario:(a) 2,25(b) 1,125(c) 1,087514. (a) No TAD dos n�umeros reais, existe o menor n�umero real positivo?(b) Quando os n�umeros s~ao implementados num computador, existe o menor n�umero positivo? Porque sim ou porque n~ao?

Page 166: ~ Linguagem de Programacao e Estruturas De

166 CAP�ITULO 6. DADOS ESTRUTURADOS15. O formato de ponto utuante IEEE armazena o sinal do n�umero separado e arma-zena o expoente e a mantissa usando n�umeros sem sinal. Uma forma normalizadapermite uma representa�c~ao �unica para cada n�umero em ponto utuante.Forma Normalizada: O n�umero em ponto utuante �e ajustado para ter um �unicod��gito diferente de zero �a esquerda do ponto bin�ario.N = +1; d1d2:::dn�1 � 2eO n�umero em ponto utuante 0,0 �e armazenado com sinal, expoente, e mantissa 0.Como um exemplo, dois n�umeros bin�arios s~ao convertidos para a forma de reprsen-ta�c~ao normalizada.N�umeros bin�arios Forma normalizada1101; 101 � 21 1; 1011010 � 240; 0011 � 26 1; 1 � 23Os n�umeros de ponto utuante de trinta e dois bits s~ao armazenados na formanormalizada usando o formato interno IEEE:Sinal O bit mais a esquerda �e usado para o sinal. Um "+ " tem 0 bit de sianl. e um "-"tem um bit de sinal 1.Expoente O expoente �e armazenado em 8 bits. Para assegurar que todos os expoentess~ao armazenados como n�umeros positivos(sem sinal), o formato IEEE especificausando a nota�c~ao "excesso-127" para o expoente. O expoente armazenado, Exps �e criado adicionando 127 ao expoente rel.Exps = Exp + 127ExpoenteVerdadeiro ExpoenteArmazenadoEscopo escopo-127 <= Exp <= 128 0 <= Exps <= 255Mantissa Assumindo que o n�umero est�a armazenado na forma normalizada, o d��gitol��der 1 est�a escondido. Os d��gitos fracion�arios s~ao armazenados numa mantissa de 23-its,dando 24 bits deprecis~ao.sinal expoente mantissa1 bit 8 bits 23 bitsComo um exemplo, computaremos a representa�c~ao interna de -0,1875.

Page 167: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 167Forma normalizada (-)1,1.100�23sinal 1Expoente Exps = �3 + 127 = 124 = 011111002Mantissa < 1 >100000...0�0; 1875 = 10111110010000000000000000000000Registre cada n�umero na nota�c~ao de ponto utuante UEEE em 32-bits.(a) 7,5 (b) -1/4Qual �e o valor do seguinte n�umero na forma decimal formatado em IEEE de 32-bits?Cada n�umero �e dado em hex.(c) C1800000 (d) 41E9000016. (a) Listar na ordem do calend�ario os meses do ano que tem um "a" no seu nome.Isto �e um tipo enumerado.(b) Escrever em C++ uma impementa�c~ao do tipo enumerado.(c) Na implementa�c~ao C++, que mes corresponde ao inteiro 4? Qual �e a posi�c~aode outubro?(d) Escrever a enum em ordem alfab�etica. Quais meses tem a mesma posi�c~ao emambas as listas?17. Adicionar as opera�c~oes de sucessor e predecessor ao TAD para tipos enumerados.Use especi�ca�c~oes completas. O sucessor retorna o pr�oximo item na lista e o pre-decessor retorna o item anterior. Tome cuidado em de�nir o que acontece nosextremos da lista.18. Dados as seguintes declara�c~oes e comandos, especi�car os conte�udos de X, Y e Aap�os a execu�c~ao do seguinte comando:int X=A, y=7, *PX = &X, *Py;double A[] = {2,3, 4,5, 8,9, 1,0, 5,5, 3,5}, *PA = A;PY = &Y; *(PX)--; *PY+=*PX; PY = PX;*PY = 55; *PA+=3,0; PA++; *PA++ = 6,8;PA+=2;*++PA = 3,3;19. (a) A �e declarado como

Page 168: ~ Linguagem de Programacao e Estruturas De

168 CAP�ITULO 6. DADOS ESTRUTURADOSshort A[5];Quantos bytes s~ao alocados para a matriz A? Se o endere�co da matriz for A =6000, compute o endere�co de A[3] e A[1].(b) Assuma a declara�c~aolong A[] = {30, 500000, -100000, 5, 33};Se uma palavra long for de 4-bytes e o endere�co de a for 2050.� Qual �e o conte�udo do endere�co 2066?� Duplique os conte�udos nos endere�cos 2050 e 2062. Escrever a matriz A.� Qual �e o endere�co de A[3]?20. Assuma que A �e uma matriz m � n com os ��ndices das linhas no intervalo de 0 a(m-1) e os das colunas no intervalo de 0 a (n-1). Gerar uma fun�c~ao de acesso quecomputa o endere�co de A[linha][col], assumindo que os elementos s~ao armazenadospor colunas.21. A �e declarado comoshort A[5][6];(a) Quantos bytes s~ao alocados para a matriz A?(b) Se o endere�co da matriz for A = 1000, computar o endere�co de A[3][2] e A[1][4].(c) Qual a entrada da matriz que est�a localizada no endere�co 1020? e no endere�co1034?22. (a) Declarar uma string NOME com valor inicial de seu primeiro nome.(b) Considere as declara�c~oes de vari�avel de stringchar s1[50], s2[50];e os comandos de entradacin >> s1 >> s2;Quais os valores de s1 e s2 para a linha de entrada\George voa"? Quais osvalores de s1 e s2 na entrada do seguinte texto (3 �e um caractere branco e [ �eo �m de linha.)?:Pr�oximo [ 3333 � Palavra23. Assuma as seguintes declara�c~oes de strings:

Page 169: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 169char s1[30] = "Stockton, CA", s2[30] = "March 5, 1994", *p;char s3[30];(a) Qual �e o valor de *p ap�os a execu�c~ao de cada um dos seguintes comandos?p = strchr(s1, 't');p = strrchr(s1, 't');p = strrchr(s2, '6');(b) Qual �e valor de s3 ap�os a execu�c~ao dos seguintes comandos?strcpy (s3,s1);strcap (s3, ", ");strcat (s3, s2);(c) O que a chamada de fun�c~ao strcmp (s1,s2) retorna?(d) O que a chamada de fun�c~ao strcmp (&s1[5],"tom") retorna?24. A fun�c~aovoid strinsert(char *s, char *t, int i);insere o string t no string s come�cando no ��ndice i. Se i for maior que o comprimentode s, a inser�c~ao n~ao ser�a efetuada. Implemente strinsert usando as fun�c~ao debiblioteca C++ strlen(), strcy(), e strcat(). �E preciso declarar uma vari�avel de stringtempor�aria para conter os caracteres originais em s do ��ndice i ao ��ndice strlen(s)-1.Assuma que esta cauda nunca excede 127 caracteres.25. A fun�c~aovoid strdelete(char *s, int i, int n);remove uma sequencia de n caracteres do string s come�cando o ��ndice i. Se i+n formaior ou iqual que o comprimento de s, o �m do string ser�a removido come�cando no��ndice i. Implemente strdelete() usando as fun�c~oes de biblioteca strlen() e strcy().26. Uma alternativa do uso de string com termina�c~ao NULL �e colocar um contador decaracteres no primeiro elemento da matriz de caracteres. Isto �e chamado formatode contador de bytes. Tais strings s~ao usados com frequencia com o nome stringsde Pascal, pois o sistema de programa�c~ao Pascal usa esse formato de strings.(a) Implemente a fun�c~ao strcat() assumindo que os strings s~ao armazenados noformato de contador de bytes.

Page 170: ~ Linguagem de Programacao e Estruturas De

170 CAP�ITULO 6. DADOS ESTRUTURADOS(b) As fun�c~oes PtoCstr() e CtoPStr() fazem a covers~ao entre os dois formatos destrings:void PtoCStr(char *s); // converte s de Pascal para C++void CtoPStr(char *s); // converte s de C++ para PascalImplemente essas duas fun�c~oes.27. Adicionar o operador de atribui�c~ao \=" ao TAD registro usando uma especi�ca�c~aocompleta. De�na com cuidado que a�c~oes ter~ao lugar durante a atribui�c~ao.28. Um n�umero complexo �e da forma x + iy, onde i2 = �1. Os n�umeros complexoss~ao usados em matem�atica , f��sica e engenharia. Eles possuem uma aritm�eticagovernada por uma s�erie de regras incluindo as seguintes:Sejam u = a + ib, v = c + idu+v = (a+c)+i(b+d)u-v = (a-c)+i(b-d)u*v = (ac-bd)+i(ad+bc)a=v = ac+ bdc2 + i(bc� bdc2 + d2 )Represente um n�umero complexo usando a estrutura de registro:struct complexo{ float real;float imag;};e implemente as seguintes fun�c~oes que efetuam opera�c~oes sobre os n�umeros comple-xos: complexo cadd(complexo& x, complexo& y); // x + ycomplexo csub(complexo& x, complexo& y); // x - ycomplexo cmul(complexo& x, complexo& y); // x * ycomplexo cdiv(complexo& x, complexo& y); // x / y29. Adicone uma opera�c~ao tamDeArquivo() ao TAD para stream. Ele deve retornar on�umero de caracteres no arquivo. Tome cuidado quando especi�car que precondi�c~oesdevem existir para que esta opera�c~ao tenha sentido. (Susgest~ao: que tal cin/cout?)

Page 171: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 17130. Distinga cuidadosamente um texto dum arquivo bin�ario. Voce pensa que �e poss��veldesenvolver um programa que recebe como entrada o nome de um arquivo e deter-mina se ele �e um texto ou um arquivo bin�ario?31. Escreva uma fun�c~aovoid baseOut(unsigned int n, int b);que devolve n na base b, 2 � b � 10, imprime cada n�umero no intervalo 2 � n � 50nas bases 2, 4, 8 e 9.32. Escrever uma fun�c~aovoid octIn(unsignet int& );que le um n�umero na base 8(0ctal) e atribui ele a n. Use octIn() num programamain() que le os seguintes n�umeros octais e imprime os equivalentes decimais:7; 177; 127; 7776; 17777733. Escrever um programa que declara tres vari�aveis inteiras i, j, k. Entre um valordecimal para i em decimal e valores para j e k em hex. Imprima as tres vari�aveisem hex e decimal.34. Considere o tipo enumeradoenum diasDaSemana {domingo, segunda, ter�ca, quarta, quinta, sexta, s�abado};Escreva uma fun�c~aovoid getDia(diadDASemana& dia);que que le o nome de um dia do teclado como uma string e atribui o corespondentevalor enum do dia. Escreva tamb�em uma fun�c~aovoid putDia(diasDaSemana dia);que escreve o valor enum na tela. Desenvolver um programa main() para testar asduas fun�c~oes.35. Entre uma s�erie de palavras at�e �m do arquivo(fda), cada uma das palavras. Se apalavra come�ca com uma consoante, mover o primeiro caractere da palavra para a�ultima posi�c~ao e colocar \ay". Se a palavra come�ca com uma vogal, simplesmentecoloque \ay" Por exemplo,

Page 172: ~ Linguagem de Programacao e Estruturas De

172 CAP�ITULO 6. DADOS ESTRUTURADOSEntrada: tudo �e poss��velSa��da: udoay �eay oss��velay36. Uma string de texto pode ser encriptado usando um mapeamento tabular que associaa cada letra do alfabeto uma �unica letra. Por exemplo,abcdfghijklmnopqrstuvwxyz ==> ngzqtcobmuhelkpdawfyivrsjmapeia \encrypt" em "tkzwsdf". Escreva um programa que le um texto at�e o �m doarquivo e devolve a forma encriptada.37. Escreva um programa que faz com que um ou mais ��ndices da matriz sai do limite.Torne a situa�c~ao bastante ruim fazendo com que o programa trave.38. Modi�que a ordena�c~ao por troca de modo que ele ordene a lista em ordem descen-dente.39. Considere a declara�c~aostruct mes{ char nome[10]; // nome do mesint numDoMes; // n�umero do dia no mes};(a) Escrever uma fun�c~aovoid ordPorNome(mes Mes[], int n);que ordena uma matriz cujos elelementos s~ao do tipo mes comparando no-mes(use a fun�c~ao C++ strcmp()). Escreva tamb�em uma fun�c~aovoid ordPorDias(mes Mes[], int n);que ordena a lista comparando o n�umero de dias num mes. Escreva um progra-ma Main() que declara uma matriz contendo todos os meses do ano e ordena-osusando ambas as fun�c~oes. Imprima cada lista ordenada.40. Escreva um programa que le um arquivo de texto e imprime um contador do n�umerode ocorrencias dos sinais de pontua�c~ao (.,!?).41. Escreva um programa que entra uma matriz N�N , a, de valores inteiros e imprimeo tra�co da matriz. O tra�co �e de�nido como a soma dos elementos da diagonal.tra�co(a) = a[0,0] + a[1,1] + ... + a[N-1,N-1]

Page 173: ~ Linguagem de Programacao e Estruturas De

6.9. EXERC�ICIOS 17342. Escreva uma fun�c~ao f(z) que(use o exerc��cio sobre complexos) avalia a fun�c~ao poli-nomial complexa: z3 � 3z2 + 4z � 2Avalie o polinomio para os seguintes valores de z:z = 2 + 3i, -1 + i, 1 + 1, i - 1, 1 + 0iObserve que os tres �ultinos valores s~ao ra��zes de f.

Page 174: ~ Linguagem de Programacao e Estruturas De

174 CAP�ITULO 6. DADOS ESTRUTURADOS

Page 175: ~ Linguagem de Programacao e Estruturas De

Bibliogra�a[1] Abramsky, S. Domain theory in logical form. In Domain Theory in ComputingScience, pages 47{53. Computer Society Press of the IEEE, 1987.[2] Benedito M. Aci�oly. The scott interval analysis: A new approach to interval ma-thematics. Revista de Inform�atica Te�orica e Aplicada (RITA), 1996. To Appear.[3] Benedito M. Aci�oly. The Scott Interval Analysis. In Marc��lia A. Campos; Dalc��dioM. Cl�audio, editor, Proceedings of the Second Workshop on Computer Arithmetic,Interval and Symbolic Computation, pages 4{6. Brazilian Computer Society (SBC),August 1996.[4] Aci�oly B. & Bedregal, B. A quasi-metric topology compatible with inclusion-monotonicity property on interval space. Reliable-Computing, 3(3), 1997.Ed.Kluwer.[5] Acioly, Benedito. Notas em l�ogica. Technical report, Instituto de Inform�atica,Universidade Federal do Rio Grande do Sul., Setembro 1990.[6] Acioly, Benedito M. Computational foundations of Interval mathematics. PhD the-sis, Instituto de Inform�atica, Universidade Federal do Rio Grande do Sul, Dezembro1991. in Portuguese.[7] Aczel, Peter H.G. Term declaration logic and generalized composita. In Six An-nual IEEE Symposium on Logic in Computer Science(LICS'91), pages 22{30. IEEEPress, 1991.[8] Alefeld, G. & Herzberger, J. An Introduction to Interval Computation. AcademicPress, New York, 1983.[9] Arbib,M.A. & Manes E.G. Arrows, Structures and Functors. Academic Press,1975.[10] Asperti, Andrea & Longo Giuseppe. Categories, Types and Structures. Massachu-setts Institute of Technology, 1991. 175

Page 176: ~ Linguagem de Programacao e Estruturas De

176 BIBLIOGRAFIA[11] Barendregt, H. The lambda calculus. it's syntax and semantics. In Studies in Logicand Foundation of Mathematics, volume 103. North-Holland Publishing Company,1984.[12] Barr, Michael & Wells, Charles. Category Theory for Computing Science. C.A.RHoare, Series Editor. Pretince Hall International (UK), �rst edition, 1990.[13] Bedergal, B.R. & Aci�oly, B.M. Sistemas de informa�c~ao cont�iInuos. TechnicalReport RT-001/95, UFPe-CCEN, Depto. de Inform�atica, Recife, 95.[14] Michael Beenson. Foundation of constructive Mathematics. springer-Verlag, 1985.[15] Beenson, M.J.ll. Formalizing constructive mathematics. why and how? InF.Richman, editor, ConstructiveMathematics. Proceedings,, number 873 in LectureNotes in Mathematics, pages 146{190, Las Cruces, New Mexico, 1981. Springer-Verlag.[16] Bell, J.L. Toposes and Local Set Theories. An Introduction. Number 14 in OxfordLogic Guides. Clarendon Press - Oxford, 1988.[17] Berti, S. The Solution of an Interval Equation. 1969.[18] Bird, Richard. Programs and Machines. An Introduction to the Theory of Compu-tation. John Wiley & Sons, 1976.[19] Birko�, Garret. On the structure of abstract algebras. Proceedings CambridgePhilosophical Society, 31:433{454, 1935.[20] Erret Bishop. Foundations of Constructive Analysis. Mc-Graw Hill, 1967.[21] C.Thomas; Hahn S.W. Bullof, Jack J.; Holyoke, editor. Foundations of Mathe-matics (Symposium Papers Commemorating the Sixtiex Birthday of Kurt G�odel,1969.[22] Bunge, Mario. Tratado de �loso�a b�asica. In Semantica I, volume vol 1. EDUSP,1976.[23] Bunge, Mario. Tratado de �loso�a b�asica. In Semantica II. Interpreta�c~ao e Verdade,volume vol 2. EDUSP, S~ao Paulo, 1976.[24] Burris, Stanley & Sankappanavar, H.P. A Course in Universal Algebra. Springer-Verlag, 1981.[25] Georg Cantor. Contributions to the foundation of the theory of trans�nite numbers.Dover Publications.

Page 177: ~ Linguagem de Programacao e Estruturas De

BIBLIOGRAFIA 177[26] Cardelli, Luca & Wagner, Peter. On understanding types, data abstraction andpolimorphism. Computing Surveys, 17(04), December 1985.[27] Cohn, P.M. Universal Algebra. Harper & Row and John Weatherhill Inc., 1965.[28] Costa, M.Amoroso. In Texto 4. As Id�eias Fundamentais da Matem�atica e OutrosEnsaios, Biblioteca do Pensamento Brasileiro. EDUSP, 1981.[29] daCosta, Newton C.A. Introdu�c~ao aos Fundamentos da Matem�atica. HUCITEC,S~ao Paulo, 3ed., edition.[30] B.A. Davey and H.A. Priestley. An introduction to lattices and order. CambridgeUniversity Press, 1992.[31] Davis, Ruth. Truth, Deduction, and Computation. Logic and Semantics for Com-puting Science. Computer Science Press, 1989.[32] deQueiroz, Ruy J.G.B. A proof-theoretic account of programming and the role ofreduction rules. Dialectica, 42(04), 1988.[33] deQueiroz, Ruy J.G.B. Proof Theory and Computer Programming. The LogicalFoundations of Computing. PhD thesis, Department of Computing, Imperial Col-lege, University of London, 1991.[34] deQueiroz, Ruy J.G.B. & Gabbay, M. Dov. An introduction to labelled natural de-duction. Technical report, Departament of Computing, Imperial College, Universityof London, September 1982.[35] deQueiroz, Ruy J.G.B. & Maimbaum, Thomas S.E. Proof theory and computerprogamming. Zeitschrift F�ur Mathematishe Logik und Grundlagen der Mathematik,36:389{414, 1990.[36] Diller A. Z. An Introduction to Formal Methods. John Wiley & Sons, 1994.[37] Domingues, H.H. & Iezzi, G. �Algebra Moderna. 2a ed. edition, 1982.[38] Dummet, Michael. What is a theory of meaning? In Evans & John McDowell,editor, Essays in Semantics. Claredon Press, 1976.[39] H. Enderton. A mathematical introduction to logic. Academic Press Inc, 1972.[40] Bell. E.T. Men of mathematics.[41] Ferrari, A. T. Metodologia da Pesquisa Cient���ca. McGraw-Hill, 1982.

Page 178: ~ Linguagem de Programacao e Estruturas De

178 BIBLIOGRAFIA[42] F.B. Feys, R.; Fitch. Dictionary of Mathematical Logic. Studies in Logic and TheFoundations of Mathematics. North-Holland, 1969.[43] M.C. Fitting. Intuitionistic Logic Model Theory and Forcing. Studies In Logic andthe Foundations of Mathematics. North-Hollad, 1969.[44] M. P. Fourman and D. S. Scott. Sheaves and logic. In M. P. Fourman, C. J. Mulvey,and D. S. Scott, editors, Applications of Sheaf Theory to Algebra, Analysis, andTopology, number 753 in Lecture Notes in Mathematics, pages 302{401. Springer-Verlag, 1979.[45] Frege, Gottlob. Function and concept. In Brian McGuinness, editor, CollectedPapers on Mathematics, Logic and Philosophy.[46] F.W.Lawvere, editor. Toposes, Algebraic Geometry and Logic. Number 274 inLecture Notes in Mathematics. Springer-Verlag, 1972.[47] Gabbay, Dov M. Labelled Deductive Systems. Part 1. Oxford University Press,1996.[48] Gabbay, M.Dov & de Queiroz, Ruy J.G.B. Extending the curry-howard interpreta-tion to linear, relevant and other resourcer logic. The Journal of Symbolic Logic,57(4), December 1992.[49] Gallier, Jean. Contructive logics. Technical report, digital, Paris Research Labora-tory, 1991.[50] Gallier, Jean H. Logic for Computer Science. Foundations of Automatic TheoremProving. John Wiley & Sons inc., 1987.[51] Gentzen, G. The collected papers of gerard gentzen. In Szabo, M.E., editor, StudiesIn Logic And Foundations of Mathematics. North-Holland Publishing Company,1969.[52] Gierz, G.; Hofmann, K.H.;Keimel, K.; Lawson, J.D.; Mislove, M.; Scott, D.S. ACompendium of Continuous Lattices. Springer-Verlag, 1980.[53] Girard, Jean-Yves. Proof Theory and Logical Complexity, volume I. Bibliopolis,1987.[54] Girard, Jean-Yves; Lafont, Yves & Taylor, Paul. Proofs and Types, volume 7 ofTracts in Theoretical Computer Science. Cambridge University Press, 1989.[55] Andrew H. Gleason. Fudamentals of Abstract Analysis.

Page 179: ~ Linguagem de Programacao e Estruturas De

BIBLIOGRAFIA 179[56] Goguen, Joseph A. Theorem Proving and Algebra. To be published, 1997. Draft ofMay 16, 1997.[57] Goguen,J, et.al. Initial algebra semantics and continuous algebras. Journal of ACM,24(1):32{101, January 1977.[58] Goldblatt, R. Topoi. The Categorial Analysis of Logic, volume 98 of Studies inLogic and The Foundations of Mathematics. north-holland, 1984.[59] R.L. Goodstein. Recursive Number Theory. Studies in Logic and the Foundationof Mathematics. North-Holland, 1964.[60] Michael J.C. Gordon. Programming Language Theory and Its Implementation.C.A.R. Hoare. Pretince-Hall, 1988.[61] Guelli, C.A; et.al. Algebra IV. Editora Moderna ltda.[62] Halmos, Paul R. Naive Set Theory. D.Van Nostrand Company inc., 1960.[63] Heijenoort, Jean Van. From frege to g�odel. a source book in mathematical logic 1879-1931. Series Source Books in History Of The Science, pages xii+665pp. HarvardUniversity Press.[64] Heijnoort, Jean Van. Logic as calculus and logic as language. Synthese, 53, 1967.[65] Hennessy, Matthew. Algebraic Theory of Process. The MIT Press, 1988.[66] Hindley, J. Roger & Seldin, Jonathan P. Introduction to Combinators and �-calculus.[67] Howard, W.A. The formulae-as-types notion of construction. In J.P. Seldin & J.R.Hindley, editor, Essays on Combinatory Logic, Lambda Calculus and Formalism,pages xxv+606p. Academic Press, 1980.[68] Huet, Gerard, editor. Logical Foundations of Functional Programming. Addison-Wesley, 1990.[69] Peter T. Johnstone. Stone Spaces. Cambridge University Press, 1982.[70] P.T. Johnstone. Stone Spaces. Cambridge University, 1982.[71] Johnstone, P.T. Stone Spaces. Cambridge University Press, 1982.[72] Robert H. Kasriel. Undergraduate Topology.[73] Kleene, Stephen Cole. Mathematical Logic. John Wiley & Sons, Inc., 1967.

Page 180: ~ Linguagem de Programacao e Estruturas De

180 BIBLIOGRAFIA[74] Kneale, William & Kneale, Martha. O Desenvolvimento da L�ogica. Funda�c~aoCalouste Gulbenkian, 1991.[75] G. Kreisel. Elements of mathematical logic (model theory). In Studies in Logic andThe Foundation of Mathematics. North-Holland Publishing Company, 1971.[76] Lambeck,J.& Scott,P.J. Introduction to Higher Order Categorical Logic. CambridgeUniversity Press, 1986.[77] P.D. Lax. Calculus with application and computing.[78] Leisenring, A.C. Mathematical Logic and Hilbert's �-Symbol. MacDonald Technicaland Scienti�c, 1969.[79] Lipschutz, Seymour. Teoria dos Conjuntos. AO Livro T�ecnico S.A., 1968.[80] Manes, Ernest G. & Arbib, Michael A. Algebraic Approaches To Program Seman-tics. Springer-Verlag, 1986.[81] Manzano, Maria. Teoria de Modelos. Alianza Universidad Textos, 1989.[82] Martin-L�of, Per . Notes on Constructive Mathematics. Almqvist & Wiksell, 1968.[83] Martin-L�of, Per. Constructive mathematics and computer programming. In J.Tos,H.Pfei�er & K.P.Pdewski L.J. Cohen, editor, Logic, Methodology and Philosophyof Science, number VI. North-Holland, 1982.[84] Martin-L�of, Per. Intuitionistic Type Theory. Bibliopolis, 1984.[85] Martin-L�of, Per. Truth of a proposition, evidence of a judgement, validity of aproof. Synthese, (73):407{420, 1987.[86] Moore, Ramon E. Interval Analysis. Pretince Hall, New Jersey, 1966.[87] Moore, Ramon E. Methods and Applications of Interval Analysis. SIAM, 1979.[88] Mosses, Peter D. Handbook of Theoretical Computer Science, chapter 11, pages577{674. 1990.[89] Nordstr�om, Bengt ; Peterson, Kent & Smith, Jan M. Programming in Martin-L�of'sType Theory. An Introduction. Clarendon Press. Oxford, 1990.[90] Paulson, L. Tracts in theoretical computer science. In Logic and Computation.Interactive Proof with Cambridge LCF, volume 2. Cambridge University Press,1987.

Page 181: ~ Linguagem de Programacao e Estruturas De

BIBLIOGRAFIA 181[91] Prawitz, Dag. Ideas and results in proof theory. In Fenstad, J.E., editor, Procee-dings of The Second Scandinavian Logic Symposium, pages 235{307, Amsterdam,1971. North-Holland.[92] Prawitz, Dag. Towards a foundation of general proof theory. In Proceedings ,of TheFourth International Congress For Logic, Methodology And Philosophy of Science,pages 225{250. North-Holland Publishing Company, 1971.[93] Prawitz, Dag. On the idea of a general proof theory. Synthese, (27):63{77, 1974.[94] Prior, A.N. The runabout inference-ticket. Analysis, (21):38{39, 1960.[95] Interval'96, 1996.[96] Revesz. Lambda-Calculus, Combinators and Functional Programing. CambridgeTracts in Theoretical Computer Science. Cambridge University Press, 1988.[97] Reynolds, John C. Polymorphism is not set theoretic. Semantics of Data Types,page 184, June. International Symposium, France.[98] Reynolds, John C. Types, abstraction and parametric polimorphism. InformationProcessing, 1983.[99] Ross, Keneth A. & Wright, Charles R.B. Discrete Mathematics. Pretince Hall,1988.[100] Walter Rudin. Principles of Mathematical Analysis. McGraw-Hill, 1953.[101] Santiago, Regivan. Toward a constructive logic to real analysis. Master's thesis,Universidade Federal de Pernambuco, March 1995. In Portuguese.[102] Santiago, Regivan & Aci�oly Benedito. Intervals as real numbers speci�cation. InInterval'96, October 1996.[103] Santiago, Regivan & Aci�oly Benedito. A numerical approximation logic. InWorkshop in Arithmetic, Interval and Symbolic Computation, July 1996.[104] Santiago, Regivan & Aci�oly, Benedito. Toward a logic for numerical approximations.Revista de Informatica Te�orica e Aplicada, 1996. To appear.[105] Santiago, Regivan & deQueiroz, Ruy J.G. Toward a proof theory for proofs byinduction. In 1st. Workshop LaLLIC, pages 149{164, July 1994.[106] Santiago, Regivan & deQueiroz, Ruy J.G. Notas em l�ogica e topoi. Manuscript,July 1996.

Page 182: ~ Linguagem de Programacao e Estruturas De

182 BIBLIOGRAFIA[107] Dana S. Scott. Domains for denotational semantics. In M. Nielsen and E. M.Schmidt, editors, Automata, Languages and Programming, volume 140 of LectureNotes in Computer Science, pages 577{613, Berlin, 1982. Springer-Verlag.[108] Scott, Danna. Continuous lattices. In F.W.Lawvere, editor, Toposes, AlgebraicGeometry and Logic, number 274 in Lecture Notes in Mathematics, pages 97{136.Springer-Verlag, 1972.[109] M.B. Smith. Topology. Handbook of Logic in Computer Science, 1:641{751, 1992.[110] Smorynski, C.A. Applications of kripke models. In A.S. Troelstra, editor, Ma-thematical Investigation of Intuitionistic Arithmetic and Analysis, number 344 inLecture Notes in Mathematics, chapter V, pages 324{391. springer-Verlag, 1973.[111] Spivey, J.M. Understanding Z.A Speci�cation Language and its Formal Semantics.Cambridge University Press, 1988.[112] Spivey, J.M. The Z Notation. A Reference Manual. C.A.R. Hoare Series. PretinceHall, 1992.[113] Sundholm, G�oran. Proof theory and meaning. In Gabbay, Dov & Guenthner, F.,editor, Handbook of Philosophical Logic, pages 471{506. D.Reidel Publishing com-pany, 1986.[114] Thompson, S. An introduction to type theory and constructive mathematics. No-vember 1987.[115] A.S. Troelstra. Mathematical Investigation of Intuitionistic Arithmetic and Analy-sis. Lecture Notes In Mathematics. Springer-Verlag, 1973.[116] Troelstra, A.S. Principles of Intuitionism. Lecture Notes In Mathematics. Springer-Verlag, 1969.[117] Troelstra, A.S. & Van Dalen, Dirk. Constructivism in mathematics. In Studies inLogic and the Foundations of Mathematics, volume II. North-Holland, 1988.[118] Dirk Van Dalen. Intuitionisc logic. Handbook of Philosophical Logic, 3, 1986.[119] Van Dalen, Dirk. Intuitionistic logic. In Gabbay, Dov & Guenthner F., editor,Handbook of Philosophical Logic, volume III, chapter III.4, pages 225{339. D.Reidel Publishing Company, 1986.[120] Vickers, S. Topology via logic. Number 5 in Cambridge Tracts in TheoreticalComputer Science. Cambridge University Press, 1989.

Page 183: ~ Linguagem de Programacao e Estruturas De

BIBLIOGRAFIA 183[121] David A. Watt. Programming Concepts and Paradigms. C.A.R. Hoare. Pretince-Hall, 1990.[122] Wechler, Wolfgang. Universal Algebra For Computer Scientists. Springer-Verlag,1992.[123] Woodcock,J. & Davies, J. Using Z.Speci�cation, Re�nement, and Proof. PretinceHall, 1996.[124] Martin M. Zuckerman. Sets and Trans�nite Numbers. Collier Macmillian, 1974.