Like this document? Why not share!

# Apostila pascal

## by aspereira14 on Oct 31, 2012

• 2,034 views

### Views

Total Views
2,034
Views on SlideShare
2,034
Embed Views
0

Likes
0
85
0

No embeds

## Apostila pascalDocument Transcript

• INTRODUÇÃO À LINGUAGEM DE PROGRAMAÇÃO /###### /### /##### /##### /### /###| ### /### /### ### /###__/### / ###__/## /### ### | ###| ###| ### /###_/ ### | #### /_/ | ### |/_/ /###_/ ### | ###| ######_/ | ### | ### / #### | ### | ### | ### | ###| ###__/ | ######### / #### | ### | ######### | ###| ### | ###__/### /### ### |/ ### /## | ###__/### | ###| ### | ### | ### |/ ##### / ##### / | ### | ### | #######|/__/ |/__/ |/__/ /____/ /____/ |/__/ |/__/ |/______/ SEMESTRE 2008/1
• SUMÁRIO1 - FUNDAMENTOS DE PROGRAMAÇÃO ............................................ 1 1.1 O QUE SÃO ALGORITMOS ?.................................................................. 1 1.1.1 POR QUE PRECISAMOS DE ALGORITMOS ?.................................... 2 1.1.2 MÉTODO PARA CONSTRUIR UM ALGORITMO ................................ 2 1.1.3 EXERCÍCIOS ............................................................................. 3 1.2 TIPOS DE INFORMAÇÃO ...................................................................... 3 1.2.1 TIPOS INTEIROS (NUMÉRICOS) .................................................... 3 1.2.2 TIPOS REAIS (NUMÉRICOS) ......................................................... 3 1.2.3 TIPOS CARACTERES .................................................................. 4 1.2.4 TIPOS LÓGICOS ......................................................................... 4 1.3 VARIÁVEIS ........................................................................................ 4 1.3.1 ARMAZENAMENTO DE DADOS NA MEMÓRIA ................................. 4 1.3.2 CONCEITO E UTILIDADE DE VARIÁVEIS ........................................ 4 1.4 INSTRUÇÕES PRIMITIVAS .................................................................... 5 1.5 REPRESENTAÇÃO DE ALGORITMOS ATRAVÉS DE FLUXOGRAMAS............. 6 1.5.1 EXERCÍCIOS ............................................................................. 6 1.6 INTRODUÇÃO A LINGUAGEM PASCAL ................................................... 7 1.6.1 PROGRAMAS FONTE, OBJETO E EXECUTÁVEL .............................. 8 1.6.2 NOMES DOS ARQUIVOS EM DISCO................................................ 92 - FUNDAMENTOS DA PROGRAMAÇÃO EM PASCAL .......................... 11 2.1 ESTRUTURA DE UM PROGRAMA EM PASCAL ......................................... 11 2.1.1 IDENTIFICADORES .................................................................... 12 2.1.2 TIPOS DEFINIDOS DO PASCAL ..................................................... 13 2.1.2.1 TIPO INTEIRO ................................................................ 14 2.1.2.2 TIPO BOOLEAN .............................................................. 14 2.1.2.3 TIPO CHAR.................................................................... 14 2.1.2.4 TIPO REAL .................................................................... 14 2.1.2.5 TIPO STRING ................................................................. 14 2.1.3 DECLARAÇÃO DE VARIÁVEIS ...................................................... 15 2.1.4 DECLARAÇÃO DE CONSTANTES .................................................. 15 2.1.5 COMANDO DE ATRIBUIÇÃO ........................................................ 16 2.1.6 COMENTÁRIOS .......................................................................... 17 2.1.7 EXPRESSÕES ARITMÉTICAS ........................................................ 17 2.1.8 FUNÇÕES MATEMÁTICAS PRÉ-DEFINIDAS ..................................... 18 2.1.9 EXPRESSÕES LÓGICAS ............................................................... 19 2.2 EXERCÍCIOS ...................................................................................... 203 - ENTRADA E SAÍDA DE DADOS ..................................................... 23 3.1 COMANDOS DE ENTRADA ................................................................... 23 3.2 COMANDOS DE SAÍDA......................................................................... 24 3.3 FORMATAÇÃO ................................................................................... 27 3.4 O COMANDO CLRSCR ......................................................................... 29 3.4.1 EXERCÍCIOS ............................................................................. 30 3.5 EXERCÍCIOS AVANÇADOS .................................................................... 324 - ESTRUTURAS DE DECISÃO .......................................................... 33 4.1 COMANDOS COMPOSTOS .................................................................... 33 4.2 A ESTRUTURA DE DECISÃO IF ............................................................. 33
• 4.2.1 EXERCÍCIOS DE FIXAÇÃO ........................................................... 41 4.2.2 EXERCÍCIOS ............................................................................. 43 4.2.3 EXERCÍCIOS OPCIONAIS ............................................................. 45 4.3 A ESTRUTURA DE DECISÃO CASE......................................................... 46 4.4 EXERCÍCIOS ...................................................................................... 495 - ESTRUTURAS DE REPETIÇÃO ...................................................... 51 5.1 A ESTRUTURA DE REPETIÇÃO FOR ...................................................... 51 5.1.1 EXERCÍCIOS ............................................................................. 60 5.1.2 EXERCÍCIOS OPCIONAIS ............................................................. 61 5.2 A ESTRUTURA DE REPETIÇÃO WHILE .................................................. 62 5.2.1 EXERCÍCIOS ............................................................................. 64 5.2.2 EXERCÍCIOS OPCIONAIS ............................................................. 65 5.3 A ESTRUTURA DE REPETIÇÃO REPEAT-UNTIL ....................................... 66 5.3.1 EXERCÍCIOS ............................................................................. 726 - FUNÇÕES E PROCEDIMENTOS ..................................................... 73 6.1 FUNÇÕES .......................................................................................... 73 6.1.1 ESTRUTURA DE UMA FUNÇÃO .................................................... 73 6.1.2 FUNÇÕES DEFINIDAS POR SOMATÓRIOS ....................................... 85 6.2 PROCEDIMENTOS............................................................................... 86 6.2.1 DEFINIÇÃO, PROCEDIMENTOS SEM PARÂMETROS ......................... 86 6.2.2 PROCEDIMENTOS COM PARÂMETROS .......................................... 89 6.2.3 EXERCÍCIOS ............................................................................. 937 - VETORES E MATRIZES ................................................................ 97 7.1 DECLARAÇÃO DE TIPOS ..................................................................... 97 7.2 VETORES .......................................................................................... 97 7.2.1 EXERCÍCIOS ............................................................................. 99 7.3 MATRIZES ......................................................................................... 100 7.3.1 EXERCÍCIOS ............................................................................. 102
• 11 − FUNDAMENTOS DE PROGRAMAÇÃO1.1 O QUE SÃO ALGORITMOS ? O uso de algoritmos é quase tão antigo quanto a matemática. Com o passar do tempo, entretanto,ele foi bastante esquecido pela matemática. Com o advento das máquinas de calcular e mais tardeos computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar ocaminho para a solução dos mais variados problemas. Algoritmo não é a solução do problema, pois, se assim fosse, cada problema teria um únicoalgoritmo. Algoritmo é o caminho para a solução de um problema, e em geral, os caminhos quelevam a uma solução são muitos. Ao longo dos anos surgiram muitas formas de representar os algoritmos, alguns utilizandolinguagens semelhantes às linguagens de programação e outras utilizando formas grácas. Oaprendizado de algoritmos não se consegue a não ser através de muitos exercícios. Algoritmos não se aprende: À especicação da seqüência ordenada de passos que deve ser seguida para a realização de umatarefa, garantindo a sua repetibilidade, dá-se o nome de algoritmo. Embora esta denição de algoritmoseja correta, podemos denir algoritmo, de maneira informal e completa como: Algoritmos é um conjunto de regras, bem denidas, para a solução de um problema em um tempo nito e com um número nto de passos. Algoritmo pode ser denido também como um conjunto de valores como entrada e produz algumvalor ou conjunto de valores como saída. Um algoritmo deve sempre possuir pelo menos um resultado,normalmente chamado de saída, e satisfazer a propriedade da efetividade, isto é, todas as operaçõesespecicadas no algoritmo devem ser sucientemente básicas para que possam ser executadas demaneira exata e num tempo nito.
• 31.1.3 EXERCÍCIOS 1a Questão) Elabore um algoritmo que mova 3 discos de uma torre de Hanói, que consiste em3 hastes (a-b-c), uma das quais serve de suporte para os três discos de tamanhos diferentes (1-2-3),os menores sobre os maiores. Pode-se mover um disco de cada vez para qualquer haste, sendo quenunca deve ser colocado um disco maior sobre um menor. O objetivo é transferir os três discos dahaste A para haste C. Figura 1.1: Torres de Hanoi Mova <disco n> da haste <n1> para haste <n2> - - - - -1.2 TIPOS DE INFORMAÇÃO Todo o trabalho realizado por um computador é baseado na manipulação das informaçõescontidas em sua memória. Estas informações podem ser classicadas em dois tipos: • As instruções, que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados. • Os dados propriamente ditos, que correspondem à porção das informações a serem processadas pelo computador. A classicação apresentada a seguir não se aplica a nenhuma linguagem de programaçãoespecíca; pelo contrário, ela sintetiza os padrões utilizados na maioria das linguagens.1.2.1 TIPOS INTEIROS (NUMÉRICOS) São caracterizados como tipos inteiros, os dados numéricos positivos ou negativos. Excluindo-sedestes qualquer número fracionário. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56,1024 entre outros.1.2.2 TIPOS REAIS (NUMÉRICOS) São caracterizados como tipos reais, os dados numéricos positivos e negativos e númerosfracionários. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1.2, -45.987 entreoutros.
• 7 Figura 1.3: Simbologia dos Fluxogramasportuguês para passar-lhe as instruções necessárias à execução de cada atividade. Escreva os passosnecessários para o nosso robô executar: • encher uma bacia com água; • trocar uma lâmpada no teto de sua casa; • trocar o pneu de um carro; • calcular a sua idade daqui a 20 anos; • calcular a média de um aluno com 3 notas. 6a Questão) É comum ouvirmos programadores experimentados armarem: algoritmos ...aprendi e nunca usei na prática ... não vejo necessidade.... Discuta esse tipo de armativa.1.6 INTRODUÇÃO A LINGUAGEM PASCAL A linguagem Pascal se destina à programação de computadores. Foi desenvolvida no nal dosanos 60 na Suíça e seu nome é uma homenagem ao criador da primeira calculadora mecânica, omatemático francês do século XVII Blaise Pascal.
• 9executar os comandos básicos da linguagem. Por exemplo, você pode usar uma função trigonométricano seu programa fonte, e na hora dela ser executada, o computador saberá como calculá-la. Quemé que ensina ao computador a calcular valor de função trigonométrica? A resposta a essa perguntaé simples: toda linguagem de programação possui um conjunto de instruções básicas pronto paraser adicionado a qualquer programa objeto. Esse conjunto de instruçÕes é a biblioteca padrão dalinguagem. O ato de ligar (link) o programa objeto à biblioteca padrão é chamado ligação (quealgumas pessoas chamam de "linkagem", talvez pelo hábito de usar neologismos). O programa objetoapós a ligação com a biblioteca padrão torna-se um programa executável. +------------+ +------------+ | Programa | COMPILAÇÃO | Programa | | fonte |----------->| objeto | +------------+ +------------+ +-------------+ |----------->| Programa | +-------------+ | executável | | Biblioteca | +-------------+ | padrão | +-------------+1.6.2 NOMES DOS ARQUIVOS EM DISCO Os nomes com os quais os programas de qualquer linguagem de programação são gravados nodisco, obedecem às regras de formação de nomes do sistema operacional: todo arquivo do disco éespecicado por um nome obrigatório com no máximo 8 caracteres e uma extensão opcional com nomáximo 3 caracteres. O nome e a extensão são separados por um ponto. Os caracteres que podem aparecer no nome ou extensão são letras, algarismos e algunscaracteres especiais como: ( ) - _ \$ ! @ # Não podem fazer parte donome ou extensão os seguintes caracteres: + ? * / | < > [ ] : ; , . É comum um programa fonte em Pascal ter extensão PAS. Se você não mencionar a extensãode um arquivo, o Pascal incluirá automaticamente a extensão PAS, sempre que for feito algum usodo mesmo. Neste caso, dizemos que PAS é a extensão "default"( = omissão, falta) do Pascal. Aextensão, geralmente, classica o tipo do arquivo. Algumas extensões bastante comuns são: PAS ---> Programa fonte em Pascal BAS ---> Programa fonte em BASIC C ---> Programa fonte em C FOR ---> Programa fonte em FORTRAN PRO ---> Programa fonte em PROLOG ASM ---> Programa fonte em Assembly BAK ---> Arquivo cópia (back up) de outro BAT ---> Arquivo de lote (batch) EXE ---> Programa executável
• 10 COM ---> Programa executável OBJ ---> Programa objeto SYS ---> Arquivo usado pelo sistema operacional DOC ---> Texto TXT ---> Texto TPU ---> Unidade do Turbo Pascal Por exemplo, para um programa que trate da resolução de sistemas lineares, um nome naturalpoderia ser SISTEMA.PAS. No entanto, o usuário poderia chamá-lo de @##!.)\$\$ se quisesse. Ambossão nomes válidos para o Pascal, aliás, para o DOS. Se no disco aparecer também um SISTEMA.BAKe um SISTEMA.EXE, então é muito provável que o SISTEMA.BAK seja apenas uma cópia doSISTEMA.PAS e o SISTEMA.EXE seja sua versão executável. Outras versões de Pascal, bem comooutras linguagens de programação, costumam criar arquivos OBJ no disco, correspondentes aosprogramas objeto, mas não é esse o caso do Turbo Pascal. Logo, o programa objeto correspondentea SISTEMA.PAS será mantido apenas na memória e você não terá em disco um SISTEMA.OBJ.
• 112 − FUNDAMENTOS DA PROGRAMAÇÃO EM PASCAL2.1 ESTRUTURA DE UM PROGRAMA EM PASCAL Um programa em Pascal é um conjunto de palavras e símbolos especiais (comandos, variáveis,funções, algarismos, parênteses, ...) escritos segundo as regras de uma sintaxe pré-xada e possui aseguinte estrutura: • Cabeçalho; • Especicação das unidades usadas pelo programa; • Declarações de tipos, constantes, variáveis, rótulos, funções e procedimentos; • Seção principal. O cabeçalho é usado para dar nome ao programa e possui a forma: PROGRAM Nome_do_programa; O cabeçalho é identicado pela palavra chave PROGRAM, seguida de um nome que identicaráo programa, e encerra-se com um ponto-e-vírgula. Ele serve apenas para orientação do usuário.Exemplo: PROGRAM Teste; Uma linha como essa, atribui o nome Teste a um programa. A especicação das unidadesusadas é feita com um comando USES, seguido dos nomes das unidades a serem usadas separadaspor vírgula, com um ponto-e-vírgula no nal da linha: USES unidade1, unidade2, ... ; Em Pascal, diversos comandos podem ser agrupados em conjuntos denominados unidades (units).Temos assim uma unidade para vídeo, outra para manipulação de arquivos em disco, outra com oscomandos grácos, etc. Exemplo: USES Crt, Graph; Esta declaração permite que sejam usados no programa comandos, funções, constantes, ... dasunidades CRT e GRAPH. A seção principal do programa inicia-se com a palavra chave BEGIN, seguida de linhas decomandos, e encerra-se com a palavra chave END seguida de um ponto:
• 13 DIV INTERRUPT THEN DO LABEL TO DOWNTO MOD TYPE ELSE NIL UNIT END NOT UNTIL EXTERNAL OF USES FILE OR VAR FOR PACKED WHILE FORWARD PROCEDURE WITH FUNCTION PROGRAM XOR Existem, ainda, alguns identicadores que, apesar de terem um signicado pré-denido para oPascal, não são palavras reservadas, como por exemplo: REAL, INTEGER, READ, WRITE, PI,SIN, COS. O signicado ou a função desses identicadores podem ser redenidos e alterados pelousuário.2.1.2 TIPOS DEFINIDOS DO PASCAL O diagrama a seguir, classica os tipos pré- denidos do Pascal que serão mais utilizandos nocurso. +---------------------+ | TIPOS PRÉ-DEFINIDOS | +---------------------+ | +-------------------------+ | | +-----------+ +--------------+ | SIMPLES | | ESTRUTURADOS | +-----------+ +--------------+ | | | +---+ | | | Array +-----------------------+ | | | string ordinal real | | +---------------+ +------------+ | | | | boolean char inteiro +-----+ | | | real +----+ | integer Vale ressaltar que a linguagem não possui apenas os tipos abaixo, mas estes é que aparecerão em99% dos problemas. Em resumo vamos trabalhar com o seguintes tipos:
• 14 - Integer - Real - String - Char - Boolean (Lógico) - Array2.1.2.1 TIPO INTEIRO O tipo inteiro formado pelo subconjunto de inteiros, de acordo com a seguinte tabela: Tipo Domínio Tamanho -------------------------------------------------- integer [-32768, 32767] 2 bytes --------------------------------------------------2.1.2.2 TIPO BOOLEAN O tipo boolean é formado pelas constantes TRUE (verdadeiro) e FALSE (falso) e é usado parase avaliar expressões lógicas. É um dos tipos mais usados do Pascal.2.1.2.3 TIPO CHAR O tipo caracter (char) é formado pelo conjunto dos 256 caracteres ASCII (letras, algarismos esímbolos especiais como +, =, %, \$, #, <, etc.). As constantes deste tipo são escritas entre apóstrofos:A, B, 3, etc.2.1.2.4 TIPO REAL O tipo real possui o seguinte domínio e tamanho: Tipo Domínio Dígitos Tamanho -------------------------------------------------------- real [2.9E-39, 1.7E38] 11-12 6 bytes -------------------------------------------------------- Em Pascal, as potências de 10 são indicadas com um E. Por exemplo, 2E07 é o mesmo que 2vezes 10 elevado a 7; 3.28E-11 é o mesmo que 3,28 multiplicado por 10 à -11. Os domínios anteriores referem-se aos valores absolutos das constantes. Com isso, temos queo tipo real da tabela acima corresponde aos números que estão na união dos intervalos [2.9E-39,1.7E38] e [-1.7E38, -2.9E-39]. Está sendo indicada também a quantidade de dígitos signicativos decada tipo.2.1.2.5 TIPO STRING O tipo string é uma seqüência de caracteres de comprimento variando de 0 a 255. Escrevendostring[N], estamos denindo N como tamanho máximo da seqüência (neste caso N deve ser menorou igual a 255). As constantes do tipo string devem estar entre apóstrofos. Exemplo: TYPE Nome = string[40];
• 15 Neste exemplo está sendo declarado o tipo Nome que é uma seqüência de até 40 caracteres.Podem ser consideradas deste tipo as constantes Turbo Pascal 5.0, 1991/1992 e UFPB - CCEN -Dep. de Matematicá. Falaremos dos tipos restantes em capítulos posteriores.2.1.3 DECLARAÇÃO DE VARIÁVEIS Todas as variáveis usadas por um programa em Pascal devem obrigatoriamente ser declaradascom antecedência em um bloco de declarações VAR da seguinte forma: VAR Identificador, ..., Identificador: Tipo1; Identificador, ..., Identificador: Tipo2; ... ... Seguem alguns exemplos de declaração de variáveis na linguagem Pascal: VAR x, y, z: real; i, j, k: integer; Inicio, Fim: boolean; Tamanho: integer Nome_do_arquivo: string[15]; Neste bloco VAR estão sendo declaradas as variáveis x, y, z como sendo do tipo real, uma variávelTamanho do tipo integer, além de outras variáveis (i, j, ...). Os tipos das variáveis não podem sermudados durante a execução do programa e os valores que elas podem assumir devem ser compatíveiscom o seu tipo declarado. Por exemplo, a variável i acima pode assumir o valor 2309, mas não podeassumir um valor fracionário como 0.71.2.1.4 DECLARAÇÃO DE CONSTANTES As constantes de um programa Pascal devem ser declaradas em um bloco CONST na forma: CONST Identificador = Expressão; Identificador = Expressão; ... ... Identificador: tipo = Valor; Identificador: tipo = Valor; ... ... Seguem alguns exemplos de declaração de constantes: CONST
• 16 Pi = 3.1415926; NumeroMaximoDeLinhas = 1024 + 253 + 5; Mensagem: string[20] = Hello world!; X: integer = 7; As constantes que são declaradas sem a especicação de tipo não podem ser alteradas durantea execução do programa. Aquelas cujas declarações contiverem o tipo base, chamadas constantestipadas, desempenham um papel parecido com o das variáveis e podem ser alteradas durante aexecução do programa. A diferença entre uma variável e uma constante tipada é que a variável nãopode ter nenhum "valor inicial"na sua declaração.2.1.5 COMANDO DE ATRIBUIÇÃO A atribuição de um valor ou de uma expressão a um identicador é feita através do operador deatribuição := . A sintaxe de uma operação de atribuição é: Identificador := expressão; Neste tipo de operação, a expressão e o identicador devem ser do mesmo tipo, exceto no caso emque o identicador for do tipo real e a expressão do tipo inteiro (pois, neste caso, o valor inteiro daexpressão será automaticamente transformado em real). Exemplo: Considere a seguinte declaracãode variáveis: VAR a, b, c: integer; x, y: real; teste: boolean; data: string; Neste caso, são válidas as atribuições: a := -17; x := y + 3.14; teste := false; data := 5/12/1991 Mas não são válidas as atribuições: teste := a + b + 1; c := 6.02E23; Em caso de várias atribuições a um mesmo identicador, será considerada apenas a últimaatribuição efetuada.
• 172.1.6 COMENTÁRIOS Comentários são usados para aumentar a clareza de um programa. Todos os comentários sãodesprezados na hora da compilação, logo, eles não têm inuência no desempenho e nem no tamanhodo programa objeto. Um comentário é colocado entre chaves ou entre (* e *). { Este é um exemplo de comentário... } (* e este também é um comentário! *) Para o Pascal, as declarações VAR abaixo serão consideradas equivalentes. Para o usuário, osegundo bloco de declarações VAR oferece mais clareza. VAR mat, nota, cod: string; VAR mat, { matrícula } nota, { nota final } cod: { codigo do curso } string;2.1.7 EXPRESSÕES ARITMÉTICAS As operações aritméticas pré-denidas do Pascal são: + Adição - Subtração / Divisão * Multiplicação DIV Quociente da divisão MOD Resto da divisão inteira inteira 9/2 = 4.5 -3*7 = -21 9 DIV 2 = 4 9 MOD 2 = 1 10 DIV 2 = 5 10 MOD 2 = 0 Estas operações podem ser utilizadas com operandos reais ou inteiros, exceto DIV e MOD queexigem operandos inteiros. A prioridade entre as operações é a mesma da Matemática: i. Primeiramente, são efetuadas as multiplicações e divisões (/, DIV e MOD); ii. por último, são efetuadas as adições e subtrações. Temos então dois níveis de prioridades. Dentro de um mesmo nível, são efetuadas as operações da esquerda para a direita. Exemplo: Na expressão 5 - 2/3*7 + 1 as operaçoes são efetuadas na seguinte ordem: divisão,multiplicação, subtração e adição. Se uma expressão contiver parênteses, então será executado primeiramente o que estiver entreparênteses. Exemplo:
• 18 Expressão Valor ------------------------ 5 + 2*4 13 (5 + 2)*4 28 7 DIV 2*3 9 7 DIV (2*3) 1 ------------------------ Observações: i. Não existe operador pré-denido para a potenciação. ii. O sinal de multiplicação nunca poderá ser omitido. iii. A divisão / sempre fornece um resultado real, mesmo que os operandos sejam inteiros. iv. Se todos os operandos forem inteiros e as operações envolvidas forem +, -, *, MOD ou DIV, então o resultado será inteiro.2.1.8 FUNÇÕES MATEMÁTICAS PRÉ-DEFINIDAS Entre as muitas funções pré-denidas do Pascal, as que estão relacionadas com valores numéricossão: Função Descrição Tipo do resultado ------------------------ ------------------------------ LN Logaritmo natural real EXP Exponencial de base e real ABS Valor absoluto real ou inteiro SQR Quadrado real ou inteiro SQRT Raiz quadrada real SIN Seno real COS Cosseno real ARCTAN Arco-tangente real ROUND Arredondamento inteiro TRUNC Parte inteira inteiro INT Parte inteira real FRAC Parte fracionária real ODD Testa se é ímpar booleano ------------------------------------------------------- Em todas elas deve-se acrescentar um argumento entre parênteses à frente do nome da função,como em COS(x) ou SQRT(y). O Pascal não tem pré-denidas funções como tangente, secante,arco-seno, ... . Em breve será mostrado como o usuário poderá denir essas funções, bem comooutras com domínio e contradomínio mais complexos. Exemplo: O modulo do seno do quadrado de x e codicado como ABS(SIN(SQR(x))). Neste tipode expressão, é obrigatório que a quantidade de parênteses abertos seja a mesma de fechados. Exemplo: O quociente entre x2 + 3x e x2 + 5 se escreve como (SQR(x) + 3*x)/(SQR(x) + 5) oucomo (x*x + 3*x)/(x*x + 5). Nestes casos, o uso dos parênteses é fundamental.
• 19 Exemplo: A derivada do arco-seno de x, ou seja, 1 sobre a raiz quadrada da diferença entre 1 eo quadrado de x, se escreve como 1/SQRT(1 - SQR(x)). Exemplo: O cubo de x pode ser codicado como x*x*x, ou como EXP(3*LN(x)). Em geral, xelevado a y pode ser codicado como EXP(y*LN(x)). Exemplo: A função booleana ODD testa se um inteiro n e impar ou não. ODD(n) fornece umvalor TRUE se n for ímpar e FALSE em caso contrário. Desse modo, ODD(5) = TRUE e ODD(4)= FALSE. Exemplo: TRUNC(1.35) = 1 (inteiro) TRUNC(1.97) = 1 (inteiro) INT(1.35) = 1 (real) INT(1.97) = 1 (real) ROUND(1.35) = 1 ROUND(1.97) = 2 FRAC(1.35) = 0.35 FRAC(1.97) = 0.97 As funções INT e TRUNC são numericamente equivalentes. A diferença entre elas está apenasno tipo do valor retornado.2.1.9 EXPRESSÕES LÓGICAS Expressão lógica (ou expressão booleana) é uma expressão cujos operadores são operadores lógicose cujos operandos são relações ou variáveis do tipo booleano. Os operadores lógicos são AND (e),OR (ou), NOT (não) e XOR (ou exclusivo). Se X e Y são variáveis ou constantes booleanas, então: i. X AND Y é TRUE somente quando X e Y forem ambas TRUE. ii. X OR Y é FALSE somente quando X e Y forem ambas FALSE. iii. NOT X é TRUE quando X for FALSE e é FALSE quando X for TRUE. Uma relação é uma comparação realizada entre valores do mesmo tipo, cujo resultado é TRUEou FALSE. A comparação é indicada por um dos operadores relacionais a seguir: = igual <> diferente < menor > maior <= menor ou igual >= maior ou igual No caso de variáveis do tipo CHAR ou STRING, será usada a ordem alfabética para compararduas constantes ou variáveis. Exemplo: Sejam a, b, c, d variaveis booleanas cujos valores são: a := 1 < 2; b := 3 >= 5; c := a OR b; d := a AND b; Como 1 < 2 é uma relação verdadeira, temos que a tem valor TRUE; 3 >= 5 é falso, logo, b temvalor FALSE. Sendo a TRUE e b FALSE temos que c é TRUE, pois a OR b só seria FALSE se a eb fossem ambas FALSE. O valor de d é FALSE, uma vez que b é FALSE. Exemplo: Consideremos as variaveis x, y, z, nome1, nome2 e teste declaradas abaixo:
• 20 VAR x, y, z: byte; nome1, nome2: string; teste: boolean; Considere também as seguintes atribuições: x := 3; y := 10; z := 4; nome1 := Guizinha; nome2 := Olezinho; teste := false; Temos então: Expressão Valor -------------------------------------------- x <= y TRUE (x = z) OR (x + z >= y) FALSE nome1 < nome2 TRUE (nome1 <> nome2) AND (NOT teste) TRUE (nome1 = nome2) AND (x = y) FALSE (NOT (x > z)) OR teste OR (y <> z) TRUE Odd(x) AND (NOT Odd(y)) TRUE Odd(x) XOR Odd(y + 1) FALSE (x mod 3 = 0) AND (y div 3 <> 1) FALSE Sqr(Sin(x)) + Sqr(Cos(x)) = 1 TRUE -------------------------------------------- A prioridade das operações aritméticas, lógicas e relacionais está denida na seguinte tabela: Prioridade Operadores ------------------------------------- 1 (alta) NOT 2 *. /, DIV, MOD, AND 3 +, -, OR, XOR 4 (baixa) =, <=, >=, <, >, <> -------------------------------------2.2 EXERCÍCIOS 1a Questão) Escreva as seguintes expressões de acordo com a sintaxe do Pascal: 3 2 a) sen(2x) = 2.sen(x).cos(x) b) x + 5x - 2x + 4
• 21 1 arctg(x) + |x| c) ------------------- d) e Ln(x + Ln(x)) + 1 1a Questão) Considere as constantes e as variáveis denidas abaixo: CONST x: real = -3.2; y: real = 4.00; m: integer = 7; n: integer = 11; p: integer = -5; VAR a: integer; z: real; a) Calcule os valores de a ou z após as seguintes atribuições: i) a := m MOD 2 + n DIV (m + p); ii) a := TRUNC(x)*ROUND(SQRT(2)) iii) a := SQR(p + 1) MOD (m MOD ABS(p)); iv) z := SQRT(2*m + p)/ROUND(EXP(1)); v) z := INT(11/7) - FRAC(1/(1 + n + 2*p)); b) Detecte o que está errado com as atribuições abaixo: i) a := 1 + 3*y; ii) a := ((n - 1)/2) MOD 3; iii) z := SIN(1 - COS(ARCTAN(2)); iv) z + 5 := x - y; 3a Questão) Sejam a, b, c três variáveis que, em determinado momento da execução de umprograma, valem respectivamente 1, 2 e 3. Avalie o valor das seguintes expressões lógicas: a) Odd(a) OR Odd(b) AND Odd(c); b) NOT (b <> (a + c) DIV 2) AND NOT (a = 0) c) (a = b + c) XOR (b = c + a) d) (c >= a) AND (NOT (a = 5*b - 3*c) OR (c <= a + b)) 4a Questão) X e Y são duas constantes com valores -3 e 5, e CLASSIFICA é uma variávelbooleana com valor FALSE em determinado momento. Determine o valor que está sendo atribuídoà variável booleana TESTE em cada um dos casos:
• 22a) TESTE := X > Y;b) TESTE := NOT (Abs(X*Y) >= 5e20);c) TESTE := (X > 0) OR (Y > 10*Abs(X)) OR Classifica;d) TESTE := (X + Y > 1) AND (Sqrt(Y) < 1.2E-9);
• 243.2 COMANDOS DE SAÍDA Um comando de saída transfere dados para um dispositivo de saída (vídeo, impressora). Osdados que podem ser transferidos são valores ou expressões envolvendo constantes ou variáveis. Doiscomandos de saída bastante usados são WRITE e WRITELN que têm sintaxes: WRITE(v1, v2, ...); ---> Mostra na tela os valores de v1, v2, ... WRITELN(v1, v2, ...); ---> Mostra na tela os valores de v1, v2, ... e posiciona o cursor no início da próxima linha na tela. Onde v1, v2, ... acima podem ser expressões envolvendo variáveis ou constantes do tipo inteiro,real, string, booleano ou char. Exemplo: Suponhamos que X seja uma variavel inteira de um programa, com valor 15 no momentoem que for executado o comando: WRITELN(O valor encontrado foi , X); Neste caso, o computador mostrará na tela algo como: O valor encontrado foi 15 Depois posicionará o cursor no início da linha seguinte a essa na tela. Observe que a mensagem"O valor encontrado foi "é uma constante do tipo string. Portanto, neste exemplo, o comando desaída mostra os valores de uma constante e de uma variável. Exemplo: Suponhamos que X, Y, Z, A, B e C sejam variaveis com valores respectivamente iguaisa Antonio , Jose , Maria , 60, 75 e 90. Então, o comando: WRITELN(x, a, y, b, z, c); Exibirá na tela algo como: Antonio 60 Jose 75 Maria 90 A seqüência de comandos: WRITELN(x); WRITELN(a); WRITELN(y); WRITELN(b); WRITELN(z); WRITELN(c); Mostrará algo como:
• 25 Antonio 60 Jose 75 Maria 90 Enquanto que WRITELN(x, y, z); WRITELN(a, b, c); Exibirá: Antonio Jose Maria 607590 Em cada um desses casos, o cursor cará posicionado no início de uma nova linha. Exemplo: Vamos elaborar agora nosso primeiro programa completo. Queremos digitar doisnúmeros inteiros no teclado e desejamos que o computador mostre sua soma no vídeo. Sejam Num1e Num2 os nomes das variáveis que vão guardar na memória os valores dos números digitados noteclado. A atribuição de valores a Num1 e Num2, neste caso, será feita por um comando como READ(Num1, Num2); Ou como: READLN(Num1, Num2); No entanto, quando o computador executar esse tipo de comando, em momento nenhum ele lheindicará se ele está esperando um, dois, três ou mais números. Tampouco indicará o tipo de dadoque está sendo esperado, se é um dado numérico ou não. Devido a isso, é recomendado que antes dequalquer comando READ ou READLN, o programa contenha uma linha anterior com um WRITEou WRITELN para mostrar alguma mensagem que oriente o usuário. Neste caso, colocaremos um comando WRITE para mostrar a mensagem Forneca dois numerosinteiros : . WRITE(Forneca dois numeros inteiros : ); Uma vez introduzidos os valores de Num1 e Num2, para somá- los e mostrar o resultado da somana tela, basta colocar a expressão Num1 + Num2 em um comando de saída: WRITELN(Soma = , Num1 + Num2);
• 26 Observe que neste WRITELN temos uma constante do tipo string Soma = e uma expressãoaritmética Num1 + Num2. Nosso programa ca, então, com o seguinte aspecto: PROGRAM SomaDeDoisInteiros; VAR Num1, Num2: integer; BEGIN WRITE(Forneca dois numeros inteiros : ); READLN(Num1, Num2); WRITELN(Soma = , Num1 + Num2); END. Estamos atribuindo o nome SomaDeDoisInteiros ao programa. Observe que os comandos doprograma (WRITE..., READLN..., ...) devem car na seção principal do programa delimitados pelaspalavras BEGIN e END. Não pode ser omitido o ponto após o END. O bloco VAR de declaração devariáveis deve vir antes da seção principal. É comum se deslocar para a direita as linhas de comandos compreendidas entre um BEGIN e umEND. Esse tipo de deslocamento é chamado endentação. Uma vez digitado este programa, pressionesimultaneamente as teclas CTRL e F9 para que ele seja executado.No caso deste programa, vocêverá em uma parte da tela algo parecido com: Forneca dois numeros inteiros : 11 27 Soma = 38 _ O caracter de sublinhado _ acima representa a posição do cursor na tela. Qualquer outra saídade dado posterior à execução do programa seria feita a partir dessa posição. Se a seção principaldeste programa fosse: BEGIN WRITELN(Forneca dois numeros inteiros : ); READLN(Num1, Num2); WRITE(Soma = , Num1 + Num2); END. Então teríamos uma tela como: Forneca dois numeros inteiros : 11 27 Soma = 38_ Observe a diferença na posição nal do cursor. Observação: sem parâmetros, ou seja, só o nome do comando seguido imediatamente de um pontoe vírgula. Um WRITELN sem parâmetros causa a impressão de uma linha em branco. Por exemplo:
• 27 WRITELN; WRITELN; WRITELN;Isso causa a impressão de três linhas em branco. Um READLN sem parâmetros faz o computador car esperando que se pressione a tecla ENTERpara poder continuar. Temos assim, uma maneira de causar uma pausa na execução de um programa.Durante a execução do fragmento de programa a seguir, o computador coloca uma mensagem na tela(Para continuar...), e pára temporariamente a execução até ser pressionado ENTER. ... ... WRITE(Para continuar, pressione [ENTER]); READLN; ... ...3.3 FORMATAÇÃO A impressão dos valores a serem impressos por um WRITE ou WRITELN pode ser formatadaatravés da especicação da largura do campo de impressão ou do número de casas decimais. Para valores do tipo inteiro, booleano, string ou char, basta colocar o tamanho do campo deimpressão à direita do valor a ser impresso. Neste caso, o valor e o tamanho do campo devem estarseparados por dois pontos (:). WRITE(V:n) ou WRITELN(V:n) ---> Imprime o valor de V em um campo de n espaços Se o valor de n for maior do que a quantidade necessária para a impressão do valor de V, entãoa largura do campo será completada com espaços em branco adicionados à esquerda. Exemplo: Consideremos x1, x2, s1, s2 variaveis com valores denidos pelas atribuições x1 := 8; s1 := A; x2 := 19; s2 := *; Para cada comando WRITE abaixo, temos as seguintes saídas mostradas na tela: Comando Saída --------------------------------------------------- WRITE(x1) 8 WRITE(x1:2) ^8 WRITE(x1:10) ^^^^^^^^^8 WRITE(x1, s1, x2, s2) 8A19* WRITE(x1, , s1, , x2, , s2) 8^Â19^* WRITE(x1, s1:2, x2:5, s2:3) 8^Â^^19^^* WRITE(x1:6, x2:2) ^^^^^819 WRITE(x1, :5, x2) 8^^^^^19 ---------------------------------------------------
• 28 O símbolo na tabela acima assinala os espaços em branco. Em um comando WRITE ouWRITELN, a impressão de n espaços em branco pode ser feita acrescentando-se à lista de valores aserem impressos uma expressão da forma :n, como no último exemplo da tabela acima. O tamanhodo campo de impressão pode ser uma expressão aritmética. Por exemplo, WRITE(dado:5) é o mesmoque WRITE(dado:(11 - 9 + 3)). Para se formatar a impressão de um valor real, devem ser fornecidos dois inteiros quecorrespondem ao tamanho do campo de impressão e à quantidade de casas decimais a seremimpressas. WRITE(x:M:N) ou WRITELN(x:M:N) ---> Imprime o valor de x em um campo de largura M, com N casas decimais. Se o valor de M for maior do que a quantidade necessária para a impressão do valor de x, então alargura do campo será completada com espaços em branco adicionados à esquerda. O ponto decimalou o sinal negativo ocupam um espaço do campo de impressão. O tamanho do campo de impressãoe a quantidade de casas decimais podem ser fornecidos em forma de expressão aritmética. Valoresreais sem formatação são impressos em forma de potências de 10. Exemplo: Consideremos Pi e X constantes reais com valores respectivamente iguais a3.1415926535 e -1991. A tabela a seguir mostra as diversas saídas geradas pelo respectivo comandoWRITE. Denotamos os espaços em branco por . Comando Saída ------------------------------------- WRITE(X:9:3) -1991.000 WRITE(X:15:2) ^^^^^^^-1991.00 WRITE(X:10:2) ^^-1991.00 WRITE(X) -1.9910000000E+03 WRITE(Pi) 3.1415926535E+00 WRITE(Pi:4:2) 3.14 WRITE(Pi:7:2) ^^^3.14 WRITE(Pi:10:3) ^^^^^3.141 WRITE(Pi:10:6) ^^3.141592 WRITE(Pi:10:8) 3.14159265 WRITE(Pi:5:0) ^^^^3 ------------------------------------- Exemplo: Vamos construir agora um programa que solicita ao usuário a medida de um ânguloem graus (um número inteiro) e mostra na tela o seno, o cosseno e a tangente do ângulo fornecido.As funções trigonométricas pré-denidas SIN(x) e COS(x) operam com um ângulo x em radianos.Logo, o programa deve ser esperto o suciente para transformar o ângulo em graus, fornecido pelousuário, para um valor equivalente em radianos. Isto é feito através de uma multiplicação por Pi/180.O Pascal tem o valor de Pi pré-denido com 19 casas decimais. Vamos usar três variáveis reais "seno","cosseno"e "tangente"para guardar os valores desejados. Vamos exigir que a impressão dos valoresseja em um campo com 8 espaços e 4 casas decimais. PROGRAM Sen_Cos_Tg; { Calculo do seno, cosseno e tangente de um angulo } VAR
• 30 PROGRAM AreaDoTriangulo; { Dados os números reais a, b, ç é fornecida o valor da área do triângulo cujos lados têm essas medidas. } USES CRT; { Permite o uso de comandos da unidade CRT, como o CLRSCR. Deve ser colocado nesta posição, logo abaixo do cabeçalho } VAR a, b, c, p, area: REAL; BEGIN CLRSCR; { Limpa a tela } { Leitura dos valores de a, b e c } WRITE(Valor de a: ); READLN(a); WRITE(Valor de b: ); READLN(b); WRITE(Valor de c: ); READLN(c); { Calculo da area } p := (a + b + c)/2; area := SQRT(p*(p - a)*(p - b)*(p - c)); { Impressao dos resultados na tela } WRITELN; WRITELN(A area do triangulo cujos lados medem); WRITELN(a:7:3, ,, b:7:3, e ,c:7:3, é , area:7:3); END. A impressão de um apóstrofo é obtida colocando-se dois apóstrofos consecutivos como parte daconstante string. Assim, WRITELN( e  ) tem como saída na tela um "é", que não chega a serum "e"acentuado, mas ajuda na leitura. No lugar dos três READLN acima, poderíamos ter colocadoapenas um READLN(a, b, c). Este programinha não é inteligente o suciente para rejeitar na entradavalores negativos ou valores inválidos como a = 3, b = 5, c = 11. Após sua execução com os valoresa = 5, b = 7 e c = 8,4, temos as seguintes mensagens na tela: Valor de a: 5 Valor de b: 7 Valor de c: 8.4 A area do triangulo cujos lados medem 5.000, 7.000 e 8.400 é 17.4793.4.1 EXERCÍCIOS 1a Questão) Escreva um programa em Pascal que leia duas variáveis A e B e depois calcule eimprima a média dos valores lidos. 2a Questão) Crie um programa que leia quatro números do teclado e imprima a média deles natela. 3a Questão)Elabore um programa que leia cinco números do teclado e imprima o produto deles. 4a Questão)Escreva um programa que leia seis números inteiros do teclado e imprima a somadeles. 5a Questão)Apresente o seguinte algoritmo: i. Ler 2 valores, no caso variáveis A e B.
• 31 ii. Efetuar a soma das variáveis A e B colocado seu resultado na variável X; iii. Apresentar o valor da variável X após a soma dos dois valores indicados. 6a Questão)Elabore um programa que leia a quantidade de chuva em polegadas e imprima aequivalente em milímetros (25,4 mm = 1 polegada). 7a Questão)Dados dois lados de um triângulo retângulo, faça um programa para calcular ahipotenusa. 8a Questão) Leia 2 variáveis A e B, que correspondem a 2 notas de um aluno. A seguir, calculea média do aluno, sabendo que a nota A tem peso 3 e a nota B tem peso 7. 9a Questão) Leia 3 variáveis A e B e C, que são as notas de um aluno. A seguir, calcule a médiado aluno, sabendo que a nota A tem peso 2, a nota B tem peso 3 e a nota C tem peso 5. 10a Questão) Leia 4 variáveis A,B,C e D. A seguir, calcule e mostre a diferença do produto deA e B pelo produto de C e D (A*B-C*D). 11a Questão) O custo ao consumidor de um carro novo é a soma do custo de fábrica coma percentagem do distribuidor e dos impostos (aplicados ao custo de fábrica). Supondo que apercentagem do distribuidor seja de 12% e os impostos 45%, preparar um programa para ler ocusto de fábrica do carro e imprimir o custo ao consumidor. 12a Questão) Escreva um programa que leia uma temperatura em graus Celsius e converta paragraus fahrenheit. 5∗(F −32) C= 9 13a Questão) Escrever um algoritmo para calcular o volume de uma esfera sendo fornecido ovalor de seu raio. V olume = 4 .π.R3 3Onde π e uma constante que vale 3.1415 e R é o raio da esfera. 14a Questão)Leia 4 variáveis A,B,C e D. A seguir, calcule e mostre a diferença do produto de Ae B pelo produto de C e D (A*B-C*D). 15a Questão)Entrar com dois números inteiros e exibir a seguinte saída: Dividendo: Divisor: Quociente: Resto: 16a Questão)Entrar com um ângulo em graus e exibi-lo em radianos. 17a Questão) Entrar com um ângulo em graus e exibir o valor do seno, co-seno e tangente. 18a Questão)Faça um programa que entre com o saldo e aplique um percentual de 10%. Mostreo valor com o reajuste. 19a Questão) Leia um número com três dígitos e imprima-o na ordem inversa, ou seja, se onúmero for 453 imprima 354. 20a Questão) Uma pessoa resolveu fazer uma aplicação em uma poupança programada. Paracalcular rendimento, ela deverá fornecer o valor constante da aplicação mensal, a taxa e o número demeses. Sabendo-se que a fórmula usada nesse cálculo e:
• 32 (1+i)2 −1 V alorCalculado = P ∗ i Onde: i. i = Taxa; ii. P = Aplicação Mensal iii. n = número de meses Faça um algoritmo que calcule o valor da aplicação.3.5 EXERCÍCIOS AVANÇADOS 1a Questão) Preparar um programa para ler os comprimentos dos três lados de um triângulo(S1, S2 e S3) e calcular a área do triângulo de acordo com a fórmula: Area = T (T − S1)(T − S2)(T − S3)Onde, S1+S2+S3 T = 2
• 334 − ESTRUTURAS DE DECISÃO Para resolver problemas complexos, um programa deve ser capaz de tomar decisões e escolheruma entre várias possibilidades. Nestes casos, são necessárias avaliações bem sucedidas de condiçõeslógicas. O Pascal dispõe de duas estruturas que podem determinar uma direção especíca para umprograma: o comando IF-THEN-ELSE e o comando CASE.4.1 COMANDOS COMPOSTOS Chamaremos de comando composto a toda seqüência nita de instruções separadas entre si porum ponto-e-vírgula e delimitadas pelas palavras chave BEGIN e END. Exemplo: A seqüência de comandos a seguir é um comando composto: BEGIN ClrScr; Write(Valor de x? ); Readln(x) END Todo ponto-e-vírgula escrito antes de um END é opcional. É por isso que omitimos oponto-e-vírgula do Readln(x) acima. Também é comum se acrescentar alguns espaçoes em branconas linhas de comandos entre o BEGIN e o END (esse acréscimo de espaços em branco costuma serchamado endentação ou indentação). Onde a sintaxe do Pascal permitir uma instrução simples,também permitirá um comando composto.4.2 A ESTRUTURA DE DECISÃO IF A estrutura de decisão IF seleciona para execução um entre dois comandos, ou decide se umdeterminado comando será executado ou não. A estrutura consiste das cláusulas obrigatórias IF (se)e THEN (então) seguidas, opcionalmente, de uma cláusula ELSE (senão). Sua sintaxe é: IF condição THEN BEGIN comando1; END ELSE BEGIN comando2; END; ou IF condição THEN BEGIN comando1;
• 34 END; onde condição é uma expressão booleana. Se a condição for verdadeira, isto é, for avaliadaem TRUE, então será executado o comando1; se a condição for falsa (FALSE), será executado ocomando2. Na sua segunda forma (sem o ELSE), o IF não executará nenhuma ação se a condiçãofor falsa. IF IF | | / / TRUE / FALSE TRUE / FALSE +-----<cond>-----+ +-----<cond>-----+ | / | | / | | / | | / | v v v | +----------+ +----------+ +----------+ | | comando1 | | comando2 | | comando1 | | +----------+ +----------+ +----------+ | | | | | +--->---+---<----+ +-------<--------+ | | O comando1 ou comando2 acima podem ser comandos compostos ou outras estruturas de decisão. Exemplo: Consideremos a seguinte estrutura de decisão: IF (x > 0) THEN BEGIN WRITE(Sqrt(x)); END ELSE BEGIN x := 1; END; Neste caso, se x for um valor numérico positivo, então será mostrado o valor da sua raiz quadrada.Em caso contrário, será atribuído a x o valor constante 1. A condição neste caso é a expressão lógicax > 0, o comando1 é o WRITE(Sqrt(x)) e o comando2 é a atribuição x := 1. A condição lógica desteexemplo não precisaria estar entre parênteses. OBSERVAÇÃO IMPORTANTE: Não deve haver ponto-e-vírgula antes do ELSE. Sehouvesse, o ponto-e-vírgula seria considerado o nal do IF e, neste caso, o ELSE seria considerado ocomando seguinte ao IF e seria rejeitado. Exemplo: Suponhamos que x seja uma variável real de um programa e consideremos o seguinteIF: IF (x > -1) AND (x < 1) THEN BEGIN Writeln(X tem modulo menor do que 1);
• 35 END ELSE BEGIN Writeln(X tem modulo >= 1); END; Se x em determinado momento valer 2, então a expressão booleana (x > -1) AND (x < 1)será falsa e, assim, será mostrada na tela a mensagem X tem modulo >= 1. Os parênteses dessaexpressão booleana são essenciais. Sem eles, teríamos x > -1 AND x < 1 Veja que o AND tem prioriade sobre os operadores de comparação > e < , caríamos com umaexpressão sem sentido equivalente a x > (-1 AND x) < 1. Exemplo: Consideremos o seguinte fragmento de um programa, no qual estão denidas a variávelbooleana CONTINUAR, a variável do tipo char RESPOSTA, e as variáveis inteiras A e B. ... Write(Continua? (s/n) ); Readln(resposta); Continuar := (resposta = S) OR (resposta = s); (* CONTINUAR será TRUE somente quando RESPOSTA for um S, maiúsculo ou minúsculo *) IF Continuar THEN BEGIN (* Inicio do comando composto 1 *) Write(Forneca o valor de A : ); Readln(A); Write(Forneca o valor de B : ); Readln(B); END (* Fim do comando composto 1. Nao pode ter ponto-e-vírgula aqui *) ELSE BEGIN (* Inicio do comando composto 2 *) Writeln; Writeln(Pressione ENTER para encerrar); Readln; END; (* Fim do comando composto 2 e fim do IF *) ... No IF acima, se CONTINUAR for verdadeira, então serão solicitados valores para A e B. Emcaso contrário, o programa esperará ser pressionado a tecla ENTER para encerrar. Nas constantesdo tipo char ou string, é feita distinção entre letras minúsculas e maiúsculas. Logo, S é consideradodiferente de s. Exemplo: Queremos, neste exemplo, elaborar um programa que solicite do usuário um númeroreal qualquer x e que seja mostrado na tela a sua raiz quadrada. Se, por exemplo, x for igual a 4,queremos ver na tela uma mensagem como: A raiz quadrada de 4.000 é 2.000
• 36 Se x for negativo, por exemplo -9, queremos ver algo como A raiz quadrada de -9.000 é 3.000 i A função pré-denida SQRT(x) calcula a raiz quadrada de x, se x for maior do que ou iguala 0. Portanto, se x for negativo, deveremos calcular a raiz de -x e acrescentar um "i"à direita doresultado. Temos assim uma situação em que o programa deve decidir se calcula SQRT(x) ou secalcula SQRT(-x), um caso típico de uma estrutura de decisão IF: PROGRAM RaizQuadrada; VAR x: real; BEGIN Write(Valor de x? ); Readln(x); IF (x >= 0) THEN BEGIN Writeln(A raiz quadrada de , x:7:3, e ,SQRT(x):7:3); END ELSE BEGIN Writeln(A raiz quadrada de , x:7:3, e ,SQRT(-x):7:3, í); END; END. Exemplo: A ordem denida no conjunto das constantes do tipo string ou char é uma extensãoda ordem alfabética. As letras maiúsculas são diferenciadas das minúsculas e ocupam uma posiçãoanterior às mesmas. Assim, a ordem nesses conjuntos satisfaz a: A < B < C < ... < Z < ... < a < b < ... < z Devido a isso, temos que X < b, JOAO PESSOA < joao, Matematica < logica. No fragmento a seguir, nome1, nome2 e aux são duas variáveis do tipo string. Queremos compararnome1 com nome2, e se nome1 for maior do que nome2, queremos trocar os valores de nome1por nome2 entre si. Toda troca de valores de variáveis só é possível com a ajuda de uma variávelintermediária, que neste caso será aux. ... IF (nome1 > nome2) THEN BEGIN aux := nome1; (* Troca nome1 *) nome1 := nome2; (* por nome2 *) nome2 := aux; END; Se tivéssemos, por exemplo, nome1 = Joaó e nome2 = Aná, após a execução do IF anteriorpassaríamos a ter nome1 = Aná e nome2 = Joaó. Observe que um fragmento como
• 37 ... IF (nome1 > nome2) THEN BEGIN nome1 := nome2; nome2 := nome1; END; ...não faria a troca desejada. Neste caso, nome1 e nome2 cariam ambas iguais a Ana e o valor Joaoestaria perdido. Exemplo: O programa a seguir, testa se três números reais fornecidos pelo usuário podem serusados como medidas dos lados de um triângulo retângulo. Exige-se que os valores sejam todospositivos e fornecidos em ordem crescente. Uma vez fornecido os números, o teste para saber seeles formam um triângulo retângulo ou não será testar se o quadrado do maior deles é a soma dosquadrados dos menores. PROGRAM TrianguloRetangulo; VAR a, b, c: real; teste: boolean; BEGIN Write(Forneca 3 números positivos em ordem crescente: ); Readln(a, b, c); teste := (a > 0) and (b > 0) and (c > 0) and (a < b) and (b < c); (* TESTE será TRUE somente quando as condições desejadas forem satisfeitas *) IF teste THEN BEGIN IF (Sqr(c) = Sqr(a) + Sqr(b)) THEN BEGIN Writeln(a:6:2, ,, b:6:2, e , c:6:2, formam um, triangulo retangulo.); END ELSE BEGIN Writeln(a:6:2, ,, b:6:2, e , c:6:2, nao , formam um triangulo retangulo.); END; END; ELSE BEGIN Writeln(Os valores fornecidos devem ser positivos e , em ordem crescente.); END; END. Observe que temos dois IFs encaixados. O IF mais interno (IF (Sqr(c)...) só será executadoquando TESTE for TRUE. Exemplo: Sendo fornecidos 3 números reais, o programa a seguir mostra o maior entre eles.
• 38 PROGRAM MaiorDeTres; VAR x, y, z, maior: real; BEGIN Write(Digite tres numeros: ); Readln(x, y, z); Writeln; IF (x > y) THEN BEGIN IF (x > z) THEN BEGIN maior := x; END; ELSE BEGIN maior := z; END END ELSE BEGIN IF (y > z) THEN BEGIN maior := y; END ELSE BEGIN maior := z; END; END; Writeln(O maior dos tres é , maior:6:2) END. Observe a ausência do ponto-e-vírgula em muitas das linhas acima. Exemplo: Resolver uma equação do segundo grau, sendo fornecidos seus coecientes a, b e c.Nosso roteiro na elaboração do programa será o seguinte: • Ler os valores dos coecientes a, b, c; • Vericar se a = 0. Se for, rejeitar os valores fornecidos. Neste caso, usaremos o comando HALT para encerrar a execução do programa; • Calcular o valor do discriminante ∆ = b2 − 4 ∗ a ∗ c; • Se o Delta for maior ou igual a zero, calcular as raízes x1 e x2 usando a conhecidíssima fórmula; • Se o Delta for negativo, calcular as raízes complexas. √ −b+ ∆ x1 = 2a √ −b− ∆ x2 = 2a Estamos colocando o módulo na parte imaginária simplesmente porque queremos que x1 tenhaparte imaginária positiva e x2 a parte imaginária negativa, independentemente de a ser positivo ounão.
• 39• Limpar a tela;• Mostrar a equacao;• Imprimir as raízes.Seguindo esse roteiro, temos o seguinte programa: PROGRAM Eq_2o_Grau; { ======================================================== } { RESOLUCAO DE EQUACOES DO SEGUNDO GRAU } { ======================================================== } USES Crt; VAR a, b, ç delta, x1, x2, ReX, ImX: real; BEGIN Writeln( 2); Writeln(RESOLUCAO DA EQUACAO ax + bx + c = 0); Writeln; Write(Forneca os coeficientes a, b, c : ); Readln(a, b, c); IF (a = 0) THEN { Encerra a execucao quando a = 0 } BEGIN Writeln(O valor de "a" nao deve ser nulo.); HALT; END; { Calculo do discriminante } delta := Sqr(b) - 4*a*c; IF (delta >= 0) THEN { Caso das raizes reais } BEGIN x1 := (-b + Sqrt(delta))/(2*a); { raiz 1 } x2 := (-b - Sqrt(delta))/(2*a); { raiz 2 } END ELSE { Caso das raizes complexas } BEGIN ReX := (-b)/(2*a); { Parte real das raizes } ImX := Abs(Sqrt(-delta)/(2*a)); { Parte imaginaria } END; ClrScr; { Limpa a tela } Writeln( :19, 2); Writeln(EQUACAO: (, a:7:2, )x + (, b:7:2, )x + (, c:7:2, ) = 0); Writeln; IF (delta >= 0) THEN BEGIN Writeln(Raizes reais: , x1:7:2, e , x2:7:2); END ELSE BEGIN Writeln(Raizes complexas: , ReX:7:2, + ,ImX:7:2, í); Writeln( :18, ReX:7:2, - , ImX:7:2, í); END; Readln; { pausa }
• 40 END. Após a execução desse programa, temos na tela mensagens como: 2 EQUACAO: ( 1.00)x + ( -2.00)x + ( 3.00) = 0 Raizes complexas: 1.00 + 1.41 i 1.00 - 1.41 i Deixamos aos usuários com uma disposição maior de trabalho o exercício de melhorar a saídadesses resultados, fazendo-a mais próxima do usual. Por exemplo, no exemplo executado acima, seriamais interessante (e mais trabalhoso) mostrar uma linha como 2 EQUACAO: x - 2 x + 3 = 0. Observação: Um dos aspectos que mais causam confusão com relação ao IF em qualquerlinguagem de programação é o IF encaixado (também chamado de IF aninhado). O problema consistena diculdade de se indenticar que ELSE está relacionado com qual IF. Nestes casos uma boaendentação pode ajudar. Observe o seguinte IF: IF condição1 THEN BEGIN IF condição2 THEN BEGIN comando1; END; END ELSE BEGIN comando2; END; A qual dos dois IFs anteriores o ELSE se refere? A forma na qual os IFs foram escritos sugereerroneamente que o ELSE está relacionado com o primeiro IF. No entanto, ele está relacionado com osegundo IF. Em geral, o ELSE está ligado ao IF mais próximo. Assim, uma forma melhor de escrevero fragmento acima é: IF condição1 THEN BEGIN IF condição2 THEN BEGIN comando1; END ELSE BEGIN comando2; END; END;
• 41 Se quiséssemos realmente que o ELSE estivesse relacionado com o primeiro IF, então a formacorreta de se escrever seria: IF condição1 THEN BEGIN IF condição2 THEN BEGIN comando1; END; END ELSE BEGIN comando2; END; Este tipo de erro lógico em um programa, em geral, é difícil de se detectar. Ele costuma serchamado de "armadilha dos IFs encaixados".4.2.1 EXERCÍCIOS DE FIXAÇÃO 1a Questão) Escreva o programa referente ao uxograma da gura 4.1. Figura 4.1: Fluxograma A 2a Questão) Para os valores (a=5) (b=7) e (c=9), assinale com X a seqüência de execução dosAlgoritmos abaixo: a) SE a = 5 E b = 7 Entao ( ) c: c + 1 ( ) senão ( ) c := c - 1; ( ) fim-se ( )
• 42 b) se a = 5 e b < 7 entao ( ) c := 1 ( ) senao ( ) se c = 8 entao ( ) c := 2 ( ) senao ( ) c := 4 ( ) fim-se ( ) fim-se ( )3a Questão) Escreva o programa referente ao uxograma da gura 4.2.2. Figura 4.2: Fluxograma B4a Questão) Para as saídas, considere os seguintes valores: A=2, B=3, C=5, D=9 e E=6.a) Resposta: _______Se não D > 5 entao X := (A + B) * D;senao X := (A - B) / Cfim-seEscrever Xb) Resposta: _______Se (A > 2) E (B < 7) entao X := (A + 2) * (B - 2);senao
• 43 X := (A + B) / D * (C + D) fim-se Escrever X c) Resposta: ______ Se (A > 2) E (B < 7) entao X := (A + 2) * (B - 2) senao X := X := (A + B) * D / (C + D) fim-se Escrever X d) Resposta: ______ Se (A >= 2) OU (C < 1) Entao X := (A + D) / 2; senao X := D * C; fim-se Escrever X e) Resposta: ______ Se nao (A > 2) ou nao (B < 7) entao X := A + E; senao X := A / E; fim-se Escrever X f) Resposta: ______ Se nao (A > 3) e nao (B < 5) entao X := A + D; senao X := D / B fim-se Escrever X4.2.2 EXERCÍCIOS 1a Questão) Faça um programa que leia dois números inteiros A e B da entrada padrão (teclado)e retorne o quociente da divisão entre A e B. O programa deve vericar, previamente à divisão, se ovalor de B é diferente de zero. 2a Questão) Leia um valor inteiro X e diga se ele é par ou ímpar. 3a Questão) Escreva um algoritmo para receber o sexo e a idade de uma pessoa. Se a pessoa fordo sexo feminino e tiver menos de 25 anos, imprimir o nome e a mensagem: ACEITA. Caso contrário,imprimir o nome e a mensagem não aceita. (Considerar para o Sexo as letras F,f,M ou m). 4a Questão)Faça um programa que leia dois números inteiros A e B da entrada padrão (teclado)e imprima o maior deles. Dê um tratamento caso estes números forem iguais. 5a Questão)Escreva um algoritmo para receber a sigla e o Estado de uma pessoa e imprimiruma das seguintes mensagens:
• 45 16a Questão) Escrever um algoritmo que leia a idade de uma pessoa em dias e informe-a emanos, meses e dias. Suponha que 1 ano possua 365 dias e um mês possua 30 dias. 17a Questão)Faça um algoritmos para ler um número e imprimir se ele é igual a 5, 200 ou 400.Se não vericar se o mesmo está no intervalo entre 500 e 1000 inclusive , ou se está fora do escopoespecicado. 18a Questão)Faça um algoritmo que leia o percurso em quilômetros, o tipo de carro e informeo consumo estimado de combustível, sabendo-se que um carro do tipo C faz 12 Km com um litro degasolina, um do tipo B faz 9 Km e o do tipo A faz 8 Km por litro. 19a Questão) 19a Questão) Um endocrinologista deseja controlar a saúde de seus pacientes e,para isso se utiliza de um índice de massa corporal (IMC). Sabendo-se que o IMC é calculado atravésda fórmula abaixo: P eso IM C = Altura2Onde o Peso é dado em Kg e a Altura é dada em metros. Faça um algoritmo que apresente o nomedo paciente e sua faixa de risco, baseando-se na seguinte tabela 4.2.2:4.2.3 EXERCÍCIOS OPCIONAIS 1a Questão) Escrever um algoritmo que lê a hora de início e hora de término de um jogo,ambas subdivididas em dois valores distintos : horas e minutos. Calcular e escrever a duração dojogo, também em horas e minutos, considerando que o tempo máximo de duração de um jogo é de24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte. 2a Questão) Escrever um algoritmo que lê um valor em reais e calcula qual o menor númeropossível de notas de 100, 50, 10, 5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lidoe a relação de notas necessárias. 3a Questão) Ler três números do teclado e imprimi-los em ordem crescente. 4a Questão)Escrever um algoritmo que lê um conjunto de 4 valores i, a, b, c, onde i é um valorinteiro e positivo e a, b, c, são quaisquer valores reais e os escreva. A seguir: i. Se i=1 escrever os três valores a, b, c em ordem crescente. ii. Se i=2 escrever os três valores a, b, c em ordem decrescente. iii. Se i=3 escrever os três valores a, b, c de forma que o maior entre a, b, c que dentre os dois.
• 464.3 A ESTRUTURA DE DECISÃO CASE O comando IF-THEN-ELSE permite que um entre dois comandos seja executado. O comandoCASE permite que seja selecionado um entre vários comandos. Desse modo, o CASE funciona comouma generalização do IF com a seguinte restrição: a expressão que é usada para selecionar os comandosdeve ser do tipo ordinal. Sua sintaxe é: CASE expressão OF val_1 : comando1; val_2 : comando2; ... ... ELSE comandoN; END; O valor da expressão ordinal é avaliado e comparado com cada valor alvo val_1, val_2, ... .Se existir algum valor alvo que coincida com o valor da expressão, então será executado apenas ocomando que estiver associado aquele valor. Se o valor da expressão não coincidir com nenhum valoralvo, então será executado o comando que estiver associado ao ELSE, se esse comando existir. OELSE de um CASE é opcional. Para encerrar o CASE deveremos ter um END, mas não temos umBEGIN para iniciar. CASE | +---+ val_1 +----------+ | e |--------->----| comando1 |---->----+ | x | +----------+ | | p | val_2 +----------+ | | r |--------->----| comando2 |---->----+ | e | +----------+ | | s | ... ... | | s | | | ã | ELSE +----------+ | | o |--------->----| comandoN |---->----+ +---+ +----------+ | v Exemplo: Suponhamos que x seja uma variável inteira. Então o comando CASE abaixo executaráo comando1 quando tivermos x = 5, o comando2 quando x = 11, o comando3 quando x = -4 e ocomando4 quando x for diferente desses três valores anteriores. CASE x OF 5 : comando1; 11 : comando2; -4 : comando3; ELSE comando4; END;
• 48USES Crt;VAR a, b, resultado: real; opcao, pausa: char;BEGIN Write(Forneca dois numeros: ); Readln(a, b); Writeln; ClrScr; Writeln; (* Impressao do menu na tela *) Writeln(=================== M E N U ==================); Writeln(| |); Writeln(| A = ,a:9:3, |); Writeln(| B = ,b:9:3, |); Writeln(| |); Writeln(+--------------------------------------------+); Writeln(| |); Writeln(| 1. A + B 4. A/B |); Writeln(| 2. A - B B |); Writeln(| 3. A*B 5. A |); Writeln(| |); Writeln(======== Selecione uma opcao de 1 a 5 ========); Writeln; opcao := READKEY; { Le um caracter do teclado } CASE opcao OF { Calcula o resultado desejado } 1 : resultado := A + B; 2 : resultado := A - B; 3 : resultado := A*B; 4 : IF (B <> 0) THEN { A/B nao será calculado } resultado := A/B { se B = 0 } ELSE BEGIN Writeln(Opcao invalida neste caso.); Halt END; 5 : IF (A > 0) THEN { B } resultado := Exp(B*Ln(A)) { A só será } ELSE { calculado se } BEGIN { A for positivo } Writeln(Opcao invalida neste caso.); Halt END; END; { fim do CASE } { Mostra o resultado na tela } Writeln; Writeln(Opcao = , opcao, Resultado = , resultado:9:3); Writeln; Writeln(Pressione qualquer tecla para encerrar.); pausa := READKEYEND.
• 494.4 EXERCÍCIOS 1a Questão) Em que situações é mais indicado o uso da estrutura CASE-OF ? 2a Questão) Em que situações não podemos utilizar a estrutura CASE-OF ? 3a Questão)Desenvolva um programa que leias dois números inteiros da entrada padrão com osnomes A e B e, em seguida, implemente um menu principal com as seguintes opções: a. A + B b. A - B c. A * B d. A / BEm seguida, efetue e mostre o resultado da operação determinada pela opção escolhida. 4a Questão) Faça um programa em Pascal que leia um número que represente um mês do ano.Após a leitura, imprima o mês correspondente por extenso. Caso o número entrado não esteja nafaixa de 1 até 12, imprima uma mensagem informando ao usuário que o mês é inválido. 5a Questão) Faça um programa em pascal que leia a idade de uma pessoa e informe o seu graude maturidade de acordo com a tabela abaixo: Idade Classificação 0 até 3 Bebê 4 até 10 Criança 11 até 18 Adolescente Acima de 18 Adulto 6a Questão) Supondo que a cobrança de imposto de renda na fonte seja feita com base na tabelaabaixo, elabore um programa que mostre na tela o valor do imposto, quando o usuário fornecer ovalor do salário (inteiro). +------------------------+----------+-------------------+ | salario (em Cr\$) | alíquota | parcela a deduzir | +------------------------+----------+-------------------+ | até 200000 | ---- | ----- | | de 200001 a 300000 | 5% | 10000 | | de 300001 a 400000 | 10% | 25000 | | de 400001 a 500000 | 15% | 45000 | | a partir de 500001 | 20% | 70000 | +------------------------+----------+-------------------+ Por exemplo, para um salário de 350000, temos uma alíquota de 10valor do imposto, segundo atabela, deverá ser de 350000 * 0.10 - 25000 = 10000 cruzeiros. 7a Questão) Em cada caso abaixo, determine o valor do inteiro x após a execução do seguinteCASE, sabendo que o valor do inteiro y antes da execução do CASE é:
• 50a) y = 7; CASE y OF -10..0 : x := 5;b) y = -7; 2, 4 : x := y div 2 + Sqr(y - 1); 5..10 : BEGINc) y = 2; IF Odd(y) THEN y := 12; x := Round(Sqrt(y + 5))d) y = -2; END; ELSEe) y = 20 IF y > 4 THEN x := 0 ELSE x := 1; END;
• 515 − ESTRUTURAS DE REPETIÇÃO A repetição é a essência de muitas aplicações em computadores. Uma estrutura de repetição éuma estrutura que comanda os processos de repetição, por mais complexos e complicados que sejam. Uma tarefa essencial no projeto de qualquer estrutura de repetição (também chamada de"loop"ou "laço") é como decidir quando as repetições (ou iterações) devem terminar. O Pascaloferece três estruturas de repetição diferentes, cada uma com um esquema próprio para o controledo processo de repetição: os comandos FOR, WHILE e REPEAT.5.1 A ESTRUTURA DE REPETIÇÃO FOR O FOR especica explicitamente a faixa de iterações. A quantidade de iterações é controlada poruma variável de controle que deve ser do tipo ordinal, cujo valor aumenta ou diminui à medida quecada repetição é executada. Sua sintaxe é: FOR Variável := ValorInicial TO ValorFinal DO BEGIN comando; END; ou FOR Variável := ValorInicial DOWNTO ValorFinal DO BEGIN comando; END; Observe que: • VARIÁVEL é a variável de controle do FOR, que deve ser do tipo ordinal (integer). • VALORINICIAL é o valor que a variável de controle assumirá na primeira iteração. Deve ser do mesmo tipo da variável de controle. • VALORFINAL é o valor que a variável de controle assumirá na última iteração. Deve ser do mesmo tipo da variável de controle. • COMANDO é o comando que será executado em cada iteração. Pode ser uma seqüência nita de outros comandos delimitada por BEGIN-END (comando composto). Se ValorInicial <= ValorFinal, então deve ser usado um FOR-TO. Caso contrário, deve ser usado um FOR-DOWNTO. Um esboço da execução do FOR é o seguinte: i. No início da execução, a variável de controle recebe o valor correspondente ao VALORINICIAL. Se o VALORINICIAL for menor do que ou igual ao VALORFINAL, no caso do FOR-TO, ou se o VALORINICIAL for maior do que ou igual ao VALORFINAL, no caso do FOR-DOWNTO, então a primeira iteração é executada, isto é, o comando escrito após o DO é executado.
• 52 ii. Antes de cada iteração subseqüente, a variável de controle recebe o próximo valor (no caso do FOR-TO) ou o valor anterior (no caso do FOR-DOWNTO) do intervalo ValorInicial..ValorFinal (ou ValorFinal..ValorInicial). iii. O laço assim criado termina após a iteração corresponde ao ValorFinal. Exemplo: FOR i := 1 TO 5 DO Writeln(Sqr(i)); onde i é do tipo inteiro, funciona da seguinteforma: i. É atribuído o valor 1 a i e, como 1 < 5, é executado o comando escrito após o DO, o Writeln(Sqr(i)). Assim, é mostrado o quadrado de 1 na tela; ii. A variável i passa a ter o valor seguinte ao anterior, ou seja, i passa a valer 2 e o comando é executado. É mostrado, então, o quadrado de 2 na tela. iii. A variável de controle i vai ser aumentada de uma em uma unidade e a cada acréscimo o WRITELN é executado. Esse processo acaba quando a variável atingir o valor 5. Quando esse FOR for completamente executado, teremos os valores 1, 4, 9, 16 e 25 mostradosna tela, um em cada linha. Exemplo: FOR i := 5 DOWNTO 1 DO Writeln(Sqr(i)); Este exemplo funciona de forma semelhante ao anterior mas com uma diferença: os valores de ivão variar de 5 até 1, diminuindo de 1 em 1. É mostrado na tela os valores 25, 16, 9, 4 e 1, nessaordem, um em cada linha. Exemplo: Seja x uma variável do tipo char. O FOR a seguir mostra na tela todas as letrasmaiúsculas ABC...XYZ. FOR x := A TO Z DO BEGIN Write(x); END; No entanto, FOR x := z DOWNTO a DO Write(x);mostra o conjunto de todas as letras minúsculas: zyxv...cba. Veja o exemplo abaixo: FOR i := 100 TO 50 DO BEGIN comando; END; FOR j := 1 DOWNTO 20 DO BEGIN comando; END;
• 53 No FOR i... e no FOR j... acima, o comando escrito após o DO não será executado nenhuma vez. Exemplo: A variável de controle do FOR, quando for numérica, terá de ser do tipo inteiro e sópoderá aumentar ou diminuir de 1 em 1. Podemos multiplicar ou dividir essa variável todas as vezesem que ela aparecer no comando, como forma de aumentar ou diminuir o valor do incremento emcada iteração. Por exemplo, FOR i := 0 TO 100 DO Writeln(2*i)lista todos os pares de 0 a 100, e FOR i := 200 DOWNTO 100 DO Writeln(ArcTan(i/100)) lista osvalores de ArcTan(2), ArcTan(1.99), ArcTan(1.98),... até ArcTan(1). Exemplo: Os tipos pré-denidos byte e char ambos têm 256 valores. As funções que estabelemuma bijeção entre esses valores são as funções ORD e CHR, inversas uma da outra. CHR(n) ---> n-ésimo caracter do tipo char; ORD(x) ---> Ordinal do caracter x. Os valores que o n acima podem assumir são de 0 a 255 e o x desde o primeiro ao último caracterpré-denido do computador (de um total de 256). CHR(n) também pode ser denotado como #n. Alguns valores particulares dessas funções são: ORD(\$) = 36 CHR(36) = \$ ou #36 = \$ ORD(+) = 43 CHR(43) = + ou #43 = + ORD(7) = 55 CHR(55) = 7 ou #55 = 7 ORD(A) = 65 CHR(65) = A ou #65 = A ORD(B) = 66 CHR(66) = B ou #66 = B ORD(C) = 67 CHR(67) = C ou #67 = C ORD(Z) = 90 CHR(90) = Z ou #90 = Z ORD() = 92 CHR(92) = ou #92 = ORD(a) = 97 CHR(97) = a ou #97 = a ORD(z) = 122 CHR(122) = z ou #122 = z As tabelas de valores de CHR ou ORD costumam ser chamadas de tabelas ASCII (AmericanStandard Code for Information Interchange). O programa a seguir, gera na tela uma tabela ASCII. PROGRAM TabelaASCII; { ---------------------------------------- } { TABELA ASCII } { ---------------------------------------- } USES Crt; VAR i: byte; BEGIN ClrScr; Writeln( n Chr(n)); Writeln(-----------); FOR i := 0 TO 255 DO BEGIN
• 54 Writeln(i:4, Chr(i):4); IF (i MOD 10 = 0) AND (i > 0) THEN BEGIN Writeln; Writeln(Pressione [ENTER] para continuar.); Readln; Writeln( n Chr(n)); Writeln(-----------); END; { fim do IF } END; { fim do FOR } END. { fim do programa } No programa acima, a variável inteira i varia de 0 a 255. Devido ao IF (i MOD 10...) , sempreque i for maior que 0 e múltiplo de 10 , o programa fará uma pausa. Ao ser pressionado a teclaENTER, serão mostradas mais 10 linhas da tabela e assim o programa prossegue até chegar em i =255. Alguns caracteres ASCII são símbolos que não podem ser impressos. Por exemplo, o #7 é umsom de bip (beep). Ao ser executado, ele gera na tela varios trechos como esse: n Chr(n) ----------- 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F Pressione [ENTER] para continuar. Exemplo: Neste exemplo, vamos calcular o valor de um somatório. Em particular, consideraremosa soma dos 5 primeiros termos da série cujo termo geral é n21 Chamaremos a variável que vai guardar +1o valor do somatório de S. Em todo cálculo de somatório, a variável que irá guardar o valor da somadeverá ter um valor inicial nulo. A seguir, usamos um FOR com variável de controle fazendo o papeldo índice do termo geral do somatório para atuar no comando S := S + Termo_Geral, o que nestecaso, é S := S + 1/(n2 + 1). Ao nal da execução do FOR, temos em S o valor da soma desejada. PROGRAM Somatorio; { ------------------------------------------- } { CALCULO DE UM SOMATORIO } { ------------------------------------------- } VAR S: real; n: integer; CONST IndiceInicial = 1;
• 55 IndiceFinal = 5; BEGIN S := 0; { valor inicial de S } FOR n := IndiceInicial TO IndiceFinal DO BEGIN S := S + 1/(Sqr(n) + 1); END; Writeln(Valor do somatorio = , S:8:4); END. Neste exemplo, são feitas as seguintes atribuições de valores a S: S := 0; S := 0 + 1/2; ( n = 1 ) S := 1/2 + 1/5; ( n = 2 ) S := (1/2 + 1/5) + 1/10; ( n = 3 ) S := (1/2 + 1/5 + 1/10) + 1/17; ( n = 4 ) S := (1/2 + 1/5 + 1/10 + 1/17) + 1/26; ( n = 5 ) Exemplo: Neste exemplo, queremos calcular a soma dos 10000 primeiros termos das séries cujos 1 1termos gerais são n e n2 . Não vamos nos contentar só com o resultado nal, queremos acompanhar ovalor do somatório de 1000 em 1000 termos. A série 1/n2 converge para (π 2 )/6; logo, a raiz quadradade 6 vezes o somatório de 1/n2 fornece uma aproximação para o valor de π . Usaremos quatro caracteres ASCII especiais: o #227 que é um pi minúsculo, o #228 que éum sigma maiúsculo, o #253 que é um expoente 2 e o #247 que usaremos como símbolo deaproximadamente. A unidade CRT dispõe de dois comandos para alterar as cores de textos da tela. São eles oTEXTCOLOR, para alterar a cor do texto, e TEXTBACKGROUND, para alterar a cor de fundo.Suas sintaxes são: TextColor(Nome_da_cor)e TextBackground(Nome_da_cor)onde Nome_da_cor pode ser uma das seguintes constantes: Black = 0; Blue = 1; Green = 2; Cyan = 3; Red = 4; Magenta = 5; Brown = 6; LightGray = 7; DarkGray = 8; LightBlue = 9; LightGreen = 10; LightCyan = 11; LightRed = 12; LightMagenta = 13; Yellow = 14; White = 15; Blink = 128;
• 56 Em cada caso, pode ser usado o nome ou o número da cor. Deve-se somar blink ou 128 aonome ou número da cor do texto para se ter caracteres piscantes. Por exemplo, TextColor(Yellow) éo mesmo que TextColor(14) e ajusta a cor do texto para amarelo. Se somarmos 128 a 14, como emTextColor(14 + 128) teremos um amarelo piscante. Usaremos esses comandos para alterar a cor do cabeçalho do programa; queremos vê-lo em vídeoreverso (letras pretas em fundo branco). PROGRAM DoisSomatorios; { =================================================== } { CALCULO SIMULTANEO DE DOIS SOMATORIOS } { =================================================== } USES Crt; VAR n: integer; Soma1, Soma2: real; BEGIN ClrScr; Writeln; TextColor(Black); TextBackground(White); Writeln( , #228, 1/n , #228, 1/n, #253, ); TextColor(White); TextBackground(Black); Writeln; Soma1 := 0; Soma2 := 0; (* valores iniciais dos somatorios *) FOR n := 1 TO 10000 DO BEGIN Soma1 := Soma1 + 1/n; Soma2 := Soma2 + 1/Sqr(n); IF (n MOD 1000 = 0) THEN (* Se n for multiplo *) BEGIN Writeln(Soma1:10:6, Soma2:10:6); (* de 1000, entao *) END; END; (* é mostrada o valor da soma parcial. *) Writeln; Writeln( , #227, , #247, , Sqrt(6*Soma2):8:6); END. Após a execução, vemos na tela a listagem a seguir. Onde escrevemos S,  π  e =, aparecemna tela, respectivamente, um sigma maiúsculo, um pi minúsculo e um símbolo de aproximação. S 1/n S 1/n^2 7.485471 1.643935 8.178368 1.644434 8.583750 1.644601 8.871390 1.644684
• 57 9.094509 1.644734 9.276814 1.644767 9.430953 1.644791 9.564475 1.644809 9.682251 1.644823 9.787606 1.644834 Pi = 3.141497 Vemos na última linha da tabela acima que o valor das somas dos 10000 termos das séries é9.787606 e 1.644834. Exemplo: Fornecido um inteiro n, vamos construir um programa que forneça o fatorial de n. Vamos chamar a variável que vai guardar o valor do produto de P. Inicialmente, deveremosfazer P := 1. Aliás, para calcularmos repetidamente uma determinada operação, deveremos fazerinicialmente a variável que vai guardar o resultado nal igual ao elemento nêutro da operação. Aseguir, usamos um FOR com um comando do tipo P := P*Termo_Geral, o que, neste caso, é P :=P*n ("n"é o termo geral do produto neste caso). Temos então o seguinte: PROGRAM Fatorial; VAR i, n: integer; P: real; BEGIN Write(Valor de N? ); Readln(n); P := 1; FOR i := 2 TO n DO BEGIN P := P * i; END; Writeln; Writeln(n, ! = , P); END. Neste exemplo, serão executadas as seguintes atribuições: P := 1; P := 1*2; ( i = 2 ) P := (1*2)*3; ( i = 3 ) P := (1*2*3)*4; ( i = 4 ) ... ... ... P := (1*2*...*(n-1))*n; ( i = n ) Um exemplo de execução desse programa: Valor de N? 3
• 58 3! = 6.00000000+E0000 Exemplo: Fornecido um inteiro N, queremos agora um programa que diga se N é primo ou não.Nosso algoritmo será o seguinte: faremos uma variável i variar de 2 até o inteiro mais próximo da raizquadrada de N. Usaremos um FOR i... para isso. Para cada valor de i, calculamos o resto da divisãode N por i, ou seja, N MOD i. Se houver algum resto nulo, isto é, se N MOD i = 0 para algum i, istosignica que N é divisível por i e, portanto, N nesse caso não é primo. Se não acontecer de N MODi = 0 com i variando de 2 até ROUND(SQRT(N)), então N é primo. PROGRAM Primo; VAR N, i: integer; BEGIN Write(Forneca um inteiro N : ); Readln(N); IF (N < 0) THEN BEGIN N := -N; { se N for negativo, então ele } END; { terá seu sinal trocado } IF (N <= 1) THEN { casos particulares } BEGIN Writeln(N, nao e primo.); { N = 0 e N = 1 } END ELSE BEGIN { caso geral } FOR i := 2 TO Round(Sqrt(N)) DO BEGIN IF (N MOD i = 0) THEN BEGIN Writeln(N, nao e primo); Halt; { encerra o programa } END; END; { No caso do FOR encerrar com N MOD i <> 0 para todo i, temos que N e primo: } Writeln(N, e primo.); END; { fim do IF } END. Como um exemplo de execução, temos: Forneca um inteiro N : 13 13 e primo. Exemplo: A variável de controle de um FOR também pode ser do tipo booleano. Neste exemplofaremos um programa que imprime uma tabela-verdade de uma determinada expressão lógica. Paraisso, usaremos dois FOR encaixados para gerar todas as "entradas"da tabela. A expressão lógicadeste exemplo é (X OR Y) AND (NOT X OR NOT Y) que denotaremos por (X v Y) ( X v Y).
• 59 PROGRAM TabelaVerdade; VAR x, y, expressao: boolean; BEGIN Writeln; Writeln(--------------------------------); Writeln( X Y (X v Y) ^ (~X v ~Y)); Writeln(--------------------------------); for x := FALSE to TRUE do begin for y := FALSE TO TRUE do begin if x then begin Write( V ); end else begin Write( F ); end; if y then begin Write( V ); end else begin Write( F ); end; expressao := (x OR y) AND (NOT x OR NOT y); if expressao then begin Writeln( V); end; else begin Writeln( F); end; end; (* fim do FOR y ... *) end; (* fim do FOR x *) Writeln(--------------------------------) END. O único comando do FOR x ... é o FOR y ... . No caso de laços FOR encaixados, o FOR maisinterno varia mais rapidamente que o mais externo. Executando-se esse programa, temos a seguinte tabela: -------------------------------- X Y (X v Y) ^ (~X v ~Y) -------------------------------- F F F F V V
• 60 V F V V V F -------------------------------- Observando a tabela acima, podemos concluir que a expressão (x OR y) AND (NOT x OR NOTy) é equivalente ao ou exclusivo x XOR y.5.1.1 EXERCÍCIOS 1a Questão) Faça um algoritmo que um nome e imprima-o quantas vezes for a quantidade decaracteres do seu nome. 2a Questão) Faça um Programa que leia a nota de PRI e PRII de 5 alunos. Calcule e exiba amédia e situação de cada aluno, ou seja >= 7,0 aprovado, entre 7,0 e 4,0 Prova Final e menor que 4Reprovado. 3a Questão) Escreva um algoritmo que gere o números de 1000 a 1999 e escreva aqueles quedividido por 11 dão resto igual a 5. 4a Questão) Apresente o quadrado de cada um dos números pares entre 1 e 1000, inclusive. 5a Questão) Leia 2 valores: X e Y. A seguir, calcule e mostre a soma dos números impares entreeles. 6a Questão) Leia 2 valores: X e Y. A seguir, calcule e mostre a soma dos números pares entreeles. 7a Questão) Foi feita uma pesquisa entre os habitantes de uma região. Foram coletados os dadosde idade, sexo (M/F) e salário de 10 pessoas. Faça um algoritmo que informe: i. a média de salário do grupo; ii. maior e menor idade do grupo; iii. quantidade de mulheres com salário até R\$100,00. 8a Questão)Faça um programa que mostre na saída padrão (vídeo) o números múltiplos de 3entre 0 e 50. 9a Questão) Faça um algoritmo que leia 2 valores inteiros e positivos: X e Y. O algoritmo devecalcular e escrever a função potência X elevado a Y. 10a Questão) Faça um algoritmo que leia 1 valores para uma N. A seguir, mostre a tabuada deN: 1 x N = N 2 x N = 2N ... 10 x N = 10N 11a Questão) Faça um programa que mostre a seguinte saída: 1 1 2 1 2 3 1 2 3 4
• 61 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 12a Questão) Escreva um algoritmo que leia um número n (número de termos de uma progressãoaritmética), a1 ( o primeiro termo da progressão) e r (a razão da progressão) e escreva os n termosdesta progressão, bem como a soma dos elementos. 13a Questão)Escrever um algoritmo que leia um número n e mostre o número lido e seu fatorial. 14a Questão) Escrever um algoritmo que calcule e mostre a média aritmética dos números lidosentre 13 e 73. 15a Questão) Escrever um algoritmo que gera e escreve os números ímpares entre 100 e 200. 16a Questão) Escreva um algoritmo que lê um valor n inteiro e positivo e que calcula a seguintesoma: 1 S =1+ 2 + 1 + 1 + .... + 3 4 1 nO algoritmo deve escrever cada termo gerado e o valor nal de S. 17a Questão) Escrever um algoritmo que diz se um número X fornecido pelo usuário é ou nãoprimo. 18a Questão) Escreva um algoritmo que leia 10 valores, um de cada vez. Mostre então o maiorvalor lido. 19a Questão) Faça um algoritmo que gere e mostre os valores primos entre 1 e 1000. Mostretambém a soma destes valores. 20a Questão) Escreva um algoritmo que calcula e mostra a soma dos números primos entre 92e 1478. 21a Questão) Faça um algoritmo que calcule a seguinte soma: H = 10 + 10 + 10 + ... + 10O algoritmo deve ler um número n (inteiro e positivo) e mostrar o resultado nal de H. A soma deveser calculada apenas uma vez. 22a Questão) Escrever um algoritmo/programa em Pascal que lê um número e calcula e escrevequantos divisores ele possui. 23a Questão) Escrever um algoritmo/programa em Pascal que escreve os números primos entre100 e 200, bem como a soma destes números. 24a Questão) Faça um algoritmo que leia oito nomes e infome a quantidade de letras de cadaum deles.5.1.2 EXERCÍCIOS OPCIONAIS 1a Questão) Escrever um algoritmo que lê um número não determinado de valores para m,todos inteiros e positivos, um de cada vez. Se m for par, vericar quantos divisores possui e escreveresta informação. Se m for impar e menor do que 10 calcular e escrever o fatorial de m. Se m for impare maior ou igual a 10 calcular e escrever a soma dos inteiros de 1 até m. 2a Questão) Escrever um algoritmo que lê um valor N inteiro e positivo e que calcula e escreveo valor de E.
• 62 1 1 1 1 1 E =1+ 1! + 2! + 3! + 4! + .... + n! 3a Questão) A série de Fibonacci tem como dados os 2 primeiros termos da série que sãorespectivamente 0 e 1. A partir deles, os demais termos são construídos pela seguinte regra: tn =tn−1 + tn−2 . Escrever um algoritmo/programa em Pascal que gera os 10 primeiros termos da Série deFibonacci e calcula e escreve a soma destes termos.5.2 A ESTRUTURA DE REPETIÇÃO WHILE Um laço WHILE deve ser usado sempre que se desejar executar um comando um número variávelou desconhecido de vezes. Sua sintaxe é: WHILE expressão DO BEGIN comando; END;onde expressão é uma expressão booleana e comando é uma instrução simples ou um comandocomposto. O WHILE funciona da seguinte maneira: enquanto a expressão booleana for verdadeira, ocomando após o DO será executado repetidamente. A expressão é reavaliada após cada execuçãodo comando. O laço WHILE só se encerra quando a expressão for falsa. Se a expressão for falsa jáquando o WHILE se inicia, então o comando não será executado nenhuma vez. No comando, deve teralguma instrução que possa modicar o valor da expressão booleana, senão o WHILE será executadoindenidamente. WHILE | / FALSE / +--<--<cond>---<--+ | / | | / | v | TRUE ^ | v | | +---------+ | | | comando |->-+ | +---------+ v Exemplo: ... x := 11; WHILE (x < 1992) DO BEGIN Write(x:5); x := x + 11; END; ...
• 63 Este fragmento de programa funciona da seguinte forma: i. Após a atribuição inicial (que é recomendada em todo WHILE) é avaliada a expressão booleana x < 1992. Sendo ela verdadeira (porque 11 < 1992), o comando composto entre o BEGIN e o END é executado. Desse modo, 11 é mostrado na tela e a atribuição x := x + 11 é executada e x passa a valer 11 + 11 = 22. ii. A expressão x < 1992 é reavaliada com x = 22 e é novamente verdadeira. O comando composto então é executado mais uma vez e x passa a valer 22 + 11 = 33. iii. A seqüência AVALIAR EXPRESSÃO -> EXECUTAR COMANDO -> AVALIAR EXPRESSÃO -> EXECUTAR COMANDO -> ... se repete várias vezes até que x assuma um valor maior do que ou igual a 1992 e a expressão passe a ser falsa. iv. Quando a expressão for falsa, o laço WHILE se encerrará e o controle do programa passará para o comando seguinte ao WHILE. Assim, o fragmento acima mostra na tela todos os múltiplos de 11 que são menores que 1992.Assumimos, implicitamente, que x é inteiro. No WHILE as variáveis podem ser de qualquer tipo:inteiro, real, string, ... . Exemplo: O programa a seguir conta quantos termos do tipo 1/n com n inteiro e n >= 1 sãonecessários somar para se obter um resultado maior do que 15. PROGRAM ContaParcelas; (* 1 1 Determina a quantidade de termos de 1 + --- + --- + ... 2 3 que é necessário somar para se ter uma soma > 15. *) VAR n: integer; soma: real; BEGIN soma := 0; (* Valores iniciais das variáveis *) n := 0; (* usadas no WHILE *) WHILE soma <= 15 DO (* "ENQUANTO a soma não for *) BEGIN (* maior que 15 ... *) n := n + 1; soma := soma + 1/n; (* ... some termos da forma 1/n" *) END; Writeln(Deve-se somar , n, parcelas.); END. Neste exemplo não há possibilidade de se usar um comando como o FOR porque não se sabea quantidade de vezes que o comando soma := soma + 1/n deve ser executado. A "resposta"doprograma acima é que deve-se somar 1.835.421 termos do tipo 1/n para se ter uma soma maior doque 15. Observação: O comando FOR pode ser considerado como um caso particular de WHILE. É oque está exemplicado nos fragmentos abaixo, onde todas as variáveis são inteiras. i := LimInf; FOR i := LimInf TO LimSup DO <--> WHILE i <= LimSup DO
• 64 comando; BEGIN comando; i := i + 1; END;5.2.1 EXERCÍCIOS 1a Questão) Chico tem 1,50 metro e cresce 2 centímetros por ano, enquanto Zé tem 1,10 metroe cresce 3 centímetros por ano. Construa um algoritmo que calcule e imprima quantos anos serãonecessários para que Zé seja maior que Chico. 2a Questão) Construir um algoritmo que calcule a média aritmética de vários valores inteirospositivos, lidos externamente. O nal da leitura acontecerá quando for lido um valor negativo. 3a Questão)Faça um programa que mostre um menu com as opções: 1. Cadastro 2. Consulta 3. Relatorio 4. Fim O programa deve exibir o menu acima, mostrando a opção escolhida e, em seguida, repetindo aexibição do mesmo até que o usuário escolha a opção 4. 4a Questão) Escreva um algoritmo que calcule a média dos números digitados pelo usuário, seeles forem pares. Termine a leitura se o usuário digitar zero (0). OBS: O valor (zero) não entra parao cálculo da Média. 5a Questão) Em uma eleição presidencial existem quatro candidatos. Os votos são informadosatravés de códigos. Os dados utilizados para a contagem dos votos obedecem à seguinte codicação: • 1,2,3,4 = voto para os respectivos candidatos; • 5 = voto nulo; • 6 = voto em branco; Elabore um algoritmo que leia o código do candidado em um voto. Calcule e escreva: i. total de votos para cada candidato; ii. total de votos nulos; iii. total de votos em branco;Como nalizador do conjunto de votos, tem-se o valor 0. 6a Questão) Faça um algoritmo que leia vários números inteiros e positivos e calcule o produtóriodos números pares. O m da leitura será indicado pelo número 0. 7a Questão) Faça um algoritmos que leia n números e imprima somente os pares. O algoritmodeve nalizar quando for digitado o valor 0. 8a Questão) Faça um algoritmo que leia vários nomes e depois imprima-os na tela. O nal deveser quando a palavra FIM for digitada. 9a Questão) Uma empresa de fornecimento de energia elétrica faz a leitura mensal dos medidoresde consumo. Para cada consumidor são digitados os seguintes dados:
• 65 • Número do consumidor • Quantidade de Kwh consumidos durante o mês. • Tipo (código do consumidor). i. residencial, preço em reais por Kwh = 0,3; ii. comercial, preço em reais por Kwh = 0,5; iii. industrial, preço em reais por Kwh = 0,7. Os dados devem ser lidos até que o consumidor número 0 (zero) seja informado. Para cadaconsumidor informar: o custo total, o total de consumo para os três tipos de consumidores e a médiade consumo para os consumidores do tipo 1 e 2. 10a Questão) Ler várias idades e imprimir: • O total de pessoas com menos de 21 anos; • O total de pessoas com mais de 50 anos. 11a Questão) Escrever um algoritmo que leia um conjunto de pedidos de compra e calcule ovalor total da compra. Cada pedido e composto pelos seguintes campos: • Número do pedido • Data do pedido (dia, mês, ano) • Preço unitário • Quantidade. O algoritmos deverá processar os pedidos até que o pedidos de número 0 (zero) seja digitado pelousuário. 12a Questão) Escrever um algoritmo que leia um número m de valores e calcule a médiaaritmética dos valores lidos, a quantidade de valores positivos, a quantidade de valores negativose o percentual de valores negativos e positivos. Mostre os resultados. 13a Questão) Faça um algoritmo que leia várias prossões e informar quantos são dentistas(Considerar a palavra destista escrita de seguinte forma: DESTISTA, dentista, Dentista). 14a Questão) Faça um algoritmo que leia N Números e imprima o maior deles. O algoritmodeve ser nalizado quando o usuário digitar 0 (zero). 15a Questão) Escrever um algoritmo que leia um conjunto de vários endereço IP de uma máquinano formato xxx.xxx.xxx.xxx. Crie uma variável para número do formato especicado. Logo apósinforme qual a classe dessa máquina: A, B, C ou D. O nal do do algoritmo deve ser quando ousuário informar todos os valores sendo 0 (zero).5.2.2 EXERCÍCIOS OPCIONAIS 1a Questão) Escreva um programa que onde o computador gere um número entre 0 e 100 e façacom que o usuário tente adivinhar o número escolhido. Um exemplo da saída do programa é:
• 66Pensei em número tente advinha-lo?14Errado !!! O número que pensei está entre 14 e 100. Tente Adivinhá-lo?12Número fora da faixa. O número que pensei está entre 14 e 100. Tente Adivinhá-lo?34Muito bem !!! você acertou em 3 tentativas.5.3 A ESTRUTURA DE REPETIÇÃO REPEAT-UNTIL A estrutura REPEAT-UNTIL, assim como o WHILE, é usada quando não for conhecida a priorio número de vezes em que uma seqüência de comandos vai ser repetidamente executada. Sua sintaxeé: REPEAT comando1; comando2; ... UNTIL expressão;onde expressão é uma expressão booleana e comando1, comando2, ... são instruções simples oucomandos compostos. Neste caso os delimitadores BEGIN/END não são necessários, pois as palavraschave REPEAT e UNTIL funcionam como delimitadores. No REPEAT-UNTIL os comandos entreo REPEAT e o UNTIL serão executados ATÉ que a expressão booleana seja verdadeira. Como aavaliação da expressão é feita no nal do laço, os comandos serão executados pelo menos uma vez. REPEAT | +---------+ | comando |--<--+ +---------+ | | | UNTIL ^ / | / FALSE | <cond>---->----+ / / | TRUE v Observação: Um REPEAT-UNTIL tem o mesmo efeito que um WHILE com a expressão booleanaque controla o laço negada: REPEAT <---> WHILE NOT expressão DO BEGIN comando; comando; UNTIL expressão; END;
• 69 BEGIN n := 0; Randomize; numero := Random(10001); Writeln(Adivinhe o numero aleatorio gerado entre 0, e 10000!); REPEAT Write(> ); Readln(tentativa); n := n + 1; IF tentativa > numero THEN BEGIN Writeln(Chute muito altó); END ELSE BEGIN IF tentativa < numero THEN BEGIN Writeln(Chute muito baixó); END; END; UNTIL (tentativa = numero); Writeln(Acertou! (apos ter tentado , n, vezes)); END. Exemplo: A série 1 1 1 1 S =1− 33 + 53 + 73 + 93 + ....converge para (π 3 )/32. Neste exemplo, vamos elaborar um programa que some todos os termos dessa série que, emmódulo, são maiores ou iguais a 10− 10. O resultado dessa soma, pode ser usado para se calcular Picom 10 decimais exatas. Como não sabemos quantos termos devemos somar, temos um caso de REPEAT-UNTIL ou,equivalentemente, de WHILE. Usaremos um comando da unidade CRT chamado GOTOXY cuja função é posicionar o cursorem determinada coluna e determinada linha da tela. Sua sintaxe é: GOTOXY(coluna, linha); Por exemplo, GOTOXY(5, 2) posiciona o cursor na quinta coluna e segunda linha da tela. Emmodo texto, a tela tem 25 linhas e 80 colunas. PROGRAM Soma_Alternada_De_1_Sobre_O_Cubo_De_2n_Menos_1; USES Crt; (* --- Calculo de S = n+1 -3 / (-1) (2n - 1) --- *)
• 70 VAR t, S: real; n: integer; BEGIN S := 0; (* Variável que guardará a soma desejada *) n := 0; (* Contador de termos (índice do termo *) ClrScr; (* geral) *) REPEAT n := n + 1; t := EXP(-3*LN(2*n - 1)); (* termo geral *) IF Odd(n) THEN BEGIN S := S + t; (* Se n for ímpar, então soma-se *) END ELSE (* t a S; caso contrário, sub- *) BEGIN S := S - t; (* trai-se t de S. *) END; GOTOXY(10, 10); (* Posiciona o cursor na 10a. coluna *) (* e 10a. linha da tela *) Write(n = , n, , t:13:10); (* mostra o índice *) (* atual e o valor do termo geral *) UNTIL t < 1E-10; Writeln; Writeln; Writeln(Soma = , S:15:10); Writeln(Foram somados , n, termos); END. Exemplo: A função booleana KEYPRESSED da unidade CRT pode ser usada para vericar seem determinado momento foi pressionada alguma tecla. Ela é TRUE quando for pressionada qualquertecla e FALSE em caso contrário. O programinha a seguir, gera aleatoriamente cores e caracteres dointervalo #50..#250 e ca mostrando-os na tela até ser pressionado qualquer tecla. Para isso, usamosum RANDOM(16) para gerar um número de cor de 0 a 15, um RANDOM(201) + 50 para gerar umnúmero inteiro de 50 a 250 e um REPEAT ... UNTIL KEYPRESSED para repetir o processo até serpressionada alguma tecla. A cor do texto pode ser piscante ou não, dependendo de RANDOM(2) emcor1 gerar um 0 ou um 1. PROGRAM UsandoKeyPressed; USES Crt; VAR ch: char; cor1, cor2: byte; BEGIN ClrScr; Randomize; repeat cor1 := Random(16) + 128*Random(2); cor2 := Random(16); TextColor(cor1); TextBackground(cor2);
• 71 ch := Chr(Random(201) + 50); (* #50 <= ch <= #250 *) Write(ch); until KEYPRESSED END. Exemplo: Neste último exemplo deste capítulo, vamos usar 3 comandos da unidade CRT paragerar sons com determinadas freqüência e duração. São eles: SOUND(n) ---> Emite continuamente um som de n MHz NOSOUND ---> Encerra a emissão do som DELAY(t) ---> Pausa de t milisegundos A execução de uma determinada nota musical é feita da seguinte forma: i. Usamos o SOUND para emitir um som cuja freqüência é a da nota desejada. Para isso, devemos consultar antes uma tabela de freqüência de sons; ii. Usamos o DELAY para determinar a duração da nota; iii. Encerramos a emissão do som com o NOSOUND. Usaremos o READKEY para vericar qual tecla foi pressionada no teclado e um CASE paraemitir um som que corresponda à nota desejada. Vamos convencionar que o "Q"emite um dó, o"W"um ré, ... . As teclas que não constarem dos alvos do CASE não emitirão sons. Precisamostambém de um REPEAT-UNTIL para repetir o processo de "pressionar tecla e emitir som"até queREADKEY retorne o caracter #27, que corresponde à tecla ESC. PROGRAM Piano; USES Crt; CONST TeclaESC = #27; VAR ch: char; BEGIN ClrScr; GoToXY(18, 10); Writeln(Toque sua musica usando as teclas QWERTYUIOP[]); GoToXY(18, 12); Writeln(Exemplo: QQWQRE QQWQTRR YYIYREW UUYRTRR); GoToXY(18, 14); Writeln(Para encerrar, pressione a tecla ESC.); REPEAT ch := ReadKey; CASE ch OF Q, q : Sound(262); { dó } W, w : Sound(294); { ré } E, e : Sound(330); { mi } R, r : Sound(350); { fá } T, t : Sound(396); { sol } Y, y : Sound(440); { lá }
• 72 U, u; : Sound(494); { si } I, i : Sound(524); { dó } O, o : Sound(558); { ré } P, p : Sound(660); { mi } [, { : Sound(700); { fá } ], } : Sound(784); { sol } END; DELAY(50); NOSOUND; (* Descubra que diferença faz *) UNTIL (ch = TeclaESC) (* se forem trocadas estas duas *) (* linhas. *) END.5.3.1 EXERCÍCIOS 1a Questão) Faça um algoritmo para calcular o fatorial de um número x, dado como entradapelo usuário. Verique se o número é positivo. OBS: Utilize o Repeat. 2a Questão)Faça um algoritmo que leia n números e imprima somente os pares. O algoritmodeve nalizar quando for digitado o valor 0. OBS: Utilize o Repeat. 3a Questão) Faça um algoritmo que leia n números e calcule a soma dos números pares. Oalgoritmo deve nalizar quando for digitado o valor 0. OBS: Utilize o Repeat. 4a Questão) Faça um algoritmo que leia n números e calcule o produto dos números ímpares.O algoritmo deve nalizar quando for digitado o valor 1. OBS: Utilize o Repeat. 5a Questão) Escrever um algoritmo que leia um número m de valores e calcule a média aritméticados valores lidos, a quantidade de valores positivos, a quantidade de valores negativos e o percentualde valores negativos e positivos. Mostre os resultados. 6a Questão) Faça um algoritmo que leia N Números e imprima o maior deles. O algoritmo deveser nalizado quando o usuário digitar 0 (zero). 7a Questão) Faça um algoritmo que leia N Números e imprima o maior deles. O algoritmo deveser nalizado quando o usuário digitar 0 (zero). 8a Questão) Escreva um programa Pascal que apresente o menu de opções abaixo: OPÇÕES: 1 - SAUDAÇÃO 2 - BRONCA 3 - FELICITAÇÃO 0 - FIMO programa deve ler a opção do usuário e exibir, para cada opção, a respectiva mensagem: 1 - Olá. Como vai ? 2 - Vamos estudar mais. 3 - Meus Parabéns ! 0 - Fim de serviço.Enquanto a opção for diferente de 0 (zero) deve-se continuar apresentando as opções. OBS: Use comoestrutura de repetição o comando REPEAT e como estrutura condicional o comando CASE.
• 736 − FUNÇÕES E PROCEDIMENTOS6.1 FUNÇÕES O Pascal oferece muitas facilidades para a confecção de programas modularizados. Amodularização consiste na divisão de um programa longo em várias partes, chamadas subprogramas,cada uma funcionando de forma independente das outras, cada uma realizando tarefas especícascontroladas por um núcleo comum, chamado programa principal. +--------------------------+ | Programa principal | +--------------------------+ ^ ^ ^ / | v v v +------------+ +------------+ +------------+ | Subprogr_1 | | Subprogr_2 | | Subprogr_3 | +------------+ +------------+ +------------+ ^ | v +------------+ | Subprogr_4 | +------------+ Cada subrotina funciona como se fosse um pequeno programa, com suas próprias variáveis, suaspróprias denições de tipos, seus próprios subrotinas, etc. Cada vez que um subrotina é chamado,ele é executado, e após o término de sua execução, o controle do programa volta ao comando quevier depois do ponto de onde o subrotina foi chamado. Em Pascal podemos ter subrotinas de doistipos: as funções (FUNCTIONS) e os procedimentos (PROCEDURES).6.1.1 ESTRUTURA DE UMA FUNÇÃO Uma função é um subrotina que tem um único valor de retorno. O Pascal oferece muitaspossibilidades na denição de funções. Uma função é declarada na área de declarações do programa(depois do cabeçalho e do USES e antes do BEGIN da seção principal) e possui a seguinte estrutura: i. Um cabeçalho (ou protótipo) identicado pela palavra chave FUNCTION, seguida do nome da função, da lista de parâmetros e tipos entre parênteses e separados entre si por vírgulas, de um sinal de dois pontos e do tipo do valor que será retornado pela função. Parâmetros de tipos diferentes devem ser separados por ponto-e-vírgula. ii. Uma área de declarações de tipos, variáveis, constantes, rótulos, funções ou procedimentos.
• 74 iii. A denição da função delimitada pelas palavras chave BEGIN e END, com um ponto-e-vírgula no nal. O valor de retorno da função é denida por uma atribuição do tipo: Nome_da_função := Valor; O valor retornado por uma função pode ser do tipo inteiro, real, boolean, string, char, entreoutros. Exemplo: O cabeçalho de uma função F com parâmetro x inteiro e que retorne um valor inteiro(ou seja, F : Z > Z) deve ser declarado como: FUNCTION F (x: integer): integer; Uma função G com três parâmetros a, b, c do tipo shortint e que retorne um valor real, deve serdeclarada como: FUNCTION G (a, b, c: shortint): real; No caso da função F deste exemplo, ela será chamada para ser executada sempre que aparecerno programa uma expressão do tipo F(expr), onde "expr"é qualquer constante, variável ou expressãodo tipo inteiro. Já a função G, ela pode ser chamada colocando-se em qualquer lugar do programaalgo como G(expr1, expr2, expr3), onde "expr1", "expr2", "expr3"são expressão do tipo shortint. Exemplo: Neste exemplo, deniremos uma função logaritmo decimal Log10(x) que, por denição,será igual ao quociente Ln(x)/Ln(10). Como queremos que o argumento x da função seja sempre umnúmero real, então na linha do cabeçalho da função colocamos FUNCTION Log10(x: real). Para queela retorne um valor real, nalizamos a linha do cabeçalho com ": real; "Dessa forma, o cabeçalhoda função dene seu domínio e contradomínio. A seguir, entre os delimitadores BEGIN/END, denimos o valor que a função deve retornar.Neste caso, a atribuição é feita ao nome da função, e não ao nome seguido do parâmetro. Umaatribuição como Log10(x) := Ln(x)/Ln(10) está errada. FUNCTION Log10(x: real): real; BEGIN Log10 := Ln(x)/Ln(10); END; Uma versão mais elaborada, deveria vericar se o argumento x é válido ou não. Temos então: FUNCTION Log10(x: real): real; { versao 2 } BEGIN if (x < 0) then begin Writeln(Parametro invalido); Halt; { encerra a execução do programa } end else begin Log10 := Ln(x)/Ln(10);
• 75 end; END; Todo programa que queira usar essa função LOG10, deverá tê-la denida na sua área dedeclarações: PROGRAM LogaritmoDecimal; VAR num: real; FUNCTION Log10(x: real): real; BEGIN Log10 := Ln(x)/Ln(10); END; (* fim da definição da função *) BEGIN Write(Forneca um numero real positivo: ); Readln(num); Writeln(O logaritmo decimal de , num, é , Log10(num):8:4); END. (* fim do programa *) Exemplo: Se os parâmetros da função forem de tipos diferentes, então a lista de parâmetros deveseparar os tipos por ponto-e-vírgula. Por exemplo, uma função TESTE que tenha os parâmetros x, ydo tipo real e m, n do tipo integer e que retorne um valor do tipo integer deverá ter como cabeçalho: FUNCTION Teste (x, y: real; m, n: integer): integer; Uma função F que tenha parâmetros a real, n inteiro e c1, c2, c3 do tipo char e que retorne umstring: FUNCTION F (a: real; n: integer; c1, c2, c3: char): String; Exemplo: Neste exemplo vamos construir um programa que use duas funções: MAX(x, y) eMIN(x, y). PROGRAM MaxMin; VAR a, b: real; FUNCTION Max(x, y: real): real; (* Função MAX ---> retorna o maior valor entre x e y *) BEGIN if (x >= y) then begin Max := x; end else begin Max := y; end;
• 76 END; (* fim da definição de MAX *) FUNCTION Min(x, y: real): real; (* Função MIN ---> retorna o menor valor entre x e y *) BEGIN if (x <= y) then begin Min := x; end else begin Min := y; end; END; (* fim da definição de MIN *) BEGIN (* inicio do programa principal *) Write(Forneca dois numeros : ); Readln(a, b); Writeln(O maior dos dois é , Max(a, b):6:2); Writeln(e o menor é , Min(a, b):6:2) END. (* fim do programa *) OBSERVAÇÃO IMPORTANTE: As variáveis denidas em uma função, chamadas variáveislocais, ou as que são denidas como parâmetros, não têm nenhuma relação com as variáveis de outrasfunções ou do programa principal, mesmo que elas tenham o mesmo nome. O programa principalnão tem conhecimento das variáveis locais declaradas em uma função. Exemplo: O comando EXIT, quando usado em uma função, faz o controle do programa abandonara função e voltar ao ponto na qual a função foi chamada. É útil para se interromper a execução de umafunção que foi chamada com algum argumento com valor inválido. A seguir, denimos uma funçãofatorial. Se ela for chamada com argumentos inválidos (negativos ou grandes), então o comando EXITfaz o controle do programa abandonar a função e voltar ao ponto de chamada. FUNCTION Fat(n: integer): integer; VAR (* declaração das variáveis locais *) i, prod_aux: integer; BEGIN if (n < 0) or (n > 12) then begin Writeln(Argumento n invalido na chamada de FAT.); EXIT; (* abandona a execução da função *) end else begin if n <= 1 then begin Fat := 1; end else begin prod_aux := 1;
• 77 for i := 2 to n do begin prod_aux := prod_aux * i; end; Fat := prod_aux end; end; END; (* fim da definição da função *) Precisamos de uma variável auxiliar (prod_aux) para guardar o valor do fatorial, porque umaatribuição como Fat := Fat * i não é permitida (só seria possível se Fat fosse uma variável). Um exemplo de um programa que use esta função é: PROGRAM UsandoFat; (* Lista os valores de n!, com 0 <= n <= 12 *) VAR i: integer; (* este "i" não tem nenhuma relação com o "i" da função FAT *) (* Nesta área, suponhamos que esteja escrita a FAT acima. *) BEGIN Writeln( n n!); for i := 0 to 12 do begin Writeln(i:2, Fat(i):12); end; END. Exemplo: Neste exemplo deniremos uma função CURSO que associa a alguns números inteiros,nomes de cursos da UFPB. FUNCTION Curso(n: integer): string; BEGIN CASE n OF 8 : Curso := Ciencias; 11 : Curso := Quim. Industrial; 22 : Curso := Eng. Civil; 23 : Curso := Eng. Alimentos; 24 : Curso := Eng. Mecanica; 25 : Curso := Bach. Quimica; 30 : Curso := Bach. Fisica; 32 : Curso := Bach. Matematica; 44 : Curso := Bach. Computacao; else Curso := Curso desconhecido; END; END; Suponhamos que esta função esteja denida em um arquivo do disco chamado CURSOS.PAS(basta digitá-la, pressionar F2, digitar CURSOS e pressionar ENTER). Para incluí-la em qualquerprograma em Pascal, basta usar uma diretiva de inclusão, cuja sintaxe é,
• 78 {\$I NomeDoArquivo.Extensao} Todo programa que contiver uma diretiva como essa, na hora em que o programa for compilado,o Pascal incluirá no lugar da diretiva o referido arquivo. Para que uma diretiva de inclusão não sejaconfundida com um comentário, não deve haver espaços em branco entre a chave e o \$I. PROGRAM CursosDaUFPB; {\$I CURSOS.PAS} (* inclui o arquivo CURSOS.PAS *) VAR n: integer; BEGIN Write(Forneca o numero do curso: ); Readln(n); Writeln(---> O curso , n, e , Curso(n)) END. Exemplo: Neste exemplo, construiremos uma função do tipo string que, dado um inteiro n eum caracter x, então o valor da função no ponto (n, x) deverá ser o caracter x repetido n vezes.Chamaremos a função de REPETE. Para as variáveis do tipo string está denida uma operaçãode soma, que na verdade é uma concatenação. Se X, Y são strings, X + Y = string formado pelajunção de X com Y. Por exemplo, Para + iba = Paraiba, 19 + 92 = 1992, Jose + Maria= JoseMaria, etc. Toda variável char, pode ser considerada um string de comprimento 1. Assim,temos também, Á + B = AB, etc. Para repetir o caracter x por n vezes, faremos um somatóriode strings: Str_aux := Str_aux := + x = x (n = 1) Str_aux := x + x = xx (n = 2) Str_aux := xx + x = xxx (n = 3) Str_aux := xxx + x = xxxx (n = 4) ... ... ... FUNCTION Repete(n: byte; x: char): string; VAR i: integer; Str_aux: string; BEGIN Str_aux := ; for i := 1 to n do begin Str_aux := Str_aux + x; end; Repete := Str_aux; END; Para uso futuro, grave no disco esta função sob o nome de REPETE.PAS. Por exemplo,REPETE(6, *) = ******, REPETE(10, %) = %%%%%%%%%%, REPETE(0, A) = , etc.Um exemplo de uso dessa função é:
• 79 PROGRAM Testando_a_funcao_Repete; VAR i: integer; ch: char; {\$I REPETE.PAS} BEGIN Write(Caracter a ser repetido? ); Readln(ch); Write(Quantidade de vezes? ); Readln(i); Writeln; Writeln(REPETE (, i, , , ch, ) = , Repete(i, ch)) END. Um outro exemplo, gera aleatoriamente os valores de i e ch e repete esse processo indenidamente(até ser pressionado as teclas CTRL e BREAK). PROGRAM Testando_a_funcao_Repete_2; USES Crt; VAR i: integer; ch: char; {\$I REPETE.PAS} BEGIN Randomize; repeat i := Random(50); (* i é um inteiro qualquer de 0 a 49 *) ch := Chr(Random(255)); Writeln; Writeln(REPETE (, i, , , ch, ) = , Repete(i, ch)); Delay(1000); (* pausa de 1 segundo *) until 1 > 2 END. Exemplo: O conjunto de funções a seguir, complementa a "deciência"do Pascal com relaçãoàs funções trigonométricas e hiperbólicas. Podem ser criados dois arquivos no disco TRIG.PAS eHIPER.PAS para serem incluídos em qualquer programa pela diretiva de inclusão \$I TRIG.PAS ou\$I HIPER.PAS. { ======================================================== } { FUNCOES TRIGONOMETRICAS } { ======================================================== } function Tg(x: real): real; { Tangente } begin if Cos(x) = 0 then begin Halt; { parametro invalido } end; Tg := Sin(x)/Cos(x) end; { -------------------------------------------------------- }
• 80function Cotg(x: real): real; { Cotangente }begin if Sin(x) = 0 then begin Halt; { parametro invalido } end; Cotg := Cos(x)/Sin(x)end;{ -------------------------------------------------------- }function Sec(x: real): real; { Secante }begin if Cos(x) = 0 then begin Halt; end; Sec := 1/Cos(x)end;{ -------------------------------------------------------- }function Cossec(x: real): real; { Cossecante }begin if Sin(x) = 0 then begin Halt; end; Cossec := 1/Sin(x)end;{ -------------------------------------------------------- }function ArcSen(x: real): real; { Arco-seno }begin if (Abs(x) > 1) then begin Halt; { parametro invalido } end; else begin if (x = 1) then begin ArcSen := Pi/2; end; else begin if (x = -1) then begin ArcSen := -Pi/2; end; else begin ArcSen := ArcTan(x/Sqrt(1 - Sqr(x))); end; end;end;{ -------------------------------------------------------- }
• 81function ArcCos(x: real): real; { Arco-cosseno }begin if (Abs(x) > 1) then begin Halt; { parametro invalido } end else if (x = 0) then begin ArcCos := Pi/2; end; else begin if (x > 0) then begin ArcCos := ArcTan(Sqrt(1 - Sqr(x))/x); end; else begin ArcCos := Pi + ArcTan(Sqrt(1 - Sqr(x))/x); end; end;end;{ -------------------------------------------------------- }{ ======================================================== }{ FUNCOES HIPERBOLICAS }{ ======================================================== }function Senh(x: real): real; { Seno hiperbolico }begin Senh := (Exp(x) - Exp(-x))/2end;{ -------------------------------------------------------- }function Cosh(x: real): real; { Cosseno hiperbolico }begin Cosh := (Exp(x) + Exp(-x))/2end;{ -------------------------------------------------------- }function Tgh(x: real): real; { Tangente hiperbolica }begin Tgh := (Exp(x) - Exp(-x))/(Exp(x) + Exp(-x))end;{ -------------------------------------------------------- }function ArcSenh(x: real): real; { Arco-seno hiperbolico }begin ArcSenh := Ln(x + Sqrt(Sqr(x) + 1))end;{ -------------------------------------------------------- }function ArcCosh(x: real): real; { Arco-cosseno hiperbolico}begin if (x < 1) then begin
• 82 Halt; { parametro invalido } end; ArcCosh := Ln(x + Sqrt(Sqr(x) - 1)) end; { -------------------------------------------------------- } function ArcTgh(x: real): real; { Arco-tangente hiperbolica} begin if (x >= 1) or (x <= -1) then begin Halt; { parametro invalido } end; ArcTgh := Ln((1 + x)/(1 - x))/2 end; { -------------------------------------------------------- } Exemplo: Deniremos neste exemplo uma função booleana chamada PRIMO(n) que será TRUEse n for primo e FALSE em caso contrário. FUNCTION Primo(n: integer): boolean; (* Testa se um inteiro n é primo *) VAR i: integer; raiz: real; BEGIN Primo := TRUE; (* suposição inicial de que n é primo *) if (n < 0) then begin n := -n; end; if (n = 2) then begin Exit; end; if (n = 1) or (n mod 2 = 0) then (* caso em que n é 1 *) begin (* ou é par > 2 *) Primo := FALSE; Exit; end; raiz := Sqrt(n); (* Caso geral: Se n for divisí- *) i := 3; (* vel por um ímpar maior ou *) while (i <= raiz) do (* igual a 3 e menor ou igual à *) begin (* raiz quadrada de n, então n *) if (n mod i = 0) then (* não é primo. Caso contrário, *) begin (* n é primo. *) Primo := false; Exit; end; i := i + 2 end
• 83 END; Gravando-se esta função no disco sob o nome de PRIMO.PAS, podemos usar o seguinte programaque lista todos os primos de 1 a 1000000: PROGRAM ListagemDePrimos; {\$I PRIMO} (* ---> A extensão .PAS pode ser omitida *) VAR i: integer; BEGIN for i := 1 to 10000 do if Primo(i) then Writeln(i:8, e primo.) END. Exemplo: Vamos construir agora nossa função potência POT(x, y) = x y. Para uso posterior,vamos salvá-la em disco sob o nome de POT.PAS. Identicaremos com 0 todo número que, emmódulo, seja menor do que 10−10 .FUNCTION Pot(x, y: real): real;CONST epsilon = 1E-10;BEGIN if (Abs(x) < epsilon) and (Abs(y) < epsilon) then begin (* Caso em que x = 0 e y = 0 *) Writeln(ERRO: Forma indeterminada 0 elevado a 0.); Halt; end else begin if (Abs(x) < epsilon) then begin (* Caso em que x = 0 *) if (y > 0) then begin Pot := 0; end; else begin Writeln(ERRO: Base nula e expoente negativo.); Halt; end; end else begin if (Abs(y) < epsilon) then (* Caso em que y = 0 *) begin Pot := 1; end else begin if (x > 0) then (* Caso geral com x > 0 *)
• 84 begin Pot := Exp(y*Ln(x)); end else (* Caso geral com x < 0 *) begin if (Frac(y) > epsilon) and (1 - Frac(Abs(y)) > epsilon) then begin Writeln(ERRO: Base negativa e expoente , fracionario.); Halt; end else begin if Odd(Round(y)) then (* y impar, x < 0 *) begin Pot := -Exp(y*Ln(-x)); end else (* y par, x < 0 *) begin Pot := Exp(y*Ln(-x)); end; end; end; end; end; end;END; A função POT assim denida não é conveniente para o cálculo de raízes. Como exercício,desenvolva uma função Raiz(n, x) = raiz n-ésima de x. Como um programa-exemplo do uso dePOT, temos: PROGRAM Potencias; {\$I POT.PAS} VAR x, y: real; BEGIN repeat Write(x = ); Readln(x); Write(y = ); Readln(y); Writeln; Writeln(x^y = , Pot(x, y):8:3); Writeln; until 1 > 2 END. Exemplo: Este último exemplo desta seção, testa se um número inteiro positivo é potência de doisou não. Construímos a função boolean POTENCIADEDOIS(n) que é TRUE se n for uma potênciade 2 e é FALSE em caso contrário. Grave no disco esta função sob o nome de POT_2.PAS para serusada futuramente. O algoritmo usado foi o seguinte: são feitas sucessivas divisões de n por 2 até seencontrar um número ímpar. Se o número ímpar assim encontrado for 1, então o n é potência de 2;caso contrário, n não é potência de 2.
• 85 FUNCTION PotenciaDeDois(n: integer): boolean; VAR m: integer; BEGIN repeat m := n; n := n div 2; until n*2 <> m; if (m = 1) then begin PotenciaDeDois := true; end; else begin PotenciaDeDois := false; end; END; Como exemplo de utilização dessa função, temos o programa abaixo que lista as potências de 2de 1 a 100000. PROGRAM Potencia_de_2; {\$I POT_2} VAR x: integer; BEGIN for x := 1 to 100000 do begin if PotenciaDeDois(x) then begin Writeln(x, e potencia de dois); end; end; END.6.1.2 FUNÇÕES DEFINIDAS POR SOMATÓRIOS Exemplo: A função real FSERIE a seguir é denida por um somatório. Fornecidos um real x ea quantidade n de termos do somatório, FSERIE(x, n) é denida como sendo o somatório de sin(kx) kcom k variando de 1 a n. FUNCTION FSerie(x: real; n: byte): real; (* Sen(2x) Sen(nx) FSerie(x, n) = Sen(x) + --------- + ... + --------- 2 n *) var aux: real; k: integer;
• 86 BEGIN aux := 0; for k := 1 to n do begin aux := aux + sin(k*x)/k; end; FSerie := aux END; Exemplo: A função a seguir é uma aproximação para a função exponencial de base E. Trata-seda função denida pelos 11 primeiros termos da série de Taylor de EXP(x). Usamos na sua denição duas funções denidas anteriormente: FAT e POT. FUNCTION ExpAprox(x: real): real; (* 2 3 10 x x x ExpAprox(x) = 1 + x + ----- + ----- + ... ----- 2! 3! 10! *) var i: integer; aux: real; BEGIN aux := 0; for i := 0 to 10 do begin aux := aux + Pot(x, i)/Fat(i); end; ExpAprox := aux END;6.2 PROCEDIMENTOS6.2.1 DEFINIÇÃO, PROCEDIMENTOS SEM PARÂMETROS Um procedimento (procedure) é um trecho de programa que possui seus próprios objetos(variáveis, constantes, tipos, funções, outros procedimentos, ...) . Juntamente com as funções,os procedimentos formam o que se chama genericamente de subrotinas (ou subprogramas). Osprocedimentos diferem das funções apenas pelo fato das funções retornarem sempre um único valor,enquanto que os procedimentos não retornam valor algum. A criação de um procedimento em Pascalé feita através de sua declaração na área de declarações do programa. Um procedimento possui umcabeçalho, identicado pela palavra reservada PROCEDURE seguida do nome do procedimento euma lista opcional de parâmetros. Segue-se ao cabeçalho um bloco de declarações dos objetos locaisdo procedimento, e um bloco de comandos delimitados pelas palavras chave BEGIN e END com umponto-e-vírgula no nal: PROCEDURE NomeDoProcedimento (parâmetro1, parâmetro2, ...); (* declarações de tipos, variáveis, constantes, ... *) BEGIN comando1;
• 87 comando2; ... END; A chamada ou ativação de um procedimento é feita referenciando-se o seu nome no local doprograma onde o mesmo deve ser ativado, ou seja, onde sua execução deve ser iniciada. Ao nalda execução de um procedimento, o controle do programa retorna ao comando seguinte aqueleque provocou sua chamada. Assim, a execução de um procedimento se constitui na transferênciatemporária da execução do programa para o trecho do programa que corresponde ao procedimento.Tudo que for declarado dentro de um procedimento, será considerado um objeto local e será conhecidoapenas pelo procedimento. Exemplo: Um uso bastante comum de procedimentos é para se evitar repetição de trechosanálogos em um programa. Observe o esboço de programa a seguir: PROGRAM Teste; VAR x, y, z: real; BEGIN comando1; comando2; x := função1; y := função2; comando3; comando1; comando2; x := função1; z := Cos(x); comando4; comando1; comando2; x := função1; comando5; END. Observe que o trecho comando1; comando2; x := função1; se repete no programa. Neste caso, seria mais prático se declarar esse trecho como sendoum procedimento, digamos que com nome REPETE, e assim, toda vez que o trecho aparecesse,simplesmente colocaríamos a palavra REPETE no seu lugar: PROGRAM Teste; VAR x, y, z: real; PROCEDURE REPETE; BEGIN (* inicio do procedimento *) comando1;
• 88 comando2; x := função1; END; (* fim do procedimento *) BEGIN (* inicio da seção principal *) REPETE; y := função2; comando3; REPETE; z := Cos(x); comando4; REPETE; comando5; END. (* fim do programa *) Os dois esboços de programa anteriores são equivalentes. Exemplo: Os procedimentos aumentam signicativamente a clareza dos programas. Voltemosaquele nosso primeiro programa do Capítulo 2, aquele que somava dois inteiros. Um programa dessetipo é feito basicamente em três etapas: i. Ler os inteiros; ii. Calcular sua soma; iii. Mostrar seu resultado. Cada etapa na elaboração de um programa, sugere um procedimento próprio. Neste caso,usaremos três procedimentos LERNUMEROS, CALCULARSOMA e MOSTRARRESULTADO.Com isso o programa principal se limitará a listar as etapas na execução do programa: PROGRAM SomaDeInteiros; VAR x, y, soma: integer; PROCEDURE LerNumeros; BEGIN Writeln; Write(Forneca o valor de x : ); Readln(x); Write(Forneca o valor de y : ); Readln(y); END; (* fim de LerNumeros *) PROCEDURE CalcularSoma; BEGIN soma := x + y; END; (* fim de CalcularSoma *) PROCEDURE MostrarResultado; BEGIN Writeln; Writeln(Soma = , soma); Writeln; Write(Pressione ENTER para encerrar.); Readln; END; (* fim de MostrarResultado *)
• 90 No último caso, a execução do procedimento TESTEDOIS está sendo chamada com os parâmetrosmat = 92101234 e nome = Antonio A Bragá. Exemplo: Uma chamada ao procedimento a seguir pode ser usada no lugar dos dois comandosTEXTCOLOR e TEXTBACKGROUND que compõem o procedimento. PROCEDURE Cor(x, y: integer); BEGIN TextColor(x); TextBackground(y) END. Por exemplo, o comando Cor(7, 3) faz o mesmo efeito que o par de comandos TextColor(7) eTextBackground(3). Quando um procedimento é chamado, o Pascal faz uma cópia na memória de cada argumentopara que a cópia seja usada pelo procedimento. As operações executadas com as cópias não alteramos valores dos argumentos originais. Para evitar que o Pascal faça cópia de variável e passe parao procedimento a própria variável para ser usada, deve-se colocar a palavra chave VAR antes donome da variável na lista de parâmetros no cabeçalho. Neste caso, qualquer modicação feita com oparâmetro durante a execução do procedimento afetará o valor da variável original que foi passadacomo parâmetro. É de fundamental importância saber quando se deve usar ou não a palavra VARantes de um parâmetro no cabeçalho de um procedimento. O uso do VAR onde não for necessárionão constitui erro, mas não é recomendado. Exemplo: PROCEDURE IncrementaUm(x: integer; VAR y: integer; z: integer); BEGIN x := x + 1; y := y + 1; z := z + 1; END. Neste exemplo, o procedimento INCREMENTAUM incrementa de uma unidade os valores decada parâmetro. Suponhamos que a, b, c sejam três variáveis inteiras (tipo byte) com valoresrespectivamente iguais a 10, 11 e 12. Após uma chamada a INCREMENTAUM, como por exemplo, IncrementaUm(a, b, c);teremos a = 10, b = 12 e c = 12. Observe que apenas o valor de b é alterado, pois é o único parâmetroprecedido por um VAR no cabeçalho. Se o cabeçalho fosse PROCEDURE IncrementaUm(VAR x, y, z: byte);o que é equivalente a PROCEDURE IncrementaUm(VAR x: byte; VAR y:byte; VAR z:byte);
• 91então, se a, b, c valessem 10, 11 e 12 respectivamente, após a chamada a IncrementaUm, IncrementaUm(a, b, c);teríamos a = 11, b = 12 e c = 13. Observação: Se a declaração de um parâmetro no cabeçalho de um procedimento possui a palavraVAR, então diz-se que a passagem do parâmetro é uma passagem por referência (porque nesse casoo Pascal informa ao procedimento a localização na memória da variável usada como parâmetro).Quando a declaração não tem a palavra VAR, então temos uma passagem por valor do parâmetro. Exemplo: O procedimento a seguir troca os valores dos parâmetros. Isso só pode ser feito com ouso do VAR no cabeçalho, pois é um caso em que os valores dos parâmetros são alterados. PROCEDURE Troca(VAR x, y: real); VAR aux: real; (* variavel local ao procedimento *) BEGIN aux := x; x := y; y := aux END. Se tivermos, por exemplo, x = 1 e y = 2, após o comando Troca(x, y);teremos x = 2 e y = 1. Se não houver o VAR no cabeçalho do procedimento, então os valores de x e y não serão alteradosapós Troca(x, y). Exemplo: Toda função pode ser substituída por um procedimento: FUNCTION f(x: real): real; <---> PROCEDURE F(x: real, VAR y: real); ... ... y := f(x); <---> F(x, y); A recíproca também é verdadeira, mas não parece ser muito natural. Neste exemplo, calculamos o fatorial de n através de um procedimento. Não estamos, no momento,preocupados em fazer um programinha breve e pequeno. PROGRAM CalculandoMaisUmaVezOFatorialDeN; USES Crt; VAR n: integer; (* variaveis *) m: integer; (* globais *) PROCEDURE Encerrar;
• 92BEGIN Writeln; Writeln(Valor de n invalido.); Writeln; Halt;END;PROCEDURE LerN(VAR n: integer);(* Neste procedimento, é fundamental o VAR acima. Sem ele, o valor de N ficaria desconhecido do programa principal.*)BEGIN ClrScr; Writeln; Write(Forneca o valor do inteiro n: ); Readln(n); if (n < 0) or (n > 13) then begin Encerrar; end; (* Observe que temos aqui a chamada a um proce- dimento de dentro de outro. *)END;PROCEDURE CalcularFatorial(n: integer; VAR fat: integer);VAR i: integer; (* variavel local *)BEGIN fat := 1; for i := 2 to n do begin fat := fat * i; end;END;PROCEDURE MostrarResultado(n: integer; fat: integer);VAR pausa: char; (* variavel local *)BEGIN Writeln; Writeln(n, ! = , fat); Writeln; Write(Para encerrar, pressione qualquer tecla.); pausa := ReadKey;END;BEGIN (* inicio do programa principal *) LerN(n); CalcularFatorial(n, m); MostrarResultado(n, m)END. (* fim do programa *)
• 93 Exemplo: Um procedimento pode chamar outro (como é o caso do exemplo anterior, em queLERN pode chamar ENCERRAR) e também pode ter suas próprias funções e procedimentosinternos: PROCEDURE Externo; PROCEDURE Interno1; begin ... end; PROCEDURE Interno2; begin ... end; FUNCTION f_interna(x: real): real; begin ... end; VAR (* variáveis locais do procedimento EXTERNO *) BEGIN (* início do procedimento EXTERNO *) ... (* comandos *) ... END; (* fim do procedimento EXTERNO *) Neste caso, toda parte do programa que seja exterior ao procedimento EXTERNO não temconhecimento da existência dos procedimentos INTERNO1 e INTERNO2 e da função F_INTERNA.Esses procedimentos e função internos podem fazer referência entre si. Por exemplo, INTERNO2 podeusar o INTERNO1.6.2.3 EXERCÍCIOS 1a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro um valor"N"e retorne TRUE caso um número seja par, FALSE caso contrário 2a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro um valor"N"e retorne TRUE caso um número seja ímpar, FALSE caso contrário. 3a Questão) Dado um vetor com n elementos numéricos, faça um programa que tenha umarotina que receba como parâmetro um número e verique se o valor existe neste vetor. A rotina deveretornar TRUE se o elemento existir e FALSE caso contrário. 4a Questão) Escreva um programa que tenha uma rotina para acrescentar N caracteres "\$"aesquerdade uma STRING qualquer. 5a Questão) Escreva um programa que tenha uma rotina para acrescentar N caracteres "\$"embranco a direita de uma STRING qualquer. 6a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro o raio deuma circunferência e calcule a área. 7a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro o raio deuma circunferência e calcule o seu comprimento. 8a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro doisvalores inteiros A e B para calcular A elevado a um expoente B.
• 94 9a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro uma valorinteiro "N"e retorne o seu fatorial. 10a Questão) Faça um PROGRAMA que tenha uma rotina para calcular a seguinte expressãomatemática: X2 2X 3 3X 4 4X 5 nX (n+1) Y = 2! + 3! + 4! + 5! + ... + (n+1)! 11a Questão) Escreva um programa que tenha uma rotina que leia um vetor de caracteres einforme se o caracteres nesse vetor formam uma palavra que é políndrome. 12a Questão) Escreva um programa que tenha uma rotina para calcular a seguinte expressãoaté o n-ésimo. (N deve ser passado com parâmetro). Y = X − X 2 + X 3 − X 4 + X 5 − ...... 13a Questão) Escreva um programa que tenha uma rotina para calcular: 10 1 i=1 n! 14a Questão) Escreva um programa que tenha uma rotina para calcular: 50 1 i= 2n 15a Questão) Escreva um programa que tenha uma rotina que receba como parâmetro uminteiro e informe se um número é ou não primo. O valor a ser retornado será um booleano. 16a Questão) Escreva um programa que tenha uma rotina que receba duas string comoparâmetro e escreva um string que corresponde a concatenação das duas strings. 17a Questão) Escreva um programa que tenha uma rotina que limpe a tela do micro e exiba oseu nome. 18a Questão) Escreva um programa que tenha uma rotina que receba um valor string S e umvalor inteiro positivo N e exiba o string S por N vezes seguidas na tela. 19a Questão) Escreva um programa que tenha uma rotina chamada CUBO que receba um valordo tipo real e retorne a potência elevado a 3 do mesmo. 20a Questão) 20a Questão) Escreva um programa que tenha uma rotina chamada TROCA quereceba 2 variáveis inteiras (X e Y) e troque o conteúdo entre elas; 21a Questão) Escreva um programa que tenha uma rotina chamado SINAL que receba comoparâmetro um valor N inteiro e escreva a palavra POSITIVO se N for um número maior que zero,NEGATIVO se N for menor que zero, ou ZERO se N for igual a zero. Escreva um programa que leiaum número inteiro e, usando o procedimento SINAL, mostre se ele é maior, menor ou igual a zero. 22a Questão) Escreva um programa que tenha uma rotina que receba com parâmetro um númeron e retorne a quantidade de divisores que ele possui. 23a Questão) Escreva um programa que tenha uma rotina chamada METADE que divida umvalor do tipo real (passado como parâmetro) pela metade.
• 95 Parte 2 - Escreva um programa que leia um vetor A de 30 elementos reais e, usando a rotinaMETADE, divida todos seus elementos pela metade. 24a Questão) Escreva um programa que tenha uma rotina chamada MEDIA que retorne amédia de 3 valores reais (X, Y e Z) passados como parâmetros. Escreva um programa que, para umnúmero indeterminado de alunos, faça para cada uma deles: i. ler o nome e as 3 notas do aluno (a leitura do nome FIM indica o m dos dados - ag); ii. calcule a média do aluno (usando a função MEDIA); iii. exiba o nome e a média do aluno. 25a Questão) Escreva um programa Pascal que leia as 3 notas e o número de faltas de umaluno, calcule a sua média e determine e exiba a sua situação. Caso a aluno tenha mais de 10 faltas,ele está REPROVADO POR FALTA. Caso contrário, estará REPROVADO se sua média for menorque 5.0 ou APROVADO se sua média for superior a 5.0. Observações: i. utilize uma função para calcular a média e um procedimento para determinar e exibir a situação do aluno; ii. não utilize variáveis globais. 26a Questão) Escreva um programa em Pascal que calcule o valor do coseno de X através de20 termos da série abaixo: x2 x4 x6 x8 1− 2! + 4! − 6! + 8! + .... Observações: i. O valor de x será lido; ii. Deve ser implementado em funções independentes o cálculo do fatorial e o cálculo das potências. 27a Questão) Escreva uma função chamada SEG para receber uma medida de tempo expressaem Horas, Minutos e Segundos e retornar esta medida convertida apenas para segundos. 28a Questão) Escreva um procedimento chamado HMS para receber uma medida de tempoexpressa apenas em segundos em retornar esta medida convertida para horas, minutos e segundos.Faça um programa que leia 2 medidas de tempo (expressas em horas, minutos e segundos) e, usandoa função SEG e o procedimento HMS, calcule e exiba a diferença (também em horas, minutos esegundos) entre elas. 29a Questão) Escreva uma função chamada NOME_MES que receba um valor inteiro N (de1 a 12) e retorne um string contendo o nome do mês correspondente a N. Faça um programa queleia uma data (no formato dia, mês e ano) e, usando a função NOME_MES, exiba a data lida noformato abaixo: Entrada: 23 11 1998 Saída: 23 de novembro de 1998
• 96 Escreva uma função chamada DIAS_ANO que receba 3 valores inteiros (DIA, MES, ANO) eretorne o número de dias decorridos no ano até o dia/mês/ano fornecido. Escreva um função booleana chamada DATA_VALIDA que receba uma data (DIA, MÊS, ANO)e verique se a data é válida (considerando os anos bissextos). Faça um programa que leia 2 datas, no formato dia, mês e ano (as datas devem ter o mesmoano) vericando se as mesmas são válidas (através da função DATA_VALIDA), calcule e exiba adiferença de dias entre elas (usando a função DIAS_ANO).
• 977 − VETORES E MATRIZES7.1 DECLARAÇÃO DE TIPOS A declaração de tipos é feita com um comando TYPE da seguinte forma: TYPE Identificador_de_tipo_1 = Tipo1; Identificador_de_tipo_2 = Tipo2; ... ... Pela a nomenclatura acima o Identicador_de_tipo_1, ... são identicadores e Tipo1, Tipo2, ...são nomes de tipos pré-denidos. Uma vez denido o tipo é possível declarar uma variável desse tipo utlizando o VAR.7.2 VETORES Um vetor é um conjunto formado por uma quantidade xa de dados de um mesmo tipo. Suadeclaração é feita com a palavra reservada ARRAY, seguida de seus limites inferior e superior entrecolchetes e separados entre si por .., da palavra reservada OF e o tipo de cada componente do vetor.Os limites inferior e superior devem ser do tipo ordinal. TYPE Vetor = ARRAY[LimInf..LimSup] of TipoBase; Um vetor também costuma ser chamado de variável indexada ou variável composta homogênea.Para se ter acesso à n-ésima componente de um vetor V, deve-se fazer referência a V[n]. A deniçãode um vetor pode ser feita atribuindo-se valores a cada componente individualmente ou lendo-se cadacomponente de um dispositivo de entrada. Nestes casos é comum o uso de um FOR: FOR n := LimInf TO LimSup DO BEGIN V[n] := valor; END;ou FOR n := LimInf TO LimSup DO BEGIN Readln(V[n]); END;
• 98 Exemplo: As declarações a seguir denem os vetores i = (1, 0, 0), j = (0, 1, 0) e k = (0, 0, 1), abase canônica do R3 . TYPE VetorDoR3 = ARRAY[1..3] OF real; VAR i, j, k: VetorDoR3; ... i[1] := 1; i[2] := 0; i[3] := 0; j[1] := 0; j[2] := 1; j[3] := 0; k[1] := 0; k[2] := 0; k[3] := 1; Exemplo: Denir um vetor V do R10 , cuja n-ésima componente seja igual ao quadrado de n. TYPE Vetor10 = ARRAY [1..10] OF real; VAR V: Vetor10; n: byte; ... for n := 1 to 10 do begin V[n] := Sqr(n); end; Exemplo: A única desvantagem dos vetores do Pascal, é que seu tamanho (dimensão) precisa serxado na sua declaração e o programa NÃO pode alterar esse tamanho. Para um programa manusearvetores de diferentes tamanhos, um truque bastante comum é se declarar o tipo vetor usando o maiortamanho que será necessário. Desse modo o programa poderá trabalhar com vetores de tamanhosmenores do que o tamanho máximo declarado, bastando para isso desperdiçar algumas coordenadas,o que corresponde a desperdiçar memória do computador. Neste exemplo, deniremos uma função VMAX que calcula o maior elemento de um vetor realde tamanho no máximo 100. A função VMax deve ter dois parâmetros: o vetor V e seu respectivotamanho n. Se o leitor cou pensando que íamos dizer que a denição de uma função VMIN seriaanáloga, ele acertou. TYPE Vetor = ARRAY [1..100] OF real; FUNCTION VMax(V: Vetor; n: byte): real; (* Determina o maior dos n primeiros elementos do vetor V *) VAR i: integer; maximo: real; BEGIN maximo := V[1]; (* Chutamos inicialmente que o maior *) (* elemento de V é o primeiro. *) (* Comparamos, MAXIMO com todos os elementos V[i] de V. *) (* Sempre que MAXIMO < V[i], redefinimos MAXIMO := V[i] *) for i := 1 to n do begin
• 99 if maximo < V[i] then begin maximo := V[i]; end; end; VMax := maximo END; Neste exemplo, o vetor V só ca bem denido fornecen- do-se os valores de V e de n.7.2.1 EXERCÍCIOS 1a Questão) Implemente um programa que tenha duas subrotinas: uma que leia e e outra queimprima o conteúdo de um vetor de números reais chamado Y com 10 posições. 2a Questão) Implemente um programa que tenha duas subrotinas: uma que leia um vetor detamanho 10 e outra que imprima somente o conteúdo dos vetores que receberam valores maiores que4. 3a Questão) Implemente um programa que tenha duas subrotinas: uma que leia um vetor detamanho 15 e outra que imprima somente o conteúdo dos vetores que receberam valores negativos. 4a Questão) Implemente um programa que tenha duas subrotinas: uma que leia um vetor detamanho 10 e outra imprima somente o conteúdo dos vetores que receberam valores pares. 5a Questão) Escreva um programa que tenha três subrotinas: uma que leia dois vetoresunidimensionais A e B, de dimensão 8, e outra que realize a troca dos elementos destes vetores;ou seja, após a execução do programa o vetor B deverá conteros valores fornecidos para o vetor A,e vice-versa. E nalmente escreva a rotina que receba como parâmetro um vetor unidimensional detamanho 8 e imprima o seu conteúdo na tela. 6a Questão) Faça uma função que recebe um vetor X(20) de reais, por parâmetro, e retorna asoma dos elementos de X. 7a Questão) Faça um procedimento que recebe, por parâmetro, um vetor A(25) de inteiros esubstitui todos os valores negativos de A por zero. O vetor A deve retornar alterado. 8a Questão) Faça um procedimento que gera os 10 primeiros primos acima de 100 e retorna-osem um vetor X(10), por parâmetro. 9a Questão) Faça um procedimento que recebe 2 vetores A e B de tamanho 10 de inteiros, porparâmetro. O procedimento deve retornar um vetor C, por parâmetro, que contém os elementos deA e B em ordem decrescente. 10a Questão) Faça um procedimento que recebe, por parâmetro, 2 vetores de 10 elementosinteiros e que calcule e retorne, também por parâmetro, o vetor intersecção dos dois primeiros. 11a Questão) Faça um procedimento que recebe, por parâmetro, 2 vetores de 10 elementosinteiros e que calcule e retorne, também por parâmetro, o vetor diferença dos dois primeiros. 12a Questão) Faça um procedimento que recebe, por parâmetro, 2 vetores de 20 elementosinteiros e que calcule e retorne, também por parâmetro, o vetor soma dos dois primeiros. 13a Questão) Faça um procedimento que recebe, por parâmetro, 2 vetores de 15 elementosinteiros e que calcule e retorne, também por parâmetro, o vetor produto dos dois primeiros. 14a Questão) Faça um procedimento que receba, por parâmetro, um vetor K(15) e retorna,também por parâmetro, um vetor P contendo apenas os valores primos de K. 15a Questão) Faça um procedimento que receba um vetor A(100) de inteiros e retorna essemesmo vetor compactado, ou seja, sem os seus valores nulos(zero) e negativos.
• 100 16a Questão) Faça um procedimento que receba, por parâmetro um vetor B(50) de reais ecalcula o maior valor do vetor. A seguir, o procedimento deve dividir todos os elementos de B pelomaior encontrado. O vetor deve retornar alterado.7.3 MATRIZES Uma matriz pode ser considerada como um vetor de vetores: TYPE vetor = ARRAY [1..3] OF real; matriz = ARRAY [1..3] OF vetor; (* matriz 3 x 3 *) No entanto, é possível se declarar os intervalo de variação dos índices de uma só vez, bastandopara isso se separar cada intervalo do outro por uma vírgula: TYPE matriz3x3 = ARRAY [1..3, 1..3] of real; matriz2x5 = ARRAY [1..2, 1..5] of real; matriz4x6 = ARRAY [1..4, 1..6] of integer; O elemento (i, j) de uma matriz M pode ser referenciado como M[i, j] ou como M[i][j]. Exemplo: Para se denir os elementos de uma matriz, são necessárias leituras ou atribuições paracada elemento. Normalmente, essas atribuições são feitas com 2 laços FOR encaixados, um FOR paracada índice: FOR i := 1 TO m DO BEGIN FOR j := 1 TO n DO BEGIN Readln([i, j]); END; END; Se a matriz for pequena, o usuário pode preferir denir a matriz elemento por elemento (semusar laços FOR). Abaixo estão denidas 2 matrizes M e N 2 x 2, ambas iguais à matriz identidade: TYPE matriz2x2 = ARRAY [1..2, 1..2] OF integer; VAR M: matriz2x2; CONST N: matriz2x2 = ((1, 0), (0, 1)); ... M[1, 1] := 1; M[1, 2] := 0; M[2, 1] := 0; M[2, 2] := 1; Exemplo: Neste exemplo, denimos uma matriz A 5 x 6 cujo elemento ai j é dado por
• 101 a_ij = 2i^3 - j^2 + 1 TYPE matriz5x6 = ARRAY [1..5, 1..6] OF integer; VAR i, j: integer; A: matriz5x6; BEGIN for i := 1 to 5 do begin for j := 1 to 6 do begin A[i, j] := 2*i*i*i - j*j + 1; end; end; END. Observações: Podemos ter variáveis indexadas de dimensões maiores que 2. Por exemplo, o TYPEa seguir dene variáveis de dimensões 3 e 4: TYPE Paralepipedo = ARRAY [1..3, 1..4, 1..5] OF real; Dimensao4 = ARRAY[1..3, 1..3, 1..3, 1..3] OF integer; Nestes casos, para se ter acesso aos elementos das variáveis desses tipos (X, Y, ...), deve-se fazerreferências a elementos como X[i, j, k], Y[1, 2, 3, 1], etc. Os elementos de uma matriz podem ser de quaisquer tipos: boolean, string, etc. Por exemplo, atipo MATRIZCHAR abaixo é uma matriz de caracteres e o tipo MATRIZDEBLOCOS é uma matrizde matrizes: TYPE MatrizChar = ARRAY [1..4, 1..6] OF char; MatrizDeBlocos = ARRAY [1..3, 1..3] OF ARRAY [1..3, 1..3] OF real; As variáveis indexadas, como os vetores e as matrizes, podem ser declaradas sem o uso do blocoTYPE. No entanto, acreditamos que esta não é uma prática muito vantajosa para o usuário. VAR i, j, k: ARRAY [1..3] OF integer; Mat1, Mat2: ARRAY [1..2, 1..2] of real; Os índices de uma matriz podem ser de qualquer tipo ordinal, inclusive inteiros negativos. TYPE MatrizEstranha = ARRAY [a..e, -4..-1] OF string;
• 102 O tipo string pode ser pensado como sendo um vetor de caracteres: TYPE string = ARRAY [0..255] OF char;7.3.1 EXERCÍCIOS 1a Questão) Dada as matraizes M e S da gura 7.1: Figura 7.1: Matrizes M e S Qual será o conteúdo de R depois de executado os comandos: .... for I:= 1 to 4 do begin for J:=1 to 4 do begin R[J,I] := M[I,J]; end; end; AUX := R[1,1]; R[1,1] := R[4,4]; R[4,4] := AUX; AUX := R[2,2]; R[2,2] := R[3,3]; R[3,3] := AUX; .... 2a Questão) Faça uma função que recebe, por parâmetro, uma matriz A(5,5) e retorna a somados seus elementos. 3a Questão) Faça uma função que recebe, por parâmetro, uma matriz A(6,6) e retorna a somados elementos da sua diagonal principal e da sua diagonal secundária. 4a Questão) Faça uma função que recebe, por parâmetro, uma matriz A(7,6) e retorna a somados elementos da linha 5 e da coluna 3. 5a Questão) Faça uma função que recebe, por parâmetro, uma matriz A(6,6) e retorna o menorelemento da sua diagonal secundária. 6a Questão) Faça um procedimento que recebe, por parâmetro, uma matriz A(8,8) e calcula omaior elemento da sua diagonal principal. A seguir, o procedimento deve dividir todos os elementosde A pelo maior encontrado. O procedimento deve retornar a matriz alterada. 7a Questão) Faça um procedimento que receba, por parâmetro, duas matrizes A(4,6) e B(6,4)e retorna uma matriz C, também por parâmetro, que seja o produto matricial de M por N.
• 103 8a Questão) Faça um procedimento que receba, por parâmetro, duas matrizes A(4,6) e B(6,4)e retorna uma matriz C, também por parâmetro, que seja a soma de M com N. 9a Questão) Faça um procedimento que receba, por parâmetro, duas matrizes A(4,6) e B(6,4)e retorna uma matriz C, também por parâmetro, que seja a diferença de M com N. 10a Questão) Faça um procedimento que recebe, por parâmetro, uma matriz M(6,6) e um valorA . O procedimento deve multiplicar cada elemento de M por A e armazenar em um vetor V(36). Ovetor V deve retornar por parâmetro. 11a Questão) Faça um procedimento que receba uma matriz A(10,10), por parâmetro, e realizeas seguintes trocas: • a linha 2 com a linha 8; • a coluna 4 com a coluna 10; • a diagonal principal com a secundária; • a linha 5 com a coluna 10; O procedimento deve retornar a matriz alterada. 12a Questão) Faça uma função que receba, por parâmetro, uma matriz B(9,9) de reais e retornaa soma dos elementos das linhas pares de B. 13a Questão) Faça um procedimento que receba, por parâmetro, uma matriz A(12,12) e retorna,também por parâmetro, um vetor com a soma de cada uma das linhas de A . 14a Questão) Faça um procedimento que receba, por parâmetro, uma matriz A(6,6) e multiplicacada linha pelo elemento da diagonal principal daquela linha. O procedimento deve retornar a matrizalterada. 15a Questão) Na teoria dos sistemas, dene-se como elemento minimax de uma matriz o menorelemento de uma linha onde se encontra o maior elemento da matriz. Faça uma função que recebe, porparâmetro, uma matriz A(10,10) e retorna o seu elemento minimax, juntamente com a sua posição. 16a Questão) Faça um procedimento que receba, por parâmetro, uma matriz 61x10. Oprocedimento deve somar individualmente as colunas da matriz e armazenar o resultado na 61alinha da matriz. O procedimento deve retornar a matriz alterada. 17a Questão) Faça uma função que receba, por parâmetro, uma matriz A(12,12) e retorne amédia aritmética dos elementos abaixo da diagonal principal. 18a Questão) Faça uma função que receba, por parâmetro, uma matriz A(10,10)e retorne asoma dos elementos acima da diagonal principal. 19a Questão) Faça uma função que receba, por parâmetro, uma matriz A(7,7)e retorne o menorvalor dos elementos abaixo da diagonal secundária. 20a Questão) Faça uma função que receba, por parâmetro, uma matriz A(8,8) e retorne o menorvalor dos elementos acima da diagonal secundária. 21a Questão) Faça uma função que receba, por parâmetro, uma matriz A(12,12) e retorna amédia aritmética dos elementos abaixo da diagonal principal e da diagonal secundária. 22a Questão) Faça uma função que receba, por parâmetro, uma matriz A(12,12) e retorna oproduto dos elementos acima da diagonal principal e da diagonal secundária.