Você está na página 1de 226

APRENDENDO A PROGRAMAR NA PRTICA

Virglio V. Vilela

"A rocha imensa e dura. O cortador bate uma, duas, trs, dez vezes, nenhuma rachadura. Ele d 100 marteladas, s tirando lascas. Na centsima primeira batida, a rocha imensa e dura se parte em duas. O cortador de pedras sabe que no foi somente aquela martelada a que conseguiu, mas tambm todas as que vieram antes". "E na prxima pedra, o cortador pode pegar uma ferramenta mais apropriada e cortar a pedra mais rapidamente".

Este produto adota o

Princpio da Retribuio Espontnea


H alguns movimentos no sentido de que a informao digital seja disponibilizada gratuitamente. Ns apoiamos essa iniciativa. Entretanto, achamos tambm que ela conflita com a necessidade de os produtores e autores de informao e arte terem renda para sua sustentao mnima, o que a prazo mais longo pode inclusive reduzir a informao e a arte oferecidas. Como uma iniciativa no sentido de equilibrar esse quadro, este produto se enquadra no Princpio da Retribuio Espontnea, que consiste no seguinte: 1) O usurio de informao e arte digitais tem o legtimo direito de usufruir de produtos digitais gratuitamente, para fins no-comerciais. 2) A seu critrio, e dentro de suas possibilidades, o usurio pode retribuir ao detentor dos direitos autorais o valor monetrio que considerar justo em termos dos benefcios que obteve, por meio de depsito em conta ou outro indicado pelo produtor, tendo o usurio direito a um recibo. Acreditamos que, desta maneira, todos os interesses podem ser atendidos: os produtores e autores recebem por seu trabalho se este tiver qualidade, os usurios continuam tendo acesso aos produtos digitais, quem no pode pagar no paga e quem pode pagar paga somente o quanto pode e o que achar justo. Assim, estaremos construindo uma sociedade justa e produtiva no por regras e obrigaes, e sim por um saudvel esprito de respeito, liberdade de escolha e troca. Portanto, esteja vontade para se beneficiar deste produto. Caso voc decida espontaneamente retribuir por ele, faa seu depsito conforme indicado abaixo. Aps, envie um e-mail ao autor, informando nome completo, endereo e CPF ou CGC, para efeitos de imposto de renda. E, desde j, muito obrigado! Creditado: Virgilio Vasconcelos Vilela E-mails: virgiliovv@ieg.com.br; virgiliovv@uol.com.br; webmaster@possibilidades.com.br CPF: 398.136.146-68 (para copiar e colar, use este: 39813614668) Opo 1: Banco: 104 Caixa Econmica Federal Agncia: 0002-1 Conta: 01181810-3 Opo 2: Banco: 237 Bradesco Agncia: 3426-6 Conta: 2703-0

SUMRIO
Princpio da Retribuio Espontnea..............................................................................................................................1 APRESENTAO.......................................................................................................................................3 COMO ESTUDAR NESTA APOSTILA.....................................................................................................5

.0 INTRODUO PROGRAMAO DE COMPUTADORES...................................................6


.0.1. Programas e programao.............................................................................................................................6 .0.2. Conhecendo os programas............................................................................................................................7 .0.3. A linguagem do computador.........................................................................................................................7 .0.4. Linguagens de alto nvel...............................................................................................................................8 .0.4.1 Tipos de instrues de alto nvel.............................................................................................................9 .0.5. Converso do programa-fonte.....................................................................................................................10 .0.6. Orientao das linguagens de alto nvel......................................................................................................11 .0.7. Linguagem Pascal.......................................................................................................................................11 .0.8. Software que voc precisa ter ou conhecer.................................................................................................12 .0.9. Fatores de sucesso ......................................................................................................................................13 .0.10. Para voc que est comeando..................................................................................................................14 .0.11. Atividades suplementares..........................................................................................................................15

.1 PENSANDO A PROGRAMAO................................................................................................16
.1.1. Meu Primeiro Rob.....................................................................................................................................16 .1.2. Brincando de rob........................................................................................................................................21 .1.3. Algoritmos....................................................................................................................................................25 .1.3.1 Representando problemas e situaes...................................................................................................26 .1.4. Atividades suplementares.............................................................................................................................29

.2 O PROCESSO DE PROGRAMAR................................................................................................30
.2.1. Estratgia geral de programao..................................................................................................................30 .2.2. Etapas da programao................................................................................................................................31 .2.3. Especificao do programa.........................................................................................................................31 .2.4. Projeto de programas...................................................................................................................................34 .2.4.1 O que os programas fazem....................................................................................................................34 .2.4.2 Tipos de programas...............................................................................................................................35 .2.4.3 Estrutura de programas.........................................................................................................................37 .2.4.4 Projetando programas...........................................................................................................................39 .2.5. Viso geral de um programa-fonte...............................................................................................................43 .2.6. Teste e qualidade de programas...................................................................................................................43 .2.6.1 O que testar...........................................................................................................................................45 .2.7. Atividades suplementares.............................................................................................................................46

.3 O AMBIENTE TURBO PASCAL..................................................................................................49


.3.1. O Turbo Pascal............................................................................................................................................49 .3.2. Instalando o Turbo Pascal...........................................................................................................................49 .3.3. Acessando o Turbo Pascal..........................................................................................................................50 .3.4. Editando texto.............................................................................................................................................50 .3.5. Alternativas para obter ajuda.......................................................................................................................53 .3.6. O DOS Shell: um pouco de MS-DOS.........................................................................................................54

.4 PRIMEIROS PROGRAMAS.........................................................................................................56
.4.1. Primeiras instrues....................................................................................................................................56 .4.2. Mais de Write..............................................................................................................................................60 .4.3. Turbo Debugger..........................................................................................................................................66 .4.4. Expresses aritmticas................................................................................................................................67 .4.5. Units............................................................................................................................................................71 .4.6. Funes ......................................................................................................................................................75 .4.6.1 Funes matemticas............................................................................................................................75

.4.6.2 Nmeros aleatrios..............................................................................................................................78 .4.7. Constantes declaradas.................................................................................................................................79 .4.8. Atividades suplementares ............................................................................................................................80

.5 MEMRIA E ENTRADA DE DADOS.........................................................................................83


.5.1. Comandos de memria.................................................................................................................................83 .5.2. Tipos de dado...............................................................................................................................................86 .5.2.1 Tipos de dado do Turbo Pascal.............................................................................................................86 .5.3. Mais do tipo de dado char............................................................................................................................93 .5.4. Mais do tipo de dado string..........................................................................................................................95 .5.5. Descobrindo variveis .................................................................................................................................97 .5.6. Declarando seus prprios tipos de dado.....................................................................................................102 .5.7. Converses entre tipos de dados................................................................................................................103 .5.8. Atividades suplementares...........................................................................................................................105

.6 ALTERNATIVAS E DECISO...................................................................................................108
.6.1. Deciso e expresses lgicas: IF...............................................................................................................108 .6.2. Mltiplas alternativas: CASE.....................................................................................................................115 .6.3. Reconhecendo decises..............................................................................................................................119 .6.4. Organizando o pensamento: rvores de deciso........................................................................................122 .6.5. Atividades suplementares...........................................................................................................................123

.7 REPETIO.................................................................................................................................127
.7.1. While..........................................................................................................................................................127 .7.2. Repeat.........................................................................................................................................................130 .7.3. For..............................................................................................................................................................132 .7.4. Casos freqentes e problemas com comandos de repetio.......................................................................136 .7.5. Programando repeties.............................................................................................................................138 .7.6. Atividades suplementares...........................................................................................................................149

.8 CRIAO DE INSTRUES E MODULARIZAO............................................................151


.8.1. Instrues criadas pelo programador.........................................................................................................151 .8.2. Tipos e caractersticas de instrues.........................................................................................................152 .8.3. Declarando procedimentos.........................................................................................................................153 .8.4. Parmetros por referncia..........................................................................................................................159 .8.5. Funes declaradas pelo programador.......................................................................................................162 .8.6. Independncia e reusabilidade...................................................................................................................165 .8.7. Roteiro para criar novas instrues...........................................................................................................167 .8.8. Reusabilidade total: units...........................................................................................................................171 .8.9. Atividades suplementares...........................................................................................................................178

.9 LISTAS NUMERADAS: VETORES E MATRIZES..................................................................183


.9.1. .9.2. .9.3. .9.4. .9.5. .9.6. .9.7. Vetores......................................................................................................................................................183 Declarao de vetores...............................................................................................................................184 Operaes com vetores.............................................................................................................................185 Processando todo um vetor.......................................................................................................................189 Registros....................................................................................................................................................195 Matrizes ....................................................................................................................................................198 Atividades suplementares..........................................................................................................................202

.10 TRABALHO FINAL...................................................................................................................204


.10.1. Especificao............................................................................................................................................204 .10.2. Projeto......................................................................................................................................................204 .10.3. Programa-fonte.........................................................................................................................................205 .10.4. Teste.........................................................................................................................................................210 .10.5. Idias para trabalhos.................................................................................................................................210 APNDICE A: PERGUNTAS FREQENTES ......................................................................................214 APNDICE B: PROCEDIMENTOS E FUNES DO TURBO PASCAL............................................215 APNDICE C: FERRAMENTAS DE PENSAMENTO..........................................................................217 APNDICE D: TABELA ASCII..............................................................................................................221 BIBLIOGRAFIA.......................................................................................................................................222 NDICE REMISSIVO...............................................................................................................................223

APRESENTAO

Um bom profissional de informtica tipicamente algum com disposio para buscar solues onde necessrio, por sua prpria iniciativa. Com base nessa premissa, muitos livros e cursos deixam a cargo do estudante grande parte da busca, com a melhor inteno de estimular essa iniciativa. Mas quando comeamos algo, ignoramos at o que no sabemos; comum no dispormos de pontos de partida, e procur-los representa um custo s vezes alto demais. Nesse momento, obter orientao adequada pode fazer a diferena entre prosseguir ou desistir. O objetivo deste curso ser uma orientao para quem est iniciando o aprendizado da programao de computadores. Atravs de uma linguagem especfica, facilitar o treinamento nas habilidades essenciais necessrias para qualquer linguagem de programao, de forma simples e prtica. Bons profissionais de informtica tambm sabem que somente dedicao e prtica regulares podem conduzir ao amadurecimento e competncia. Por isto, mais de 400 exerccios e prticas conduzem o aprendiz a compreender e fixar os novos conhecimentos e tambm a conhecer valiosos recursos da linguagem e do ambiente de programao. A linguagem adotada o Turbo Pascal 7.0 da Borland, uma verso para DOS. Uma razo bsica para isso reduzir a quantidade de informaes necessrias para que o estudante obtenha resultados. De qualquer maneira, este no um livro destinado a esgotar os recursos da linguagem. O objetivo no formar especialistas, e sim apoiar a formao bsica de programadores, cuja prioridade maior consiste em desenvolver as habilidades centrais mencionadas acima. Feito isso, o programador estar em condies de dominar outras linguagens rapidamente. Estrutura do curso Pressupe-se que o estudante est familiarizado com os conceitos iniciais de processamento de dados. O material foi desenvolvido para ser trabalhado principalmente no computador. Aps fazer os exerccios e as prticas, o aprendiz deve implementar programas a partir de especificaes, sejam as sugeridas ou outras que descobrir ou elaborar; o mais importante estar programando. Uma das primeiras atividades colocar o aprendiz em contato com os programas, para criar uma viso das possibilidades e do que ele vai fazer. Por isto, imprescindvel que ele tenha os programas de demonstrao que acompanham este texto. De maneira geral os captulos iniciam com prticas que mostram ao aluno como funciona algum recurso da linguagem, o que em alguns casos ser suficiente. Caso seja necessrio, ele pode recorrer s explicaes, embora o mais importante seja o aluno fazer coisas e perceber o feedback proporcionado pelo computador; isto considerado mais didtico do que exigir que o aluno saiba descrever como as coisas funcionam. Nesta edio tambm se procurou fornecer uma estratgia geral de programao, envolvendo especificao, projeto e implementao, com o objetivo de suprir o aluno com uma estrutura, independente de linguagens, que organize seu pensamento na direo dos resultados desejados.

Vrias das modificaes efetuadas nesta verso refletem conceitos e mtodos da Aprendizagem Dinmica, de Robert B. Dilts e Todd Epstein, que acredito vo efetivamente facilitar para os alunos o desenvolvimento das habilidades de programar. O autor Engenheiro Eletricista e Mestre em Cincia da Computao pela UFMG. Analista de Sistemas na Caixa Econmica Federal. Professor de Primeira Linguagem de Programao na UNEB - Unio Educacional de Braslia, e na UPIS - Unio Pioneira de Integrao Social, tambm de Braslia. Practitioner em PNL. Agradecimentos Ao Professor Slvio Moreira Santana, por me mostrar que os alunos poderiam ir muito alm das minhas expectativas e das deles; ao Professor Vicente P. Teixeira, pelo Apndice B; ao Professor Roberto Silveira, ento chefe do Departamento de Informtica da UNEB, pela liberdade e apoio proporcionados. Comentrios, crticas e sugestes sero muito bem-vindos e podem ser enviados via Internet, para virgilio@tba.com.br. Virglio Vasconcelos Vilela Home page: virgiliovv.cjb.net. Braslia, Janeiro/2000.

COMO ESTUDAR NESTA APOSTILA

Para um melhor aproveitamento da sua dedicao, siga as seguintes orientaes:

Os captulos consistem de atividades dos seguintes tipos: prticas (a maioria) devem ser feitas no computador; exerccios devem ser feitos fora do computador e se destinam preferencialmente para revises ou testes de aprendizado; especificaes indicam programas a serem feitos; pesquisas indicam atividades nas quais voc deve se virar. Simplesmente v executando cada atividade na seqncia em que aparece, pulando o que j estiver muito bvio para voc. A maioria dos programas das prticas e exemplos esto disponveis no disquete que acompanha esta apostila ou na home page do autor. Em algumas pginas h caixas com textos explicativos. Uma vez que o objetivo formar programadores, no estritamente necessrio ler essas explicaes; o essencial saber programar, e no saber explicar ou contar como que se programa. Programar implementar causas para efeitos desejados, e se voc sabe o que acontece quando escreve Write(N) em um programa, no se considera aqui que voc deva saber descrever para algum o que este comando. Ao final de cada captulo h uma seo de atividades suplementares. Aps fazer as prticas e exerccios, escolha algumas e implemente os programas solicitados. Quando estiverem "fceis", hora de seguir em frente. "Fcil" quer dizer, por exemplo, que aps ter contato com uma especificao e imaginar ou esquematizar uma tela de sada de um programa, as instrues em Pascal necessrias, ou uma boa parte delas, vem naturalmente sua mente, sem grande esforo, e voc eventualmente consulta algum material apenas para se certificar. Antes de comear, d uma boa olhada na apresentao, no sumrio, no ndice alfabtico e no captulo 1, apenas para ter uma idia do contedo e familiarizar-se. Folheie as pginas uma a uma, olhando alguma coisa que lhe chame a ateno. No gaste mais que uns 10 ou 15 minutos nesta atividade. Estes poucos minutos podem lhe economizar horas posteriormente!
Fique atento aos textos neste formato: dicas, alertas e informaes importantes.

.0 INTRODUO PROGRAMAO DE COMPUTADORES

Um computador uma mquina que, para realizar algo, precisa que algum lhe indique o que fazer, de uma forma que ele entenda. Para que voc possa fazer isso, preciso que: Conhea o computador e os recursos disponveis; Saiba o que quer que o computador faa; Instrua o computador, atravs de um programa escrito em uma linguagem de programao.

Nesta introduo veremos informaes bsicas para se aprender uma linguagem de programao de computadores. Pressupomos aqui que voc est familiarizado com os fundamentos do processamento de dados, incluindo operao do computador e perifricos, sistema operacional e sistema de arquivos.

.0.1. Programas e programao


O hardware do computador, constitudo de placas e dispositivos mecnicos e eletrnicos, precisa do software para lhe dar vida: programas, com finalidades bem determinadas, que faam o que os usurios querem ou precisam. H programas para editar um texto, para fazer clculos, jogos e literalmente milhares de outras finalidades. Alguns programas maiores, como processadores de texto, planilhas e navegadores da Internet, so de fato agrupamentos de dezenas de programas relacionados entre si. Programas so constitudos de instrues e comandos que o processador do computador entende: faa isso, faa aquilo. Esses comandos devem estar representados em uma linguagem. Voc talvez no esteja ciente de que est familiarizado com vrios tipos de linguagem. Alm do Portugus, h linguagens para inmeras finalidades: sinais, faixas e placas de trnsito, gestos com a mo e com a cabea, o Braille e a linguagem dos surdos-mudos... At para falar com bebs temos formas especficas! Tambm h formas de linguagem mais simples para nos comunicarmos com mquinas, como a televiso, o videocassete, a calculadora. Ningum "chama" verbalmente um elevador, nem "diz" TV qual canal sintonizar; se voc no fizer algo que os aparelhos entendam, no vai conseguir o que quer. Assim o computador: voc deve comand-lo de uma forma que ele entenda. Para que algo acontea no computador, no basta um programa; os comandos do programa devem ser executados. Programas de computador so como filmes: uma coisa a pelcula em um rolo, contendo uma seqncia de imagens. Outra coisa colocar o filme em um projetor e assisti-lo na telona. Os programas ficam guardados em arquivos no disco rgido ou CD, at que seja comandada sua execuo. So ento carregados pelo sistema operacional para a memria e s ento acontece (exatamente) o que foi programado, e voc pode perceber o que o programa faz. Uma diferena entre mquinas em geral e o computador que este pode fazer muito mais coisas, portanto precisa de uma variedade maior de comandos. E outra diferena fundamental: o computador pode armazenar os comandos, agrupados em programas, para execuo posterior.

0 - INTRODUO PROGRAMAO DE COMPUTADORES

Programar um computador , portanto, produzir comandos agrupados em programas, em uma linguagem que o computador entenda e que, quando executados, faam o computador produzir algum resultado desejado. Um bom programador treinado em algumas habilidades, sendo o nosso objetivo desenvolver na prtica essas habilidades, para isso usando uma linguagem de programao de computadores chamada Pascal.

.0.2. Conhecendo os programas


Quando viajamos, nossa principal referncia o destino desejado, que nos guia nas decises de para onde virar. Nesta seo voc vai conhecer o nosso destino: programas prontos. H uma infinidade deles; aqui veremos aqueles dentro dos nossos propsitos. Para as atividades desta seo, voc vai precisar dos programas que so parte do curso. Todos podem ser executados a partir do programa principal, chamado "demoap.exe". Se voc no possui o disquete de programas, obtenha-os na Internet, na pgina indicada no final da apresentao da apostila. Se os programas foram fornecidos em um nico arquivo compactado, descompacte-os em uma nica pasta. Para que os programas de demonstrao possam ser executados, eles precisam constar do cadastro do programa (arquivo "cadprog.dat"). Outros programas podem ser cadastrados a partir de uma opo no menu principal. Os programas que voc vai ver foram feitos por ex-alunos, pelo prprio autor ou obtidos na Internet. Divirta-se! Prtica 0.1 Brincando Execute o programa de demonstrao. Escolha a opo "Programas por categoria", depois escolha a categoria desejada (jogos, desenho, sons e as demais) e escolha alguns. No h nenhuma regra, escolha os que lhe parecerem mais interessantes.

.0.3. A linguagem do computador


A atividade bsica de um computador consiste em executar instrues, atravs de um microprocessador ou simplesmente processador, s vezes tambm chamado de CPU (Central Processing Unit). O processador, em ltima anlise, recebe instrues na forma de impulsos eltricos: em um determinado circuito, pode estar ou no fluindo corrente. Representamos cada impulso por 1 ou 0, conforme passe corrente ou no. Esta a menor unidade de informao que pode ser representada em um computador, e chamada bit. A CPU recebe instrues e dados na forma de bits agrupados de 8 em 8; cada conjunto de 8 bits chamado byte. De uma forma simplificada, um byte, ou seja, um conjunto de 8 impulsos eltricos (ou sua ausncia), constitui uma instruo ou um dado (na verdade, uma instruo pode ocupar mais de um byte). Representaremos essa unidade de informao pelo nmero correspondente no sistema decimal. Dessa forma, ao byte 00000001 associamos o nmero 1, ao byte 00000011 associamos o nmero 3, ao 00000100 o nmero 4 e assim por diante. Um byte pode armazenar, portanto, um nmero de 0 a 255 (11111111). A memria RAM, ou simplesmente memria, de um computador constituda de uma seqncia de milhares ou milhes de bytes, cada um identificado por um nmero que constitui o seu endereo (figura). O processador tem a capacidade de buscar o contedo da memria e executar instrues ali armazenadas. A CPU tambm contm algumas unidades de memria, chamadas registradores, identificados por nomes como AX, CS e IP, que tambm armazenam nmeros e servem a vrias funes.

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

1 56

2 23

3 0

4 247

5 154

6 87

... ...

Esquema simplificado da memria RAM: endereos, bytes e respectivos valores.

Os nmeros armazenados na memria podem representar dados ou instrues. Quando representando instrues, tem significados especficos para a CPU. Por exemplo, a CPU em geral recebe comandos do tipo (mas no na forma): Armazene 9 no registrador DS Armazene 204 no endereo de memria 1.234.244 Some 5 ao contedo do registrador AL Se a ltima instruo deu resultado 0, passe a executar as instrues a partir do endereo de memria 457.552
PUSH CLD MOV XOR NOT LES REP MOV MOV DEC POP DS CX,0FFFFH AL,AL CX DI,Dest MOVSB AX,DI DX,ES AX DS

Esse tipo de linguagem chamado linguagem de mquina ou assembly (veja ao lado um trecho de programa). As instrues so executadas na seqncia em que estiverem na memria, a menos que o fluxo de execuo seja redirecionado por alguma instruo apropriada. Nesta linguagem, mesmo para mostrar algo na tela necessrio colocar nmeros em certos endereos de memria, reservados para isso. No h indicao explcita do tipo nmero da linha ou da coluna da tela; devemos calcular esses dados.

.0.4. Linguagens de alto nvel


Escrever programas de computador em linguagem de mquina, apesar de os programas produzidos serem extremamente rpidos, pode ser muito difcil, trabalhoso e de alto custo, alm de exigir conhecimentos profundos sobre o computador. Para no termos que program-lo nessa linguagem difcil, foram desenvolvidas as linguagens de alto nvel. Estas nos permitem descrever o que queremos que o computador faa utilizando instrues mais prximas da nossa linguagem. Alm de facilitar a descrio dos processos a serem executados, as linguagens de alto nvel simplificam a utilizao da memria do computador, diminuindo a quantidade de detalhes com os quais deve ocupar-se o programador. Assim, ao invs de lidarmos com bits, bytes, endereos de memria e uma infinidade de outros detalhes, podemos pensar em "limpar a tela", "imprimir uma linha de texto", somar e subtrair variveis como na matemtica e tomar uma deciso na forma "se... ento". Veja um exemplo especfico: as instrues abaixo, na linguagem Pascal, determinam que a tela seja limpa e uma soma seja efetuada, e o resultado desta mostrado na tela:
ClrScr; Write(513 + 450 + 1200);

Uma linguagem de programao de alto nvel possui vrias caractersticas em comum com a nossa linguagem. Elas possuem um alfabeto (letras, nmeros e outros smbolos) e palavras. H palavras predefinidas na linguagem, mas tambm podemos formar as nossas prprias. Frases podem ser construdas com as palavras, respeitando-se certas regras. O conjunto de regras de construo de palavras e frases numa linguagem de alto nvel, assim como nas linguagens comuns, chama-se sintaxe.

0 - INTRODUO PROGRAMAO DE COMPUTADORES

.0.4.1

Tipos de instrues de alto nvel

O que voc pode fazer dentro de um programa, utilizando uma linguagem de alto nvel? Vamos ver algumas analogias com outras mquinas. Um televisor possui vrios recursos: a tela, o alto-falante, o controle remoto, opes de configurao. Quando voc aperta ou gira um boto de controle, est de certa forma instruindo o televisor a fazer algo; uma forma rudimentar de linguagem. Em qualquer caso, voc est limitado a atuar sobre os recursos do seu televisor; no h meios de instru-lo a gravar algo numa fita de vdeo. Da mesma forma, numa linguagem de programao voc no vai encontrar (a princpio) instrues para regular contraste ou temperatura. Uma categoria de instrues que voc pode esperar que existam so aquelas que vo lhe permitir interagir com os recursos disponveis: teclado e mouse (entrada), tela e impressora (sada), discos (entrada e sada), memria. Assim, h instrues para se ler algo do teclado e mostrar algo na tela. Sendo o disco rgido estruturado em pastas (diretrios) e arquivos, h instrues para se ler e gravar arquivos no disco rgido, e para se saber seu contedo. Tambm h instrues que declaram que voc quer usar a memria, e instrues para armazenar e consultar dados nela armazenados. Para poder executar uma gravao programada, seu videocassete precisa tomar pelo menos duas decises: quando inici-la, e quando interromp-la. Assim num programa: em vrias situaes ser necessrio fazer verificaes e tomar decises de quando executar ou no um conjunto de instrues, ou executar um ou outro conjunto. Por exemplo, um programa que l uma nota que um aluno tirou em uma disciplina e deve informar se ele foi aprovado ou no. Ou o programa informa que o aluno passou ou que foi reprovado, mas nunca as duas coisas. Portanto, numa linguagem de alto nvel, tambm voc pode esperar que existam instrues para tomada de decises.

Para explorar a enorme capacidade de processamento de um computador, que tal deixarmos para ele fazer coisas que exigem a repetio de um procedimento uma certa quantidade de vezes, sejam duas ou milhes de vezes? Voc tambm encontrar numa linguagem instrues para programar repetio condicional de um grupo de instrues. Suponha que voc quer escrever um programa que escreva seu nome em cada linha da tela. Ao invs de escrever 25 instrues, uma para cada linha, voc pode usar uma instruo para repetir 25 vezes a instruo que mostra seu nome na tela. Em outros casos voc ter um padro a ser seguido, como no caso do clculo da mdia aritmtica: l o nmero, calcula a soma parcial, incrementa um contador, l outro nmero, calcula a soma parcial, incrementa um contador, e assim por diante; no final da leitura, divide a soma pelo contador. Uma vez identificado o padro, voc escreve apenas uma vez as instrues que se repetem e inclui um comando que controle a repetio. Para facilitar a vida do programador, as linguagens de alto nvel tambm contm vrios outros tipos de instrues: todos contm operaes matemticas bsicas (soma, subtrao, multiplicao e diviso) e tambm funes matemticas como seno, co-seno, logaritmo e exponencial. Algumas linguagens disponibilizam instrues grficas, para desenhar retas, crculos e outros objetos, colorir objetos e muitas outras.

10

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

E o melhor dos mundos: voc tambm poder criar suas prprias instrues e funes, que depois de testadas e corretas, poder usar como se fizessem parte do repertrio da linguagem. Por exemplo, voc poder escrever uma instruo chamada RepeteMeuNome, que mostra seu nome na tela 25 vezes. Uma vez testada, correta e gravada, basta inserir o nome da instruo na posio apropriada do programa ("chamar" a instruo) para mostrar seu nome 25 vezes. E se quiser mostrar seu nome mais 25 vezes, basta "chamar" de novo a instruo. Para melhorar ainda mais, voc pode criar a instruo de forma que a quantidade de repeties seja definida somente quando o programa for executado. Exerccio 0.2 - Reviso Complete os espaos: a) O processador executa instrues em linguagem de ________________. b) As instrues executadas pelo processador devem estar e so buscadas na _______________. c) As instrues em linguagem de mquina so agrupadas em _____________, cada um com uma finalidade determinada. d) Para ser executado, um programa deve estar na ______________ do computador, para onde carregado pelo _______________ ___________________. Exerccio 0.3 Vantagens e desvantagens Assinale com V as vantagens e com D as desvantagens de se elaborar programas em linguagem de mquina: ( ( ( ( ) ) ) ) Mais trabalhoso Maior rapidez de execuo Permite maior controle do computador Exige mais conhecimentos sobre o hardware do computador

Exerccio 0.4 Categorias de instrues Descreva as categorias de instrues de uma linguagem de programao de alto nvel. Para cada categoria, fornea dois exemplos de coisas que podem ser feitas.

.0.5. Converso do programa-fonte


Como o computador no entende as instrues de um programa-fonte, para que este possa ser executado, ele precisa ser convertido para a linguagem que o computador reconhece, a linguagem de mquina. Uma instruo em uma linguagem de alto nvel pode corresponder a centenas ou at milhares de instrues em linguagem de mquina. A converso feita por programas apropriados, e pode ser feito antes ou durante a execuo do programa. Quando o programa-fonte todo convertido em linguagem de mquina antes da execuo, esse processo chamado de compilao, e os programas que o fazem so chamados compiladores. O programa resultante chamado programa-objeto ou cdigo-objeto, que contm instrues em linguagem de mquina mas ainda no pode ser executado; para que isso ocorra, necessria outra etapa chamada "linkedio" (jargo da rea) ou ligao, efetuada tambm por um programa apropriado chamado "linkeditor" ou ligador. Na linkedio, so juntados ao cdigo-objeto do programa outros cdigos-objeto necessrios sua execuo. Aps esta etapa, a converso est completa e produz finalmente um programa executvel (figura).

0 - INTRODUO PROGRAMAO DE COMPUTADORES

11

e d i t oP r R O G R c A o M m F O N T E t e x t o

Ap i l a d P o R r O G O B J E

R T

A l i Mn k A e d i t oP r R O G R A M A O E X E C U T V E d e lin g u a g e m m q u in a d e

lin g u a g e m m q u in a

Quando a converso feita durante a execuo, o processo chamado de interpretao, e o programa conversor, interpretador. Neste caso, o interpretador permanece na memria, junto com o programa-fonte, e converte cada instruo e a executa, antes de converter a prxima. evidente, portanto, que a execuo de um programa interpretado mais lenta que a de um compilado. Note que no a linguagem em si que compilada e interpretada. Essa caracterstica depende da disponibilidade de um compilador ou um interpretador; pode haver ambos para uma linguagem, ou at nenhum.

.0.6. Orientao das linguagens de alto nvel


As instrues disponveis em uma linguagem de alto nvel podem no ser apropriadas para uma determinada aplicao. Programas cientficos tm muitas diferenas em relao a programas comerciais, que tambm podem diferir bastante de programas voltados para tratar imagens ou de inteligncia artificial. Assim, foram desenvolvidas linguagens para reas especficas. A primeira linguagem de alto nvel criada, o compilador FORTRAN, direcionada para aplicaes cientficas. A linguagem COBOL, tambm compilada, orientada para aplicaes comerciais. O interpretador BASIC voltado para iniciantes. A linguagem PL/I foi criada pela IBM para ser a unio de vrias linguagens. H tambm vrias linguagens que facilitam o tratamento de grandes quantidades de dados, como SQL (Structured Query Language). Uma distino importante a ser feita que uma coisa a linguagem, outra coisa a implementao comercial desta linguagem. H uma definio padro para a linguagem Pascal, por exemplo, e h compiladores comerciais desta linguagem, como o Turbo Pascal. Normalmente os ambientes de programao comerciais incluem instrues extras, conhecidas como extenses da linguagem, o que os torna menos compatveis com os outros. Os melhores compiladores comerciais incluem outras facilidades, como ajuda on-line, exemplos e vrios outros recursos.

.0.7. Linguagem Pascal


O PASCAL (no fale "pascoal"!) foi desenvolvido por Niklaus Wirth para ser a primeira linguagem de programao a ser aprendida. bem fcil de ensinar e aprender, e sua estrutura um pouco mais rgida do que a de outras linguagens, visando estimular maior organizao e disciplina no programador. Isso se justifica devido ao fato de que as linguagens, ao mesmo tempo em que permitem a elaborao de grandes solues, possibilitam que se cometa grandes erros, principalmente em programas maiores. Um programa pode estar sintaticamente correto e no entanto conter erros como seqncia inadequada das instrues, valores incorretos ou tambm a sua execuo pode nunca terminar normalmente, porque as condies de terminao nunca so atingidas (esses erros so chamados bugs ou erros de lgica). Para a construo de programas grandes e com estrutura muitas vezes complexa demais para nossos limites atuais, foram (e ainda continuam sendo) criadas vrias tcnicas e metodologias de desenvolvimento e estruturao de programas mais fceis de serem testados, alterados ou corrigidos. Mas no se iluda: qualquer que seja a linguagem ou a metodologia, possvel produzir programas

12

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

desorganizados, incompreensveis e repletos de erros ou que no fazem o que deveriam fazer. A qualidade final dos produtos depender predominantemente do programador. Exerccio 0.5 - Reviso Assinale V para as afirmaes verdadeiras e F para as falsas: ( ) Sintaxe o nome dado s regras de construo de frases em uma linguagem de programao. ( ( ( ( ) ) ) ) Um programa-fonte pode ser executado diretamente, como estiver. Um programa pode ser compilado mesmo que tenha pequenos erros de sintaxe. Um programa pode ser compilado, interpretado ou ambos. Um programa pode conter erros, mesmo estando sintaticamente correto.

.0.8. Software que voc precisa ter ou conhecer


Alguns programas so necessrios s atividades de um programador: Sistema operacional - Como programador, voc precisa ter um mnimo de informaes sobre o sistema ou ambiente operacional em vai trabalhar, como por exemplo: Como executar programas Os nomes que voc pode dar aos arquivos Como organizar seus arquivos em pastas ou subdiretrios Como listar, excluir, renomear e copiar arquivos Se o computador em que voc trabalha est conectado a uma rede, voc vai precisar de um nome registrado, associado a uma senha, para poder acessar arquivos e programas da rede. Editor de textos - Um programa Pascal um texto simples, sem caracteres de controle do tipo negrito, tamanho de fonte, paginao, etc. Voc vai precisar de um editor para digitar seu programa no computador. Editores que produzem tais textos so o Edit, que vem com o MS-DOS, o Bloco de Notas (NotePad), que vem com o Windows, e vrios outros. Textos formatados pelo Word, WordPad ou Carta Certa no servem. Os compiladores comerciais normalmente trazem um editor; us-los ser normalmente mais prtico. O Turbo Pascal traz um timo editor, e voc no precisar se preocupar com isto, exceto talvez para imprimir os programas. Compilador - Uma vez que voc digitou o texto do programa, precisar convert-lo para linguagem de mquina. Para isso voc precisa de um compilador. Como compiladores comerciais da linguagem Pascal temos por exemplo as vrias verses do Turbo Pascal, da Borland. H verses para DOS (at 7.0) e para Windows. H vrios outros, como o Free Pascal, compatvel com o Turbo Pascal e que voc pode transferir via Internet gratuitamente. Escolhemos o Turbo Pascal 7.0 por vrios motivos: facilidade de instalao, tima curva de aprendizagem, por ser a base do Delphi (um dos ambientes de programao profissional mais usados atualmente em micros) e ainda o fato de ser o "queridinho" da Internet: h muitos sites especializados nele, e quase nada dos outros. O Turbo Pascal 7.0 vendido at hoje, e no o acho exatamente barato, o que uma medida do interesse geral por ele.

0 - INTRODUO PROGRAMAO DE COMPUTADORES

13

.0.9. Fatores de sucesso


Um programador pode atuar em vrias reas. Como funcionrio de uma empresa, normalmente trabalha em equipe, recebendo especificaes dos analistas de sistemas. Pode ter uma empresa, com outros programadores ou no, e atravs dela comercializar seus programas. Outra possibilidade distribuir seus programas via Internet, na forma de shareware, modalidade de distribuio na qual o usurio tem acesso ao programa para avaliao antes da deciso de compra. H muitas pessoas que programam por hobby, por gostarem, e vrios deles acabam se profissionalizando, inclusive porque so muitas as oportunidades para quem est disposto a fazer um bom trabalho. Para que isso se materialize, so essenciais alguns recursos materiais e, alm destes, h recursos pessoais que, quanto mais desenvolvidos, mais enriquecem a competncia do programador: Computador pessoal - fundamental que voc tenha o seu prprio computador, para que se dedique mais e melhor, para que pratique quando quiser e puder e mais um monte de razes. Para comear, no preciso ter um Pentium; possvel rodar o Turbo Pascal, nosso compilador, at em um processador 286 e sistema operacional DOS 3.0. Por tudo isto, faa o que for preciso para ter o seu prprio microcomputador ou para ter acesso a um. Datilografia ou digitao - Se voc um (mau) catilgrafo, corra para fazer um curso, a no ser que queira sofrer. Sua produtividade ser bastante prejudicada. Ingls - A menos que voc tenha um compilador com ajuda ou manual em Portugus, procure desenvolver pelo menos alguma habilidade de ler ingls. essencial, por exemplo, para poder usufruir da ajuda sensvel ao contexto dos compiladores: voc aperta uma tecla e aparecem informaes sobre a palavra onde est o cursor da tela. No saber ingls uma forma de analfabetismo da rea de informtica! Tempo e dedicao - So os principais recursos que voc pode investir, e constituem fatores crticos de sucesso. Sem eles, nada ser possvel. Limites - Ter uma conscincia clara de que voc tem limites permite que eles sejam respeitados e tambm que possa ir alm deles. Em um determinado momento, h limites para o que voc sabe do sistema operacional, da linguagem, do compilador. H limites tambm para sua capacidade de organizar mentalmente informaes em maior quantidade. Conhecer seus limites pode evitar aborrecimentos, no sentido de que voc saber exatamente quando precisa de melhores informaes ou mtodos e que est na hora de busc-los.

"Se algo est difcil, eis a uma indicao de algo que voc no sabe" Richard Bandler & John Grinder

Atitude - O direcionamento interior que voc assumir (suas crenas e convices), principalmente em momentos crticos, pode fazer muita diferena. Todo profissional, de qualquer grau de maturidade, em algum momento fica diante de algo que no sabe, e deve decidir o que fazer. Persistir, desistir? Tentar um pouco mais? Muitos desistem dois minutos antes de achar a soluo ou um ponto de partida para ela. O ponto chave aqui perceber que cada momento desses uma oportunidade de melhoria.

14

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Experincia - Aprender a programar computadores um processo que tem um incio, mas no um fim, e se h limites para o que voc sabe, no h limites para o que voc pode aprender. Voc vai aprender de livros, exemplos, ao ver outros fazendo e outras formas. Mas a meu ver, a experincia (e o que voc fizer com ela), incluindo os erros aproveitados e os desafios vencidos, ser seu melhor professor e o que lhe proporcionar os aprendizados mais consistentes. E o que voc pode aprender depende pura e simplesmente de sua dedicao e de sua calma em progredir passo a passo.

"A inteligncia no substitui a falta de informao"

Exerccio 0.6 Planejando o dia Faa um levantamento das suas atividades semanais, juntamente com o tempo mdio necessrio para cada uma. Aps, identifique o tempo de que vai usar para o curso que est fazendo.

.0.10. Para voc que est comeando


Neste captulo voc obteve algumas noes bsicas sobre o que programar computadores e do que voc precisa para iniciar. J sabe que tudo que feito com e atravs do computador s possvel porque h pessoas elaborando os programas necessrios. E cada um desses programas foi produzido por um programador ou uma equipe de programadores. Nos programas maiores podem estar envolvidos vrios tipos de pessoas: programadores visuais, consultores e at compositores para as trilhas sonoras. Mas o programador o nico com presena garantida em qualquer projeto de programao. Mas na vida de todo programador houve um tempo em que ele no sabia nada; teve que comear, e do jeito mais simples. Primeiro aprendendo algo sobre como o computador funciona, depois aprendendo as primeiras instrues. Quase sempre o primeiro programa mostra uma frase na tela ou efetua uma operao aritmtica bsica. Aps dominar os princpios da coisa, ele aprende novas instrues, como fazer um programa tomar decises e controlar repeties, depois cria as suas prprias instrues. Conhece uma nova linguagem, descobre novas formas de programar, aplica suas prprias idias, ultrapassa obstculos e aproveita vrias oportunidades, sucessivamente atingindo graus crescentes de maturidade. Provavelmente (e isto bom) voc tem vrios pontos de interrogao: difcil? Ser que eu consigo? legal? D pra ganhar dinheiro programando? Como que esse Pascal? Tem que dedicar muito pra ficar bom? E por a vai. Vou resumir em algumas frases minha opinio: Programar to fcil ou to difcil quanto aprender a falar, andar, tocar um instrumento ou outra habilidade. Aps um comeo algo obscuro, estabelece-se uma base de conhecimentos e habilidades sobre a qual se cresce. Programar pode ser muito prazeroso, embora tenha momentos de desafio que podem diminuir o prazer de quem no os aprecia. uma atividade muito absorvente: se voc quiser fugir de alguma coisa, v programar! H muitas (mesmo) oportunidades para programadores ganharem dinheiro, seja como autnomo, como empresrio ou como empregado. Atuar como programador tambm tem sido a porta para muitos profissionais de outros ramos de informtica, e muito deles so melhores devido experincia como programador. O salrio inicial em geral superior a muitas outras categorias, e a competncia profissional valorizada. J vi casos de programadores que em dois anos passaram a analistas. til para isso ter conscincia de que um bom profissional

0 - INTRODUO PROGRAMAO DE COMPUTADORES

15

no constitudo apenas por conhecimentos e habilidades tcnicas. Neste curso voc encontrar tambm temas no diretamente tcnicos que podem ser, em certos momentos, at mais importantes. Obstculos fazem parte da vida de quem aprende; quem est aprendendo nem sempre est na "zona de conforto", pelo contrrio, est avanando sobre limites. Certos fatos, chamados em outros contextos de "problemas", para profissionais de informtica so na verdade oportunidades de melhoria, so feedback; bons profissionais aprendem como fazer e tambm como no fazer.

O que vai acontecer depende basicamente de quanto voc estiver disposto a investir, sabendo que s vezes semeamos para colher os frutos algum tempo depois, e que cada minuto dedicado com certeza dar seus frutos. Siga a receita do sucesso: estabelea onde quer chegar (em etapas, se necessrio) e tome as medidas necessrias para chegar l, modificando suas atitudes ou estratgias quando verificar que o que est fazendo no est funcionando.

.0.11. Atividades suplementares


Exerccio 0.7 - Reviso Identifique os conceitos e ache-os no diagrama, da esquerda para a direita, de cima para baixo e viceversa: a) Conjunto de regras de construo de palavras e frases em uma linguagem de programao de alto nvel b) A melhor professora c) Tipo de instruo que permite executar vrias vezes um conjunto de instrues d) Garante o emprego do programador e) Juntamente com a dedicao, constitui um recurso essencial do programador f) Componente do hardware usado para armazenar dados e instrues g) Tipo de instruo que permite executar um ou outro conjunto de instrues h) Processo de traduo de um programa-fonte para linguagem de mquina C O M P I L A O S P S M O T I V A O I S A X E R E O L A I R M E M A I A E X N T Y E P L H N C I A T E S T E A S G I F D A O E E T I K O F X E X P E R I N C I A C E M I R O C I C A I V N E O O P M E T S N A F U O H L A P O O R W A R N O T S J O I N T E R F A C E P

Entrevista 0.8 Experincia de outros Entreviste pelo menos dois alunos de turmas mais adiantadas e pergunte: qual foi a importncia desta disciplina para disciplinas posteriores? Se pudesse voltar atrs, como procuraria conduzir a disciplina? Se o colega j programou em duas ou mais linguagens, pergunte-lhe se o que aprende em uma linguagem pode ser aplicado em outras. Ele gostou ou gosta de programar?

16

.1 PENSANDO A PROGRAMAO

Voc sabe que cada disciplina possui formas peculiares de pensar: a forma de resolver problemas de Matemtica no a mesma da Biologia. A forma de pensar da Fsica inclui a da Matemtica e algumas outras. De forma anloga, a programao de computadores requer raciocnios apropriados, chamados em geral de "lgica de programao". Essa lgica uma combinao de elementos simples, que todos usamos no dia a dia mas nem sempre estamos cientes: executar uma seqncia de aes, tomar decises diante de alternativas e controlar aes repetidas. Uma vez que voc j conhece essas aes, este captulo vai prepar-lo para lidar com esses tipos de aes, na forma como so usados na programao.

.1.1. Meu Primeiro Rob


PARTE I: UAU! Ano: 2010. Cenrio: sua casa. No seu aniversrio, voc realizou um sonho: ganhou um magnfico rob tipo humano, modelo sem-sexo. No o mais moderno, verdade, mas sem dvida sensacional. E agora voc deve aprender a oper-lo, e para isso dispe to-somente do manual de instrues (e quando tiver grana, talvez voc faa o curso da loja...). Voc ento faz o primeiro teste: virando-se para o rob esttico, voc diz: Ligue a televiso no canal 10. O rob fica imvel. Voc insiste: Rob, ligue a televiso! E ele responde! Numa voz masculina, algo metlica, mas no desagradvel, ele diz: Instruo no compreendida. P, rob, como que voc funciona? Instruo no compreendida. Voc ento se resigna e pega o manual. L, descobre que todas as comunicaes com o rob devem iniciar-se com a palavra ROB, e que ele entende a linguagem, mas no como falamos normalmente. Seus comandos devem ser instrues num formato especfico: algumas regras devem ser obedecidas. Alm disso, o rob tem um repertrio limitado de instrues: s capaz de fazer o que j tem programado. Mais resignado (ou resignada) ainda, voc pacientemente d uma olhada geral no manual, enquanto procura pelas instrues que o rob entende. Encontra ento uma seo de aprendizagem rpida, e descobre que para fazer o rob falar algo, deve dizer-lhe: Fale(Frase, Entonao). Mas o manual alerta para dizer o Fale, no pronunciar os parnteses, substituir Frase pelo que voc quer que ele fale, e substituir Entonao por uma das palavras: Normal, Enftico, Sussurrante, Nervoso, Autoritrio e Staccato. Voc pode omitir a entonao, e o rob assumir Normal. Testando, voc diz ao rob: Fale Voc muitcho legal, Staccato.

2 - PENSANDO A PROGRAMAO

17

O rob continua em silncio. A voc se lembra de como deve comear: Rob, Fale Voc muitcho legal, Staccato. Vo-c--mui-tcho-le-gal. O som da resposta ressoa maravilhosamente em seus ouvidos e voc fica mais animado. Depois de brincar um pouco com as entonaes do rob, e fuando no manual, descobre uma seo chamada Servios Domsticos, e nela encontra as instrues Ligar(Aparelho) Desligar(Aparelho). Os aparelhos que o rob reconhece podem ser Lmpada, Ventilador, Rdio, Televiso ... A-H! Rob, Ligar televiso. Voc v o rob mover a cabea at parar na direo da televiso, andar at ela, estender a mo e pressionar com um dedo o boto de ON/OFF, retornando sua posio de imobilidade. Rob, desligar televiso. O rob faz os mesmos movimentos, desta vez sem andar. Progressos! De novo o manual. Na mesma seo, voc acha a instruo Sintonizar (Aparelho, Canal) onde Aparelho pode ser Televiso ou Rdio e canal um nmero de 1 a 500 se Aparelho for Televiso e uma freqncia se Aparelho for Rdio. L de novo, para se certificar de que tinha entendido e, j usando a experincia adquirida, comanda rapidamente ao rob: Rob, Ligar televiso. Rob, sintonizar televiso, 10. O rob executa os comandos exatamente como voc queria. Rob, voc sintoniza qualquer televiso? Instruo no compreendida. - , voc no nenhum Exterminador do Futuro. D um leve tapa no ombro do rob, sem qualquer reao. Evoluindo Aps alguns dias explorando o rob, e achando-o muito limitado, decide pedir uma grana emprestada para comprar um acessrio opcional: a ULP - Unidade Lgica Programvel. Um folheto que vira dizia que com a ULP o rob poderia aprender a reconhecer novos objetos e novas instrues. J com a ULP que voc mesmo instalou (lendo as instrues, claro), voc testa o reconhecimento de objetos. Voc j sabe que, para ensin-lo, deve mostrar o objeto e dizer o nome dele. E se quiser que reconhea vrios objetos distintos com o mesmo nome, deve fazer o mesmo com os demais objetos. Voc pega logo a caixa de Lego do seu irmozinho, e mostra ao rob vrias peas, dizendo Lego a cada uma. Aps ouvir cada nome, ele diz Registrado. Voc mostra por fim a caixa, dizendo: Caixa do Lego. Registrado. Virando o contedo da caixa, diz: Rob, guarde os legos na caixa do lego. - Favor reformular a instruo. Impaciente, revira o manual e descobre que o rob reconhece a instruo Coloque(Local). Ao ouvi-la, ele soltar um ou mais objetos que estejam em suas mos, no Local especificado. E uma das

18

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

maneiras de por objetos em sua mo atravs da instruo Pegue(Objeto). Pensando primeiro tem que pegar, para depois colocar, voc diz: Rob, Pegue Lego. Rob, Coloque Caixa do Lego. O rob imediatamente se abaixa, pega uma pea e a coloca na caixa. Rob, pra voc guardar todas! Favor reformular a instruo. Angustiado com a possibilidade de ter que dizer ao rob 200 vezes as instrues ou, pior, voc mesmo guardar as peas, de repente se lembra de um amigo que j teve um rob com ULP (e agora tem um modelo com-sexo!). Liga pra ele e fica sabendo que vai ter que programar o rob, criando uma nova instruo que o ensine a guardar todos os legos. O amigo disse que voc poderia programar 200 vezes o Pegue e Coloque, mas seria mais simples usando uma instruo de repetio. Conferindo o que seu amigo disse, voc l no manual que, para programar o rob voc deve descrever, na linguagem dele, o padro de comportamento que ele deve seguir. As instrues que descrevem o padro so armazenadas na memria do rob sob um nome que voc mesmo atribui, depois da palavra algoritmo, que o nome dos programas do rob. Aps a programao, basta dizer ao rob o nome dado para que as instrues sejam executadas. Mas ateno, alerta o manual: se um algoritmo tiver comando de repetio e o rob no achar uma condio de terminao, ele o executar at que seja desligado ou acabe a bateria. Sem entender muito bem o que o manual queria dizer com o alerta, mas muito interessado, voc tenta um pequeno programa. Aps verificar como fazer a programao, diz ao rob: Rob, programar. Registrado. mexer: Algoritmo LigarTV. Ligue(Televiso). Sintonize(Televiso, 10). Fim algoritmo. O rob, sem se Registrado. Rob, LigarTV. Ele imediatamente se dirige televiso e a liga, sintonizando no canal 10. Bom, bom. Pensando agora no problema de catar o lego, voc procura a seo do manual que trata de programao de repeties, conforme indicado pelo seu amigo. Chamam sua ateno as instrues: REPITA <instruo 1> <instruo 2> ... AT QUE <condio> REPITA N VEZES <instruo 1> <instruo 2> ... FIM-REPITA

A primeira para repetir instrues um nmero indefinido de vezes; o rob s pra quando uma condio ocorrer. A segunda automaticamente repete N vezes as instrues que estiverem depois do REPITA e antes do FIM-REPITA, ou seja, uma quantidade de vezes previamente definida. Voc escolhe a segunda instruo, que lhe pareceu mais fcil de entender: s conhecer as instrues a serem repetidas e substituir o N pela quantidade de repeties. Antes de programar o rob, e j mais metdico, voc anota num papel o que dir a ele, j com as instrues que iniciam e terminam uma programao e separando as instrues que sero repetidas:

2 - PENSANDO A PROGRAMAO

19

ALGORITMO GuardeLego REPITA 100 VEZES Pegue(Lego) Coloque(Caixa do Lego) FIM-REPITA FIM-ALGORITMO Voc repassa mentalmente as instrues e acha que est tudo na seqncia correta. J acostumado com aquele jeito estranho de conversar, comanda o rob, enquanto l suas anotaes: Rob, programar. Registrado. Algoritmo Guarde Lego. Repita 100 vezes. Pegue Lego. Coloque Caixa do Lego. Fim Repita. Fim algoritmo. Registrado. - Rob, guarde lego. Sucesso! O rob, com seu jeito mecnico, pega e guarda as peas, uma a uma, at que para. Ainda restam peas no cho. Voc comea a pensar em como poderia utilizar a instruo REPITA..AT para mandar o rob guardar as peas at no restar nenhuma. Mas outra idia vem, voc faz uma expresso marota e diz ao rob: Rob, programar. Registrado. Algoritmo Chateie Irm. Execute 1000 vezes. Fale voc no deve mexer no rob, Staccato. Fale voc no deve mexer no rob, Enftico. Fim Execute. Fim algoritmo. Registrado. Parte II: Tomando decises Agora voc quer descobrir como fazer o rob catar o lego at no restar nenhuma pea. J familiarizado com o manual, voc procura no ndice alfabtico pela palavra FIM. Nada. Depois tenta TRMINO, e nada ainda. De sbito, vem uma idia e voc procura DECISO. E l est: Decises, tomando. Abrindo na pgina indicada, encontra a descrio da seguinte instruo: SE <condio> ENTO <instruo 1> <instruo 2> ... FIM-SE Nesta instruo, se a <condio> for verdadeira, o rob executar as instrues depois de ENTO e at FIM-SE. Por isso, no lugar de <condio> voc deve colocar uma instruo que tenha resposta do tipo VERDADEIRO ou FALSO. Procurando no ndice CONDIO, e abrindo na pgina indicada, voc descobre que o rob capaz de fazer avaliaes do ambiente, atravs da instruo CONDIO (Objeto, Estado). Ao instruir o rob, Objeto deve ser trocado por lmpada, porta, algum aparelho ou outro objeto que o rob reconhea. Estado deve ser substitudo por aberto, fechado, ligado, desligado ou outro, que faa sentido para o objeto informado. O exemplo do manual lhe pareceu uma das formas mais estranhas que j tinha visto de se comunicar com algum: SE Condio(Lmpada, Acesa) ENTO Desligue(Lmpada).

20

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Mas parece fcil, voc pensa, e ento testa o rob: Rob, Condio(Televiso, Ligada). Favor reformular a instruo. Rob, Condio(Televiso, Ligado). Favor reformular a instruo. Surpreso, voc se indaga porque no funcionou. Folheia o manual, resmungando algo sobre os inventores daquilo no gostarem de artigos e preposies, quando v um exemplo no manual e diz: Rob, Fale(Condio(Televiso, Ligada)). Verdadeiro. Ufa! Funcionou, mas voc se pergunta se no haveria jeito melhor de programar algo to bobo. Bem, se no tiver, com isso que eu vou ter que me virar. Mas voc no viu ainda um jeito de o rob verificar se ainda tem peas de lego para guardar. Voltando pgina do SE..ENTO, e lendo os exemplos, voc v que depois do SE pode ser usada a instruo ACHOU, porque esta tambm tem as respostas VERDADEIRO ou FALSO. Achou o qu? Animando-se, descobre que o rob entende a instruo Procure (Objeto) Ao ouvi-la, ele efetua uma busca visual no ambiente pelo objeto indicado. O ACHOU se refere ltima procura feita. E voc pode incluir um NO antes do ACHOU: Se achou..., Se no achou.... Testando, diz ao rob: Rob, Procure (Pea do Lego). Rob, Fale(Achou). O rob, aps alguns movimentos com a cabea, responde: Verdadeiro. Muito bom. Uma nova idia: Rob, Procure(Pea do Lego). Rob, se achou ento fale(Meu amado mestre, achei uma pea do lego). Meu amado mestre, achei uma pea do lego. Veja s, tem jeito de voc parecer um pouco mais normal! De repente, lhe vem mente que havia aquela instruo REPITA..AT que executava vrias instrues at que uma condio fosse verdadeira: agora j entende as condies. Acha ento que j tem todas as que precisa: como procurar uma pea e guard-la na caixa, como repetir a procura e como fazer o rob decidir a hora de parar. Agora s falta organizar as instrues numa seqncia apropriada. Aps fazer alguns esboos num papel, voc finalmente chega ao algoritmo: ALGORITMO Guarde todos os lego. REPITA Procure(Pea do Lego) Pegue(Pea do Lego) Coloque(Caixa do Lego) AT QUE No Achou FIM-ALGORITMO Voc acha que o algoritmo vai funcionar, mas parece estar faltando alguma coisa. Faz de conta ento que o rob, e executa as instrues como se fosse ele. Procura uma pea, pega, coloca na caixa, a condio No Achou falsa, ento volta, procura uma pea, coloca... Espera a: e se no achar, vai colocar o qu? Chega concluso de que aps a procura deve testar se encontrou uma pea, e s pegar/colocar se achou pea. O algoritmo aperfeioado fica assim:

2 - PENSANDO A PROGRAMAO

21

ALGORITMO Guarde todos os lego. REPITA Procure(Pea do Lego) SE Achou ENTO Pegue(Pea do Lego) Coloque(Caixa do Lego) FIM-SE AT QUE No Achou. FIM-ALGORITMO Aps programar o rob, espalha as peas pra todo lado e diz: Rob, guarde todos os lego. YESSS!!! Uma a uma, o rob vai pegando as peas e colocando na caixa, at no sobrar nenhuma. Bem, sobrou uma, que cara embaixo do sof, mas nem por isso a satisfao menor. Sua imaginao dispara com as possibilidades de usar aquele seu servo: fazer-lhe massagem e cafun, arrumar seu quarto, caf na cama, digitar trabalhos (ou quem sabe faz-los!), lhe dar banho... Que outras coisas interessantes poderia fazer com ele? Exerccio 1.1 Outras utilidades do rob Se tivesse um rob como o do texto, para que acha que o usaria? Identifique 3 aplicaes. Seja especfico: atender porta, ao invs de 'tarefas domsticas. Exerccio 1.2 - Chateando Como voc instruiria o rob para chatear algum, se quisesse? Faa um algoritmo simples para isso. Voc pode utilizar instrues mencionadas no texto ou inventar alguma que lhe parea razovel estar disponvel num rob domstico (por exemplo, Puxar (Objeto), onde Objeto pode ser cabelo). Exerccio 1.3 Decises cotidianas Cotidianamente tomamos vrios tipos de deciso: quando parar de comer ou a que horas tomar banho, estudar ou ir ao cinema, o que jogar no computador e inmeras outras. Fornea 3 exemplos simples de decises domsticas e cotidianas do tipo SE <condio> ENTO <ao> SENO <outra ao>, distintas das mencionadas no texto. Modelo: SE telefone est tocando ENTO Atenda ao telefone SENO "Continue estudando". Exerccio 1.4 Fale comigo Altere o algoritmo Guarde todos os lego, acrescentando instrues de forma que o rob, depois de guardar todas as peas, informe a concluso.

.1.2. Brincando de rob


Aproveitando as idias da histria, vamos explorar um pouco as possibilidades de um rob. Nos exerccios abaixo, considere que o rob entende as seguintes instrues: Ande(X passos) Vire(X graus), onde graus positivos referem-se ao sentido horrio.

22

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

As respostas dos exerccios devem ter a forma de um algoritmo, como na histria. Veja um exemplo: Exemplo 1.5 Ande e vire Usando as instrues Ande e Vire, elabore um algoritmo que faa o rob ( esquerda) alcanar o pote do outro lado. A linha tracejada representa a medida da distncia, em passos .

Soluo:
Algoritmo BuscaOPote_2 Ande(10 passos) Vire(90 graus) Ande(3 passos) Vire(-90 graus) Ande(8 passos) fim

Exerccio 1.6 Ande e vire 2 Agora sua vez: faa um algoritmo semelhante para o roteiro abaixo:

Exerccio 1.7 Ache o erro O algoritmo abaixo foi feito para o rob achar o pote por um dos caminhos, mas contm erros. Corrija-o.

2 - PENSANDO A PROGRAMAO

23

Algoritmo BuscaOPote_com_erro Ande(10 passos) Vire(90 graus) Ande(4 passos) Vire(90 graus) Ande(8 passos) Vire(90 graus) Ande(4 passos) Vire(-90 graus) Ande(8 passos); fim

Exemplo 1.8 Alternativas Na figura abaixo, h um obstculo, e no se pode saber se o rob pode passar at que ele chegue ao local. L, ele deve verificar se pode passar; se puder, prossegue, seno volta.

?
Verifique que o algoritmo deve ter os seguintes passos:
"Ande at o local do obstculo" "Se puder passar" "Ande at o pote" "Seno" "Volte ao ponto de partida".

Lembre-se de que o rob, diante de alternativas, pode tomar decises, na forma:


Se <condio> ento Aes Seno Outras aes.

Consultando o manual, verificamos que o rob entende uma instruo do tipo verdadeiro ou falso, no formato Possvel(Verbo), onde verbo uma ao. Uma das aes pode ser andar, ou seja, a instruo informa verdadeiro quando o rob pode dar um passo e falso quando no pode. Com essa instruo, podemos converter os passos acima para um algoritmo que o rob entenda:
Algoritmo BuscaOPoteComDeciso; Ande(6 passos) Se Possvel(Andar) ento Ande(6 passos) Seno Vire(180 graus) Ande(6 passos); fim.

24

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exerccio 1.9 Alternativas duplas Vamos aplicar o comando de escolha para o percurso abaixo. Agora o rob deve seguir por um dos lados, verificar se pode passar. Se puder, segue, caso contrrio, volta e passa pelo outro lado. Somente um dos lados vai estar fechado.

?
Como dica, veja a seqncia bsica das aes:
"Ande at o obstculo da esquerda" Se " possvel andar" ento "Ande at o pote" Seno "Retorne e v at o pote pelo outro lado".

Note que algumas das aes devem ser decompostas para se chegar a instrues que o rob entende. Faa agora o algoritmo. Exemplo 1.10 Repetio Vamos ver agora como um comando de repetio pode facilitar o controle das aes do rob. Combinando as instrues Repita..At-que e uma variante de Possvel(), a instruo Impossvel(), para o percurso abaixo podemos fazer o seguinte (passando pela esquerda):

Algoritmo AndandoComRepetio Repita Ande(1 passo) At que Impossvel(Andar); Vire(90 graus); Repita Ande(1 passo) At que Impossvel(Andar) Vire(-90 graus)

2 - PENSANDO A PROGRAMAO

25

Repita Ande(1 passo) At que Impossvel(Andar) Vire(90 graus) Ande(6 passos) Vire(-90 graus) Ande(6 passos) fim

Note que para a maioria do percurso no precisamos mais saber quantos passos o rob deve dar, o que sem dvida proporciona muito mais flexibilidade. Exerccio 1.11 A casa Elabore um algoritmo para que o rob percorra a "casa" da figura abaixo e caminhe at o pote. Faa uma estimativa de passos, digamos, cada centmetro na folha um passo.

.1.3. Algoritmos
Como voc viu na histria do rob, algoritmos descrevem padres de ao para se resolver um problema ou atingir um determinado resultado, usando um repertrio de aes disponveis. A elaborao de algoritmos a alma da programao; boa parte desta consiste em se achar solues que possam ser implementadas com os recursos disponveis no computador e em uma linguagem de programao. O personagem da histria estava envolvido em elaborar algoritmos para conseguir que o rob fizesse o que queria, assim como voc, nos exerccios, estava envolvido em fazer o rob chegar at o pote. Todos estamos familiarizados com algoritmos, j que aplicamos vrios no dia-a-dia. Quando voc decide que vai a algum lugar e escolhe o meio (a p, de carro, de nibus) e um itinerrio, est elaborando um algoritmo. Assim como os algoritmos do rob, voc executa aes (andar), repete alguma ao at que uma condio seja atingida (andar at chegar ao destino ou a um ponto intermedirio) e toma decises (qual caminho tomar, para onde virar em encruzilhadas). At quando paquera voc elabora algoritmos, embora possa no ter conscincia disto. Ele ou ela me interessa? O que fazer primeiro, flertar ou mandar um bilhetinho? Talvez voc repita alguns comportamentos que funcionaram em outras oportunidades (ou imite o padro de algum...).

26

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

E se sabe fazer qualquer coisa ao fogo, seja ferver gua ou preparar macarro bolonhesa, sabe que, se no executar certas aes em uma determinada seqncia, no vai atingir os resultados desejados. Mesmo para ler esta pgina est usando algum algoritmo. Assim, algoritmo para voc mais um nome novo para algo familiar. Uma pgina pode ser lida de vrias maneiras: a que aprendemos na escola, a leitura dinmica, a fotoleitura. Ou seja, h vrios algoritmos de leitura. O mesmo ocorre com os algoritmos de computador; para um mesmo problema ou resultado desejado, podem haver vrias solues possveis. Um problema muito comum ordenar uma srie de valores em ordem crescente ou decrescente, como uma lista de N nomes de clientes. Uma forma de fazer isto percorrer a lista procura do maior e coloc-lo em outra lista, repetindo isto N vezes, a cada vez escolhendo o maior dentre os que restaram. Para o problema da ordenao h vrios outros algoritmos, como o da bolha, o quick-sort e o heap-sort, cada um apropriado a um tipo de situao. No caso de ir a algum lugar pela primeira vez, voc em geral estar procurando o melhor algoritmo dentre vrias alternativas para chegar l.

.1.3.1

Representando problemas e situaes

Voc tambm j conhece formas de representao de problemas e padres de soluo, como a da matemtica. Lembre-se, por exemplo, das equaes do segundo grau, como x 2 3 x + 1 = 0 . Para representar todas essas equaes, escrevemos. Os coeficientes a, b e c expressam que os valores em suas posies podem ser quaisquer. Para definir uma equao do segundo grau, portanto, precisamos saber somente os coeficientes, que so o que varia de uma equao para outra. E para achar as solues, o padro

x=

b b 2 4ac 2a

A frmula acima indica o que se deve fazer para achar as solues usando os coeficientes, ou seja, o padro de comportamento que se deve seguir, e um tipo de algoritmo. Designamos com nomes o que importante para descrever a situao (a, b, c) e indicamos a soluo por meio de algum tipo de representao das aes que devem ser executadas (operaes matemticas). E quando formos resolver o problema para algum caso especfico, trocamos os nomes pelos respectivos valores e executamos as operaes previstas. De maneira geral, um algoritmo envolve coisas ou objetos, e aes sobre ou usando esses objetos. Na equao acima os objetos so os coeficientes, representados por suas letras, e as aes so elevar ao quadrado, subtrair, somar, dividir. Na histria do rob os objetos eram legos, e as aes eram procurar, pegar, colocar, alm de aes de controle, como deciso e repetio. Lembre-se do que acontece no Windows quando clica com o boto direito sobre um objeto, como um cone de arquivo: aparece um menu com as aes ou operaes que voc pode executar sobre aquele objeto. Tudo se resume ento a duas perguntas: como representar objetos e como representar aes sobre os objetos, de uma forma mais fcil e mais apropriada. No Windows, representa-se arquivos como cones ou pequenas imagens, e esta uma forma que algum considerou apropriada para lidar com eles. No antigo ensino primrio, uma incgnita de um problema era representada por um .No nosso contexto computacional, os objetos so representados de forma semelhante matemtica, usando-se variveis. Uma varivel um nome atribudo a um valor ou caracterstica para generaliz-lo. Na equao do segundo grau, "a" o nome dado ao coeficiente do termo ao quadrado, que representa todos os coeficientes possveis para o termo.

2 - PENSANDO A PROGRAMAO

27

Voc j usa variveis Veja como usamos variveis no dia a dia: se voc vai comprar um sapato, o vendedor lhe pergunta: qual o seu nmero? Voc pergunta: quanto custa? O nmero e o preo so variveis que representam caractersticas de um objeto, um sapato. Outras variveis de um sapato podem ser de interesse, conforme a pessoa: cor, marca ou altura do salto. Ao decidir se paquera ou no algum, voc procura "valores" para certas variveis de seu interesse: sexo, idade, cor do cabelo, e por a vai. Como voc j viu na histria do rob, no contexto da programao h mais flexibilidade ao se dar nomes a variveis. muito mais fcil entender nomes como "NomeCliente", "CodigoProduto" (no se usa acentos nem espaos) e "Contador" do que com NC, CP ou C. O que se pode fazer com as variveis de um problema? Genericamente, o que se faz com variveis armazenar valores ("atribuio") e recuperar valores armazenados (atravs do respectivo nome). Outras operaes dependem do papel da varivel. Subtrao, por exemplo, uma ao apropriada para se fazer com nmeros. No caso de uma pessoa, "pegar" uma ao apropriada para uma pea de lego, mas "comer" no parece ser. Assim, as operaes sobre as variveis vo depender do que contm a varivel: se representa um nmero qualquer, pode-se fazer contas com ele. Se o nmero representa a populao de uma cidade ou a quantidade de faltas de um aluno, outras coisas podem ser feitas. E uma vez que se sabe o que fazer, qual a melhor forma de representar as aes? Para os nossos propsitos, voc pode imaginar um algoritmo como um "ser" ou processador (com memria) que recebe uma entrada, na forma de variveis, executa aes e produz uma sada tambm na forma de variveis ou um resultado:
E n t r a d a

S A e s

a o d ur a e s u l t a d o

Para a equao do segundo grau, o diagrama seria:


a , cb ,

a lc u la r r a z e s

X , 1X

Se o algoritmo visasse um desenho, por exemplo, no haveria uma sada na forma de variveis (e talvez voc desenhasse o prprio crculo na seta da sada).

28

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Tendo a viso entrada/processamento/sada, basta descrever as aes, para o que h vrias maneiras. O problema da equao do segundo grau, por exemplo, poderia ser descrito em forma de narrativa: "Uma equao do segundo grau representada como o produto de a pelo quadrado de x mais o produto de b por x mais c, tudo isto igual a zero. Para achar a primeira raiz, some menos b com a raiz quadrada do quadrado de b menos o produto de 4 por a por c, dividindo o resultado pelo dobro de a...". Se for escolhida a matemtica, a soluo ser indicada pelo frmula acima. As operaes no mudam, s a forma de indic-las; ao invs de se escrever "menos", por exemplo, escreve-se "-". O rob da histria entende "Pegar", mas poderia entender como "Pick" se a sua linguagem fosse baseada no ingls. Compreender o que deve ser feito mais importante do que a representao. Assim, para representar uma soluo algortmica no h regras rgidas, voc vai escolher a melhor de acordo com o contexto e com o que conhece. Pode ser a matemtica ou uma narrativa, como acima. Pode ser como os algoritmos do rob. Existem formas mais visuais, como o fluxograma e o diagrama de Chapin (ver por exemplo Guimares e Lajes). Se muitas decises devem ser tomadas em seqncias, pode-se usar uma rvore de deciso (veja o captulo 6). Voc pode usar uma forma sua de expresso, pode misturar tudo e pode inventar comandos. As diretrizes principais so usar algo que voc conhea e ficar prximo ao formato estruturado das linguagens de programao (o que voc s pode fazer quando conhecer uma). Elaborar um algoritmo pode ser um grande prazer, que no deve ser prejudicado por nenhuma regra rgida. No decorrer do texto representaremos algoritmos de formas livres e variadas, incluindo comandos parecidos com os da histria do rob, diagramas, pseudo-comandos (como "armazene 1 na varivel Contador") e outros que sero descritos. Confira tambm as dicas para elaborao e o apndice com ferramentas de pensamento. Exerccio 1.12 Reconhecendo aes sobre objetos Para cada objeto abaixo, identifique duas operaes que voc pode efetuar sobre ou com cada um: a) Televiso b) Lpis c) Livro d) Carro e) (escolha um) Exerccio 1.13 - Variveis de uma pgina Localize em um processador de textos (Word, WordPerfect, Carta Certa) a parte de configurao de layout de pgina, e identifique pelo menos 4 variveis que o programa usa para representar uma pgina. Exerccio 1.14 Variveis de etiqueta Observe ou faa um esquema de uma folha para impresso de etiquetas e identifique as variveis que seriam importantes caso voc fosse fazer um algoritmo para imprimir nesse tipo de folha. Por exemplo: quantidade horizontal, altura da etiqueta. Indique em uma figura as variveis encontradas. Exerccio 1.15 Ordenando Ordene os seguintes conjuntos, procurando observar como o faz: a) Os dedos de sua mo, pelo tamanho b) Idem, pela espessura c) As palavras desta frase, por quantidade de letras

2 - PENSANDO A PROGRAMAO

29

Exerccio 1.16 Algoritmo para cozinha Identifique algo simples que saiba fazer na cozinha ("ferver gua", "fritar um ovo") e descreva-o como um algoritmo: entrada necessria, processamento e sada ou resultado.

.1.4. Atividades suplementares


Exerccio 1.17 Apagando as luzes Faa um algoritmo para que o rob, no esquema de casa acima, percorra todos os cmodos e verifique se cada lmpada est acesa. Se estiver, ela deve ser apagada. Considere a instruo Aceso(objeto), que retorna verdadeiro ou falso, e Apague(Lmpada). Para que o rob possa verificar um cmodo, ele deve dar pelo menos um passo dentro dele. Exerccio 1.18 Soletrar tem algoritmo? Observe a seguinte afirmao: "A estratgia tpica de soletrao das pessoas produzir uma imagem interna da palavra e ler cada letra. Uma evidncia disso o olhar fixo frente da pessoa enquanto est soletrando". Voc acha que o procedimento descrito pode ser considerado um algoritmo? Se sim, descreva-o em termos de entrada, processamento e sada.

30

.2 O PROCESSO DE PROGRAMAR

O processo de elaborar um programa-fonte em uma linguagem de alto nvel, na verdade, apenas uma parte da programao. Saber o que o programa deve fazer, e saber verificar se o programa faz o que deve e no faz o que no deve so etapas integrantes de qualquer projeto de implementao. E so independentes da linguagem utilizada. Neste captulo voc vai ver tpicos que so imprescindveis a qualquer programador e elaborao de qualquer programa. Conhecer e saber usar este material tornar tudo mais fcil, e no conhec-los pode realmente tornar todo o resto impossvel.

.2.1. Estratgia geral de programao


Pense no seu corpo; o que imagina? Provavelmente pensou no seu corpo inteiro, um todo. Este todo pode ser visto em um nvel de estruturao: cabea, tronco e membros. Ao ler isso, voc deve ter imaginado essas partes. Agora focalize os membros: estes tambm podem ser vistos de uma forma estruturada: braos e pernas. Agora imagine um brao e suas partes... Continuando, passaremos pelo nvel fisiolgico e pelos nveis celular, molecular, atmico e possvel descer ainda mais. De forma anloga, voc pode observar o universo, uma galxia, um sistema solar, um planeta, um continente, um pas, um estado, uma cidade, um bairro, uma casa, um quarto e...voc praticando programao! Videogames tm fases, quebra-cabeas tm peas, livros tm captulos e por a vai. Assim como tantas coisas na vida, ao programar computadores precisamos segmentar as coisas at que as partes tenham um tamanho administrvel, ao alcance da nossa inteligncia e capacidade atuais. O tamanho de cada parte vai depender do que queremos e sabemos fazer. Esta estratgia usada por um programador em todos os nveis, como voc ver nas sees seguintes. Exerccio 2.1 - Segmentao Identifique divises de cada item: a) Um jornal b) Um computador c) Uma escola d) O tempo e) Uma frase

3 - O PROCESSO DE PROGRAMAR

31

Como diretriz geral, lembre-se de que, se algum resultado desejado no estiver sendo atingido, provavelmente o momento de segmentar, de dividir o problema em partes menores.

.2.2. Etapas da programao


Voc j teve contato com alguns programas prontos. Viu que um programa faz algumas coisas, outro faz outras diferentes. Viu como so os programas por fora, na viso do usurio, e j sabe que o que produz esses efeitos no computador um programa executvel, programado originalmente como um programa-fonte, que foi convertido para linguagem de mquina. Voc j tem noes, portanto, dos elementos fundamentais da programao de computadores: a especificao, que diz o que o programa deve fazer; o resultado final, que o programa funcionando no computador; e o programa-fonte propriamente dito. Um programador est envolvido com esses trs elementos. Ele parte da especificao e projeta um programa, a partir deste projeto implementa um programa executvel e o testa para ver se atende especificao (figura). Este o primeiro nvel de segmentao da programao.

I F

I C

PR AR ET OJ

P F

R O

O N

G T

TE

R E

ST

AR

A
I M P L E M E N T

P P
A

R R
R

O O

G R A M J E T A D

A O

A especificao indica os objetivos do programador, o que fazer. O programa projetado o efeito, o que ser visto por seus usurios, isto , visto por fora. E o programa-fonte o como: instruo a instruo, comando a comando; a causa que vai fazer com que acontea o efeito.

.2.3. Especificao do programa


Pode me dizer, por favor, que caminho devo pegar? Depende para onde voc quer ir, disse o gato. No me importa muito onde..., disse Alice. Ento no importa o caminho que voc pegue, respondeu o gato. Alice no Pas das Maravilhas Lewis Carroll

32

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Uma pessoa pode dirigir um automvel de pelo menos duas maneiras: com destino ou sem destino. Se no h destino definido, a pessoa pode andar a esmo por horas a fio, virando para qualquer direo que lhe der na cabea, que no far muita diferena. Porm, se a pessoa sai de casa pretendendo ir a algum lugar, a direo para onde vai determinar se vai ou no chegar ou se chegar com atraso. Isso vale tambm para certos equipamentos domsticos: ao programar a gravao de um videocassete, por exemplo, voc ter em mente uma descrio precisa do que quer, como por exemplo: Gravar o programa que ser transmitido no dia 25.12.96, das 21:30 s 23 horas, no canal 7". Voc tambm sabe exatamente qual o produto final: uma fita gravada com o programa desejado. Reflita por um momento como voc conseguiria programar o videocassete sem alguma das informaes acima. De forma anloga, muitos programadores sentam-se diante de um microcomputador para program-lo, sem definir precisamente aonde vo chegar. Muitos alunos perdem pontos em provas porque no lem ou no fazem tudo que est sendo pedido. Isso ocorre tambm em outras disciplinas que no programao. E muitos programas profissionais so devolvidos, gerando custos extras e atrasos, pelo mesmo motivo: fora de especificao. Assim como na vida pessoas sem objetivos em geral dispersam suas energias, programadores sem uma especificao adequada so via de regra dispersadores de energia, que podem dedicar horas ou dias para pouco produzir de efetivamente til. Portanto, a primeira coisa a se ter em mente ao programar computadores saber o que ser feito, uma descrio objetiva do que se espera que um programa faa, chamada especificao. Uma especificao contm as caractersticas e detalhes relevantes de um programa: o que entra, o que sai, instrues para clculos, podendo incluir tambm figuras e diagramas ilustrativos. A especificao indica o objetivo primrio do programador. o ponto de partida e o ponto de chegada. a referncia para ele saber se est certo ou errado, e se est progredindo ou no. Certo o que atende especificao. Exemplos de especificaes simples: Calcular fatorial, Desenhar um quadrado na tela ou na impressora, Ordenar uma lista de 1000 nmeros em ordem ascendente, Jogar o jogo-da-velha. Especificaes mais complexas podem envolver vrias folhas, documentos, esquemas e figuras. O bom programador fiel - Voc pode ser um programador esforado e dedicado, alm de extremamente criativo, mas se no fizer o que foi especificado, estar errado e ponto final. Por isto, deixe que crie razes bem fortes na sua mente o princpio da fidelidade especificao. Primeiro faa o que lhe foi pedido; depois, se quiser e tiver tempo, dediquese a fazer algo a mais. Caractersticas de uma boa especificao - Uma especificao deve ser correta: se o programador segui-la adequadamente, o programa resultante produzir resultados confiveis e de acordo com o esperado. Por exemplo, a especificao pode conter uma frmula para o clculo de juros que contm um sinal invertido. Voc pode ter sido fiel especificao, mas o programa far clculos errados. Uma especificao tambm deve ser completa, em termos de seus objetivos. Quando completa, contm todos os detalhes necessrios e suficientes para que o programa possa ser elaborado. Uma das grandes causas de atrasos no desenvolvimento de programas so especificaes incompletas, que obrigam o programador a rever decises anteriormente tomadas, com todo o retrabalho que isso pode causar. Por exemplo, suponha que voc entregou o programa dos juros, pronto, para o usurio testar. Ele ento

3 - O PROCESSO DE PROGRAMAR

33

descobre que esquecera de lhe informar que o clculo dos juros, em uma determinada poca, era feito de forma diferente. L vai voc ento alterar o programa e testar tudo de novo. O programador deve tomar decises No mundo real, existe a possibilidade de que a especificao esteja incompleta ou errada, por fatores fora do controle do programador, como enganos do especificador ou erros de digitao. No caso de especificaes incompletas, as informaes no sero suficientes para a produo de um programa completo. Vrias omisses ocorrem no ambiente escolar: a especificao normalmente omite detalhes a respeito de formatao de tela e outros aspectos que no faam parte da essncia do problema. No caso de um programa que calcule as razes de uma equao do segundo grau, por exemplo, no importa (exceto se especificado) se o faz em uma janela, se limpa ou no a tela, ou se uma mensagem de erro fica piscando na tela por 5 segundos, desde que as razes sejam calculadas corretamente. O aprendiz deve ento decidir por si mesmo como vai implementar o programa, suprindo as omisses. importante compreender que, ao ver pela primeira vez uma especificao, o programador est no grau mais superficial de entendimento. Este vai aumentando medida que se l, se estuda, se discute e se evolui na implementao.

"Mantenho seis servidores honestos, eles me ensinaram tudo o que sei. Seus nomes so: O qu e Por Qu e Quando e Como e Onde e Quem".
Rudyard Kipling

Exerccio 2.2 - Reviso Assinale V para as afirmaes verdadeiras e F para as falsas: ( ) como. Uma especificao indica ao programador o que fazer, mas no necessariamente

( ) Eventualmente o programador ter que tomar certas decises sobre o que fazer no programa devido a omisses da especificao. ( ) Eventualmente o programador no poder tomar certas decises sobre o que fazer no programa devido a omisses da especificao. ( ) O programador deve modificar a especificao para tornar o programa mais simples e fcil de implementar. ( ) O programador no deve se importar se a especificao est completa ou no, sempre poder culpar depois quem forneceu a especificao. Exerccio 2.3 Caractersticas de especificaes Complete os espaos: a) b) Mais importante que ser criativo o programador ser _______________ especificao. Uma boa especificao deve ser _______________ e _________________.

c) Uma das grandes causas de atraso na entrega de programas so especificaes ____________________.

34

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exerccio 2.4 Sendo especfico Voc pode definir especificaes precisas (pelo menos para voc) para tarefas domsticas, como: Pegar o CD azul da Ennya e reproduzir a faixa 3 duas vezes Defina especificaes detalhadas para as tarefas abaixo: a) b) c) Preparar um lanche da tarde. Estudar um tpico de uma disciplina (especifique qual). Preparar uma mala para viagem.

Exerccio 2.5 Seu dia Elabore uma especificao das suas atividades para um prximo dia til. Aps, faa uma crtica da completeza e correo. Aps viver esse dia, verifique o quanto foi fiel ao planejamento feito.

.2.4. Projeto de programas


"Voc pode realizar tudo que pode conceber Eva Pierrakos, em O Caminho da Autotransformao.

O fato de haver especificaes decorre em geral de haver algum querendo um programa e no sabe ou no quer faz-lo, e ento pede para um programador. Nesta situao, e em qualquer outra em que o programa no foi concebido pelo prprio programador, este precisa entender o que o outro quer, para que possa atend-lo. A melhor forma de fazer isto criar uma viso do resultado final, que aqui chamamos de projetar o programa. Ao ver pela primeira vez a especificao, voc est no ponto em que dispe da menor quantidade de informaes. Se est comeando e no tem muita experincia, pode ter um "branco" ou um "preto" total. Isto natural; quando iniciamos algo, voc sabe que previsvel que teremos alguma dificuldade, muito mais pela falta de informao que por falta de habilidade. Tambm comum ocorrerem no incio erros de interpretao da especificao, que vo sendo esclarecidos medida que se prossegue. No nem necessrio chamar isto de "erros": se preferir, chame de "interpretaes iniciais". Todos esses fatores remetem a um s ponto: preciso elaborar um projeto do programa, conceber como ele ficar quando pronto. Imagine, por exemplo, que um jogo de computador deve ser programado. Como ser mais fcil fazer isto, comeando de algumas frases no papel ou depois de j ter "jogado" o jogo algumas vezes na cabea? Na verdade, nenhum programador consegue fazer um programa sem t-lo na mente; o que s vezes ocorre que o desenho vem sem que precisemos pensar conscientemente nele, o que inclusive evidncia de maior maturidade. Para projetar programas, voc precisa saber como so os programas e o que possvel fazer com eles e com o computador. Parte da experincia voc j teve, ao experimentar os programas de demonstrao; veja mais a seguir.

.2.4.1

O que os programas fazem

Basicamente o que os programas fazem so combinaes das seguintes operaes: Sada Programas mostram ao usurio instrues ou resultados, na tela ou em outro perifrico de sada. Podem tambm fazer algum tipo de formatao ou desenho na tela.

3 - O PROCESSO DE PROGRAMAR

35

Entrada Programas efetuam leituras de dados (um nmero, um texto, uma tecla), normalmente digitados pelo usurio. Aps lido, um dado guardado na memria para que possa ser usado depois. Decises Diante de alternativas, os programas tomam decises: o aluno passou? O nmero lido vlido, ou seja, est dentro de uma faixa de valores esperada? Qual opo do menu deve ser executada? Repetio Por vezes os programas repetem algo que fizeram anteriormente, s parando quando alguma condio for atingida. Em um menu, por exemplo, o programa s deve parar quando for digitada a opo que indica o trmino. Clculos e outras computaes algumas coisas que um programa faz podem no estar visveis. Por exemplo, em um programa que calcule razes de equaes do segundo grau, na tela vo aparecer mensagens pedindo para informar os coeficientes da equao e para mostrar os resultados, mas o clculo feito no indicado.

.2.4.2

Tipos de programas

Talvez voc esteja familiarizado com programas para Windows, com barras de menus e de ferramentas, botes, cones, caixas de dilogos e outros tipos de objetos. Os programas que veremos aqui no possuem a tela em modo grfico, como no Windows, e sim em modo texto. Neste modo a tela dividida em linhas e colunas, assim:
T E X T O _ X X X X X X X X X X X X X X X X

| -

| -

Em cada posio da tela podemos apresentar um caractere, como A, i, !, ^, | e outros menos comuns. Toda tela em modo texto possui um cursor, que fica piscando em alguma posio. H diferentes modos texto, sendo o normal 80 colunas e 25 linhas. Esta tela caracterstica do sistema operacional MS-DOS (e suas variaes), que era o padro dos PCs antes do Windows. O DOS executa somente um programa de cada vez, e todos os programas compartilham a mesma tela, ao contrrio do Windows, no qual cada programa tem sua janela. Veja mais sobre DOS em outro captulo frente. Programas "mquinas de escrever"

36

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Chamamos os programas de seqenciais quando sua tela formada de maneira parecida com uma mquina de escrever. O texto aparece de cima para baixo, uma linha de cada vez. Veja ao lado um exemplo de tela de programa seqencial. O programa pede o nome, o usurio digita o nome e tecla Enter. Depois o programa pede para digitar a disciplina, a nota e finalmente informa se o aluno passou ou no, terminando em seguida. Aps cada digitao o usurio do programa tecla Enter para informar a concluso.

Entre nome: Fulano Entre disciplina: Linguagem Entre nota: 6 Fulano, Voc passou em Linguagem

Prtica 2.6 Conhecendo programas seqenciais Execute o programa de demonstrao. Selecione a opo "Programas por tipo" e depois "Programas seqenciais". Execute os programas mostrados. Programas com menus H programas que apresentam algumas opes na tela, e o usurio deve escolher o quer fazer. O programa de demonstrao um desses. O menu pode ser horizontal ou vertical, e mais ou menos sofisticado: podem permitir que o usurio escolha o que quer fazer por uma letra ou nmero, podem destacar a opo com uma cor diferente ou brilho. Cada seleo pode conduzir a uma ao ou a outro menu secundrio. Um estilo muito fcil de implementar o de menus simples e verticais, como o da figura abaixo. Prtica 2.7 Conhecendo programas com menus Execute o programa de demonstrao (que orientado a menus). Selecione a opo "Programas por tipo" e depois "Programas com menu". Execute os programas mostrados.
MENU PRINCIPAL 0 - Termina +-----------+ 1 - Cadastro de programas 2 - Programas por tipo H programas que no seguem 3 -padres vistos; afinal, no h regras os Programas por categoria rgidas sobre como os +--------+----+ programas devem funcionar. Um exemplo o programaque faz desenhos segundo os movimentos que o usurio faz com o cursor atravs das setas do teclado, cuja tela pode ser vista ao lado. +-------+--------+ Tecle sua opo:_ ---------+ +--------------------+

Outros tipos

Prtica 2.8 Conhecendo outros estilos de programas Execute o programa de demonstrao. Selecione a opo "Programas por tipo" e depois "Programas variados". Execute os programas mostrados.

3 - O PROCESSO DE PROGRAMAR

37

.2.4.3

Estrutura de programas

No importa quais operaes os programas executem, nem qual o seu tipo; todos tem uma estrutura, e podem ser vistos de uma forma segmentada. Na viso mais geral, os programas tm 3 partes ou sees: inicializao, principal e finalizao:

o m

a n d o s

I n ic ia liz a o

S e o p r in c ip a l

in a liz a o

Veja o que cada uma em geral pode conter: Inicializao: Quase todos os programas tm algo a fazer quando iniciam. Pode ser simplesmente mostrar na tela o que faz ou o nome do programador, e inicializao de algumas variveis. Alguns, como o Word ou o Windows, mostram uma tela de apresentao. Os mais elaborados fazem abertura de arquivos e recuperao de dados da sesso anterior, gravados no disco. Se o programa exige senha, ler e verific-la ser uma das primeiras coisas a fazer. H programas que fazem tudo isso. Seo principal: Aqui feito o que deve ser efetivamente feito, e pode ser simples ou bem complexo. Nos programas mais simples, aqui feita a leitura de algum dado e realizado o que foi previsto na especificao. Em outros casos, os programas entram em um estado de espera: mostram uma tela com um menu, por exemplo, e o usurio deve comandar algo ou informar o que quer fazer, seja atravs de uma tecla normal ou de funo ou cliques de mouse. O programa executa o que foi comandado e volta para esperar outro comando. Finalizao: H coisas que precisam ser feitas antes que certos programas possam sair da memria sem problemas: fechamento de arquivos, mensagens de trmino, gravao de dados da sesso para uso posterior. H um instalador de um programa comercial que, antes de terminar, mostra uma mensagem baseada na hora e no dia da semana: se de manh, "Bom dia!", se aps meio-dia, "Tenha uma boa tarde", e se sexta-feira, "Bom fim de semana!". Nos programas maiores, podemos segmentar o produto final em telas, e cada tela em operaes, como mostrar um texto, ler algo do teclado ou efetuar um clculo. Como exemplo, considere a seguinte especificao: As notas de uma faculdade so atribudas por bimestre, tendo o primeiro bimestre peso 2 e o segundo peso 3. A nota semestral deve ser arredondada para o mltiplo de 0,5 mais prximo. Elabore um programa que calcule a nota final. O primeiro nvel de estruturao do programa fica assim:

38

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

C lc u lo d e n o t a f in a l

I n ic ia liz a o

a lc u la r f in a l

n o t a

in a liz a o

O bloco principal ainda est muito genrico. Calcular a nota com base em qu? E o clculo da mdia ponderada? E o arredondamento? Sero necessrios, portanto, outras etapas: ler as notas bimestrais, calcular a mdia ponderada, arredond-la e finalmente mostrar o resultado na tela. O diagrama fica assim:

C lc u lo d e n o t a f in a l

I n ic ia liz a o

a lc u la r f in a l

n o t a

in a liz a o

L e r n o t a Cs a l c u l a r m A rd r i ea d o n d Ma r o s t r a r b i m e s t r a i sp o n d e r a d a m d i a f in a l

n o t a

A segmentao at esse nvel permitiu identificar os algoritmos que devem ser solucionados: dadas as notas, como calcular a mdia ponderada, e dada uma nota, como arredond-la para o mltiplo de 0,5 mais prximo. Estas so solues que independem do programa, e podem ser desenvolvidas antes de se iniciar o programa-fonte. Exerccio 2.9 - Programa comercial Escolha algum programa comercial que j usou ou use e descreva aes que o programa executa ou voc supe que ele executa na inicializao e na finalizao. Exerccio 2.10 - Diagramas de blocos Faa um diagrama de blocos para a seguinte especificao: Elabore um programa que l um nmero de 1 a 9 e mostra a tabuada de multiplicao do nmero. Por exemplo, para o 5: 5x1 =5 5 x 2 = 10 ... 5 x 10 = 50

3 - O PROCESSO DE PROGRAMAR

39

.2.4.4

Projetando programas

Ao fazer um projeto voc est definindo a aparncia que o programa ter para o usurio. Voc estar vendo o programa como uma caixa preta, j funcionando. Para isso, voc identifica que operaes o programa vai realizar, combina essas operaes em uma ou mais telas de sada e, se necessrio, faz diagramas de blocos, tudo isso de uma forma que atenda especificao. Ao detalhar as situaes, defina dados variados de entrada, que provoquem o programa no mximo de situaes possveis (casos de teste). Convm identificar tambm os algoritmos envolvidos no programa, e achar soluo para eles antes de iniciar a implementao propriamente dita. Voc dever buscar respostas adequadas para as seguintes perguntas: O que vou ver ao executar o programa j pronto? O que aparece primeiro, e aonde? Que informaes forneo ao programa? Em qual seqncia? O que acontece aps eu fornecer cada informao? Que informaes o programa me apresenta? Como termina o programa? Que algoritmos ocorrem no programa? J existe uma soluo ou vou desenvolver uma? Quais os casos e situaes com que vou testar o programa? Vejamos um exemplo de projeto, dentro dos nossos objetivos. A especificao a seguinte: Elaborar um programa que l uma lista de valores inteiros positivos e, quando lido zero, informa qual foi o maior e o menor nmero lido Sentado em frente ao computador, voc executa o programa. A tela limpa, e aparece uma mensagem: Entre um nmero inteiro. Voc digita o nmero 54 (que aparece na tela), e tecla Enter. De novo a mensagem, abaixo do nmero 54, e voc entra com 12. Isso se repete algumas vezes, at que voc entra com zero e, aps teclar Enter, aparecem as mensagens (os nmeros so exemplos): O maior nmero foi 234 e O menor nmero foi 12, e o programa encerrado. Para registrar as informaes obtidas, voc poderia esboar a tela, que ficaria mais ou menos como na figura.

Clculo de maior e menor nmeros de uma lista. Entre um nmero inteiro positivo 54 Entre um nmero inteiro positivo 12 Entre um nmero inteiro positivo 234 Entre um nmero inteiro positivo 0 O maior nmero foi 234 O menor nmero foi 12

Para este programa no h uma condio de terminao explcita; ele terminar aps mostrar o menor nmero.

40

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Opcionalmente voc poderia ter comeado pela segmentao do programa, identificando os seguintes blocos:
"Mostrar mensagem informativa da finalidade do programa" "Ler lista de nmeros, parando quando for digitado zero" "Mostrar o maior nmero lido" "Mostrar o menor nmero lido"

O programa acima envolve o algoritmo para achar, dentre uma lista de nmeros, o maior e o menor. O algoritmo ser diferente, conforme o programa armazene na memria toda a lista, para depois buscar a soluo, ou se armazena o maior e o menor lidos at o momento. Em outros casos, voc ter mais possibilidades. Considere a especificao abaixo: "Implementar um programa que repetidamente l os coeficientes a, b e c de uma equao do segundo grau e, se o delta for positivo, calcula as razes; se o delta for zero, calcula a raiz nica; se o delta for negativo, mostra uma mensagem,. O programa termina quando os coeficientes forem zero." Um esquema da tela (seqencial) do programa poderia ser como a seguir. Observe que o detalhamento da tela previu as trs situaes possveis para o delta (e quando o programa entrar em testes, voc j ter dados para test-lo).

Entre zeros para terminar. Entre coeficientes a, b e c, separados por um espao: 1 1 1 A equao no possui razes reais Entre coeficientes a, b e c, separados por um espao: 1 -3 2 As razes so -1.00 e -2.00 Entre coeficientes a, b e c, separados por um espao: 1 -6 9 A nica raiz -3.00 Entre coeficientes a, b e c, separados por um espao: 0 0 0

Agora considere uma especificao que diz que o programa deve simular um 'O' se movendo pela tela, da esquerda para a direita e de cima para baixo. Como voc detalharia esta tela? Uma possibilidade visualizar mentalmente a tela. Se no conseguir, pode fazer um diagrama da tela com setas indicando (como for possvel) as direes do movimento. O que mesmo que este programa faz? - Vamos ver um exemplo de como o projeto que voc define para o programa afeta o usurio. Suponha que voc executa um programa e se depara com a seguinte tela:

3 - O PROCESSO DE PROGRAMAR

41

Entre opo (1,

2 ou 3, 0 para terminar): _

Para que serve cada opo? Se foi voc quem fez o programa, e isto ocorreu recentemente, voc pode at saber, caso contrrio ficar com um imenso ponto de interrogao na testa. Compare a tela acima com esta:

"Lembre-se dos quebra-cabeas: so muito mais fceis quando voc pode ver toda a figura primeiro".
G. Dryden e Jeanette Vos
Programa para testar funes matemticas Opes: Exerccio 2.11 Projetando um churrasco 0 - Fim

- Fatorial Voc j deve ter vivido a experincia 1de programar um churrasco, levando vrias coisas para o local: 2 - Pi espetos, churrasqueira, carvo, talheres, -a Tangente carne, etc. Mas durante o churrasco, descobre que acabou 3 esquecendo alguma coisa importante: talvez a toalha de papel, ou o lcool ou outra coisa necessria para Sua opo: _ acender o carvo. O que voc poderia fazer para no esquecer nada? Uma coisa a fazer seria, ao planejar ou pegar os apetrechos, imaginar o churrasco acontecendo: algum acende o carvo, algum prepara e corta a carne, algum serve a carne, algum a come, juntamente com arroz, vinagrete e...cad a farofa? Quem ficou de trazer a farofa?

Com base no texto da seo, identifique o que fazer churrascos tem em comum com elaborar programas. Exerccio 1.12 Outras aplicaes O tipo de visualizao descrita no texto pode ser aplicado ao planejamento de um churrasco e ao desenvolvimento de programas, e certamente h outros contextos em que pode ser til, como por exemplo para projetar as possveis conseqncias de uma deciso. Identifique dois outros contextos ou atividades em que voc poderia utiliz-la para planejar algo ou se antecipar a eventuais problemas. Conclua: voc acha que esta tcnica pode ser til em sua vida, de maneira geral? Exerccio 2.13 Projetando programas simples Projete programas que atendam s especificaes abaixo. Execute o programa para pelo menos 2 entradas diferentes. a) b) L dois nmeros e calcula o seu produto L um nmero qualquer e informa a metade e o dobro do nmero lido

42

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

c)

L dois nmeros quaisquer e informa sua soma e sua diferena

d) L dois nmeros quaisquer e informa sua soma, diferena, produto e quociente, formatados com 2 casas decimais e) L um nmero (suponha que positivo) e informa seu quadrado, raiz, logaritmo e exponencial, formatados com 4 casas decimais Exerccio 2.14 - Menu Desenhe um esquema de tela e um diagrama de blocos para um programa que mostra um menu centralizado na tela, com as opes abaixo: Ttulo: Menu Relatrios Opes: 1 - Por nome, 2 - Por cdigo, 3 - Por data, 4 - Fim Exerccio 2.15 Projetando programas com decises Cada especificao abaixo envolve algum tipo de deciso entre alternativas. Faa projetos para cada uma, com pelo menos situaes que incluam todas as alternativas. a) L um nmero qualquer e informa se o dobro do nmero lido maior do que 100 b) L dois nmeros quaisquer e informa se o primeiro maior do que o segundo c) L dois nmeros quaisquer e informa se o primeiro maior, igual ou menor do que o segundo d) L um nmero qualquer e informa se o nmero lido est no intervalo de 0 a 100 e) L um nmero qualquer e informa se o nmero lido est nos intervalos de 0 a 10 ou 20 a 30 f) L trs nmeros e informa qual dos trs o maior g) L a renda de uma pessoa e calcula um imposto, com base na tabela de alquotas abaixo. At 1.200,00 isento 10% 15% 20% de 1.201,00 a 5.000,00 de 5.001,00 a 10.000,00 acima de 10.000,00

Exerccio 2.16 Projetando programas com repetio As especificaes abaixo contm repetio de comandos. Elabore projetos de tela para cada uma. a) Mostra os nmeros de 1 at 100 e depois, na linha de baixo, de 100 at 1 b) L um nmero e mostra os nmeros de 1 at o nmero lido, e em seguida na ordem decrescente c) Mostra todos os valores pares entre dois nmeros lidos d) Mostra a quantidade de valores pares entre dois nmeros lidos e) L qualquer quantidade de nmeros e mostra a soma dos nmeros lidos. O ltimo zero f) L qualquer quantidade de nmeros e mostra sua soma, quantidade e a mdia aritmtica dos nmeros lidos. O ltimo zero e no deve ser considerado. g) L uma coluna e, se vlida, mostra uma linha vertical na coluna lida, desenhada com caracteres X h) Semelhante ao anterior, mas l o caractere que usado para desenhar a linha

3 - O PROCESSO DE PROGRAMAR

43

Exerccio 2.17 - Desenho Elabore um esquema de tela para a seguinte especificao: Faa um programa que desenha um "O" na linha 5, coluna 1 e depois faz o seguinte, esperando uma tecla para cada ao (sempre na linha 5): apaga o "O" da coluna 1 e o mostra na coluna 2 apaga da coluna 2 e mostra na 3 - apaga da 3 e mostra na 4 E assim sucessivamente at a coluna 15.

.2.5. Viso geral de um programa-fonte


O programa-fonte vai ser um resultado direto do projeto: uma vez que voc tenha definido as operaes que sero executadas, vai poder identificar as instrues e comandos da linguagem que vai precisar. Em alguns casos, imediato, a uma operao corresponde uma instruo. Em outros, sero necessrias duas ou mais instrues. Ao elaborar programas-fonte, segmentamos as aes at atingir um nvel em que h algum comando disponvel na linguagem. E em geral, o programa-fonte corresponde a uma segmentao mais detalhada do projeto: uma continuao. As instrues em um programa so bem parecidas com as que voc viu na histria do rob. Por exemplo, um programa para cadastro de programas, como o de demonstrao desta apostila, tem comandos na seqncia abaixo, representados na forma de pseudo-comandos (tm uma estrutura e formato uniforme, mas no so comandos de nenhuma linguagem). Compare com a tela a seguir.
repita "Limpe a tela" "Mostre na tela o ttulo do menu" "Mostre a opo 0 do menu" "Mostre a opo 1 do menu" "Mostre a opo 2 do menu" "Mostre a opo 3 do menu" "Mostre a mensagem 'Tecle sua opo:' " "Leia do teclado a opo do usurio" Se a opo for 1, ento ... (comandos para executar a opo) Seno se a opo for 2, ento ...(idem) Seno se a opo for 3, ento ...(ibidem) at que a opo digitada seja 0.

Em algumas situaes nem a tela nem o diagrama de blocos fornecem pistas para os comandos a MENU PRINCIPAL usar. Neste caso, deve-se elaborar um algoritmo, tema de um captulo prximo.

.2.6. Teste e qualidade de

0 - Termina 1 - Cadastro de programas 2 - Programas programas por tipo 3 - Programas por categoria

Vrias coisas que fazemos tem a caracterstica de, a partir de um objetivo, ir ajustando as aes Tecle sua opo: todo o tempo pequenos ajustes no volante. Ao at atingi-lo. Ao guiar um carro, por exemplo, fazemos _ apertar um parafuso, podemos tentar com uma chave de fenda pequena; se no der, pegamos uma maior

44

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

ou aplicamos mais fora ou colocamos uma substncia viscosa no parafuso, ou todas essas alternativas. Programar computadores tem muito dessa caracterstica de fazer ajustes, j que dificilmente somos perfeitos ao elaborar mentalmente os programas. Por isto, uma das etapas mais importantes da programao a verificao de que o programa atende aos objetivos, especificao. Considerando que fazer produtos de qualidade essencial para qualquer pessoa que pretenda ganhar a vida, fazer um nome no mercado, realizar-se e tantas outras coisas que constituem ideais, qualquer programador deve ter em mente um propsito firme e inabalvel de testar bem seus programas e aperfeioar-se cada vez mais nesta habilidade. Tipos de erros - Vrios tipos de erros podem ocorrer em um programa: Erros devidos a especificaes incompletas ou simplesmente erradas; Erros de lgica Erros devido falta de domnio da linguagem de programao. Vo diminuindo com a experincia; Erros acidentais, como por exemplo excluir sem perceber uma linha de cdigo, ao fazer uma alterao. O custo da correo de um erro em um programa tanto maior quanto mais adiantado se est no desenvolvimento. Para corrigir um erro no papel basta reescrever; corrigir um erro de um programa j compilado exige muito mais alteraes e cuidados; e corrigir erros de um programa j em utilizao por seus usurios pode ser desastroso. O que testar - H vrias definies de teste, cada uma adequada a uma finalidade. De forma geral, todas se referem a medidas de qualidade de programas. Para nossos propsitos introdutrios, a seguinte definio de teste satisfatria (Myers, 1979): Testar o processo de executar um programa com a inteno de encontrar erros. Isto implica que, ao testar um programa, voc no estar buscando provar que ele est correto ou que voc um timo programador. Voc estar com um esprito "destrutivo", o contrrio do que fez ao elaborar o programa. Mas voc s poder saber o que est errado se tiver uma referncia do que certo, e esta referncia a especificao e seu detalhamento. A execuo do programa no necessariamente no computador; na verdade, temos duas etapas em que se busca a qualidade. A primeira a verificao manual, feita no papel antes mesmo da digitao, que pode evitar muito desperdcio de tempo, e pode ser feita tanto para os algoritmos quanto para o programa. A segunda, o teste propriamente dito, feito no programa executvel. Ambos devem ser preparados; se o projeto foi bem feito, os dados de teste j estaro prontos. Executar manualmente os rascunhos dos programas no importante somente para prevenir erros. Ao fazer isso, voc vai estar desenvolvendo a habilidade de seguir e executar mentalmente as instrues, o que conseqentemente melhora a sua prpria habilidade de programar. Uma das vantagens da atividade de programar, em relao a outras, que est dentro do controle do programador assegurar que o seu produto est correto. Testar adequadamente seus produtos a grande garantia que um estudante pode ter de suas notas, e que um programador profissional pode ter de seu emprego. Alm disso, saber que seu produto final ser adequadamente testado permite maior liberdade ao

3 - O PROCESSO DE PROGRAMAR

45

programador, durante o desenvolvimento, de criar, experimentar e arriscar com tranqilidade. Veja a si mesmo como um programador profissional e com programas sendo usados por muitos usurios, e imagine como poderia variar a qualidade do seu sono, por exemplo, em funo de ter ou no segurana a respeito da correo de seus produtos. Garanta a sua qualidade de vida: teste, teste e teste s mais uma vez para se certificar, e depois pea a um colega para testar tambm. Voc pode melhorar ou piorar a qualidade do teste simplesmente em funo do que pressupe ao faz-lo. J presenciei situaes (e tambm as vivenciei!) em que um programa no funciona adequadamente, e o programador responsvel fica esttico, dizendo algo como mas no possvel ou mas o programa est certo!. A conseqncia de pressupor que o programa est correto normalmente o programador ficar sem pontos de partida para descobrir erros. E voc pode ter uma certeza: se houver algum erro no programa, ele aparecer quando estiver em uso. Por isso: Ao testar um programa, pressuponha que h pelo menos um erro, e que voc deve encontr-lo - antes que outro menos indicado o faa. Um comentrio final sobre teste de programas: at que seja executado em um computador, um programa pode conter problemas que, sem experincia, voc dificilmente detectaria. Por exemplo, suponha que voc fez um programa, correto, que simula um caractere se movendo pela tela, da direita para a esquerda e vice-versa. Ao execut-lo, descobre que o caractere se move to rpido que mal pode v-lo! Precisa ento incluir instrues que retardem o movimento para uma velocidade compatvel com a capacidade dos olhos humanos. Por isso, e na opinio deste autor, o conhecimento mais consistente que voc poder obter no vir somente de livros; vir da prtica, dos erros, dos problemas e desafios que voc vencer. Resumo das diretrizes para testar programas: Conscientize-se da importncia de testar bem seus produtos. Verifique manualmente o programa antes de digit-lo; Ao testar, suponha que h um erro e voc tem que descobri-lo; Aprenda com os erros; Conscientize-se que seu emprego vai depender da qualidade dos seus produtos. Ao testar seus programas, no se esquea de aplicar e praticar as diretrizes sugeridas. Produtos de qualidade atraem valorizao profissional e melhores oportunidades, e voc pode imaginar o que isso representa.

.2.6.1

O que testar

O que voc procura ao testar programas? O programador o que melhor conhece os caminhos internos do programa, e potencialmente o melhor testador. Algum que est vendo o programa por fora vai testar as operaes que o programa executa. Veja uma lista genrica: Se o programa tem menus, teste o acesso a cada opo e teste cada opo. Teste todas as entradas com dados variados, procurando descobrir algo que o programa no prev. Verifique se as mensagens de orientao esto adequadas. Se o programa faz clculos ou gera informaes, confira tudo, confrontando com o resultado feito de outra maneira: mo, calculadora ou outro meio.

46

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Se o programa pede nmeros, entre com letras para ver o que acontece. Se o programa indica o que deve ser digitado, digite algo diferente. Se o programa repete algo, faa-o repetir muitas vezes mais do que o normal. Se o programa grava no disco, elimine seus arquivos (faa um backup antes). Termine o programa e execute-o novamente, e veja se preservou os dados como deveria. Faa perguntas provocativas: "O que pode estar errado?", "Como posso furar este programa?" Lembre-se de que a referncia principal a especificao; se ela no prev validaes de entrada de dados, por exemplo, o programa no estar errado se falhar nisto. E se o programa passar nos testes, no se esquea de cumprimentar o programador! Exerccio 2.18 Reviso Assinale V ou F: ( ( ( ( ( ) O teste pode ser considerada a etapa mais importante da programao, j que erros nas etapas anteriores podem ser percebidos nesta. ) Pressupor que o programa possui erros uma atitude mais eficiente ao se testar programas. ) Um programador que testa bem seus programas pode ser mais desejvel para uma empresa do que um que programa mais rapidamente. ) Programas podem ser escritos sem erros, mas mais provvel que os contenham. ) Verificar manualmente os programas acelera a aprendizagem de uma linguagem de programao.

Exerccio 2.19 Tipos de erros Descreva os tipos de erro que podem ocorrer em um programa. Prtica 2.20 Testando programas A verso atual do programa de demonstrao dessa apostila, "apdemo.exe", no muito robusta, no sentido de que no est preparada para alguns tipos de problemas. Teste o programa segundo as orientaes desta seo e descubra pelo menos trs desses problemas.

.2.7. Atividades suplementares


Exerccio 2.21 Treinando a imaginao Voc pode melhorar a sua capacidade de projetar um programa por meio de exerccios em outros contextos. Para avaliar e praticar essa habilidade, concentre-se nas imagens, sons e sensaes sugeridas abaixo, durante pelo menos 15 segundos cada uma: a) Imagine uma criana jogando bola b) Imagine um amigo de infncia c) Imagine uma folha sendo levada pelo vento d) Imagine algum sorrindo e) Oua o som de uma pessoa caminhando pelo asfalto f) Oua sua msica favorita

3 - O PROCESSO DE PROGRAMAR

47

g) Oua o barulho de um trovo h) Sinta o calor da gua no chuveiro i) Sinta a areia da praia escorrendo entre seus dedos j) Sinta o peso dos seus sapatos k) Sinta o cheiro de peixe frito l) Sinta o sabor de um cubo de gelo m) Sinta o cheiro de caf novo n) Sinta o sabor de uma fatia de limo (Fonte: Ana Maria Rossi, Visualizao. Ed. Rosa dos Tempos, 1995) Exerccio 2.22 Identificando omisses na especificao Descubra as inconsistncias ou omisses nas especificaes abaixo: a) Implementar um programa para resolver o seguinte problema: uma sala tem x alunos e y alunas. Qual a idade do professor? b) Escrever um programa que move um X na tela e para quando alguma tecla for pressionada. c) Elaborar um programa que calcule raiz quadrada de nmeros reais. d) Escrever um programa que limpa e desenha na tela uma linha vertical de tamanho 50, formada por caracteres '|'. Exerccio 2.23 Reconhecendo comandos Observe a tela a seguir e indique os pontos onde houve instrues de sada, de entrada, deciso e quais instrues esto sendo repetidas.

Clculo de raiz quadrada de nmeros quaisquer Digite A raiz Digite A raiz Digite Nmero Digite um nmero real (0 de 100.00 10.00 um nmero real (0 de 33.00 5.74 um nmero real (0 invlido um nmero real (0 para terminar): 100 para terminar): 33 para terminar): -4 para terminar): 0

Exerccio 2.24 - Voc como lder Imagine que voc o lder ou coordenador de um projeto, e um programador subordinado a voc entregou um programa aos clientes, e estes reclamaram que alguns itens da especificao no foram atendidos. O que voc faria?

48

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exerccio 2.25 - Caixa automtico Faa um projeto para a especificao abaixo. Um caixa automtico precisa calcular quais e quantas notas devem ser entregues ao cliente para efetuar a retirada desejada. Faa um programa com opes para: Receber notas de 10 e 50 (a quantidade inicial zero para ambas) Ler o valor da retirada e mostrar a quantidade de notas de 10 e de 50 a serem entregues. Se alguma das quantidades no for suficiente, o programa cancela a operao, com uma mensagem apropriada Apresentar relatrio com as quantidades de notas e valor total disponvel, e valor total de retiradas efetuadas. Exerccio 2.26 - Atitudes Em um ambiente profissional de programao h vrias situaes que afetam as atitudes do programador. Analise as situaes apresentadas abaixo e vivencie antecipadamente algumas delas (aproveite agora que as conseqncias so menores!): a) Suponha, faa de conta ou finja que o programa est correto e faa uma auto-observao: o que tem vontade de fazer? b) Agora suponha que h um erro no programa e novamente se observe. H diferenas? c) Imagine que voc o programador e que est com o nome meio sujo; seu chefe lhe disse que mais um programa com erros e... rua! Como acha que procederia neste caso? H trs formas de um programador no conseguir sucesso: no querer, no conhecer a linguagem de programao ou no saber o que fazer.

49

.3 O AMBIENTE TURBO PASCAL

Voc viu no captulo anterior que todo profissional deve dispor de vrias ferramentas para gerar produtos de boa qualidade, com boa produtividade. Alm das ferramentas intelectuais e emocionais, na caixa do programador deve haver um bom compilador; alm disso, quanto melhor voc conhec-lo, melhor vai produzir. Neste captulo voc vai conhecer um pouco do Turbo Pascal 7.0, cuja linguagem e recursos de programao constituem a base deste trabalho.

.3.1. O Turbo Pascal


O Turbo Pascal mais do que um simples compilador; um ambiente integrado de desenvolvimento. Isto quer dizer que, atravs de uma nica interface, voc pode fazer tudo que precisa para implementar programas. Esse ambiente integrado compreende:

Editor de textos Ajuda on-line Compilador Depurador (debugger) Exemplos Extenses da linguagem

Veremos aqui, de forma resumida, um subconjunto apenas das opes do ambiente Turbo Pascal para DOS, o suficiente para voc fazer seus primeiros programas. Nos prximos captulos sero apresentados outros comandos e funcionalidades. Como em todo treinamento, impossvel passar todos os detalhes. O melhor que voc pode fazer "fuar" de vez em quando nos menus e na ajuda, aos poucos descobrindo as possibilidades.

.3.2. Instalando o Turbo Pascal


O Turbo Pascal 7.0 apresentado em dois disquetes. Para instal-lo, necessrio ter no mnimo um computador 286 com DOS 3.0 (!) e 6 MB livres no disco, j includo o espao de trabalho da instalao. Voc no deve ter problemas se instalar e execut-lo sob Windows. Para iniciar a instalao, insira o primeiro disquete e execute o programa Install.exe, a partir do Windows ou do DOS. Se voc aceitar o diretrio padro (recomendvel), o instalador criar o diretrio (pasta) C:/TP e alguns subdiretrios. Aps, selecione a opo Start Installation. Troque o disquete quando solicitado. H trs compiladores: TPC.EXE (compilador de linha de comando, para ser usado a partir do prompt do DOS), TPX.EXE e TURBO.EXE, tendo os dois ltimos interface de menus. O TPX contm alguns recursos adicionais que no so necessrios neste curso, cujos programas foram todos testados no

50

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

TURBO.EXE. Para informar-se melhor sobre o TPX, execute o arquivo README.COM no disquete de instalao.

.3.3. Acessando o Turbo Pascal


Para entrar no ambiente integrado, se estiver no DOS ou em uma sesso do DOS no Windows, digite C:\TP\BIN\TURBO na linha de comando e tecle Enter. Se estiver no Windows, clique em Iniciar/Executar e faa o mesmo ou, se houver um cone, clique duas vezes no cone. Caso contrrio, entre no Gerenciador de Arquivos ou no Windows Explorer, clique na pasta de executveis do Turbo Pascal (C:\TP\BIN) e clique duas vezes no arquivo turbo.exe. Voc estar na tela do editor de textos. aqui que voc edita, compila, executa e corrige seus programas, e tambm onde obtm ajuda atravs do help on-line. Se estiver no modo tela cheia (full screen), tecle Alt-Enter para execuo em janela. Para criar um cone para o Turbo Pascal no Windows, abra o Windows Explorer, arraste com o boto direito o arquivo executvel do Turbo Pascal (turbo.exe) e solte-o na rea de trabalho ou em uma pasta, selecionando, no menu que aparece, a opo "criar atalho aqui". Outra forma clicar com o boto direito na rea de trabalho ou rea vazia de uma pasta, selecionar "novo" e "atalho" e digitar o caminho "c:\tp\bin\turbo.exe" (ou o caminho correto, se diferente do padro). A tela contm no alto a barra do menu principal. Se houver alguma janela de texto aberta, a tela deve estar azul, caso contrrio estar hachurada com pontos azuis em fundo branco. Voc entra comandos clicando na barra do menu com o mouse ou atravs da tecla Alt mais uma letra. Cada programa-fonte ocupa uma janela de texto; voc pode abrir vrios programas ao mesmo tempo, um em cada janela, o que no recomendado, principalmente quando h mais de uma janela para o mesmo programa. Nas linhas inferiores da tela voc tem ajuda para as teclas de alguns comandos mais usados e eventualmente mensagens ou orientaes. No centro da linha superior de uma janela de programa fica o nome dele no DOS, isto , como foi gravado no disco, mas sem a extenso (".PAS"). Se aparece o nome "NONAME00", a janela de um novo arquivo, em branco, criado pelo Turbo Pascal, que voc pode usar. Ao salv-lo pela primeira vez, voc dar o nome adequado. Prtica 3.1 Viso geral do TP D uma "passeada" pelos menus do editor do Turbo Pascal, apenas para ver o que h por l, e responda: a) Em que menu est a opo Destination? b) Em qual opo do menu Options voc configura o diretrio onde vo ficar os arquivos executveis?

.3.4. Editando texto


Familiarize-se com a edio de textos no editor do Turbo Pascal executando as prticas a seguir. Prtica 3.2 Edio de arquivo novo 1. Criando um novo arquivo - Para iniciar a edio de um programa-fonte, crie um novo arquivo; para isso, no editor do Turbo Pascal, clique File/New (se j houver uma janela com o nome NONAME00, no necessrio). Dificilmente voc usar este comando. Para criar um novo programa, normalmente voc vai preferir abrir um existente, salv-lo com outro nome e aproveitar o que puder do texto j digitado.

3 - O AMBIENTE TURBO PASCAL

51

2. Editando texto - Na janela de texto, voc digita seus programas. Digite o seguinte texto ou algum outro que deseje:
A IBM, na dcada de 50, era a empresa mais bem administrada do mundo, graas, em grande parte, ao modelo do lendrio diretor-presidente, Thomas J. Watson. Contaram-me um caso que mostra como Watson reagiu ao saber de um erro multimilionrio de um de seus gerentes regionais. Ele chamou o gerente de vendas sua sala para trocar algumas palavras. Quando terminou, o infeliz gerente sentia-se surrado, mutilado.

Experimente as teclas de edio mais usadas: setas: movem o cursor uma linha ou coluna de cada vez PgUp, PgDn: pgina acima e abaixo Home: cursor para o incio da linha End: cursor para o fim da linha Ins: alterna entre insero/sobreposio de caracteres digitados Backspace, Delete: apagar caracteres Ctrl-Y: eliminar a linha do cursor Alt-Backspace (ou Edit/Undo): desfaz a ltima edio feita em uma linha (preciosssima!) 3. Recuperando texto excludo por engano Posicione o cursor em uma linha qualquer e exclua-a teclando Ctrl-Y. Experimente teclar agora Alt-Backspace, para recuperar a linha. Se no funcionar, verifique em Options/Environment/Editor se a opo "Group Undo" est marcada. 4. Salvando um novo arquivo - Quando for salvar pela primeira vez um programa, voc tem que dar um nome a ele. Clique em File/Save as. Na janela que aparece, digite o nome do arquivo onde ser gravado, que tem um nome-base de at 8 letras e um tipo (extenso) de at 3, separados por um ponto. Para o nome-base, use at oito letras, nmeros e smbolos, sem espaos (regras do DOS); por exemplo: WATSON (maisculas ou minsculas, d no mesmo). No use asterisco (*), ponto (.), aspas ("), colchetes ([ e ]), barra vertical (|), contrabarra (\) dois-pontos (:), igual (=), ponto-e-vrgula (;), soma (+), menor e maior que (< e >), circunflexo (^) e interrogao (?). J os tipos de arquivos sero sempre .PAS, e o Turbo Pascal o colocar para voc. Clique em OK para gravar o arquivo. Salvando arquivos no Windows 95/98: O Windows 95 possui regras diferentes das adotadas pelo DOS para diretrios (pastas) e arquivos. Para atender os programas para DOS, ele define um nome dentro das regras deste. Este nome que deve ser usado para se salvar arquivos. Para saber qual , no Windows Explorer, clique com o boto direito do mouse na pasta desejada e selecione Propriedades. O nome est indicado na propriedade "Nome do MSDOS". 5. Fechando - Para encerrar a edio de um programa, clique no boto situado acima e esquerda da janela ou tecle Alt-F3. Sempre feche as janelas de programas que no estiver usando, para evitar possveis confuses. Faa isto para o programa que digitou.

52

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 3.3 Editando um arquivo existente 1. Abrindo um arquivo - Se o arquivo j existe, para modific-lo voc deve abri-lo, isto , carreg-lo do disco para a memria. Se no houver nenhuma janela de programa aberta, o menu File mostra uma lista dos ltimos arquivos abertos; se o que voc quer aparece na lista, basta clicar no nome para abrilo. Para abrir um arquivo, clique em File/Open ou F3. Na janela que aparece, no campo "Name", digite o nome do programa que quer abrir, neste caso WATSON. Opcionalmente voc pode clicar no nome do arquivo desejado, na lista de arquivos. Neste, o smbolo "..\" quer dizer "o diretrio acima". Uma vez selecionado o arquivo, clique em Open para abrir. Outros arquivos abertos permanecem disposio; basta selecionar o desejado no menu Window, opo List. Ou clique na janela desejada para ativ-la. Para no ter que localizar o diretrio correto todas as vezes em que for abrir um arquivo, no incio de uma sesso clique em File/Change Dir e configure o diretrio desejado. 2. Aps abrir o arquivo, complete a digitao iniciada anteriormente, de forma que o texto fique assim:
A IBM, na dcada de 50, era a empresa mais bem administrada do mundo, graas, em grande parte, ao modelo do lendrio diretor-presidente, Thomas J. Watson. Contaram-me um caso que mostra como Watson reagiu ao saber de um erro multimilionrio de um de seus gerentes regionais. Ele chamou o gerente de vendas sua sala para trocar algumas palavras. Quando terminou, o infeliz gerente sentia-se surrado, mutilado. O senhor est me dizendo que quer que eu v embora? o gerente perguntou. - Ir embora? Watson retrucou, atnito: - De maneira alguma! Imagine, gastei mais de um milho de dlares para trein-lo! (Charles Wang)

3. Salvando um arquivo existente - Aps fazer as alteraes, e como o arquivo j tem nome, clique em File/Save para gravar no disco as alteraes. Alternativamente, tecle F2. Se for um arquivo novo ("NONAMEnn"), o editor abrir a janela do salvar como e voc dever dar um nome ao arquivo. Salve freqentemente seu trabalho; coisas misteriosas podem acontecer e faz-lo perder precioso tempo de digitao. Computadores que falham ou travam, programas que no terminam... Fato que presenciei (mais de uma vez): em um laboratrio de informtica, uma tomada com mau contato ligava quatro computadores. Algum bateu o p nela e desligou por um breve e fatal momento os computadores. Outro: algum terminou o trabalho e, desatento, desligou o computador... do vizinho! Para no parecer que estou exagerando: da ltima vez, algum inseriu um disquete no micro do vizinho e pressionou o boto de reset! Prtica 3.4 Comandos teis Experimente outros comandos teis do menu Window abra vrias janelas de edio e tente alternar (F6), Dividir (Tile) e os demais. Prtica 3.5 Impresso de programa-fonte Voc pode imprimir um programa-fonte das seguintes maneiras (experimente cada uma): a) No Turbo Pascal - Selecione a janela do programa digitado e clique em File/Print para imprimilo. Nesta opo de impresso as palavras reservadas e outros elementos da sintaxe so destacados, o que pode ser til ao leitor.

3 - O AMBIENTE TURBO PASCAL

53

Para imprimir um arquivo, o Turbo Pascal usa um programa chamado PRNFLTR.EXE. Se tiver problemas, pode ser que ele no esteja no diretrio \TP\BIN ou o caminho para este no esteja no PATH do arquivo autoexec.bat do DOS (que fica no diretrio raiz do disco rgido).1 Se tiver problemas na impresso atravs do Turbo Pascal (como um monte de folhas saindo da impressora), tente alterar a configurao, em File/Printer Setup, para /HP ou desmarcando o opo de enviar os caracteres de formatao. b) A partir do Bloco de Notas Abra o programa-fonte e imprima-o, lembrando que o Bloco de Notas usa a impressora padro do Windows. c) A partir do Word ou do WordPad Abra o fonte e imprima-o normalmente. Para preservar a formatao original, selecione todo o texto e altere a fonte para um no proporcional, como Courier. d) No DOS Shell Entre no DOS Shell (veja frente neste captulo) no menu Arquivo e digite Print <nome do arquivo>. Isto s funciona se o DOS foi instalado. Alternativamente, tente comandar copy <nome do arquivo> prn.

.3.5. Alternativas para obter ajuda


Voc pode acessar a ajuda on-line de vrias formas. Com F1 voc tem ajuda sobre a janela de edio. No menu Help, h vrias alternativas: Contents (estruturado), Index (alfabtico) e at ajuda para a ajuda. Um dos mais usados a ajuda sensvel ao contexto. Execute as prticas desta seo e veja como funciona cada tipo. Prtica 3.6 Ajuda sensvel ao contexto Escreva a palavra ClrScr em qualquer janela de texto e tecle Ctrl-F1. Rapidamente aparece na tela a descrio da instruo, a unit que a contm, um programa exemplo e outras informaes. Digite a palavra "unit" e faa aparecer o respectivo texto de ajuda. Leia apenas como curiosidade, por enquanto. Prtica 3.7 Ajuda para os menus Clique na opo Window do menu. Com a seta e no com o mouse, indique a opo Tile. Pressione F1 para obter ajuda sobre esta opo. Faa o mesmo para a opo Window/Close. Novamente obtenha ajuda para a opo File/Dos shell. Prtica 3.8 Contedo Clique em Help/Contents. Voc v uma lista de tpicos de ajuda. D uma olhada na lista, depois selecione o item Menus and hot keys. Mais abaixo voc ver uma lista de subtpicos que podem ser selecionados. Prtica 3.9 ndice Para acessar uma lista de tpicos de ajuda em ordem alfabtica, clique em Help/Index. Tecle a primeira letra da palavra desejada para deslocar-se rapidamente para a seo da letra. Por exemplo, para ver uma lista de nomes de cores usadas em certas instrues de tela, tecle "Y" e <tab> at o cursor chegar na palavra Yellow. Clique duplo ou tecle Enter para ver o texto. Prtica 3.10 Descobrindo outros comandos Usando o help de contedo, procure a lista de comandos do editor de textos e preencha a tabela abaixo:
1

Quando nem isto funcionou, criei um arquivo de comandos do DOS que ajustava o PATH e configurei o campo "arquivo de lote" da guia Programa do turbo.pif (o Windows usa os .pif para configurar programas DOS), para execut-lo antes.

54

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

COMANDO DO EDITOR Copiar para a rea de transferncia Colar da rea de transferncia Selecionar texto Localizar texto Inserir uma linha em branco no modo de insero Inserir uma linha em branco no modo de sobreposio

TECLAS Shift-Del Shift + tecla de movimento do cursor Ctrl-L

.3.6. O DOS Shell: um pouco de MS-DOS


Se voc tem menos que vinte e poucos anos, talvez tenha apenas uma idia vaga do que o DOS. Antes do Windows, ele foi o sistema operacional padro para os PCs. Executa apenas um programa de cada vez e no possui interface grfica. Os comandos so digitados na linha de comando, na qual so indicados (normalmente) o drive e o diretrio atualmente selecionados, como por exemplo: C:\WINDOWS>_ A contrabarra indica o diretrio raiz, e este texto chamado de prompt do MS-DOS, da o nome da opo de abrir uma sesso DOS a partir do Windows. Os comandos so constitudos de uma palavra seguida de parmetros. Por exemplo, para alterar o diretrio corrente, voc deve digitar CD (de change dir) seguido do nome do diretrio, e depois teclar Enter: C:\WINDOWS>CD \TP Se o diretrio desejado est abaixo ou filho do corrente, basta digitar seu nome: C:\TP> CD BIN Cada comando do DOS tem sua prpria sintaxe. Se o seu computador tem o DOS instalado, voc pode obter ajuda digitando HELP seguido do nome de comando. A partir do Turbo Pascal, voc pode acessar a tela do DOS a qualquer momento atravs da opo File/Dos shell do menu. Ao clicar essa opo, voc v a tela DOS normal, com o prompt esperando um comando. O Turbo Pascal continua na memria. Para confirmar isso, digite exit seguido da tecla Enter: voc volta para o Turbo Pascal, do mesmo jeito que estava quando voc saiu. V ao DOS shell, e tecle DIR, seguido de Enter. Voc ver uma listagem dos arquivos gravados no diretrio atual. Entre outras coisas, e com algumas diferenas (mais ainda se estiver no Windows), voc deve ver:
WATSON PAS WATSON BAK 200 07-31-97 37 07-31-97

O primeiro arquivo um arquivo editado normalmente pelo Turbo Pascal: nome, tamanho em bytes e data da ltima gravao. O segundo a verso anterior do primeiro. Quando voc salva um programa, o Turbo Pascal renomeia a cpia que est no disco para .BAK, e grava a que est na memria com a extenso .PAS. Se voc perder algum programa, a primeira coisa a tentar ir ao DOS shell, renomear o .BAK para .PAS (aps excluir o antigo) e recuperar o que puder.

3 - O AMBIENTE TURBO PASCAL

55

Veja exemplos de outros comandos do DOS e suas opes, que voc pode precisar:
dir *.pas dir meu*.* dir meu*.pas rename nomeant.ext novonome.ext copy nome.pas outnome.pas del nome.pas del *.bak del *.* print nome.pas md nomedir rd nomedir cd nomedir (listar todos os arquivos com extenso .pas) (listar todos os arquivos comeados com "meu") (listar todos os arquivos comeados com "meu" e com extenso .pas) (mudar o nome do arquivo nomeant.ext para novonome.ext) (criar um arquivo chamado outnome.pas, copiando o contedo de outro arquivo chamado nome.pas) (excluir o arquivo chamado nome.pas) (excluir todos os arquivos com extenso .bak) (excluir todos os arquivos do diretrio corrente cuidado!) (imprimir) (criar um subdiretrio chamado nomedir) (excluir o diretrio nomedir, se estiver vazio) (mudar o diretrio corrente para nomedir)

Lembre-se: para voltar ao Turbo Pascal, digite exit. Se digitar novamente turbo, voc pode ter problemas. Prtica 3.11 Como recuperar arquivos Edite um arquivo qualquer, e salve-o pelo menos duas vezes (para que seja criado o .bak). V ao DOS Shell, delete o arquivo com tipo .PAS. Renomeie o .BAK para ter o mesmo nome mas extenso .PAS. Volte ao Turbo Pascal e abra o arquivo novamente, e veja se est intacto. Prtica 3.12 Praticando comandos de diretrios No DOS Shell, mude o diretrio corrente para o raiz (\). Crie um diretrio com seu nome. Mude para este, e dentro dele, crie um diretrio para esta disciplina. Mude para este e dentro dele crie diretrios para trabalhos, chamados TRAB1 e TRAB2. Agora remova todos os diretrios criados. Lembre-se: "passeie" pelos menus e pela ajuda de vez em quando; voc descobrir recursos teis e muitas vezes salvadores.

56

.4 PRIMEIROS PROGRAMAS

O computador faz o que voc manda, no o que voc quer

Programas de computador so essencialmente um mecanismo de causa e efeito: voc quer um efeito, programa uma causa. Nesse sentido, s existem resultados: o programador obtm o que foi programado. Neste captulo, voc dar os primeiros passos para fazer algo acontecer no computador, escrevendo, compilando e executando pequenos programas em linguagem Pascal.

.4.1. Primeiras instrues


Prtica 4.1 Primeiro programa a) Abra o Turbo Pascal e digite o programa abaixo. Para o alto da cabea, use a barra de sublinhado, e para a parte de baixo, use o hfen.
PROGRAM Careta; {Feito por Virglio V. Vilela} uses CRT; begin ClrScr; Writeln('Este programa simples desenha uma careta na tela.'); Writeln('Pressione qualquer tecla para ver a careta'); Readkey; Writeln(' ____'); Writeln(' / \'); Writeln('/ O O \'); Writeln('\ ^ /'); Writeln(' \ ~ /'); Writeln(' ----'); Writeln; Writeln('Pressione qualquer tecla para terminar o programa'); Readkey; end.

Um programa escrito em uma linguagem de alto nvel um texto, que chamado de programa-fonte ou cdigo-fonte. b) Como o computador no entende Pascal, preciso converter o texto para linguagem de mquina, ou seja compil-lo. Aps salvar o arquivo, clique em Compile/Compile ou tecle Alt-F9. Deve aparecer uma janela parecida com a abaixo. Se aparecer alguma mensagem no alto da tela, verifique se digitou o programa exatamente como est.

5 - PRIMEIROS PROGRAMAS

57

+----------------- Compiling ------------------+ Main file: CARETA.PAS Done. Destination: Memory Line number: 0 Free memory: 239K Total lines: 19 Compile successful: Press any key +----------------------------------------------+ No Turbo Pascal, no necessrio comandar a linkedio, que feita de forma automtica. c) Instrues so inertes se no forem executadas. D vida ao programa clicando em Run/Run ou tecle Ctrl-F9 para execut-lo. Siga as instrues na tela.
Seo de cabealho Seo de declaraes Comentrio (ignorado na compilao)

PROGRAM CARETA; {Feito por Virglio V. Vilela} uses CRT; begin ClrScr;

Incio da seo de comandos executveis

Limpa a tela e posiciona o cursor no canto superior esquerdo (vem de "Clear Screen)

Fim dos comandos executveis (ponto: fim do programa)

Writeln('Este programa desenha uma careta na tela.'); Writeln('Pressione qualquer tecla para ver a careta'); Readkey; Writeln(' ____'); ponto-e-vrgula: fim Writeln(' / \'); de um comando Writeln('/ O O \'); Writeln('\ ^ /'); Writeln(' \ ~ /'); Writeln(' ----'); Writeln; Espera uma tecla Writeln('Pressione qualquer tecla para terminar o programa'); ser pressionada Readkey; end.

para prosseguir

Causa problemas no saber: PROGRAM, begin e end so palavras reservadas; tem um significado para o compilador, e voc no pode us-las para outra finalidade. ClrScr, Writeln e ReadKey so identificadores padro: podem (mas no convm) ser usados para outras finalidades. PROGRAM uma palavra que inicia um programa-fonte. opcional, mas se voc colocar PROGRAM deve por depois o nome e o ponto-e-vrgula. Ao final de todo comando ou declarao deve ter um ponto-e-vrgula, exceto antes de end. O nome do programa criado por voc, seguindo algumas regras: - deve comear com uma letra

58

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

- a partir do segundo caractere, pode conter letras, dgitos ou barra de sublinhado (_), ou seja, no pode conter espaos - no h distino entre maisculas e minsculas (MeuPrimeiro o mesmo que mEUpRIMEIRO que o mesmo que mEupRImeIRo) - no so permitidas letras acentuadas Exemplos de nomes vlidos de programas: CalculaFatorial, Calc_Dobro_versao_2, emite_som. Nomes invlidos que impedem a compilao: Calcula Fatorial, 2_Calc_Dobro, EmiteSom! Exerccio 4.2 Regras para nomes Assinale os nomes de programas vlidos no Pascal: a) b) c) d) e) f) controla_compromissos agenda diria Agenda_v3 eMiTeSOm CalcDobroNum v2_SomCrescente

Exerccio 4.3 - Program Escrever a declarao PROGRAM, usando nomes significativos, para os programas abaixo: a) b) c) d) e) f) g) h) Pondera notas de listas de exerccios e calcula nota final Controla CDs Gera lista de compras Guarda nomes e telefones Imprime etiquetas de endereamento Simula um X movendo-se pela tela Converte graus Celsius em graus Fahrenheit Converte graus Celsius em graus Fahrenheit e vice-versa A declarao PROGRAM opcional, mas bom coloc-la para uma melhor documentao do programa. Nada de nomes como Cesar_1, XYZ ou Smurfette (este eu vi!); o nome deve dar uma boa idia do que o programa faz. Prtica 4.4 Erros de sintaxe A sintaxe das linguagens de alto nvel muito mais rgida que a de uma linguagem comum, como o portugus. Qualquer palavra fora do lugar adequado ou um smbolo que no faa parte do alfabeto (erro de sintaxe) impedem a converso de um programa. Por exemplo, se a sintaxe prev que um ponto-evrgula deve aparecer no fim de um comando, voc dever inseri-lo. O compilador detecta a ausncia, mas jamais colocar o ponto-e-vrgula para voc. A compilao feita de cima para baixo, comeando na palavra PROGRAM e terminando no ponto aps o end. Cada vez que encontra um erro de sintaxe, o compilador interrompe a compilao e mostra uma mensagem de erro na primeira linha da tela de edio (em alguns casos, embaixo). Para conhecer melhor as mensagens do compilador, faa as modificaes abaixo, uma de cada vez, e compile (para desfazer use

5 - PRIMEIROS PROGRAMAS

59

Alt-Backspace). A cada erro, indique o cdigo de erro de compilao e tecle F1 para ver mais informaes sobre a causa. a) b) c) d) e) f) g) h) i) Troque PROGRAM por PROGRAMA Insira um espao no meio do nome do programa: CAR ETA Tire o ponto-e-vrgula aps CARETA Tire o begin Tire o primeiro apstrofo de um Writeln Tire o ltimo apstrofo de um Writeln Tire o end Tire o ponto final Coloque um ponto no meio do programa

Para obter maiores informaes sobre um erro de compilao, tecle F1 enquanto a mensagem de erro estiver sendo mostrada. Prtica 4.5 Finalidade das cores do texto Observe na tela que as cores das palavras tm diferenas: o editor identifica o tipo de cada uma, conforme a sintaxe da linguagem e altera sua cor. Esse recurso ajuda a identificao de erros de digitao. Por exemplo, retire o fecha-chave do comentrio e veja o que acontece. Prtica 4.6 Tela Turbo e tela DOS a) Voc viu anteriormente que no Turbo Pascal h duas telas: a do prprio TP e a do DOS, que onde aparecem as sadas dos programas. A tela DOS fica em segundo plano; para v-la estando em modo de edio, tecle Alt-F5. D uma olhada e pressione qualquer tecla para retornar. b) No programa CARETA, retire ou comente o ltimo comando antes do end (assim: {ReadKey}). Compile, execute e veja a diferena. Tecle Alt-F5 para ver a tela DOS. c) Voc pode ver as duas telas ao mesmo tempo, embora menores: clique em Debug/Output. Para dividir a tela em duas janelas que no se sobrepem, clique em Window/Tile. Prtica 4.7 - Onde est o programa executvel? O destino da compilao pode ser a memria ou o disco. Quando compila para disco, o compilador cria um arquivo no disco com o mesmo nome do arquivo do fonte (e no o nome da declarao PROGRAM) e extenso .EXE. Esse executvel independente do compilador voc pode execut-lo diretamente do DOS ou Windows, conforme o caso, copi-lo para um disquete e dar de presente, renome-lo, etc. A compilao com destino memria no cria um executvel em disco; ele permanece na memria. Se voc sair do Turbo Pascal no poder execut-lo. Essa a opo mais usada, j que voc normalmente compila, executa e testa vrias vezes, e somente quando concluir os testes que talvez v querer um executvel permanente. Indique o destino da compilao na opo Compile/Destination do menu (se voc estiver usando o compilador tpx.exe esta opo no est disponvel). Por default (valor assumido se voc no informar nada), a compilao para a memria. Se tiver dvidas sobre qual opo est selecionada, veja na janela de sucesso da compilao o destino atual. a) Clique em Compile/Destination para alternar o destino da compilao para disco. Se j estiver, no faa nada, apenas cancele o menu teclado ESC ou clicando fora dele.

60

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

b) Voc pode definir o diretrio onde ficaro os arquivos executveis; clique em Options/Directories e indique um caminho. Se voc estiver em uma rede, pode ser que necessariamente tenha que informar em Options/Directories, campo EXE & TPU Files, uma pasta onde tenha autorizao para gravar. Voc deve informar o nome DOS; o Turbo Pascal no vai reconhecer o nome do Windows. Para saber qual o nome DOS, v no Windows Explorer, clique com o boto direito na pasta e selecione Propriedades. c) Compile o programa. Note que na janela que informa o sucesso da compilao consta o destino. d) Acesse o DOS Shell (no menu File), altere o diretrio corrente para o que voc especificou na letra c) e pea a listagem do contedo ("DIR"). Verifique que foi criado um arquivo executvel com o mesmo nome do programa-fonte. Execute o programa digitando seu nome e Enter. Prtica 4.8 - Executando o programa fora do Turbo Pascal a) Aps executar a compilao para disco, v no Windows e ache o executvel. D um duplo clique nele para execut-lo. Voc pode tambm arrast-lo para o Ambiente de Trabalho e criar um atalho para ele; um executvel DOS como os outros. b) Agora copie o executvel para um disquete e execute-o de l. Prtica 4.9 Onde posso por comentrios? Inclua os comandos abaixo em um programa de teste e indique quais compilam normalmente: a) b) c) d) e) PROGRAM {comentrios} MeuPrimeiro; PROGRAM MeuPrimeiro {comentrios}; Write{comentrios}('texto'); Write('texto'{comentrios}); Wri{comentrios}te ('texto'); Para registrar comentrios voc pode usar, ao invs das chaves, os smbolos (* para abrir um comentrio e *) para fech-lo.

.4.2. Mais de Write


Prtica 4.10 Write Altere o programa CARETA, tirando os "ln" de cada Writeln. Execute-o e veja na tela o que mudou. Write, Writeln e o cursor A tela, em modo texto padro, estruturada em 25 linhas e 80 colunas, e h um cursor (_) piscando em alguma posio. A instruo Write comea a mostrar sua sada exatamente na posio atual do cursor; quando termina, o cursor est na coordenada que segue o ltimo caractere mostrado. Por exemplo, se o cursor estiver no canto superior esquerdo da tela, e for executada a instruo Write('Teste da posio do cursor'); a palavra 'Teste' comear a ser mostrada no canto superior esquerdo e, aps a execuo, o cursor estar logo aps o r da palavra cursor.

5 - PRIMEIROS PROGRAMAS

61

Se o cursor estiver na ltima linha da tela, e uma instruo Writeln for executada, seu parmetro ser mostrado nessa linha e todo o contedo da tela ser movido uma linha para cima e uma linha em branco ser inserida na parte inferior da tela, sendo portanto perdida a linha no alto.
Posio do cursor aps Write

Teste da posio do cursor_ _

Posio do cursor aps Writeln

O texto que est dentro dos parnteses aps um Write ou um Writeln uma informao que a instruo precisa receber para cumprir sua finalidade, que mostrar essa informao na tela; chamado parmetro. Prtica 4.11 Write e os espaos Sobre o comportamento da instruo Write com relao a espaos (brancos), faa programas que esclaream: a) Espaos (brancos) fora dos apstrofos fazem diferena? Por exemplo, h diferena entre os comandos Write('X X') e Write ( 'X X' )? b) Como fazer para inserir alguns espaos antes do primeiro X do comando acima, na tela, ou seja, quando a instruo for executada? c) Um texto dentro de um Write pode continuar em outra linha, ou seja, a apstrofo inicial em uma linha e o apstrofo final na outra? Prtica 4.12 Maisculas e minsculas Execute o programa de teste abaixo (se desejar, substitua o texto por algum que prefira).
PROGRAM TesteMaiuscMinusc; uses CRT; begin ClrScr; Writeln('texto em minsculas'); Writeln('TEXTO EM MAISCULAS'); Writeln('tExTo VaRiAdO'); ReadKey; end;

62

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Apstrofos A funo dos apstrofos indicar ao compilador que o parmetro uma cadeia de caracteres e deve ser mostrada exatamente como est escrita. Ou seja, ao contrrio das palavras reservadas e identificadores padro, no caso de cadeias de caracteres o compilador distingue maisculas e minsculas; ele no vai criticar o que estiver delimitado pelos apstrofos. Prtica 4.13 Identifique a sada Faa um esquema da tela de sada que ser gerada pelo programa abaixo. Depois execute-o e verifique sua resposta (as instrues esto misturadas para no ficar to fcil):
PROGRAM QualASaida; uses CRT; begin ClrScr; Writeln; Write('X Write('X X' ); Writeln('X end. X' ); Writeln('X X' ); X' ); Write('XXXXX' );

Prtica 4.14 Seguir programa Execute manualmente o programa abaixo e faa um esquema da tela resultante (considere os pontos como espaos, so apenas para indicar sua quantidade). Depois, digite, compile e execute-o, comparando o resultado obtido com o resultado previsto.
PROGRAM DesenhaAlgo; uses CRT; begin ClrScr; Writeln; Writeln ('#####'); Writeln('..#..'); Writeln('..#..'); Writeln('..#..'); Writeln('..#..'); end.

Prtica 4.15 Pulando linhas com Writeln Se voc quer que algo aparea na tela, esse algo deve estar dentro dos parnteses de um comando Write ou Writeln. Se omitir um dos parnteses, o programa no ser compilado. Mas voc pode omitir ambos; neste caso o resultado da execuo ser mover o cursor para a linha de baixo. Podemos usar essa caracterstica para pular linhas (ou para posicionar o cursor no incio de uma linha). Faa um esquema da tela de sada do programa abaixo: Depois digite e execute o programa e veja se acertou:
PROGRAM QualASaida;
begin Writeln('Isto est em uma linha'); Writeln; Writeln('H uma linha em branco acima desta'); end.

Prtica 4.16 Cadeias so diferentes de nmeros Digite o programa de demonstrao abaixo e veja o que aparece na tela para cada Writeln. A tela deve resultar como ao lado. Depois veja as explicaes adiante.

5 - PRIMEIROS PROGRAMAS

63

PROGRAM DemoNumeros; uses CRT; begin ClrScr; Writeln('1234'); Writeln( 1234 ); Writeln( 1234.0 ); Writeln( 1234.0:30 ); Writeln( 1234.0:30:2 ); Writeln( 1234.0: 0:2 ); ReadKey end.

1234 1234 1.2340000000E+03 1.2340000000E+03 1234.00 1234.00

Nmeros e cadeias de caracteres O compilador trata nmeros de maneira diferente de cadeias de caracteres: do ponto de vista do compilador, 1234 um nmero, enquanto que '1234' uma cadeia de caracteres, mesmo sendo formada s por dgitos. Nmeros inteiros tambm so tratadas de forma diferente de nmeros reais. Estes so nmeros com casas decimais, que so separadas da parte inteira por um ponto. Nmeros reais so mostrados na tela em notao cientfica (por exemplo, 1.214x10 3 , sendo o "10 elevado a" representado como a letra E), podendo ser indicadas a quantidade de colunas da tela que vo ser usadas e a quantidade de casas decimais
PROGRAM DemoNumeros; {explicaes} uses CRT; begin ClrScr; Writeln('1234'); {cadeia de caracteres} Writeln( 1234 ); {nmero inteiro} Writeln( 1234.0 ); {o ponto torna o nmero real, que mostrado em notao cientfica} Writeln( 1234.0:30); {indica que para usar 30 colunas da tela. O nmero alinhado direita dentro das 30 colunas} Writeln( 1234.0:30:2 ); {usar 30 colunas como acima, e 2 casas decimais. Evita a notao cientfica} Writeln( 1234.0: 0:2 ); {o zero quer dizer que a quantidade de colunas no est definida, e o nmero mostrado a partir da posio do cursor} ReadKey end.

Prtica 4.17 - Inteiros com decimais pode? Verifique se o comando a seguir, que tenta mostrar um inteiro com casas decimais, compila:
Write(1214:10:2);

Voc pode indicar a quantidade de colunas tambm para cadeias de caracteres. Por exemplo, para deslocar o cursor vinte colunas, depois mostrar 'Nome' alinhado direita em 15 colunas, escreva: Write(' ': 20, 'Nome':15);

64

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exerccio 4.18 Reviso de Write com nmeros Assinale V ou F conforme as afirmativas seja verdadeiras ou falsas: ( ) Nmeros como parmetros em uma instruo Write no precisam estar entre apstrofos. ( ) Nmeros reais so mostrados na tela em notao cientfica, a menos que seja indicada outra formatao. ( ) A instruo Write permite vrios parmetros, desde que separados por vrgulas, mas melhor usar essa caracterstica quando os parmetros so de tipos diferentes. ( ) Formatao de quantidade de casas decimais, na instruo Write, no permitida pelo compilador para parmetros que no sejam reais. Especificao 4.19 Treinando Write/Writeln Escreva um programa Pascal com instrues Write ou Writeln que produzam a seguinte tela:

EEEEE E EEE E EEEEE Pressione uma tecla para terminar.

Mltiplos parmetros de Write e Writeln As instrues Write e Writeln aceitam mltiplos parmetros, desde que separados por vrgulas. Por exemplo, a instruo
Write('Esta uma cadeia', ' E esta outra cadeia', ' Pode ter uma terceira');

produz na tela a sada Esta uma cadeia E esta outra cadeia Pode ter uma terceira_ Esta caracterstica ser mais til quando quisermos mostrar na tela informaes de tipos diferentes, mesclando cadeias, nmeros e outros elementos que veremos. Especificao 4.20 Etiqueta na tela Elabore um programa que escreve seu nome completo em uma linha, seu endereo na prxima e na seguinte o CEP e telefone. Especificao 4.21 - Frases assassinas Faa um programa que mostra na tela algumas frases assassinas, que so aquelas que fazem com muitas idias sejam perdidas antes que amaduream ou seja aprofundadas. Eis alguns exemplos (bole tambm os seus): "Isto no vai dar certo"

5 - PRIMEIROS PROGRAMAS

65

"Voc nunca vai conseguir" "Voc vai se estrepar" "No vai dar em nada" "Est tudo errado!" Especificao 4.22 - Mensagem Escreva uma mensagem para uma pessoa de que goste. Implemente um programa que mostra na tela essa mensagem. Especificao 4.23 - Ao mestre Escreva um bilhete ao seu professor, informando seus objetivos nesta disciplina e o que espera dela e do professor. Implemente um programa que mostra seu bilhete na tela. Especificao 4.24 Tabela de notas Escreva um programa que produza a seguinte sada na tela: ALUNO(A) ======== ALINE MRIO SRGIO SHIRLEY NOTA ===== 9.0 DEZ 4.5 7.0

Especificao 4.25 Letra grande Elabore um programa para produzir na tela a letra X usando a prpria. Se fosse L, seria assim: L L L L L L L Especificao 4.26 Palavra grande Escreva um programa que produza a tela esquematizada abaixo:

66

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

******** * * ******** * * ********

******** * * * * * * * * * * ********

* * * * * * ********

Especificao 4.27 Emoticons Emoticons so seqncias de caracteres que mostram rostos e expresses, vistos de lado e usados freqentemente em correios eletrnicos e bate-papos na Internet. Existem dezenas; veja alguns: :-) :-( :-p :-o {:-) :-{ :-* sorriso tristeza mostrando a lngua espanto cabelo partido ao meio usa bigode beijo

:-**** um monte de beijos Elabore um programa que mostre na tela os emoticons, um em cada linha, com a descrio de cada um. Especificao 4.28 Pinheiro Implemente um programa que desenhe um "pinheiro" na tela, similar ao abaixo. Enriquea o desenho com outros caracteres, simulando enfeites. X XXX XXXXX XXXXXXX XXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXX XX XX XXXX Especificao 4.29 Pinheiro v2 Elabore uma verso 2 do programa do item anterior que desenhe o pinheiro com asteriscos (*). [Dica: use o recurso de localizao/substituio do editor para fazer a substituio rapidamente]

.4.3. Turbo Debugger


Um debugger ou um depurador um programa que permite a execuo gradativa e controlada de um programa, mediante comandos do programador pelo teclado, sendo a sua ferramenta mais valiosa,

5 - PRIMEIROS PROGRAMAS

67

depois do crebro. O Turbo Debugger acompanha o Turbo Pascal, e permite que um programa seja executado uma linha de cada vez. Prtica 4.30 - Execuo linha-a-linha usando o debugger a) Para comear, execute manualmente o programa abaixo e faa um esquema da sua tela de sada.
PROGRAM QuadradoComX; {Mostra na tela um quadrado feito com letras X. Feito por Fulano de Tal, em 11/11/99} uses CRT; begin ClrScr; Writeln( Writeln( Writeln( Writeln( Writeln( end.

'XXXXX' 'X X' 'X X' 'X X' 'XXXXX'

); ); ); ); );

b) Agora digite, compile e execute o programa, comparando a tela obtida com a prevista. c) Agora vamos executar o programa usando o debugger. Com a janela do programa-fonte ativa, tecle F7. Isto inicia o debugger e a execuo linha-a-linha. Uma barra horizontal surge na tela, posicionada sobre o begin. Essa barra indica qual ser a prxima linha de instrues que ser executada. Tecle F7 novamente. A barra estar sobre o ClrScr. A prxima operao a ser efetuada limpar a tela. Qual tela? Bem, a tela do seu programa no est aparecendo; voc est no editor. Para ver a tela de sada do seu programa, tecle Alt-F5. Tudo que o seu programa fizer vai aparecer a. O que voc v agora, antes da execuo da primeira instruo, a tela DOS, contendo o que aconteceu antes de voc entrar no Turbo Pascal ou o resultado do ltimo programa executado. Tecle qualquer coisa para voltar ao programa-fonte. d) Tecle de novo F7, para executar o primeiro Writeln, e novamente Alt-F5. Veja o que houve na tela DOS e tecle algo para retornar. e) Novamente F7, para executar o prximo Writeln. Veja o que apareceu na tela. f) Continue teclando F7, at chegar ao end. Observe que a figura foi construda na tela uma linha de cada vez na seguinte seqncia:
XXXXX XXXXX X X XXXXX X X X X XXXXX X X X X X X XXXXX X X X X X X XXXXX

Usar o debugger no til somente para encontrar erros, mas tambm para voc ver as instrues funcionando e assim aprender mais rapidamente. Prtica 4.31 Mais debugger Execute o programa Careta usando o debugger.

.4.4. Expresses aritmticas


Prtica 4.32 Fazendo clculos Digite o seguinte programa:

68

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM DemoExpressoes; uses CRT; begin ClrScr; Writeln( 1234 + 1000 ); {expresso aritmtica com adio} Writeln('1234 + 1000'); {no expresso, uma cadeia } Writeln('1234 + 1000 = ', 1234 + 1000); Writeln( 1234 - 1000 ); {subtrao} Writeln( 1234 * 1000 ); {multiplicao} Writeln( 1234 / 1000 ); {diviso - resultado real} Writeln( 54*13 - 37/11 + 23/5); {expresses aritmticas combinadas primeiro * e /, depois, + e - } Writeln( -43/5 + 12*34 ); { o - inverte o sinal} Writeln( (1290 + 155) * (980 - 32) ); {primeiro calculado o que est entre parnteses} Writeln( -43/5:10:2); {formatando o resultado real} ReadKey end.

Pascal e matemtica No Pascal voc pode efetuar operaes matemticas de forma semelhante matemtica, montando expresses com nmeros e operaes. Mas para que voc veja o resultado, deve mostr-lo na tela atravs de uma instruo Write ou Writeln, sendo a expresso aritmtica avaliada, isto , calculada, e o resultado mostrado na tela. Voc pode usar parnteses para determinar a precedncia de execuo das operaes. Voc indica que deseja que uma operao seja efetuada usando um operador. Por exemplo, o smbolo + o operador de soma, e indica que se deve somar os dois nmeros ao seu lado (os operandos). O conjunto operador e operandos forma uma expresso aritmtica. No Pascal, o operador de subtrao tambm o mesmo da matemtica; j a multiplicao e a diviso so representados respectivamente por * e /. quatro operaes para dois nmeros. O tipo do resultado de uma expresso aritmtica depende do tipo dos operandos e dos operadores: o operador de diviso real / faz com que a expresso que o contm seja do tipo real. J as expresses com os operadores +, - e * sero reais se houver algum operando real, caso contrrio sero inteiras. Especificao 4.33 Treinando nmeros Escreva um programa Pascal com instrues Write ou Writeln que produzam a tela a seguir (deixe que o programa faa os clculos). Para nmeros reais, use a formatao de quantidade de colunas e decimais.

Resultados de operaes: 2100 + 541 = 2641 7.82 + 2.04 = 9.86 77/3 + 49/12 = 29.75 Pressione qualquer tecla para terminar.

5 - PRIMEIROS PROGRAMAS

69

13 MOD 5 d o resto

1 53 13532

13 DIV 5 d o divisor

Prtica 4.34 Operadores DIV e MOD Outros operadores muito teis para vrios tipos de problemas so div e mod, que so operadores binrios. Ambos efetuam a diviso inteira, mas div calcula o quociente e mod o resto (ambos os operandos de div e mod devem ser valores inteiros): Digite o programa de demonstrao a seguir e preencha os resultados:
begin Writeln(45 div 7); {resultado: ___} Writeln(45 mod 7); {resultado: ___} Writeln(5 mod 2 + 5 div 2); {resultado: ___} end.

Exemplo 4.35 Estudante metdico . Um estudante muito metdico estava matriculado em 6 disciplinas, e dispunha de 1 hora e 40 minutos para estudar. Sua inteno era dividir o tempo disponvel igualmente para as 6 disciplinas, e descansar livremente o tempo restante. Conhecendo os operadores mod e div, ele fez o seguinte programa:
PROGRAM CalcTempoEstudo; uses CRT; begin ClrScr; Writeln('Programa para clculo de tempo de estudo'); Writeln('Dedique ', 100 div 6 , ' minutos para cada disciplina'); Writeln('Aproveite bem os ', 100 mod 6 , ' minutos restantes.') end.

a) Calcule os resultados, digite e execute o programa e confira os resultados (lembre-se de teclar F5 para v-los, aps rodar o programa). b) Modifique o programa para mostrar cada resultado alinhado direita em 10 colunas da tela. Prtica 4.36 Reviso de Div e mod Calcule as expresses abaixo. Depois, faa um programa que lhe permita verificar se voc calculou corretamente. a) b) c) d) e) 37 mod 13 41 div 7 = =

11 div 3 mod 2 = 11 mod 3 div 2 = 5 mod 2 + 5 div 2

70

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 4.37 Precedncia de operaes aritmticas A expresso 5 mod 2 + 5 div 2 do exemplo acima demonstra uma possvel fonte de confuso: se houver vrios operadores, qual operao ser executada primeiro? Para evitar isso, e da mesma forma que na matemtica, podemos usar parnteses ou a precedncia dos operadores, que indicam a seqncia em que devem ser efetuadas as operaes:
PRIORIDADE 1 2 3 OPERADOR - unrio * / div mod +-

A ordem de precedncia acima indica que primeiro so aplicados todos os - unrios, em seguida so efetuadas todas as operaes de multiplicao, diviso, resto e quociente de diviso inteiro, e s aps estas so efetuadas as adies e subtraes. Se a expresso contm parnteses, estes tm precedncia superior a todos os operadores, isto , qualquer expresso entre parnteses executada primeiro. Se no h parnteses, e os operadores tem a mesma prioridade, as operaes so efetuadas da esquerda para a direita. Digite o programa abaixo e confira os resultados:
begin

Writeln(51 div 16 + 48 - 8 mod 5); Writeln( (51 div 16) + ((48 - 8) mod 5) ); Writeln( -3*(43/(52 div 3))); Writeln( 6/3*2 );

{Resultado: 3 + 48 - 3 = 48 } {Resultado: 3 + 0 = 3}
{Resultado: -3*(43/17) = -7.588}

{Resultado: 4 (real)}

end.

Prtica 4.38 Precedncia de operadores Calcule as expresses abaixo, observando a precedncia dos operadores. Em cada caso, dizer se o resultado final inteiro ou real. Por fim, elabore um programa que mostre na tela o resultado de cada expresso, e compare com seus clculos. a) b) c) d) e) f) 2*6 + 11*5 20/(-2)/5 20/2*2 (3+9)/3*4 (5*6/(3+2) - 15*4)/6-4 4+32*2 -7*2/(9-2) Usar a precedncia para estabelecer a ordem das operaes pode provocar erros ou tornar as expresses mais complexas muito difceis de serem entendidas, mesmo por quem as escreveu.. Use parnteses. Prtica 4.39 Conta telefnica Um programador implementou o programa abaixo para a seguinte especificao: Uma conta telefnica composta dos seguintes custos: assinatura: impulsos: interurbanos chamadas p/ celular: R$0,20 por impulso R$ 17,90 R$ 0,04 por impulso que exceder a 90

5 - PRIMEIROS PROGRAMAS

71

Elabore um programa que calcula o valor da conta para 254 impulsos, R$34,29 de interurbanos e 23 chamadas para celular.
PROGRAM CalcContaTelefone; uses CRT; begin ClrScr; Write('Clculo de conta telefnica'); Write('Assinatura: ', 17.90); Write('Impulsos: ', 254, ' a R$0,04 por impulso'); Write('Interurbanos: ', 34.29); Write('Celular: ', 23 , 'chamadas'); Write('Valor da conta: ', 17.90 + 254*0.04 + 34.29 + 23*0.2:10:2); end.

Embora no haja erros de sintaxe, o programa no foi testado adequadamente. H um erro no clculo e a formatao da tela est horrvel. Faa os acertos e melhoramentos necessrios. Especificao 4.40 - Mdia de notas Monte uma expresso matemtica que calcula a mdia de suas notas de um perodo anterior (se no houver, invente). Faa o clculo atravs de um programa, mostrando na tela o resultado, formatado com duas casas decimais. Especificao 4.41 - Converso de temperatura Faa um programa que calcula e mostra uma tabela de graus Celsius/Fahrenheit de 1 a 10 [frmula: C = 5/9(F-32)]. Por enquanto (sem comandos de repetio), voc dever escrever as instrues para calcular e mostrar cada resultado. Especificao 4.42 - Imposto Um imposto calculado com base na seguinte tabela: At de de acima de 1.200,00 1.201,00 a 5.000,00 5.001,00 a 10.000,00 10.000,00 isento 10% 15% 20%.

Implemente um programa que calcule os impostos a pagar para um valor em cada faixa. Para cada um, mostre uma mensagem que identifique na tela a que se refere cada valor.

.4.5. Units
Talvez voc j tenha se perguntado o que aquele "uses CRT;" dos programas que vimos. O Turbo Pascal guarda as definies de alguns comandos em um arquivo, chamado biblioteca padro, que carregado para a memria junto com o restante do ambiente. Mas outras instrues no esto nesta biblioteca, e sim em arquivos com extenso (tipo) .tpu chamados units. A extenso .tpu refere-se a Turbo Pascal Unit.

72

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

A unit CRT contm instrues relacionadas tela e ao alto-falante do computador: limpeza da tela ou de uma linha, posicionamento do cursor, alterao das cores e outras. O Turbo Pascal traz vrias outras units: uma para imprimir, outra para acessar recursos do DOS, outra ainda com instrues grficas (crculos, preenchimentos e texto em modo grfico). Alm disso, voc pode criar suas prprias instrues e guard-las em units, para us-las de qualquer programa, como ser visto mais tarde. Quando voc quer usar uma instruo de uma unit, precisa informar ao compilador onde procurar sua definio, atravs da palavra reservada uses. Sem a declarao uses, o compilador no reconhecer as instrues. Essa declarao deve vir logo aps PROGRAM, e voc pode indicar vrias units, sem a extenso: PROGRAM ... uses CRT, Printer, DOS; Prtica 4.43 Posicionando o cursor Na verso abaixo do programa Careta, foram acrescentadas algumas instrues para posicionar o cursor antes de cada Write.
PROGRAM CARETA_XY; uses CRT; begin ClrScr; Writeln('Este programa desenha uma careta na tela na linha 10, coluna 40.'); Writeln('Pressione qualquer tecla para ver a careta'); Readkey; GotoXY(40, 10); Write(' ____'); GotoXY(40, 11); Write(' / \'); GotoXY(40, 12); Write('/ O O \'); GotoXY(40, 13); Write('\ ^ /'); GotoXY(40, 14); Write(' \ ~ /'); GotoXY(40, 15); Write(' ----'); Writeln; Writeln('Pressione qualquer tecla para terminar o programa'); Readkey; end.

a) Digite o programa e teste-o. b) Faa o programa desenhar a careta a partir da coluna 30, linha 15. c) Use comandos GotoXY para posicionar as mensagens informativas que aparecem antes e depois da careta. d) O que acontece quando GotoXY recebe valores invlidos? Verifique alterando o programa Careta_XY para tentar mostrar a careta nas posies: 100, 5 (coluna invlida) 10, 30 (linha invlida) Para posicionar o cursor na tela antes de um comando Write, use a instruo GotoXY (X, Y), onde X o nmero da coluna (de 1 a 80, em modo padro de texto) e Y a linha (de 1 a 25).

(1,1)

5 - PRIMEIROS PROGRAMAS

73

Exerccio 4.44 Erros de sintaxe Reescreva o programa a seguir, corrigindo os erros de sintaxe:
PROGRAMA QuadradoComX com erros; {verso com erros de sintaxe; usar CRT; begin ClearScreen; Goto XY(20, 7); Goto XY(20, 8) Goto XY(20, 9); Goto XY(20, 10); Goto XY(20, 11); End;

Write( XXXXX ); Write( 'X X' ); Write( 'X X' ); Write( 'X X' ); Writel( XXXXX );

Especificao 4.45 Menu posicionado Elabore um programa que limpa a tela e mostra o seguinte menu centralizado, e espera uma tecla ser pressionada para terminar (o trao aps "Opo:" o cursor). Use comandos de posicionamento do cursor para facilitar.

Especificao 4.46 Tringulo com iniciais Escrever um programa que desenha um tringulo, aproximadamente centralizado, na tela (que em modo texto normal tem 80 colunas por 25 linhas), tendo dentro as iniciais do seu nome. Faa o programa limpar a tela no incio. Para otimizar a elaborao, faa previamente um desenho detalhado (incluindo nmeros de linhas e Menu Relatrios colunas) da tela resultante do programa. Prtica 4.47 Sons cdigo 2 - Por a) ExecuteFim 4 - o seguinte programa:
PROGRAM Som; Opo: _ uses CRT; begin Sound(440); Delay(30); NoSound; end. 3 - Por data 1 - Por nome

b) Agora altere a instruo Sound(440) para Sound(1000) e execute. c) Agora altere a instruo Delay(30) para Delay(500), e depois Delay(2000); d) Experimente outros valores para os parmetros. e) Duplique as trs instrues do programa acima (usando o recurso de copiar e colar) e experimente emitir 2 sons na faixa de 1000 a 2000 Hz e entre 4000 e 5000 Hz. Voc pode controlar a emisso de sons, no alto-falante do computador (e no em placas de som), atravs de trs instrues da unit CRT: Sound(Freq): inicia a emisso de sons na freqncia Freq (inteira); NoSound: interrompe a emisso de sons; Delay(Ms): suspende a execuo do programa durante aproximadamente Ms milissegundos (inteiro).

74

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 4.48 Delay para outra finalidade Altere o programa QuadradoComX para que antes de terminar espere 2 segundos, incluindo uma instruo Delay no final. Especificao 4.49 Parabns Faa um programa que emite as seis primeiras notas do "Parabns pra voc" (6 seqncias de Sound/Delay/NoSound). Tente as seguintes notas (freqncia em Hz/durao em milissegundos): [522,200], [522,200], [585,800], [522,400], [693,400], [655,800]. Prtica 4.50 Cores Para mudar as cores de texto apresentado na tela, o Turbo Pascal para DOS oferece as instrues TextColor e TextBackground, da unit CRT. Ambas esperam como parmetro um nmero que representa uma cor, mas h constantes (nomes que representam valores) j declaradas para as cores e voc pode usar os nomes das cores em ingls: Yellow, Green, Red, Black, White, etc. Por exemplo, para escrever em vermelho, sobre fundo amarelo (gosto no se discute...), voc deve escrever:
uses CRT; begin TextBackground(Yellow); TextColor(Red); Write('Texto em vermelho com fundo amarelo'); end.

Para colorir todo o fundo da tela, ajuste a cor de fundo com TextBackground e comande um ClrScr. Pesquisa 4.51 Nomes das cores Verifique se h na ajuda do Turbo Pascal uma lista de cores e relacione-as. [Dica: procure as constantes declaradas na unit CRT] Prtica 4.52 Quadrado colorido Altere o programa QuadradoComX para que cada linha do quadrado seja de uma cor diferente, sobre um fundo tambm diferente (toda a tela). Digite e teste-o. Especificao 4.53 Texto colorido Faa um programa que faz toda a tela ficar amarela e depois mostra um texto qualquer em preto, na posio 40 (coluna), 1 (linha). O programa espera uma tecla antes de terminar. Especificao 4.54 Nome em cantos Faa um programa que mostra seu nome alternadamente nos quatro cantos da tela. Prtica 4.55 Imprimindo: unit Printer A instruo Write pode receber opcionalmente um primeiro parmetro, chamado arquivo de sada, do tipo texto. A tela um destes arquivos e assumida como o arquivo de sada, caso este no seja informado. A impressora tambm tratada como um arquivo texto, e enviamos texto para ela da mesma forma que para a tela, bastando apenas usar a unit Printer e informar o arquivo de sada LST. Por exemplo, para imprimir seu nome, escreva

5 - PRIMEIROS PROGRAMAS

75

PROGRAM {...} uses Printer; begin Write(LST, 'Seu nome'); end.

Escolha um programa anterior que tenha implementado e que faa algum desenho na tela e altere-o para que imprima o desenho. Especificao 4.56 Etiqueta Usando a unit Printer descrita acima, implemente um programa que mostra na tela e tambm imprime uma etiqueta com seu nome, endereo e demais dados.

.4.6. Funes
Na matemtica, quando se quer indicar o seno de 3,14 radianos, por exemplo, escreve-se Seno(3,14), sendo 3,14 o parmetro. Seno uma funo, e voc calcula o resultado de uma expresso que a contm primeiramente calculando o valor do seno, depois trocando a funo pelo resultado e depois continua o clculo. Por exemplo, na expresso x = 2 x Seno(3,14) = 2 x 0 = 0, a funo Seno(3,14) foi substituda pelo seu valor (0) antes que se pudesse prosseguir o clculo. No Turbo Pascal esto disponveis funes variadas, incluindo as matemticas. Todas so usadas de forma semelhante: o nome da funo, e seus parmetros, no momento da execuo, so substitudos pelo respectivo resultado.

.4.6.1

Funes matemticas

Um programa que calcule o valor da expresso acima ficaria assim em Pascal:


begin Writeln( 2*Sin(3.14) ); end.

A chamada da funo precede as demais operaes; se uma funo um operando de uma expresso, ela deve ser calculada antes que as demais operaes possam ser efetuadas. Observe a seqncia de execuo da instruo acima: calculado o seno; efetuada a multiplicao por 2; mostrado na tela o resultado. No caso do seno, co-seno e outras funes, a notao semelhante da matemtica; j certos operadores da matemtica, como o smbolo da raiz, so substitudos no Pascal por funes. Por exemplo, para calcular a raiz quadrada de 2, voc pode usar a funo SqRt (de Square Root):

76

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

begin Writeln('A raiz quadrada de 2 ', SqRt(2) ); end.

Voc tem que usar o nome da funo reconhecido pelo compilador; tente, por exemplo, incluir em um programa chamadas do tipo Raiz(20) ou Seno(5) e veja o que acontece. Como parmetros de funes voc pode usar expresses e at outras funes. No prximo exemplo, o parmetro da funo Sin uma expresso, que contm outra expresso combinando multiplicao com uma chamada de funo:
begin Writeln( Sin(3.14*2 + SqRt(3) ) ); end.

Neste caso, antes do clculo da funo Sin deve ser avaliada a expresso dentro dos parnteses; antes que esta possa ser avaliada, deve ser calculada a chamada funo SqRt. A tabela a seguir lista funes matemticas disponveis no Turbo Pascal:
FUNO Abs(Num) ArcTan(Num) Cos(Num) Exp(Num) Frac(Num) Int(Num) Ln(Num) Round(Num) Sin(Num) Sqr(Num) SqRt(Num) Trunc(Num) DESCRIO valor absoluto arco tangente co-seno exponencial (e ) parte fracionria parte inteira logaritmo natural (base e) arredondamento ao inteiro mais prximo seno quadrado raiz quadrada extrao da parte inteira
x

TIPO DE ENTRADA Real, inteiro real (radianos) real (radianos) real real real real real real (radianos) real real real

TIPO DE VALOR RETORNADO mesmo da entrada real real real real real real inteiro real Real Real inteiro

Onde esperado um valor real, voc pode usar um inteiro. Exemplo 4.57 O eletricista Um eletricista precisa comprar fio que ir passar, pelo telhado, por toda a diagonal de uma casa de formato retangular. Como ele no tem condies de medir a diagonal com preciso (ou talvez no queira...), a soluo alternativa que ele encontrou foi medir os lados da casa, sabendo que a diagonal pode ser calculada com base nos lados pelo Teorema de Pitgoras (a2 = b2 + c2). Considerando que a casa mede 11,5 x 6,3 metros, faa um programa que calcule a quantidade mnima necessria de fio a ser comprada, com preciso at centmetros. A tela bem simples, vamos mostrar apenas algumas mensagens informativas e o resultado. Para apresentar a quantidade em centmetros, precisamos de 2 casas decimais, e no total 6 colunas bastam. Para efetuar o clculo precisamos elevar ao quadrado e extrair a raiz quadrada. O programa fica assim:

5 - PRIMEIROS PROGRAMAS

77

PROGRAM CalcComprimentoFio; begin Writeln('Clculo de comprimento de fio'); Writeln('para paredes de 11,5 por 6,3 m'); Writeln( 'O comprimento mnimo ', ( SqRt( Sqr(11.5) + Sqr(6.3) ) ):6:2, ' metros. ' ) end.

Note a ordem de execuo das operaes matemticas, quando o programa for executado: primeiro Sqr(11.5), depois Sqr(6.3), em seguida a soma e s depois calculada SqRt. Exerccio 4.58 - Sintaxe de funes Ache dois erros de sintaxe no comando abaixo:
Writeln( Sin(3,14*2 + SqRt(3 ) );

Exerccio 4.59 - Tangente? Suponha que um colega lhe disse que um professor tinha pedido um programa Pascal no qual precisava ser calculada a tangente de um nmero, mas que na linguagem no tinha funo para calcul-la. O que voc sugeriria? Exerccio 4.60 - Seqncia de execuo Para a instruo Writeln( Sin(3.14*2 + SqRt(3) ) ), numere os comandos segundo a seqncia com que sero executadas as operaes: ( ( ( ( ( ) ) ) ) ) * Sin + SqRt Writeln

Especificao 4.61 - Funes matemticas Fornecer o valor retornado pelas operaes matemticas abaixo. Depois, chamando as funes adequadas, escreva um programa que lhe permita verificar a correo dos seus clculos: Raiz quadrada de 169 172 Co-seno(0) 1.65 arredondado para inteiro Especificao 4.62 - Funes aninhadas Escrever um programa que calcula a raiz de 3, arredonda o resultado e calcula a exponencial do valor resultante. Exerccio 4.63 Expresses com funes Converta a expresso abaixo para Pascal (no faa clculos manuais):

78

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

e 3 + 1.13 2 sen ( 3) cos( 6 )


Prtica 4.64 Formatando a sada Altere e execute o programa CalcComprimentoFio (acima) para mostrar o resultado: a) b) utilizando 5 colunas e 1 casa decimal utilizando 0 colunas e 1 casas decimais.

Pesquisa 4.65 - Odd Descubra a finalidade da funo Odd e faa um pequeno programa para test-la.

.4.6.2
Descubra o padro das seguintes seqncias: 1 4 9 25 36 49 ... 0 1 1 2 3 5 8 13 21 34 55 ... 1 7 9 33 12 7 87 37 22 3 4 65 ...

Nmeros aleatrios

Para as duas primeiras voc poder achar o padro, uma relao entre os nmeros. A primeira consiste nos quadrados de 1 a 7, e a segunda a srie de Fibonacci, em que cada termo a soma dos dois anteriores. J para a terceira seqncia no se pode determinar que tipo de regra os produziu. Instrues que produzam nmeros variados sem qualquer padro, regra ou relao entre si, os chamados nmeros aleatrios, so importantes para a implementao de jogos ou para gerar grande quantidade de dados para testar programas. Por exemplo, isto ser necessrio se um programa sorteia um nmero que deve ser adivinhado pelo usurio. E ningum vai querer um programa de bingo que tem uma regra para achar os nmeros! No Turbo Pascal, voc pode gerar nmeros inteiros aleatrios atravs da funo Random. Antes de poder usar Random, voc chama Randomize para inicializar o gerador interno de nmeros aleatrios. Random recebe um parmetro inteiro N, e o nmero gerado estar entre 0 e N - 1. Por exemplo, para gerar e mostrar na tela um nmero aleatrio entre 0 e 100, e depois outro entre 1 e 9, escreva:
PROGRAM TesteNumAleatorio;

begin Randomize; Writeln( Random(101) ); Writeln( 1 + Random(9) ); end.

Prtica 4.66 So aleatrios mesmo? Digite e execute o programa TesteNumAleatorio 10 vezes e verifique se os resultados tem alguma relao uns com os outros.

5 - PRIMEIROS PROGRAMAS

79

Exerccio 4.67 Utilidade de nmeros aleatrios Descubra ou invente cinco aplicaes para nmeros aleatrios. Exerccio 4.68 Nmeros aleatrios em jogo Para algum jogo de computador que conhea, identifique algumas partes em que foram necessrios nmeros aleatrios para tornar o jogo mais interessante. Especificao 4.69 Operaes com nmeros aleatrios Faa um programa que multiplica um nmero aleatrio de 1 a 10 por outro de 100 a 1000 e divide o resultado por outro de 1 a 1000, formatando a sada com 3 casas decimais. Especificao 4.70 Sorteio de dados Faa um programa que sorteia e mostra na tela os valores correspondentes a dois dados. Especificao 4.71 Pinheiro refinado Elabore uma verso do programa do pinheiro (pg. 66) que troca a cor de fundo para branco, colore os galhos do pinheiro de verde e o caule de outra cor, entre cada linha espera 100 milissegundos e emite um som diferente com freqncia crescente e espera uma tecla para terminar.

.4.7. Constantes declaradas


Prtica 4.72 Parabns com constantes declaradas Digite e teste o programa a seguir.
PROGRAM ParabensComConstantes; {Toca o incio do Parabns usando constantes declaradas para as notas musicais} uses crt; const DO1 RE MI FA SOL LA SI DO2 = = = = = = = = 522; 585; 655; 693; 777; 871; 976; 1034; Delay(200); Delay(200); Delay(800); Delay(400); Delay(400); Delay(400); NoSound; NoSound; NoSound; NoSound; NoSound; NoSound;

begin Sound(DO1); Sound(DO1); Sound(RE); Sound(DO1); Sound(FA); Sound(MI); end.

Constantes O Pascal nos permite definir nomes para valores, de forma a tornar os programas mais fceis de serem entendidos e para facilitar certas modificaes. Isso feito na seo CONST (de constantes). Em um programa Pascal podem ser declaradas constantes numricas, constantes para

80

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

cadeias de caracteres e vrias outras. Quando o compilador encontra um nome declarado na seo de constantes, ele simplesmente troca o nome pelo respectivo valor. Sempre que voc estiver repetindo algum valor em um programa, pense em declarar uma constante para ele. Para facilitar a identificao de uma constante em um programa, pode-se adotar padres, como comear cada constante com um "c". Exemplos: const MeuNome = 'Fulano'; cVersaoPrograma = '2.1'; cPI = 3.1415; cTurma = 'A'; Especificao 4.73 Escala musical Usando como base o programa acima, faa um programa que "toca" a escala de notas, de um D at o prximo, tendo as notas a mesma durao, escolhida por voc. Pesquisa 4.74 Constantes predefinidas O Turbo Pascal oferece algumas constantes que voc pode usar sem declaraes. Descubra o que so e os valores das constantes: a) PI b) MaxInt Especificao 4.75 Quadrado de novo Reescrever o programa QuadradoComX, declarando uma constante para o caractere e utilizando somente essa constante para mostrar o caractere na tela.

.4.8. Atividades suplementares


Pesquisa 4.76 Outras instrues da unit CRT Procure na Ajuda do Turbo Pascal e descreva as instrues da unit CRT relacionadas abaixo. Faa um pequeno programa de demonstrao de cada uma. a) b) c) ClrEol DelLine Window

Prtica 4.77 - Indentao A organizao visual do programa, com letras minsculas e maisculas, linhas em branco, um comando por linha e deslocamentos para a direita ("indentao") facilita para ns percebermos sua estrutura; para o compilador nada disto faz diferena, desde que voc separe os nomes adequadamente (a exceo so os parmetros tipo texto de Write/Writeln: maisculas e minsculas so respeitadas). Voc precisa por um espao aps a palavra PROGRAM, por exemplo, para o compilador saber que a palavra terminou: o espao um caractere separador. J depois de um ponto-e-vrgula no preciso um espao, j que tambm um separador. Uma vez que haja um separador, quaisquer espaos adicionais so ignorados. Verifique isto editando o programa QuadradoComX para que fique como abaixo (no quebre texto entre apstrofos em duas linhas); depois compile, execute e comprove:

5 - PRIMEIROS PROGRAMAS

81

PROGRAM QuadradoComX; {Mostra na tela um quadrado feito com letras X. Feito por Fulano de Tal, em 11/11/99} begin Writeln; Writeln( 'XXXXX' ); Writeln( 'X X' ); Writeln( 'X X' ); Writeln( 'X X' ); Writeln( 'XXXXX' ); end.

Especificao 4.78 Apresentao de texto Um estudante ia participar de uma feira de cincias e seu projeto tinha o tema "fotossntese". Ele conseguiu um notebook emprestado, e queria um programa que lhe permitisse apresentar um texto dividido em partes, cada parte em uma tela, e o programa deveria mudar para a prxima tela ao toque de uma tecla. A tela inicial deve ser a palavra "FOTOSSNTESE" escrita com letras grandes. Faa o programa para o estudante, usando o texto abaixo, no qual cada pargrafo deve aparecer em uma tela diferente. Use cores para melhorar a apresentao. Como o estudante no entende muito de operao de computadores, voc tem que tambm gerar um arquivo executvel, copi-lo para o outro computador e incluir um cone para fcil execuo sob Windows. Texto: "A gua e os sais minerais absorvidos pelas razes sobem atravs dos vasos lenhosos do caule e chegam s folhas. Nas folhas, existe uma substncia verde, a clorofila, que absorve a energia luminosa do sol. Ao mesmo tempo, por meio dos estmatos presentes nas folhas, a planta absorve gs carbnico do ar. Usando a energia solar, o gs carbnico e o hidrognio contido na gua retirada do solo, aps complicadas reaes qumicas, a planta produz acares (glicose)." Prtica 4.79 Mais comandos do debugger Pesquise nos menus ou na ajuda os comandos do debugger para: a) b) Reiniciar uma sesso de depurao Encerrar uma sesso de depurao

c) Aps posicionar o cursor em algum ponto do programa, execut-lo at a posio do cursor. Prtica 4.80 Imprimindo a tela de sada do programa Voc pode precisar imprimir a tela de sada de algum programa, para documentar trabalhos, por exemplo. Veja as alternativas para isso, no Windows: Tecle Alt-Print Screen para enviar a tela da janela ativa para a rea de transferncia (Shift-Print Screen copia toda a tela). Abra um editor de textos, como o Word ou WordPad, ou um editor de figuras (Photo Editor, Paint), cole a figura e imprima. No caso do editor de textos, altere a fonte para uma no-proporcional, como Courier, para preservar a formatao original. Execute o programa, a partir do Turbo Pascal ou de seu arquivo executvel, em uma janela (se no estiver, tecle Alt-Enter). Use o recurso de seleo e cpia para a rea de transferncia, que dessa forma feita em modo texto. Para isso use os botes da barra de ferramentas, no alto da janela. Cole o texto selecionado em um editor (pode ser o Bloco de Notas ou at o do TP) e imprima-o normalmente.

Pesquisa 4.81 Units Procure na ajuda do TP quais so as units padro. Para cada uma, relacione para que serve e d exemplos do respectivo contedo.

82

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Pesquisa 4.82 Units no disco Usando o Windows Explorer ou outro utilitrio, procure no diretrio (pasta) do Turbo Pascal arquivos .tpu e liste seus nomes.

83

.5 MEMRIA E ENTRADA DE DADOS

Voc j deve ter observado, pelos exerccios dos captulos anteriores que, com comandos simples, j se pode fazer vrias coisas num computador, atravs de uma linguagem de alto nvel como o Pascal. Mas para elaborar programas mais teis necessrio tirar proveito da memria do computador. Quando o usurio de um programa digita dados do teclado, onde so guardados esses dados? E como? Pode-se guardar dados na memria a qualquer momento? E como recuper-los? Que problemas podem ocorrer? preciso conhecer a fundo a memria do computador? Neste captulo voc ver como podemos tornar os programas muito mais flexveis, usando variveis.

.5.1. Comandos de memria


Prtica 5.1 - Vendo por fora a) Digite e compile o programa a seguir.
PROGRAM EqSegundoGrau; {Calcula razes da equaao do segundo grau com coeficientes a, b e c. No trata delta negativo} uses CRT; var a, b, c : integer; Raiz1, Raiz2 : real; Delta : real; {coeficientes} {razes}

begin ClrScr; Writeln('Entre coeficiente a: '); Readln(a); Writeln('Entre coeficiente b: '); Readln(b); Writeln('Entre coeficiente c: '); Readln(c); Delta := Sqr(b) - 4*a*c; Raiz1 := (-b + SqRt(Delta) )/(2*a); Raiz2 := (-b - SqRt(Delta) )/(2*a); Writeln('Primeira raiz ', Raiz1:0:2); Writeln('Segunda raiz ', Raiz2:0:2); ReadKey; end.

b) Execute o programa para cada equao do segundo grau descrita pelos conjuntos de coeficientes (1, 0, -1), (1, -1, -6) e (1, 4, 4). c) O programa no est preparado para tratar deltas negativos. Verifique o que acontece neste caso executando-o para os coeficientes (1, 2, 5). d) Prepare outras equaes e experimente submet-las ao programa. Uma forma simples calcular (x - R1)(x - R2), onde R1 e R2 so as razes.

84

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

e) Execute o programa novamente, e quando for solicitado o coeficiente a, digite uma letra ou algo no numrico, e veja o que acontece. Variveis Variveis armazenam valores, e so o mecanismo de uso da memria. Voc s precisa informar o nome de cada uma e o tipo de dado; o compilador cuida do gerenciamento da memria. Pode-se fazer o seguinte com variveis: Declarar: na seo var informe o nome das variveis que o programa vai precisar e o tipo de dado que cada uma vai armazenar. O nome de uma varivel deve seguir as mesmas regras que voc viu para nomes de programas: comear com uma letra, seguida de letras, dgitos ou barra de sublinhado. No podem, da mesma forma, ser usadas palavras reservadas como begin. No Pascal, toda varivel usada em um programa deve ser declarada. Omitir a declarao provoca um erro de compilao, com a mensagem unknown identifier (identificador desconhecido). Atribuir: com o sinal := voc guarda um valor diretamente na varivel. O nome da varivel sempre aparece esquerda, e a direita pode ter qualquer expresso cujo resultado possa ser armazenado na varivel. Recuperar o valor: onde for preciso usar o valor da varivel, basta inserir o nome dela. Ler um valor do teclado: com a instruo Readln pode-se ler algo digitado do teclado, sendo o valor lido guardado na varivel indicada entre parnteses. Variveis armazenam somente um valor de cada vez. A cada atribuio ou leitura, o valor anterior perdido. Exerccio 5.2 Reconhecendo aes com variveis No programa-fonte acima, identifique a seo de variveis, as atribuies, as recuperaes de valor e as leituras. Lendo atribuies Voc pode ler atribuies, digamos, Lin := 1, das seguintes maneiras: Atribua 1 a Lin, Lin recebe 1 , Lin igual a 1 (h linguagens em que o smbolo de atribuio o =), ou ainda Faa Lin igual a 1. Prtica 5.3 Xeretando a memria a) Vamos ver mais de perto as variveis em ao. Execute o programa usando o debugger (F7), at que a barra fique sobre o primeiro Readln. Tecle Ctrl-F7. Aparece uma janela com o ttulo "Add Watch". Digite "a" (sem as aspas) e clique em Ok. Deve aparecer uma janela embaixo chamada "Watches". Faa o mesmo para "b" e "c". Voc est indicando ao debugger que deseja acompanhar os valores dessas variveis. Para garantir que tanto a janela do fonte quanto a de variveis estaro visveis,voc pode clicar em Window/Tile. b) Agora execute o Readln. Digite um valor para o coeficiente e tecle Enter. Observe na janela Watches o valor indicado para a varivel a. Faa o mesmo para os demais coeficientes. c) Inclua as variveis Delta, Raiz1 e Raiz2 na janela Watches. Tecle F7 novamente (alternativamente voc pode teclar INS quando a janela Watches estiver ativa) enquanto observa o que muda no contedo de cada varivel. d) Na janela Watches voc pode inserir e observar tambm expresses. Experimente observar o valor da expresso Delta > O.

6 - MEMRIA E ENTRADA DE DADOS

85

Quando voc vai usar este recurso de executar uma linha de cada vez? Tipicamente quando, ao testar um programa, voc achar erros e precisa de informao sobre o que o programa est fazendo. Use-o tambm para aprender e fixar o funcionamento de uma instruo nova. Prtica 5.4 - Explorando o exemplo Experimente introduzir no programa EqSegundoGrau os seguintes erros (um de cada vez) e compilar; indique o erro ocorrido: a) b) c) d) e) f) tire o var tire a vrgula entre duas variveis na seo var tire o ponto e vrgula ao final da linha do var idem, os dois pontos (:) escreva a palavra real como "rial" ou outra errada retire uma varivel da declarao

Mais de Readln A instruo Readln, quando encontrada no fluxo de execuo de um programa, l o que for digitado no teclado e o armazena na varivel indicada entre parnteses. O programa suspenso para que o usurio digite. Ao digitar, o usurio pode usar as teclas Backspace, Delete e as setas (como instruo de entrada de dados, Readln muito limitada; posteriormente criaremos outra melhor). A varivel usada para a leitura deve ser compatvel com o valor esperado. Se o varivel indicada real e for digitado texto ou valor numrico invlido (por exemplo, 2.3.1), o programa ser interrompido e uma mensagem de erro ser mostrada. Se o tipo do dado digitado for incompatvel com o da varivel, como por exemplo letras quando esperado um nmero, a execuo do programa tambm ser interrompida. Voc pode chamar Readln sem variveis, quando quiser por exemplo fazer uma pausa. Neste caso, no ponha parnteses. Readln, quando usada para ler nmeros, permite que vrias variveis sejam lidas de uma vez: Neste caso, na digitao, os valores devem ser separados por espaos ou tabs. Exerccio 5.5 Nomes de variveis Indicar os nomes de variveis invlidos no Pascal, explicando para cada um porque no vlido: a) b) c) d) e) f) g) h) i) j) k) l) B52 14Bis Nota_1 NotaTiradaPeloAlunoNaDisciplina %Lista Program Nota-1 AsiaA2_LP Dia Mes Ano Ms Var_1 Var

86

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Nomes de variveis so importantes D nomes significativos s variveis (como PlacaCarro, NomeCliente) de forma a tornar o programa mais legvel e de compreenso mais rpida, para voc e para seu professor! E d nomes estranhos ou codificados (PC, NC, seu nome) quando no quiser que algum o entenda...

.5.2. Tipos de dado


Quando declara uma varivel, voc tem que informar tambm o tipo de dado, que indica ao compilador a natureza dos valores que a varivel pode conter. Porque isto? Voc j sabe que a memria do computador no como um pedao de papel ou um quadro de giz, em que voc pode escrever e registrar vrios tipos de smbolos: nmeros, letras, rabiscos e qualquer desenho de que voc seja capaz. Ela muito mais limitada: cada byte pode armazenar apenas um nmero de 0 a 255, e isto tudo o que temos para registrar informao. Se o que temos a registrar so nmeros de 0 a 255, timo, usamos uma varivel de 1 byte. Mas e se for um nmero maior do que 255? E se for negativo? E se tiver casas decimais? Como fao para representar uma letra? Como armazenar uma figura? Devido variedade de tipos de informao a serem representados, e estrutura limitada da memria de um computador, as linguagens de programao oferecem vrias alternativas para esta representao. O que todas tm em comum a classificao da informao em tipos de dados. Do ponto de vista de uma linguagem de programao, um nmero real diferente de um nmero inteiro. Um nmero, seja real ou inteiro, diferente de uma seqncia de caracteres. Desta forma, um nmero inteiro de um tipo de dado, um nmero real de outro tipo, assim como uma seqncia de caracteres quaisquer de outro tipo distinto. Portanto, uma varivel, alm de ter um nome, ser caracterizada pelo tipo de dado que pode conter, que deve ser informado quando declararmos a varivel. De maneira geral, os tipos de dado de uma linguagem de programao so variaes dos tipos inteiro, real, lgico (verdadeiro ou falso) e texto. Os conceitos relacionados a variveis e tipos de dado so usados em todas as linguagens de programao; tudo que voc assimilar aqui ter aplicao em qualquer delas, ainda que com nomes diferentes e pequenas variaes. Em qualquer linguagem nova, uma das primeiras coisas que o programador faz verificar quais so os tipos de dado disponveis.

.5.2.1

Tipos de dado do Turbo Pascal

Veja na tabela a seguir os principais tipos de dado no estruturados, o respectivo domnio e a quantidade de byte ocupadas na memria.

6 - MEMRIA E ENTRADA DE DADOS

87

TIPOS DE DADO DO TURBO PASCAL


TIPO DE VALOR TIPO DE DADO PASCAL Nmero inteiro Byte Shortint Integer Word Longint Nmero real Texto Lgico Real Char String Boolean VALORES POSSVEIS 0..255 -128..127 -32768..32767 0..65535 -2.147.483.648..2.147.483.647 -2.9e-39..1.7e38 um caractere Texto False, True BYTES 1 1 2 2 4 6 1 1 a 255 1

Portanto, se voc precisa armazenar um valor numrico com casas decimais, deve declarar uma varivel do tipo real. Se o dado a representar um nmero inteiro, voc deve escolher entre os cinco tipos disponveis: byte, integer, word, smallint e longint, cujas diferenas so basicamente a faixa de nmeros suportada. Para armazenar um nico caractere (letra, dgito, sinal, caractere de controle) no Pascal, use o tipo char. Por exemplo, se voc quer registrar se algum dado se refere a uma pessoa fsica ou jurdica, referidas como 'F' ou 'J', pode declarar uma varivel do tipo char. O mesmo tipo se aplica se quisermos armazenar um caractere correspondente a uma tecla, como retornado pela funo ReadKey. J para representar dados como o nome de uma pessoa, seu endereo ou uma frase qualquer, preciso declarar variveis do tipo string, que permite declarar cadeias de at 255 caracteres. Voc pode indicar o comprimento desejado entre colchetes: string[30], string[100]. Se no indicado, ser assumido o mximo. O tamanho mximo de uma varivel string diferente do seu tamanho dinmico: uma varivel pode ter um mximo de 50 caracteres e num determinado ponto da execuo do programa estar armazenando 19 caracteres. O critrio para escolher tipos de dado buscar o que melhor representa a informao a ser armazenada, consumindo o mnimo de memria. Para distinguir cadeias de caracteres de outros nomes do programa, como nomes de variveis, representamos uma cadeia entre apstrofos, como em 'Texto'. Se no o fizermos, o compilador tentar interpretar o nome ou seqncia de caracteres como identificador (de varivel, funo ou outro elemento) ou como nmero, conforme comece com letra ou dgito. Assim, em um programa, 'Idade' representa uma cadeia de caracteres, enquanto Idade representa uma varivel. O caractere apstrofo, quando necessrio, representado duplicado, como em 'caixa d''gua'. A expresso '''' representa uma cadeia com um nico caractere apstrofo. J variveis do tipo boolean (lgico) podem assumir somente dois valores: True e False (verdadeiro e falso). Normalmente so usadas para armazenar resultados da avaliao de expresses lgicas, usadas para verificaes: o contador j atingiu 100?, o aluno tirou nota maior do que 5? O tipo de dado de uma varivel determina e limita o conjunto de valores que ela pode assumir e as operaes que podem ser executadas com a varivel. Mas sempre a especificao do programa que esclarecer, em vrias situaes, qual ser o tipo de dado mais adequado. Se a especificao pede que voc calcule valores inteiros para reas, usar o tipo real pode ser inadequado.

88

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Uma varivel real pode armazenar um valor inteiro, mas no o contrrio. Exemplo 5.6 Quadrado com linha e coluna aleatrias "Implementar um programa que desenha um quadrado de lado 5 na tela, feito com letras X e tendo o canto superior esquerdo em uma linha e uma coluna sorteadas. Voc j sabe que pode usar as instrues GotoXY e Write para posicionar o quadrado na tela. Sabe tambm que pode usar a instruo Random para sortear a linha e a coluna. Os passos seriam os seguintes: Sortear a linha Sortear a coluna Desenhar o quadrado na linha e na coluna sorteadas Para a especificao acima, vamos precisar de duas variveis, s quais chamaremos Linha e Coluna. Quais os tipos de dado das variveis Linha e Coluna? Linha est entre 1 e 25, e Coluna entre 1 e 80. Podemos escolher shortint ou byte, mas daremos preferncia a este porque os valores tem natureza eminentemente positiva. Note que voc pode at escolher os tipos integer, word ou longint, mas estar usando memria desnecessariamente. O programa:
PROGRAM QuadradoSorteado; {Desenha um quadrado com X em linha e coluna sorteadas} uses CRT; var Lin, Col : byte; begin Randomize; ClrScr; Lin := 1 + Random(21); {sorteia linha de 1 a 21} Col := 1 + Random(76); {sorteia coluna de 1 a 76} GotoXY(Col, Lin); Writeln( 'XXXXX' ); GotoXY(Col, Lin+1); Writeln( 'X X' ); GotoXY(Col, Lin+2); Writeln( 'X X' ); GotoXY(Col, Lin+3); Writeln( 'X X' ); GotoXY(Col, Lin+4); Writeln( 'XXXXX' ); ReadKey; end.

Exemplo 5.7 Quadrado com caractere lido Escrever um programa que desenha um quadrado com o canto superior esquerdo em uma linha e coluna lidas, usando um caractere tambm lido. Antes de terminar o programa espera ser teclado Enter. Um projeto, na forma de uma tela-exemplo de sada do programa, pode ser:

6 - MEMRIA E ENTRADA DE DADOS

89

Este programa desenha um quadrado com um caractere. Digite o caractere: + Digite a linha: 10 Digite a coluna: 30

Tecle Enter para terminar.

+++++ + + + + + + +++++

Veja o programa que implementa essa especificao:


PROGRAM QuadradoComCaractere; {Desenha um quadrado formado por um caractere lido, a partir de linha e coluna lidas} uses CRT; var Lin, Col : byte; Ch : char; begin ClrScr; Writeln('Este programa desenha um quadrado com um caractere.'); Write('Digite o caractere: '); Readln(Ch); Write('Digite a linha: '); Readln(Lin); Write('Digite a coluna: '); Readln(Col); GotoXY(Col, Lin); Write(Ch, Ch, Ch, Ch, Ch); GotoXY(Col, Lin + 1); Write(Ch, ' ', Ch); GotoXY(Col, Lin + 2); Write(Ch, ' ', Ch); GotoXY(Col, Lin + 3); Write(Ch, ' ', Ch); GotoXY(Col, Lin + 4); Write(Ch, Ch, Ch, Ch, Ch); Writeln; Write(Tecle Enter para terminar.'); Readln; end.

Exerccio 5.8 Odad ed sopit Numere a segunda coluna (variveis) de acordo com a primeira (tipos de dado, com as letras embaralhadas). I - ebyt II - aler III - grints IV - rach V - noebola VI - ginnolt Prtica 5.9 Blocos Faa um diagrama de blocos para o programa QuadradoComCaractere. ( ( ( ( ( ( ) Idade de uma pessoa, em anos ) Valores False ou True ) Habitantes de um pas ) A raiz quadrada de um nmero ) Uma letra do alfabeto ) Um texto qualquer

90

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 5.10 Compatibilidade de tipos O fato de haver diferentes tipos de dados tem implicaes e limita as atribuies que podemos comandar. Assim, variveis declaradas como do tipo integer so incompatveis com um nmero real ou com uma constante do tipo char ou string e assim por diante. Digite o programa de teste abaixo e verifique quais das atribuies so invlidas (faa uma de cada vez). Indique o cdigo de erro de compilao para esse tipo de erro.
var Numero Nome Ch N begin Numero := 3.1415; Numero := 'X'; Nome := 1215; Nome := '1215'; Ch := 'Texto'; Ch := 0; N := 32000; end. : : : : integer; string[10]; char; byte;

Exerccio 5.11 Declarao de variveis Reescrever as declaraes abaixo, corrigindo os erros de sintaxe: a) b) c) d) e) f) Var Nmero, Coeficiente : real; var integer N1, N2 var Nome, E-mail : string[300]; var Passou, {Indica se o aluno passou na disciplina} VAR Alterou {registra se em alguma passagem algum dado foi alterado} : boolean; vaR Incremento, Celsius : real;

Exerccio 5.12 - Complete Complete a tabela com o nome da varivel e o tipo de dado mais adequado:
TIPO DE VALOR a) b) c) d) e) f) g) h) i) j) Quantidade de funcionrios Salrio de um funcionrio Nome de um aluno Nome de uma disciplina Mdia de notas das disciplinas de um perodo Data de nascimento Placa de um carro rea de um crculo Nome de arquivo do DOS, com extenso e sem subdiretrios Saldo de uma conta bancria NOME DA VARIVEL QtFunc VrSalario NomeAluno TIPO DE DADO PASCAL word Real String[30]

k) Nmero de habitantes de uma cidade qualquer

6 - MEMRIA E ENTRADA DE DADOS

91

TIPO DE VALOR l) Tipo de pessoa (valores: 'F' para pessoa fsica e 'J' para pessoa jurdica) de uma pessoa, sem smbolos delimitadores (somente os dgitos) e incluindo os dgitos verificadores

NOME DA VARIVEL

TIPO DE DADO PASCAL

m) CPF

Exerccio 5.13 Variveis de objetos Identifique variveis e respectivos tipos de dado para representar 3 caractersticas de cada um dos seguintes objetos: a) b) c) d) e) f) g) h) i) j) fita de vdeo carteira de identidade sua casa ou apartamento livro carro cala jeans sapato ou tnis lpis planta folha de cheque

Exerccio 5.14 Variveis codificadas Ao preencher um cadastro de um banco ou de uma loja, voc j deve ter preenchido campos codificados: ao invs de uma informao, voc deve escrever o cdigo correspondente. Por exemplo, sexo (masculino 1, feminino 2), tipo de pessoa (fsica 'F', jurdica 'J'). Esse tipo de codificao pode ser mais ou menos fcil de ler e entender; por exemplo, sexo com valores 'M' ou 'F' ou com nmeros. Para as informaes abaixo e seus valores possveis, elabore uma codificao e declare uma varivel com o tipo adequado de dado: a) b) c) d) e) Datilografia (nada, catilgrafo, dez dedos) Estado civil (casado, solteiro, vivo, desquitado, divorciado) Tipo de moradia (prpria, alugada, cedida, hipotecada, outros) Fumante (sim ou no) Conhecimentos de ingls (fala/escreve, l, todos)

Exerccio 5.15 - Competio Forme 2 grupos de colegas. Escolham um objeto comum e vejam qual grupo consegue identificar mais variveis do objeto em 2 minutos. Exerccio 5.16 Instrues com variveis Codificar instrues Pascal isoladas para as aes abaixo (pressuponha que as variveis necessrias foram declaradas). Siga o modelo: a) Mostrar na tela o contedo das variveis Codigo, Nome e Preco, separadas por espaos Soluo: Write(Codigo, , Nome, , Preco); b) Somar 10 varivel N e armazenar o resultado na prpria varivel N

92

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

c) Calcular o resto da diviso inteira da varivel N por 13 e atribuir o resultado varivel Resto d) Calcular o seno do contedo da varivel N, extrair a parte inteira e mostrar o resultado na tela e) Atribuir varivel Delta o resultado do clculo b2 - 4ac. f) Mostrar na tela o valor do co-seno da raiz quadrada da exponencial da varivel N g) Ler do teclado uma cadeia de caracteres e armazen-lo na varivel string S. h) Ler um nmero para a varivel Num. i) Ler um caractere para a varivel Ch. j) Sortear um nmero que pode ser 0 ou 1 e armazenar o resultado na varivel Sorteio.4

Exerccio 5.17 Expresses aritmticas com variveis Fornea expresses aritmticas em Pascal que representem as seguintes frmulas (use variveis com nomes apropriados): a) b) Mdia aritmtica de 3 nmeros Soma dos N primeiros nmeros inteiros [frmula: N (N+1)/2)]

c) Valor em graus Celsius correspondente a uma temperatura em graus Fahrenheit [frmula: C = 5/9(F-32)]. Prtica 5.18 Ache o erro O programa abaixo deveria implementar a seguinte especificao: "O critrio de notas de uma faculdade consiste de uma nota de 0 a 10 em cada bimestre, sendo a primeira nota peso 2 e a segunda peso 3. Elabore um programa que l as notas bimestrais e calcula a nota do semestre." Ocorre que h um erro de lgica. Descreva o erro, corrija-o e teste o programa.

6 - MEMRIA E ENTRADA DE DADOS

93

PROGRAM CalcNotaSemestral; uses CRT; var Nota1, Nota2 : real; begin ClrScr; Writeln('Clculo da nota final a partir das notas bimestrais, pesos 2 e 3.'); Write('Entre nota do 1o. bimestre: '); Readln(Nota1); Write('Entre nota do 2o. bimestre: '); Readln(Nota2); Write('Nota final: ',(Nota1*2 + Nota2*3/5):0:1); Readkey; end.

.5.3. Mais do tipo de dado char


Prtica 5.19 Conhecendo char Digite e execute o programa abaixo, inicialmente sem e depois com o debugger.
PROGRAM DemoChar; {demonstrao do tipo de dado char e algumas operaes com variveis desse tipo} uses CRT; var Ch1, Ch2 : char; S : string; begin ClrScr; Write('Digite um valor para o caractere 1: '); Readln(Ch1); Writeln('Veja o que pode ser feito com variveis do tipo char.'); Writeln('Pressione uma tecla aps conferir um resultado.'); Writeln; Ch2 := 'x'; Writeln('A varivel Ch2 no foi inicializada. O comando Ch2 := ''x'' atribui'); Writeln('o caractere x a Ch2. Confira, o valor dela agora : ', Ch2); ReadKey; Writeln('Transforme o valor da varivel em maiscula.' ); Ch2 := UpCase(Ch2); Writeln('Aps o comando Ch2 := UpCase(Ch2), essa varivel agora contm: ', Ch2); ReadKey;; Write('Concatenao (juno), usando o operador +: Ch1 + Ch2 = '); Writeln(Ch1 + Ch2); ReadKey; Write('A mesma operao, usando a funo Concat(Ch1, Ch2): '); Writeln(Concat(Ch1, Ch2)); ReadKey; Writeln('Entre com um caractere na leitura a seguir, usando o teclado numrico.'); Writeln('Pressione Alt e tecle 178, solte Alt e tecle Enter.'); Readln(Ch1); Writeln('Ch1 agora contm: ', Ch1); ReadKey; Writeln('A instruo FillChar preenche uma string com caracteres.');
Writeln('Vamos preencher a string S com 70 vezes Ch1. O comando FillChar(S, 70, Ch1)');

Writeln('Veja como ficou S (tecle algo):'); ReadKey; FillChar(S, 70, Ch1); Writeln(S); ReadKey; end.

Prtica 5.20 Upcase sem maisculas Faa um pequeno programa de teste e veja o que a funo Upcase retorna quando recebe caracteres que no a maiscula correspondente, como '!' e '#".

94

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 5.21 Lendo teclas com ReadKey Digite e execute o programa abaixo, depois siga as explicaes.
PROGRAM MostraTecla; {demonstra uso de ReadKey como funo e procedimento} uses CRT; var Ch : char; begin Writeln('Pressione uma tecla'); Ch := ReadKey; Writeln('Voc pressionou a tecla ', Ch); Writeln('Pressione outra tecla para terminar'); ReadKey; end.

Vimos usando ReadKey como um procedimento, mas ela na verdade uma funo, que retorna o caractere correspondente tecla pressionada. Uma vantagem de usar ReadKey para ler um caractere que o usurio no precisa teclar Enter, como no Readln. Sendo uma funo, podemos chamar ReadKey dentro de um Write ou atribuir seu resultado a uma varivel. Veja o exemplo: O programa acima funcionar para teclas de caracteres normais, como alfabticos e numricos. Para teclas de funo ou normais alteradas por uma tecla de controle, como Shift, Alt e Control, ReadKey retornar zero e ser necessrio cham-la novamente parar obter um segundo cdigo. Para tratar essa situao, precisamos de instrues que veremos no prximo captulo. Armazenando caracteres na memria Se em um byte de memria podemos apenas representar nmeros de 0 a 255, como ento representar letras e outros caracteres, que constituem os valores dos tipos de dado char e string? Letras e outros smbolos no numricos so armazenados na memria tambm na forma de nmeros, sendo a correspondncia feita atravs de tabelas que associam letras a cdigos numricos. Nos computadores padro PC usada a tabela ASCII (American Standard Code for Information Interchange), que vai de 1 a 255 (1 byte, portanto). Nela, alm de letras, nmeros e sinais de pontuao, existem cdigos numricos para caracteres de controle (por exemplo, o 13 corresponde ao ENTER e o 27 ao ESCAPE) e desenhos de linhas simples e duplas (retas horizontais e verticais, cantos). Para letras, h cdigos distintos para maisculas e minsculas: o cdigo 66 corresponde a 'B', e o 98 corresponde a 'b'. H um cdigo tambm para o caractere 'espao', o 32. Assim, o nmero 66 armazenado num byte de memria interpretado de forma diferente, conforme o tipo de dado com que foi definido a varivel ali armazenada. Se o dado for, por exemplo, de um tipo numrico que ocupa um byte, o nmero 66 mesmo. Se o byte for parte da representao de uma cadeia de caracteres, interpretado como o caractere 'B'. Para o compilador, letras no se misturam com nmeros. No caso de um dado do tipo cadeia de caracteres, mesmo se o nmero armazenado for 50, interpretado como o caractere '2', e no o nmero 2. Para representar a seqncia de caracteres '65', so necessrios 2 bytes: um para o '6' e outro para o '5'. Veja a tabela ASCII no apndice D.

6 - MEMRIA E ENTRADA DE DADOS

95

Exerccio 5.22 Familiarizao com a tabela ASCII Numere a segunda coluna de acordo com a primeira, segundo a correspondncia do caractere ASCII com o respectivo cdigo: a) b) c) d) e) f) $ + 7 X Z ~ ( ( ( ( ( ( ) 43 ) 55 ) 90 ) 36 ) 88 ) 126

Prtica 5.23 Obtendo caracteres ASCII No editor do Turbo Pascal, em um texto qualquer, e usando o teclado numrico, obtenha os caracteres correspondentes a alguns cdigos na faixa de 180 a 200 (veja como no programa-tutorial acima).

.5.4. Mais do tipo de dado string


Prtica 5.24 Conhecendo strings Digite e execute o programa abaixo, inicialmente sem e depois com o debugger.
PROGRAM DemoStrings; {demonstrao do tipo de dado string e algumas operaes com variveis desse tipo} uses CRT; var S1 : string; {uma cadeia (string) de tamanho mximo 255} S2 : string[30]; {tamanho mximo 30} S3 : string[3]; {tamanho mximo 3} begin ClrScr; Write('Digite um valor para a string 1 (at 255 caracteres): '); Readln(S1); Write('Digite um valor para a string 2 (at 30 caracteres): '); Readln(S2); Writeln('Digite um valor para a string 3 (at 3 caracteres; '); Write('O que passar disso ser desprezado na leitura: '); Readln(S3); Writeln('Veja o que pode ser feito com variveis do tipo string.'); Writeln('Pressione uma tecla aps conferir um resultado.'); Write('Concatenao (juno), usando o operador +: S1 + S2 = '); Writeln(S1 + S2); ReadKey; Writeln('A mesma operao, usando a funo Concat: '); Writeln(Concat(S1, S2)); ReadKey; Writeln('Para calcular o tamanho atual de uma varivel string, use a funo
Length.');

Writeln('Por exemplo, S1 tem atualmente ', Length(S1), ' caracteres.'); Writeln('Para obter um caractere de uma string, use colchetes aps o nome da varivel.'); Writeln('O primeiro caractere de S1 S1[1]: ', S1[1]); ReadKey; Writeln('O terceiro de S2 S2[3], que ', S2[3]); ReadKey; Writeln('O ltimo caractere de S2 obtido com S2[ Length(S2) ]: ', S2[ Length(S2) ]); ReadKey; Writeln('Voc pode mudar somente um caractere de uma varivel string,'); Writeln('basta indicar o nmero dele entre colchetes na atribuio.'); S3 [1] := '!'; Writeln('Apos o comando S3[1] := ''!'', S3 ficou assim: ', S3); ReadKey;

96

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Writeln('Para extrair uma subcadeia, use a funo Copy(VarString, PosInicial, Qtde).'); Write('Copy(S2, 3, 2) obtm, a partir do terceiro, 2 caracteres (se houver): '); Writeln(Copy(S2, 3, 2)); ReadKey; Writeln('Procure outras instrues para strings: '); Writeln('Pos: pesquisa uma subcadeia em uma cadeia'); Writeln('FillChar: preenche uma varivel string com um caractere'); ReadKey; end.

Inteiro ou string? - Em alguns casos pode haver um dilema na representao de um dado que s contm dgitos: como string ou como inteiro? Esse o caso de um nmero de telefone. Outros dados possuem dgitos e sinais mas o armazenamento dos sinais desnecessrio, como em um CEP ou um CPF. Em princpio, voc pode aplicar a regra: se no sero feitas operaes matemticas com o dado, use o tipo string, a menos que tenha um bom motivo para no faz-lo. Nessa questo (como em vrias outras), a experincia ser seu melhor professor. Exerccio 5.25 RG inteiro? Voc representaria um nmero de identidade como um inteiro ou como uma cadeia de caracteres? Explique. Prtica 5.26 Atribuio de texto Para atribuir cadeias de caracteres a variveis tipo string, ou um caractere a uma varivel tipo char, escrevemos a cadeia ou o caractere entre apstrofos. Se o caractere apstrofo faz parte da cadeia, deve aparecer duplicado. Assim, quando forem executadas as instrues do programa:
var Nome : string[30]; Ch : char; begin Nome := 'Fulano de Tal'; Ch := '''' end.

ser atribudo varivel Nome o contedo 'Fulano de Tal', e varivel Ch um apstrofo. Digite o programa acima e comprove, usando o debugger. At que tenha sido armazenado um valor pela primeira vez em uma varivel, seu contedo indefinido, e pode ser qualquer coisa; voc que deve cuidar disso. Prtica 5.27 Range check Procure no menu Options/Compiler uma opo que ativa/desativa a verificao de faixa (range checking). Acesse a ajuda e veja o que significa. Faa um pequeno programa que apenas l um valor para uma varivel do tipo byte e mostra seu contedo na tela. Compile inicialmente com a opo de verificao ativada, execute o programa e digite um valor maior que 255. Depois desative a verificao de faixa e compile novamente, executando da mesma maneira. Descreva o que observou de diferente e os possveis impactos em programas. Exerccio 5.28 Represente cada descrio como uma nica instruo Pascal:

6 - MEMRIA E ENTRADA DE DADOS

97

a) b) c)

Converter a varivel Ch para maiscula e armazenar o resultado na prpria varivel Ch. Alterar o ltimo caractere da varivel string Cad para 'Z'. Converter o ltimo caractere da varivel Cad para maisculo.

d) Extrair o caractere da varivel Nome, na posio indicada pela varivel N, e atribuir o resultado varivel Ch. Prtica 5.29 Problema com Write Um estudante de programao estava com o seguinte problema: um Writeln devia mostrar uma linha de hfens com 80 caracteres, mas ele no queria que o texto do programa-fonte fosse alm da margem direita da tela (facilita a visualizao e a descoberta de erros). Ao tentar quebrar a cadeia em duas linhas, como abaixo, o compilador no permitiu: Writeln('-------------------------------------------------------------------------------'); Pesquise e teste trs solues para o problema: a) Usando Write b) Usando o operador '+' c) Usando a funo FillChar.

.5.5. Descobrindo variveis


Voc vai identificar as variveis de um programa, em geral, ao iniciar a implementao do programa-fonte, aps ter pelo menos parte do projeto. Em geral, procuramos valores que mudam de uma execuo do programa para outra. Por exemplo, uma equao do segundo grau, cujo programa j vimos, tem a forma ax2 + bx + c, que representa genericamente todas as equaes dessa ordem. O que muda de uma para outra? Exatamente os coeficientes a, b e c. Portanto, um programa que resolva equaes do segundo grau precisa ter variveis para os trs coeficientes (no mnimo). Considere agora que um programa que inverte uma cadeia de caracteres lida pelo teclado. Isto , se o usurio entrar com 'cadeia a inverter', o programa mostrar na tela a cadeia 'retrevni a aiedac'. Quais as variveis? Pelo menos uma ser necessria, para armazenar a cadeia digitada no teclado. Dependendo da implementao, pode ou no ser necessria uma outra varivel para armazenar a cadeia invertida, conforme o programa mostre-a diretamente na tela ou armazene-a em uma varivel para mostrar depois. Se o programa simula um 'X' se movendo pela tela, da esquerda para a direita e de cima para baixo, no so necessrias variveis para armazenar dados fornecidos pelo teclado. Mas internamente o programa seguidamente posiciona o X em linhas e colunas diferentes, portanto haver pelo menos duas variveis. Use se necessrio as perguntas abaixo. 1. O que sai, isto , quais informaes so apresentadas pelo programa ao usurio? 1.1. O que mostrado na tela?

98

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

1.2. 1.3. 2. 3. 4. 5. 6.

O que impresso? O que sai do programa por outros meios?

Que informaes entram, isto , o que fornecido pelo usurio? O que calculado pelo programa? Que informaes so constantes ou estveis durante uma execuo do programa? Que informaes podem ser diferentes em duas execues do programa? Que informaes intermedirias preciso representar para obter a sada?

Exemplo 5.30 Descobrindo variveis de entrada 1 Ache as variveis de entrada para cada especificao abaixo, isto , variveis que devem ser declaradas para receber dados via teclado: a) Elabore um programa que l trs valores e calcula a mdia geomtrica dos nmeros lidos (diviso do produto pela quantidade de valores). Soluo: N1, N2 e N3, do tipo real (se fosse escolhido um tipo inteiro no estaria errado, j que a especificao omissa quanto a isto). b) Escrever um programa que l um caractere, as iniciais de um nome (3 caracteres), uma linha e uma coluna e depois desenha na tela um tringulo eqiltero formado com o caractere, tendo dentro as iniciais lidas. O caractere no pice do tringulo deve estar na linha e coluna lidas, e a altura do tringulo deve ser no mximo 5 linhas. Soluo: Ch (char), Iniciais (string[3]), Lin e Col (byte). Exemplo 5.31 Descobrindo variveis de entrada 2 Ache as variveis de entrada para a especificao abaixo: Um salrio tem os seguintes componentes: - valor nominal - adicional devido a horas extras - valor descontado para o INSS (10% do valor a receber, limitado a 150 reais). O valor adicional devido s horas extras calculado dividindo-se o valor nominal por 176 (22 dias de 8 horas), multiplicando-se pela quantidade de horas e ainda com um acrscimo de 50%. Escrever um programa que l os valores necessrios, calcula e mostra na tela os componentes do salrio e o salrio lquido resultante para o empregado. No preciso prever arredondamentos, mas os valores devem ser mostrados na tela com duas casas decimais. Exemplos: para um salrio de R$ 1.000,00, com 30 horas extras, teremos R$ 255,68 de horas extras [(1.000/176)*30*1,5], R$ 125,57 de INSS e um salrio lquido de R$ 1.130,11. Para um salrio de R$ 2.000,00 e 20 horas extras, seriam R$ 340,91 de horas extras, R$ 150,00 de INSS (e no os 10%), com um salrio lquido de R$ 2.190,91. Soluo: O valor nominal deve ser lido, bem como a quantidade de horas extras. Todos os demais valores sero calculados pelo programa. Exerccio 5.32 - Ache variveis na especificao Identifique variveis para a especificao abaixo: Uma conta telefnica composta dos seguintes custos:

6 - MEMRIA E ENTRADA DE DADOS

99

assinatura: impulsos: valor de interurbanos chamadas p/ celular:

R$ 17,90 R$ 0,04 por impulso que exceder a 90 R$0,20 por impulso

Elabore um programa que l os impulsos excedentes, valor de interurbanos e quantidade de chamadas para celular e calcula o valor da conta. Especificao 5.33 - Tempo livre Reescreva o programa CalcTempoEstudo (pg. 69) de forma que trate qualquer disciplina e qualquer quantidade de tempo livre. Assim, o estudante entra com esses valores e o programa efetua os clculos necessrios. Teste com valores variados. Especificao 5.34 - Comprimento de fio Altere o programa do eletricista (pg. 76) para que as medidas sejam lidas do teclado. Especificao 5.35 - Nota musical Elaborar um programa que l uma freqncia (em Hertz) e uma durao (em milissegundos) e emite um som na freqncia com a durao. Especificao 5.36 - Etiqueta Escreva um programa que l do teclado seu nome completo, endereo, CEP e telefone, limpa a tela e mostra , centralizados, seu nome na primeira linha, seu endereo na segunda, e o CEP e telefone na terceira. Especificao 5.37 - Mdia aritmtica Escrever programa que l trs notas inteiras e calcula a sua mdia aritmtica. Especificao 5.38 - Menu posicionado Implemente um programa que mostra o menu abaixo a partir de uma linha lida do teclado: Menu de Consultas 0 1 2 3 4 Opo: _ Fim Clientes Produtos Faturas Estoque

Especificao 5.39 - Mdia ponderada Implemente um programa que l trs valores e calcule a mdia ponderada para pesos 1, 2 e 3, respectivamente (multiplique cada nota pelo seu peso, some os produtos e divida o resultado pela soma dos pesos).

100

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 5.40 - Aritmtica bsica Implemente um programa que l dois nmeros quaisquer e informa sua soma, diferena, produto e quociente, formatados com 2 casas decimais. Especificao 5.41 - Funes matemticas Elabore um programa que l um nmero (suponha que ser positivo) e informa seu quadrado, raiz, logaritmo e exponencial, formatados com 4 casas decimais Especificao 5.42 - Losangos Implemente um programa que desenhe os losangos abaixo na tela, sendo que o topo do primeiro losango colocado em uma linha e uma coluna lidas do teclado, e o topo do segundo fica 15 colunas direita do primeiro. X XXX XXXXX XXXXXXX XXXXXXXXX XXXXXXX XXXXX XXX X Especificao 5.43 - Tringulo com iniciais Escrever um programa que l um caractere, as iniciais de um nome (3 caracteres), uma linha e uma coluna e depois desenha na tela um tringulo formado com o caractere, tendo dentro as iniciais lidas. O caractere no pice do tringulo deve estar na linha e coluna lidas, e a altura do tringulo deve ser no mximo 5 linhas. Especificao 5.44 - Converso de temperatura Um canal de notcias internacionais, a cabo, previa temperatura mxima para Braslia de 85 graus Fahrenheit. Escrever um programa que lhe permita converter esta temperatura (e qualquer outra) para graus Celsius, sabendo que a relao entre elas C = 5/9 (F -32). Especificao 5.45 - Despesas de casal Um casal divide as despesas domsticas mensalmente. Durante o ms cada um anota seus gastos e as contas que paga; no final eles dividem meio a meio. O casal deseja um programa que facilite o acerto: eles digitariam os gastos de cada um, e o programa mostraria quem deve a quem. Atualmente eles fazem o acerto manualmente, na forma da seguinte tabela: ITEM DESPESAS PAGAS % PAGO VALOR DEVIDO SALDO MARIDO 1200,00 55,81 1075,00 -125,00 ESPOSA 950,00 44,19 1075,00 125,00 TOTAL 2.150,00 100 2150,00 X XXX XXXXX XXXXXXX XXXXXXXXX XXXXXXX XXXXX XXX X

Portanto, os saldos devem ser iguais, e quem tiver o saldo negativo deve pagar o valor para o outro. Faa um programa que leia os valores adequados e efetue os clculos. O total a soma das despesas individuais; um percentual o gasto individual dividido pelo total, multiplicado por 100; o valor devido

6 - MEMRIA E ENTRADA DE DADOS

101

por cada um o mesmo e igual metade do total; finalmente, cada saldo corresponde ao valor devido menos o valor pago. Uma tela para o programa pode ser, com os mesmos dados da tabela acima: Este programa rateia despesas de casal (50% para cada). Digite valor das despesas do marido: 1200 Digite valor das despesas da esposa: 950 ITEM ============== Despesas pagas % pago Valor devido Saldo MARIDO ======= 1200.00 55.81 1075.00 -125.00 ESPOSA ======= 950.00 44.19 1075.00 125.00 TOTAL ======= 2150.00 100 2150.00

a) Elabore um programa para a especificao descrita. b) Altere o programa de forma que o marido arque com 60% das despesas e a esposa com o restante. c) Suponha que o casal, ao invs de dividir meio a meio as despesas, vai dividi-las proporcionalmente renda de cada um. Altere o programa de forma que este leia tambm a renda de cada um e use a proporo das rendas para a diviso Especificao 5.46 - Adivinha Escrever um programa que implementa uma brincadeira de adivinhar um nmero pensado por uma pessoa. Veja exemplo do dilogo: Pense um nmero (o outro pensou o 7). Multiplique por 2 (Ok) Some 6 ao resultado (Ok) Divida o resultado por 2 (Ok) Quanto deu? (O outro informa 10). Voc pensou o nmero 7 (Ohhh!!!)

[Dica: problemas desse tipo do origem a uma expresso aritmtica, e voc pode alterar as operaes vontade, desde que a expresso resultante admita uma inversa. Normalmente estruturamos o problema de forma que a expresso permita uma simplificao que facilite os clculos. Para a seqncia do exemplo, a expresso (sendo n o nmero pensado e R o resultado): (n*2+6)/2 = R, donde n = (R*26)/2 = R - 3. Ou seja, basta subtrair 3 do resultado fornecido pela pessoa para "adivinhar" o nmero]. Especificao 5.47 - Converso cm/pol a) Faa um programa que mostra 10 linhas de uma tabela de converso centmetro/polegada, a partir de um valor lido e variando de 10 em 10 centmetros (uma polegada equivale a 2,54 centmetros). b) Altere o programa para que a variao tambm seja lida do teclado.

102

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 5.48 - Notas do professor Um professor avalia seus alunos atravs dos seguintes critrios: 1) Duas notas de exerccios de 0 a 10, sem casas decimais, peso 1 e peso 2, respectivamente, com peso de 20% na nota final. 2) Uma nota de prova de 0 a 10, com uma casa decimal e peso de 80% na nota final. Elabore um programa que l as notas de um aluno, calcula e mostra na tela sua nota final, formatada com uma cada decimal e devidamente ponderada pelos pesos (uma mdia ponderada calculada somando-se os produtos de cada valor pelo seu peso e dividindo-se a soma resultante pela soma dos pesos). Exemplo: Um aluno tirou 5 e 6 de exerccios e 8,5 na prova. Sua nota de exerccios (5*1 + 6*2)/3 = 5,667. Sua nota final (5,667*2 + 8,5*8)/10 = 7,9. Especificao 5.49 Muitas notas musicais Elaborar um programa que l uma freqncia (em Hertz) e uma durao (em milissegundos) e emite 10 sons com a durao lida, sendo o primeiro com a freqncia lida e os seguintes 10% maiores que o anterior. Especificao 5.50 - Conta telefnica Uma conta telefnica composta dos seguintes custos: valor da assinatura: impulsos: valor de interurbanos chamadas p/ celular: R$0,40 por impulso Elabore um programa que l os impulsos excedentes, valor de interurbanos e quantidade de chamadas para celular e calcula o valor da conta. Declare o valor da assinatura e as tarifas como constantes. Ao definir a tela, imagine que est fazendo um produto para ser avaliado por um cliente, juntamente com o de concorrentes, para uma eventual compra. R$ 21,40 R$ 0,03 por impulso que exceder a 90

.5.6. Declarando seus prprios tipos de dado


Nem sempre os tipos de dado disponveis na linguagem atendem perfeitamente s necessidades do programa. Uma caracterstica que distingue o Pascal de outras linguagens a possibilidade que o programador tem de declarar seus prprios tipos de dado. Uma vez que declarou o novo tipo, pode declarar quantas variveis quiser daquele tipo. H vrias possibilidades para isso no Pascal; aqui, ficaremos restritos a uma delas, que consiste em declarar um novo tipo como um subconjunto de um tipo disponvel na linguagem: esse o tipo subfaixa (subrange). A idade de uma pessoa, por exemplo, um subconjunto do tipo byte. As letras maisculas so um subconjunto do tipo char. Declaramos um tipo de dado atravs da palavra reservada type, normalmente antes da seo var, embora possa vir tambm depois. Para o tipo subfaixa, informamos o nome do tipo, o limite inferior e o limite superior (que deve ser maior ou igual ao limite inferior), separados por dois pontos. Para a idade e para as letras maisculas, podemos declarar tipos da seguinte forma:

6 - MEMRIA E ENTRADA DE DADOS

103

type tIdade = 1..120; tMaiusc = 'A'..'Z';

Agora podemos declarar variveis dos novos tipos:


var Idade : tIdade; Ch1, Ch2 : tMaiusc;

Uma boa aplicao para a definio de tipos para cadeias de caracteres. Em um programa tpico, costuma-se declarar vrias variveis de um mesmo tipo, como voc ver no captulo sobre criao de instrues. Se voc declarar um nome como string[30], por exemplo, se tiver que mud-lo deve percorrer todo o programa para substituir o tamanho onde quer que ele ocorra. Alternativamente, pode-se declarar um tipo para o nome:
Type tNome : string[30];

Agora, basta mudar a declarao do tipo para alterar todas as declaraes de variveis desse tipo. Exerccio 5.51 - Subfaixa Declare tipos de dado subfaixa para representar: a) Nomes de livros b) Idade de pessoas, podendo estar includos personagens bblicos c) Linha da tela em modo texto padro (25x80) d) Data em formato "AAAAMMDD" Prtica 5.52 QuadradoSorteado v2 Reescreva o programa QuadradoSorteado, declarando um tipo de dado subfaixa para a linha e outro para a coluna. Teste.

.5.7. Converses entre tipos de dados


Muitas vezes precisamos efetuar converses entre tipos de dados: de inteiro ou real para string ou vice-versa, um caractere para o cdigo ASCII correspondente e vice-versa. Por exemplo, para evitar erros na entrada, podemos ler um nmero como texto e depois convert-lo para nmero para efetuar operaes matemticas. Cdigos ASCII Para converter um cdigo numrico no respectivo caractere da tabela ASCII, voc pode usar a funo padro Chr ou o smbolo #. Os primeiros dois comandos abaixo fornecem a mesma sada, ou seja, o caractere 'J'. O terceiro emite um bip no alto-falante: Writeln( Chr(74) ); Writeln( #74 ); Writeln( #7 ); {idem} {emite bip} {Mostra 'J'}

A funo inversa Ord, que recebe um caractere e retorna o cdigo ASCII correspondente. Assim, a instruo abaixo mostrar na tela o nmero 74. Writeln( Ord('J') ); Responda: o que ser mostrado na tela pela instruo abaixo? Write (Chr(Ord('H')));

104

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exemplo 5.53 De ASCII para caractere Escreva um programa que l trs nmeros e mostra na tela uma cadeia formada pela concatenao dos caracteres ASCII de cada nmero. Uma tela para o programa pode ser assim:
Entre trs nmeros de 0 a 255: 74 75 76 JKL _

Precisamos de trs variveis inteiras para os nmeros. Como os cdigos ASCII vo de 0 a 255, o tipo byte apropriado. Para converter cada cdigo para o respectivo caractere, usamos a funo Chr, e para concaten-las usamos o operador +. O programa fica assim:
PROGRAM Concat3CodAscii; uses CRT; var N1, N2, N3 : byte; begin ClrScr; Write('Entre trs nmeros de 0 a 255: '); Readln(N1, N2, N3); Writeln(Chr(N1) + Chr(N2) + Chr(N3)); end.

Exemplo 5.54 De caractere para ASCII Elabore um programa que l um nome de at 15 caracteres e mostra a inicial e seu cdigo ASCII, e a ltima letra e seu cdigo. Uma tela resultante da execuo do programa pode ser:
Entre um nome: Fulano Inicial: F, cujo cdigo ASCII 70 Ultima: o, cujo cdigo ASCII 111

Precisamos de variveis para o nome (string), para a letra inicial e para a ltima (Char). O programa:

6 - MEMRIA E ENTRADA DE DADOS

105

PROGRAM InicialEUltimaLetra; uses CRT; var Nome : string[15]; Inicial, Ultima : char; begin ClrScr; Write('Entre um nome: '); Readln(Nome); Inicial := Nome[1]; Writeln('Inicial: ',Inicial, ', cujo cdigo ASCII ', Ord(Inicial)); Ultima := Nome[Length(Nome)]; Writeln('Ultima: ', Ultima, ', cujo cdigo ASCII ', Ord(Ultima)); ReadKey; end.

Prtica 5.55 Otimizando o uso de variveis Altere o programa InicialEUltimaLetra para fazer as mesmas coisas porm sem as variveis Inicial e Ultima. Teste-o para situaes variadas. Especificao 5.56 - Iniciais Escreva um programa que l nome e sobrenome, e mostra na tela as iniciais. Especificao 5.57 - Finais Reescreva o programa anterior para mostrar na tela as letras finais do nome e sobrenome (use a funo Length). Especificao 5.58 - Componentes de data Escrever um programa que l uma data no formato dd/mm/aa e mostra dia, ms e ano separados. Especificao 5.59 - Sorteio da LBV A LBV fez um sorteio cujos bilhetes continham nmeros de 6 dgitos. O sorteio foi baseado nos dois primeiros prmios da loteria federal, sendo o nmero sorteado formado pelos trs ltimos dgitos do primeiro e do segundo prmio. Por exemplo, se o primeiro prmio fosse 34.582 e o segundo 54.098, o nmero da LBV seria 582.098. Escreva um programa que l os dois prmios e retorna o nmero sorteado (use a funo Copy). Especificao 5.60 - Subcadeias Escreva um programa que l uma cadeia de caracteres de tamanho 20, separa-a em duas e mostra na tela as duas metades.

.5.8. Atividades suplementares


Exerccio 5.61 Relembrando instrues de caracteres e cadeias Associe cada procedimento ou funo sua finalidade. Assinale com um F os quadrados cujas instrues so funes e por isto podem ser usados em expresses:

106

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Upcase Concat Pos Length Copy FillChar Chr Ord

Obter uma subcadeia Obter o caractere correspondente a um cdigo ASCII Obter o cdigo ASCII de um caractere Concatenar uma ou mais cadeias Obter o tamanho de uma cadeia Pesquisar uma subcadeia em uma cadeia Converter um caractere para maiscula Repetir um caractere

Pesquisa 5.62 Chamando funes como procedimentos No programa MostraTecla, a funo ReadKey chamada como funo (dentro do Writeln) ou como procedimento. Isto permitido somente quando uma certa opo de compilao est ativada. Descubra no menu Options/Compiler do Turbo Pascal qual essa opo, desative-a, tente compilar o programa e descreva o que ocorreu. Especificao 5.63 Animao vertical Faa um programa que desenha um "O" a partir de uma linha e coluna lidas do teclado e depois faz o seguinte 10 vezes, esperando uma tecla antes de cada vez (sempre na linha lida): - apaga o "O" da coluna atual e o mostra na coluna seguinte Especificao 5.64 - Animao horizontal Elabore um programa semelhante ao anterior, mas variando a linha. Especificao 5.65 - Metades de cadeia Implemente um programa que l uma cadeia de caracteres de tamanho at 255 e mostra na tela as metades da cadeia. [Dica: basear os clculos no tamanho da cadeia] Especificao 5.66 - Msica linear? A respeito do programa do parabns (pg. 74), deseja-se saber se a melodia preservada somando-se um valor constante a cada freqncia. Faa um programa que l esse valor (por exemplo, 100) e faz soar as notas somando o valor a cada freqncia. Pesquisa 5.67 Mais comandos do debugger Localize no seu ambiente de desenvolvimento Pascal os seguintes comandos: a) b) c) d) Excluir uma varivel da janela Watches (tente o boto direito do mouse) Dividir a tela em duas janelas: a do programa e a das variveis (menu Window) Marcar um ponto de um programa para interrupo da execuo (breakpoint) Desmarcar breakpoint.

6 - MEMRIA E ENTRADA DE DADOS

107

Prtica 5.68 Readln com boolean Faa um pequeno programa de teste e investigue se uma varivel do tipo boolean pode usada em uma instruo Readln. Pesquisa 5.69 Inc Em atribuies, ao invs de construes do tipo Quant := Quant + 1, voc pode usar a instruo Inc (de increment), que permite aumentar o valor de uma varivel inteira. Pesquise na ajuda como us-la e faa um pequeno programa de demonstrao.

108

.6 ALTERNATIVAS E DECISO

Imagine um programa que calcula raiz quadrada de um nmero qualquer, lido do teclado. Se o usurio digitar um nmero negativo, ocorre um erro e o programa termina. Para que isso no ocorra, preciso que o programa verifique se o nmero negativo e somente calcule a raiz se isso no ocorrer. Ou inversamente, somente calcular a raiz se o nmero lido for maior ou igual a zero. Assim como pessoas, programas que fazem verificaes e tomam boas decises so mais produtivos. Veja neste captulo como os programas podem fazer essas verificaes e, com base no resultado destas, executar ou no um bloco de instrues.

.6.1. Deciso e expresses lgicas: IF


Prtica 6.1 IF 1 a) Digite o programa abaixo, cuja especificao a seguinte: Elaborar um programa que l um nmero qualquer e calcula sua raiz quadrada. O clculo somente efetuado se o nmero for maior ou igual a zero. Se no for, mostrada uma mensagem de erro.
PROGRAM CalculaRaiz; uses CRT; var Num : real; begin ClrScr; Writeln('Clculo de raiz quadrada'); Write('Digite o nmero: '); Readln(Num); if Num >= 0 then Write('A raiz de ', Num:0:2, ' ', SqRt(Num):0:2 ) else Write('Nmero invlido'); Write('Pressione qualquer tecla'); ReadKey; end.

a) Execute o programa para os nmeros 0, 3, -2. b) Repita o passo anterior, desta vez usando o debugger.

7 - ALTERNATIVAS E DECISO

109

IF O comando Pascal que permite execuo condicional de instrues o IF..THEN..ELSE, cuja sintaxe : if <expresso lgica> then <comando 1> else <comando 2> Uma expresso lgica constitui uma comparao cujo valor pode ser somente Verdadeiro ou Falso (True ou False, para o Turbo Pascal). Para a comparao usamos os operadores: = < > <= >= <> (igual) (menor que) (maior que) (menor ou igual) (maior ou igual) (diferente)

O comando if funciona assim: se a <expresso lgica> for verdadeira, executado o comando aps o then, caso contrrio (expresso falsa), executado o comando aps o else. Veja um exemplo simples: if N >= 0 then Write('N positivo') else Write('N negativo'); O comando acima ser executado assim: - O valor de N recuperado da memria (suponhamos que foi 121); - A expresso lgica 121 >= 0 avaliada, sendo o resultado True (verdadeira); - Como a expresso lgica aps o if verdadeira, ser executado o comando que estiver aps o then, no caso o primeiro Write; - O fluxo de execuo segue para o comando que estiver aps a ltima instruo do else (o comando aps ou dentro deste ignorado). - Quando a expresso lgica aps o if avaliada como falsa (por exemplo, quando o valor de N for -77), ser executado o que estiver aps o else, e o que estiver aps o then ignorado. O comando if determina que ou sero executadas as instrues aps o then ou as aps o else, mas nunca ambas as possibilidades, em uma mesma passagem do fluxo de execuo. No coloque ponto-e-vrgula antes do else, voc estar indicando para o compilador que terminou o comando if, e ele no entender a clusula else. Prtica 6.2 IF 2 a) Digite o programa abaixo, cuja especificao a seguinte: "O critrio de notas de uma faculdade consiste de uma nota de 0 a 10 em cada bimestre, sendo a primeira nota peso 2 e a segunda peso 3. Elabore um programa que l as notas bimestrais e

110

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

calcula a nota do semestre. Se alguma nota lida estiver fora da faixa vlida, mostrada uma mensagem de erro"
PROGRAM CalcNotaSemestral; uses CRT; var Nota1, Nota2 : real; begin ClrScr; Writeln('Clculo da nota final a partir das notas bimestrais, pesos 2 e 3.'); Write('Entre nota do 1o. bimestre: '); Readln(Nota1); if (Nota1 >=0) and (Nota1 <=10) then begin Write('Entre nota do 2o. bimestre: '); Readln(Nota2); if (Nota2 >=0) and (Nota2 <=10) then Write('Nota final: ',((Nota1*2 + Nota2*3)/5):0:1) else Write('Nota invlida'); end else Write('Nota invlida'); Readkey; end.

a) Execute o programa para as notas (7, 8), (11, ?), (8, 12). b) Repita o passo anterior, desta vez usando o debugger. begin e end Se houver mais de um comando aps then ou else, ser necessrio delimitar todos eles com begin..end, que indicam um comando composto:
if N >= 0 then begin Write('N positivo'); ReadKey; end else begin Write('N negativo'); ReadKey; end;

Prtica 6.3 Erros de compilao do IF Registre as mensagens de compilao para as seguintes situaes no programa CalcNotaSemestral: a) Retire um then b) "Esquea" de por um else c) Ponha um ponto-e-vrgula antes do else d) Ponha um ponto-e-vrgula aps o then (esta situao peculiar: o ponto-e-vrgula no causa erro, porque no necessrio haver um comando aps then ou else, mas este no ser reconhecido por estar sem um if) e) Retire os parnteses de uma das expresses lgicas.

7 - ALTERNATIVAS E DECISO

111

Exemplo 6.4 Clculo de conceito Uma universidade atribui conceitos aos alunos com base na nota obtida em cada disciplina, segundo a tabela abaixo. Escreva um programa que l a nota e informa o conceito obtido. NOTA --------90..100 75..89 50..74 40..49 0..39 CONCEITO ---------------A B C D E

Agora h vrias decises a serem tomadas: se no for um conceito, pode ser o outro e assim por diante. Veja o programa e as explicaes a seguir:
PROGRAM CalculaConceito; { L uma nota de 0 a 100 e calcula o conceito: A, B, C, D ou E} uses CRT; var Nota : byte; Conceito : char; begin ClrScr; Write('Digite a nota:'); Readln(Nota); if Nota > 100 then Writeln('Nota invlida') else begin if Nota >= 90 then Conceito := 'A' else if Nota >= 75 then Conceito := 'B' else if Nota >= 50 then Conceito := 'C' else if Nota >= 40 then Conceito := 'D' else Conceito := 'E'; Writeln('O conceito ', Conceito); end; Readkey end.

Note na soluo acima: - No necessrio testar se a nota negativa, j que sua varivel do tipo byte; - Testar a validade da nota antes permite simplificar as decises seguintes (o limite superior de cada faixa no verificado) - Foi declarada uma varivel auxiliar para o conceito, para chamar Writeln somente uma vez. Se for preciso alterar a forma como o conceito mostrado, isso ser feito em um comando somente. - O else do primeiro if precisou do par begin..end, j que tem dois comandos: um if e um Writeln.

112

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 6.5 CalculaConceito Teste o programa CalculaConceito nas seguintes situaes: a) Nota invlida b) Uma nota no meio de cada faixa de conceitos c) Uma nota nos limites de cada faixa. Combinao de expresses lgicas Quando for necessrio fazer uma ou mais verificaes combinadas, como "N1 = 0 e N2 = 0", "N < 0 ou N > 9". podemos juntar duas ou mais expresses lgicas atravs dos conectivos lgicos and (e) e or (ou). Para o operador and, uma expresso ser verdadeira somente quando todas as expresses que a compem forem avaliadas como verdadeiras. Para o operador or, toda a expresso verdadeira quando qualquer uma das expresses resultar verdadeira. Eles podem ser usados em expresses lgicas dos comandos if, while e qualquer outro que contenha expresses desse tipo. As expresses parciais sempre tm de estar entre parnteses. Por exemplo: Para saber se um nmero de um dgito: if (Numero >= 0) and (Numero <= 9) then {...} Numero 9, como na No Pascal voc no pode construir expresses lgicas do tipo 0 Matemtica; voc deve usar and ou or. Para verificar se uma varivel caractere contm 'F' ou 'J': if (TipoPessoa = 'F') or (TipoPessoa = 'J') then {...} Verificar se um nmero est entre duas faixas: 0 a 100 ou 200 a 300: if ((Num>0)and(Num<100))or(Num>200) and (Num<300)) then {...} Um operador muito interessante e conciso in, atravs do qual voc verifica se um valor ou resultado de expresso pertence a um conjunto, definido entre colchetes e no qual podem constar valores ou faixas. Veja como os comandos acima ficam mais simples com esse operador: if TipoPessoa in [ 'F', 'J' ] then ... if Num in [ 0..100, 200..300 ] then ...

Prtica 6.6 - And ou Or? No programa CalcNotaSemestral, troque o primeiro and por or. Execute o programa para valores invlidos e veja o que acontece. Exerccio 6.7 - In Altere o comando abaixo para que aceite tambm as letras minsculas correspondentes:
if TipoPessoa in [ 'F', 'J' ] then ...

Exerccio 6.8 Elaborando if Elabore comandos if que faam o seguinte (invente nomes apropriados de variveis): a) Se pessoa maior de idade, mostra mensagem apropriada. b) Se aluno passou em uma disciplina, mostre na tela "Parabns!", seno, "Danou!". c) Se a opo digitada 'A', 'I' ou 'E', mostra mensagem de 'opo vlida', seno, 'opo invlida'. d) Se a temperatura est no intervalo de 0 a 100, informa 'estado lquido'.

7 - ALTERNATIVAS E DECISO

113

Exerccio 6.9 Reviso do IF Assinale V ou F: ( ( ( ( ( ) ) ) ) ) H situaes em que ambos os comandos aps o then e o else so executados em seqncia. Antes de else sempre deve ter um ponto-e-vrgula. As expresses em ambos os lados dos operadores and e or devem estar entre parnteses. Se houver somente um comando aps o then, no necessrio o par begin..end. Se houver mais de um comando aps o else, necessrio o par begin..end.

Prtica 6.10 Compare Abaixo foi repetido o trecho do programa acima, s que sem o desalinhamento das instrues ("indentao"). Apenas fique olhando para um e outro durante alguns segundos, como quem no quer nada...
if Nota > 100 then Writeln('Nota invlida') else begin if Nota >= 90 then Conceito := 'A' else if Nota >= 75 then Conceito := 'B' else if Nota >= 50 then Conceito := 'C' else if Nota >= 40 then Conceito := 'D' else Conceito := 'E';

Prtica 6.11 Watch em variveis booleanas Para variveis booleanas ou lgicas, podemos atribuir somente os valores False ou True, diretamente ou como resultado da avaliao de uma expresso lgica. Digite o programa abaixo e observe as variveis atravs da janela Watches do debugger.
var Passou, Terminou : boolean; Nota : byte; begin Terminou := False; Nota := 10; Passou := Nota > 5; Passou := Nota 9 > 5; Passou := Terminou; End.

Exerccio 6.12 Reviso de expresses lgicas Sobre expresses lgicas: a) Para que servem? Qual tipo de valor resulta de sua avaliao? b) Quais podem ser os operandos de expresses lgicas? c) Descreva os operadores and e or. D exemplos de sua utilizao em expresses lgicas compostas. d) O que melhor do que a precedncia de operadores para estabelecer a seqncia de operaes? Exerccio 6.13 Expresses lgicas invlidas Marque com um X as expresses lgicas invlidas (N do tipo real):

114

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

a) N <= 10 b) N >< 0 c) N = 3.1415 d) N => -1 e) 0 =< N <= 9 Exerccio 6.14 Elaborando expresses lgicas Fornea expresses lgicas em PASCAL, utilizando variveis, constantes e operadores de comparao apropriados, que possam ser usadas para verificar as condies abaixo. Modelo: Idade de uma pessoa a mesma que a de outra pessoa Resp: Idade1 = Idade2 a) Pessoa maior de idade (mais que 17 anos) b) Aluno passou em uma disciplina (nota mnima 7). c) Mdia aritmtica das notas de 3 disciplinas superior a 7,5. d) A opo digitada 'A', 'I' ou 'E' (alterar, incluir, excluir) e) Uma temperatura est no intervalo de 0 a 100 f) Um nmero est nos intervalos de 0 a 10 ou 20 a 30 Pesquisa 6.15 Operador not Descubra para que serve o operador lgico not e fornea dois exemplos de sua utilizao. Exerccio 6.16 - Avalie Com base na pesquisa acima e supondo que A = True, e B = C = False, avalie: a) A and not B or C b) (A and not C) or (not A and C) c) A = False and (C or not B) d) A or B or C e) A and (B or C) f) not A or not B Pesquisa 6.17 - Ordem de execuo das operaes Em uma expresso lgica podem aparecer diversos tipos de operadores, lgicos e aritmticos; em que ordem so executadas as operaes? Quando no houver parnteses que determinem uma seqncia de execuo, o compilador aplica as regras de precedncia. Pesquise qual essa precedncia e preencha a tabela abaixo: PRECEDNCIA
1 2 3 4 5 6

OPERADORES

7 - ALTERNATIVAS E DECISO

115

Sugesto: use parnteses para definir a ordem de execuo das operaes e durma tranqilo. Prtica 6.18 Equao do segundo grau O programa abaixo, embora sintaticamente correto, no funciona corretamente. Corrija-o e teste-o para equaes com delta positivo, negativo e zero. O que acontece quando o delta negativo? O que pode ser feito para evitar o problema? Faa uma nova verso do programa com a correo.
PROGRAM EqSegundoGrau; uses CRT; var a, b, c : integer; Delta, Raiz1, Raiz2 : real; begin ClrScr; Writeln('Clculo de razes da equao do segundo grau'); Writeln('Entre coeficientes inteiros a, b e c,'); Writeln('teclando Enter a cada um'); Readln(a); Readln(c); Readln(b); Delta := b*b - 4*a*c; Raiz1 := ( b + SqRt(Delta) )/2; Raiz2 := ( b - SqRt(Delta) )/2; Writeln('Primeira raiz ', Raiz1:0:2); Writeln('Segunda raiz ', Raiz2:0:2); end.

.6.2. Mltiplas alternativas: CASE


Prtica 6.19 Tipo de caractere Execute o programa abaixo com e sem o debugger, fornecendo como entrada uma letra, depois um dgito, um operador aritmtico e finalmente um outro (#, $, etc.).

116

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM TipoCaractere;
{L um caractere e informa se letra, dgito, operador aritmtico ou nenhum deles}

uses CRT; var Ch : char; begin ClrScr; GotoXY(10, 8); Writeln('Entre um caractere qualquer: '); Readln(Ch); case Ch of 'A'..'Z', 'a'..'z' : begin GotoXY(10,10); Writeln('Letra'); end; '0'..'9' : begin GotoXY(10,10); Writeln('Dgito'); end; '+', '-', '*', '/' : begin GotoXY(10,10); Writeln('Operador'); end; else begin GotoXY(10,10); Writeln('Caractere especial'); end; end; Writeln('Pressione qualquer tecla'); ReadKey end.

Case Considere um trecho de programa que deve oferecer um menu de opes na tela. Se o usurio digitar 1, o programa faz algo; se 2, outra coisa, e assim por diante. Com base na opo do usurio, o programa deve decidir o que fazer. Mas agora no so meramente dois caminhos; podem ser 3, 7 ou dez alternativas. Para esses casos, ao invs de usar o comando if, melhor usar o comando case, que tem o seguinte formato: case <expresso> of <caso 1> : <comando 1>; <caso 2> : <comando 2>; <caso 3> : begin <comando 4>; <comando 5> end; ... else <comando 6> end; Em cada caso, voc pode por uma constante (1, 'A'), vrias constantes separadas por vrgulas ('A', 'B') ou subfaixas: 'a'..'z', 0..10; no pode por expresses ou variveis. Os valores em cada caso devem ser compatveis com o tipo da expresso, que no pode ser real nem string. Se houver mais de um comando em um caso, ele deve ter o seu prprio par begin..end.

7 - ALTERNATIVAS E DECISO

117

Quando um comando case executado, o valor da expresso avaliado. Se seu valor for igual ao caso 1, executado o comando 1; se igual ao caso 2, executado o comando 2, etc. Se no houver igualdade, executado o comando aps o else. Este opcional. Se mais de um comando precisa ser executado em algum caso, voc deve usar o comando composto begin..end, um para cada caso e tambm um par para o else. Mltiplas instrues if podem ficar melhor codificadas atravs de um comando case, quando o tipo da expresso lgica permitir. Exemplo 6.20 Calculadora A calculadora de Luciana pifou, justo quando ela precisa fazer vrios clculos. Ela tem um computador, mas no sabe que um dos acessrios do Windows uma calculadora. Sendo estudante de Pascal, Luciana resolveu fazer um programa. A especificao que bolou prev que programa l dois nmeros inteiros (o que atende suas necessidades) e em seguida um caractere. Se este for '+', o programa soma os nmeros, se '', subtrai, se '*', multiplica e se '/', divide. Se o caractere for diferentes desses, mostrada uma mensagem de erro. O programa, antes de dividir, critica se o divisor zero e mostra uma mensagem, se for. Implemente a especificao de Luciana. Como se parece a tela de sada do programa? Vamos execut-lo algumas vezes para vrias possibilidades:
Entre dois nmeros inteiros: 40 34 Entre operao (+, -, * ou /): + 40 + 34 = 74 Entre dois nmeros inteiros: 50 45 Entre operao (+, -, * ou /): X Erro: operao invlida Entre dois nmeros inteiros: 32 0 Entre operao (+, -, * ou /): / Erro: divisor invlido

O prximo passo identificar as variveis. Para a entrada precisamos de duas variveis inteiras para armazenar os nmeros e uma do tipo char para armazenar a operao. Para a sada no precisaremos de variveis, j que podemos calcular e mostrar o resultado diretamente na tela. Observando a tela de sada, verificamos que o programa est estruturado da seguinte forma:
"Ler nmeros" "Ler operao" "Decidir qual operao ser efetuada e mostrar o resultado na tela ou uma mensagem de erro"

Veja o programa a seguir. Como exerccio, execute-o manualmente para as entradas usadas no detalhamento da tela e verifique se a tela de sada produzida est correta.

118

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM Calc4Operacoes; {L dois nmeros reais e uma operao, e efetua a operao indicada} uses CRT; var N1, N2 :integer; Op : char; begin ClrScr; Writeln('Entre dois nmeros inteiros:'); Readln(N1, N2); Writeln('Entre operao (+, -, * ou /):'); Readln(Op); case Op of '+' : Writeln(N1, ' + ', N2, ' = ', N1 + N2); '-' : Writeln(N1, ' - ', N2, ' = ', N1 - N2); '*' : Writeln(N1, ' x ', N2, ' = ', N1 * N2); '/' : if N2 <> 0 then Writeln(N1, ' / ', N2, ' = ', N1 / N2) else Writeln('Erro: divisor invlido') else Writeln('Erro: operao invlida'); end; ReadKey; end.

Prtica 6.21 CalcOperacoes Teste o programa CalcOperacoes nas seguintes situaes: a) Adio b) Subtrao c) Multiplicao d) Diviso, divisor vlido e) Diviso, divisor invlido Ao projetar programas, preveja todas as situaes e alternativas, e ao testar programas com comandos de deciso, teste todos os caminhos possveis do fluxo de execuo. Prtica 6.22 Erros de compilao do case Verifique a mensagem de erro de compilao nas seguintes situaes: retire o case retire o of retire o Ch do case Ch of retire um dois-pontos de algum caso retire o end do case troque a expresso aps o case por uma varivel real qualquer idem, varivel tipo string

7 - ALTERNATIVAS E DECISO

119

Exerccio 6.23 - Tipos de expresses do Case Que tipos de expresses voc pode e quais no pode inserir como opes (casos) em um comando CASE? Prtica 6.24 Cdigos ASCII Altere o programa ExemploMenu abaixo para que a opo 1 seja ler um caractere e mostrar seu cdigo ASCII (funo Ord) e a opo 2 seja ler um cdigo ASCII e mostrar o respectivo caractere (funo Chr). Implemente o cdigo adequado para tratar as opes e teste o programa.
PROGRAM ExemploMenu; uses CRT; var Opcao : char; begin ClrScr; Writeln('1 Ao 1'); Writeln('2 Ao 2'); Writeln('3 Fim'); Write('Entre opo: '); Readln(Opcao); case Opcao of '1' : {Ao 1}; '2' : {Ao 2}; else begin Writeln("Opo invlida"); ReadKey end end; end.

.6.3. Reconhecendo decises


Comandos de deciso so necessrios quando h alternativas para o fluxo de execuo. como uma estrada: se no h encruzilhadas ou trevos, voc vai seguindo sem precisar decidir nada sobre o rumo a tomar, mas se h opes, uma deciso deve ser tomada. Dicas e perguntas para reconhecer a necessidade de um comando IF ou CASE, na especificao, no projeto ou na implementao: - A especificao normalmente contm indicaes: "se o nmero for invlido...", "um menu...". - Cada entrada de dados cria alternativas. Critic-las ou no pode depender da especificao. - H deciso neste programa? - Que verificaes e restries so pedidas na especificao ou necessrias neste programa? - Que valores invlidos podem ser digitados? - Que tipo de ocorrncia pode provocar um erro em tempo de execuo? - Posso usar o comando CASE? Se sim, qual o mais simples de usar, IF ou CASE? Qual deles organiza melhor o cdigo? Qual fica mais elegante?

120

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 6.25 CalculaConceito com case Altere o programa CalculaConceito, deste captulo, para escolher o conceito usando case, ao invs de if. Especificao 6.26 - Maior de 2 Elaborar programa que l dois nmeros quaisquer e mostra na tela uma mensagem indicando qual o maior, ou se so iguais. Especificao 6.27 - Maior de 3 Faa um programa que l trs nmeros diferentes e mostra na tela uma mensagem indicando qual o maior. Especificao 6.28 - Diviso Escrever um programa que l dois nmeros e efetua uma diviso, mas somente se o divisor for diferente de zero; quando isto ocorrer, mostrada uma mensagem de erro apropriada. Especificao 6.29 - Categoria de altura Elaborar programa que l uma altura e mostra uma mensagem conforme a faixa de altura: menos que 1,60 de 1,60 a 1,85 mais que 1,85 baixinho altura normal faz frio a em cima?

Especificao 6.30 - Aprovao Elaborar programa que l uma disciplina e respectiva nota final, mltipla de 0,5, e informa o que ocorreu. Se a nota for de 5 a 10, aprovado; se 4 ou 4,5, segunda poca e, caso contrrio, reprovado. Especificao 6.31 - Aprovao v2 Altere o programa acima para que, se a nota estiver fora da faixa vlida ou se no for mltipla de 0,5, seja emitida uma mensagem de erro. Especificao 6.32 - Aprovao v3 Altere o programa acima para que leia tambm a quantidade de aulas ministradas e a quantidade de faltas do aluno. Se o aluno no obteve 75% de freqncia, ele est reprovado, independentemente da nota. Especificao 6.33 - Dia da semana Construa um programa que l um nmero de 1 a 7 e informa o dia da semana correspondente, sendo domingo o dia de nmero 1. Se o nmero no corresponder a um dia da semana, mostrada uma mensagem de erro. Especificao 6.34 - Quadrado ou tringulo Implemente um programa com 2 opes (letra ou nmero): desenhar um quadrado ou um tringulo na tela, em linha e coluna lidas pelo teclado. Elabore o quadrado e o tringulo como achar melhor. Faa o programa mostrar uma mensagem de erro se o usurio escolher uma opo invlida ou informar valor invlido para linha ou coluna.

7 - ALTERNATIVAS E DECISO

121

Especificao 6.35 - Conta telefnica Uma conta telefnica composta dos seguintes custos: assinatura: valor de impulsos: valor de interurbanos valor de chamadas p/ celular: R$0,09 por impulso Elabore um programa que l valor de interurbanos, quantidade total de impulsos normais e para celular, e calcula o valor da conta. Lembre-se de que o valor dos impulsos s cobrado para os impulsos excedentes. Especificao 6.36 - Imposto Um imposto calculado com base na seguinte tabela: At 1.200,00 de 1.201,00 a 2.500,00 de 2.501,00 a 5.000,00 acima de 5.000,00 isento 10% 15% 20%. R$ 17,90 R$ 0,04 por impulso que exceder a 90

Implemente um programa que leia o valor base e calcule o imposto a pagar. Especificao 6.37 - Mltipla escolha 1 Elaborar uma questo de mltipla escolha, de uma disciplina que esteja cursando ou um tema de interesse, com um enunciado e cinco alternativas, sendo uma correta ou incorreta. Escrever um programa que mostra a questo na tela, pede a resposta correta e informa ao usurio se este acertou ou errou. Antes de decidir qual questo usar, elabore pelo menos trs possibilidades. Especificao 6.38 - Mltipla escolha 2 Enriquea o programa acima da questo de mltipla escolha, incluindo uma outra questo de outro tema. No incio do programa, oferea ao usurio a escolha de qual questo quer responder. Especificao 6.39 - Salrio Um salrio tem os seguintes componentes: - valor nominal - adicional devido a horas extras - valor descontado para o INSS (10% do valor a receber, limitado a 150 reais). O valor adicional devido s horas extras calculado dividindo-se o valor nominal por 176 (22 dias de 8 horas), multiplicando-se pela quantidade de horas e ainda com um acrscimo de 50%. Escrever um programa que l os valores necessrios, calcula e mostra na tela os componentes do salrio e o salrio lquido resultante para o empregado. No preciso prever arredondamentos, mas os valores devem ser mostrados na tela com duas casas decimais. Exemplos: para um salrio de R$ 1.000,00, com 30 horas extras, teremos R$ 255,68 de horas extras [(1.000/176)*30*1,5], R$ 125,57 de INSS e um salrio lquido de R$ 1.130,11. Para um salrio de R$ 2.000,00 e 20 horas extras, seriam R$ 340,91 de horas extras, R$ 150,00 de INSS (e no os 10%), com um salrio lquido de R$ 2.190,91.

122

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 6.40 - Adivinhe 1 Faa um programa que sorteia um nmero de 1 a 5 e pede ao usurio que o adivinhe, lendo do teclado o palpite. Caso o usurio acerte ou no, mostrada uma mensagem apropriada. Especificao 6.41 - Adivinhe 2 Modifique o programa acima para que o usurio possa tentar novamente se errar na primeira vez. Especificao 6.42 - Nota musical Elaborar um programa que l uma freqncia em Hertz e uma durao em milissegundos e emite um som na freqncia com a durao. Limite a freqncia at 5.000 Hz e a durao a 2 segundos.

.6.4. Organizando o pensamento: rvores de deciso


Quando vrias decises tm que ser tomadas, pode ocorrer que no consigamos organizar mentalmente todas elas; nesses casos, uma tima ferramenta uma rvore de deciso, descrita no exemplo abaixo. Exemplo 6.43 rvore de deciso Um jogo consiste em se retirar duas bolas de uma caixa contendo bolas brancas e pretas. Dependendo da combinao de cores das bolas retiradas, o jogador ser pago na seguinte proporo:
Primeira Bola Branca Branca Preta Preta Segunda Bola Branca Preta Branca Preta Rateio 0 2/3 1 2

Ou seja, com duas bolas brancas o jogador perde tudo, com uma branca e uma preta recebe 2/3 do que apostou, com um preta e uma branca recebe seu dinheiro de volta e com duas pretas recebe o dobro. Elaborar um programa que l as cores das duas bolas e calcula o rateio. O passo principal do programa , a partir das cores das duas bolas (variveis Cor1, Cor2), deduzir o valor do rateio (varivel Rateio). Definimos que as cores sero representadas por 'P' ou 'B', conforme cada bola seja preta ou branca, respectivamente. Podemos escrever um if para cada linha da tabela acima, como:
if (Cor1 = 'B') and (Cor2 = 'B') then Rateio := 0 else if (Cor1 = 'B') and (Cor2 = 'P') Rateio := 2/3 {...}

Codificar expresses complexas dessa maneira pode ser trabalhoso e sujeito a erros. A forma de tratar gradualmente a soluo montar uma rvore de deciso, na qual organizamos as vrias possibilidades. Escrevemos a primeira deciso, com as opes Sim e No. Depois, para a opo Sim, escrevemos a prxima deciso e suas opes Sim e No. Assim vamos detalhando cada possibilidade, at que cada ramo tenha uma ao associada:

7 - ALTERNATIVAS E DECISO

123

Sim Sim Cor1 branca? No Cor2 branca? No Sim Cor2 branca? No

nada

2/3 1

Para converter para Pascal, basta traduzir a rvore em comandos if..then..else: cada pergunta resultar em um comando if; a cada 'sim' corresponde um then e cada 'no' estar associado a uma clusula else. Teremos o seguinte trecho de programa:
if Cor1 = 'B' then if Cor2 = 'B' then Rateio := 0 else Rateio := 2/3 else if Cor2 = 'B' then Rateio := 1 else Rateio := 2; {branca, branca} {branca, preta} {preta, branca} {preta, preta}

Exerccio 6.44 rvore para o TipoCaractere Elaborar uma rvore de deciso para o algoritmo do programa TipoCaractere, deste captulo Especificao 6.45 - Jogo de bolas Conforme a especificao do exemplo deste captulo, implemente um programa que l as cores das duas bolas e calcula o rateio. Especificao 6.46 - Jogo de bolas v2 Altere o programa anterior para que leia tambm o valor apostado, limitado a $100, e informe o valor a ser recebido pelo apostador. Especificao 6.47 - Jogo de bolas v3 Modifique o programa do jogo de retirada de bolas, de forma que o jogador retire trs bolas. Atribua valores de rateio para todas as combinaes de cores. Implemente um programa que l o valor apostado, sorteia as cores, calcula o rateio obtido pelo jogador e o valor que ele receber. Especificao 6.48 - Menor cadeia Escrever uma funo que recebe duas cadeias de caracteres e retorna a menor em ordem alfabtica.

.6.5. Atividades suplementares


Especificao 6.49 - Ano bissexto Um ano bissexto se for divisvel por 4 exceto os sculos, que so bissextos se forem mltiplos de 400. Escreva um programa que determina se um ano bissexto.

124

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 6.50 Cdigos estendidos de teclas Voc viu na pgina (programa MostraTecla) que a funo ReadKey retorna, para certas teclas, dois cdigos, sendo o primeiro Chr(0), para o qual no h cdigo correspondente. Faa um pequeno programa para mostrar cdigos ASCII de teclas: se o primeiro cdigo for diferente de zero, a tecla lida mostrada, caso contrrio o segundo cdigo lido e mostrado. Usando este programa, ache os cdigos estendidos das quatro teclas de direo (as setas, muito usadas em jogos). Especificao 6.51 - Meno Uma faculdade atribui menes aos alunos conforme a faixa de notas que tenha atingido: 9,0 a 10: 7,0 a 8,9: 5, 0 a 6,9: 3,0 a 4,9: 0,1 a 2,9: 0: SS (superior) MS (mdio superior) MM (mdio) MI (mdio inferior) II (inferior) SR (sem rendimento).

Faa um programa que l a nota e calcula a meno. [Dica: como o comando case no aceita expresses reais, a princpio voc deve usar if; mas voc ainda pode usar o case, se multiplicar por 10 todos os nmeros envolvidos] Pesquisa 6.52 Operadores aplicados a strings Investigue se operadores >, >=, etc. podem ser aplicados a variveis e constantes string. Faa um pequeno programa que demonstre isso. Especificao 6.53 - Imposto em cascata Um imposto calculado com base na seguinte tabela: At 1.200,00 de 1.201,00 a 2.500,00 de 2.501,00 a 5.000,00 acima de 5.000,00 isento 10% 15% 20%.

Implemente um programa que leia o valor base e calcule o imposto a pagar. A diferena agora que o imposto calculado em cascata, isto , de um salrio de 10.000, os primeiros 1.200 esto isentos, a faixa de 1.201 a 2500 paga 10% e assim por diante. Prtica 6.54 Pos: pesquisando em cadeias Se preciso verificar se uma cadeia est presente em outra, pode-se usar a funo Pos. Ela recebe a subcadeia a pesquisar e a cadeia onde ser pesquisada a subcadeia, retornando um valor do tipo byte indicando a primeira posio da cadeia (da esquerda para a direita) onde foi encontrada a subcadeia ou zero, se nada foi encontrado. Por exemplo, para testar se a varivel Nome possui um espao, escreva: if Pos(' ', S) > 0 then ... Uma das utilidades de Pos em validaes de entrada, como no exemplo abaixo. Elaborar um trecho de programa para criticar se o valor da varivel Op est correta. Os valores permitidos so '+',' '-',' *' e '/'.

7 - ALTERNATIVAS E DECISO

125

Soluo:
if Pos(Op, '+-/*') = 0 then Write('Operao invlida') else {...}

Elabore um programa para testar o trecho do exemplo acima. O programa efetua as operaes matemticas indicadas. Prtica 6.55 - Cadeias para nmeros: Val Como vimos, para o compilador um nmero diferente de uma cadeia. Eventualmente, em programas, precisamos converter um valor expresso como uma cadeia de caracteres em um tipo de dado numrico. Para isso usamos o procedimento Val, que recebe uma string contendo a cadeia que representa o nmero (como '-233.54'), uma varivel inteira ou real para receber o nmero convertido e uma outra varivel do tipo integer para receber um cdigo de erro, como em: Val(VarString, VarNumerica, PosErro); Se a string passada no for um nmero vlido (como '12,1,3' ou 'a2b2'), a varivel PosErro conter a posio onde o erro foi descoberto, caso contrrio ser zero. Uma situao til para usar Val quando se quer evitar que um programa pare quando lido um valor invlido para uma varivel numrica. Neste caso, pode-se ler o valor como string e convert-lo para nmero. a) Digite o programa a seguir.
PROGRAM VerificaData;
{l uma data no formato 'dd/mm/aaaa' e verifica se o dia est entre 1 e 31 e o ms est entre 1 e 12}

uses CRT; var Data : string[10]; Dia, Mes : byte; Erro : integer; begin Write('Entre data no formato dd/mm/aaaa: '); Readln(Data); Val(Copy(Data,1,2), Dia, Erro); {Converte dia para numrico} if Erro = 0 then begin Val(Copy(Data,4,2), Mes, Erro); {Converte ms para numrico} if Erro = 0 then begin if (Dia >= 1) and (Dia <= 31) then {verifica validade do dia e do ms} if (Mes >= 1) and (Mes <= 12) then Writeln('Data vlida') else Writeln('Ms invlido') else Writeln('Dia invlido') end else Writeln('Erro no ms') end else Writeln('Erro no dia'); end.

b) Teste o programa para as seguintes situaes:

126

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Data vlida Dia no numrico Ms no numrico Dia invlido Ms invlido Barras fora de posio

c) Altere o programa para que verifique tambm se h barras (/) na terceira e na sexta posies. Especificao 6.56 - Ateno Pesquise o que faz o procedimento Delete. Execute manualmente o programa abaixo e informe os valores assumidos pelas variveis S, P e N durante a execuo do programa. Na tabela de variveis, tachar um valor quando for substitudo por outro. Onde se l '999', troque pelos trs ltimos dgitos do seu nmero de matrcula. Depois digite o programa e verifique se acertou.
PROGRAM PraticaCaracteres; var S : string; I, P, N : byte; C : integer; begin S := 'Questao 1'; Insert(' ',S, Length(S)+1); S := S + '999'; for I := 2 to 5 do S[I] := Upcase(S[I]); Delete(S, Length(S)- 1, 2); P := Pos('1', S); if P > 0 then begin Val(Copy(S, P+2, 1), N, C); if (C = 0) and (N <> 0) then Delete(S, N, 1); end; end.

Prtica 6.57 - Nmeros para cadeias: Str O procedimento Str permite converter nmeros inteiros e reais em cadeias de caracteres (strings), inclusive formatando nmeros reais da mesma maneira que Writeln. Str recebe dois parmetros: o nmero ou uma varivel numrica e uma varivel string que recebe o valor convertido. Veja os exemplos: begin Str(2, S); Str(2.1, S); end. Faa um pequeno programa para testar o funcionamento da instruo Str (leia/calcule/mostre) e alimenteo com valores variados. {S conter '2'); {S conter ' 2.1000000000E+00'); 2.10');

Str(2.1:4:2:, S); {S conter '

127

.7 REPETIO

Todo programa realmente til precisa repetir uma ou mais instrues. Veja neste captulo as trs opes do Turbo Pascal para repetio controlada de um bloco de comandos. O Turbo Pascal possui trs opes de comandos de repetio: while..do: quantidade indefinida de vezes. repeat..until: quantidade indefinida de vezes, executa pelo menos uma vez. for..do: quantidade definida de vezes. Veremos o while primeiro. Ele serve para todas as situaes, os outros so maneiras melhores para situaes particulares.

.7.1. While
Prtica 7.1 Primeiro contato a) Digite o programa abaixo, que semelhante ao do captulo anterior acrescido de um comando de repetio.
PROGRAM CalculaRaiz; {repetidamente calcula raiz quadrada, terminando quando lido zero} uses CRT; var Num : real; begin ClrScr; Writeln('Clculo de raiz quadrada'); Num := 1; while Num <> 0 do begin Write('Digite o nmero: '); Readln(Num); if Num >= 0 then Writeln('A raiz de ', Num:0:2, ' ', SqRt(Num):0:2 ) else Writeln('Nmero invlido'); end; end.

a) Execute o programa para os nmeros 2, -1 e 0 para terminar. b) Repita o passo anterior, desta vez usando o debugger.

128

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 7.2 Segundo contato Digite o programa abaixo e execute-o sem e com o debugger, para algumas entradas. Se necessrio, veja algumas explicaes sobre o algoritmo a seguir.
PROGRAM ObtemPrenome; {L um nome completo e mostra na tela o prenome, isto , o primeiro nome. Assume que o nome nunca comea com um espao} uses CRT; var Nome : string[30]; Ap : byte; begin ClrScr; Writeln('Entre um nome completo:'); Readln(Nome); Ap := 1; {procura posio do primeiro espao} while (Nome[Ap] <> ' ') and (Ap < Length(Nome)) do Ap := Ap + 1; {obtm subcadeia do primeiro caractere at a posio encontrada e mostra-a na tela} Writeln('O prenome: ', Copy(Nome, 1, Ap - 1)); end.

O primeiro nome formado pelas primeiras letras do nome, at o primeiro espao. Uma varivel armazenar o nome lido. Para localizar a posio do primeiro espao do nome, usando um apontador (inteiro). Iniciando em 1, variamos o apontador at a posio do primeiro espao, atravs de um comando while. Sabendo onde o espao est, usamos a funo Copy para obter os caracteres do nome at o espao (sem inclu-lo). Observe que o apontador Ap foi limitado tambm pelo tamanho mximo do nome, para o caso em que no houver sobrenome. While O while (enquanto) o comando de controle de repetio que serve para qualquer situao. Sintaxe: while <expresso lgica> do begin <comandos>; end; O comando funciona assim: quando no fluxo de execuo encontrado um while, a <expresso lgica> avaliada; se for verdadeira, os <comandos> aps o do so executados e o fluxo retorna para reavaliar a expresso lgica; se for falsa, executado o que estiver aps o end. Ou seja, enquanto a expresso lgica for verdadeira, os comandos internos vo ser repetidos. Na expresso lgica que vem depois do while pode-se usar os mesmos operadores descritos para o comando if: =, <, <=, >, >= e <>, alm dos conectivos lgicos and, or e not e do operador in. Prtica 7.3 Entrada no While Para que um comando While seja executado, na primeira vez a expresso lgica deve ser verdadeira, e por isto que no programa CalculaRaiz acima foi atribudo um valor diferente de zero. Retire a atribuio N := 1 e veja o que acontece.

8 - REPETIO

129

Exerccio 7.4 Nmeros na tela Um programador deve programar o seguinte trecho de especificao: "...mostrar na tela os nmeros inteiros de 1 a 10". Identifique qual das opes abaixo atendem especificao:
a) N := 1; while N <= 10 do begin

Write(N); N := N + 1 end;
a) N := 0; while N < 10 do begin N := N + 1 Write(N, ' '); end; a) N := 1; while N < 10 do begin Write(N, ' '); N := N + 1 end; a) N := 1; while N <= 10 do Write(N, ' ');

Prtica 7.5 Insira while Ao usar o programa EqSegundoGrau, abaixo, o usurio deve reexecut-lo para cada equao. Inclua um comando while para que o programa volte para novo clculo sempre que algum coeficiente seja diferente de zero, ou seja, o programa termina quando todos os valores lidos forem zero. Para isso, faa o seguinte: a) Determine as instrues que sero repetidas. b) Determine a expresso lgica do while. Considere a primeira que achar que , depois voc vai verific-la. c) Escreva o while, o begin e o end e faa uma verificao manual. Se achar que est em ordem, teste o programa para alguns clculos.

130

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM EqSegundoGrau; uses CRT; var a, b, c : integer; Delta, Raiz1, Raiz2 : real; begin ClrScr; Writeln('Clculo de razes da equao do segundo grau'); Writeln('Entre coeficientes inteiros a, b e c,'); Readln(a, b, c); Delta := b*b - 4*a*c; Raiz1 := ( -b + SqRt(Delta) )/2*a; Raiz2 := ( -b - SqRt(Delta) )/2*a; Writeln('Primeira raiz ', Raiz1:0:2); Writeln('Segunda raiz ', Raiz2:0:2); end.

.7.2. Repeat
Prtica 7.6 Conhecendo o REPEAT Digite o programa abaixo sem e com o debugger, observando o retorno do fluxo de execuo e a sada do ciclo.
PROGRAM RaizQuadradaComRepeat; {repetidamente calcula raiz quadrada, terminando quando lido zero} uses CRT; var Num : real; begin ClrScr; Writeln('Clculo de raiz quadrada'); repeat Write('Digite o nmero: '); Readln(Num); if Num > 0 then Writeln('A raiz de ', Num:0:2, ' ', SqRt(Num):0:2 ) else Writeln('Nmero invlido'); until N = 0; end.

Prtica 7.7 Erros de compilao do repeat Erros s vezes difceis de descobrir esto relacionados s palavras reservadas. Experimente compilar o programa acima nas seguintes situaes: a) Escreva errado o repeat b) sem o repeat c) sem o until d) sem a expresso lgica do until e) troque until por at f) coloque o until antes do else

8 - REPETIO

131

Prtica 7.8 Ponto-e-vrgula e REPEAT Verifique: a) Se faz diferena por um ponto-e-vrgula aps o repeat. b) Se o ponto-e-vrgula antes de until opcional. Repeat A diferena do comando repeat para o while que no primeiro as instrues internas sero executadas pelo menos uma vez. O comando repeat tem a forma repeat <comando 1>; <comando 2>; ... until <expresso lgica>; Quando encontrado um comando repeat, so executados os comandos at o until. A expresso lgica deste ento avaliada; se for falsa, o fluxo de execuo retorna para a instruo aps o repeat; se for verdadeira, o comando de repetio encerrado e executada a instruo aps o until, se houver alguma. Aspectos a destacar no comando repeat: - as instrues internas ao comando so executadas pelo menos uma vez; - a deciso de repetir ou parar tomada aps a execuo das instrues dentro do comando; - o comando encerrado quando a expresso for verdadeira; - no preciso inserir o comando composto begin..end quando houver mais de uma instruo a repetir. Prtica 7.9 Mais REPEAT Altere o programa abaixo para que somente calcule a diviso se o Numero2 for diferente de zero. Teste-o com nmeros variados, incluindo a condio de sada.
PROGRAM Aritmetica; {repetidamente l dois nmeros e calcula e mostra na tela sua soma, subtrao, multiplicao e Divisao} var Numero1, Numero2 : integer; begin repeat Write('Digite o primeiro nmero: '); Readln(Numero1); Write('Digite o segundo nmero: '); Readln(Numero2); if numero1 <> 0 then begin Writeln (Numero1+Numero2); Writeln (Numero1-Numero2); Writeln (Numero1* Numero2); Writeln (Numero1/Numero2) end until Numero1=0 end.

132

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 7.10 Melhorando para o usurio No programa Aritmtica acima, mesmo quando o usurio deseja encerrar o programa, obrigado a digitar um valor para o segundo nmero. Altere o programa para que ele no precise fazer isto.

.7.3. For
Quando sabemos a quantidade de repeties, seja uma constante, o valor de uma varivel ou um valor calculado, mais simples usar o comando FOR. A sintaxe deste comando inclui uma varivel de controle, que incrementada ou decrementada automaticamente, conforme usemos FOR..TO ou FOR..DOWNTO. Prtica 7.11 FOR..TO Digite e execute o programa abaixo, inicialmente sem o debugger, depois com ele. Ao executar o comando for, observe as variveis N, NumIni e NumFim na janela Watches. Se necessrio, confira as explicaes em seguida.
PROGRAM Numerador; {L o nmero inicial e o final e mostra na tela os nmeros inteiros do inicial at o final. Se o nmero final for menor que o inicial, mostrada uma mensagem de erro} uses CRT; var NumIni, NumFim, N : integer; begin ClrScr; Write('Entre nmeros inicial e final: '); Readln(NumIni, NumFim); if NumIni < NumFim then for N := NumIni to NumFim do Write(N, ' ') else Writeln('O nmero final deve ser maior que o inicial'); end.

Esclarecimentos: As variveis NumIni e NumFim armazenam os nmeros fornecidos pelo teclado. A instruo a repetir imprimir um nmero com um espao depois. Precisamos tambm de uma varivel que v de NumIni at NumFim. Como esta varivel varia de 1 em 1, e sabemos a quantidade de repeties (NumFim - NumIni + 1), podemos usar o comando for. O programa acima executado assim: a primeira ao executada a limpeza da tela; mostrada a mensagem que pede os nmeros; os nmeros so lidos e armazenados nas variveis NumIni e NumFim; suponha que foram digitados os valores 100 e 200; como o nmero inicial menor que o final, a expresso do if verdadeira e o fluxo de execuo segue para o comando aps o then; no incio da execuo do comando for, atribudo 100 varivel N; em seguida, o valor de N comparado com o contedo da varivel NumFim, que 200. Como menor, o fluxo de execuo segue para o comando aps o do;

8 - REPETIO

133

mostrado o valor de N, que 100, seguido do espao; a varivel de controle N incrementada de 1 unidade (automaticamente; no h instruo explcita para isso), passando a valer 101; novamente avaliado se N <= NumFim. Como N contm 101 e NumFim contm 200, novamente executado o Write; isto se repete (incrementa, mostra) at N = 201; como agora N maior do que o valor final, o comando aps o do no executado e o fluxo de execuo segue para a instruo aps o fim do comando for, que o fim do programa. FOR Neste comando de repetio escolhemos uma varivel de controle e informamos o seu valor inicial e seu valor final. O compilador se incumbe de atualizar o valor da varivel de controle (de 1 em 1 ou de -1 em -1) a cada iterao, e compara seu valor com o valor final indicado. Tipicamente este comando ser usado quando soubermos a quantidade de iteraes (constante ou uma varivel) ou ela puder ser calculada. A sintaxe: for <varivel> := <valor inicial> to {ou downto} <valor final> do begin <comando 1>; <comando 2>; ... end; A varivel do for (varivel de controle) deve ter sido declarada e normalmente de um tipo inteiro (h outras possibilidades, que no nos interessam aqui). No caso de ser usado to, quando um comando for encontrado no fluxo de execuo: - varivel de controle atribudo o resultado da expresso correspondente ao valor inicial e seu valor comparado com o resultado da avaliao da expresso que indica o valor final; - se o valor inicial menor ou igual ao valor final, as instrues aps o do so executadas, e automaticamente a varivel de controle incrementada de uma unidade, e novamente o valor da varivel comparado com o valor final. - se o valor inicial maior que o valor final, nenhuma instruo aps o do executada, e o fluxo segue para a prxima instruo. - se houver s um comando aps o do, no necessrio o par begin..end. Exemplos:
for GrauCelsius := 0 to 100 do Write (GrauCelsius, ' '); for I := Num to Num*4 do X := X + Y; for X := -10 to 10 do begin Writeln(X); Writeln end;

Quando usado downto, as diferenas so: o valor final deve ser menor que o inicial, a varivel de controle decrementada de uma unidade, e o teste verifica se o valor da varivel menor que o valor final.

134

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 7.12 FOR..DOWNTO Execute o pequeno programa abaixo e verifique com o debugger como funciona o comando for com downto. A tela produzida pelo programa esta:
10 9 8 7 6 5 4 3 2 1

PROGRAM ContaDe10Ate1; {Mostra os nmeros inteiros de 10 at 1} uses CRT; var N : byte; begin ClrScr; for N := 10 downto 1 do Write(N, ' ') end.

Uso do FOR Quando usamos for? Este ser til quando soubermos, no momento da programao, quantas vezes o trecho ir se repetir, seja se for um nmero constante de vezes, ou a quantidade de iteraes estiver disponvel em uma varivel, e tambm a varivel de controle varia de 1 unidade de cada vez. Esse o caso do programa do numerador: antecipadamente sabemos que a instruo Write ser executada (NumFim - NumIni + 1) vezes e, apesar de podermos usar qualquer um dos comandos de repetio, o for mais apropriado. O comando for resulta em instrues mais simples e deve ser usado sempre que a quantidade de iteraes for conhecida e a varivel de controle variar de 1 em 1. Neste comando, em outras linguagens, permitido indicar o passo (variao da varivel de controle). No Pascal padro o passo ser sempre 1 ou -1; se diferente, voc dever usar outro comando de repetio. Prtica 7.13 Preenchendo a tela Execute o programa abaixo, observando os valores das variveis de controle dos comandos for. Para agilizar a execuo em algum ponto, voc pode usar o comando F4 do debugger (go to cursor): posicione o cursor e tecle F4 e o debugger executar o programa at parar na linha do cursor.

8 - REPETIO

135

PROGRAM PreencheTela; {Preenche 24 linhas da tela com um caractere lido, enquanto emite sons com freqncia crescente de 1 em 1, a partir de 100 e uma durao de 20 milissegundos. No execute se houver algum dormindo, insuportvel...} uses CRT; const Tempo = 20; var Ch : char; Freq : word; L, C : byte; begin ClrScr; Writeln('Entre um caractere:'); Readln(Ch); ClrScr; Freq := 100; for L := 1 to 24 do for C := 1 to 80 do begin GotoXY(C,L); Write(Ch); Sound(Freq); Delay(Tempo); NoSound; Freq := Freq + 1; end; ReadKey; end.

Explicaes: para este programa precisamos de dois comandos de repetio, uma para apontar cada linha e outra para cada coluna. Para cada linha percorremos todas as colunas. Como sabemos quantas iteraes ocorrero (24x80), usamos dois comandos for. A cada vez que mostramos um caractere na tela, tambm incrementamos a freqncia. Note que o comando for de dentro executado completamente para cada iterao do primeiro for. Prtica 7.14 - SeguindoFor Para o programa abaixo: a) Execut-lo manualmente e identificar o valor da varivel Atual aps a execuo. Depois, digitar, testar com o debugger e conferir sua execuo.
PROGRAM SeguindoFor; var Anterior, Atual, Seguinte, I : byte; begin Anterior := 1; Atual := 1; for I := 3 to 5 do begin Seguinte := Atual + Anterior; Anterior := Atual; Atual := Seguinte end end.

a) Reescrever o programa para usar repeat. b) Reescrever o programa para usar while.

136

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 7.15 Numerador com repetio Altere o programa Numerador de forma que fique repetindo a leitura e a numerao, s parando quando o usurio entrar com zeros. Prtica 7.16 Desenho com caracteres Elaborar um esquema da tela de sada para o seguinte programa. Depois, execute-o e confira:
PROGRAM CaracteresProgressivos; uses CRT; var N, I, J : integer; Ch : Char; begin ClrScr; Writeln('Entre nmero de linhas: '); Readln(N); Writeln('Entre caractere: '); Readln(Ch); I := 1; while I <= N do begin for J := 1 to I*2 do Write(Ch); Writeln; {move cursor para incio da prxima linha} I := I + 1 end end.

Prtica 7.17 Mais caracteres No mesmo programa, alterar a expresso I*2 por I, prever qual ser o resultado e confirmar, executando o programa. Prtica 7.18 - Convertendo cadeia para maisculas Identifique dentre os grupos de instrues abaixo quais efetivamente convertem a cadeia S para maisculas (na prpria ou em outra varivel). Teste cada opo no Turbo Pascal.
a) for Ap := 1 to Length(S) do S[Ap] := Upcase(S[Ap]); a) Smai := '' ; for Ap := 1 to Length(S) do Smai := Smai + Upcase(S[Ap]); a) S := Smai; for Ap := Length(S) downto 1 do S[Ap] := Upcase(S[Ap]);

.7.4. Casos freqentes e problemas com comandos de repetio


Pausas - Se voc quiser fazer o programa esperar o usurio pressionar uma tecla antes de continuar, pode usar a funo KeyPressed (da unit CRT), que retorna True se uma tecla foi acionada e False caso contrrio. Com esta funo, podemos escrever
repeat until KeyPressed;

ou

8 - REPETIO

137

while not KeyPressed do;

A funo KeyPressed apenas consulta o buffer do teclado; o cdigo da tecla digitada continua l. Se tiver que ler posteriormente do teclado e no precisar da tecla, limpe o buffer com a instruo ReadKey. "Loops" - Voc pode observar que, no comando acima, se nenhuma tecla for pressionada, o comando nunca terminar, exceto se o computador for desligado ou houver uma condio de erro. Isso sempre ocorrer quando a condio de terminao nunca for atingida (dizemos que o programa entrou em loop). Observe o seguinte trecho de programa:
X := 1; repeat Writeln(X); X := X + 2 until X = 100;

A varivel de controle X ser sempre mpar; consequentemente, a expresso lgica do until nunca ser verdadeira e o comando no terminar normalmente. Isso pode ocorrer tambm quando a varivel de controle no alterada dentro do comando de repetio, como no caso abaixo:
X := 1; while X <= 100 do Write (X, ' ');

Outro erro de conseqncias por vezes desagradveis esquecer o par begin..end. Suponha que o programador, ao corrigir o erro acima, faa assim:
X := 1; while X <= 100 do Write (X, ' '); X := X + 1;

O desavisado programador, iludido pelas aparncias, acha que corrigiu o problema, mas nada mudar: o incremento do X est fora do comando de repetio e jamais ser executado. Esteja atento condio de terminao e sempre verifique manualmente o cdigo antes de execut-lo. Se seu programa entrar em loop, tecle Ctrl-Break para interromper sua execuo. Impedindo entradas erradas - Uma outra aplicao de comandos de repetio quando voc quer ler um valor e s continuar o programa aps o valor lido estar correto. Por exemplo, para ler um nmero na faixa de 1 a 6, voc pode escrever:
Repeat Write('Digite o nmero: '); Readln(Num) until (Num >= 1) and (Num <= 6);

Nesse caso bom prever uma mensagem de erro para o usurio, para ele no ficar sem saber o que fazer. Como voc faria isso? Blocos de controle - Comandos de repetio so muito usados para repetir a seo principal de um programa, permitindo o usurio usar o programa e s parar quando for informada uma condio de sada. No caso mais simples, j visto aqui, o programa executa apenas uma ao bsica. Esse o caso

138

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

do clculo do fatorial, para o qual uma estrutura de controle tpica seria:


repeat Readln(Numero); if Numero > 0 then begin {Calcular fatorial} {Mostrar fatorial} end until Numero = 0;

claro que uma estrutura while..do tambm pode ser usada (faa como exerccio). J se o programa implementa duas ou mais aes distintas, o usurio deve informar qual quer executar, e a estrutura tpica de controle um comando case:
PROGRAM ExemploMenuIncompleto; uses CRT; var Opcao : char; Begin ClrScr; repeat Writeln('1 Ao 1'); Writeln('2 Ao 2'); Writeln('3 Fim'); Write('Entre opo: '); Readln(Opcao); case Opcao of '1' : {Ao 1}; '2' : {Ao 2}; '3' : {fim} else begin Writeln("Opo invlida"); ReadKey end end; until Opcao = '3' end.

.7.5. Programando repeties


A elaborao de algoritmos contendo repetio de comandos envolve experincia anterior e respostas certas para perguntas adequadas. O "normal" fazer uma verso inicial e ir aperfeioando ou corrigindo. Quanto mais experincia voc tiver, mais rapidamente vai programar. Veja nesta seo algumas perguntas que voc pode fazer se precisar, divididas em dois blocos. O primeiro para repeties simples, como a de menus, e o segundo para algoritmos. Nem sempre ser preciso fazer todas, use-as quando achar necessrio. Independentemente da qualidade das perguntas, fazer a verificao manual antes da digitao pode lhe economizar muito tempo. Bloco 1: repeties simples H repetio? Quais os comandos que sero repetidos? Qual a condio de terminao (sada)? Bloco 2: algoritmos com repetio. Pode ser usado um comando de repetio?

8 - REPETIO

139

Quais so as variveis necessrias? Qual o passo intermedirio que, repetido, conduz obteno do resultado global da repetio? Como pode ser descrito em linguagem comum?. Quais so as variveis que se alteram a cada passagem? Quais so seus valores inicial e final? Qual a instruo que efetuar cada modificao (elabore uma tabela com essas informaes). Quantas vezes ocorrer a repetio? Qual a varivel ou expresso lgica de controle? Qual o valor inicial da expresso de controle? Valor final? H outras variveis candidatas? Qual o melhor comando de repetio a ser usado? A seqncia dos comandos que so repetidos est apropriada? Partindo-se das condies iniciais e executando-se a parte repetitiva, o resultado desejado obtido? O algoritmo funcionou como esperado? Se no, o que deve ser modificado? O que est passando ou faltando? Que situaes podem ocorrer em que o algoritmo falharia? Exemplo 7.19 Teste de nota Responda s perguntas de repetio para a seguinte especificao: Elaborar programa que l uma disciplina e respectiva nota (de 0 a 10, com uma casa decimal), e informa se o aluno passou na disciplina, repetindo o ciclo at que a nota lida seja zero. O aluno passa quando tira 7 ou mais. H repetio? Sim. O programa deve processar tantas notas quanto o usurio queira. Quais os comandos que sero repetidos? Ler a nota e a disciplina Verificar se o aluno passou. Mostrar o resultado na tela. Quantas vezes ocorrer a repetio ou, se no se sabe, qual a condio de terminao? Quantidade indefinida de vezes (o usurio que determina). Termina quando a nota lida for zero. Depois de obtidas essas respostas, basta decidir qual o comando de repetio a ser usado. Note que voc poderia ter feito um projeto e a partir deste obter as respostas. Exemplo 7.20 Mdia de idades Um professor, aps obter informaes de uma turma, deseja saber a mdia de idade. Escrever um programa que l as idades at que o idade lida seja zero, quando ento mostrada a mdia (o zero no considerado para a mdia). H repetio: uma quantidade indefinida de idades devem ser lidas. Para poder calcular a mdia temos que ter a soma das idades e a quantidade de idades. Assim, as instrues que sero repetidas so a leitura da idade, a atualizao de um contador e o clculo da soma total lida. A repetio deve terminar quando a idade for zero. Juntando tudo isso, a estrutura do programa :

140

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

"Atribua um valor qualquer Idade, diferente de zero" enquanto "a idade for diferente de zero" faa Leia a prxima idade Se a idade lida for diferente de zero, ento "Incremente o contador de pessoas" "some a idade lida ao total da idade" fim fim "Mostre a mdia, que a soma das idades dividida pela quantidade de pessoas".

Veja o programa completo:


PROGRAM MediaIdades; uses CRT; var Idade, Quant, SomaIdade : word; begin ClrScr; Writeln('Clculo de mdia de idades'); Idade := 999; while Idade <> 0 do begin Write('Digite a idade: '); Readln(Idade); if Idade <> 0 then begin Quant := Quant + 1; SomaIdade := SomaIdade + Idade; end; end; Writeln('A mdia das idades : ', SomaIdade/Quant:0:2); ReadKey; end.

Prtica 7.21 MediaIdades Calcule manualmente a mdia das idades 18 17 21 35 18 - 20. Depois teste o programa com os mesmos valores e confira. Exemplo 7.22 Srie Escrever programa para calcular, para N lido, o valor de S, dado por:

S=

Aps efetuar um clculo, o programa pede novo nmero, parando quando N for zero. Antes de trabalhar na repetio, vamos fazer um projeto. Uma tela de sada pode ser (aps fazer clculos manuais da srie):

1 2 3 N 1 N + + + ... + + N N 1 N 2 2 1

8 - REPETIO

141

Entre valor de N (inteiro): 3 S(3) = 4.33 Entre valor de N (inteiro): 5 S(5) = 8.70 Entre valor de N (inteiro): 0

Observando a especificao ou a tela, podemos identificar que ser necessrio declarar as variveis N, o nmero inteiro a ser lido e S, o valor da srie, que real. A estrutura geral do programa :
"Inicialize N com um valor diferente de zero" enquanto N <> 0 faa leia N se N > 0 ento "Calcule o valor da srie" "Mostre valor da srie na tela" fim fim.

O nico passo da segmentao acima que no pode ser diretamente implementado em Pascal "Calcule o valor da srie". Este pode ser segmentado informalmente em:
Repita N vezes "Calcule o valor de um termo da srie" "Acumule o valor do termo calculado" fim

Aqui podemos aplicar as perguntas sugeridas acima, j sabendo que h repetio. Quais so as variveis necessrias? O que varia a soma S, o numerador Numer e o denominador Denom. Qual o passo intermedirio? Calcular um fator, Numer/Denom, e som-lo em S. Quais so as variveis que se alteram a cada passagem, seus valores inicial e final e instrues que as modificam? A cada iterao, mudam o numerador (de 1 em 1), o denominador (de 1 em 1) e o prprio valor de S (Numer/Denom). Representando atravs de uma tabela:
Varivel Numer Denom S Val. Inicial 1 N 0 Val. Final N 1 S Instruo Numer := Numer + 1 Denom := Denom 1 S := S + Numer/Denom

Quantas vezes ocorrer a repetio? Teremos N iteraes, uma para cada fator da srie. Qual a varivel de controle? Podemos usar Numer, que varia de 1 a N. Qual o melhor comando de repetio? A quantidade de iteraes ou repeties ser N, portanto podemos usar o comando for. Com base nessas definies, podemos completar o algoritmo, representado em Pascal:

142

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

ALGORITMO CalculaSrie; Denom := N; S := 0; For Numer := 1 to N do begin S := S + Numer/Denom; Denom := Denom 1; end

Antes de completar o programa, vamos efetuar a verificao manual para N = 3. Montamos uma tabela de variveis e executamos o algoritmo instruo a instruo, atualizando a tabela a cada alterao no valor de uma varivel. Ao final, a tabela ficar assim:
Iterao incio Inicializao 1 2 3 N

S ? 0 0.333 1.333 4.333

Numer ? 1 2 3 4

Denom ? 3 2 1 0

A execuo produziu o resultado previsto no projeto (faa o mesmo para N = 5). Veja o programa completo:
PROGRAM CalculaS; {calcula o valor de uma srie matemtica} uses CRT; var N, Numer, Denom : integer; S : real; begin ClrScr; N := 999; while N <> 0 do begin Writeln('Entre valor de N:'); Readln(N); if N > 0 then begin S := 0; Denom := N; for Numer := 1 to N do begin S := S + Numer/Denom; Denom := Denom - 1; end; end; Writeln('S(', N, ') = ', S:10:2) end end.

Note que voc tem vrias alternativas para chegar a um algoritmo: a especificao, o projeto, segmentao, experincia anterior, tentativa-e-erro. Por onde voc passa no importa, se chegar a um resultado correto. Nunca se esquea: suas idias so seu principal recurso. No as mate impiedosamente!

8 - REPETIO

143

Exerccio 7.23 - Responda Para as especificaes abaixo, responder s perguntas de comandos de repetio: a) Escrever um programa que l dois nmeros inteiros, inicial e final, e mostra na tela os nmeros inteiros do inicial at o final. Critica: o nmero final deve ser maior do que o inicial. O programa repete isso enquanto os nmeros lidos forem diferentes de zero. b) Elabore um programa que l um nmero de 1 a 9 e mostra a tabuada de multiplicao do nmero. Por exemplo, para o 5: 5x1 =5 5 x 2 = 10 ... 5 x 10 = 50 Especificao 7.24 - Chateao Implementar um programa que fica repetindo a melodia do parabns (pg. 74) at que uma tecla seja pressionada. Execute-o sempre que quiser amolar algum! Exerccio 7.25 Fotossntese revisitada O programa da fotossntese (especificado na pg. 81) foi reescrito, de forma que o estudante possa avanar ou retroceder as pginas atravs de seta acima e seta abaixo. O programa termina quando avanar alm da ltima pgina ou quando teclado ESCAPE. Leia cada pergunta dos comandos de repetio e procure as respostas no programa abaixo. Faa o que for necessrio para chegar s respostas: executar o programa, fazer um diagrama de blocos e o que voc puder usar.
PROGRAM Fotossintese; {Apresentacao de texto sobre fotossintese, com titulo e tres paginas. Atencao: nao roda em Turbo Pascal for Windows} uses CRT; const {codigos ESCAPE = SetaAcima = SetaAbaixo = var PagAtual : byte; Tecla : char; ASCII (estendidos, exceto o 27) das teclas usadas no programa} #27; #72; #80;

144

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

begin ClrScr; GotoXY(34,12); Write('F O T O S S I N T E S E'); Readln; PagAtual := 1; repeat ClrScr; {mostra a pagina atual; algumas linhas foram separadas apenas para o fonte caber nas 80 colunas da tela e do papel} Case PagAtual of 1 : begin GotoXY(12,12); Write('A agua e os sais minerais absorvidos' + ' pelas raizes'); GotoXY(12,13); Write('sobem atraves dos vasos lenhosos do' + ' caule e chegam as folhas'); end; 2 : begin GotoXY(12,12); Write('Nas folhas, existe uma substancia verde,' + ' a clorofila,'); GotoXY(12,13); Write('que absorve a energia luminosa do Sol.' + ' Ao mesmo tempo,'); GotoXY(12,14); Write('por meio dos estomatos presentes nas' + ' folhas, a planta'); GotoXY(12,15); Write('absorve gas carbonico do ar.'); end; 3 : begin GotoXY(12,12); Write('Usando a energia solar, o gas carbonico' + ' e o hidrogenio'); GotoXY(12,13); Write('contido na agua retirada do solo,' + ' apos complicadas reacoes'); GotoXY(12,14); Write('quimicas, a planta produz acucares' + '(glicose)'); end; end; Tecla := ReadKey; {Algumas teclas (de controle) retornam dois caracteres, sendo o primeiro #0; testamos so o segundo. As setas tem dois} if Tecla = chr(0) then Tecla := ReadKey; Case Tecla of SetaAcima : if PagAtual > 1 then PagAtual := PagAtual - 1; SetaAbaixo : if PagAtual < 3 then PagAtual := PagAtual + 1; end; until Tecla = ESCAPE; end.

Especificao 7.26 - Nmeros inteiros 1 Escrever um programa que l dois nmeros inteiros, inicial e final, e mostra na tela os nmeros inteiros do inicial at o final. Critica: o nmero final deve ser maior do que o inicial. O programa repete isso enquanto os nmeros lidos forem diferentes de zero. Especificao 7.27 - Soma de pares Implemente um programa que calcula a soma dos nmeros pares compreendidos entre dois nmeros lidos. Especificao 7.28 - Aprovao Elaborar programa que l uma disciplina e respectiva nota (de 0 a 10, com uma casa decimal), e informa se o aluno passou na disciplina, repetindo o ciclo at que a nota lida seja zero. O aluno passa quando tira 7 ou mais.

8 - REPETIO

145

Especificao 7.29 - Maior Escrever um programa que l nmeros inteiros at que o nmero lido seja zero, quando ento mostrado o maior nmero lido. [Dica: declare uma varivel para registrar o maior lido at um momento, inicializando-a com o menor nmero possvel. Teste cada nmero lido com o maior e troque se for o caso] Especificao 7.30 - Maior e menor Alterar o programa anterior para que mostre tambm o menor nmero lido. Especificao 7.31 Nome em cantos Faa um programa que fica mostrando seu nome alternadamente nos quatro cantos da tela, at que uma tecla seja pressionada. Especificao 7.32 - Converso de temperatura 1 Escrever um programa que mostra uma tabela de graus Celsius/Fahrenheit entre duas temperaturas lidas do teclado, variando 1 grau de cada vez, uma temperatura por linha. Especificao 7.33 - Estatstica de notas Faa um programa que l uma quantidade qualquer de notas de 0 a 10 (no permitir fora desta faixa) e, ao final, mostra quantas notas foram digitadas, a mdia e tambm a quantidade com valor abaixo de 5. [Dica: mantenha variveis para a soma parcial das notas e a quantidade de notas, atualizadas a cada leitura. No final, divida a primeira pela segunda] Especificao 7.34 - Raiz quadrada com menu Faa um programa que repetidamente mostra na tela duas opes: "1 - Fim" e "2 - Calcular raiz" e l do teclado a opo desejada pelo usurio. Se a opo for 1, o programa termina. Se a opo for 2, o programa l um nmero real e, se o nmero for positivo ou zero, calcula e mostra sua raiz quadrada com duas casas decimais, se negativo, mostra uma mensagem de erro. E se a opo for invlida (nem 1 nem 2), mostrada uma mensagem apropriada. Quando a opo no a de terminar, o programa volta para mostrar novamente as opes e ler a opo do usurio. Especificao 7.35 Menu de conta telefnica Uma conta telefnica composta dos seguintes custos: assinatura: impulsos: valor dos interurbanos chamadas p/ celular: R$0,20 por impulso Implemente um programa com 4 opes principais: a primeira l valores de uma conta (valor de interurbanos, quantidade de impulsos normais e para celular), e calcula e mostra o valor da conta. A segunda informa a quantidade de contas lidas, o valor total e a mdia do valor das contas. A terceira mostra outras 2 opes (menu secundrio): mostrar ajuda para o programa (o que faz, como us-lo) e mostrar informaes do programador e do programa (nome do arquivo em disco, verso). A quarta finaliza o programa. Detalhes: os valores das assinaturas e preos de impulsos devero ser declarados como constantes. Para o menu, combinar os comandos repeat e case, e mostrar mensagem se for indicada uma opo invlida. No permitir valores negativos. No mostrar estatstica se nenhuma conta tiver sido informada. R$ 20,00 R$ 0,04 por impulso que exceder a 90

146

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 7.36 - Concatenao de caracteres Elabore um programa que l uma quantidade qualquer de nmeros de 32 a 254 e mostra na tela uma cadeia formada pela concatenao dos caracteres ASCII de cada nmero (lembre-se da funo Chr). Se um dos nmeros estiver fora de faixa, mostrada uma mensagem de erro e o programa espera a correo. O final da entrada de nmeros ocorre quando for lido zero. Especificao 7.37 - Criptografia Implementar um programa com duas opes: na primeira, ler e codificar uma cadeia com cdigos ASCII de 32 (espao) a 122 ('z') , da seguinte maneira: ao cdigo ASCII de cada caractere somado 1; os nmeros resultantes so convertidos novamente em caracteres e concatenados, sendo a cadeia resultante mostrada na tela. A segunda opo decodifica uma cadeia codificada pela primeira programa. Exemplo: a cadeia "fogo", codificada, se torna "gphp" (esse processo de codificao chamado de "criptografia"). Especificao 7.38 - Animao horizontal 1 Implementar um programa que simula um caractere se movendo pela tela ao longo de uma linha cujo valor lido do teclado, a partir e at colunas tambm lidas. O programa verifica se a coluna final informada maior do que o valor inicial. Especificao 7.39 - Animao horizontal 2 Alterar o programa anterior para que o movimento seja na vertical, isto , a coluna fica fixa e a linha varia. Especificao 7.40 - Tabuada Elabore um programa que l um nmero de 1 a 9 e mostra a tabuada de multiplicao do nmero. Por exemplo, para o 5: 5x1 =5 5 x 2 = 10 ... 5 x 10 = 50 Aps mostrar uma tabuada, o programa pergunta se o usurio deseja ver outra. Se a resposta for positiva (por exemplo, 'S'), ele faz tudo de novo, caso contrrio termina. Especificao 7.41 - Srie convergente A srie S =

1 1 1 + + + ... converge para 1. Demonstre isso atravs de um programa que calcula o valor 2 4 8

de S para N termos. Inclua uma repetio que faa o programa calcular e mostrar o valor da srie para 1, 2, 3 ...10 termos. Especificao 7.42 - Quantidade de caracteres Elaborar um programa que l uma cadeia e um caractere e informa a quantidade de ocorrncias do caractere na cadeia (no diferenciar minsculas/maisculas: 'a' = 'A'). Por exemplo, se a cadeia for "BANANA nanica" e o caractere for "a", o programa deve informar 5. Especificao 7.43 - Estatstica de frase 1 Elabore um programa que l uma cadeia de at 255 caracteres e informa: - quantidade de brancos

8 - REPETIO

147

- quantidade de palavras - quantidade de ocorrncias da letra 'A' Especificao 7.44 - Numerador Implemente um programa que mostre na tela os nmeros inteiros entre dois nmeros lidos do teclado, organizados em linhas com 10 nmeros: 21 31 22 32 23 33 24 34... 25 26 27 28 29 30

Especificao 7.45 - Caracteres progressivos Escrever um programa que produza a sada abaixo na tela, para N linhas e usando um caractere lido do teclado (no exemplo, *). Aps mostrar uma vez, o programa repete o processo, s parando quando N for zero. * ** *** **** ***** (...) Especificao 7.46 - Caracteres progressivos v2 Idem acima, para o formato abaixo. ** **** ****** ******** (...) Especificao 7.47 - Caracteres progressivos v3 Ibidem: (...) ***** *** * Especificao 7.48 - Tudo junto Faa um programa que junte os 3 exerccios acima. Ele repetidamente oferece um menu com a opo 0 para terminar e outras 3 opes 1, 2, 3 cada uma correspondendo a um tipo de figura, alm de uma opo para ler o caractere e a quantidade de linhas. Caso a opo indicada pelo usurio seja invlida, mostrada uma mensagem apropriada. Em todos os casos exceto 0 o menu oferecido novamente. Note que as opes de 1 a 3 no efetuam a leitura, somente o desenho; por isto, inclua uma verificao para que o desenho no seja feito se o caractere ou a quantidade de linhas no tiverem sido lidas.

148

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 7.49 - Nave espacial 1 Bolar um desenho de uma "nave espacial" em modo texto. Fazer um programa que inicia com a "nave" no centro da tela e move-a para a esquerda ou direita se tecladas as setas, terminando se teclado ESCAPE. A nave pra se for atingido algum limite da tela. Especificao 7.50 - Nave espacial 2 Alterar o programa acima para permitir o movimento tambm para cima e para baixo. Especificao 7.51 Menu variado Escreva um programa que repetidamente faz o seguinte, atravs de um menu: a) Ler do teclado uma cadeia de caracteres (digamos, S), cujo tamanho mximo declarado como uma constante. b) Restaurar o ltimo valor lido para S, se algum j foi lido (declare uma varivel para armazenar o valor e salve o valor lido nela). c) Mostrar o valor atual de S e seu tamanho. d) Trocar todos os espaos de S por hfens, informando a quantidade de substituies feitas. Somente aceitar esta opo se j tiver sido lida alguma cadeia. e) Terminar. Especificao 7.52 - Eleio Para computar o vencedor de uma eleio deve ser feito um programa. H 3 candidatos, e os votos dos eleitores foram codificados da seguinte forma: 1, 2 ou 3: votos para os respectivos candidatos 0: voto em branco 4: voto nulo 5: fim da digitao Escrever o programa, que deve fornecer o nmero do vencedor da eleio (suponha que no pode haver empates), as quantidades de votos brancos e nulos e o nmero de eleitores que compareceram s urnas. Especificao 7.53 - Dia da semana As questes abaixo se referem seguinte especificao: "Elaborar um programa que repetidamente l um nmero de 1 a 7 e informa o nome do dia da semana correspondente, sendo domingo o dia de nmero 1. A leitura do nmero tambm repetida enquanto o nmero estiver fora da faixa vlida; neste caso mostrada uma mensagem de erro. Aps mostrar o nome do dia, o programa pergunta se o usurio deseja ver outro dia da semana; se a resposta for 'S', os procedimentos especificados so repetidos, caso contrrio o programa termina. a) Elabore uma tela-exemplo para o programa, mostrando como a tela ficar quando o usurio informar um dia invlido, depois um dia vlido e em seguida uma resposta 'S'. b) Elabore uma rvore de deciso tendo como entrada um nmero de 1 a 7 e como resultado o respectivo nome do dia da semana.

c) Escreva um programa Turbo Pascal para a especificao descrita.

8 - REPETIO

149

.7.6. Atividades suplementares


Exerccio 7.54 - Reviso dos comandos de repetio Complete os espaos: a) for um comando de repetio apropriado para uma quantidade ___________________ de repeties e com deciso no __________. b) while um comando de repetio apropriado para uma quantidade _________________ de repeties e com deciso no __________. c) repeat um comando de repetio apropriado para uma quantidade ________________ de repeties e com deciso no __________. d) Em todos os comandos de repetio a deciso de parar o comando tomada com base na avaliao de uma __________________ ______________. Exerccio 7.55 - Reviso 2 Avalie as afirmaes abaixo e depois assinale a opo correta: I - O comando repeat termina quando a expresso aps o until avaliada como verdadeira. II - O comando while termina quando a expresso lgica avaliada como falsa. III - Em um comando for...to, se a expresso de incio for maior do que a expresso de fim, as instrues aps o do no sero executadas. IV - possvel que um comando de repetio nunca atinja a condio de terminao. a) As afirmativas I e II so verdadeiras. b) As afirmativas I, II e III so verdadeiras. c) Somente a afirmativa III falsa. d) Todas as afirmativas so verdadeiras. Prtica 7.56 Obtendo o prenome com Pos Altere o programa ObtemPrenome, do incio do captulo, de forma a usar Pos em lugar do while para achar a posio do primeiro espao. Especificao 7.57 - Cdigo ou caractere ASCII Implemente um programa que mostra na tela os caracteres imprimveis da tabela ASCII (comece do 32, espao). Especificao 7.58 - Adivinhe 1 Implemente um programa que sorteia um nmero de 1 a 10 e d ao usurio 3 tentativas de acert-lo. A cada tentativa errada, o programa informa se o nmero a adivinhar est abaixo ou acima. Use um comando de repetio para o controle. Especificao 7.59 - Adivinhe 2 Altere o programa acima para que ele permita ao usurio tentar at acertar.

150

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 7.60 Etiquetas Faa um programa que l trs linhas de uma etiqueta, a quantidade horizontal e a quantidade vertical e imprime a etiqueta repetindo-a na pgina impressa segundo as quantidades lidas. Especificao 7.61 - Linha reta Implemente um programa que d uma inclinao e desenha na tela, ponto a ponto, uma linha reta com a inclinao lida. Uma reta definida pela equao y = ax + b, onde a a inclinao. Especificao 7.62 - Desenho Faa um programa de desenho, cuja tela tem um cursor que se movimenta com as setas, deixando um "rastro" (algum caractere; se quiser sofisticar, ponha um hfen se o movimento for na horizontal e uma barra, se na vertical. Se quiser sofisticar mais ainda, use os caracteres de desenho de retngulos da tabela ASCII). Especificao 7.63 - Caixa automtico Um caixa automtico precisa calcular quais e quantas notas devem ser entregues ao cliente para efetuar a retirada desejada. Faa um programa com opes para: Receber notas de 10 e 50 (a quantidade inicial zero para ambas) Ler o valor da retirada e mostrar a quantidade de notas de 10 e de 50 a serem entregues. Se alguma das quantidades no for suficiente, o programa cancela a operao, com uma mensagem apropriada. [Dica para calcular as quantidades de notas: use os operadores div e mod] Apresentar relatrio com as quantidades de notas e valor total disponvel, e valor total de retiradas efetuadas.

151

.8 CRIAO DE INSTRUES E MODULARIZAO

As pessoas que vencem neste mundo so aquelas que procuram as circunstncias de que precisam e, quando no as encontram, as criam. Annimo

medida em que nossos programas vo se tornando maiores e mais complexos, a quantidade de detalhes pode se tornar intratvel, e o risco de haver erros maior. Alm disso, muitas vezes executamos um mesmo conjunto de instrues em dois ou mais pontos do programa. Seria timo se pudssemos programar em nvel mais alto do que as instrues das linguagens de programao, e tambm podermos reexecutar uma ao sem precisar reescrever as instrues que a implementam. Neste captulo veremos como podemos estruturar melhor nossos programas, criando novas instrues na forma de procedimentos e funes reutilizveis.

.8.1. Instrues criadas pelo programador


Suponha que voc conhece trs receitas de cozinha, sendo que todas usam um mesmo molho bolonhesa, e voc quer escrever estas receitas. Como voc faria: descreveria as instrues do molho em meio s instrues de cada receita (ou seja, 3 vezes)? Ou descreveria a receita do molho em separado, e ao descrever as outras receitas forneceria uma instruo do tipo faa o molho bolonhesa da pg. 2? A segunda alternativa certamente mais econmica: voc escreveria menos. Outra vantagem que, quando voc tiver uma idia brilhante para melhorar o molho, para registr-la voc far alteraes em apenas um lugar, ao invs de 3. Alm disso, uma pessoa que j conhea a receita do molho nem precisa ir pgina 2, e a descrio da receita fica mais simples. Esses princpios se aplicam programao. Suponha que voc deve escrever um programa que desenha 3 quadrados na tela, em locais variados do programa, e voc dispe de instrues que desenham um quadrado. Seria suficiente escrever 3 vezes a seqncia de instrues que desenha um quadrado. Porm essa redundncia cria alguns inconvenientes: O teste triplicado; Se alguma alterao for feita, ela ter que ser feita em 3 lugares; Se for necessrio desenhar o quadrado em outro programa, as respectivas instrues devero ser redigitadas e retestadas. Para evitar estes inconvenientes, o Pascal nos permite fazer o seguinte: Codificar as instrues que desenham o quadrado, como um bloco em separado; Atribuir um nome ao bloco de instrues;

152

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Executar as instrues e desenhando o quadrado escrevendo apenas o nome dado ao bloco, no ponto do programa desejado.

.8.2. Tipos e caractersticas de instrues


Para entender melhor a criao de instrues, bom revisar como elas podem ser. Por exemplo, observe a instruo abaixo:
Writeln('Numero = ', 1);

A instruo Writeln possui, alm de um nome nico para identific-la, uma finalidade bem definida e especfica, que apresentar dados na tela. Uma outra caracterstica que Writeln precisa receber dados para cumprir sua finalidade, os chamados dados de entrada. Devemos indicar o que queremos que aparea na tela. Acima, os parmetros 'Numero = ' e 1 so os dados de entrada. Mas no h informao alguma que se precise conhecer (internamente ao programa) aps a execuo da instruo, ou dados de sada. Cuidado para no confundir: a sada de Writeln na tela, mas essa instruo no retorna qualquer informao que v ser usada dentro do prprio programa. Associadas instruo Writeln h outras caractersticas no visveis para ns. Sendo uma instruo de alto nvel, tambm possui instrues em linguagem de mquina que a implementam. Essas instrues constituem um bloco de cdigo, que realizam sua finalidade. Alm disso, Writeln deve possuir variveis internas, necessrias para algum clculo intermedirio, como por exemplo, linha e coluna da tela. J a funo Sin(X) tem a finalidade de calcular o seno de um nmero real. Tem como dado de entrada o nmero, e como sada (resultado) o seno do nmero. Seu bloco de cdigo e suas variveis internas tambm ficam escondidas. Observe como o resultado aparece no programa: no lugar da chamada da funo.. A instruo Writeln um comando direto, imperativo, que representa uma ao a ser executada: chamado procedimento. A instruo Sin uma funo: retorna um valor como resultado de sua execuo, podendo portanto ser usada em expresses. Writeln e Sin so, respectivamente, procedimentopadro e funo-padro do Pascal, porque so predefinidas na linguagem. As instrues que podemos criar podem ter a forma de procedimento ou de funo. Suas estruturas so bem semelhantes, exceto que para uma funo devemos dizer o tipo de valor que ela retornar e em pelo menos um ponto do seu bloco de cdigo devemos atribuir um valor a ser retornado. De forma semelhante, ao criarmos instrues, estas tero: uma finalidade especfica um nome um tipo (procedimento ou funo) dados de entrada dados de sada um bloco de cdigo variveis internas

9 - CRIAO DE INSTRUES E MODULARIZAO

153

Assim como a execuo de um programa consiste em executar os comandos contidos no seu bloco de cdigo principal, a execuo de uma instruo criada pelo programador consiste na execuo dos comandos do seu bloco de cdigo. Uma grande vantagem de criar uma nova instruo esconder seu bloco de cdigo e suas variveis internas do resto do programa. Uma vez testada, podemos us-la como uma instruo qualquer da linguagem, conhecendo apenas seu nome e seus dados de entrada e sada, ou seja, sua interface. Assim, evitamos a repetio de instrues e, encapsulando os detalhes de implementao de cada uma, permitimos que possam ser implementadas e testadas uma de cada vez. Exerccio 8.1 Reconhecendo procedimento e funes Com relao s instrues do Turbo Pascal abaixo, marque com um P os procedimentos e com um F as funes (retornam um valor): ( ( ( ( ( ) ) ) ) ) ReadKey ClrScr Writeln WhereY Trunc

.8.3. Declarando procedimentos


Observe o programa a seguir.
PROGRAM QuadradoEmXY_v1; uses CRT; var Continua : char; L, C, I : byte; begin repeat ClrScr; Write('Digite a linha: '); Readln(L); Write('Digite a coluna: '); Readln(C); GotoXY(C, L); Write('XXXXX'); for I := 1 to 3 do begin GotoXY(C, L+I); Write('X X'); end; GotoXY(C, L+4); Write('XXXXX'); GotoXY(1, L+6); Write('Deseja ver outro quadrado?'); Continua := Upcase(Readkey) Until Continua = 'N'; end. GotoXY, Write; GotoXY, Write; GotoXY, Write;

...

Note que no programa ocorre vrias vezes a seqncia GotoXY/Write. Nestes casos, ao invs de ficar repetindo instrues vrias vezes, podemos declarar uma nova instruo que faa o que queremos. Basta ento chamar a instruo quando necessrio. Para o caso GotoXY/Write, podemos declarar um procedimento, j que apenas uma ao executada e nenhum valor produzido. Veja a estrutura de um procedimento no quadro. PROCEDURE uma palavra reservada que indica que voc est declarando um procedimento.

154

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Voc pode notar que, assim como o programa tem um bloco de cdigo, cada procedimento tambm tem o seu. O primeiro chamado principal para distingu-lo dos outros. A declarao do PROCEDURE procedimento deveNomeDoProcedimento(Var1 : tipo1; Var2 : tipo2...); vir antes do bloco de cdigo principal. {descrio da finalidade do procedimento}

Aqui voc declara as variveis locais: necessrias dentro do Uma vez declarado o procedimento, para que seja executado deve-se cham-lo, isto , escrever procedimento e que no seu nome no ponto adequado do programa, informando entre parnteses os valores a serem passados aos var so para receber dados ... parmetros. Estes podem ser constantes, variveis ou ainda expresses. Neste caso a expresso avaliada

antes da chamada; sempre chegam valores constantes ao procedimento.


begin

O padro GotoXY/Write voc timoos Aqui um coloca candidato a ser implementado por um procedimento. Veja a ... comandos que executam definio passo a passo: end;
o que foi especificado para o procedimento

Aqui voc declara o nome do procedimento e os parmetros: variveis que vo receber dados quando o procedimento for chamado

Finalidade do procedimento: mostrar um texto na tela em uma linha e uma coluna. Nome do procedimento: WriteXY. Dados necessrios: a coluna, a linha e o texto, declarados como parmetros. Comandos: GotoXY seguido de Write. Veja o procedimento completo e sua localizao dentro do programa:
PROGRAM {...} uses {...} PROCEDURE WriteXY (Col, Lin : byte; Texto : string); {mostra texto na tela na coluna e linha recebidas} begin GotoXY (Col, Lin); Write(Texto); end; var {...} begin {bloco de cdigo principal} {...} end.

Uma vez declarada a nova instruo, podemos substituir todas as chamadas a GotoXY/Write por uma chamada ao procedimento WriteXY, sendo que a cada chamada passamos valores diferentes conforme a necessidade. Assim, ao invs de escrevermos
begin ... GotoXY(C, L); Write(Texto); ... end.

escrevemos
begin ... WriteXY(C, L, Texto);

9 - CRIAO DE INSTRUES E MODULARIZAO

155

... end.

Na chamada de um procedimento com parmetros, estes devem ser obrigatoriamente fornecidos na chamada, na mesma seqncia de sua declarao, e os parmetros efetivos devem ser do mesmo tipo ou de um tipo compatvel com o parmetro formal correspondente. Tambm variveis e expresses podem ser usadas como parmetros efetivos. Se o argumento for uma varivel, seu valor buscado na memria para ser passado; se for uma expresso, esta primeiro avaliada e o valor resultante que passado ao procedimento. Sempre chegar ao parmetro um valor; por isso esse tipo de parmetro chamado parmetro por valor. Variveis locais podem ter o mesmo nome que variveis globais; neste caso estas no estaro visveis, isto , no podem ser referenciadas no bloco de cdigo do procedimento, enquanto este estiver ativo. Um procedimento pode ter tambm sees type e const. Veja no exemplo a seguir uma segunda verso do programa do quadrado, modificada para usar a nova instruo:

PROGRAM QuadradoEmXY_v2; {Desenha um quadrado usando procedimento} uses CRT; PROCEDURE WriteXY (Col, Lin : byte; Texto : string); {mostra texto na tela na coluna e linha recebidas} begin GotoXY (Col, Lin); Write(Texto); end; var L, C, I : byte; Continua : char; {variveis globais}

begin {bloco de cdigo principal} repeat ClrScr; Write('Digite a coluna: '); Readln(C); Write('Digite a linha: '); Readln(L); {desenha o quadrado} WriteXY(C, L, 'XXXXX'); {chamada do proced.} for I := 1 to 3 do WriteXY(C, L+I, 'X X'); WriteXY(C, L+4,'XXXXX'); WriteXY(1, L+6, 'Deseja ver outro quadrado?'); Continua := Upcase(Readkey) until Continua = 'N'; end.

Note no programa acima: A declarao do procedimento vem antes de sua chamada. O procedimento tem um nome, e esse nome usado para ativ-lo onde desejado.

156

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Os parmetros so declarados da mesma forma que variveis. Os parmetros efetivos (passados na chamada) podem ser constantes, variveis ou expresses, e devem estar na mesma ordem em que foram declarados. Todo procedimento tem seu prprio bloco de cdigo, que ser executado quando o procedimento for chamado. WriteXY independente de declaraes externas a ele prprio. Se voc quiser reutiliz-lo, basta copi-lo para o outro programa, e nem precisa test-lo novamente.

Prtica 8.2 Como funcionam procedimentos 1. Digite o programa QuadradoEmXY_v2. 2. Execute-o com o debugger at executar a primeira linha com WriteXY. Continue com F7 e veja como o fluxo de execuo desvia para as instrues do procedimento a cada vez que este chamado. 3. Novamente execute o programa com o debugger. Use alternadamente F7 e F8 quando for executada a chamada do procedimento WriteXY. Qual a diferena? Use F8 quando voc no quiser que o fluxo de execuo siga para dentro do bloco de cdigo do procedimento. Com F8 todos os comandos do procedimento so executados de uma vez. Prtica 8.3 - Passagem dos valores para o procedimento Execute mais uma vez o programa acima com o debugger, desta vez para observar as variveis. Insira na janela Watch as variveis L, C, Col, Lin e Texto. V executando o programa enquanto observa os seus valores. Note que o debugger s vai reconhecer os parmetros do procedimento enquanto este estiver ativo. Preste ateno em particular ao fato de que os parmetros assumem os valores passados a cada chamada. Se nesta houver uma varivel ou expresso, o valor buscado ou calculado antes da ativao do procedimento. Prtica 8.4 Erros na sintaxe de procedimentos No programa QuadradoemXY_v2, familiarize-se com alguns erros relacionados a procedimentos, introduzindo os erros abaixo, um de cada vez, e tentando compilar (registre o erro em cada caso): a) b) c) d) e) f) g) h) retire a palavra PROCEDURE substitua PROCEDURE por PROC retire o parntese inicial do cabealho do procedimento retire o parntese final do cabealho retire um ponto-e-vrgula do cabealho retire o begin do bloco de cdigo do procedimento idem, para o end retire o ponto-e-vrgula aps o end do procedimento.

Prtica 8.5 Go to cursor s vezes voc quer testar apenas um procedimento do programa; o debugger facilita isso. Posicione o cursor dentro do procedimento do programa acima e tecle F4 (Go to cursor). O programa ser executado de uma vez, at parar no cursor. Voc pode usar este recurso a qualquer momento em um teste com o debugger. Prtica 8.6 Da existncia dos parmetros Execute o programa QuadradoEmXY_v2 no debugger, monitorando os valores das variveis, e responda:

9 - CRIAO DE INSTRUES E MODULARIZAO

157

a) As variveis dos parmetros existem antes da sua ativao ("chamada")? Quando comeam a ser reconhecidos pelo depurador? b) Idem, depois da ativao? Porque?

Prtica 8.7 Mais erros Utilizando o mesmo programa acima, verifique e indique a mensagem de erro ocorrida ao tentar compillo nas seguintes situaes (aps cada uma, retorne sintaxe correta): a) retire de uma chamada do procedimento WriteXY algum parmetro (popularmente "esquecer de passar o parmetro"). b) retire da declarao do procedimento WriteXY algum parmetro.

Especificao 8.8 Quadrado com crtica Crie uma verso do programa do quadrado que impea valores de linha e coluna fora da faixa vlida e que repita tudo, s parando quando os valores de linha e coluna forem ambos zero. Exemplo 8.9 Quadrado com procedimento Podemos usar procedimentos para organizar melhor um programa. Que tal um procedimento para desenhar o quadrado? Primeiro, a finalidade: desenhar um quadrado com X na tela em uma linha e coluna especificadas. Depois, o nome: QuadradoXY. Dados necessrios: a linha e a coluna. Com essas informaes j podemos escrever o cabealho: PROCEDURE QuadradoXY(X, Y: byte); O bloco de cdigo deve conter as instrues necessrias para desenhar o quadrado, que so semelhantes s usadas acima. Execute o programa abaixo, j com o procedimento completo, usando o debugger e observando os valores dos parmetros e da varivel local.
PROGRAM QuadradoEmXY_v3; uses CRT; PROCEDURE WriteXY (Col, Lin : byte; Texto : string); {mostra texto na tela na coluna e linha recebidas} begin GotoXY (Col, Lin); Write(Texto); end; PROCEDURE QuadradoXY(C, L : byte); var I : byte;
{Mostra quadrado 5x5 feito com X em linha e coluna da tela}

{varivel local}

begin WriteXY(C, L, 'XXXXX'); for I := 1 to 3 do WriteXY(C, L+I, 'X X'); WriteXY(C, L+4,'XXXXX'); end; var L, C : byte; Continua : char;

158

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

begin repeat ClrScr; Write('Digite a coluna: '); Readln(C); Write('Digite a linha: '); Readln(L); QuadradoXY(C, L); WriteXY(1, L+6, 'Deseja ver outro quadrado?'); Continua := Upcase(Readkey) until Continua = 'N'; end.

Sobre procedimentos: Voc pode declarar quantos procedimentos quiser;

Procedimentos podem ter variveis internas (locais), que, como os parmetros, s existem enquanto o procedimento est ativo. Tambm podem ter suas prprias constantes e types. Um procedimento pode chamar outro procedimento; Procedimentos podem ter nomes de parmetros iguais aos de outros procedimentos ou a variveis globais; Veja como o programa principal acima ficou mais simples e como voc poder usar o procedimento do quadrado em outro programa rapidamente, sem necessidade de test-lo novamente. Prtica 8.10 Quadrado com qualquer caractere Altere o procedimento QuadradoXY para que desenhe o quadrado com qualquer caractere. Inclua o caractere como um parmetro tipo char, e na chamada passe o 'X'. Teste com pelo menos dois caracteres diferentes. Prtica 8.11 Brincando com sons a) Digite o programa SomVariavel, abaixo. Teste para vrias faixas de durao: pequena (5), mdia (20, 40) e longa (100, 300).
PROGRAM SomVariavel; {Emite sons de 100 a 8000 Hz, com durao em milissegundos lida e variao de 10 em 10%} uses CRT; var Dur, Freq : word; {durao e freqncia}

begin ClrScr; repeat Write ('Entre durao: '); Readln(Dur); Freq := 100; repeat Sound(Freq); Delay(Dur); NoSound; {incrementa em 10% a freqncia} Freq := Trunc(Freq * 1.1) until Freq > 8000; until Dur = 0; end.

9 - CRIAO DE INSTRUES E MODULARIZAO

159

b) Faa um procedimento que emite um som em uma freqncia e durao informadas como parmetros. O seu bloco de cdigo dever portanto conter as instrues Sound/Delay/NoSound. Faa uma nova verso do programa SomVariavel, trocando a chamada a essas instrues pela chamada ao novo procedimento. c) Agora crie um procedimento que recebe freqncias inicial e final e durao, e emita os sons da mesma forma que o programa SomVariavel. Na chamada, passe os mesmos valores atuais: 100, 8000 e a varivel da durao. O novo procedimento chama o anterior para emitir cada som. d) Finalmente, faa o programa ler do teclado tambm os valores das freqncias e passar as respectivas variveis como parmetros. Acrescente um IF para que o procedimento principal no seja chamado se a durao lida for zero.

.8.4. Parmetros por referncia


Os parmetros que vimos acima representam dados de entrada para os procedimentos. Qualquer que seja o parmetro efetivo passado na chamada (varivel, constante ou expresso), o procedimento receber um valor na chamada. possvel, entretanto, declararmos parmetros que sirvam tanto para entrada quanto para sada de dados (resultados). Para isso, inserimos na declarao, antes do identificador do parmetro, a palavra var. Se o parmetro precedido por var, dizemos que ele um parmetro por referncia. O argumento, ou parmetro efetivo, de um parmetro por referncia no pode ser um valor; obrigatoriamente dever ser uma varivel. No incio da execuo do procedimento, o valor desta varivel passado para o parmetro; ao final, o valor do parmetro atribudo varivel. Desta forma, temos um mecanismo em que o procedimento poder retornar dados e resultados que produza internamente. Note a diferena na declarao e na chamada:
PROCEDURE NomeProc (Param : byte); {Param de entrada}

Chamadas possveis:
NomeProc(3); NomeProc(N); NomeProc(N+5); PROCEDURE NomeProc (var Param : byte); {Param de entrada e sada}

Chamada possvel (sempre deve ser uma varivel):


NomeProc(N);

No programa a seguir, o procedimento possui trs parmetros por valor e dois por referncia. Vejamos como a execuo. Prtica 8.12 Parmetros por referncia Execute o programa abaixo com o debugger, observando os valores dos parmetros na janela Watches. Acompanhe o que acontece no roteiro a seguir.

160

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM EqSegundoGrau; var C1, C2, C3 : integer; R1, R2 : real; {coeficientes} {razes}

PROCEDURE EqSegGrau(a, b, c : integer; var Raiz1, Raiz2: real ); {Calcula razes da equao do segundo grau com coeficientes a, b e c } var Delta : real; begin Delta := b*b - 4*a*c; Raiz1 := (-b + SqRt(Delta) )/2*a; Raiz2 := (-b - SqRt(Delta) )/2*a; end; begin Write('Entre coeficiente inteiro a: '); Readln(C1); Write('Entre coeficiente inteiro b: '); Readln(C2); Write('Entre coeficiente inteiro c: '); Readln(C3); EqSegGrau(C1, C2, C3, R1, R2); Writeln('Primeira raiz ', R1:0:2); Writeln('Segunda raiz ', R2:0:2); end.

reservada memria para as variveis globais C1, C2, C3, R1 e R2 Aps os Writeln e Readln, executada a chamada ao procedimento EqSegGrau. Suponha que foram lidos do teclado os valores 1, 3 e 2 para as variveis C1, C2 e C3, respectivamente. O fluxo de execuo desviado para o procedimento EqSegGrau So criadas na memria variveis correspondentes aos parmetros a, b, c, Raiz1 e Raiz2 Os valores das variveis passadas como argumentos so recuperados da memria e atribudos aos parmetros, na mesma seqncia em que foram fornecidos. Aps, portanto, os valores das variveis sero: a=1 b=3 c=2 Raiz1 = ? Raiz2 = ? Note que, como as variveis R1 e R2 no foram inicializadas, no podemos ter certeza de seu valor, o mesmo ocorrendo com os parmetros correspondentes Raiz1 e Raiz2, que receberam os valores de R1 e R2. executado o bloco de cdigo do procedimento, aps o que temos: Raiz1 = -1 Raiz2 = -2 O valor do parmetro Raiz1 atribudo varivel R1, e o valor de Raiz2 atribudo a R2. Isto automtico atravs de instrues colocadas pelo compilador. As variveis dos parmetros so eliminadas, liberando a memria que usavam

9 - CRIAO DE INSTRUES E MODULARIZAO

161

O fluxo de execuo retorna para a instruo que segue a chamada ao procedimento, aparecendo na tela os valores de R1 e R2, respectivamente -1 e -2. Compare: se invertssemos na chamada os argumentos R1 e R2, como em
EqSegGrau(C1, C2, C3, R2, R1);

a primeira raiz a ser mostrada na tela seria -2. Voc deve ter percebido que, quando o procedimento ativado, estabelecida uma ligao da varivel que representa o parmetro efetivo (o da chamada) com o respectivo parmetro formal (o declarado). Na prtica, um mesmo endereo de memria referenciado atravs de dois nomes distintos: um nome para o programa principal, outro para o procedimento. Cada alterao efetuada no parmetro formal provocar uma alterao na varivel passada que, ao final do procedimento, ter o mesmo valor final que o parmetro formal correspondente. Exemplo 8.13 - Troca var Siga o programa abaixo, que executado assim: Aps as 2 primeiras instrues, temos X = 1 e Y = 99. A chamada ao procedimento TrocaVar com os parmetros X e Y criar uma relao de V1 para X e de V2 para Y. O procedimento TrocaVar inicia ento com V1 = 1 e V2 = 99. A execuo das instrues do procedimento faz Aux = 1, V1 = 99 e finalmente V2 = 1. Ao trmino da execuo do procedimento, as variveis X e Y contm os valores de V1 e V2, respectivamente. Assim, a instruo Writeln mostrar que X = 99 e Y = 1. Se no houvesse a declarao var dos parmetros, os valores finais de V1 e V2 seriam os mesmos, porm X e Y manteriam os valores originais.

PROGRAM Troca; {Exemplo de parmetros por referncia} var X, Y : integer; PROCEDURE TrocaVar (var V1, V2 : integer); {Troca os valores de duas variveis} var Aux : integer; begin Aux := V1; V1 := V2; V2 := Aux; end; begin X := 1; Y := 99; TrocaVar (X, Y); Writeln('X = ', X, 'e Y = ', end.

Y);

Resumindo parmetros Parmetros por valor so declarados sem a palavra var, e representam dados de entrada de um procedimento. Para estes podem ser usados como parmetros efetivos: variveis, constantes e expresses. O procedimento chamado recebe valores. Se o argumento uma varivel, recebe o

162

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

valor desta no momento da execuo; se expresso, o valor resultante da avaliao da expresso. Parmetros por referncia so precedidos da palavra var e constituem dados de entrada e sada, ou somente de sada. Na chamada somente variveis podem constituir-se nos parmetros efetivos correspondentes. Ao final da execuo do procedimento, o parmetro efetivo conter o mesmo valor que o parmetro formal correspondente. Exerccio 8.14 Reviso de parmetros por referncia Complete os espaos: a) Parmetros por referncia servem tanto para _________________ quanto para ______________ de dados em um procedimento. b) Para declarar que um parmetro por referncia devemos preceder seu nome com ______. c) O argumento correspondente a um parmetro por referncia deve necessariamente ser uma __________________ . d) Ao final da execuo de um procedimento, o valor de um parmetro por referncia passado para a _______________ passada como argumento. Prtica 8.15 - Troca Execute o programa Troca para responder: as variveis que recebem os valores do procedimento (parmetros efetivos) so atualizadas ao final de sua execuo ou durante esta? Explique. Prtica 8.16 Erros em parmetros por referncia No programa EqSegundoGrau, responda: a) b) O que ocorrer se a palavra var for retirada da declarao dos parmetros? O que ocorrer se a ordem dos parmetros Raiz1 e Raiz2 for invertida (Raiz2, Raiz1)?

.8.5. Funes declaradas pelo programador


Assim como procedimentos, podemos criar funes, segundo uma estrutura similar. Funes definidas pelo programador so semelhantes aos procedimentos nos seguintes aspectos: constituem-se em um bloco de instrues com um nome que as identifica; podem possuir seo local de dados; podem receber parmetros por valor ou por referncia; so executadas somente quando chamadas. As diferenas: retornam um valor ou resultado, cujo tipo deve ser especificado na declarao da funo; no bloco de cdigo da funo, devemos atribuir um valor a ser retornado; somente podem ser chamadas em expresses. Prtica 8.17 Funo Execute o programa a seguir e confira como executado: a chamada da funo, a atribuio do valor de retorno, o retorno do valor da funo.

9 - CRIAO DE INSTRUES E MODULARIZAO

163

PROGRAM CalculaFatorial;
{calcula o fatorial de um nmero lido, usando funo}

var N : byte; FUNCTION Fatorial( Num : byte ) : longint; {retorna o fatorial para Num > 0} var I : byte; F : longint; begin F := 1; for I := 2 to Num do F := F*I Fatorial := F; end;
Declarao do tipo de valor a ser retornado

Atribuio do valor de retorno

Chamada (o valor retornado aparecer aqui)

begin Writeln('Entre um nmero inteiro:'); Readln(N); Writeln('O fatorial de ', N, ' ', Fatorial(N) ); end.

O programa acima executado na seguinte seqncia: reservada memria para a varivel global N; So executados o Writeln e o Readln. Suponha que foi lido do teclado o valor 5 para N; executada a segunda instruo Writeln, mostrando na tela O fatorial de 5 ', e antes que seja concluda, o fluxo de execuo desviado para a funo Fatorial; criada na memria uma varivel correspondente ao parmetro N; O valor da varivel global N passada como argumento recuperado da memria e atribudo ao parmetro de mesmo nome; executado o bloco de cdigo da funo, que calcula F = 120; determinado o valor de retorno da funo (120); As variveis locais e o parmetro so eliminados, e liberada a memria que usavam; retornado o valor 120 para a instruo Writeln, que o mostra na tela. A atribuio do valor de retorno de uma funo pode ser feita mais de uma vez, e sua ausncia no representa um erro de sintaxe, mas nesse caso o valor retornado imprevisvel. Prtica 8.18 - CalculaFatorial Explore um pouco mais o programa CalculaFatorial: a) Execute-o de uma vez, calculando o fatorial de 11. b) Execute-o agora usando o debugger, fazendo-o mostrar a execuo do bloco de cdigo da funo e monitorando o valor do parmetro e das variveis locais. c) Agora retire ou comentarize a atribuio do valor de retorno da funo (Fatorial := F) e reexecute o programa O que aconteceu?

164

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Exemplo 8.19 Funes Veja outros exemplos de funes simples (apenas as declaraes):
FUNCTION AlunoPassou ( Nota : real) : boolean; {retorna True se a nota habilita a aprovao} begin AlunoPassou := (Nota >=5) end; FUNCTION Dia ( Data : string) : byte; {retorna dia de uma data no formato DD/MM/AAAA} begin Dia := Copy(Data, 1, 2); end;

Funes criadas pelo programador, da mesma forma que as funes padro, podem ser chamadas em qualquer lugar em que possa ocorrer uma expresso, desde que o tipo de valor retornado seja compatvel com a expresso. Voc pode chamar uma funo inteira em uma expresso real, mas no pode chamar em tal expresso uma funo que retorne um valor booleano ou string. Tipicamente voc usar funes quando houver um s valor retornado pela instruo. Se houver mais de um, ter que criar um procedimento. Prtica 8.20 Converso para maisculas A funo abaixo recebe uma cadeia e retorna-a convertida para maisculas: um apontador varre a cadeia do primeiro ao ltimo caractere; a cada posio na cadeia, obtemos o caractere, convertemos o caractere para maiscula e armazenamos o resultado na prpria posio do caractere.
FUNCTION Maiusc(S : string) : string; {converte uma cadeia de caracteres para maisculas} var I : byte; begin for I := 1 to Length(S) do S[I] := Upcase(S[I]); Maiusc := S; end;

Elabore um pequeno programa para testar a funo. Prtica 8.21 InverteCadeia a) Elaborar um programa completo e testar a funo InverteCadeia, abaixo. b) Altere a funo para usar o comando for.

9 - CRIAO DE INSTRUES E MODULARIZAO

165

FUNCTION InverteCadeia (Cad : string) : string; var Ap : byte; CadInv : string; begin CadInv := ''; Ap := Length(Cad); while Ap > 1 do begin CadInv := CadInv + Cad[Ap]; Ap := Ap + 1 end; InverteCadeia := CadInv; end;

Exerccio 8.22 Converso procedimento/funo Converta os cabealhos abaixo em cabealho de funo (se procedimento) ou em cabealho de procedimento (se funo), mantendo os mesmos dados de entrada e sada. a) b) c) d) PROCEDURE CalculaDigitoCPF (CPF : string; var Digito : integer); FUNCTION Pesquisa( Nome : string) : boolean; PROCEDURE CalculaMedia (N1, N2 : real; var Media : real) FUNCTION InverteCad ( Cadeia : string ) : string;

Exerccio 8.23 Fatorial estourado O que voc acha que poderia fazer para o caso em que o fatorial, se calculado, vai estourar a capacidade do tipo de dado adotado?

.8.6. Independncia e reusabilidade


A forma que voc d s instrues que cria afeta profundamente o seu rendimento como programador. Por exemplo, voc poderia programar uma funo que calcula o fatorial da forma abaixo, declarando todas as variveis como globais:
PROGRAM CalculaFatorial_Dependente; var N, I : byte; F : longint; FUNCTION Fatorial: longint; begin F := 1; for I := 2 to N do F := F*I Fatorial := F; end; begin {...} end.

Se voc quiser usar essa funo em outro programa, ter que declarar as variveis I e F que a funo necessita. Imagine que um programa maior utilize 10, 20 ou mais funes e procedimentos, todos estruturados dessa forma. Alm de ter que se lembrar de todas as variveis de que todos necessitam, algumas das variveis tero o mesmo nome, e pode ocorrer que uma instruo modifique uma varivel que est sendo usada por outra. Voc ia ficar louco para administrar essa complexidade.

166

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Usando parmetros adequados e variveis locais, voc torna as novas instrues independentes, e assim sendo, elas se tornam imediatamente reutilizveis. Alm disso, variveis locais s ocupam memria quando sua instruo est ativa. E uma outra imensa vantagem que voc pode escrever e testar as instrues em separado uma da outra. Quando uma instruo produz dados, se bem estruturada ela no apresenta seus resultados na tela; simplesmente retorna o valor, o que a torna mais genrica. A parte do programa que a chamou que decidir o que fazer com o valor. Se uma instruo mostra um resultado na tela, e voc precisar imprimir o valor, ter que alter-la, ou escrever outra instruo. Esse tipo de independncia das instrues proporciona reusabilidade imediata, que por sua vez incrementa a produtividade do programador. Uma caracterstica de instrues independentes que podemos implement-la de forma independente do programa que vai cham-la: uma coisa de cada vez. Alm dessa vantagem, possvel distribuir o trabalho entre vrias pessoas, definindo-se apenas o cabealho das instrues e cada pessoa implementando um subconjunto das instrues (pense nisso ao planejar trabalhos escolares mais complexos!). Nunca use variveis globais em procedimentos ou funes, a menos que os benefcios superem os custos. Na prtica, voc armazena os procedimentos e funes relacionados em um arquivo separado, e para compilar um programa que usa essas instrues basta indicar ao compilador em que arquivo elas esto. No Turbo Pascal esses arquivos se chamam units (veja neste captulo). Assim voc pode ter sua biblioteca de funes matemticas, de instrues que tratam janelas emolduradas, instrues para cadeias, etc. Esta reusabilidade a grande chave da sua produtividade como programador. Exerccio 8.24 - Reviso Sobre instrues independentes: a) b) Que caractersticas deve possuir uma instruo para que seja independente? Quais as vantagens de se escrever instrues independentes?

Exerccio 8.25 Isto til? Uma pessoa, ao aprender procedimentos e funes, manifestou a seguinte opinio ao observar procedimentos com 2 ou 3 comandos: Jamais vou usar isso. Assim digito muito mais, e muito mais prtico colocar as instrues na seqncia correta Analise a afirmao luz das possibilidades da criao de novas instrues. Responda: sua afirmao apropriada em algum aspecto, ou para alguns casos particulares? O que essa pessoa pode no estar percebendo que poderia lhe ser til? Justifique suas respostas. Prtica 8.26 - ScreenChar Um timo exemplo de reusabilidade. O Turbo Pascal no dispe de instruo para recuperar o cdigo do caractere que est em uma linha e coluna da tela, isto deve ser feito utilizando-se conhecimentos bem mais profundos que os normais para uma linguagem de alto nvel. A funo abaixo faz isto, mas voc no precisa conhecer os detalhes de funcionamento dela para us-la; basta conhecer o cabealho. Faa um pequeno programa para test-la (para uso em programas, provavelmente ser necessrio um melhoramento: salvar a posio do cursor e restaur-la no final da funo). No se esquea de inserir um comando uses para as units DOS e CRT.

9 - CRIAO DE INSTRUES E MODULARIZAO

167

FUNCTION ScreenChar (X, Y : byte) : byte; {retorna o caractere em posio na tela. USAR units DOS e CRT. (adaptada de O'Brien 1992, pg. 294) } var Regs : registers; begin GotoXY(X,Y); FillChar(Regs, SizeOf(Regs),0); Regs.AH := 8; Regs.BH := 0; (* pgina de vdeo *) Intr($10,Regs); ScreenChar := Regs.AL; end;

.8.7. Roteiro para criar novas instrues


Para criar uma nova instruo, voc pode seguir alguns passos bem definidos: Identificao da possibilidade - Quando que voc decide que vai declarar uma instruo? Tipicamente quando faz a segmentao, na forma de diagrama de blocos ou refinamentos, e estrutura o programa. Um ponto importante estar procurando uma operao ou ao que possa ser implementada atravs de uma nova instruo. Um pouco de experincia j faz com que voc perceba logo essas possibilidades. Descrio da finalidade - o que a instruo deve fazer. Entrada - Identificao dos dados necessrios para a instruo atender sua finalidade. Sada/resposta - Definio dos dados de sada ou da resposta que a instruo deve produzir. Tipo da instruo - A instruo pode um procedimento ou uma funo. Tipicamente ser uma funo quando houver apenas um valor de retorno, e procedimento nos demais casos. Cabealho - Escolha de um nome para identificar a instruo e definio do cabealho, sendo declarados como parmetros os dados de entrada e sada, se houver. Implementao - Escreva o cdigo Pascal da instruo. Se a instruo corresponde a um algoritmo, voc pode ter que desenvolv-lo. Teste - Se outras partes do programa esto avanadas e habilitam o teste da nova instruo, testea l mesmo. Outra possibilidade fazer um pequeno programa para efetuar o teste. Se o procedimento foi bem estruturado, isso ser muito fcil; veja frente as consideraes sobre independncia e reusabilidade de instrues. Exemplo 8.27 - Contando palavras Implementar um programa que l uma cadeia e informa a quantidade de palavras da cadeia. Considere como separador de palavras o caractere espao (que pode ser mais de um) e como palavra uma seqncia de caracteres diferentes de espao..

168

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

O programa ter a seguinte estrutura:


"Ler cadeia" "Calcular quantidade de palavras da cadeia" "Mostrar quantidade de palavras"

Podemos criar uma instruo para a segunda ao: ela receber a cadeia e retornar a quantidade de palavras. Seguindo a seqncia de passos sugerida acima para a declarao de uma instruo, temos: Finalidade: calcular a quantidade de palavras de uma cadeia de caracteres. Entrada: uma cadeia de caracteres Sada: a quantidade de palavras Tipo da instruo: havendo um s valor retornado, podemos declarar uma funo, cujo uso mais prtico que o procedimento. Cabealho: FUNCTION CalcQtPal (Cadeia : string) : byte; Implementao: Veja a seguir a implementao completa da funo e do programa. Para achar a quantidade de palavras usamos um apontador para cada caractere da cadeia e repetidamente fazemos: "pular espaos at achar uma palavra" "incrementar o contador de palavras encontradas" "pular os caracteres da palavra encontrada" Em cada caso tomado o cuidado de no ir alm do final da cadeia, verificando se o apontador Ap no ultrapassou seu tamanho. Veja o programa a seguir..

9 - CRIAO DE INSTRUES E MODULARIZAO

169

PROGRAM ContaPalavras; uses CRT; const Espaco = ' '; var CadLida : string; FUNCTION CalcQtPal (Cadeia : string) : byte; {calcula quantidade de palavras em uma cadeia} var Ap, CtPalavras : byte; begin CtPalavras := 0; Ap := 1; while Ap < Length(Cadeia) do begin {pula os espaos} while (Cadeia[Ap] = Espaco) and (Ap <= Length(Cadeia)) do Ap := Ap + 1; if Ap <= Length(Cadeia) then begin {achou palavra} CtPalavras := CtPalavras + 1; {pula os caracteres da palavra encontrada} while (Cadeia[Ap] <> Espaco) and (Ap < Length(Cadeia)) do Ap := Ap + 1 end end; CalcQtPal := CtPalavras end; begin ClrScr; Writeln('Contador de palavras'); repeat Write('Digite cadeia de at 255 caracteres: '); Readln(CadLida); if CadLida <> '' then Writeln( CalcQtPal(CadLida), ' palavras.'); Writeln; until CadLida = '' end.

Prtica 8.28 - ContaPalavras Digitar e testar o programa ContaPalavras, usando o debugger. Depois, e considerando que os espaos so um elemento importante no algoritmo usado, verificar os resultados para as seguintes frases: a) ' Espaos no incio' ' meio' mistas ' no b) 'Espaos no final c) 'Espaos d) ' s i t u a e s

Exerccio 8.29 Procedimento ou funo? Para cada descrio abaixo, definir se deve ser implementada como funo ou procedimento. Identificar parmetros necessrios e tipo de valor retornado, se funo, e declarar o cabealho para cada uma. Fornecer um exemplo de chamada de cada procedimento ou funo declarado.

170

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Modelo: Verifica se aluno passou em disciplina. FUNCTION AlunoPassou( Nota : real ) : boolean; Chamada: if AlunoPassou (7.5) then ... a) b) c) d) e) Calcula mdia aritmtica de 3 nmeros. Calcula um inteiro elevado a outro inteiro. Mostra na tela uma linha de texto. Calcula dgito verificador de CPF. Imprime um cabealho com nmero de pgina.

Especificao 8.30 - Nmeros pares Escrever um procedimento que recebe dois nmeros e mostra na tela os nmeros pares situados entre os dois, inclusive. Testar com um programa que l os nmeros inicial e final e, se este maior que o inicial, chama o procedimento. Especificao 8.31 - Nmero par a) Fazer um procedimento que recebe um nmero e retorna Verdadeiro ou Falso, por referncia, conforme o nmero seja par ou no (use mod). b) Elaborar uma funo para a mesma finalidade. Especificao 8.32 - Linha vertical 1 a) Desenvolva um procedimento que recebe um nmero de coluna de tela e preenche a coluna com caracteres O. b) Alterar o procedimento acima para que receba tambm o caractere. Especificao 8.33 - Cabealho Elaborar um procedimento que recebe e imprime uma linha de cabealho com nmero de pgina, no formato. A data obtida do sistema (pesquise funo apropriada na ajuda) e o nmero de pgina um parmetro: RELATRIO DE CLIENTES EMISSO: DD/MM/AAAA PG. 999 _____________________________________________________________________ Especificao 8.34 - Aprovao Escrever uma funo que recebe uma nota de 0 a 10 e retorna verdadeiro ou falso (ou outros valores convencionados como tal) se o aluno foi aprovado, isto , se tirou 7 ou mais. Especificao 8.35 - Maior de 2 Escrever uma funo que recebe dois nmeros quaisquer e retorna o maior. Especificao 8.36 - Maior de 3 Escrever uma funo que recebe 3 nmeros e retorna o maior Especificao 8.37 - Mdia de 3 Declarar uma funo que calcula a mdia aritmtica de 3 nmeros

9 - CRIAO DE INSTRUES E MODULARIZAO

171

Especificao 8.38 - Maior e menor com menu Faa duas funes: uma que recebe dois nmeros e retorna o maior e outra que recebe o mesmo mas retorna o menor. Implementar um programa com um menu de 4 opes: ler dois nmeros, testar uma e outra funo e terminar. Especificao 8.39 - Mensagem Escrever um procedimento que recebe valores de linha e coluna da tela e um texto, mostra o texto nas coordenadas recebidas e espera 5 segundos. Aps, apaga a mensagem e termina. Especificao 8.40 - Minsculas Elaborar uma funo que converte uma cadeia de caracteres para minsculas. [Dica: some 32 aos caracteres cujos cdigos ASCII esto entre 65 e 90, inclusive]. Especificao 8.41 - Bissexto Um ano bissexto se for divisvel por 4 exceto os sculos, que so bissextos se forem mltiplos de 400. Implementar uma instruo que recebe o nmero de um ano e retorna Verdadeiro se o ano for bissexto ou Falso caso contrrio. Especificao 8.42 Crtica de data Escrever uma funo que recebe uma data no formato 'DD/MM/AAAA' (dia/ms/ano), verifica se as barras esto na posio correta, se o dia est entre 1 e 31 (inclusive), se o ms est entre 1 e 12 e retorna um valor da seguinte forma: 0: data correta 1: dia invlido 2: ms invlido 3: dia e ms invlidos 4: formato invlido Depois escreva uma funo que recebe um dos nmeros acima e retorna a mensagem correspondente. Teste as funes em um programa apropriado. Especificao 8.43 - Sorteio de dados Escreva uma instruo que recebe um nmero de 1 a 6, correspondente ao sorteio de um dado, e desenha o dado na tela (em qualquer posio), mostrando o lado sorteado. Depois, faa um programa que sorteia 5 dados e os mostra na tela, alinhados. Especificao 8.44 - Palavra grande Elabore uma instruo que recebe linha, coluna e letra de A a Z e desenha "grande" essa letra, em linha e coluna da tela. Faa outra instruo que recebe um texto de at 10 caracteres e chama a primeira para mostrar o texto na tela em letras grandes.

.8.8. Reusabilidade total: units


Se voc quiser reutilizar os procedimentos WriteXY, Som ou qualquer outro, ter que copiar as instrues da declarao de um programa para outro e recompilar. Um jeito melhor colocar as novas instrues em uma unit. Uma unit um arquivo texto, como um programa-fonte, mas comea com a

172

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

palavra reservada unit, compilada em separado dos programas e quando compilada gerado um arquivo com cdigo objeto e extenso .TPU. Um unit no executvel diretamente mas pode ser usada por qualquer programa. O princpio bsico de uma unit que para que um programa referencie uma instruo, no necessrio expor as declaraes internas ou o bloco de cdigo da instruo; preciso somente conhecer o cabealho: o nome da instruo e o tipo dos parmetros. Por isso uma unit possui duas sees: a parte pblica (interface) e a parte privada (implementation). Na parte pblica ficam somente os cabealhos das instrues e na parte privada ficam os nomes e blocos de cdigo, ou seja, a implementao das instrues. Quando usa uma unit, um programa s pode referenciar as instrues cujo cabealho foi declarado na parte pblica. De fato, pode haver tambm declaraes de tipos de dado, constantes e variveis, em ambas as sees. Novamente s as declaraes pblicas podem ser referenciadas no programa que usa a unit. So palavras reservadas, alm das j conhecidas: unit, interface, implementation. No bloco de cdigo no final da unit podem ser includos comandos (opcionais) para a inicializao de variveis ou algo que precise ser feito para que as instrues da unit funcionem corretamente. A estrutura simplificada de uma unit assim:

UNIT Nome; Interface PROCEDURE Proc1 (parmetros); {descrio do procedimento 2} FUNCTION Func1 (parmetros): tipo; {descrio da funo 1} Implementation Uses lista de units usadas na implementao; PROCEDURE Proc1; Var variveis locais; begin Comandos do procedimento 1 end; FUNCTION Func1; var variveis locais; begin Comandos da funo 1 end. PROCEDURE Proc2(parmetros); var variveis locais; begin Comandos do procedimento 2 end. begin {comandos de inicializao da unit} end. Comandos colocados nesta seo sero executados no incio de cada programa que usa a unit. Este procedimento no aparece na Interface; de uso interno da unit e no pode ser chamado por programas. Na seo Implementation ficam os nomes das instrues (no preciso repetir os parmetros) e o restante da implementao de cada uma. Na seo Interface ficam apenas os cabealhos das instrues pblicas, isto , que podem ser chamadas por programas.

9 - CRIAO DE INSTRUES E MODULARIZAO

173

Tanto na interface quanto na implementao, voc pode declarar tambm variveis, tipos e constantes. Se estes forem declarados na interface, sero visveis para os programas. Veja a seguir uma unit que contm uma nica instruo, WriteXY.

unit CRT2; interface PROCEDURE WriteXY (Col, Lin : byte; Texto : string); {mostra texto na tela, na coluna e linha recebidas} implementation uses CRT; PROCEDURE WriteXY; begin GotoXY (Col, Lin); Write(Texto); end; begin end.

Parte pblica: para usar s preciso conhecer os cabealhos.

Aqui fica a implementao, que no precisa estar acessvel aos programas.

Prtica 8.45 CRT2 1. Digite a unit CRT2 e salve-a com o nome de CRT2.PAS. Compile a unit com destino disco. No se esquea de configurar o diretrio de executveis e units para o seu diretrio de trabalho (Options/Directories). Pronto: agora voc pode usar a instruo WriteXY de qualquer programa, para isso basta incluir a unit CRT2 na declarao uses. Note que a seo de inicializao est vazia; nada precisa fazer neste caso. 2. Agora abra o programa QuadradoXY, exclua as linhas do procedimento WriteXY (lembra do Ctrl-Y?) e inclua na declarao uses a unit CRT2, aps uma vrgula. Compile e teste o programa. Execute tambm com o debugger e veja como ele lhe mostra o fonte quando alguma instruo da unit chamada (somente quando estiver disponvel). Prtica 8.46 WriteXY v2 Altere o procedimento WriteXY para que ele no afete a posio atual do cursor: antes de mostrar o texto ele salva a linha e a coluna, e aps o cursor retornado para a posio salva. Note que alter-lo no afeta em nada os programas que o chamam. E para que se beneficiem da modificao, esses programas tero apenas que ser recompilados. Prtica 8.47 Som Inclua o procedimento Som na unit CRT2. Compile para disco. Altere o programa SomVariavel para usar a unit e chamar o procedimento Som. Prtica 8.48 Inicializao da unit Teste a seo begin..end: inclua instrues na unit CRT2 para mostrar seu nome, esperar 2 segundos e apagar o nome. Compile a unit e recompile algum programa que a use. Execute e veja o resultado. Prtica 8.49 Unit Mat Digitar e compilar a unit Mat, a seguir. Test-la atravs do programa CalculaFatorial, usando o debugger.

174

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

UNIT Mat; interface

{Instrues matemticas}

PROCEDURE EqSegGrau ( a, b, c : integer ; var Raiz1, Raiz2 :real); {Calcula razes da equao do segundo grau com coeficientes a, b e c; verso simplificada; no critica o delta} FUNCTION Fatorial( N : byte ) : longint; {Retorna o fatorial de um nmero maior do que zero} implementation PROCEDURE EqSegGrau;

var Delta : real; begin Delta := b*b - 4*a*c; Raiz1 := (-b + SqRt(Delta) )/2*a; Raiz1 := (-b - SqRt(Delta) )/2*a; end; FUNCTION Fatorial; var I : byte; F : longint; begin F := 1; for I := 2 to N do F := F*I; Fatorial := F; end; begin end.
PROGRAM CalculaFatorial; uses CRT, Mat; var N : byte; begin ClrScr; Writeln('Entre um nmero inteiro:'); Readln(N); Writeln('O fatorial de ', N, ' ', Fatorial(N) ); end.

Prtica 8.50 Substituindo Readln A instruo ReadXY (adiante) foi implementada para substituir Readln na leitura de strings. Ela recebe linha e coluna da tela onde deve ser feita a edio, o "prompt" (texto a ser mostrado antes do campo) e o tamanho mximo da string, e retorna o valor lido. Se for recebido um valor inicial, este mostrado na tela no incio da edio. Seus recursos de edio incluem deslocamento do cursor atravs das setas esquerda e direita, Home (incio da cadeia), End (fim da cadeia) e Insert (alterna sobreposio ou insero de

9 - CRIAO DE INSTRUES E MODULARIZAO

175

caracteres). Somente permitida a digitao de caracteres alfa-numricos, e a edio termina quando for teclado Escape ou Enter.

176

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

unit RXY; interface const kEscape kEnter kSeta_Esq kSeta_Dir kHome kEnd kInsert = = = = = = = #27; #13; #75; #77; #71; #79; #82; {cdigos ASCII correspondentes a teclas} {cdigos estendidos de teclas de controle}

PROCEDURE ReadXY(X, Y : byte; Prompt : string; var S : string; Tam : byte); {Leitura de strings com comandos de edio, em posio da tela} implementation uses CRT; PROCEDURE ReadXY; var Pos : byte; Tecla : char; Insere : boolean; {True : insero; False : sobreposio} begin GotoXY (X, Y); Write(Prompt); X := X + Length(Prompt) + 1; Pos := 1; Insere := True; repeat {mostra valor atual} GotoXY(X,Y); Write(S); {posiciona cursor no ponto de edicao} GotoXY(X + Pos - 1, Y); {le a tecla e processa (caractere vlido ou de controle)} Tecla := ReadKey; case Tecla of ' ','0'..'9','A'..'Z','a'..'z' : begin if not Insere then begin S[Pos] := Tecla; if Pos < Tam then Pos := Pos + 1; end else if Length(S) < Tam then begin Insert(Tecla, S, Pos); if Pos < Tam then Pos := Pos + 1; end; end; #0 : begin

{trata teclas especiais, que tem dois cdigos, sendo zero o primeiro}

Tecla := ReadKey; case Tecla of kSeta_Esq : if Pos > 1 then Pos := Pos - 1; kSeta_Dir : if Pos < Tam then Pos := Pos + 1; kHome : Pos := 1; kEnd : Pos := Length(S); KInsert : If Insere then Insere := False else Insere := True; end end; end until (Tecla = kEscape) or (Tecla = kEnter); end; begin end.

Para a unit e o procedimento ReadXY, faa o seguinte:

9 - CRIAO DE INSTRUES E MODULARIZAO

177

a) Digite e compile a unit. b) Faa um programa para testar o procedimento (por exemplo, repetidamente chama o procedimento e mostra o valor retornado). Prtica 8.51 Melhorando ReadXY Faa e teste as seguintes alteraes no procedimento ReadXY: a) Implemente o uso das teclas Backspace (deleta esquerda do cursor) e Delete (deleta o caractere na posio do cursor). b) Implemente a sada de edio com a tecla Escape; neste caso, a instruo retorna o valor inicial recebido (salve o valor recebido no incio e restaure-o no final). Especificao 8.52 - Exponenciao real Escrever uma funo que calcula um nmero real elevado a outro real, usando a frmula Y X = exp(x*ln(y)). Aps test-la (verifique se a frmula falha para alguma situao), inclua-a na unit Mat, acima. Especificao 8.53 Menu matemtico Faa um programa com opes de: terminar, mostrar informaes do programador e do programa, calcular fatorial, resolver equaes do segundo grau e potenciao. Chame um procedimento para mostrar as informaes. Use a unit Mat para os clculos. Para o fatorial, limite o valor do nmero de forma a no estourar a capacidade da varivel que recebe o fatorial. Para as equaes, no calcule as razes se o delta for negativo e mostre somente uma se o delta for zero. Para criticar o delta, use uma funo Delta declarada na prpria unit. Prtica 8.54 - Mat v2 Altere a unit Mat para que qualquer programa que a use mostre a identificao da unit e o nome do programador por trs segundos e depois limpa a tela (inclua as instrues para isso no bloco de cdigo no final da unit). Pesquisa 8.55 Compilao simplificada Descubra no menu Compile do Turbo Pascal uma opo que lhe permite compilar o programa e todas as units usadas por ele. Pesquisa 8.56 Diretivas de compilao Descubra na ajuda do Turbo Pascal o que so diretivas de compilao, e ache uma diretiva que afeta o comportamento de instrues declaradas pelo programador. Especificao 8.57 Sorteio de dados a) Escreva uma unit com duas instrues na interface. A primeira uma funo que sorteia e retorna um nmero de 1 a 6, representando a pontuao de um dado. Para sortear o valor use a instruo Random, cuja inicializao (instruo Randomize) deve ser feita na seo de inicializao da unit. A segunda um procedimento que recebe uma quantidade de pontos, uma linha, uma coluna e um caractere e desenha um dado com a quantidade de pontos recebida, na posio da tela recebida e usando o caractere recebido, usando 3 linhas e 3 colunas. Voc pode assumir que existe a instruo WriteXY, na unit CRT2. No necessrio emoldurar o dado. Por exemplo, se os pontos forem 5 e o caractere for '*', a sada seria (o '*' no alto esquerda corresponde linha e coluna recebidas): * *

178

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

* * * b) Escrever um procedimento que l e retorna, por referncia, dois nmeros de 1 a 6 lidos do teclado. Caso um dos nmeros esteja fora da faixa vlida, o procedimento retorna zero para ambos. c) Elaborar um procedimento que recebe como parmetros (no leia do teclado) dois nmeros correspondentes pontuao de dois dados e faz o seguinte: Sorteia e armazena a pontuao de dois dados (para isso chame a funo da unit declarada acima). Mostra na tela a pontuao sorteada de ambos os dados (use o procedimento declarado acima). Compara os pontos sorteados com os pontos recebidos e mostra mensagem na tela informando se os dados so iguais (em qualquer ordem), se a soma igual ou se nada disso ocorreu.

d) Implementar um programa de sorteio de dados, que repetidamente oferece um menu com as seguintes opes: Terminar. Leitura do palpite do usurio para dois dados. Use o procedimento declarado acima, e espere uma tecla aps a chamada do procedimento. Sortear e verificar o resultado. Use o procedimento declarado acima, mas somente se a leitura j foi efetuada. Se no, mostrada uma mensagem apropriada. Espere tambm uma tecla antes de retornar.

.8.9. Atividades suplementares


Exerccio 8.58 Desvantagens de repetir cdigo Citar as desvantagens de escrever trechos redundantes de instrues. Qual a soluo? Exerccio 8.59 Declarao de instrues Complete os espaos: a) As instrues que criamos podem ser ___________________ ou _______________. b) Para chamar uma instruo, precisamos conhecer apenas o seu _____________ e seus dados de _________________ e _______________. c) Para usar uma instruo, no precisamos conhecer seu __________ de ____________ ou suas variveis ______________. d) Uma funo produz um _________________, e por isto pode ser usada em expresses. e) Uma vantagem de se criar instrues evitar ___________________ de trechos de cdigo. Exerccio 8.60 Mais reviso Assinale V ou F: ( ) Uma instruo declarada pelo programador deve ter pelo menos um nome e um bloco de cdigo.

9 - CRIAO DE INSTRUES E MODULARIZAO

179

( ) As variveis declaradas dentro de um procedimento ou funo e s podem ser usadas (referenciadas) no respectivo bloco de cdigo, j que s existem quando a instruo for executada. ( ) O bloco de cdigo de uma instruo declarada executado quando da compilao. ( ) Um procedimento declarado pode chamar outro.

Exerccio 8.61 - Funes Assinale V ou F, conforme a afirmativa seja verdadeira ou falsa: ( ( ( ( ( ) Funes retornam um valor, de um determinado tipo de dado. ) O valor de retorno de uma funo determinado automaticamente pelo compilador. ) A passagem de parmetros na chamada de uma funo opcional. ) Funes podem ter parmetros por valor ou por referncia. ) As variveis locais de uma funo s existem enquanto a funo est sendo executada.

Exerccio 8.62 Reviso de parmetros Complete os espaos: a) b) c) Parmetros so declarados no ___________________ de um procedimento. Parmetros por valor servem para o procedimento _____________ dados. Para declarar um parmetro precisamos definir seu _________ e seu _________.

d) Parmetros, assim como variveis locais, s existem na memria enquanto o procedimento em que foram declarados estiver ____________________. e) Um parmetro declarado chama-se ___________________; o passado na chamada da instruo denominado ____________________ ou __________________. f) O valor inicial de um parmetro formal fornecido na _______________ do procedimento. g) Se um parmetro efetivo (ou argumento) uma _______________, seu valor recuperado da memria antes da chamada do procedimento; se for uma expresso, seu valor antes __________________. Pesquisa 8.63 - Dia da semana Descubra como, a partir de uma data vlida, voc pode identificar o dia da semana correspondente (domingo, segunda, etc.). Escreva uma instruo que retorna esse dia. Especificao 8.64 Funo para substituir FillChar O fato de FillChar ser um procedimento no o torna muito prtico. Elabore uma funo que recebe um caractere e uma quantidade e retorna uma string com a quantidade indicada do caractere. Coloque a funo em uma unit. Especificao 8.65 Operaes com cadeia Elabore um programa que mostra um menu com as opes abaixo. Todos os procedimentos e funes devem estar em uma ou mais units. Todas as units devem mostrar na tela, ao inicializar, o seu nome (da unit) e a identificao do programador, por 2 segundos. Todo texto deve ser mostrado na tela atravs da

180

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

funo WriteXY em unit. Mostrar mensagens de erro tambm atravs de procedimento, que emite um som qualquer usando o procedimento Som. a) Terminar. b) Mostrar submenu com duas opes: informaes do programador, da disciplina, etc. ou ajuda para o programa. Usar procedimento para este submenu. c) Ler uma cadeia qualquer. d) Inverter a cadeia, que ficar como lida de trs para a frente. Usar funo para a inverso. e) Converter a cadeia para maisculas, usando funo f) Converter a cadeia para minsculas, usando funo. g) Restaurar o ltimo valor lido para a cadeia. Especificao 8.66 - Formatao de data Elaborar um procedimento que recebe como parmetros dia, ms, ano, uma linha e uma coluna da tela e uma letra que corresponde ao formato de data a ser apresentado. Se o formato = A, mostra DD/MM/AA; se B, mostra DD.MM.AAAA. Para test-lo, faa um programa que busca a data do sistema, extrai dia, ms e ano e chama o procedimento. Especificao 8.67 - Nmeros primos Um nmero dito ser primo quando divisvel somente por si e pela unidade. Faa um programa que verifica, atravs de uma funo, se um nmero ou no primo. [Dica: divida o nmero N por todos os nmeros de 2 a N - 1. Se o resto da diviso de N por algum dos nmeros der zero, ele no primo] Especificao 8.68 - Palndromos Implementar um programa que verifica se uma frase palndroma (a mesma se lida normalmente ou de trs para a frente: "Roma me tem amor", "socorram me subi no nibus em Marrocos"). Especificao 8.69 - Custo de execuo de procedimento Escrever um programa que serve para se medir o custo, em tempo, de execuo de um procedimento. Ele troca, alguns milhares de vezes, os valores de duas variveis, de duas formas: na primeira usado para trocar as variveis um procedimento, na segunda sem este. Computar o tempo gasto para cada forma e mostr-los na tela. Especificao 8.70 - Trim Implementar uma funo que retira os brancos finais de uma cadeia de caracteres (em certas linguagens disponvel com o nome de "Trim"). Especificao 8.71 - Ajuste de tamanho Implementar uma funo que recebe uma cadeia e um tamanho e retorna a cadeia com brancos inseridos no fim at o tamanho especificado. Especificao 8.72 - Formatao de linha Um programador est escrevendo um editor de textos, e precisa de uma funo que recebe uma linha de texto e uma largura de linha, e insere espaos de forma a alinhar o texto largura recebida, retornando a linha formatada. Implemente essa funo. [Dica: primeiro calcule a quantidade de espaos necessria; descubra a quantidade de intervalos entre palavras e calcule quantos espaos ter que inserir em cada

9 - CRIAO DE INSTRUES E MODULARIZAO

181

intervalo; insira essa quantidade em cada intervalo, sendo que o ltimo intervalo receber os espaos extras restantes. Investigue outras possibilidades de distribuio] Especificao 8.73 - Janela de confirmao Implementar uma instruo que mostra uma janela de confirmao na tela com as opes "SIM", "NO" e "CANCELAR", aguarda a opo do usurio e retorna a opo selecionada. O usurio seleciona a opo com as setas ou a primeira letra e depois teclando Enter. Especificao 8.74 - PIS/PASEP O dgito verificador do PIS/PASEP calculado atravs da seguinte regra: o nmero composto por dez dgitos mais um dgito verificador. Multiplique os nmeros, da esquerda para a direita, respectivamente por 3 2 9 8 7 6 5 4 3 2. Some os resultados das multiplicaes; calcule o resto da diviso da soma por 11 e subtraia o resultado de 11. Se o resultado for 10 o dgito zero, caso contrrio o dgito o prprio resultado. Por exemplo, para o nmero 1701209041-1, o clculo seria: 1x3 + 7x2 + 0x9 + 1x8 + 2x7 + 0x6 + 9x5 + 0x4 + 4x3 + 1x2 = 98. O resto da diviso de 98 por 11 10. Como 11 - 10 = 1, o dgito 1. Escrever uma funo que recebe um nmero de PIS/PASEP e retorna o dgito verificador. Para test-lo, voc pode usar tambm o nmero 1010861269-1. Especificao 8.75 - CPF Os dois dgitos de verificao do CPF (constitudo de 9 dgitos) so calculados atravs de um complicado algoritmo: Etapa 1: clculo de DV1 Soma 1: soma dos produtos de cada dgito por um peso de 2 a 10, na ordem inversa (do nono para o primeiro). Multiplique a soma 1 por 10 e calcule o resto da diviso do resultado por 11. Se der 10, DV1 zero, caso contrrio o DV1 o prprio resto. Etapa 2: clculo de DV2 Soma 2: soma dos produtos de cada dgito por um peso de 3 a 11, tambm na ordem inversa. Adicione a Soma 2 ao dobro do DV1, multiplique por 10 e calcule o resto da diviso do resultado por 11. Se der 10, DV2 zero, caso contrrio o DV2 o prprio resto. Etapa 3: Multiplique DV1 por 10, some com DV2 e voc tem o nmero de controle do CPF. Exemplo: para o CPF 398 136 146, temos: Etapa 1: 2x6 + 3x4 + 4x1 + 5x6 + 6x3 + 7x1 + 8x8 + 9x9 + 10x3 = 258 2580 mod 11 = 6, portanto, DV1 = 6 Etapa 2: 3x6 + 4x4 + 5x1 + 6x6 + 7x3 + 8x1 + 9x8 + 10x9 + 11x3 = 299 (299 + 6x2)x10 mod 11 = 3150 mod 11 = 8, portanto DV2 = 8 Etapa 3: DV1x10 + DV2 = 6x10 + 8 = 68, que o nmero procurado. Escrever uma funo para calcular os dgitos de controle do CPF. Para simplificar, j que so duas somatrias, voc pode escrever tambm uma funo auxiliar que recebe o CPF e o peso inicial e retorna a soma.

182

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Especificao 8.76 - Freqncia de notas musicais Se voc conhece a freqncia de uma nota musical, pode conhecer a nota seguinte (um semitom acima) multiplicando aquela por 12 2 . Sabendo que a freqncia de uma das notas L 440 Hz, faa o seguinte: a) Escreva uma funo que recebe uma nota e retorna a prxima; b) Escreva um programa que calcula as freqncias de notas acima do L (La#, Si, D, D#, R, R#, Mi, F, Sol, Sol#, L, L #, Si, D. Anote as freqncias. c) Em outro programa, declare constantes para as freqncias das notas (por ex., DO) e escreva instrues que toquem o Parabns pra voc. [Dica: declare uma constante para a durao e use mltiplos desta; as primeiras notas, com a respectiva durao, do Parabns ficariam assim: (DO, Dur), (DO, Dur), (RE, 4*Dur), (DO, 2*Dur). Tente Dur = 100 e 200.]

183

.9 LISTAS NUMERADAS: VETORES E MATRIZES

Em vrias situaes o programador deve trabalhar com listas de nomes, nmeros e vrias outras. Para facilitar a sua vida, as linguagens de programao permitem a declarao de muitas variveis em uma s instruo, na forma de uma lista com vrios elementos, e para atribuir ou recuperar valores voc faz referncia a um elemento de cada vez, atravs de sua posio na lista. Essas listas so chamadas de vetores, quando de uma dimenso, ou matrizes, quando com duas ou mais dimenses. Voc ver neste captulo como declarar e usar esse tipo de variveis em Pascal.

.9.1. Vetores
Considere a seguinte especificao: "Implementar um programa que l uma srie de pares freqncia/durao at que seja lida uma freqncia zero. Aps, o programa "toca" a seqncia lida, emitindo sons em cada freqncia, com a respectiva durao." Para efetuar a leitura, voc vai precisar de variveis para a freqncia e a durao. Mas onde guardar os valores lidos anteriormente? Mesmo que fossem declaradas variveis para cada par (o que daria muito trabalho), no se sabe a quantidade de pares. Vamos ver como atender necessidade da especificao acima e depois como efetuar a declarao no Pascal. Para essa especificao, precisamos de duas listas, uma para as freqncias e outro para as duraes. Como exemplo, vamos usar as seis primeiras notas do "Parabns pra voc"; as listas devem ficar assim (assumindo um mximo de 10 notas em uma msica): Freqncias (Hertz)
440 440 500 440 600 560 1 2 3 4 5 6 7 8 9 10

Duraes (milissegundos)
200 200 800 400 400 800 1 2 3 4 5 6 7 8 9 10

Para representar as estruturas acima e outras semelhantes, o Pascal (e as outras linguagens) permitem que declaremos muitas variveis de uma vez, na forma de um vetor. Um vetor consiste em uma lista numerada de variveis, s quais fazemos referncia pela nome do vetor e a posio desejada da lista. Cada varivel componente do vetor chamada elemento. Outros exemplos de problemas que podem ser solucionados atravs de listas: Achar a nota mdia de uma turma de 50 alunos

184

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Organizar 5000 nmeros em ordem decrescente Armazenar uma lista de 200 palavras Armazenar na memria e ordenar em ordem crescente uma lista de cdigos de 3000 produtos

.9.2. Declarao de vetores


No Pascal, e como qualquer outra varivel, para se usar um vetor preciso declar-lo; sua declarao deve fornecer os seguintes elementos: nome: o identificador do vetor limite inferior: inteiro que aponta para o menor posio do vetor2 limite superior: inteiro que aponta para a maior posio do vetor tipo de dado de cada elemento. Sintaxe da declarao:
var nome : array [Limite inferior..limite superior] of tipo;

array e of so palavras reservadas. O primeiro nmero dentro dos colchetes indica o nmero ou posio do primeiro elemento (limite inferior), e o segundo (10) indica o nmero do ltimo (limite superior). As declaraes acima, portanto, criam dois vetores com 10 elementos cada um, numerados de 1 a 10, sendo que em cada elemento ou posio podemos armazenar um dado do tipo word. Veja que desta forma criamos 10 variveis de uma s vez, a cada declarao. Podemos declarar os vetores de freqncias e duraes assim (lembrando que freqncia e durao no Turbo Pascal so do tipo word):
var vFreq : array [1..10] of word; vDur : array [1..10] of word;

Como as duas estruturas so iguais, podemos simplificar a declarao usando type:


type tNotas = array [1..10] of word; var vFreq, vDur : tNotas;

Um vetor dito ser um tipo estruturado e homogneo de dados, porque composto de vrias variveis, todas de um mesmo tipo. O limite inferior de um vetor no precisa ser necessariamente 1. Voc pode utilizar um valor relacionado ao contexto dos seus dados. Por exemplo, se voc quer armazenar uma tabela de correspondncia de graus Fahrenheit/Celsius na faixa de 32 a 212, voc poderia declarar um vetor assim:
type vTabFahrCels : array[32..212] of real;

Para se saber quantos elementos possui um vetor, basta calcular: Quantidade de elementos = limite superior - limite inferior + 1

Na verdade, os limites inferior e superior podem ser de outros tipos de dado (como char e boolean); para ns suficiente assumirmos que so nmeros.

10 - LISTAS NUMERADAS: VETORES E MATRIZES

185

O vetor acima possui 212 - 32 + 1 = 181 elementos. Veja outros exemplos de declarao de vetores:
type Palavras : array[1..100] of string[20]; Texto : array[1..5000] of char; Tela : array[1..25] of string[80]; Notas : array[1..50] of real; Passou : array[1..50] of boolean; PrecoProduto : array[1000..9999] of real;

Exerccio 9.1 - Vetores Assinale V ou F: ( ) Todos os elementos de um vetor Pascal so do mesmo tipo de dado. ( ) O nome que identifica um vetor deve seguir as regras para identificadores Pascal. ( ) Um vetor dito ser homogneo porque todos os seus elementos so do mesmo tipo de dado. ( ) Um vetor no pode ter limite superior negativo. Exerccio 9.2 - Declarao de vetores Escreva uma seo var declarando vetores apropriados para representar: a) 500 nmeros aleatrios na faixa de 0 a 100. b) Tabela de graus Celsius/Fahrenheit desde o ponto de fuso at o ponto de ebulio da gua, em incrementos unitrios. c) d) e) f) g) Altura em centmetros atingida por uma pessoa, em cada e todo aniversrio. Linhas de texto correspondentes a uma pgina. Tabela de preos de um comerciante, que codificou seus produtos na faixa de 100 a 999. Cadeias lidas e j processadas, em um programa que mostra strings invertidas. Pares de coordenadas (X,Y) indicando a seqncia de pontos de um grfico.

.9.3. Operaes com vetores


Quando quisermos referenciar (atribuir ou recuperar o valor) de um elemento, devemos informar o nome do vetor e a posio do elemento desejado entre colchetes. Se for o primeiro, escrevemos vFreq[1] (pronuncia-se vFreq de 1); o dcimo vFreq[10]. O nmero entre colchetes, que indica a posio desejada, chamado subscrito ou ndice. Exemplos:

186

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

vFreq[4] := 100; Write(vFreq[4]);

{atribui o valor 100 ao elemento na posio 4 do vetor vFreq} {recupera o valor do elemento na posio 4 no vetor vFreq e mostra-o na tela}

Write(vFreq[Pos]); {recupera o valor de Pos, recupera o valor do elemento de vFreq correspondente ao valor de Pos e mostra-o na tela}

Tenha em mente que um elemento de um vetor uma varivel semelhante s outras, podendo sofrer atribuio, ser passado como parmetro ou participar como operando em expresses, desde que voc indique qual o elemento. Outros exemplos de referncias vlidas a elementos de vetores:
vFreq[Pos] := N; vFreq[Pos] := vFreq[Pos+1]; vFreq[Pos+1] := vFreq[Pos+2]; v[1] := v[ v[2] ];

A forma de referenciar elementos de vetores idntica maneira de referenciar caracteres especficos de uma string; na verdade, strings so vetores do tipo char! Vejamos um pequeno exemplo inicial. Prtica 9.3 Vetores a) Digite o programa abaixo.

10 - LISTAS NUMERADAS: VETORES E MATRIZES

187

PROGRAM MaiordeTres;
{l trs nmeros inteiros (diferentes), calcula e mostra o maior e a respectiva ordem em que foi lido}

uses CRT; type tNumeros = array[1..3] of integer; var vNum : tNumeros; PosMaior : byte; begin Writeln('Programa para identificar o maior dentre trs' + ' nmeros inteiros diferentes'); Write('Entre o primeiro nmero: '); Readln(vNum[1]); Write('Entre o segundo nmero: '); Readln(vNum[2]); Write('Entre o terceiro nmero: '); Readln(vNum[3]); if (vNum[1] > vNum[2]) and (vNum[1] > vNum[3]) then PosMaior := 1 else if vNum[2] > vNum[3] then PosMaior := 2 else PosMaior := 3; Writeln('O maior nmero foi ', vNum[PosMaior], ' na posio ', PosMaior); ReadKey; end.
ClrScr;

b) Execute-o com o debugger at o primeiro Readln. Entre na janela Watches a expresso vNum[1], para ver o primeiro elemento do vetor. Execute o Readln e observe a janela Watches. Faa o mesmo para os demais elementos. c) Para ver todo o vetor, entre na janela Watches apenas o nome dele, vNum. d) Teste o programa para as seguintes situaes: - maior o primeiro nmero lido. - maior o segundo. - maior o terceiro. Prtica 9.4 Treinando referncias a vetores Determinar manualmente os valores de X impressos pelo programa abaixo. Depois test-lo e comparar os resultados.

188

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM PraticaVetores; type tVet = array[1..5] of byte; var V : tVet; X : real; I : byte; begin V[1] X := X := X := I := X := X := end. := 2; V[2] := 4; V[3] := 1; V[4] := 3; V[5] := 5; V[1] + V[5]; Writeln(X); V[2] - V[5]; Writeln(X); V[4] * V[1] - X; Writeln(X); 4; V[ V[I] ]; Writeln(X); V[ V[I] - 1] / V[ V[3] ]; Writeln(X);

Exerccio 9.5 - Reviso Assinale V ou F: ( ) Um elemento de um vetor pode participar como operando em expresses. ( ) Para referenciar um elemento de um vetor necessrio indicar o nome do vetor e o subscrito. ( ) Se o subscrito de um elemento de um vetor for uma expresso aritmtica, esta ser avaliada antes que o vetor seja acessado. ( ) Um elemento de um vetor pode ser usado em instrues Readln, mas somente se o tipo de dado do vetor for numrico. Prtica 9.6 Erros de compilao com vetores Tente compilar o programa acima com as seguintes modificaes (uma de cada vez): a) b) c) d) e) f) g) h) i) retire a palavra array retire o of retire o limite inferior na declarao do vetor idem, limite superior idem, retire o ponto-ponto (..) idem, retire a palavra integer inclua uma referncia a V[0] idem, V[6] use para o limite superior um nmero real (por exemplo, array [1..5.2])

Prtica 9.7 ExemploVetor a) Digite o programa ExemploVetor. Execute-o com o debugger e abra a janela Watch, incluindo nela vFreq e vFreq[1].

10 - LISTAS NUMERADAS: VETORES E MATRIZES

189

PROGRAM ExemploVetor; const cMaxNotas = 10; type tNotas = array [1..cMaxNotas] of word; var vFreq, vDur : tNotas; begin vFreq[1] := 400; vDur[1] := 200; Sound(vFreq[1]); {recupera} Delay(vDur[1]); NoSound; end.

b) Altere o programa, incluindo atribuies de valores variados aos elementos 2 e 3 de cada vetor. Inclua tambm as instrues para tocar os sons. Teste. c) Agora altere o programa de forma que ele continue atribuindo os mesmos valores aos elementos 1, 2 e 3 mas execute a nota de uma posio informada pelo teclado. Se for informado 2, por exemplo, o programa faz soar a freqncia de vFreq[2] com a durao vDur[2]. d) No programa acima, a referncia vFreq[11] seria invlida, porque o tamanho mximo do vetor 10 e a numerao de 1 a 10. Pelo mesmo motivo, vFreq[0] tambm seria invlida. Para conferir isso, inclua no programa ExemploVetor atribuies para posies abaixo do limite inferior e acima do limite superior e tente compilar.

.9.4. Processando todo um vetor


Quando voc precisa processar todos os elementos de um vetor, e no sabe quantos elementos de um vetor sero usados, deve ento usar repeat ou while. No trecho abaixo, a leitura deve parar quando for digitado zero, mas tambm devemos evitar que o limite do vetor seja ultrapassado:
Pos := 1; repeat Readln(vFreq[I]); Pos := Pos + 1 until (I > MaxNota) or (vFreq[I] := 0)

Se voc sabe qual a ltima posio, o comando for o ideal. Veja alguns exemplos para o vetor de freqncias, supondo que a posio do ltimo elemento indicada pela varivel Pos:
for I := 1 to Pos do {escolha um} vfreq[I] := 0; {para inicializar} {ou} {ou} Write(vFreq[I]); {para mostrar}

vfreq[I] := 100 + Random[900];{para

preencher com um nmero aleatrio de 100 a 1000}

Declarando o tamanho do vetor como uma constante No Pascal o tamanho de um vetor (e conseqentemente a memria utilizada para armazen-lo) definido em tempo de compilao do programa, e no pode ser alterado. Por isso, deve-se ter cuidado para defini-lo de forma a atender os objetivos do programa sem consumo desnecessrio de memria. Uma forma conveniente de declarar os limites de um vetor definindo constantes, como em:

190

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

const

MaxDisc = 100;

{quantidade mxima de disciplinas}

var NomesDisc : array[1..MaxDisc] of string[20]; Notas : array[1..MaxDisc] of real; Dessa forma voc mantm a quantidade de elementos do vetor em um s lugar do programa, e pode modific-la, para correo ou otimizao, sem ter que procurar cada comando que faa referncia ao tamanho. Os trechos de programa abaixo utilizam a declarao:
const MaxNotas = 10; var Notas : array [1..MaxNotas] of real;

Por exemplo, para ler vrias notas para o vetor:


for I := 1 to MaxNotas do begin Write ('Entre nota ', I, ' Readln(Nota[I]); end;

');

Para mostrar na tela todos os elementos de um vetor, um em cada linha:


for I := 1 to MaxNotas do Writeln(Notas[I]);

Para achar a maior nota:


MaiorNota := 0; for I := 1 to MaxNotas do if Notas[I] > MaiorNota then MaiorNota := Notas[I];

Para preencher um vetor de 100 elementos com inteiros aleatrios, na faixa de 0 a 999:
Randomize; {inicializa gerador de nmeros aleatrios} for I := 1 to 100 do Vet[I] := Random(1000);

Para pesquisar uma determinada nota (neste caso, sem o uso do for):
Readln(NotaDesejada); I := 0; repeat I := I + 1 until (Notas[I] = NotaDesejada) or (I > MaxNotas); if I <=MaxNotas then Writeln('Encontrada na posio ', I) else Writeln('Nota no encontrada');

No Turbo Pascal funes no podem retornar vetores.

Exemplo 9.8 Cadeias espelhadas Faa um programa que leia cadeias (qualquer quantidade, limitada a 20) de at 39 caracteres e mostre-as espelhadas no centro da tela, como no exemplo:

10 - LISTAS NUMERADAS: VETORES E MATRIZES

191

Primeira ariemirP Segunda adnugeS Terceira ariecreT ...

Definimos a estrutura bsica do programa assim:


"Ler lista de cadeias, lembrando a quantidade digitada" Para "cada cadeia na lista", faa "Posicione cursor para mostrar a cadeia normal" "Mostre cadeia normal" "Posicione cursor para mostrar a cadeia invertida" "Inverta e mostre cadeia" fim

A lista um vetor com 20 elementos, sendo string o tipo de dado de cada elemento. Uma varivel armazenar a quantidade de cadeias digitadas, j que o vetor pode no ser completamente preenchido. Precisaremos tambm de uma varivel para a linha, j que cada cadeia ser mostrada em uma linha diferente. Para inverter uma cadeia usamos uma funo j vista. Estude os demais detalhes no programa:

PROGRAM EspelhaCadeias; uses CRT; const MaxQtCad = 20; type Str39 = string[39]; tVetCad = array[1..MaxQtCad] of str39; FUNCTION InverteCad (Cad : string) : string; var Ap : byte; CadInv : string; begin CadInv := ''; for Ap := Length(Cad) downto 1 do CadInv := CadInv + Cad[Ap]; InverteCad := CadInv; end; var I, QtCad, Linha : byte; vCad : tVetCad;

192

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

begin {l e armazena as cadeias} ClrScr; Writeln('Mostra cadeias espelhadas na tela'); Writeln; I := 0; repeat I := I + 1; Write('Cadeia ', I, ' : '); Readln(vCad[I]); until (vCad[I] = '') or (I = MaxQtCad); {Lembra a quantidade de cadeias digitadas} if vCad[I] = '' then QtCad := I - 1 else QtCad := I; {limpa a tela e mostra as cadeias normais e espelhadas} ClrScr; Linha := 1; for I := 1 to QtCad do begin {Posiciona cursor para mostrar a cadeia normal, de forma que o ltimo caractere esteja na coluna 39} GotoXY(39 - Length(vCad[I]), Linha); Write(vCad[I]); {Inverte e mostra a cadeia invertida a partir da coluna 41} GotoXY(41, Linha); Write(InverteCad(vCad[I])); Linha := Linha + 1 end; end.

O programa tem duas telas de sada distintas: a primeira, de digitao das cadeias, e a segunda, em que so mostradas as cadeias espelhadas. Veja a seguir uma amostra da execuo.
Mostra cadeias espelhadas na tela Cadeia Cadeia Cadeia Cadeia 1 2 3 4 : Em terra de cego, : Quem tem um olho : Anda vendo coisas... :

Em terra de cego, ,ogec ed arret mE Quem tem um olho ohlo mu met meuQ Anda vendo coisas... ...sasioc odnev adnA

Prtica 9.9 EspelhaCadeias Inclua no programa EspelhaCadeias uma repetio para que, aps mostrar as cadeias espelhadas, ele pergunte ao usurio se deseja repetir e, se a resposta por positiva, volte para ler novamente outras cadeias. Prtica 9.10 - Vetores com comandos de repetio O programa TocaVetor abaixo implementa a especificao do incio do texto. Teste o programa usando as seis notas do Parabns (pg. 74)

10 - LISTAS NUMERADAS: VETORES E MATRIZES

193

PROGRAM TocaVetor; {l vrias freqncias e duraes para um vetor e depois "toca" as notas na seqncia} uses CRT; const cMaxNotas = 10; type tNotas = array [1..cMaxNotas] of word; var vFreq, vDur : tNotas; Pos, I : byte; begin ClrScr; {leitura das notas} Pos := 0; repeat Pos := Pos + 1; Write('Freqncia ', Pos, ': '); Readln(vFreq[Pos]); Write('Duraao ', Pos, ': '); Readln(vDur[Pos]); until (vFreq[Pos] = 0) or (vDur[Pos] = 0) or(Pos > cMaxNotas); {toca notas no vetor} for I := 1 to Pos - 1 do begin Sound(vFreq[I]); Delay(vDur[I]); NoSound; end; end.

Note em particular no programa acima: H uma varivel (Pos) para controlar a posio de insero nos vetores. Ela sempre aponta para a prxima posio livre. Na primeira parte, a leitura dos valores, foi usado um repeat, j que no se sabe quantas notas o usurio ir entrar. J na segunda parte, sendo conhecida a quantidade de pares completos lidos (Pos 1), usou-se for. A repetio da leitura termina se um dos valores lidos foi zero ou se foi atingido o tamanho mximo do vetor. Cada vez que feita a insero de um par completo freqncia/durao, a varivel Pos incrementada, para apontar para a prxima posio do vetor. Especificao 9.11 - Msica aleatria Faa um programa com os mesmos vetores do programa TocaVetor que, ao invs de ler os valores do teclado, e usando um comando FOR, sorteia as 10 freqncias na faixa de 300 a 3000 [300 + Random(2700)] e as 10 duraes na faixa de 20 a 200 [20 + Random(180)]. A cada execuo uma msica diferente! Lembre-se de chamar a instruo Randomize antes de comear o sorteio. Prtica 9.12 Outros vetores Faa um programa de teste e tente compilar as seguintes declaraes de vetores. Assinale as vlidas:

194

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

a) b) c) d) e) f) g) h) i)

type type type type type type type type type

tStringGrande = array [1..1000] of char; tTabFahreneitCelsius = array [32..212] of real; tGraus = array [-360..360] of real; tProdutos = array [1000..9999] of string[4]; tSimNao = array [1..20] of boolean; tTextoLongo = array [-10000000..10000000] of char; tSubFaixa = array [1..10] of (1..6); tNota = (0..10) tNotas = array [1..50] of tNota;

Especificao 9.13 Mdia Escrever um programa que leia 20 nmeros inteiros para um vetor e calcule a mdia dos valores. Especificao 9.14 Mdia v2 Altere o programa anterior para que leia at 20 nmeros inteiros para um vetor e calcule a mdia dos valores (declare uma varivel para controlar quantos nmeros foram lidos). Especificao 9.15 Maior e menor Escrever um programa que preencha um vetor de 100 elementos com valores inteiros aleatrios, e identifique o maior e o menor nmero gerados, e respectivas posies. Especificao 9.16 Tabela de temperatura Implementar um programa que monta uma tabela de graus Celsius/Fahrenheit desde o ponto de fuso at o ponto de ebulio da gua, em incrementos unitrios. Aps so oferecidas opes para o usurio ver na tela ou imprimir. Especificao 9.17 Pesquisa notas Elaborar programa com opes para: ler 10 notas de 0 a 10, pesquisar se uma nota existe no vetor e mostrar o contedo do vetor. Na leitura, rejeitar notas fora da faixa vlida. Especificao 9.18 Nome do dia Construa um programa que l um nmero de 1 a 7 e informa, usando vetor, o dia da semana correspondente, sendo domingo o dia de nmero 1. Se o nmero estiver fora da faixa vlida, mostrada uma mensagem de erro. Declare uma funo que recebe o dia e retorna o nome do dia. O Turbo Pascal permite declarar constantes tipadas, isto , com tipo tambm declarado. Isto til para inicializar vetores que contm valores constantes. Por exemplo, para a especificao acima: const Dias : array [1..7] of string[10] = ('Domingo', 'Segunda', 'Tera', 'Quarta', 'Quinta', 'Sexta', 'Sbado'); Especificao 9.19 Nome do ms Escrever uma funo que recebe nmero do ms e retorna seu nome por extenso. Inseri-la em um unit juntamente com a funo da especificao anterior. Especificao 9.20 Alunos e notas Implemente um programa que l uma lista de pares nomes de aluno/notas. Depois so mostrados na tela os nomes e as notas, juntamente com a quantidade de alunos e a mdia das notas.

10 - LISTAS NUMERADAS: VETORES E MATRIZES

195

Especificao 9.21 Troco Implemente um programa que resolve o problema do troco: dado um valor de uma venda, um valor pago e um estoque de notas e moedas (todos os possveis), calcular o troco e as notas ou moedas e respectivas quantidades que devem ser entregues ao cliente. Procure estruturas de dados que permitam solues mais simples, como por exemplo um vetor com o valor de cada nota ou moeda, em ordem decrescente de valor. Especificao 9.22 Palavras grandes Faa um programa que l uma cadeia de at 10 caracteres e a mostra na tela com letras grandes. Cada letra formada por uma matriz 8x8, com algum caractere nas posies adequadas de forma a compor o desenho de cada letra (cada caractere como se fosse um pixel - veja sugesto abaixo). Para separar uma letra da outra, quando mostradas na tela, voc pode deixar em branco uma linha e uma coluna de cada letra, na prpria matriz. *

* * Especificao 9.23 Sena

* * * * * * *

* *

* *

* *

Faa um programa que l apostas da sena, os nmeros sorteados e apresente os resultados obtidos pelo apostador: senas, quinas e quadras. Especificao 9.24 Codificao de preo Certas lojas usam (ou pelo menos usavam) um sistema de codificao de preos associando os dez dgitos palavra PERNAMBUCO. Implemente um programa que l um preo e mostra-o codificado, ou l um cdigo e mostra o preo. Especificao 9.25 Maior e menor Escrever um programa com quatro opes (implementadas atravs de instrues declaradas): preencher um vetor de 10 elementos com valores inteiros aleatrios, mostrar o contedo do vetor, identificar o maior e o menor nmero gerados, e respectivas posies.

.9.5. Registros
Como vimos, um elemento de um vetor pode ser apenas de um tipo de dado. Em algumas situaes, isto pode ser inconveniente. Suponha que uma especificao pede para armazenar nomes de disciplinas e respectivas notas. Sem algum outro recurso, precisaramos declarar um vetor de cadeias para as disciplinas e outro, de reais, para as notas. O Pascal permite uma soluo elegante para este inconveniente, por meio da declarao de vrios dados em um nico tipo de dado: o registro. Um registro um agregado de variveis, de tipos de dados distintos, em um nico tipo de dado, que por isto chamado de estruturado. Podemos usar registros isoladamente, combinados com vetores e tambm para usar em arquivos. Um registro declarado atravs da palavra reservada record, seguida das declaraes das variveis que o compem, e terminando com end. Tipicamente efetua-se a declarao em uma seo

196

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

type, embora ela possa ocorrer diretamente na seo de variveis. Veja os exemplos de declarao de registros e de variveis:
type tData = record Dia, Mes : byte; Ano : integer; end; tNota = record NomeDisciplina : string[15]; ValorNota : real; end; tCoordenadas = record X, Y : byte end; tPessoa = record Nome : string[30]; Endereco : string[50]; DataNasc : tData; Fone : string[10]; E-mail : string[30]; end; var PosicaoTela : tCoordenadas; Cliente : tPessoa;

Observe na ltima declarao da seo type como um registro pode ser composto de outros registros: o tipo tPessoa contm o campo DataNasc, que por sua vez tambm um registro, composto dos campos Dia, Mes e Ano. Referncias a campos - Para atribuir a ou recuperar valores de campos, preciso indicar tudo o que for preciso para o compilador identificar o campo sem ambigidade: o nome da varivel e o nome do campo, separados por um ponto. Para simplificar as referncias a campos, podemos usar a declarao With...do, na qual indicamos o nome do registro que ser referenciado. Dentro do escopo do With, podemos escrever somente o nome dos campos. Para exemplificar, primeiro declaramos um registro com nome de disciplina e valor da respectiva nota. Depois definimos um vetor com capacidade de armazenar at 20 registros de notas. Finalmente, declaramos um registro para armazenar informaes sobre alunos, contendo um nome e uma lista de notas. Observe no bloco de cdigo abaixo as vrias possibilidades de referncia a campos, incluindo declaraes With.
PROGRAM ExemplosReferenciasACampos; type tNota = record NomeDisciplina : string[15]; ValorNota : real; end; tVetNotas = array[1..20] of tNota; tAluno = record Nome : string[30]; Notas : tVetNotas; end; var vAlunos : array[1..50] of tAluno;

10 - LISTAS NUMERADAS: VETORES E MATRIZES

197

begin {referncias normais a campos de registros} vAlunos[1].Nome := 'Adalberto'; vAlunos[1].Notas[1].NomeDisciplina := 'Portugus'; vAlunos[1].Notas[1].ValorNota := 7.5; vAlunos[1].Notas[2].NomeDisciplina := 'Ingls'; vAlunos[1].Notas[2].ValorNota := 8; {forma simplificada de referncia a campos usando With} With vAlunos[1] do begin Nome := 'Adalberto'; Notas[1].NomeDisciplina := 'Portugus'; Notas[1].ValorNota := 7.5; With Notas[2] do begin NomeDisciplina := 'Ingls'; ValorNota := 8; end; end; end.

Podemos aplicar o recurso de declarar registros no programa que toca msicas. Ao invs de declarar dois vetores, precisamos de apenas um:
type tNota = record Freq, Dur : word; end; tMusica = array [1..10] of tNota;

Veja no quadro como fica o programa TocaVetor usando essas declaraes.


PROGRAM TocaVetor_v2; uses CRT; const cMaxNotas = 10; type tNota = record Freq, Dur : word; end; tMusica = array [1..cMaxNotas] of tNota; var vMusica Pos, I : tMusica; : byte;

begin ClrScr; Pos := 0; repeat {leitura das notas} Pos := Pos + 1; Write('Freqncia ', Pos, ': '); Readln(vMusica[Pos].Freq); Write('Durao ', Pos, ': '); Readln(vMusica[Pos].Dur); until (vMusica[Pos].Freq = 0) or (vMusica[Pos].Dur = 0) or (Pos > cMaxNotas); {toca notas no vetor} for I := 1 to Pos - 1 do begin with vMusica[I] do begin Sound(Freq); Delay(Dur); NoSound; end; end; end.

198

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Prtica 9.26 TocaVetor_v2 a) Digite e teste-o. b) Altere o programa TocaVetor_v2 para usar with tambm no bloco de leitura Exerccio 9.27 - Declarao de registros Declare registros e vetores para representar: a) Altura em centmetros e peso em kg com uma casa decimal, atingidos por uma pessoa, em cada e todo aniversrio. b) c) Pares de coordenadas (X,Y) indicando a seqncia de pontos de um grfico Lista de arquivos, contendo nome, extenso, tamanho em bytes, data e hora.

d) Salrios recebido em um ano por um funcionrio, incluindo valores bruto e lquido, INSS e IRPF. Especificao 9.28 Soma em vetor 1 Escrever um programa que, aps preencher dois vetores com nmeros inteiros aleatrios, soma os valores dos elementos correspondentes de dois vetores, armazenando o resultado num terceiro vetor. Especificao 9.29 Soma em vetor 2 Elabore um programa semelhante ao anterior, exceto que, em apenas um vetor, soma os valores de dois campos e armazena o resultado em um terceiro campo de um registro. Especificao 9.30 Validao de senha Implementar um programa que l um nome e uma senha (entre 4 e 8 caracteres) e verifica e o usurio est autorizado ou no. Para essa verificao, o programa mantm uma lista de nomes e respectivas senhas. O programa mostra mensagens de erro se o nome ou a senha estiverem incorretos. So permitidas at 3 tentativas. Especificao 9.31 Validao de senha v2 Faa um programa semelhante ao anterior, mas que apresenta um menu com opes para: incluir nomes e senhas, ler e validar nome e senha, zerar vetor de senhas, terminar. Especificao 9.32 Mdia ponderada Escrever um programa que calcula mdias ponderadas para uma quantidade de fatores de at 15. O programa l vrios pares [nmero, peso] at que seja lido um nmero negativo. calculada ento a mdia, somando-se os produtos de cada nmero por seu peso e dividindo-se o resultado pela soma dos pesos.

.9.6. Matrizes
Um professor quer fazer um programa que armazene notas de alunos para cada disciplina que leciona e mostre algumas informaes. O que ele deseja uma tabela com a forma:

10 - LISTAS NUMERADAS: VETORES E MATRIZES

199

Aluno/Disciplina Gilberto Patrcia Simone

IPD 7.5 4 8

LP1 8 4.5 10

Bancos de dados 8.5 6 9.5

Qual ser a melhor estrutura de dados para armazenar esta tabela? O que o professor precisa de uma extenso do conceito de vetores, chamada matriz. Ao invs de apenas uma dimenso, como os vetores, matrizes so listas multidimensionais; no exemplo acima, a estrutura adequada uma matriz de duas dimenses. As diferenas bsicas entre vetores e matrizes so: Na declarao, devemos informar a faixa de subscritos para cada dimenso:
var Mat := array [1..10, 1..20, 1..5] of byte;

Ao acessar um elemento de uma matriz, devemos informar o subscrito para cada dimenso:
Mat[1, 11, 2] := 77; Readln( Mat[9, 7, 1] ); Writeln( Mat[2, 5, 5] );

Exemplo 9.33 - Ache a careta Elaborar um programa que preenche uma rea da tela (15x15) com caracteres aleatrios e esconde algum caractere ASCII (como o 1, uma careta) em uma posio aleatria, para o usurio descobrir onde est. Antes de preencher a tela, monte-a em uma matriz com os cdigos ASCII. Use constantes para definir a rea da tela que ser usada e o cdigo do caractere a esconder. Note que para a soluo no precisamos estritamente usar uma matriz, mas fazer isso proporciona flexibilidade de incorporao de novas caractersticas. Veja a seguir o programa AcheNaTela, com exemplo de uma tela gerada (os caracteres podem no ser exatamente os mesmos, devidos a diferenas nas pginas de cdigo do sistema operacional).

200

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

++++_+ ++___+_+ -_+-++ +++++_-+ ++_-_+++_ _+--_+ n+_++_+_ -+_- -__+_+__ _+___+ +___+_+ ___+_____ ____++ +_+__-_++--n_+_+___ Ache o !

PROGRAM AcheNaTela; {Esconde uma careta na tela preenchida com caracteres aleatrios, para a pessoa descobrir onde est} uses CRT; const cMaxLin = 15; cMaxCol = 15; cCarEscondido = 1; var vTela : array[1..cMaxLin,1..cMaxCol] of byte; L, C : byte;

begin {Preenche a matriz com caracteres aleatrios na faixa ASCII superior a 127} Randomize; for L := 1 to cMaxLin do for C := 1 to cMaxCol do vTela[L,C] := 128 + Random(126); {Sorteia posio e pe a careta} vTela[1+Random(cMaxLin-1),1+Random(cMaxCol-1)] := cCarEscondido; {transpe para a tela} ClrScr; for L := 1 to cMaxLin do for C := 1 to cMaxCol do begin GotoXY(C,L); Write(Chr(vTela[L,C])); end; GotoXY(1, cMaxLin+2); Write('Ache o ', chr(cCarEscondido),'!'); ReadKey; end.

Exemplo 9.34 - Rifa Veja agora um exemplo de como o comportamento de um vetor de strings o mesmo de uma matriz. Uma rifa sorteada com base nos nmeros da Loteria Federal da seguinte maneira: o primeiro prmio formado obtendo-se o primeiro dgito de cada prmio. O segundo obtido atravs dos

10 - LISTAS NUMERADAS: VETORES E MATRIZES

201

segundos dgitos, e assim por diante. Por exemplo, suponha que os nmeros da Loteria Federal so: 1 - 45.698 2 - 65.788 3 - 01.214 4 - 37.840 5 - 77.430 Os prmios da rifa sero 46.037, 55.177, etc. A estrutura do programa simples: ler os nmeros sorteados na loteria, identificar os nmeros premiados na rifa, mostrar os nmeros premiados na tela. Portanto, vamos nos concentrar no passo "identificar os nmeros premiados" e elaborar um algoritmo. A escolha da estrutura de dados aqui a chave: apesar de os dados serem nmeros, represent-los como strings torna mais fcil a soluo; teremos um vetor de strings para os prmios da loteria e outro para a rifa. E como strings so um tipo de vetor, estamos tratando com uma matriz 5x5. O algoritmo equivale a inverter uma matriz: o que linha vira coluna e vice-versa.
PROGRAM CalculaNumerosRifa; type tPremios = array [1..5] of string[5]; var vLot, vRifa : tPremios; Premio, Posicao : byte; PROCEDURE CalcNumRifa(var vLoteria, vRif : tPremios); {acha os nmeros premiados na rifa a partir dos nmeros premiados na rifa} begin for Premio := 1 to 5 do begin vLoteria[Premio] := ''; for Posicao := 1 to 5 do vRif[Premio] := vRif[Premio] + vLoteria[Posicao,Premio] end; end; begin {leitura dos nmeros sorteados na loteria} For Premio := 1 to 5 do begin Write('Numero ', Premio, ': '); Readln(vLot[Premio]); end; CalcNumRifa(vLot, vRifa); Writeln('Nmeros da rifa:');{mostra resultados} For Premio := 1 to 5 do Writeln(Premio, ': ',vRifa[Premio]); end.

Exerccio 9.35 - Declarao de matrizes Defina e declare em Pascal estruturas de dados apropriadas para representar a) Um texto com at 1000 caracteres

202

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

b) c) d) e) f) g) h) i)

Um texto com at 1000 linhas de 80 caracteres cada uma jogo-da-velha um tabuleiro de damas (casas, posio e cor da pedra) um tabuleiro de batalha naval um tabuleiro de xadrez todas as posies de uma tela de computador em modo texto padro (25x80) as 25 linhas da tela O jogo Campo Minado, do Windows.

j) um labirinto (paredes, localizao do tesouro e do monstro, ou outra coisa que voc inventar). Especificao 9.36 AcheNaTela com cor Altere o programa AcheNaTela para que seja sorteado e armazenado, alm do cdigo ASCII de cada caractere, a sua cor. Ao transpor a matriz para a tela, ajuste tambm a cor de cada caractere. Prtica 9.37 CalculaNumerosRifa Teste o programa CalculaNumerosRifa com os mesmos nmeros do exemplo. Especificao 9.38 Soma de matrizes Elabore um programa que l duas matrizes 2x2, efetua sua soma (elemento a elemento) em uma terceira e mostra todas as elas na tela. Especificao 9.39 Matriz inversa Elabore um programa que preenche uma matriz 5x5 com caracteres ASCII aleatrios e depois a mostra na tela com est e invertida, isto , as linhas se tornam colunas e vice-versa.

.9.7. Atividades suplementares


Exerccio 9.40 - Diferenas Descreva as diferenas entre vetores e matrizes. Exerccio 8.41 AcheNaTela v2 Descreva como o programa AcheNaTela poderia ser implementado sem a declarao de uma matriz. Especificao 9.42 Quadrado mgico Um quadrado mgico aquele dividido em linhas e colunas, com um nmero em cada posio e no qual a soma das linhas, colunas e diagonais a mesma. Por exemplo, veja um quadrado mgico de lado 3, com nmeros de 1 a 9: 8 1 6 3 5 7 4 9 2

10 - LISTAS NUMERADAS: VETORES E MATRIZES

203

Elabore um programa que identifica e mostra na tela todos os quadrados mgicos com as caractersticas acima. Analise os quadrados mostrados e verifique se h alguma diferena bsica entre eles ou se podem ser considerados os mesmo sob algum aspecto. [Dica: produza todas as combinaes possveis e verifique a soma quando completar cada quadrado. Usar um vetor de 1 a 9 (a estrutura que usei) parece ser mais simples que usar uma matriz 3x3] Especificao 9.43 Preenchimento de matriz Considerando que cada elemento de uma matriz bidimensional designado por A ij ou A(i,j), declare uma instruo que preenche cada elemento de uma matriz MxN com i+j. Faa um programa de teste que chama a funo para pelo menos 3 combinaes de M e N.

204

.10

TRABALHO FINAL

Uma das melhores formas de aprender a programar lidando com situaes novas, para as quais voc acha uma soluo onde antes pouco sabia. Fazer um programa maior uma forma de fazer isto, ao mesmo tempo em que os novos conhecimento so integrados. Por isto, voc deve fazer pelo menos um dos trabalhos indicados neste captulo. Use como inspirao a implementao descrita. E envie-me o programa para que seja includo como demonstrao nesta apostila! No imagine que um programa implementado linearmente, etapa por etapa. mais provvel que voc v e volte vrias vezes nas vrias fases, medida em que amadurece sua compreenso da especificao e do resultado final.

.10.1.Especificao
Escrever um programa para fazer estatsticas de notas de um aluno. O programa oferece opes de: entrar com nomes de disciplinas e respectivas notas, achar a maior nota, achar a menor nota e calcular a mdia das notas. Quando mostra algum resultado, o programa espera ser teclado algo para oferecer novamente o menu. O primeiro passo ler a especificao algumas vezes, e deixar que sejam formadas as primeiras impresses. Neste ponto descobrimos muitas coisas que no sabemos.

.10.2.Projeto
O programa tem um menu inicial, mencionado na especificao. Assim, a tela inicial conter as quatro opes previstas na especificao e uma outra para terminar o programa. Ela fica definida como abaixo. Note que nosso objetivo ilustrar as etapas de programao e por isto evitamos "enfeites", do tipo formatao de tela. Fique vontade para embelezar seus programas, se tiver tempo para isso.

11 - TRABALHO FINAL

205

ESTATSTICA DE NOTAS 0 - Fim 1 - Entra valores 2 - Maior nota 3 - Menor nota 4 - Media Opo: _

Quando o usurio escolher, o programa far o que for pedido abaixo do menu. Por exemplo, a entrada de valores pode ocorrer assim:
ESTATSTICA DE NOTAS

0 - Fim 1 - Entra valores 2 - Maior nota 3 - Menor nota 4 - Media Opo: 1 Tecle Enter na disciplina para terminar Nome da disciplina: Calculo Nota de Calculo : 8 Nome da disciplina: Pascal Nota de Pascal : 9.5 Nome da disciplina: TGA Nota de TGA : 7.5 Nome da disciplina: _

0 - Fim 1 - Entra 2 - Maior 3 - Menor 4 - Media Opo: 4 Media das

valores nota nota notas: 8.33

Assim que o usurio teclar Enter no nome da disciplina, limpamos a tela e reapresentamos o menu. Para as demais opes simplesmente mostrado o que foi pedido e espera-se uma tecla antes de limpar a tela e mostrar novamente o menu. Ao elaborar seus projetos, recomendo detalhar todo o programa.

.10.3.Programa-fonte
Podemos comear o programa-fonte pela sua estrutura, representada por um diagrama de blocos. Poderamos fazer refinamentos sucessivos, se quisssemos. Veja a seguir; por questes de espao, no est representada a opo de clculo da menor nota.

206

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Precisamos de uma estrutura de dados que guarde as notas: um vetor de notas e disciplinas, numerado de 1 at a quantidade mxima de notas que se espera. Para facilitar as declaraes e eventuais alteraes, declaramos a quantidade de elementos como uma constante e o tipo do vetor em uma declarao type. Cada elemento do vetor de notas ir armazenar uma nota e uma disciplina, portanto o tipo de dado ser um registro com um campo real e outro string. As declaraes sero:
const MaxNotas = 50; type str15 = string[15]; Notas = record Disc : str15; Nota : real; end; tvetNotas = array [1..cTamVet] of Notas;

Uma questo surge: quando o usurio for usar o programa, ele sempre digitar 50 disciplinas? Dificilmente. Precisamos ento controlar quantas disciplinas (e portanto notas) o usurio digitou: uma varivel, que chamaremos MaxAtual. Esta varivel servir de referncia para acessos ao vetor, ao invs da constante que indica o tamanho do vetor.
E s t a t s t ic a d e n o t a s d e a lu n o

I n ic ia liz a o

B lo c o d e c o n t r o le

in a liz a o

e n u

e le o

e it u r a n o t a s

d a s

C m

lc u lo d a a io r n o t a

C m

lc u lo d ia

d a

n t r a d a

C a lid a o m

a l c u l a M r o s t r a r C m a a l ci o u r l a r m M a i o r n o t na o t a d e n o t a s

d ia o s t r a r

A partir do diagrama de blocos, identificamos as instrues que podemos declarar. Para as aes de achar a maior nota, a menor e a mdia, como cada uma retorna apenas um valor inteiro ou real, sero trs funes. Para que sejam independentes das variveis globais, os dados de entrada so declarados como parmetros, e a sada o valor de retorno da funo. Podemos inicialmente definir somente os cabealhos:

11 - TRABALHO FINAL

207

FUNCTION PosMenor (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da menor nota} FUNCTION PosMaior (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da maior nota} FUNCTION Media (vNotas : tVetNotas; Max : byte ) : real; {retorna media das notas}

Podemos escrever cada uma conhecendo apenas o que devem fazer e as estruturas de dados escolhidas; veja a seguir. No h trabalho significativo relacionado aos algoritmos, todos foram baseados no contedo do captulo sobre vetores. Mas se fosse necessrio, desenvolveramos cada um em separado dos demais, facilitando bastante o processo.
FUNCTION PosMenor (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da menor nota} var P, S : byte; begin P := 1; for S := 2 to Max do if vNotas[S].Nota < vNotas[P].Nota then P := S; PosMenor := P end; FUNCTION PosMaior (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da maior nota} var P, S : byte; begin P := 1; for S := 2 to Max do if vNotas[S].Nota > vNotas[P].Nota then P := S; PosMaior := P end; FUNCTION Media (vNotas : tVetNotas; Max : byte ) : real; {retorna media das notas} var Soma : real; S : byte; begin Soma := 0; for S := 1 to Max do Soma := Soma + vNotas[S].Nota; Media := Soma/Max end;

.As variveis globais que precisam ser declaradas so as mesmas que devem ser passadas para as funes, mais o vetor das disciplinas e a opo. Para estrutura melhor o programa, decidimos declarar instrues tambm para a leitura da opo e entrada de notas: - Mostrar o menu, ler e retornar a opo (funo) - Ler e retornar valores das notas, disciplinas e a quantidade de notas lidas (procedimento) Podemos agora montar o programa juntando as vrias partes elaboradas em separado e codificando as partes mais simples que faltavam:

208

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

PROGRAM EstatisticaDeNotas; uses CRT; const cTamVet = 20; type str15 = string[15]; Notas = record Disc : str15; Nota : real; end; tvetNotas = array[1..cTamVet] of Notas; var N : tvetNotas; Opcao, MaxAtual, Pos : byte; FUNCTION Menu : byte; {mostra menu, l e retorna opo} var Op : byte; begin Writeln('0 - Fim'); Writeln('1 - Entra valores'); Writeln('2 - Maior nota'); Writeln('3 - Menor nota'); Writeln('4 - Media'); Write('Op: '); Readln(Op); Menu := Op; end; PROCEDURE EntraValores( var VNotas : tVetNotas; var Max : byte ); {L e retorna disciplinas, notas e quantidade} var S : byte; begin S := 0; Writeln('Tecle Enter na disciplina para terminar'); Repeat S := S + 1; With vNotas[S] do begin Write('Nome da disciplina: '); Readln(Disc); if Disc <> '' then begin Write('Nota de ',Disc , ' : '); Readln(Nota); end end; Until (vNotas[S].Disc = '') or (S = cTamVet); if S < cTamVet then Max := S - 1 else Max := S; end;

11 - TRABALHO FINAL

209

FUNCTION PosMenor (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da menor nota} var P, S : byte; begin P := 1; for S := 2 to Max do if vNotas[S].Nota < vNotas[P].Nota then P := S; PosMenor := P end; FUNCTION PosMaior (vNotas : tVetNotas; Max : byte ) : byte; {retorna subscrito da maior nota} var P, S : byte; begin P := 1; for S := 2 to Max do if vNotas[S].Nota > vNotas[P].Nota then P := S; PosMaior := P end; FUNCTION Media (vNotas : tVetNotas; Max : byte ) : real; {retorna media das notas} var Soma : real; S : byte; begin Soma := 0; for S := 1 to Max do Soma := Soma + vNotas[S].Nota; Media := Soma/Max end; {bloco de cdigo principal} begin repeat ClrScr; Opcao := Menu; case Opcao of 0 :; 1 : EntraValores(N, MaxAtual); 2 : begin Pos := PosMaior(N, MaxAtual); Write('Maior nota: ', N[Pos].Nota:5:1, ' na disciplina ', N[Pos].Disc); end; 3 : begin Pos := PosMenor(N, MaxAtual); Write('Menor nota: ', N[Pos].Nota:5:1, ' na disciplina ', N[Pos].Disc); end; 4 : Writeln('A mdia das notas : ', Media(N, MaxAtual):10:2); else Writeln('Opo invlida.'); end; ReadKey until Opcao = 0; end.

210

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Uma opo adicional para este programa seria declarar as instrues relativas a notas em uma unit. Como exerccio, inclua opes no programa para: a) Mostrar o contedo atual dos vetores de notas e disciplinas b) Dada uma disciplina, pesquisar a nota correspondente c) Dada uma nota, pesquisar se ela existe no vetor de notas e mostrar a respectiva disciplina

.10.4.Teste
Uma vez compilado o programa, deve-se test-lo, comparando os resultados obtidos com a especificao. Vamos v-la outra vez: Escrever um programa para fazer estatsticas de notas de um aluno. O programa oferece opes de: entrar com nomes de disciplinas e respectivas notas, achar a maior nota, achar a menor nota e calcular a mdia das notas. Quando mostra algum resultado, o programa espera ser teclado algo para oferecer novamente o menu. O programa pode ter erros de lgica, de controle e outros. No mnimo, o teste deve responder favoravelmente s seguintes perguntas, elaboradas com base na especificao, no projeto e no programafonte: 1) O menu contm as opes corretas? 2) O programa termina normalmente quando selecionada a respectiva opo do menu? 3) Todas as opes do menu esto sendo selecionadas? 4) A leitura das notas efetuada corretamente? As notas e disciplinas esto sendo armazenadas corretamente no vetor? 5) A maior nota encontrada e mostrada corretamente? 6) A menor nota encontrada e mostrada corretamente? 7) A mdia das notas calculada e mostrada corretamente? 8) O programa espera uma tecla aps mostrar um resultado? 9) O menu mostrado novamente aps um ciclo de seleo? Com o tempo e a experincia, os programadores desenvolvem um "feeling", uma sensao de segurana ou insegurana com relao correo de um programa. Se algo ainda o incomoda, continue testando!

.10.5.Idias para trabalhos


Ao escolher alguma das idias desta seo, certifique-se de definir uma especificao completa, adequada ao prazo disponvel, e fazer o projeto, antes da deciso final. 10.1 AcheNaTela Inclua os seguintes recursos no programa AcheNaTela (pg. 200): a) Crie um menu com as opes Configurar, Jogar, Terminar. Na opo de configurao, permita ao usurio indicar o grau de dificuldade, determinado pela rea da tela usada, e o caractere que deve ser escondido.

11 - TRABALHO FINAL

211

b) Ao jogar, oferea opes para imprimir o jogo, para mostrar onde est o caractere escondido e para jogar novamente. 10.2 Forca Implementar um programa que jogue o jogo da forca. Na tela mostrado o alfabeto, destacando as letras j tentadas. Um banco de palavras pode ser implementado em vetor ou em arquivos, permitindo ao programa sortear uma palavra. Extenses: armazenar histrico do jogador: nome, jogadas ganhas e perdidas, etc. 10.3 Controle de senhas Implemente um programa que faz um controle de senhas. Veja o projeto na figura. Os traos esquerda so os locais onde o usurio entra com os comandos de linha, o que implica em um cursor que indique a ele onde est digitando. Se quiser sofisticar e fazer um programa realmente til, veja como se lida com arquivos no Turbo Pascal e grave os dados.

CONTROLE DE SENHAS Usurio: Fulano (digite outro para mudar) _ _ _ _ _ _ LOCAL New York Times Sterling Altavista Bco do Brasil HotMail (digite nova) NOME Fulano Fulano Fulano11 C/C Fulano17 ________ SENHA 1234 1234 5678 123456 1234 _______

Comandos de linha - E: exclui A: altera Outros comandos I: imprime PgUp: acima PgDn: abaixo ESC: sai

10.4 Jogo da velha Desenvolva um programa que jogue o jogo-da-velha. Ele pode ser um monitor, que controla dois jogadores, ou pode ser inteligente, que joga contra um jogador. 10.5 Quadrado mgico Faa uma variao do programa do quadrado mgico, na pgina 202. O programa pode por exemplo editar um quadrado e verificar se est correto. Se quiser, pesquise mais sobre o assunto; vrios nmeros da revista Superinteressante exploraram bastante inmeros tipos de quadrados mgicos.

212

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

10.6 Rob Faa um programa que entende alguns comandos simples do rob, como Ande e Vire. Algo que representa o rob se move na tela em resposta aos comandos. 10.7 Palavra embaralhada Implementar um programa que, a partir de um banco de palavras, seleciona aleatoriamente uma palavra, embaralha as letras e d um tempo para o usurio adivinhar a palavra. 10.8 Combinaes de letras Implementar um programa que l uma palavra de 4 letras e gera todas as combinaes possveis das quatro letras, sem repetio. O programa deve fornecer um menu para o usurio, permitindo: - entrar nova palavra - gerar combinaes - mostrar na tela (formatadas em colunas) - imprimir (tambm em colunas) - eliminao de palavras indesejadas (por exemplo, que no existam). 10.9 Bingo Elabore um programa que faz sorteios de bingo. O programa dever oferecer opes de iniciar um sorteio, sortear um nmero e apresentar os nmeros sorteados at um determinado momento. Note que o programa no poder repetir um nmero j sorteado. 10.10 Desenho datilogrfico Implementar um programa que permite o uso de toda a tela para desenhos utilizando caracteres disponveis no teclado. 10.11 Ping-Pong Talvez voc no conhea, mas um dos primeiros videogames era um Philco monocromtico, e um dos jogos, chamado de Ping-Pong, tinha duas "raquetes" que se moviam na vertical das laterais da tela e uma "bolinha", cuja velocidade aumentava depois de algumas "raquetadas" dos jogadores. Um jogador fazia um ponto quando o adversrio deixava a bolinha passar; quem fizesse 15 pontos primeiro ganhava. Implemente esse jogo. Uma alternativa mais simples uma s raquete com um paredo. 10.12 Meteoros: o jogo Uma nave espacial, embaixo na tela, deve ultrapassar um campo de meteoros (por exemplo, se em modo texto, asteriscos), desviando-se esquerda ou direita. Se tocar em algum, ela explode. Cada "linha" de meteoros ultrapassada conta um ponto, e a velocidade dos meteoros vai aumentando, digamos, a cada 500 pontos. Implementar o jogo. Entre outras coisas, o programa dever preencher a prxima linha de meteoros, no alto da tela, e mover esta uma linha para baixo (supondo ainda que a tela estar em modo texto), alm de verificar se houve coliso. Certifique-se de ter tempo suficiente para esta implementao... 10.13 Lista de compras Elabore um programa que mantm uma lista de produtos e imprime uma relao para controle da pessoa no supermercado, por exemplo. Inclua uma opo para eliminar itens da lista a ser impressa. Para montar a lista inicial, voc pode pesquisar na Internet por um servio de delivery.

11 - TRABALHO FINAL

213

10.14 Etiquetas para cheques Faa um programa que preenche mini-etiquetas para afixar em folhas de cheque, contendo nome, endereo, telefone e RG. Provavelmente voc ter que pesquisar os comandos de movimentao do carro da impressora, para obter ajuste fino e assim manter o posicionamento correto. 10.15 Tabuada Implementar um programa para crianas que apia o aprendizado de tabuada. Entre outras coisas, o programa pode propor criana seqncias de um mesmo nmero ou aleatrias. Pode tambm mostrar nmeros em tamanho maior. Se quiser sofisticar mesmo, armazene estatsticas de erros e acertos, e faa o programa reforar os pontos fracos. 10.16 Cdigo Morse Implemente um tradutor de cdigo Morse. Pode ter opes para som, imagens ou listagens. Dizem que s a Marinha ainda usa esse cdigo, mas pode ser um bom exerccio... 10.17 Provas V ou F Elabore um programa que corrija provas contendo somente questes com respostas Verdadeiro ou Falso. O programa deve armazenar as respostas corretas para cada questo e at 50 provas com at 20 questes. Quando solicitado, o programa calcula e mostra as notas para cada aluno. Opcionalmente, o usurio pode definir um fator de correo, de forma que para cada 2 ou 3 questes erradas, uma certa seja anulada. Melhor implementar usando arquivos. .

214

APNDICE A: PERGUNTAS FREQENTES


1) Compilei e executei o meu programa no Turbo Pascal e nada aconteceu. Ele no funciona? Tecle Alt-F5 para ver a tela de sada. 2) Ao compilar, d a mensagem ; expected. Est faltando um ponto-e-vrgula no final do comando anterior posio do cursor. 3) Meu programa est em loop! Tente teclar Ctrl-Break ou Ctrl-Break-Break para interromper sua execuo. 4) Estou com um problema de compilao que no consigo solucionar. Faa as prticas. Muitas delas foram feitas para lhe preparar para esses momentos. 5) O GotoXY no funcionou. a) Voc inverteu o X e o Y. b) O X ou o Y esto fora da faixa vlida de linhas e colunas (1 a 25 e 1 a 80, em modo texto normal). 6) Ao compilar recebo uma mensagem de que no possvel gravar o arquivo. Se voc est em uma rede, possvel que no tenha autorizao para a gravao. Configure em Options/Directories o diretrio dos executveis (.exe e .tpu) para o nome DOS da sua pasta na rede ou uma pasta na qual voc possa gravar. 7) No estou conseguindo elaborar algoritmos. A apostila apresenta vrias ferramentas de pensamento para esses momentos, use-as. Procure tambm digitar e seguir programas mais complexos, para alimentar seus neurnios. E acima de tudo, no fique ansioso, se d mais tempo. (envie sua contribuio para este apndice para virgilio@tba.com.br)

215

APNDICE B: PROCEDIMENTOS E FUNES DO TURBO PASCAL *


Abaixo so listados os principais procedimentos e funes padro da Linguagem Turbo Pascal, e suas finalidades. Detalhes sobre a sintaxe, os parmetros e uso destes procedimentos/funes podem ser encontrados no help do sistema: digite o nome da instruo e tecle Ctrl-F1. As instrues assinaladas com um asterisco existem somente no Turbo Pascal para DOS.

Aritmticas
Abs ArcTan Cos Exp Frac Int Ln Pi Sin Sqr SqRt Func Func Func Func Func Func Func Func Func Func Func Retorna o valor absoluto do argumento. Retorna o arco tangente do argumento. Retorna o do argumento (argumento um ngulo em radianos). Retorna o exponencial do argumento. Retorna a parte fracionria do argumento (argumento real). Retorna a parte inteira do argumento (argumento real). Retorna o logaritmo natural do argumento. Retorna o valor da constante Pi. Retorna o seno do argumento (argumento um ngulo em radianos). Retorna o quadrado do argumento. Retorna a raiz quadrada do argumento.

Converso de Dados
Chr Ord Round Trunc Str Upcase Val Func Func Func Func Proc Func Proc Retorna o caractere da tabela ASCII correspondente a um nmero especificado. Retorna o nmero de ordem na tabela ASCII de um caractere especificado. Arredonda um nmero real para o inteiro mais prximo. Retorna a parte inteiro de um nmero real. Converte um valor numrico em uma cadeia de caracteres. Converte um caractere para a Maiscula correspondente. Converte uma cadeira de caracteres em um valor numrico.

Manipulao da tela e teclado


ClrEol ClrScr GotoXY KeyPressed ReadKey TextBackground TextColor WhereX WhereY Window Proc Proc Proc Func Func Proc Proc Func Func Proc Limpa os caracteres da posio do cursor at o fim da linha. Limpa a tela e posiciona o cursor no canto superior esquerdo. Posiciona o cursor na tela. Retorna True se uma tecla for acionada ou False caso contrrio. L um caractere de uma tecla acionada sem eco-lo na tela. Define uma cor de fundo do texto. Define uma cor do texto. Retorna a coluna em que o cursor se encontra. Retorna a linha em que o cursor se encontra. Define uma janela de texto na tela.

Instrues aplicveis a tipos de dados ordinais


Dec Inc Odd Pred Succ Proc Proc Func Func Func Decrementa uma varivel. Incrementa uma varivel. Testa se o argumento impar. Retorna o predecessor do argumento. Retorna o sucessor do argumento.

Manipulao de cadeias de caracteres


Concat Copy Delete
*

Func Func Proc

Concatena uma seqncia de cadeias. Retorna uma subcadeia de uma cadeia. Exclui uma subcadeia de uma cadeia.

Cortesia do Prof. Vicente P. Teixeira.

216

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

FillChar Insert Length Pos

Proc Proc Func Func

Preenche uma varivel com uma quantidade indicada de um caractere ou byte. Insere uma subcadeia em uma cadeia. Retorna o tamanho dinmico (quantidade de caracteres) de uma cadeia. Retorna a posio de uma subcadeia em uma cadeia.

Manipulao de Arquivos
Assign BlockRead BlockWrite ChDir Close Eof Erase FilePos FileSize GetDir IOResult MkDir Read Rename Reset Rewrite RmDir Seek Truncate Write Proc Proc Proc Proc Proc Func Proc Func Func Proc Func Proc Proc Proc Proc Proc Proc Proc Proc Proc Atribui um nome externo para uma varivel do tipo file. L um ou mais registro de um arquivo para uma varivel. Escreve em um arquivo um ou mais registros a partir de uma varivel. Muda o diretrio corrente. Fecha um arquivo aberto. Retorna o status de fim de arquivo. Elimina um arquivo. Retorna a posio corrente do apontador de arquivo. Retorna o tamanho (quantidade de registros) de um arquivo. Retorna o diretrio corrente de um drive especificado. Retorna o status da ltima operao de I/O efetuada. Cria um subdiretrio. L o registro corrente de um arquivo para uma varivel. Renomeia um arquivo. Abre um arquivo. Cria e abre um arquivo. Remove um subdiretrio vazio. Move o apontador de um arquivo para uma posio especificada. Trunca o arquivo na posio corrente. Escreve o contedo de uma varivel em um arquivo.

Controle de Fluxo de Execuo


Exit Halt RunError Proc Proc Proc Sai do bloco de cdigo em execuo. Encerra a execuo do programa. Encerra a execuo do programa e gera um erro de tempo de execuo.

Alocao dinmica de memria


Dispose FreeMem GetMem MaxAvail MemAvail New Proc Proc Proc Func Func Proc Libera o espao reservado para uma varivel dinmica. Libera o espao reservado para uma varivel dinmica de um dado tamanho. Cria uma varivel dinmica de um dado tamanho e pe seu endereo num ponteiro. Retorna o tamanho do maior bloco de memria contgua disponvel. Retorna a quantidade total de memria disponvel. Cria uma varivel dinmica e pe seu endereo num ponteiro.

Diversas
Delay GetDate GetTime NoSound* Random Randomize Sound* Func Proc Proc Proc Func Proc Proc Faz o processador gastar uma quantidade de milissegundos especificada. Retorna a data corrente do Sistema Operacional. Retorna a hora corrente do Sistema Operacional Desliga o alto-falante interno do processador. Retorna um nmero aleatrio entre 0 e o argumento.. Inicializa o gerador interno com um nmero aleatrio (obtido do relgio do sistema). Liga o alto-falante interno com a freqncia (em Hz) passada como argumento.

217

APNDICE C: FERRAMENTAS DE PENSAMENTO


"Se voc compreende verdadeiramente que existe um nmero infinito de possibilidades em qualquer situao dada, voc pode encontrar solues onde at agora era totalmente impossvel encontr-las." Eva Pierrakos, em O Caminho da Autotransformao.

Quem est aprendendo normalmente no est propriamente na zona de conforto, e sim muito perto de seus limites. E at que as novas habilidades se tornem naturais, espontneas e fluentes, h uma fase de transio, na qual pode haver momentos em que no se sabe precisamente o que o melhor a fazer. Dispor de boas alternativas para esses momentos pode acelerar o aprendizado, reduzir tempos e mesmo tornar mais prazeroso o aprendizado. Este apndice descreve algumas dessas alternativas, para voc usar quando for preciso ou simplesmente para fazer algo melhor.

Perguntar
"O olho dorme at que a mente o acorde com uma pergunta" (Provrbio rabe)

Uma ferramenta muito poderosa para direcionar a mente simplesmente elaborar perguntas a respeito do assunto ou objetivo em questo. Por exemplo, por meio de perguntas podemos obrigar uma pessoa a pensar no passado ou no futuro, mais genericamente ou mais especificamente. Note como posso afetar o que voc est pensando: "O que voc comeu hoje no caf da manh?" "Qual foi a experincia mais agradvel que voc vivenciou?" "Voc se ama?" ou "Quanto voc se ama, de 0 a 100"? "Voc gostou do ltimo filme que assistiu?" ou "Qual parte do ltimo filme que viu voc mais gostou?" "Como voc poderia melhorar seu rendimento escolar?" "O que voc realmente quer da vida neste momento?" Perguntar uma forma de manter a iniciativa. Se voc enviar um e-mail e quiser uma resposta, faa uma pergunta. Observe tambm como certos vendedores mantm o controle de uma conversa usando esse recurso! Como um reforo, compare a eficincia das perguntas a seguir: Ser que vai dar certo? ou O que eu posso fazer para dar certo? Ser que eu consigo? ou Qual o prximo pequeno passo que posso dar para conseguir? Sou capaz? ou O que posso aprender para facilitar atingir meu objetivo? Ser que eu nunca aprendo? ou O que j aprendi que posso aplicar neste caso?

218

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Na falta de perguntas, use meta-perguntas (perguntas sobre perguntas): Qual a melhor pergunta a ser feita agora? O que eu poderia perguntar que me tornaria mais objetivo? Que pergunta me conduziria a uma viso mais prtica e realista? Aplicaes Antes de ler um livro, assistir uma aula ou iniciar uma sesso de estudos, pergunte: o que quero com isto? Qual o meu objetivo? Qual a melhor atitude para aprender mais rapidamente? O que eu j sei deste assunto? Qual a melhor postura (fsica) para obter melhor rendimento? Outros contextos de aplicao de perguntas: ao namorar, ao descansar, ao trabalhar em equipe. Que tal perguntar Como posso obter ainda mais prazer ao...? Divirta-se!

Faa algo diferente


"Temos notado este trao peculiar aos seres humanos. Se estes descobrem alguma coisa que fazem e que no funciona, eles a repetem. Skinner tinha um grupo de alunos que havia realizado diversas pesquisas com ratos e labirintos. E algum, um dia, perguntou-lhes: "qual realmente a diferena entre um rato e um ser humano?" Bom, os comportamentistas, uma vez que no eram pessoas terrivelmente observadoras, decidiram que precisavam experimentar para descobrir. Construram um labirinto enorme em escala adequada para um humano. Pegaram um grupo controle de ratos e ensinaram-no a percorrer um labirinto pequeno atrs de queijo. Depois pegaram pessoas e ensinaram-nas a percorrer o labirinto grande atrs de notas de cinco dlares. Houve pequenas variaes nos dados e ao nvel de probabilidade de 95% - descobriram algumas diferenas significativas no nmero de tentativas ao critrio ou algo parecido. Os humanos conseguiram aprender a percorrer o labirinto um pouco melhor, um pouquinho mais depressa do que os ratos. As estatsticas realmente interessantes aconteceram quando foram efetuar a parte da extino. Removeram as notas de cinco dlares e o queijo e depois de um certo nmero de tentativas os ratos pararam de correr pelo labirinto... Os humanos contudo no pararam!.. .Ainda esto l!... De noite, eles invadem o laboratrio."
(Richard Bandler & John Grinder, "Sapos em prncipes", pg. 27)

Em situaes de impasse ou um problema aparentemente insolvel, com um "branco" imenso na mente, o que fazer? As pessoas que so bons resolvedores de problemas em computadores nem sempre so as mais inteligentes ou criativas; o que eles fazem normalmente agir algo diferente, qualquer coisa, para ver se descobrem uma pista ou informao que os faa avanar qualquer milmetro. E se o que tentaram no deu em nada (o que comum), novamente buscam algo diferente. Quando aplicada programao, essa alternativa pode significar: Buscar uma informao diferente Imaginar, acreditar que pode ser diferente. Fazer uma pergunta diferente Buscar um algoritmo diferente Usar uma instruo diferente Consultar uma ajuda diferente

APNDICE C: FERRAMENTAS DE PENSAMENTO

219

Achar as diferenas entre o esperado e o obtido Recorrer a uma pessoa diferente Aplicar um mtodo diferente De fato, j fazemos isto com freqncia: ao torcer um parafuso, por exemplo, se algo que fazemos no funciona, fazemos algo diferente: uma chave de fenda maior ou menor, mais fora, outra posio da mo, as duas mos, algo para colocar no parafuso e diminuir o atrito. Ao dirigir automveis, fazemos ajustes todo o tempo no volante (e nem notamos). Que tal fazer algo que voc nunca vez antes?

A abordagem blitz
O ser humano muito melhor aperfeioando algo existente do que criando algo do nada
Paul T. Ward

Da descrio terica para a execuo prtica vrias coisas podem mudar. O processo de desenvolver um programa ou algoritmo no , na grande maioria das vezes, uma linha reta, em que se passa de uma etapa outra em seqncia. Isso no ocorre devido somente a limitaes do programador, mas basicamente a causa principal a falta de informaes; nas fases iniciais normalmente no se dispe de todas as informaes necessrias para elaborar um produto completo. E quanto menos informaes, maior a possibilidade de serem tomadas decises que depois se revelam inadequadas. Por exemplo, descobrir que o programa est estruturado incorretamente na etapa de teste normalmente impacta significativamente o prazo previsto de implementao. O mesmo ocorre quando, j no final da codificao, se percebe que falta uma soluo importante para um aspecto importante ou algoritmo. Imagine se isso ocorrer na vspera da entrega de um trabalho! Por isso, to importante quanto uma boa descrio das etapas a serem seguidas, dispor de um bom roteiro para execut-las. Em procedimentos ou atividades executadas em etapas, voc pode aplicar a abordagem blitz. Ela consiste em se fazer uma rpida passagem inicial pelas vrias etapas, na qual o objetivo maior obter uma viso geral e preliminar, incompleta e no totalmente verificada da questo ou problema. Aps, voc faz uma segunda passagem, desta vez em direo ao produto final. Benefcios desta abordagem: Com uma viso do todo, voc identifica mais facilmente as partes cujos detalhes vo requerer maior ateno Voc tem melhor noo das conseqncias que suas decises numa etapa vo provocar em etapas posteriores Voc no perde tempo tentando fazer um produto final desde o incio, sendo que talvez no tenha todas as informaes necessrias para isso. Voc no precisa se limitar a duas passagens; de fato voc pode fazer quantas forem necessrias. Uma situao curiosa pode surgir, se em algum momento voc perceber que o desenvolvimento no est avanando: voc pode tanto voltar a uma etapa anterior quanto avanar a uma etapa posterior, para obter informaes e amadurecer o seu produto. Por exemplo: ao produzir a primeira ou segunda verso do algoritmo ou programa, passe logo para a verificao manual. Para atingir objetivos nem todos os passos precisam ser "corretos".

220

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

Voc mesmo inspirao para algoritmos


Uma das melhores fontes de inspirao para elaborar certos algoritmos seu prprio crebro: como voc faria? Talvez isso no tenha lhe ocorrido, mas seu crebro tem algoritmos. Normalmente no estamos conscientes deles, e nem precisamos, mas muitas vezes podemos ter algum acesso. Por exemplo, soletre uma palavra qualquer, digamos, "IMAGEM", enquanto procura observar como faz. Em geral o algoritmo usado para isso : "Produza uma imagem interna da palavra" "Focalize a primeira letra da palavra" enquanto "no for o fim da palavra" "pronuncie a letra focalizada" "Focalize prxima letra" fim Se no conseguir perceber, pea a algum para soletrar uma palavra e observe seus olhos. Por exemplo, suponha que voc deve elaborar um algoritmo para ordenar um conjunto de nmeros em ordem crescente. Voc pode pegar alguns palitos de tamanho variado, orden-los enquanto observa o que faz e da extrair pistas para o algoritmo. Pode ser que voc percorra todos os palitos procura do maior e tire-o do conjunto para um outro. Para os que sobraram, repete o procedimento, at que no haja mais palitos. Essas aes so pistas excelentes para a elaborao do algoritmo. Considere agora o problema de inverter uma cadeia de caracteres. Por exemplo, dada a cadeia A mente terra, torn-la arret etnem A. Pegue uma cadeia qualquer e inverta manualmente. Como voc fez? Provavelmente, seguiu os seguintes passos: "Escolha um local para escrever a cadeia invertida" "Focalize o ltimo caractere da cadeia" "Escreva o caractere" enquanto "houver caracteres no copiados" "Focalize na cadeia o prximo caractere esquerda" "Escreva o caractere focalizado direita do ltimo escrito" fim O algoritmo acima j permite obter algumas pistas: uma varivel inteira para apontar cada caractere da cadeia, uma instruo para obter um caractere apontado, outra para concatenar caracteres (no Pascal, o +), as instrues que sero repetidas. Note que pesquisar no prprio crebro nem sempre ir fornecer o algoritmo com preciso; o que buscamos so pontos de partida para idias que sero adaptadas s nossas necessidades.

221

APNDICE D: TABELA ASCII


Na tabela esto representados os cdigos dos caracteres mais usados (de 32 a 126). Para calcular cada cdigo, some o nmero da coluna do caractere com o nmero da respectiva linha. Por exemplo, o cdigo da letra T 80 + 4.

TABELA ASCII (de 32 a 126) 0 32 48 64 80 96 112 0 @ P ` p 1 ! 1 A Q a q 2 " 2 B R b r 3 # 3 C S c s 4 $ 4 D T d t 5 % 5 E U e u 6 & 6 F V f v 7 ' 7 G W g w 8 ( 8 H X h x 9 ) 9 I Y i y 10 * : J Z j z 11 + ; K [ k { 12 , < L \ l | 13 = M ] m } 14 . > N ^ n ~ 15 / ? O _ o

222

BIBLIOGRAFIA

FARRER, Harry et al. Algoritmos Estruturados. Guanabara-Koogan, 1989. _________________ Pascal Estruturado. Guanabara-Koogan, 1995. FORBELLONE, Andr Luiz V. & EBERSPCHER, Henri F. Lgica de Programao. Makron, 1993. GUIMARES, ngelo M. & LAGES, Newton A. C. Algoritmos e Estruturas de Dados. LTC, 1985.

McMENAMIN, Stephen M. & PALMER, John F. Anlise Essencial de Sistemas. Makron, 1991. MECLER, Ian & Maia, Luiz Paulo. Programao e Lgica com Turbo Pascal. Campus, 1989. MYERS, Glenford J. The Art of Software Testing. John Wiley & Sons, 1979. OBRIEN, Stephen. Turbo Pascal 6.0 Completo e Total. Makron, 1992. SCHEID, Francis. Computadores e Programao. McGraw-Hill, 1984. SCHMITZ, Eber Assis & TELES, Antonio A. S. Pascal e Tcnicas de Programao. LTC, 1986. WEISKAMP, Keith. Turbo Pascal 6.0. LTC, 1992. WIRTH, Niklaus. Programao Sistemtica em Pascal. Campus, 1987.

223

NDICE REMISSIVO
A .1.3.Algoritmo........................25 exemplo de elaborao.....140 representao......................26 Array.....................................184 Atribuio...............................84 B Blitz, abordagem...................219 Byte.........................................87 C Case......................................116 Char............................................ na memria.........................94 operaes............................93 Chr........................................103 Comentrios............................60 Compilao.............................10 ajuda para erros...................59 para disco............................59 Compilador.............................10 Const.......................................79 constantes................................... tipadas...............................194 Constantes................................... declarao...........................79 Copy.......................................96 CPF.......................................181 D .4.3.Debugger.........................66 janela Watches....................84 Decises...................................... reconhecendo....................119 Delay.......................................73 Dicas........................................... deciso..............................119 E Erros........................................... tipos....................................44 Especificao..........................31 Expresso lgica...................109 Expresses.................................. aritmticas...........................67 Expresses lgicas...................... compostas.........................112 F Ferramentas de pensamento....... faa diferente....................218 perguntas...........................217 voc e seu crebro............220 FillChar...................................93 .7.3.For..................................132 explicao.........................133 quando usar.......................134 .4.6.Funes............................75 caractersticas...................152 declaradas.........................162 matemticas........................76 G GotoXY..................................72 I If 109 Implementation.....................172 Impresso.................................... com Write...........................74 da tela de sada....................81 programa-fonte...................52 In, operador...........................112 Inc.........................................107 Indentao.............................113 Instrues.................................... tipos..................................152 Interface................................172 L Linguagem.................................. alto nvel...............................8 de mquina............................7 orientao...........................11 Pascal..................................11 tipos de instrues................9 M Matemtica.............................68 Matrizes................................198 MS-DOS..................................... comandos bsicos...............55 N NoSound.................................73 Nmeros aleatrios.................78 O Operaes...............................34 Operadores.................................. aritmticos........................109 MOD...................................69 P Parmetro.................................... por referncia....................159 Parmetros............................152 resumo..............................161 Perguntas..............................217 PIS/PASEP...........................181 Pos, funo...........................124 Precedncia de operadores.....70 Procedimento.............................. caractersticas...................152 declarao.........................153 detalhes.............................158 roteiro para declarao.....167 Programa..................................... com menu...........................36 como recuperar...................55 estrutura..............................37 execuo no Turbo Pascal. .57 o que ...................................6 projeto.................................34 tipos....................................35 Programa-fonte.......................56 compilao..........................56 viso geral...........................43 Programao............................... estratgia geral....................30 etapas..................................31 fatores de sucesso...............13 R Random...................................78 Randomize..............................78 ReadKey..................................... como funo.......................94 Readln...............................84, 85 ReadXY................................174 Registros...............................195 .7.2.Repeat............................130 explicao.........................131 Repetio.................................... perguntas...........................138 problemas.........................136 Rob........................................... elaborando algoritmos........21 histria................................16 S Sintaxe................................8, 58 cores do editor....................59 Software...................................... que voc precisa.................12 Sound......................................73 Str.........................................126 String.......................................... concatenao.......................95 obtendo um caractere..........95 operaes............................95 tamanho atual......................95 T Tabela ASCII..................94, 221 .2.6.Teste................................43 definio.............................44 diretrizes.............................45 TextColor................................74 .5.2.Tipos de dado..................86 declarando novos..............102 do Turbo Pascal..................86 .3.1.Turbo Pascal....................49

224

APRENDENDO A PROGRAMAR NA PRTICA

VIRGLIO V. VILELA

ajuda...................................53 DOS shell............................54 editor...................................50 executando..........................50 instalao............................49 Type......................................102 para registros....................196 para vetores.......................184 U .8.8.Units..............................171

estrutura............................172 inicializao......................173 Upcase....................................93 Uses........................................71 V Val........................................125 Variveis...........................26, 84 descobrindo.........................97 Vetor........................................... declarao.........................184 elemento...........................183 .9.1.Vetores...........................183

algoritmos.........................189 operaes..........................185 W .7.1.While.............................127 explicao.........................128 With......................................196 Write.......................................60 parmetros..........................64 Posio do cursor................60 Writeln....................................56

Você também pode gostar