Intro Comp

Embed Size (px)

Citation preview

Notas de Aula deAlgoritmos e Programac ao de ComputadoresFL AVIO KEIDI MIYAZAWAcom a colaborac ao deTOMASZ KOWALTOWSKIInstituto de Computac ao - UNICAMPVers ao 2001.1Estas notas de aula n ao devem ser usadas como unica fonte de estudo. O aluno deve ler outros livrosdisponveis na literatura.Nenhuma parte destas notas pode ser reproduzida, qualquer que seja a forma ou o meio, sem a permiss aodos autores.Os autores concedem a permiss ao explcita para a utilizac ao e reproduc ao deste material no contexto doensino de disciplinas regulares dos cursos de graduac ao sob a responsabilidade do Instituto de Computac ao daUNICAMP.c _Copyright 2001Instituto de Computac aoUNICAMPCaixa Postal 617613084971 CampinasSPfkm,[email protected] ario1 Introduc ao ` a Computac ao 11.1 Organizac ao do Computador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Alguns Termos T ecnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Bits e Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4 Base Bin aria, Base Decimal, ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.5Algebra Booleana. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Primeiros Programas em Pascal 92.1 Coment arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2 Identicadores e Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3 Vari aveis e Tipos B asicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.4 Comando de Atribuic ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.5 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.6 Algumas Func oes Pr e-Denidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.7 Comandos de Escrita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.8 Comandos de Leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.9 Tipos denidos pelo programador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.10 Tipos Escalares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Estrutura Condicional 273.1 Estrutura Condicional Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2 Estrutura Condicional Composta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.3 Bloco de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.4 Comando Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Estruturas de Repetic ao 324.1 Comando For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.2 Comando While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.3 Comando Repeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Desenvolvendo Programas 415.1 Simulac ao de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.2 Alinhamento de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.3 Programac ao por Etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.4 Desenvolvimento de Algoritmos Ecientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50iii5.5 Precis ao Num erica e Erros de Precis ao. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Vari aveis Compostas Homog eneas 546.1 Vetores Unidimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.2 Vetores Multidimensionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Procedimentos e Func oes 657.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.2 Passagem de Par ametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.3 Func oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.4 Escopo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727.5 Cuidados na Modularizac ao de Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778 Processamento de Cadeias de Caracteres 808.1 Letras com Ac entos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828.2 Transformac ao entre Mai usculas e Min usculas . . . . . . . . . . . . . . . . . . . . . . . . . . 838.3 Casamento de Padr oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848.4 Criptograa por Substituic oes - Cifra de C esar . . . . . . . . . . . . . . . . . . . . . . . . . . 878.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899 Vari aveis Compostas Heterog eneas - Registros 919.1 Registros Fixos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919.2 Registros Variantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949.3 Comando With . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9810Recursividade 10010.1 Projeto por Induc ao. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10010.2 Garantindo n umero nito de chamadas recursivas . . . . . . . . . . . . . . . . . . . . . . . . 10110.3 Torres de Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10210.4 Quando n ao usar recurs ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10410.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10711Algoritmos de Ordenac ao 11011.1 Algoritmo InsertionSort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11011.2 Algoritmo MergeSort e Projeto por Divis ao e Conquista . . . . . . . . . . . . . . . . . . . . . 11111.3 Algoritmo QuickSort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113iv11.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11612Passagem de func oes e procedimentos como par ametros 12012.1 Diferencas entre Borland/Turbo Pascal e Extended Pascal . . . . . . . . . . . . . . . . . . . . 12012.2 M etodo de bissec ao para encontrar razes de func oes . . . . . . . . . . . . . . . . . . . . . . 12212.3 Ordenac ao usando func oes de comparac ao. . . . . . . . . . . . . . . . . . . . . . . . . . . . 12412.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12813Arquivos 12913.1 Arquivos Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12913.2 Arquivos Bin arios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13413.3 Outras func oes e procedimentos para manipulac ao de arquivos . . . . . . . . . . . . . . . . . 13913.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14014Figuras e Gr acos 14214.1 Usando o formato PPM Portable PixMap . . . . . . . . . . . . . . . . . . . . . . . . . . . 14214.2 Retas e Crculos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14514.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14915Ponteiros 15015.1 Alocac ao Din amica de Mem oria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15315.2 Listas Ligadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15515.3 Recursividade e Tipos Recursivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15815.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16016Usando e Construindo Biblioteca de Rotinas 16216.1 Estrutura de uma unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16216.2 Usando Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16316.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165Indice Remissivo 167v vi1 Introduc ao ` a Computac ao1.1 Organizac ao do ComputadorUm computador e uma colec ao de componentes que realizam operac oes l ogicas e aritm eticas sobre um grandevolume de dados. Na gura 1 apresentamos uma organizac ao b asica em um computador seq u encial.MemriaCacheRegistradoresUnidade de ControleUnidadeLgica eAritmticaUnidade Central de ProcessamentoMemria MemriaRAMSecundriasMemriasUnidadesde SadaROMde EntradaUnidadesFigura 1: Organizac ao B asica de um Computador Seq u encial.A seguir descreveremos cada uma destas partes.Unidade de EntradaS ao os componentes que permitem a entrada de informac oes exteriores para serem pro-cessadas pelo computador. Exemplo: teclado, mouse, c amera de vdeo, etc.Unidade de SadaS ao os componentesque permitem a apresentac oes de informac oes processadaspara omeio externo. Exemplo: monitor, impressora, etc.Unidade Central de ProcessamentoTamb emconhecida como CPU(Central Processing Unit).E respons avelpela execuc ao dos programas e pelo comportamento das outras unidades no sistema.E capaz de fazercontas matem aticas e fazer decis oes simples. As principais partes da CPU s ao: a Unidade L ogica eAritm etica, Unidade de Controle e Mem orias (Registradores, Mem oria Principal (ou Mem oria RAM),Mem oria ROM e Cache).Unidade L ogica e Aritm eticaParte da CPUque realiza operac oes aritm eticas (soma, subtrac ao, multiplicac ao,divis ao, resto, troca de sinal, etc) e operac oes l ogicas (and, or, not, xor, etc).Mem oria PrincipalE usado na CPU para manter instruc oes e dados. Tamb em conhecido como Mem oriaRAM (Random Access Memory). A recuperac ao dos dados e feita atrav es de circuitos l ogicos e por isso e r apida. N ao e t ao grande, j a que depende muito da tecnologia de integrac ao destes circuitos.E umamem oria vol atil, i.e., quando o computador e desligado, todos os dados nesta mem oria se perdem.Mem oria ROMROM (Read Only Memory) e uma mem oria que cont em dados e c odigos de execuc ao quen ao podem ser alterados. Uma das aplicac oes desta mem oria e manter c odigo de execuc ao para a leiturae execuc ao de um sistema operacional.Mem oria CacheMem oriar apidaprojetadaparaguardardadosqueforamrecentementeacessados. Parabuscar um certo dado na mem oria RAM, e consideradose este pode estar na mem oria cache, e emcaso positivo a busca na mem oria RAM e interrompido e este e recuperado diretamente da mem oriacache. Tem tempo de acesso mais r apido que a mem oria RAM.Registradores Mem orias de alta velocidade ligada a operac oes de c alculos l ogicos e aritm eticos. Em geralem quantidade e tamanhos pequenos.1Unidade de ControleParte da CPU que busca na mem oria a pr oxima instruc ao e a decodica para ser exe-cutada. Dependendo da instruc ao, pode-se ter uma transfer encia do controle para a unidade l ogica earitm etica ou o envio de dados para os componentes externos ` a CPU.Mem oria Secund ariaMem oria para armazenamento a longo prazo. Os dados armazenados nesta mem orian ao s ao perdidos quando se desliga o computador. Em geral de dimens oes maiores que a Mem oriaRAM mas de acesso mais lento, j a que envolvem o uso de dispositivos mec anicos. Ex. Discos rgidos,disquetes, tas magn eticas, etc.Podemos ver que h a diversos tipos de mem orias em um computador. Cada uma destas mem orias usa tecnologiaque reete no custo, na velocidade de acesso e na quantidade de armazenamento. A seguinte ordem apresentaalgumas mem orias ordenadas, de maneira crescente, pela quantidade de armazenamento:Registrador Mem oria Cache Mem oria RAM Discos Rgidos.Esta mesma ordem apresenta o custo relativo e a velocidade de acesso de maneira decrescente.1.2 Alguns Termos T ecnicosHardwareComponentes mec anicos e eletro- eletr onicos que comp oem o computador. Parte dura do compu-tador.SoftwareSeq u encia de instruc oes e comandos que fazem o computador realizar determinada tarefa., tamb emchamados de programas de computador. Devem estar armazenados em algum tipo de mem oria.Perif ericoE qualquer componente do computador (hardware) que n ao seja a CPU. Exemplos: leitoras dedisquete, monitores, teclados, vdeo, impressoras, etc.Sistema Operacional Colec ao de programas que gerencia e aloca recursos de hardware e software. Exem-plos de tarefas que um sistema operacionalrealiza s ao: leitura de dados pelo teclado, impress ao deinformac oes no vdeo, gerenciamento da execuc ao de v arios programas pela CPU, gerenciamento damem oria principal e da mem oria secund aria para uso dos programas em execuc ao, etc. Exemplos: Li-nux, Unix, Windows98, OS2, MS-DOS, etc.Linguagem de M aquinaConjunto de instruc oes que podem ser interpretados e executados diretamente pelaCPU de um dado computador.E especca para cada computador.Linguagem Assembler (LinguagemdeBaixoNvel)Representac aodalinguagemdem aguinaatrav esdec odigos mnem onicos. Tamb em e especca de cada m aquina.Linguagem de alto nvel Linguagem que independe do conjunto de instruc oes da linguagem de m aquina docomputador. Cada instruc ao de alto nvel equivale a v arias instruc oes da linguagem de m aquina, sendoassim mais produtiva. Ex.: Pascal, C, Algol, BASIC, Lisp, Prolog, etc.CompiladorTradutorde programasescritosem uma linguagemde programac ao para programasem lin-guagem de m aquina. Uma vez que o programa foi convertido para c odigo de m aquina, este pode serexecutado independente do compilador e do programa original. Veja a gura 2.InterpretadorE um programa que executa outros programas escritos em alguma linguagem de programac ao.A execuc ao de um programa interpretado e em geral mais lenta que o programa compilado. Por outrolado, o uso de programas interpretados permite que trechos de c odigos possam ser trocados por novosfacilmente, fazendocomqueo programafontepossamudardurantesuaexecuc ao. Este e um dosgrandes motivos de se usar programas interpretados em sistemas especialistas. Duas linguagens para asquais podemos encontrar interpretadores s ao Lisp e Prolog. Veja a gura 3.AlgoritmoE a descric ao de uma seq u encia nita de ac oes para realizar alguma tarefa. Neste texto estaremosinteressadosem algoritmoscomputacionais, que descrevemuma seq u enciade ac oes que podem sertraduzidos para alguma linguagem de programac ao.2ProgramaFonteCompiladorProgramaExecutvelSistemaOperacionalCPUProgramaExecutvelSistemaOperacionalCPU(b) Execuo do Programa (a) Gerao do Programa ExecutvelFigura 2: Etapas para execuc ao de um programa compilado.ProgramaFonteInterpretadorSistemaOperacionalCPUExecuo de programa interpretadoFigura 3: Execuc ao de um programa interpretado.Um exemplo e o algoritmo de Euclides para calcular o m aximo divisor comum de dois n umeros inteirospositivos.Passo 1: Adote x = m e y= n;Passo 2: Adote r =(resto de x dividido por y);Passo 3: Adote novos valores x = y e y= r;Passo 4: Se r e diferente de 0, volte ao passo 2; sen ao pare com a resposta x.Algoritmo de EuclidesO seguinte programa apresenta uma vers ao mais estilizada deste algoritmo:Passo1: Dados:m e n.Passo2: x m.Passo3: y n.Passo4: RepitaPasso4.1: r resto(x, y);Passo4.2: x y;Passo4.3: y r;Passo4.4: At e que r = 0.Passo5: Imprima o resultado x.Algoritmo de Euclides Estilizado.Agora, compare este programa com uma vers ao escrita na linguagem Pascal.3Program Euclides;var x, y, r, m, n : integer;beginReadln(m,n);x:=m;y :=n;repeatr :=(x mod y);x:=y;y :=r;until r = 0;writeln(x);end.Implementac ao do Algoritmo de Euclides em Pascal1.3 Bits e BytesA menor unidade de informac ao usada pelo computador e o bit. Este tem atribuic oes l ogicas 0 ou 1. Cadaum destes estados pode, internamente, ser representadopor meios eletro-magn eticos(negativo/positivo, li-gado/desligado, etc).E por isso que e mais f acil para armazenar dados em formato bin ario. Assim, todos osdados do computador s ao representados de forma bin aria. Mesmo os n umeros s ao comumente representadosna base 2, em vez da base 10, e suas operac oes s ao feitas na base 2.Um conjunto de 8 bits e chamado de byte e pode ter at e28=256 congurac oes diferentes. O prin-cipal padr ao usado para representar caracteres (a,b,c,...,A,B,C,...,!,@,#,$,...) e o padr ao ASCII(American Standard Code for Information Interchange), usado na maioria dos computadores. Cada um destescaracteres e representado por um byte. A tabela 1 apresenta o c odigo bin ario e o correspondente valor decimalde alguns caracteres no padr ao ASCII: Observe que:1. As codicac oes para letras em mai usculas e min usculas s ao diferentes.2. A codicac ao de B e a codicac ao de A somado de 1; a codicac ao de C e a codicac ao de Bsomado de 1; assim por diante. Esta codicac ao permite poder comparar facilmente se um caracter vemantes do outro ou n ao. Internamente, vericar se o caracter a vem antes do b, e vericar se o n umerobin ario correspondente a a e menor que o n umero bin ario correspondente a b.3. As letras mai usculas vem antes das min usculas.4. O caracter zero 0 n ao representa o n umero zero em bin ario (o mesmo vale para os outros dgitos).5. O espaco em branco (c odigo decimal 32) tamb em e um caracter.As seguintes denominac oes s ao comumente usadas na area de inform aticanome mem oriabit 0, 1byte 8 bitskilobyte (kbyte) 210bytes (pouco mais de mil bytes (210= 1024))megabyte 220bytes (pouco mais de um milh ao de bytes)gigabyte 230bytes (pouco mais de um bilh ao de bytes)4Caracter Representac ao em ASCII Valor na base decimal.........00100000 32! 00100001 33 00100010 34# 00100011 35$ 00100100 36.........0 00110000 481 00110001 492 00110010 503 00110011 51.........A 01000001 65B 01000010 66C 01000011 67D 01000100 68.........a 01100001 97b 01100010 98c 01100011 99d 01100100 100.........Tabela 1:Atualmente, congurac oes de computador com 128 megabytes de mem oria RAM, 20 gigabytes de discorgido, disco exivel de 1,44 megabytes s ao muito comuns no mercado. Certamente esta congurac ao j a ser aconsiderada pequena dentro de um ou dois anos, devido ao contnuo avanco da tecnologia nesta area.Vejamos alguns exemplos do quanto e esta mem oria. Uma p agina de um livro, armazenada em formatoASCII, tem em torno de 50 linhas e 80 caracteres por linha. Assim, um livro de 1000 p aginas teria algo emtorno de 4.000.000 de caracteres, que poderiam ser guardados em 4 megabytes. Assim, um disco rgido de 20gigabytes poderia guardar em torno de 5.000 livros deste tipo. Isto aparenta uma quantidade bastante grandede dados. Por outro lado, a maioria das aplicac oes atuais est a fazendo uso cada vez maior de imagens, gr acose sons. Estas aplicac oes demandam muita mem oria. Por exemplo, se voc e quiser representar uma imagem detamanho 10001000 pontos (106pontos), cada ponto com uma cor entre 65000 cores possveis (dois bytespor ponto), gastaremos algo como 2 megabytes para armazenar apenas uma imagem deste tipo. A quantidadede mem oria aumenta quando armazenamos lmes, que usam em torno de 30 imagens por segundo. Apesardo uso de m etodos de compress ao sobre estes tipos de dados a necessidade de grande quantidade de mem oriaainda e crucial para muitas aplicac oes.1.4 Base Bin aria, Base Decimal, ...Como vimos, e muito mais f acil armazenar os dados na base bin aria que na base decimal. Assim, muitas dasoperac oes usadas no computador s ao feitas na base bin aria.Muito provavelmente, n os usamos a base decimal porque temos 10 dedos nas duas m aos. E se tiv essemos8 dedos em vez de 10 ? Neste caso, provavelmente estaramos usando a base octal. Bom, agora imagine quevoc e tem apenas dois dedos. Neste raciocnio, usaremos o sistema bin ario !!5Por exemplo, contando em bin ario temos os n umero0b, 1b, 10b, 11b, 100b, . . .. O primeiro n umero vale0 e cada um dos seguintes e o anterior somado de 1 (na base bin aria e claro). D a para ver que os n umeros 0e 1 t em o mesmo signicado na base bin aria e na base decimal. J a o n umero1b + 1b e igual a 10b. A somade mais uma unidade com um outro n umero bin ario pode ser feita como se faz na soma decimal, mas quandofazemos 1b + 1b obtemos 0b e temos o vai um, 1b, para ser adicionado na pr oxima coluna.Vamos lembrar o que representa o n umero 4027 na base decimal.4103+ 0 102+ 2 101+ 7 100Agora considere um n umero bin ario. O n umero 100110b no sistema bin ario representa a quantidade:1 25+ 0 24+ 0 23+ 1 22+ 1 21+ 0 20Isto nos d a o n umero32 + 4 + 2 = 38Assim o n umero 100110b no sistema bin ario e igual ao n umero 38 no sistema decimal.As operac oes aritm eticas tamb em podem ser feitas em bin ario. Por exemplo: Vamos somar o n umeroacima (100110b) com (111b).100110b+ 111b101101bAgora vamos conferir o resultado: 111b= 4 + 2 + 1 = 7. E 101101b= 32 + 8 + 4 + 1 = 45. De fato, esten umero est a correto. Em decimal seria 38 + 7 = 45.Exerccio 1.1Dado um n umero no sistema decimal, encontre uma maneira de escrev e-lo no sistema bin ario.Exerccio 1.2Como seria a multiplicac ao de dois n umeros no sistema bin ario ?Assim, em um byte (8 bits), e possvel representar os n umeros de 0 at e 255 (255 = 281).bin ario decimal00000000b000000001b100000010b200000011b300000100b4......11111110b25411111111b255Da mesma forma, em dois bytes (16 bits) e possvel representar os n umeros de 0 at e 65535 = 2161.Muitas vezes um programa (ou mesmo o pr oprio computador) tem uma estrutura para denir n umeros comsinais (se negativo ou positivo).Um exemplo disso e usar um bit para representar o sinal do n umero. Por exemplo, um n umero de 16 bitspode ter a representac ao interna com um bit para sinal e os outros 15 bits para o n umero propriamente dito.Neste exemplo, poderamos representar n umeros de (2151) at e 2151 (i.e., de 32767 at e 32767).Note que neste exemplo o n umero 0 e representado duas vezes (+0 e 0) e n ao e t ao simples se fazer somade dois n umeros diretamente. A unica vantagem e a f acilidade para detectar o sinal de um n umero.6Uma outra representac ao bastante utilizada para representar inteiros com sinal e o formato complementode dois. Para mudar o sinal de um n umero bin ario neste formato, complementamos os bits e somamos1b.Vamos apresentar um exemplo deste formato para n umeros bin arios de 3 bits.Representac ao bin aria Valor decimal011b3010b2001b1000b0111b1110b2101b3100b4Eis algumas observac oes importantes deste formato:Somando o valor1b a um n umero temos o valor seguinte. Mas voc e deve se perguntar como111b+1bacabou dando000bn ao e ? Pois bem, se consideramos que estamos representandon umeros comexatamente 3 bits, ent ao o bit mais a esquerda da soma 111b + 1b= 1000b se perde e temos 000b.Soma de dois n umeros e feita como a soma normal de dois n umeros bin arios sem sinal.E f acil detetar se um n umero e negativo. Basta ver o bit mais a esquerda.E f acil mudar um n umero de sinal. Complementamos os bits e somamos de 1b.O menor n umero e 4, o maior e 3 e o zero e representado apenas uma vez. I.e., temos a representac aode 23n umeros diferentes.E interessante observar que n umeros positivos n ao nulos que s ao pot encia de 2 s ao n umeros que t em todosos bits iguais a 0, exceto um bit. Assim, a multiplicac ao de um n umero inteirox por um inteiro positivon ao nulo que e pot encia de 2 faz apenas um deslocamento dos bits dex de algumas casas. Por exemplo, amultiplicac ao de x por 8 (23) faz o deslocamento dos bits de x de 3 casas para a esquerda.x = b1b2b3b4. . . bn4bn3bn2bn1bn23= 1 0 0 00 0 0 0 . . . 0 0 0 0 00 0 0 0 . . . 0 0 0 0 0+ 0 0 0 0 . . . 0 0 0 0 0b1b2b3b4. . . bn4bn3bn2bn1bnx23= b1b2b3b4. . . bn4bn3bn2bn1bn0 0 0Assim, muitos compiladores, ao encontrar a multiplicac ao de um inteiro por uma pot encia de 2, trocamesta multiplicac ao por um deslocamento de bits.Quando a operac ao e para obter a parte inteira da divis ao de um inteiro x por uma pot encia de dois, digamos2k, basta deslocar os bits de x de k casas para a direita, perdendo k bits que est ao mais a direita.Tamb em e sabido que a multiplicac ao de inteiros em geral leva mais tempo que somas e deslocamento debits. Assim, uma possvel otimizac ao feita por compiladores e trocar a multiplicac ao de um inteiro por somase deslocamento de bits. Por exemplo, digamos que desejamos obter x10. O inteiro 10 n ao e pot encia de 2,mas em vez de fazermos a multiplicac ao por 10, podemos reescrever esta multiplicac ao por x(8 + 2). I.e.,podemos fazer x23+x21. Desta maneira trocamos uma multiplicac ao de um inteiro por dois deslocamentos euma soma, o que em muitos computadores e feito de forma mais r apida que uma multiplicac ao direta. Obs.:Epossvel mostrar que podemos fazer a multiplicac ao x c, onde x e inteiro e c e uma constante inteira aplicandoeste m etodo fazendo no m aximo log2(c) somas, onde c e a constante inteira a multiplicar.7Outro sistema muito usado na literatura e a base 16 (hexadecimal). Neste sistema temos 16 dgitos usadosna seguinte ordem: 0h, 1h, 2h, 3h, 4h, 5h, 6h, 7h, 8h, 9h, Ah, Bh, Ch, Dh, Eh, Fh.Assim, o n umero (F+1)h e igual a 10h (10h em hexadecimal e igual a 16 no sistema decimal).Exerccio 1.3Quanto e A9Bh em decimal ?1.5Algebra BooleanaAlguns comandos de programac ao est ao estreitamenterelacionadoscom um sistema de algebra, chamado algebra de boole, desenvolvido por George Boole. Neste tipo de algebra podemos operar sobre proposic oesque podem ser verdadeiras ou falsas, resultando em um resultado que tamb em e verdadeiro ou falso. Em 1930,Turing mostrou que apenas tr es func oes l ogicas (e (and), ou (or) e n ao (not)) s ao sucientes para representarestas proposic oes l ogicas. Os operadores and e or s ao bin arios eo operador not e un ario.Usando as letras F como falso e V como verdadeiro, apresentamos na tabela 2 os valores para as func oes(and), or e not.x y (x and y)V V VV F FF V FF F Fx y (x or y)V V VV F VF V VF F Fx ( not x)V FF VTabela 2: Func oes booleanas and, or e not.Com estas tr es func oes podemos construir func oes mais complexas. Por exemplo, considere vari aveisbooleanas x e y, e uma func ao booleana f(x, y) que assume os valores conforme a tabela a seguir.x y f(x, y)V V FV F VF V VF F FPara construir a func ao f(x, y), podemos considerar a tabela acima, com todas as entradas possveis de x e y,e construir f(x, y) como uma seq u encia de cl ausulas ligadas pela func ao or. Cada cl ausula corresponde a umaentrada verdadeira para a func ao f(x, y), feita com as func oes and e not. No exemplo acima, a func ao f(x, y)pode ser escrita como:f(x, y) = ((x and( noty)) or(( notx) andy))Exerccio 1.4Construa uma f ormula booleana para a seguinte func ao g(x, y, z) dada pela seguinte tabela:x y z f(x, y, z)V V V FV V F VV F V FV F F VF V V VF V F VF F V FF F F FExerccio 1.5Um aluno do curso de Algoritmos e Programac ao de Computadores vai de sua casa para aescola a p e. Considere x, y, z e t sentencas booleanas representando as condic oes em um dia que ele vai paraa aula e f(x, y, z, t) uma f ormula booleana representando a chegada do aluno ` a aula sem problemas.8 x :=(Est a chovendo); y:=(Tenho guarda-chuva); z:=(Tenho carona); t :=(Estou atrasado); f(x, y, z, t) :=(Vou para a aula sem problemas).Construa uma f ormula booleana adequada para f(x, y, z, t) e construa a tabela com os valores possveis dex, y, z e t com os valores da f ormula f(x, y, z, t).2 Primeiros Programas em PascalApesardametodologiadeuxogramasserantiga, elaainda emuitousadaparaexplicaroseq u enciadeinstruc oes em programas e algoritmos. H a v arios smbolos que fazem parte de um uxograma. Para n os,este tipo de estrutura ser a importante apenas para representar a estrutura seq u encial dos algoritmos e progra-mas de computador. Em um uxograma, um passo ou m odulo e representado por um ret angulo. As setasindicam o pr oximo comando a ser executado. Um losango indica uma condic ao e conforme a condic ao sejasatisfeita ou n ao, este pode levar a um de dois outros comandos.Na gura 4 apresentamos alguns diagramas usados em uxogramas.ESTRUTURA DECONTROLE SEQENCIALESTRUTURA DE ESTRUTURA DECONTROLE REPETITIVA CONTROLE CONDICIONALFigura 4: Exemplo de estruturas de controle usadas em programac ao estruturada.Para exemplicar o uso de uxogramas, suponha que exista um curso cuja avaliac ao seja feita atrav es deduas provas e um exame, sendo que o resultado nal e dado pelas seguintes regras: A primeira prova tem peso2 e a segunda prova tem peso 3. Seja N a m edia ponderada destas duas provas. Caso N seja pelo menos 5.0,a nota nal do aluno, F, e igual a N. Caso contr ario, o aluno deve fazer o exame, digamos com nota E, e suanota nal, e a m edia aritm etica entre N e E. Por m, caso a nota nal do aluno seja pelo menos 5.0, o alunoest a aprovado, caso contr ario, o aluno est a reprovado. A gura 5 apresenta um exemplo de uxograma parase avaliar um aluno de tal curso. Cada passo do uxograma deve ser executado um ap os o outro, seguindo aordem apresentada pelas setas.No incio dos tempos da programac ao de computadores, viu-se que programas que continham quaisquerdesvios, de um comando para outro, eram muito mais difceis de se entender. Os programas mais f aceis deentender eram aqueles que n ao tinham setas se cruzando. Provavelmente e esta liberdade que faz com queo uxograma deva ser considerado com muito cuidado e por isso mesmo esteja em desuso. Um algoritmodescrito como um uxograma pode ter setas levando para qualquer lugar do programa, podendo o tornar muitoconfuso e sem nenhuma organizac ao.Neste ponto entraram as linguagens estruturadas fornecendo um n umero limitado de estruturas de con-trole. Tais estruturas de controle foram desenvolvidasde tal forma que o uxo de execuc ao n ao possa serde qualquer maneira, mas sim de forma bem organizada. Uma representac ao de um programa que usa estas9Nota da ProvaNO CURSON2N1 Nota da Provaque 5.0 ?que 5.0 ?NO CURSOE Nota do ExameCURSOFFazer ExameF2N + EINICIOAPROVOU-SENFazer prova 1NFazer prova 2SSNF MaiorN MaiorREPROVOU-SE2.N1 + 3.N25NFigura 5: Fluxograma de avaliac ao de um curso.estruturas de controle permite uma traduc ao para uxogramas sem que haja linhas se cruzando. Desta formaa manutenc ao de um programa ca menos difcil, mesmo que isso seja feito por outra pessoa que n ao aquelaque o implementou inicialmente. A linguagem Pascal e um bom exemplo de linguagem de alto nvel onde ast ecnicas de programac ao estruturadas s ao estimuladas atrav es de seus comandos.Um programa em Pascal tem o seguinte formato:program nome;declarac oes Area de Declarac oesbeginComandos Corpo de Execuc ao do Programa Principalend.As palavras program, begin e end s ao palavras reservadas da linguagem Pascal. As palavras reservadass ao termos da linguagem que n ao podem ser usadas para declarar os objetos denidos pelo programador. Aspalavras begin e end servem para denir um bloco de instruc oes, no caso, denem o corpo de execuc ao doprograma principal. Na area de declarac oes, s ao denidos os objetos que iremos usar no programa.Na gura 6 apresentamos um programa bem simples com apenas um comando de execuc ao.O Comando writeln na gura 6 escreve o texto Bom Dia! (sem aspas) no dispositivo de sada. O texto aser impresso deve ser representado por uma seq u encia de caracteres delimitados por ap ostrofes. Ap os imprimiro texto, o programa pula uma linha.Existe tamb em um outro comando, write, para imprimir um texto sem pular linha. Assim, um programaequivalente ao programa BomDia pode ser dado na gura 7:10program BomDia;beginwriteln(Bom Dia!);end.Figura 6:program BomDia2;beginwrite(Bom );writeln(Dia!)end.Figura 7:programBomDia1;beginwrite (Bom );writeln(Dia!);end.Figura 8: Programa desorganizadoNote que h a um espaco em branco depois de Bom, pois caso n ao tivesse, as palavras Bom e Dia seriamimpressas juntas (BomDia).Observac oes1. O ; (ponto e vrgula) serve para separar comandos.Obs.: Dois ponto e vrgula seguidos separam um comando vazio.2. A execuc ao do programa est a denida pelos comandos entre begin e end. Note que logo ap os a palavraend segue um . (ponto nal).3. Comandos que s ao separados por espacos em branco n ao fazem diferenca. Na verdade, cada item doprograma pode ser separado:Assim, o programa BomDia poderia ter sido escrito como na gura 8.Eclaro que o programa ca bem mais legvel na primeira forma.2.1 Coment ariosDentro de um programa, descrito em Pascal podemos ter textos que n ao s ao considerados para a gerac ao doc odigo de m aquina e servem para ajudar a compreens ao do programa ou apenas como coment arios.Coment arios emPascal podem ser inseridos no programa fonte colocando-os entre (* e *) ou colocando-os entre e .Assim, o programa BomDia2 (gura 9) abaixo e equivalente aos dois programas acima.Na gura 10, apresentamos o uxograma do programa BomDia2.11 Programa: BomDia.Pas Aluno: Fulano de Tal RA: 999999 Curso: MC102 Data: 01/01/01 Descric ao: Programa para Imprimir Bom Dia! program BomDia2; Programa para Imprimir Bom Dia! beginwrite(Bom ); Eu sou um coment ario writeln(Dia!); (* Eu tamb em sou um coment ario *)end.Figura 9:INICIOFIMWRITE(Bom );WRITELN(Dia!);Figura 10: Fluxograma do programa hello3.2.2 Identicadores e ConstantesNo programa BomDia imprimimos textos usando os comandos write e writeln. Al em disso, estes comandostamb em podem ser usados para imprimir express oes com tipos b asicos da linguagem Pascal. Considere aexecuc ao do programa da gura 11:program idade1;beginwriteln(Paulo tem ,5, anos);writeln(Pedro tem ,8, anos);writeln(A soma das idades de Paulo e Pedro e:,5+8);writeln(A media das idades de Paulo e Pedro e:,(5+8)/2);end.Figura 11:O programa deve imprimir as linhas:Paulo tem 5 anosPedro tem 8 anosA soma das idades de Paulo e Pedro e: 13A media das idades de Paulo e Pedro e: 6.5Observe que o comando writeln pode imprimir tanto n umeros inteiros como n umeros reais bem como oresultado de c alculos num ericos. Note tamb em que se a idade de Pedro passar de 8 para 9 anos, ent ao todos oslugares onde aparece o n umero 8, correspondente ` a idade de Pedro, devemos alter a-lo para 9.Para facilitar este tipo de mudanca podemos fazer uso de um identicador associado` a idade de Pedro,12igual a 8 anos. Assim, sempre que lidamos com sua idade referenciamos este identicador em vez do valor8. Isto facilita a atualizac ao da idade de Pedro, que se se mudar de 8 anos para 9 anos, atualizamos apenas nadenic ao do valor do identicador associado ` a idade de Pedro. Desta maneira, n ao precisaremos nos preocuparem procurar todas as ocorr encias do n umero 8, al em de vericar se tal 8 e correspondente ` a idade de Pedro.Identicadores s ao nomes simb olicos para os objetos referenciados nos programas em Pascal. Identica-dores podem ser formados por uma letra ou caracter sublinhado seguido por qualquer combinac ao de letras,dgitos ou sublinhados. Na tabela a seguir, damos alguns exemplos de identicadores v alidos e inv alidos.Identicadores v alidos Identicadores inv alidosMedia 2XMeu Primeiro Programa A:B:CIdade Paulo 1*5RA 999999 X(9)Nota MC102 Nota(102)Na linguagem Pascal, n ao h a diferencas com as letras mai usculas e min usculas usadas no identicador.Assim, as seguintes seq u encias de caracteres representam o mesmo identicador:Nota MC102 NOTA MC102 nota mc102 noTA mC102Obs.: Em algumas linguagens, como a linguagem C, h a distinc ao entre mai usculas e min usculas usadas emidenticadores.Constantes s ao objetos cujos valores n ao mudam durante a execuc ao do programa. A denic ao das cons-tantes deve ser feita na area de declarac oes, usando a palavra reservada const seguida das denic oes de cadaconstante. Cada constante e denida como:IdenticadorDeConstante = constante;No programa da gura 12, apresentamos o programa da gura 11 declarando as idades de Paulo e Pedropor constantes.program idade2;const Idade Paulo = 5;Idade Pedro = 9;beginwriteln(Paulo tem ,Idade Paulo, anos);write(Pedro tem ,Idade Pedro, anos);writeln(A soma das idades de Paulo e Pedro e:,Idade Paulo+Idade Pedro);writeln(A media das idades de Paulo e Pedro e:,(Idade Paulo+Idade Pedro)/2);end.Figura 12:Outros exemplos de declarac ao de constantes:2.3 Vari aveis e Tipos B asicosO uso de constantes permite que possamos trabalhar com valores previamente xados e seu uso e feito atrav esde um identicador que est a associado ` aquela constante. Agora se quisermos que um determinado identicadoresteja associado ` a diferentes valores durante a execuc ao do programa, devemos usar o conceito de vari avel.13program constantes;constMin = 100;Max = 999;Versao = 5.2.3;LetraPrincipal = X;Aniversario = 01/01/2000;...beginwriteln(Min,...,Max);Imprime: 100...999 writeln(Vers ao do Programa e ,Versao);Imprime: Vers ao do Programa e 5.2.3 ...end.Figura 13:Vari aveis s ao objetos que podem ter diferentes valores durante a execuc ao do programa. Cada vari avelcorresponde a uma posic ao de mem oria. Embora uma vari avel possa assumir diferentes valores, ela s o podearmazenar apenas um valor a cada instante. Cada vari avel e identicada por um identicador e cont em valoresde apenas um tipo.Os tipos b asicos em Pascal s ao: char, integer, boolean, real, string. A tabela a seguir apresenta exemplosde cada um destes tipos.Objeto tipo de dado1 integer-2488 integer1.0 real-13.6 real0.653 real-1.23456789E+12 real expresso em notac ao exponencialAlgoritmos e Programac ao de Computadores string123456 stringtrue booleanfalse booleanA charB char6 char$ charVamos ver mais sobre cada um destes tipos:integer: Representa um subconjunto dos n umeros inteiros. O tipo integer no padr ao Turbo Pascal representaos inteiros de 32768 a32767. J a no Padr ao Gnu Pascal (GPC), o tipo integer representa inteiros de2147483648 a 2147483647.real: Em geral, um n umero real e representado por duas partes: a mantissa e o expoente. A precis ao dosn umeros reais e determinada pela quantidade de bits usada em cada uma destas partes. Exemplo: on umero10, 45 pode ser representado por1.045E+ 01. O n umero0,00056993 pode ser representadopor 5.6993E 04. Este tipo n ao permite representar todos os n umeros reais, mesmo que este n umeroseja pequeno. Um exemplo simples disso e o n umero13=0,33333 . . ., que certamente deve ter suaprecis ao computada corretamente at e um certo n umero de casas decimais.char: Representa um caracter. Ex.: A,B,$, (espaco em branco),...14string:E uma seq u enciade caracteres. Uma string pode ser dada por uma seq u enciade caracteresentreap ostrofos. Ex: Joao Paulo. Muitos compiladores tem a restric ao que uma string pode ter at e 255caracteres. Atualmente h a compiladores que admitem strings com n umero bem maior de caracteres. Aquantidade de caracteres (bytes) usados pela string e denido com um n umero entre colchetes logo ap osa palavra string. Ex.:string[50];O tipo acima permite representar cadeias de caracteres com capacidade m axima de 50 caracteres. Obs.:uma cadeia de caracteres a ser armazenada neste tipo de string n ao necessariamente precisa ter 50 ca-racteres. Para saber mais sobre este tipo, veja a sec ao 8.boolean: Uma vari avel do tipo boolean pode ter dois valores. True (verdadeiro) ou False (falso).Al em destes tipos, vamos considerar como tipo b asico o tipo byte, que usa apenas um byte de mem oria epode armazenar um n umero de 0 a 255.A declarac ao de vari aveis e feita na area de declarac oes usando se a seguinte sintaxe:varListaDeIdenticadoresDoTipo1 : Tipo1;ListaDeIdenticadoresDoTipo2 : Tipo2;...ListaDeIdenticadoresDoTipoN : TipoN;A palavra var e uma palavra reservada da linguagem Pascal que indica que vai comecar uma declarac aode vari aveis.Exemplo 2.1No quadro seguinte apresentamos a declarac ao de algumas vari aveis.var x, y, z: real;Nome, Sobrenome: string[50];i, n, idade: integer;Sexo: char;Solteiro: boolean;2.4 Comando de Atribuic aoO comando de atribuic ao := atribui um valor que est a a direita de :=, que pode ser uma express ao, para umavari avel ( unica) que est a na parte esquerda do comando, representada pelo seu identicador.Sempre que houver um comando de atribuic ao devemos observar os seguintes itens:Primeiro eavaliadaapartedireita, obtendo-seumvalor unico. Apartedadireitadocomandodeatribuic ao pode ser uma express ao bem complicada.O valor obtido da express ao da parte direita e atribudo ` a vari avel ( unica) que est a na parte esquerda.O tipo do valor avaliado da express ao na parte direita deve ser compatvel com o tipo da vari avel queest a na parte esquerda. Obs.: um n umero inteiro tamb em pode ser visto como um n umero real.Se um valor e armazenado em uma vari avel, o valor anterior que estava nesta vari avel e perdido.Exemplo 2.2Considere a declarac ao das vari aveis x, y, z e t dadas a seguir:var nome: string[50];x: integer;y: real;z,t: char;Na tabela seguinte apresentamos alguns exemplos de atribuic oes v alidas e inv alidas para estas vari aveis.15Atribuic oes v alidas Atribuic oes inv alidasx := 10 x := 3.14y:= x + 1.5 x := yz:=az:=Computadorz:= t t := t +znome:=Carlos nome:=100;Para esclarecer melhor estes conceitos, suponha que voc e tenha uma vari avel, chamada idade, denidacomo sendo inteira:var idade: integer;No momento da execuc ao, o programa deve denir uma certa porc ao da mem oria, em bytes, para esta vari avel.A maioria das linguagens n ao inicializa as vari aveis logo ap os a denic ao de sua mem oria em bytes. Assim,vamos considerarque o valor inicial em uma vari avel e sempre um valor desconhecidoe portanto iremosconsider a-lo como um lixo.LixoMEMRIA PRINCIPALIDADEAp os o comandoIdade:=10;a congurac ao da mem oria deve car da seguinte formaMEMRIA PRINCIPAL10IDADENaturalmente, o valor 10 deve estar na forma bin aria. Se depois deste comando for dado o comando:Idade:= 20;Ent ao a programa toma a valor 20 (parte direita) e o armazena na vari avel idade (parte esquerda), e a vari avelidade perde o valor anterior. Neste momento a mem oria ca com a seguinte congurac ao:MEMRIA PRINCIPAL20IDADESe depois deste comando for dado o seguinte comando:Idade:=Idade + 15;O programa deve avaliar primeiro o valor da parte direita, depois atribui o resultado para a vari avel (que est ana parte esquerda). Assim, analisando a parte direita, temos 20+15=35; ent ao o valor 35 e atribudo para avari avel Idade (parte esquerda). Assim, a congurac ao da mem oria deve car da seguinte formaMEMRIA PRINCIPAL35IDADEExemplo 2.3Considere o seguinte programaprogram Soma 3 20 100;var Soma: integer;beginSoma:=3;Soma:=Soma+20;Soma:=Soma+100;writeln(O valor contido em Soma e: ,Soma);end.1. No primeiro comando de atribuic ao, a vari avel Soma deve receber o valor 3.162. Paraexecutarosegundocomandodeatribuic ao, primeiro eavaliadooladodireitodocomando:(Soma+20). Notequenesteexatomomento, avari avel Somacont emovalor3. Este esomadoa20, resultando em um valor unico do lado direito igual a 23. Em seguida, este valor e armazenado navari avel que est a no lado esquerdo. Assim o valor 23 e armazenado na vari avel Soma.3. No terceiro comando de atribuic ao, primeiro e avaliado o valor da express ao do lado direito do co-mando, (23 + 100) resultando em 123 e este e atribudo ` a vari avel Soma.4. No quarto comando, de impress ao, deve ser impresso o seguinte texto:O valor contido em Soma e: 123Exerccio 2.1Considere o seguinte programa:program Produtos;var Produto : integer;beginProduto:=2;Produto:=Produto*Produto;Produto:=Produto*Produto;Produto:=Produto*Produto;writeln(O valor contido em Produto e: ,Produto);end.O que o programa imprime ?Obs.: A maioria das linguagensde programac ao n ao inicializamautomaticamenteas vari aveis. Assim, eimportante inicializar as vari aveis em algum momento, antes de referenciar seus valores em express oes.2.5 OperadoresOperadores Aritm eticosA seguir, apresentamos alguns operadores aritm eticos presentes na linguagem Pascal.+,-,*,/ (adic ao, subtrac ao, multiplicac ao e divis ao de n umeros, resp.).mod (Operador de inteiros: resto de divis ao inteira).div (Operador de inteiros: parte inteira da divis ao).Operandosdostiposintegere realpodemsercombinados. Otipodovalorresultantedeuma operac aoaritm etica depender a da operac ao e dos tipos de seus operadores. A tabela a seguir apresenta as operac oesv alidas para tipos de operandos e seus respectivos resultados.Operandos Operador Tipo de resultadointeger e integer +, , , div, mod integerinteger e integer / realreal e integer +, , , / realreal e real +, , , / realExemplo 2.4Exemplos de operac oes aritm eticas:17program OpAritmetico;var i:integer;x:real;begini := 4 mod 3;resultado da operac ao e inteiro e igual a 1x := 4/2;resultado da operac ao e real e igual a 2.0x := 2 3 + 5 3 (123456 mod 123);end.Operadores L ogicosA linguagem Pascal oferece os seguintes operadores l ogicos:not (inverte o valor booleano)and ( e verdadeiro se ambos os operandos s ao verdadeiros)or ( e verdadeiro se um dos operandos for verdadeiro)Exemplo 2.5Exemplos de operac oes l ogicas:program OpLogico;var a, b, c: boolean;begina := false; b := true;c := ( not a and b); c True (verdadeiro)writeln(c);end.Exerccio 2.2Algumas implementac oes da Linguagem Pascal apresentam o operador l ogico xor, sendo queeste operador resulta verdadeiro se exatamente um dos operandos for verdadeiro. Implemente este operadorusando os operadores and, or e not.Operadores RelacionaisOs operadores relacionais podem ser usados para os tipos real, integer, string, char e byte. Naturalmente osdois operandos devem ser de tipos compatveis.Oresultado de uma operac ao relacional e sempre l ogico (boolean), retornando ou true ou false.No caso do operador = (igual), tamb em e possvel comparar valores booleanos. Na comparac ao de strings, oscaracteres s ao comparados dois a dois caracteres nas mesmas posic oes, at e que um caracter seja menor queoutro ou at e que uma string termine antes que outra. Assim, Ave Maria e maior que Ave Cesar. Pois oprimeiro caracter a diferir nas duas strings e o quinto caracter. Na codicac ao ASCII, M e maior que C.Portanto o resultado da relac ao(Ave Maria > Ave Cesar) e true (verdadeiro). Como a codicac ao de A em ASCII e menor que a, ent ao o resultado da relac ao(AAA >= aaa) e false (falso).18Exemplo 2.6Exemplos de operac oes relacionais:program OpRelacionais;var a, b, c: boolean;x, y: real;beginx := 10.0; y:= 30.0; a :=false;b :=not a and ((x >= y) or (paulo0, elevado a outron umero y, e atrav es das func oes Exp e Ln, usando a seguinte f ormula:xy= Exp(y Ln(x)) . O programaa seguir l e dois n umeros, x e y, e imprime xy.program Expoente;var x,y,z : real;beginwrite(Entre com o valor de x: );readln(x);write(Entre com o valor de y: );readln(y);z:= Exp(yln(x));writeln(O valor de ,x, elevado a ,y, e igual a ,z);end.Exerccio 2.3Faca um programa que l e um caracter e imprime seu correspondente c odigo decimal.Al em destas func oes, existem alguns comandos uteis para atualizar o valor de algumas vari aveis. Algumasdestas s ao:20Comando Tipo da vari avel de par ametro ResultadoInc inteiro Incrementa o valor da vari avel de 1.Dec inteiro Decrementa o valor da vari avel de 1.2.7 Comandos de EscritaComo vimos, podemosescreverosdadosna telaatrav esdo comandowriteln. Estecomandotem comopar ametros uma lista de objetos de tipos b asicos. Os par ametros devem ser separados por vrgulas. Cadapar ametro e impresso logo ap os a impress ao do par ametro anterior. A linguagem Pascal tem dois comandosb asicospara escrita: o comando write e o comando writeln (dewrite+line). Ambos imprimem os valo-res de seus respectivosargumentos, com a diferenca que o comando write mant em a posic ao da pr oximaimpress ao/leitura logo ap os a impress ao de seu ultimo par ametro e o comando writeln atualiza a posic ao dapr oxima impress ao/leitura para o incio da pr oxima linha. O comando writeln sem argumentos apenas atualizaa posic ao da pr oxima impress ao/leitura para o incio da pr oxima linha.Exemplo 2.9Considere o programa a seguir:program ComandosDeEscrita;vara: boolean;b: integer;c: string[50];begina := true;b := 2 + 3 4 5;c :=Exemplo;writeln(Valor de a = ,a,. Vai para a pr oxima linha);writeln(Valor de b = ,b,. Vai para a pr oxima linha);writeln(Valor de c = ,c,. Vai para a pr oxima linha);write(Valor de a = ,a,. );write(Valor de b = ,b,. );write(Valor de c = ,c,.);writeln;writeln(Fim das impress oes);end.O programa acima imprime as seguintes linhas:Valor de a = True. Vai para a pr oxima linhaValor de b = 9. Vai para a pr oxima linhaValor de c = Exemplo. Vai para a pr oxima linhaValor de a = true. Valor de b = 9. Valor de c = Exemplo.Fim das impress oes.Muitas vezes queremos formatar melhor a forma de impress ao dos dados no comando write e writeln. Umamaneira simples de denir a quantidade de caracteres, que uma express ao ser a impressa, e colocar a express aoa ser impressa seguida de : (dois pontos) e a quantidade de caracteres desejado. Isto far a com que a express aoseja impressa com a quantidade de caracteres especicada. Caso o dado a ser impresso e um n umero real,podemos complementar esta formatac ao adicionando : (dois pontos) e a quantidade de casas decimais depoisdo ponto decimal. No exemplo a seguir apresentamos um programa com algumas formatac oes de impress oese sua respectiva tela de execuc ao.Exemplo 2.10Considere o programa a seguir:21program ComandosDeEscrita;vara: boolean;b: integer;c: string[50];d: real;begina := true;b := 4321;c :=Exemplo;d := 1234.5678;writeln(Valor de a = [,a:1,]);writeln(Valor de b = [,b:7,]);writeln(Valor de c = [,c:4,]);writeln(Valor de d = [,d:9:2,]);end.O programa acima imprime as seguintes linhas:Valor de a = [T]Valor de b = [ 4321]Valor de c = [Exem]Valor de d = [ 1234.57]Obs.: Na formatac ao de valores reais, pode haver perda ou arredondamentos em algumas casas decimais.2.8 Comandos de LeituraH adoiscomandosb asicosdeleitura: ocomandoreadeocomandoreadln. Ambososcomandostemcomo par ametrosvari aveis, de tipos b asicosdiferentesde boolean, e permite ler do tecladoos novos va-lores a serem atribudos` as vari aveis. O comando read, ap os sua execuc ao, mant em a posic ao da pr oximaimpress ao/leitura logo ap os a leitura das vari aveis. O comando readln (de read line) atualiza a posic ao dapr oxima impress ao/leitura para o incio da pr oxima linha.Exemplo 2.11Considere o programa a seguir:program ComandosDeLeitura;varidade: integer;nome: string[50];beginwrite(Entre com sua idade: );readln(idade);write(Entre com seu nome: );readln(nome);writeln(O Sr. ,nome, tem ,idade, anos.)end.Caso o usu ario entre com os dados 29 e Fulano de Tal , o programa deve car com a seguinte congurac aona tela:Entre com sua idade: 29Entre com seu nome: Fulano de TalO Sr. Fulano de Tal tem 29 anos.22Exerccio 2.4Faca um programa que l e 7 n umeros e imprime a m edia destes n umeros usando no m aximoduas vari aveis num ericas.Exerccio 2.5Sabendo que o valor num erico de uma letra na codicac ao ASCII e dada pela func ao ord, facaum programa que leia uma letra e escreva a codicac ao em bin ario desta letra.Exemplo: Suponha que a letra a ser lida e a letra a. A func ao ord(a) retorna o valor 97 e o programa deveimprimir: 01100001. Note que 027+ 126+ 125+ 024+ 023+ 022+ 021+ 120= 97.Exerccio 2.6Faca um programa que l e as coordenaasde dois pontosP1=(x1, y1) eP2=(x2, y2);eimprime a dist ancia entre eles. Obs.:dist=_(x2x1)2+ (y2y1)2.Exerccio 2.7Faca um programa que l e uma temperatura em graus Fahrenheit e retorne a temperatura emgraus Centgrados. Obs.:(C= 5/9(F 32)).Exerccio 2.8Faca um programa que l e uma temperatura em graus Centgrados e retorne a temperatura emgraus Fahrenheit.2.9 Tipos denidos pelo programadorAl em dos tipos j a denidos na linguagem Pascal, e possvel se construir novos tipos associados a apenas umidenticador. Assim, poderemosdeclarar tipos complicadose associareste tipo com um identicador. Adenic ao destes novos tipos deve ser feita na area de declarac oes, usando a palavra reservada type seguida dasdenic oes de cada tipo. Cada tipo novo e denido como:IdenticadorDeTipo = especicac ao do tipo;Exemplo 2.12Declare tipos chamadosMeuInteiro, TipoNome e TipoNumero, onde MeuInteiro e igualaotipo integer, TipoNome e igual ao tipo string[50] e TipoNumero e igual ao real.typeMeuInteiro = integer;TipoNome = string[50];TipoNumero = real;Exemplo 2.13Os seguintes programas s ao equivalentes:program ExemploTipos;typeTipoNome = string[50];MeuInteiro = integer;varIdade : MeuInteiro;Nome: TipoNome;beginwrite(Entre com seu nome: );readln(Nome);write(Entre com sua idade: );readln(Idade);writeln(Nome, tem ,idade, anos.);end.program ExemploTipos;varIdade : integer;Nome: string[50];beginwrite(Entre com seu nome: );readln(Nome);write(Entre com sua idade: );readln(Idade);writeln(Nome, tem ,idade, anos.);end.23Exemplo 2.14Outros exemplos de declarac oes de tipos e vari aveis.program Exemplo;typeTipoNome = string[50];TipoRG = string[15];TipoIdade = integer;TipoSalario = real;varNomePedro,NomePaulo : TipoNome;IdadePedro,IdadePaulo : TipoIdade;RgPedro,RgPaulo : TipoRG;SalarioPedro,SalarioPaulo : TipoSalario;Algumas vantagens e necessidades de se usar tipos:Basta se lembrar do nome do tipo, sem precisarmos escrever toda a especicac ao de um novo objeto aser declarado. Um exemplo disto e o caso do TipoRG usado no exemplo acima, a cada vez que formosdeclarar um RG, n ao precisaremos nos lembrar se um RG e declarado com 15 ou 16 ou mais caracteres;esta preocupac ao j a foi considerada no momento da especicac ao do tipo TipoRG.As re-especicac oes de tipos cam mais f aceis. Usando string[15] em todos os lugares onde declaramosum RG e se quisermos mudar para string[20], devemos percorrer todo o programa procurando pelasdeclarac oes de RGs e fazendo as devidas modicac oes (note que isto n ao pode ser feito de qualquerforma, j a que nem todo lugar onde aparece string[15] e uma declarac ao de RG. Usando tipos, bastamudar apenas uma vez, i.e., na especicac ao de TipoRG.Al em disso h a tipos de objetos da linguagem Pascal que n ao admitem declarac oes usando mais que umapalavra. Alguns tipos de objetos deste caso s ao os par ametros e as func oes, que veremos nas pr oximassec oes.2.10 Tipos EscalaresOs tipos escalares integer, byte e char s ao tipos que representam conjuntos ordenados com valores distintos.Por serem tipos que apresentam uma ordem entre seus elementos, podemos fazer comparac oes do tipo:igualdade (=), menor (=) e diferenca ().A linguagem Pascal tamb em permite que possamos denir nossos pr oprios tipos de dados escalares or-denados. Istopodeserfeitodenindooconjuntoordenadoespecicandocadaelementodoconjuntoouaproveitando os elementos de conjunto de dados j a denidos anteriormente. A seguir apresentamos estas duasmaneiras de se denir tipos escalares ordenados.Especicando todos os elementosPara denir um tipo escalar ordenado especicando todos os elementos, escrevemos seus elementos (comoidenticadores) entre par enteses e separados por vrgula.Obs.: estes tipos n ao podem ser impressos diretamente com uso do comando write ou writeln.(Lista de identicadores)Como j a vimos, a func ao ord sobre um caracter devolve o c odigo ASCII do mesmo. A func ao ord tamb empode ser usada para encontrar a posic ao de outros elemento denidos por conjuntos escalares ordenados es-pecicados elemento a elemento. A func ao ord retorna 0 caso seja o primeiro elemento, 1 se for o segundoelemento, 2 se for o terceiro elemento, assim por diante.24Exemplo 2.15A seguir apresentamos alguns exemplos de declarac oes e atribuic oes usando os conjuntos or-denados especicados elemento a elemento.typeTipoSexo = (Masculino,Feminino);TipoCor = (Vermelho,Verde,Azul);TipoMes = (Janeiro,Fevereiro,Marco,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro);TipoEstadoSul = (RS,SC,PR);varSexo: TipoSexo;Estado: TipoEstadoSul;Cor: TipoCor;Categoria: (Aluno,Funcionario,Professor);Mes: TipoMes;beginSexo := Masculino;Estado := PR;Categoria := Funcionario;Mes := Abril;writeln(Ord(Mes)); Deve imprimir 3end.Especicando uma faixa de elementosUm tipo faixa e um tipo de dado escalar que dene uma faixa de elementos. Esta faixa e especicada peloprimeiro elemento e o ultimo elemento e necessariamente devem fazer parte de um conjunto ordenado escalar.Para isso e possvel usar tanto os tipos escalares j a denidos (como os tipos integer e char) como tamb emos novos tipos escalares ordenados como denidos elemento a elemento. Um tipo faixa e denido atrav es dasintaxe:Primeiro Elemento..Ultimo ElementoIsto signica que uma vari avel deste tipo poder a receber qualquer valor que esteja no intervalo Primeiro Elemento..Ultimo Elemento.Se uma vari avel e denida como sendo de um tipo faixa onde os extremos foram tomados a partir de um con-junto ordenado especicado elemento a elemento, ent ao os elementos que s ao passveis de serem atribudos aesta vari avel cam restritos ao intervalo denido no conjunto ordenado tamb em.Obs.: Um tipo escalar s o poder a ser impresso pelo comando write ou writeln se este for do tipo char, integerou byte.Exemplo 2.16A seguirapresentamosalgunsexemplosde declarac oes e atribuic oes usandouma faixadeelementos.25typeTipoMaiuscula = A..Z;TipoMinuscula = a..z;TipoDigitoCaracter = 0..9;TipoDigito = TipoDigitoCaracter;TipoDigitoNumero = 0..9;TipoMes = (Janeiro,Fevereiro,Marco,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro);TipoPrimeiroSemestre = Janeiro..Junho; Supondo a declarac ao de TipoMes do exemplo anteriorvarDigC: TipoDigito;DigN: TipoDigitoNumero;IdadeAdolecencia: 12..18 ;Letra: TipoMaiuscula ;MesEstagio: TipoPrimeiroSemestre ;beginDigC := 5;DigN := 5;Letra := X;MesEstagio := Abril;end.263 Estrutura CondicionalA estrutura condicionalpermite a execuc ao de instruc oes quando uma condic ao representadapor uma ex-press ao l ogica e verdadeira.3.1 Estrutura Condicional Simplesif (condic ao) then Comando;A seguir, exemplicamos o uso da estrutura condicional simples.program maximo1;var a,b: integer;beginwrite(Entre com o primeiro n umero: );readln(a);write(Entre com o segundo n umero: );readln(b);if (a > b)thenwriteln(O maior valor e ,a);if (a b) ou (a b). Podemos considerar ambos os casos atrav es de uma unica condic ao:if (condic ao)then Comando1 ou Bloco de Comandos1else Comando2 ou Bloco de Comandos2;Bloco de Comandos1Comando1 ouBloco de Comandos2Comando2 oufalseCtrueBloco de Comandos1Comando1 ouBloco de Comandos2Comando2 ouIf (C)ThenElseFigura 14: Fluxograma do comando If-Then-Else27Note que depoisdoComando1ou Bloco de Comandos1n ao h a ; (pontoe vrgula). Caso tivesseumponto e vrgula, este estaria separando o comando if de outro comando e portanto a palavra else n ao seriacontinuac ao deste comando if. Na gura 14 apresentamos o uxograma do comando if, e no programa seguinteexemplicamos o uso da estrutura condicional composta.program maximo2;var a,b: integer;beginwrite(Entre com o primeiro n umero: ); readln(a);write(Entre com o segundo n umero: ); readln(b);if (a > b)thenwriteln(O maior e ,a)elsewriteln(O maior e ,b)end.Exerccio 3.1Faca um programa que l e um n umero e imprime E par (impar) se o n umero e par (impar).3.3 Bloco de ComandosUm bloco de comandos e um conjunto de instruc oes que vai ser considerado como sendo um comando unico.Desta forma, e possvel compor estruturas, como no caso do comando if, envolvendo mais comandos. Umbloco de comandos e denido pelas palavras begin e end.beginComando1;Comando2;Comando3;...endAqui parece ser o momento para apresentar mais uma pr atica de programac ao estruturada. Sempre queum comando atuar sobre um bloco de comandos, dispomos este bloco de comandos deslocados mais a direita.Os comandos dentro de um bloco, entre begin e end estar ao alinhados e tamb em estar ao deslocados mais adireita. Isto facilita muito a visualizac ao da atuac ao de cada comando.Exemplo 3.1No programa a seguir, exemplicamos o uso dos blocos de comandos.28program maximo3;var a,b: integer;beginwrite(Entre com o primeiro n umero: ); readln(a);write(Entre com o segundo n umero: ); readln(b);if (a > b)thenbeginwriteln(O maior est a na vari avel a);writeln(O maior e ,a)endelsebeginwriteln(O maior esta na vari avel b);writeln(O maior e ,b)endend.Exemplo 3.2Noexemploseguinteapresentamosumprogramaquel eoscoecientesdeumaequac aodesegundo grau, a, b e c (equac ao ax2+bx +c = 0), e imprime as raizes desta equac ao (se existir).program equacaosegundograu;var a, b, c: real;var x1, x2, delta: real;beginwriteln(Programa para resolver uma equac ao de segundo grau.);writeln(Equac ao na forma: a*x*x + b*x+c = 0);write(Entre com o valor de a (diferente de zero): ); readln(a);write(Entre com o valor de b: ); readln(b);write(Entre com o valor de c: ); readln(c);delta:= b b 4 a c;if (delta >= 0)thenbeginx1 := (b +sqrt(delta))/(2 a);x2 := (b sqrt(delta))/(2 a);writeln(O valor de x1 = ,x1, e o valor de x2 = ,x2);endelsewriteln(n ao e possvel calcular raizes reais para esta equac ao);end.3.4 Comando CaseO comando case e um comando que permite selecionar um conjunto de operac oes conforme uma express aode resultado escalar. Neste comando o resultado escalar e usado para selecionar um comando ou bloco decomandos atrav es de v arias listas de escalares constantes. No m aximo uma lista pode contemplar o resultado.Os valores das listas podem ser tanto de valores escalares como faixas de valores de escalares. Al em disso,todos os valores das listas devem ser disjuntos (sem intersec oes). Se o valor escalar e igual ao valor (ou est adentro de uma faixa) de uma lista ent ao os comandos associados a ela s ao executados.H a duas formas para a sintaxe do comando case:29A seguir apresentamos a sintaxe do caso onde n ao denimos comandos para o caso de n ao haver corres-pond encia com os valores escalares de cada caso.case (Express aoEscalar) ofLista Constantes Escalares1: Comando ou Bloco de Comandos1;Lista Constantes Escalares2: Comando ou Bloco de Comandos2;...Lista Constantes EscalaresK: Comando ou Bloco de ComandosK;endA sintaxe para a situac ao onde denimos comandos para o caso onde n ao h a correspond enciacom osvalores escalares de cada caso e apresentada a seguir:case (Express aoEscalar) ofLista Constantes Escalares1: Comando ou Bloco de Comandos1;Lista Constantes Escalares2: Comando ou Bloco de Comandos2;...Lista Constantes EscalaresK: Comando ou Bloco de ComandosK;elseComandoE1;ComandoE2;...ComandoEE;endCada Lista Constantes Escalares pode ser uma seq u encia de escalares ou faixas de escalares separados porvrgula.Exemplo 3.3O seguinte programa mostra um exemplo de uso do comando case.program exemplo;var c: char;beginwrite(Entre com um caracter: );readln(c);case c ofA..Z,a..z:writeln(Caracter lido e letra.);0..9: beginwriteln(Caracter lido e dgito.);writeln(i.e., um caracter em [0,9].);end;+,-,*,/:writeln(Caracter e um operador matem atico.);$: writeln(Caracter e o smbolo $.);elsewriteln(O caracter lido n ao e letra, nem digito.);writeln(nem operador matem atico e nem e o smbolo $.);end;end.30Exemplo 3.4O seguinte programa mostra um exemplo de menu implementado com o comando case.Program ExemploMenu;var Opcao : char;begin Escolha de uma opc ao do Menu writeln(Entre com uma opcao do menu abaixo: );writeln([1] - Inserir dados de aluno novo no cadastro.);writeln([2] - Remover aluno do cadastro.);writeln([3] - Alterar os dados de um aluno.);writeln([4] - Sair do sistema de cadastro.);write(Opcao: ); readln(Opcao); writeln;case Opcao of1 : beginwriteln(Inserir Funcionario.);writeln(Opcao a ser implementada.);end;2 : beginwriteln(Remover Funcionario.);writeln(Opcao a ser implementada.);end;3 : beginwriteln(Alterar Funcionario.);writeln(Opcao a ser implementada.);end;4 : writeln(Fim da execucao do sistema.);elsewriteln(Opcao invalida.);end; case writeln;end.3.5 Exerccios1. Escrevaumprogramaquedeterminaadatacronologicamentemaiordeduasdatasfornecidaspelousu ario. Cada data deve ser fornecida por tr es valores inteiros onde o primeiro representa um dia, osegundo um m es e o terceiro um ano.2. Faca um programa que l e uma medida em metros e escreve esta medida em polegadas, p es, jardas emilhas. Obs.:1 polegada = 25.3995 milmetros1 p e = 12 polegadas1 jarda = 3 p es1 milha = 1760 jardas3. Sabendo que o valor num erico de uma letra na codicac ao ASCII e dada pela func ao ord, faca umprograma que leia uma letra e escreva a codicac ao em hexadecimal desta letra.Exemplo: Suponha que a letra a ser lida e a letra m. A func ao ord(m) retornao valor109 e oprograma deve imprimir: 6D. Note que 6161+ D160=109, onde D em hexadecimal e igual a 13em decimal.314 Estruturas de Repetic aoAs estruturas de repetic ao permitem que um comando ou bloco de comandos seja executado repetidas vezes.Os comandos que veremos diferem principalmente na forma como estas repetic oes s ao interrompidas.4.1 Comando ForO comando For permite que um comando ou bloco de comandos seja repetido um n umero especco de vezes.Neste comando uma vari avel de controle e incrementada ou decrementada de um valor inicial em cada iterac aoat e um valor nal.A sintaxe do comando for que incrementa a vari avel de controle e dada como:for vari avel de controle := express ao 1 to express ao 2 do Comando ou bloco de comandos;Para a forma que decrementa a vari avel de controle, temos a seguinte sintaxe:for vari avel de controle := express ao 1 downto express ao 2 do Comando ou bloco de comandos;Na gura 15 apresentamos o uxograma de uma das formas do comando for.Comando ouBloco de ComandosVC := VC + 1;Comando ouBloco de Comandos{VC = Varivel de Controle}{VI = Valor Inicial}{VF = Valor Final}CondioVC:=VI;VC>VFfalsetrueForVC := VItoVFdo {OBS:}Figura 15: Fluxograma e sintaxe de uma forma do comando for.Exemplo 4.1Faca um programa para calcular o fatorial de um n umero lido pelo teclado.program fat;var n,i,fatorial :integer;beginwrite(Entre com um numero: );readln(n);fatorial := 1;for i:=2 to n dofatorial:=fatorial i;writeln(O fatorial de ,n, e igual a ,fatorial);end.32Exemplo 4.2Faca um programa que l e um valor inteiro positivo n e em seguida l e uma seq u encia de n valo-res reais. O programa deve imprimir o maior valor da seq u encia.program Maximo;varn,i : integer;x : real;maximo : real;beginReadLn(n); Sup oe todos os dados n ao negativos.maximo := 0.0fori:=1tondobeginReadLn(x);if x>maximo then maximo := xend;WriteLn(maximo)end.Exemplo 4.3(Tabuada) Faca um programa que imprima uma tabela, com 9 linhas e 9 colunas. Na intersec aoda linhai com a colunaj deve conter um valor que e a multiplicac ao doi comj. Isto e, o programa deveimprimir uma tabela da seguinte forma:1 2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 274 8 12 16 20 24 28 32 365 10 15 20 25 30 35 40 456 12 18 24 30 36 42 48 547 14 21 28 35 42 49 56 638 16 24 32 40 48 56 64 729 18 27 36 45 54 63 72 81program ProgramaTabuada;var i,j : integer;beginfor i:=1 to 9 do beginfor j:=1 to 9 dowrite(ij:3);writeln;end;end.Exerccio 4.1(Tabela de pot encias) Faca um programa que l e dois inteiros positivosn ek e imprime umatabela de tamanho n k onde a posic ao (i, j) da tabela cont em o n umero ij.x x2x3x4x51 1 1 1 12 4 8 16 323 9 27 81 2434 16 64 256 10245 25 125 625 31256 36 216 1296 777633Exemplo 4.4(Tri angulo de Floyd) O seguinte tri angulo formado por 6 linhas de n umeros consecutivos, cadalinha contendo um n umero a mais que na linha anterior, e chamado de Tri angulo de Floyd.12 34 5 67 8 9 1011 12 13 14 1516 17 18 19 20 21Faca um programa que imprime o Tri angulo de Floyd com n linhas (o valor de n e lido).program Floyd;vari : integer;ndice da linhaj : integer;ndice da colunak : integer;pr oximo n umerom : integer;n umero de linhasbeginReadLn(m);k := 0;fori:=1tomdo beginforj:=1toi do begink := k+1;Write(k:3)end;WriteLnendend.Exerccio 4.2Faca um programa que l e um inteiro positivo n e imprime um tri angulo constitudo por n umeroscom o seguinte formato.6 5 4 3 2 15 4 3 2 14 3 2 13 2 12 11No caso a tabela foi impressa com valor de n igual a 6.344.2 Comando WhileO comando while permite repetir a execuc ao de um comando ou bloco de comandos enquanto a condi aoestiver satisfeita. Tal condic ao e sempre testada antes do comando ou bloco de comandos a ser repetido. Nagura 16, apresentamos o uxograma e a sintaxe do comando While.Comando ouBloco de ComandosComando ouBloco de ComandosWhile (C) doCfalsetrueCondioFigura 16: Fluxograma e sintaxe da rotina While.Exemplo 4.5(Validac ao de entrada) Em determinado momento, um programa deve ler a partir do tecladoum n umero que deve estar necessariamente no intervalo [10, 50]. Faca um programa que que lendo n umerosdo teclado e pare quando o usu ario entrar com o primeiro n umero entre [10, 50].program Validacao;var n:integer;beginwrite(Entre com um numero no intervalo [10,50]: ); readln(n);while ((n50)) do beginwriteln(ERRO: Numero invalido.);write(Entre com um numero no intervalo[10,50]: ); readln(n);end;writeln(O numero positivolido foi: ,n);end.Exemplo 4.6Facaumprogramaqueleiaumaquantidaden, (vamossuporquen 0)eemseguidaoprograma deve ler n idades inteiras e ent ao deve imprimir a m edia das idades lidas.program MediaIdades;var x,soma,lidos,n : integer;beginwrite(Entre com a quantidadede idades a ler: );readln(n);lidos:=0;soma := 0;while (lidos0) then writeln(A media das idades e ,soma/lidos)else writeln(Nao foi lido nenhuma idade.);end.35Exemplo 4.7O c alculo da raiz quadrada de um n umero positivo n pode ser aproximado usando se a seguintes erie:n2= 1 + 3 + 5 + + (2n 1) =n

k=1(2k 1)Se n e um quadrado perfeito, ent ao podemos calcular a raiz usando-se o seguinte c odigo:...readln(n);soma := 0; i := 1; raiz := 0;whilesomando beginsoma := soma+i;i := i+2;raiz := raiz+1end;writeln(raiz);...Caso n n ao seja um quadrado perfeito podemos obter uma aproximac ao considerando a parte inteira daraiz. Seja r = n. Ent ao r2 n < (r + 1)2Fazendo duas modicac oes no trecho acima:...readln(n);soma := 0; i := 1; raiz := 0;whilesoma=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 0Execuc ao dospassos 6 e 7.Inicializac ao deSoma e n.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0; while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 0Teste da condic aodo while.Elemento lido e 0 ?1 0 ?Sim. Entrar no loop.421. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x; n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 01 1 Execuc ao dospassos 9 e 10.Acumular valor em Soma.Incrementar n.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: ); readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 1Execuc ao dospassos 11 e 12.Leitura do valor 2.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0; while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 1Teste da condic aodo while.Elemento lido e 0 ?2 0 ?Sim. Entrar no loop.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x; n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 2Execuc ao dospassos 9 e 10.Acumular valor em Soma.Incrementar n.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: ); readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 2Execuc ao dospassos 11 e 12.Leitura do valor 3.431. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0; while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 2Teste da condic aodo while.Elemento lido e 0 ?3 0 ?Sim. Entrar no loop.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x; n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 26 3Execuc ao dospassos 9 e 10.Acumular valor em Soma.Incrementar n.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: ); readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 2-1 6 3Execuc ao dospassos 11 e 12.Leitura do valor -1.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0; while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end;14. writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 2-1 6 3Teste da condic aodo while.Elemento lido e 0 ?1 0 ?N ao. Ir para o pr oximocomando depois do loop.1. program Sequencia;2. var x,soma,n : integer;3. begin4. write(Entre com um numero: );5. readln(x);6. soma := 0;7. n := 0;8. while (x>=0) do begin9. soma := soma + x;10. n := n + 1;11. write(Entre com um numero: );12. readln(x);13. end; writeln(Soma=,soma,Quantidade=,n);15. end.x Soma nlixo lixo lixo1 0 02 1 13 3 2-1 6 3Impress ao de Soma e n.Soma = 6n = 3445.2 Alinhamento de ComandosNesta sec ao apresentamos algumas formas de alinha-mento que visam a melhor visualizac ao dos coman-dos (ou declarac oes) que est ao sob atuac ao de outros.Estas permitem que programas quem melhor apre-sentados e mais f aceis de se entender. A id eia e fazercom que os comandos que est ao sob atuac ao de ou-tros estejam alinhados e deslocados alguns espacos adireita.A seguir apresentamos exemplos de alinhamentopara alguns comandos. O leitor n ao necessariamenteprecisa seguir esta regra, mas e importante que se usealguma regra razo avel de alinhamento dos comandos.Obs.: As barras verticais s ao apenas para visualizar oalinhamento dos comandos.- Declarac oes: const, type e var.const MAX= 101;PI= 3.14158;type MeuInteiro = integer;TipoNome = string[50];var a, b, c : integer;x, y, z: real;- Bloco de Comandos:beginComando1;Comando2;...ComandoN;end;- Comando if-then, if-then-else.if (Condic ao) then Comando;if (Condic ao) then beginComando1;...ComandoN;end;if (Condic ao) then beginComando1;...ComandoN;end else beginComandoN+1;...ComandoN+M;end;- Comando forfor i:=(Express ao) to (Express ao) do Comando;for i:=(Express ao) to (Express ao) do beginComando1;...ComandoN;end;- Comando whilewhile (Condic ao) do Comando;while (Condic ao) do beginComando1;...ComandoN;end;- Comando repeatrepeatComando1;...ComandoN;until (Condic ao);45Alinhamento de comandos encaixadosQuando um comando e colocado internamente a outro comando, o comando interno e todos sobre sua atuac aos ao deslocados adicionalmente ao alinhamento do comando externo.Exemplo 5.1No exemplo a seguir apresentamos o esboco de um programa com alguns comandos encaixadosem outros e o alinhamento em cada um deles.program EsbocoAlinhamento;var a, b, c : integer;x, y, z: real;beginif (Condic ao) then beginComando1;for i:=(Express ao) to (Express ao) do beginComandoF1;...ComandoFN;end;if (Condic ao) then beginComandoI1;for i:=(Express ao) to (Express ao) do beginComandoIF1;...ComandoIFN;end;while (Express ao) do beginif (Condic ao) then beginComandoIFT1;...ComandoIFTN;end else beginComandoIFEN+1;...ComandoIFEN+M;end;ComandoIW1;...ComandoIWN;end;end;end;repeatComandoR1;...ComandoRK;until (Condic ao);end.465.3 Programac ao por EtapasQuando um programacomeca a car maior ou mais complicado, e comum se fazer primeiroum esboco,contendo operac oes em alto nvel, mesmo que sejam complexas. Nos passos seguintes este esboco e detalhadoem operac oes mais especcas at e que se chegue na codicac ao do programa na linguagem de programac ao.Exemplo 5.2Faca um programa que l e tr es n umeros a, b e c e verica se estes n umeros formam os lados deum tri angulo. Em caso armativo, o programa verica se o tri angulo formado e equil atero (tr es lados iguais),is oceles (dois lados iguais) ou escaleno (tr es lados diferentes).Vamos desenvolver este programa por etapas. Podemos considerar os seguintes passos principais:Passo 1: Leia a, b e c.Passo 2: Se (a, b, c) n ao formam um tri angulo ent aoPasso 3: Escreva: Os valores lidos n ao formam um tri angulo.Passo 4: Sen ao se (a, b, c) formam um tri angulo equil atero ent aoPasso 5: Escreva: Os valores lidos formam um tri angulo equil atero.Passo 6: Sen ao se (a, b, c) formam um tri angulo is oceles ent aoPasso 7: Escreva: Os valores lidos formam um tri angulo is oceles.Passo 8: Sen aoPasso 9: Escreva: Os valores lidos formam um tri angulo escaleno.Esta estrutura descreve uma estrat egia para resolver o problema, sem se preocupar com cada um dos testesmais complicados (condic oes que est ao destacadas). A traduc ao dos comandos n ao destacados para a lin-guagem Pascal e praticamente direta. Assim, vamos nos preocupar com cada um dos testes destacados.1. No passo 2, temos de vericar quando tr es n umeros n ao formam os lados de um tri angulo. Isto pode serfeito vericando se um dos valores e maior que a soma dos outros dois valores. Assim, podemos trocara condic ao do passo 2 por:(a > b +c) ou (b > a +c) ou (c > a +b)2. No passo 4 devemos testar se os valores a, b e c formam um tri angulo equil atero. Isto e verdadeiro seos tr es valores s ao iguais e pode ser feito usando duas relac oes de igualdade.(a = b) e (b = c)3. No passo 6 devemos testar se os valoresa,b ec formam um tri angulo is oceles. Neste caso devemosvericar se qualquer dois dos tr es valores s ao iguais.(a = b) ou (a = c) ou (b = c)4. Note que um tri angulo equil atero tamb em e um tri angulo is oceles.Assim, a ordem em que os tipos s aotestados e importante para qualicar melhor os tri angulos.Substituindo estas condic oes no algoritmo acima e traduzindo para a Linguagem Pascal, temos:47program triangulo;var a,b,c: real;beginwrite(Entre com o primeiro lado: ); readln(a);write(Entre com o segundo lado: ); readln(b);write(Entre com o terceiro lado: ); readln(c);if ((a > b +c) or (b > a +c) or (c > a +b))then n ao existe tri angulowriteln(Os n umeros n ao formam um tri angulo.)elseif (a = b) and (a = c)then e tri angulo equil aterowriteln(O tri angulo e equil atero)elseif (a = b) or (a = c) or (b = c)then e tri angulo is oceleswriteln(O tri angulo e is oceles)else e tri angulo escalenowriteln(O tri angulo e escaleno)end.Exemplo 5.3Programa para ler 3 n umerosn1, n2en3e imprimir(n1, n2, n3) de maneira a carem emordem n ao decrescente de valor.Um primeiro esboco, que apresenta uma estrat egia para se resolver o problema, e dada a seguir:1. Ler os tr es n umeros nas vari aveis n1, n2, n3.2. Trocar os valores das vari aveisn1, n2, n3, de forma que n3 cont em um maior valor entren1, n2, n3.Neste momento, n3 cont em um valor correto.3. Trocar os valores das vari aveis n1, n2, de forma que n2 cont em um maior valor entre n1, n2.4. Imprimir (n1, n2, n3).Em um segundo passo, podemos descrever a estrat egia acima de forma mais detalhada, omitindo algunspassos ainda desconhecidos.48program ordena3;var n1, n2, n3: real;beginwrite(Entre com o primeiro n umero: ); readln(n1);write(Entre com o segundo n umero: ); readln(n2);write(Entre com o terceiro n umero: ); readln(n3);if (n3 < n1)thentroca valores de n3 e n1if (n3 < n2)thentroca valores de n3 e n2Neste ponto, n3 cont em um maior valor dos tr es valores lidos.if (n2 < n1)thentroca valores de n2 e n1Neste ponto, n2 cont em um segundo maior valor dos tr es valores lidos.Ap os acertar os valores em n3 e n2, observe que n1 cont em um menor valor dos tr es lidos.writeln(n1, n2, n3);end.Agora considere o problema de se trocar os valores contidos em apenas duas vari aveis. Digamos quevoc e queira trocar os valores das vari aveis A e B. N ao e possvel passar o valor de A para B diretamente, j aque isto faria com que perd essemos o valor original de B. Da mesma forma, tamb em n ao e possvel passar ovalor de B para A diretamente, sem perda do valor original de A. Isto nos induz a usar uma outra vari avelauxiliar, AUX, para primeiro guardar o valor de B, em seguida passar o valor de A para B, e depois passaro valor de AUX para A. Isto nos d a a seguinte seq u encia de operac oes:AUX B; B A; A AUX;Substituindo este processo de troca dos valores em vari aveis no pseudo programa acima, obtemos o se-guinte programa nal:program ordena3;var n1,n2,n3, AUX: real;beginwrite(Entre com o primeiro numero: ); readln(n1);write(Entre com o segundo numero: ); readln(n2);write(Entre com o terceiro numero: ); readln(n3);if (n3 media) then writeln(nota3);if (nota4 > media) then writeln(nota4);if (nota5 > media) then writeln(nota5);if (nota6 > media) then writeln(nota6);if (nota7 > media) then writeln(nota7);if (nota8 > media) then writeln(nota8);if (nota9 > media) then writeln(nota9);if (nota10 > media) then writeln(nota10);end.Figura 18: Leitura de 10 notas, c alculo da m edia e impress ao das maiores notas, usando vari aveis simples.Note que o programa da gura 18 est a cheio de duplicac oes e c alculos id enticos para cada nota. Agora54imagine este programa feito para uma turma de 100 alunos. Certamente n ao seria nada agrad avel ler, escreverou programar desta maneira.Vari aveiscompostashomog eneascorrespondemaposic oesdemem oria, identicadasporummesmonome, individualizadas por ndices e cujo conte udo e de mesmo tipo.Assim, o conjunto de 10 notas pode ser associado a apenas um identicador, digamos NOTA, que passar aa identicar n ao apenas uma unica posic ao de mem oria, mas 10. A refer encia ao conte udo don- esimo ele-mento do conjunto ser a indicada pela notac ao NOTA[n], onde n e um valor inteiro (tamb em podendo ser umaexpress ao cujo resultado e inteiro).85 100 50 40 70 80 95 65 75 901 2 3 4 5 6 7 8 9 10Figura 19: Vetor de 10 notas representado pelo identicador NOTA.Na gura 19, a nota de valor 70, que est a na quinta posic ao da seq u encia de notas e obtida como NOTA[5].A declarac ao de um vetor e feita usando a seguinte sintaxe:Identicador : array[FaixaEscalar] of Tipo de Cada Elemento;Onde Faixa Escalar indica uma faixa de valores escalares. Naturalmente, se desejamos trabalhar com Kelementos, ent ao o vetor deve ser declarado com pelo menosKposic oes na faixa. Os elementos do vetordevem ser referenciados com valores de ndice que pertencem a faixa de valores escalares usada na declarac aodo vetor.Exemplo 6.2Exemplo de declarac ao de vetores:V : array[1..1000] of integer;VetReais : array[10..10] of real;VetIndLetras : array[a..z] of real;Exemplo 6.3O seguinte programa l e 10 notas em um vetor e imprime os elementos que est ao acima da m edia.Vamos projetar nosso programa por etapas, usando a seq u encia dos seguintes passos:1. Leia o 10 valores reais no vetor.2. Calcule a m edia M.3. Imprima os valores maiores que M.55program LeImprimeVetorReal;const MAX =10 ;type TipoVetorReal = array[1..MAX] of real;var i : integer;v : TipoVetorReal;M,Soma : real;begin Passo 1: Leitura dos n valores reais no vetor for i:=1 to n do beginwrite(Entre com o ,i,-esimoelemento: );readln(v[i]);end; Passo 2: C alculo da M edia dos n valores lidos Soma := 0;for i:=1 to n do Soma := Soma + v[i];M := Soma/n; Passo 3: Impress ao dos valores maiores que Mwriteln(Valores maiores que a media ,M,:);for i:=1 to n doif (v[i]>M) then writeln(v[i]);end.Exemplo 6.4Faca um programa para imprimir uma seq u encia de n umeros lidos em ordem inversa.program Inverte;const TamMax = 100;var i,n : Integer;v : array [1..TamMax] of Integer;beginReadln(n); 0