Tutorial Pascal

Embed Size (px)

Citation preview

Fevereiro de 2011

TUTORIAL DE PASCAL

Comunidade Portugal-a-Programar | Thoga31

Comunidade Portugal-a-Programar

Tutoriais, 2011

TUTORIAL DE PASCALThoga31, Comunidade Portugal-a-Programar Fevereiro de 2011

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 1

Comunidade Portugal-a-Programar

Tutoriais, 2011

Fevereiro de 2011

TUTORIAL DE PASCALRevisto e actualizadoThoga31 P@P

O presente tutorial a verso PDF do original online, que pode ser consultado no Frum da Comunidade Portugal-a-Programar , seguindo o link: http://www.portugal-a-programar.org/forum/index.php/topic,53478.0.htmlbPublicado a 17 de Fevereiro de 2011.

Thoga31

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 2

Comunidade Portugal-a-Programar

Tutoriais, 2011

ndiceNota Introdutria do Autor Objectivos Gerais do Tutorial 6 7

Parte I - Preliminares. Programao bsica.1. Breve histria, nvel da linguagem e compiladores 2. Variveis e tipos de dados 3. Operaes e operadores 3.1. Igualdade, Diferena e Negao 3.2. Soma, subtraco, multiplicao e diviso 3.3. Gravar um resultado numa varivel atribuio 3.4. Valor absoluto e truncado, logaritmo, seno, co-seno e tangente, nmero ao quadrado e raiz quadrada 4. Declaraes e noes sobre Pascal 4.1. Declaraes iniciais e de variveis e enunciaes bsicas 4.2. Atribuir valores num array 4.3. Escrita de textos e leitura de dados 5. Estruturas de Deciso e de Repetio 5.1. Condio If Then Else 5.2. Ciclo Repeat Until 5.3. Ciclo While Do 5.4. Ciclo For to/downto do 5.5. Condio Case of Else 6. Procedimentos e funes 6.1. Procedimentos 6.2. Funes 7. Arredondamentos

88 8 9 9 9 9 9 10 10 11 12 12 12 13 13 14 14 15 15 15 16

Parte II - Componente Prtica para Aplicao de Conhecimentos.1. Hello World! 2. A primeira calculadora uso do If Then Else 3. Avaliaes 1 uso do Case Of 4. Avaliaes 2 uso do Repeat Until 5. Ordenao crescente de uma lista uso do ciclo For To Do 6. Contagem de espaos e palavras numa frase uso de string 7. Clculo da tangente uso de uma funo

1717 17 19 20 21 23 24

Parte III - Funes e Procedimentos padro. Converso. Personalizao grfica.1. Operaes numricas gerais 2. Optimizao bsica 3. Facilitao da leitura de um programa 4. A frmula resolvente programa completo uso de funes

2626 27 28 29

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 3

Comunidade Portugal-a-Programar

Tutoriais, 2011

5. Converso de variveis 5.1. Real/Integer String 5.2. Real Integer 6. Colorao de texto e fundo 7.Caracteres ASCII

30 30 31 31 32

Parte IV - Registos. Ficheiros de texto simples.1. A varivel Record 1.1. A clusula With 2. Cdigos teis sobre o teclado e o cursor 2.1. Posio do cursor 2.2. Determinao da tecla premida 3. A varivel Text escrita e leitura de ficheiros de texto simples parte 1 4. Cdigos teis sobre string 5. Aleatoriedade

3434 36 36 36 37 37 38 39

Parte V - Conjuntos. Estruturao de um programa em Pascal. Data e Hora do Sistema.1. Conjuntos 1.1. Declarao e utilizao 1.2. Operaes com conjuntos 1.3. Comparao de conjuntos 1.4. Anlise de uma linha de texto 2. Estruturao de um programa em Pascal 2.1. Estrutura Begin End 2.2. A clusula Exit 2.3. Etiquetas 2.4. Caractersticas desejveis num programa 3. Data e hora do sistema

4141 41 43 45 45 46 47 47 48 49 49

Parte VI - Recursividade. Variveis de Texto Simples. Estrutura de tentativa. Lista padro do Pascal. 511. Recursividade 2. Variveis Text parte 2 3. Sucessor e predecessor 4. Estrutura de tentativa Try Except Finally 5. Lista padro do Pascal 5.1. Palavras reservadas 5.2. Funes e identificadores padro 5.3. Procedimentos padro 5.4. Operadores 5.5. Tipos de dados 5.6. Tabela ASCII 51 52 54 54 56 56 57 57 57 57 58

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 4

Comunidade Portugal-a-Programar

Tutoriais, 2011

Notas Finais Propostas de Resoluo de Exerccios e Desafios seleccionados Exerccio 1 Exerccio 2 Exerccio 3 Exerccio 4 Exerccio 5 Exerccio 6 Exerccio 7 Exerccio 8 Exerccio 9 Exerccio 11 Desafio 1 Desafio 2 Desafio 3 Desafio 4

59 60 60 60 61 61 62 62 63 63 64 65 66 66 67 67

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 5

Comunidade Portugal-a-Programar

Tutoriais, 2011

Nota Introdutria do Autor com enorme gosto que tenho vindo a escrever o presente Tutorial, iniciado em Junho de 2010, e agora edito esta verso totalmente revista e actualizada. O acto de programar dever ser visto, penso eu, como uma arte, pois tal como no qualquer um que faz uma escultura greco-romana, tambm no qualquer um que pega num problema do quotidiano, ou no, e desenvolve praticamente do nada uma soluo consistente, eficiente e com o menor nvel de erro possvel. Programar bem uma arte que, apesar de muitas vezes vista como a rea dos burrinhos que mais nada sabem do que ter um monitor frente e jogar, a arte que permite que essas mesmas pessoas possam desenvolver os seus trabalhos pessoais, os seus projectos, ter tudo muito simplificado graas a um computador e a um programa realizado por um ou mais programadores. Afinal, os programadores so mesmo uns burrinhos. Muito se discute, tambm, sobre qual a melhor linguagem de programao para se iniciar. E eu respondo: depende. Depende dos vossos objectivos, depende da vossa fome de aprender, depende dos vossos projectos que tm no vosso horizonte. Em muitas escolas, faculdades e/ou universidades, institutos politcnicos, entre outros, d-se o Pascal como a primeira linguagem por ser estruturada, geralmente intuitiva e, actualmente, com os horizontes abertos para os novos paradigmas. O presente Tutorial no dispensa totalmente a consulta de bibliografia extra, pois a sua quase totalidade foi feita sem recurso a qualquer uma. Podero haver designaes tcnicas diferentes das que aqui so ditas, pois, de quando em vez, utilizo antes as minhas prprias expresses por achar que so mais intuitivas. Este Tutorial tenta quebrar certos padres estruturais do ensino desta linguagem de programao. um mtodo totalmente pessoal, em que haver quem goste e quem no goste, claro. Por ltimo, boa viagem no mundo Pascal. O autor,

Thoga31

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 6

Comunidade Portugal-a-Programar

Tutoriais, 2011

Objectivos Gerais do TutorialO presente Tutorial direcciona-se essencialmente a principiantes em Pascal. Tem por objectivo divulgar o Pascal como uma linguagem com grandes potencialidades para a aprendizagem de Programao, pois a sua linguagem aproxima-se deveras ao ingls. De incio so abordados os preliminares da linguagem, incluindo uma breve referncia histrica, sob uma forte componente terica, que consolidada na Parte 2, s de componente prtica. Seguem-se partes terico-prticas sobre as estruturas mais importantes do Pascal, num total de quatro partes. Cada Parte tem uma breve introduo para dar a conhecer as focalizaes desta, bem como inclui um ndice para orientao inicial sobre os temas tratados e a sua organizao. Por ltimo, repetindo, pessoalmente falando, o que j disse no tpico original Enjoy it!

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 7

Comunidade Portugal-a-Programar

Tutoriais, 2011

PARTE I Preliminares. Programao bsica.Aqui comeam por ser dados os grandes alicerces essenciais para se programar em Pascal. As estruturas essenciais, as principais palavras reservadas, a estruturao bsica de um programa em Pascal. Esta uma parte totalmente terica, que ter a sua consolidao na Parte II, s de aplicaes prticas dos assuntos agora tratados.

1. Breve histria, nvel da linguagem e compiladoresAps a criao do Assembly como primeira linguagem de programao que no exigia que o programador escrevesse os seus programas directamente em cdigo binrio, Niklaus Wirth criou, em 1971, a primeira linguagem de programao estruturada qual, em homenagem ao grande matemtico Blaise Pascal, deu o nome de Pascal. Esta foi uma linguagem baseada originalmente no ALGOL-60. Niklaus Wirth preocupou-se em aproximar a linguagem de programao da linguagem do ser humano, em particular, claro est, o ingls. Depois do seu sucesso com o lanamento do Pascal, hoje em dia discute-se se esta uma linguagem de baixo nvel, mdio nvel ou alto nvel. Se considerarmos que estas denominaes foram criadas baseadas na proximidade da linguagem de programao linguagem humana, constatamos que o Pascal de alto nvel. Contudo, actualmente confunde-se estas designaes com as potencialidades que a linguagem oferece, e, devido a isto, muitos dizem que Pascal de baixo nvel. Ora, um dos compiladores mais antigos e dos mais famosos do mundo o Turbo Pascal. Contudo, mais compiladores e IDEs tm sado, muitos na tentativa de criar um compilador/IDE com um ambiente grfico muito mais agradvel que o Turbo Pascal, como o caso do Dev-Pascal (IDE que utiliza o GNU Pascal ou o Free Pascal como compilador subjacente). O compilador mais utilizado o primeiro referido, havendo um compilador baseado neste e tambm muito utilizado, que o Free Pascal. Qualquer um destes IDEs/compiladores muito bom, apesar de muitas divergncias quanto a este tema. Existem compiladores que aceitam operadores da linguagem C, tais como: += -= *= /=. Escolhido um IDE/compilador, e partindo do pressuposto que sabem as bases sobre Lgica e Algoritmos, passamos ento a referir os tipos de variveis com que mais se trabalha, os principais operadores e afins, condies e ciclos, bem como as principais declaraes do pascal, os procedimentos e as funes.

2. Variveis e tipos de dados Os principais tipos de dados so os seguintes: Integer nmero inteiro Real nmero real String texto Char caracter Word palavra representa um nmero inteiro, s que organizado de forma diferente em memria* Longint nmero inteiro mais longo Array matriz de valores, de 1, 2 ou mais dimenses Boolean booleano: verdadeiro ou falso Text ficheiro de texto simples

* - A explicao est fora do mbito do presente Tutorial.

Nenhuma varivel poder ter o nome de um destes tipos de dados, ou seja, por exemplo, nunca uma varivel de nmero inteiro poder ser chamada de Array, pois esta uma palavra reservada* do Pascal.* - Palavra com uma funo bem definida, que no pode ser redefinida. Apresenta-se uma lista na Parte VI.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 8

Comunidade Portugal-a-Programar

Tutoriais, 2011

3. Operaes e operadores3.1. Igualdade, Diferena e NegaoA igualdade e a diferena so teis essencialmente em condies. A resposta que estes operadores devolvem ao programa do tipo booleana: verdadeiro ou falso. Por exemplo, no caso de 2 = 2 ser devolvido True (verdadeiro), pois, de facto, 2 igual ( = ) a 2. J no caso de 2 2 ser devolvido False (falso), pois 2 no diferente de 2. J no caso de ser escrito NOT (2 2), ser devolvido que verdade, pois, de facto, 2 no diferente de 2. = igual a diferente de not no

3.2. Soma, subtraco, multiplicao e divisoSe declararmos as variveis A e B como nmeros inteiros (Integer), ento estas operaes sero dadas segundo a seguinte lista: Soma: A + B Subtraco: A - B Multiplicao: A * B Diviso: A / B Contudo, no caso da diviso, o Pascal tem dois operadores que devolvem um o resultado da diviso como um nmero inteiro e outro o primeiro resto da diviso: Resultado inteiro: A div B Primeiro resto: A mod B

3.3. Gravar um resultado numa varivel atribuioO resultado destas ltimas operaes pode ser gravado numa varivel (atribudo a uma varivel) para depois ser utilizado noutros processos e clculos. Em Pascal, o comando (operador) que d ordem para gravar (atribuir) um valor numa varivel :=. Este processo denominado de atribuio. Por exemplo, se quisermos somar duas variveis inteiras, A e B, e atribuir o resultado a uma varivel inteira chamada resultado, ser escrito resultado := A+B. As variveis array tm uma forma diferente de serem atribudas, apesar de utilizarem este operador. Tal ser visto mais frente.

3.4. Valor absoluto e truncado, logaritmo, seno, co-seno e tangente, nmero ao quadrado e raiz quadrada Continuando com a varivel A do tipo Integer: Valor absoluto: abs(A) Valor truncado: trunc(A) Logaritmo neperiano (de base e): ln(A) Seno (ngulo em radianos, s): sin(A) Co-seno (ngulo em radianos, s): cos(A) Nmero ao quadrado: sqr(A) Raiz quadrada: sqrt(A)

Ora, pela frmula da tangente, esta calculada por sin(A)/cos(A). claro que, se o co-seno valer zero ento o programa dar erro e ir abaixo. Mais frente, nas condies, veremos como transpor esta situao.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 9

Comunidade Portugal-a-Programar

Tutoriais, 2011

4. Declaraes e noes sobre Pascal4.1. Declaraes iniciais e de variveis e enunciaes bsicas Um programa em Pascal tem de se iniciar com as seguintes declaraes: Nome do programa Bibliotecas a utilizar Variveis, tipos e constantes

O nome do programa enunciado com a palavra reservada program, que dever ter o mesmo nome do ficheiro que contm o cdigo-fonte, tirando a extenso do ficheiro (*.pas, *.pp ou outra). As bibliotecas so conjuntos de operaes e funes que, sem estas estarem enunciadas, no sero reconhecidas pelo compilador. Por exemplo, o comando gettime, que obtm a hora do computador, s funciona com a biblioteca dos. As bibliotecas a utilizar so declaradas com uses. A biblioteca mais utilizada e que contm as funes bsicas a biblioteca crt esta a biblioteca obrigatria para quase todos os programas. Por fim, as variveis so declaradas pela palavra reservada var. Contudo, para alm destas, existem os Tipos de Varivel e as Constantes. As constantes so valores que nunca so alterados ao longo do programa. Podem ser de qualquer tipo, sendo o mais comum nmero real, como por exemplo o valor de pi. As constantes so enunciadas com const. J no caso de um conjunto de variveis for todo do mesmo tipo (que no seja um tipo de dado simples predefinido), pode-se criar um tipo de varivel com um nome dado por ns, para alm dos enunciados anteriormente. Os novos tipos criados pelo programador so declarados por type. Por exemplo:program exemplo; uses crt; type lista = array[1..10] of integer; var avaliacoes:lista; n:string; const pi=3.14;

Como pode ser visto por este exemplo, uma instruo sempre seguida de ponto e vrgula, excepto nalguns casos, dos quais um deles ser abordado mais frente, que com a palavra reservada else. Para alm disso, um tipo de varivel definido por nome_do_tipo = tipo_de_dado. Neste caso, foi declarado que lista do tipo array de 1 dimenso, constitudo por dez elementos, que comea no elemento n 1 e acaba no elemento n 10, e este array feito de variveis integer. As constantes tambm so enunciadas como uma igualdade. Sempre que no programa for escrito numa instruo, segundo o exemplo dado, pi, o programa ir assumir o valor 3.14. Caso se tente atribuir um resultado qualquer a pi, o compilador dar erro na compilao. As variveis so declaradas segundo a estrutura var nome_variavel : tipo_variavel;. Neste caso, foi enunciado que a varivel n do tipo String. Os arrays, como matrizes de variveis, tm de ser declaradas quanto sua dimenso* e ao tipo de variveis que comporta: var nome : array [dimenso] of tipo_variavel;. A dimenso pode ser uni ou multidimensionais, ou seja, uma simples lista ou uma espcie de tabela de valores. Por exemplo:var list_numeros : array [0..5] of real; tabela : array [0..5,0..3] of real;* - mais propriamente, o conjunto do array. Contudo, tal conceito s ser abordado na Parte V.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 10

Comunidade Portugal-a-Programar

Tutoriais, 2011

A varivel list_numeros pode ser apresentada aos nossos olhos da seguinte forma: 0 1 2 3 4 5 J a varivel tabela pode ser apresentada desta forma: 0,0 1,0 2,0 3,0 4,0 5,0 0,1 1,1 2,1 3,1 4,1 5,1 0,2 1,2 2,2 3,2 4,2 5,2 0,3 1,3 2,3 3,3 4,3 5,3

Por fim, aps a declarao do programa, das bibliotecas, dos tipos de variveis e/ou das variveis e/ou das constantes, para o programa ser inicializado e finalizado resta-nos o seguinte:program exemplo; uses crt; var A:integer; begin // INCIO // declaraes iniciais

// programa principal end. // FIM

4.2. Atribuir valores num arrayContinuando com as variveis list_numero e tabela, vamos atribuir valores dentro de cada um destes arrays. Na list_numero, vamos atribuir um valor na localizao 2, neste caso -4.5:list_numero[2] := -4.5

Assim, considerando que os restantes elementos do array ainda no foram alterados, o array list_numero ter o seguinte aspecto grfico (quando uma varivel declarada, e esta do tipo numrico, o seu valor inicial , por defeito, 0 (zero)): 0 0 -4.5 0 0 0 J para atribuir este valor em tabela na posio (3,1):tabela[3,1] := -4.5

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 11

Comunidade Portugal-a-Programar

Tutoriais, 2011

O aspecto final do array ser: 0 0 0 0 0 0 0 0 0 -4.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0

4.3. Escrita de textos e leitura de dados O programa pode escrever textos e receber dados, como bvio realiza operaes de input e de output. Para escrever um texto e fazer pargrafo:writeln('Texto');

Contudo, se quisermos escrever um texto e deixar o cursor a piscar frente deste, escrevemos:write('Texto ');

Para ler dados:readln(varivel);

A varivel lida tem de coincidir com o seu tipo. Por exemplo, se a varivel for a A, do tipo Integer, faremos:readln(A);

No caso de introduzirmos um nmero real ou um texto em vez de um nmero inteiro, o programa ir abaixo. Por isso h que avisar o utilizador desse facto:write('Introduza um numero inteiro: '); readln(A);

5. Estruturas de Deciso e de RepetioEstruturas de deciso so instrues estruturadas que permitem ao programa (computador) analisar uma determinada condio e, consoante esta seja verdadeira ou falsa, ir decidir o que realizar de seguida. Doravante, nesta parte, para simplificar, sero designadas por condies, que , de facto, uma outra designao bastante comum e muito utilizada mesmo entre profissionais. J as estruturas de repetio so instrues estruturadas que obrigam o programa repetir um conjunto de instrues conforme a condio verdadeira ou falsa. Doravante, sero designadas por ciclos.

5.1. Condio If Then ElseEsta condio d uma ordem ao programa do tipo Se Ento Seno:if (condio) then begin (comandos1) end else begin (comandos2) end;

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 12

Comunidade Portugal-a-Programar

Tutoriais, 2011

Ou seja, se a condio for verdadeira, ento so executados os comandos1, seno so executados os comandos2. Por exemplo, se a varivel A, do tipo Real, for positiva ou nula, mostra-se o texto numero positivo ou nulo, caso contrrio mostra-se o texto numero negativo:write('Introduza um numero real: '); readln(A); if (A>=0) then begin writeln('Numero positivo ou nulo'); end else begin writeln('Numero negativo'); end;

5.2. Ciclo Repeat UntilEste ciclo obriga o programa a executar a mesma srie de instrues at que a condio imposta seja satisfeita (verdadeira). Por exemplo, se quisermos que o utilizador introduza um nmero inteiro positivo e no nulo:repeat // Repetir... readln(A); until (A>0); // AT QUE (A>0)

5.3. Ciclo While DoEste ciclo faz o mesmo que o ciclo Repeat Until, contudo f-lo com a lgica contrria. Enquanto o ciclo anterior dizia Repetir at que a condio seja verdadeira, este ciclo diz Repetir enquanto a condio for verdadeira. Recorrendo ao mesmo exemplo anterior, mas aplicando este ciclo:while (A0) do begin // Enquanto A no maior que zero readln(A); end;* - Nome dado a cada vez que o bloco de instrues dentro de uma estrutura de repetio processado.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 13

Comunidade Portugal-a-Programar

Tutoriais, 2011

5.4. Ciclo For To/Downto DoEste um ciclo que muito til, por exemplo, para escrever o contedo de um array. Voltando ao array anteriormente descrito, tabela, consideremos que o programa j lhe atribuiu valores para escrever o seu contedo no ecr:program exemplo; uses crt; var tabela:array[0..5,0..3] of real; i,j:integer; begin // commandos anteriores, quaisquer, que atribuiram valores no array for i:=0 to 5 do begin for j:=0 to 3 do begin write(tabela[i,j],'; '); end; writeln; end; end.

incrementado varivel i (contador) o valor 1 aps o conjunto de comandos ter sido realizado, assim como varivel j. O conjunto de comandos que est dentro do primeiro ciclo for s termina quando i assumir o valor 5. Assim acontece com o segundo ciclo: s termina quando j valer 3. Contudo, poder-se- escrever a ordem da tabela ao contrrio. Em vez de comearmos pelo valor [0,0] e terminarmos no valor [5,3], comeamos em [5,3] e acabamos em [0,0]. Em vez de escrevermos, no ciclo, to, escrevemos downto, que significa que se incrementa o valor -1 varivel contador do ciclo (a varivel diminui em uma unidade):program exemplo; uses crt; var tabela:array[0..5,0..3] of real; i,j:integer; begin // commandos anteriores, quaisquer, que gravaram valores no array for i:=5 downto 0 do begin for j:=3 downto 0 do begin write(tabela[i,j]); end; writeln; end; readln; // impede que o programa feche logo com o END final, esperando que seja premido ENTER end.

Mais frente, na Parte II, dada uma excelente exemplificao da utilizao deste ciclo.

5.5. Condio Case of elseEsta condio pode poupar a utilizao excessiva de condies if. Esta instruo diz-nos Caso a varivel assuma este valor, ento. Se se pretender classificar uma nota de 0 a 20 em termos qualitativos, ter-se-, por exemplo, o seguinte:program avaliacoes; uses crt; var nota:integer; begin write('Introduza uma nota, de 0 a 20: '); readln(nota); case nota of 0..9:writeln('Insuficiente'); 10..14:writeln('Suficiente'); 15..17:writeln('Bom'); Thoga31Tutorial de Pascal, Fevereiro de 2011 Pgina 14

Comunidade Portugal-a-Programar

Tutoriais, 2011

18..20:writeln('Excelente'); End else begin if (nota20) then writeln('ERRO! Nota nao pode ser maior que 20!'); end; readln; end.

Caso mais do que uma instruo tenha que ser executada em determinado caso, a estrutura ser:case nota of 0..9:begin writeln('Insuficiente.'); writeln('Chumbou!'); end; 10..14: // etc... end;

Na Parte II voltar a ser abordado este exemplo, estendido.

6. Procedimentos e funes6.1. ProcedimentosDentro de um programa pode existir um subprograma. Estes subprogramas so designados, em Pascal, por procedimentos, e so declarados antes do bloco principal do programa pela expresso reservada procedure. Por exemplo, podemos criar um procedimento para calcular a raiz quadrada de um nmero, sem que tal seja feito no bloco principal:program raiz; uses crt; var a,resultado:real; procedure calc_raiz; begin resultado:=SQR(a); end; begin write('Introduza valor A: '); readln(a); calc_raiz; // chama o procedimento writeln('A raiz quadrada de A e: ',resultado); readln; end.

6.2. FunesO mesmo pode ser feito atravs de uma funo. Podemos, por exemplo, criar uma funo, num programa, que calcule a tangente de um nmero sem ser necessrio calcular no meio do bloco principal todas as contas necessrias. Uma funo declarada antes do bloco principal atravs da palavra reservada function. Dever-se- ter em conta que uma funo devolve um valor e um procedimento no, ou seja, uma funo da mesma hierarquia das funes padro do Pascal, como abs, e os procedimentos so subprogramas dentro do programa principal que executam instrues sem devolverem absolutamente nada no fim. Veja-se o exemplo:

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 15

Comunidade Portugal-a-Programar

Tutoriais, 2011

program tang_ang; uses crt; var angulo:real; procedure ler_angulo; begin write('Introduza angulo em radianos: '); readln(angulo); end; function tangente(a:real):real; begin tangente:=SIN(a)/COS(a); end; begin ler_angulo; // procedimento que vai ler o ngulo, mas nada devolve. writeln('A tangente do angulo e: ',tangente(angulo)); // funo que calcula a tangente e devolve o seu resultado. readln; end.

7. ArredondamentosEm Pascal possvel, claro est, arredondar valores. Existem dois mtodos distintos. Atravs da funo padro round, que arredonda s s unidades e pode ser atribudo o resultado a uma varivel, ou atravs de um cdigo que utiliza dois pontos ( : ). Por exemplo, para arredondar um resultado do tipo real (sendo este a varivel resultado) s unidades:var i : integer; resultado : real; // ... i := round(resultado);

Com o mtodo dos dois pontos, podemos indicar o espao que o nmero ocupa e o arredondamento que tem, do gnero: nmero:espao:arredondamento. Por exemplo:write(resultado:12:5);

Neste caso, se o resultado for 34.56356976356, ir aparecer algo como (sendo - indicao de um espao vazio): ----34.56357 J se for escrito:write(resultado:0:2);

Ir aparecer exactamente como: 34.56 Ateno!: este mtodo s serve para a escrita com os procedimentos padro write e writeln.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 16

Comunidade Portugal-a-Programar

Tutoriais, 2011

PARTE II Componente Prtica para Aplicao de ConhecimentosNesta continuao ser dada nfase parte prtica da programao em Pascal. Sero colocados igualmente Propostas de Exerccios. Esta parte do Tutorial no ter constantes explicaes dos cdigos para poder exercitar a leitura lgica de um programa em Pascal.

1. Hello World!Como em qualquer linguagem, onde se comea regra geral com o famoso Ol Mundo!, ir-se- realiz-lo em Pascal. Primeiramente, h que saber que, neste programa, apenas ser escrita uma mensagem, pelo que bibliotecas no so necessrias. Esta parte , ento, omitida nas declaraes iniciais:program hello_world; // Declara-se o programa, no geral. // bibliotecas no so necessrias // no so necessrias variveis begin writeln('Hello World!'); // escreve o texto Hello World! readln; // sem isto, o programa encerrado repentinamente: necessrio pressionar ENTER. end.

Embeleze-se o programa, onde j se ir pedir o nome do utilizador e dar uma mensagem final.program hello_world; // Declara-se o programa, no geral. uses crt; // dependendo do IDE/compilador, esta biblioteca ser necessria ou no neste exemplo var nome:string; begin write('Introduza o seu nome: '); // escreve o texto, e o cursor fica frente deste, pois falta o sufixo LN (LiNe) readln(nome); writeln; // faz mais um pargrafo sem escrever texto writeln('Hello World!'); writeln('Seja bem-vindo, Sr.(a) ',nome); // escreve o texto, seguido do contedo da varivel NOME readln; end.

2. A primeira calculadora uso do If Then ElseCrie-se a primeira calculadora. O utilizador no vai escolher o operador. Simplesmente o utilizador introduz os dois valores e aparecem os resultados das quatro operaes bsicas. Necessitar-se- de uma condio If Then Else por causa da diviso. Se o denominador for 0 (zero), o programa, ao tentar fazer a conta, ir abaixo: a condio vai evitar este bug.program primeira_calculadora; uses crt; var num1,num2:real;

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 17

Comunidade Portugal-a-Programar

Tutoriais, 2011

Ou seja, utilizar-se- duas variveis reais que alojaro os dois valores necessrios.program primeira_calculadora; uses crt; var num1,num2:real; begin writeln('CALCULADORA SIMPLES'); write('Primeiro valor: '); readln(num1); write('Segundo valor: '); readln(num2); end.

Neste momento, o utilizador convidado a introduzir os dois valores que faro parte das quatro operaes. Resta, ento, realizar os clculos e mostr-los ao utilizador:program primeira_calculadora; uses crt; var num1,num2:real; begin writeln('CALCULADORA SIMPLES'); write('Primeiro valor: '); readln(num1); write('Segundo valor: '); readln(num2); writeln; writeln(num1:0:3,' + ',num2:0:3,' = ',num1+num2:0:3); writeln(num1:0:3,' - ',num2:0:3,' = ',num1-num2:0:3); writeln(num1:0:3,' * ',num2:0:3,' = ',num1*num2:0:3); end.

Contudo, chega a fase de antever a situao de num2 = 0 por causa da diviso. Criar-se-, ento, a condio parte.write(num1:0:3,' / ',num2:0:3,' = '); // no faz pargrafo, frente ficar o resultado ou uma mensagem de erro if (num2 = 0) then begin // SE num2=0 ENTO write('Infinito'); // escrever INFINITO end else begin // SE NO writeln(num1/num2:0:3); // escrever resultado end;

Inclua-se no cdigo do programa:program primeira_calculadora; uses crt; var num1,num2:real; begin writeln('CALCULADORA SIMPLES'); write('Primeiro valor: '); readln(num1); write('Segundo valor: '); readln(num2); writeln; writeln(num1:0:3,' + ',num2:0:3,' = ',num1+num2:0:3); //a clusula :0:3 d duas indicaes: ocupar o espao mnimo de 0 caracteres, //arredondando o nmero a 3 casas decimais writeln(num1:0:3,' - ',num2:0:3,' = ',num1-num2:0:3); writeln(num1:0:3,' * ',num2:0:3,' = ',num1*num2:0:3); write(num1:0:3,' / ',num2:0:3,' = '); if (num2 = 0) then begin // SE num2=0 ENTO

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 18

Comunidade Portugal-a-Programar

Tutoriais, 2011

writeln('Infinito'); // escrever INFINITO end else begin // SE NO writeln(num1/num2:0:3); // escrever resultado end; readln; // esperar pelo ENTER end.

3. Avaliaes 1 uso do Case OfConsidere-se uma escala de avaliaes, numa escola, de 0 a 20 (de zero a vinte) valores. Considere-se a negativa uma avaliao abaixo de 10 e a positiva acima deste valor, inclusive. Utilizar-se- apenas e to-somente, neste exemplo, avaliaes inteiras (nmeros inteiros).program avaliacoes; uses crt; var nota : integer; begin write('Escreva a avaliacao, inteira, de 0 a 20: '); readln(nota); case nota of // falta a seleco de casos else writeln('Nota invalida'); end; readln; end.

Para seleccionar os casos, pode-se utilizar a noo de intervalo*, existente no Pascal. Evita-se escrever o caso de ser 0, de ser 1, 2, 3 e por a adiante. Se se quiser que o caso de a avaliao ser FRACO seja no intervalo de 0 a 3, inclusive, pode-se escrever este intervalo como 0..3* - Mais propriamente Conjunto, s abordado na Parte V.

Ento, faa-se a seleco de casos no programa:program avaliacoes; uses crt; var nota : integer; begin write('Escreva a avaliacao, inteira, de 0 a 20: '); readln(nota); case nota of 0..3 : writeln('Fraco'); 4..9 : writeln('Insuficiente'); 10..12 : writeln('Pouco Suficiente'); 13..15 : writeln('Suficiente'); 16..18 : writeln('Bom'); 19..20 : writeln('Excelente') else writeln('Nota invalida'); end; readln; end.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 19

Comunidade Portugal-a-Programar

Tutoriais, 2011

4. Avaliaes 2 uso do Repeat UntilPegue-se no programa anterior e acrescentasse-lhe dois ciclos Repeat Until. Um para analisar a nota assim que introduzida, e outro para controlar o fecho do programa: caso o utilizador escreva 1 o programa volta a pedir uma avaliao, caso contrrio fecha o programa. A estrutura para analisar a introduo da avaliao ter de ser a seguinte:repeat write('Escreva a avaliacao, inteira, de 0 a 20: '); readln(nota); until (nota>=0) and (nota=0) and (nota=0) and (nota=0) and (nota=0) and (nota= 0); writeln('REGISTO ',i,' DE 3 EFECTUADO.'); writeln; end; writeln; writeln; for i:=1 to 3 do begin // ESCRITA writeln('A VER REGISTO NUMERO ',i); writeln('Nome: ',upcase(registo[i].nome)); writeln('Sexo: ',upcase(registo[i].sexo)); writeln('Idade: ',registo[i].idade); writeln; end; readln; end. // pausa at ENTER

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 35

Comunidade Portugal-a-Programar

Tutoriais, 2011

Propostas de Exerccios8. Crie um programa que registe os dados sobre uma turma inteira e faa a estatstica bsica. Sero pedidos o nmero de alunos, e o nome e as avaliaes a Matemtica e a Portugus de cada um. No final, o programa faz a estatstica e diz quais os alunos aptos a ir a Exame Nacional (mdia igual ou superior a 9,5) de cada disciplina, qual a mdia da turma a Matemtica e a mdia a Portugus. Normas: Dever ser utilizado um s Record, que inclua todos os campos; Recorra a ciclos for para percorrer os campos; No mximo, s podero existir 30 alunos; Limite de linhas de cdigo (exclusive comentrios e linhas em branco): 100 linhas.

1.1. A clusula WithExiste um cdigo, tambm denominado, neste caso, de clusula, que permite pegar num Record e trabalhar com ele, sem que se tenha de escrever constantemente o nome do registo. Por exemplo:with registo[2] do begin nome := 'Thoga31'; idade := 0; sexo := 'M'; end;

Substitui:registo[2].nome := 'Thoga31'; registo[2].idade := 0; registo[2].sexo := 'M';

Ou seja, simplifica muito a escrita de cdigo, e permite maior legibilidade.

2. Cdigos teis sobre o teclado e o cursor2.1. Posio do cursorAt ao momento, os programas tm sido direccionados para as consolas DOS. Como se sabe, a consola DOS tem sempre o cursor a piscar, numa determinada posio. Em Pascal possvel controlar esta posio atravs de um comando extremamente simples. Considere-se a janela como um grfico cartesiano, s de valores inteiros. Seja X a abcissa (horizontal) e Y a ordenada (vertical). A posio inicial do cursor na consola no canto superior esquerdo: X=1 e Y=1. Ande-se duas linhas para baixo: X=1 e Y=3. Ande-se com o cursor nove colunas para a frente (direita): X=10 e Y=3. Se quisermos posicionar o cursor nesta ltima posio:gotoxy(10, 3);CDIGO: posicionamento do cursor na consola DOS

gotoxy(x, y) Este cdigo s utilizvel quando declarada a biblioteca crt. Caso contrrio, um cdigo no declarado.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 36

Comunidade Portugal-a-Programar

Tutoriais, 2011

2.2. Determinao da tecla premida possvel gravar a qualquer altura qual a tecla premida por um utilizador. Esta funo extremamente til na criao de menus apelativos. O utilizador em vez de escrever, por exemplo, 1 e, de seguida, premir ENTER, bastar-lhe- premir a tecla 1 e, se for uma opo vlida do menu apresentado, avana imediatamente, sem ser necessrio premir ENTER. Por exemplo:uses crt; // biblioteca OBRIGATRIA var tecla : char; // (. . .) writeln('MENU'); writeln('1 > Repetir operacao'); writeln('2 > Sair'); repeat tecla := readkey; // grava na varivel TECLA qual a tecla (key) premida pelo utilizador until (char(tecla) = '1') or (char(tecla) = '2');

O cdigo readkey determina a tecla premida pelo utilizador, gravando-a numa varivel char. Este cdigo s utilizvel quando declarada a biblioteca crt. Caso contrrio, um cdigo no declarado.

Propostas de Exerccios9. Crie uma calculadora que grave num Record, em campos distintos, os dois termos da operao, e o operador. O utilizador dever escolher o operador sem ter de premir ENTER, segundo uma lista dos operadores disponveis (soma, subtraco, multiplicao e diviso). Preveja situaes de erro, e permita que o utilizador as corrija. O utilizador, com um novo menu, sem recurso ao ENTER, ir escolher se deseja sair do programa ou realizar novo clculo. Utilize colorao de texto variada, e no de fundo. O ecr dever ter fundo cinza claro. Normas: Dever ser utilizado um s Record; Limite de linhas de cdigo (exclusive comentrios e linhas em branco): 100 linhas.

3. A varivel Text escrita e leitura de ficheiros de texto simples parte 1O Pascal tem a capacidade de trabalhar com ficheiros. Existem duas variveis para o fazer, contudo vamos abordar apenas aquela que permite escrever e ler ficheiros de texto simples, ou seja, ficheiros cujo contedo no passa de texto simples, no formatado: a varivel Text, cujo nome denuncia o tipo de ficheiros que vai trabalhar. O funcionamento desta varivel em tudo diferente das variveis com que j trabalhmos at agora. Vamos, ento, estudar esta varivel por partes e com exemplos prticos. O primeiro programa apresentado cria um ficheiro TXT e grava nele o texto Hello World! For Pascal TEXT!. O ficheiro nomeado de texto.txt.program escrever_ficheiro; var ficheiro : text; begin assign(ficheiro, 'texto.txt'); // assina em memria o ficheiro de texto simples, e cria-o junto do executvel rewrite(ficheiro); // ordena a re-escrita do ficheiro caso o ficheiro j exista e contenha texto, // este ser eliminado write(ficheiro, 'Hello World! For Pascal TEXT!'); // escreve no ficheiro o texto Thoga31Tutorial de Pascal, Fevereiro de 2011 Pgina 37

Comunidade Portugal-a-Programar

Tutoriais, 2011

close(ficheiro); // encerra o ficheiro em memria end.

Quando se tenta aceder a um ficheiro de texto simples que esteja assinado em memria por um programa deste gnero, aparecer a famosa Message Box a dizer que o ficheiro est a ser utilizado por outro processo. Isto ajuda a explicar o que acontece no sistema aquando o cdigo assign. Agora, vamos criar um novo programa, que ficar no mesmo directrio, e que vai abrir o ficheiro anterior e contar o nmero de espaos do texto que contm:program ler_ficheiro; var ficheiro : text; s : string; contador, i : integer; begin assign(ficheiro, 'texto.txt'); reset(ficheiro); // reinicia o ficheiro, ou seja, acede-lhe mas no pode re-escrever dados nele, // s pode ler readln(ficheiro, s); contador := 0; for i:=1 to length(s) do if s[i] = ' ' then contador += 1; // a linha de cdigo anterior recorre Optimizao writeln('Existem ',contador,' espacos no ficheiro.'); close(ficheiro); readln; end.

Desafio 5

Investigue sobre o CV (Curriculum Vitae) europeu o Europass. Crie um programa que crie um CV deste modelo, cumprindo todos os campos, excepto o da Fotografia. O programa ir registar os dados do utilizador e, de seguida, ir mostrar por passos o que o utilizador introduziu. No caso de confirmao, dever gravar o CV num ficheiro TXT cujo nome ser CV_nome, onde nome o nome do utilizador, sem espaos. Os campos no preenchidos no devero aparecer no ficheiro. Caso o utilizador pretenda alterar um campo, tal dever ser permitido sem que, para tal, seja necessrio refazer o CV todo. Normas: O CV dever estar registado num s Record, que inclua Records das partes, e dentro de cada parte os seus campos respectivos; O CV s ser gravado em ficheiro no fim, aquando a confirmao final por parte do utilizador; O utilizador poder cancelar o CV a qualquer altura, escrevendo ; Limite de linhas de cdigo (exclusive comentrios e linhas em branco): livre

4. Cdigos teis sobre stringSeja a varivel s uma String com o seguinte texto: BEM VINDOpos('M', s);

Determina a posio do primeiro M que encontrar: neste caso, 3. Devolve um valor Integer, a ser gravado numa varivel deste tipo.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 38

Comunidade Portugal-a-Programar

Tutoriais, 2011

delete(s, 7, 3);

Elimina 3 caracteres a partir da posio 7, inclusive. A string passa a ser BEM VI.insert('- ', s, 4);

Insere, na posio 4, o texto - . A string passa a ser: BEM VINDO.

Propostas de Exerccios10. Crie um programa em que o utilizador introduza uma string e possa realizar testes variados com ela. A original dever manter-se intacta, sendo uma string auxiliar a utilizada para as operaes. O utilizador poder escolher a posio, os caracteres e textos, entre outros, relacionados com os cdigos anteriores. Normas: livre.

5. AleatoriedadeUma das capacidade do computador o clculo de nmeros aleatrios. Estes nmeros no so propriamente aleatrios - chama-se a este processo pseudo-aleatoriedade, isto porque o computador no tem a capacidade de "pensar" num nmero aleatoriamente. Existem diversos algoritmos, praticamente todos baseados no tempo. Este princpio baseia-se, geralmente, num Timer do computador em que, quando requerido um nmero pseudo-aleatrio, este calcula-o segundo uma frmula que inclui os limites mnimo e mximo do conjunto no qual deve estar o nmero, e o Timer. devolvido ento o resultado de um clculo, e no um nmero totalmente aleatrio. Em Pascal, necessrio, na generalidade dos compiladores, "activar" este Timer para que possam ser debitados valores pseudo-aleatrios.randomize;

No existe nenhum procedimento que "pare" o Timer. Contudo, esta ltima instruo pode ser constantemente utilizada sem "efeitos". O Pascal s admite conjuntos de 0 a maxint (i.e., o nmero mximo inteiro positivo suportado), inclusive. Para requerer um nmero pseudo-aleatrio que pertena a um conjunto de 0 a n, inclusive:random(n);

Esta funo devolve um nmero real. Crie-se, ento, um pequeno programa que debite em toda a consola um cdigo binrio aleatrio:program binario; uses crt; var i, j : integer; begin randomize; for i:=1 to 20 do begin for j:=1 to 80 do begin gotoxy(j,i); write(TRUNC(RANDOM(2))); end; end; readln; end.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 39

Comunidade Portugal-a-Programar

Tutoriais, 2011

utilizada a funo Trunc devido ao facto de Random devolver nmeros tais como, por exemplo, 0.365, 1.845 (aqui abreviados). Assim, apenas mostrado o valor inteiro do nmero, no arredondado - ou 0 ou 1, tal como desejado.

Propostas de Exerccios11. Simule a Lei dos Grandes Nmeros num programa que ir "lanar" um dado cbico regular um milho (1.000.000) de vezes. O programa s dever gerar como output o nmero de vezes que "saiu" cada face. Tenha em conta que no existe a face 0 (zero), isto por causa do "defeito" do comando Random - neste caso, o computador dever calcular nova face, sem que conte como um lanamento. Normas: livre.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 40

Comunidade Portugal-a-Programar

Tutoriais, 2011

PARTE V Conjuntos. Estruturao de um programa em Pascal. Data e Hora do Sistema.Nesta parte so abordados os Conjuntos, que so uma estrutura constituvel pelo programador, isto , uma coleco, de elevada potencialidade em Pascal. abordada mais a fundo uma forma simples de estruturar um programa recorrendo estrutura Begin/End. E, por fim, dado, por curiosidade, trs procedimentos padro de uma nova biblioteca que permitem determinar a data e a hora do sistema, e obrigar o programa a parar durante um certo tempo antes de avanar.

1. ConjuntosParte deste captulo foi baseado em: GOTTFRIED, Byron S., Programao em Pascal, McGraw-Hill, 1994 Algumas frases podero ser iguais s do livro. Parte dos exemplos retirado igualmente deste livro. Isto deve-se ao facto de este livro estar muito bem conseguido no que toca a Conjuntos, tornando-se inigualavelmente claro.

Um conjunto uma coleco de elementos simples ordenados, todos do mesmo tipo. Um conjunto no fcil de se declarar, mas, anteriormente, j os utilizmos de forma inconsciente, aquando a escrita, por exemplo, de:while not A in [0..9] do

[0..9] um conjunto de reais, que comea em 0 (zero), inclusive, e termina em 9 (nove), inclusive. J no programa que analisava as avaliaes dos alunos, utilizmos a seguinte notao:case avaliacao of 0..3 : writeln('Fraco'); // etc. end;

0..3 representa o intervalo de nmeros reais entre zero e trs, inclusive.

1.1. Declarao e utilizaoPode-se criar um conjunto, nomeado (com nome), de uma certa natureza. Teoricamente, h que declarar o conjunto pela seguinte ordem: Declarar os elementos base como Type; Declarar o conjunto em termos de elementos base, como Type; Declarar o nome de conjunto, como Var, sendo do tipo conjunto. Parece um processo complicado, e com passos sem sentido. Contudo, esta organizao faz parte da estruturao do Pascal como linguagem estruturada pode-se mesmo dizer que as coisas no aparecem do nada nem por milagre. Veja-se a declarao do conjunto em termos tericos:type elementos_base = (dado1, dado2, , dado n); conjunto = set of elementos_base; var nome_de_conjunto : conjunto;

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 41

Comunidade Portugal-a-Programar

Tutoriais, 2011

Agora aplique-se a teoria num exemplo prtico:type medidas = (pequeno, medio, grande); medidas_camisa = set of medidas; var manga : medidas_camisa;

Pode-se definir um conjunto com dados padro, tal como, por exemplo:type algarismos = set of 0..9; minusculas = set of 'a'..'z';

Contudo, um conjunto pode ser construdo. Imagine-se uma calculadora, tal como j foi dada como exerccio anteriormente, onde o utilizador pode escolher o operador. Podia-se declarar um conjunto dos operadores, e, no cdigo, simplificar a escrita do programa:program calculadora; uses crt; type conjunto_operadores = set of char; var operadores : conjunto_operadores; oper : char; begin oper := ['+', '-', '*', '/']; // repeat oper := readkey; until char(oper) in operadores; // end.

Como se constata, oper foi declarado como uma varivel. Contudo, podia ser declarado como uma constante, no sendo necessrio declarar dois tipos.program calculadora; uses crt; const operadores = ['+', '-', '*', '/']; var oper : char; begin // repeat oper := readkey; until char(oper) in operadores; // end.

O primeiro exemplo um excelente exemplar da declarao de um conjunto atravs de tipos, e o segundo exemplo mostra a criao de um conjunto, constante, atravs de um conjunto individual de elementos ordenados e definidos, inalterveis. A utilizao deste conjunto simplifica na medida em que, na estrutura Repeat Until, torna-se mais legvel, ao invs de:repeat oper := readkey; until (char(oper)='+') or (char(oper)='-') or (char(oper)='*') or (char(oper)='/');

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 42

Comunidade Portugal-a-Programar

Tutoriais, 2011

Os conjuntos so teis na medida em que criada uma coleco de elementos ordenados, irrepetveis, como sendo um grupo. Para quem conhecedor de VB, pode-se fazer a analogia bvia de que uma coleco em Pascal o mesmo que uma enumerao (Enum). Por exemplo, a coleco de operadores criada anteriormente em Pascal seria, em VB, algo como:Private Enum operadores As Char "+" "-" "*" "/" End Enum

Seguem-se pequenos exemplos de subconjuntos, aplicando o exemplo das medidas:type medidas = (pequeno, medio, grande); medidas_camisa = set of medidas; var manga_curta, manga_comprida, outra_manga : medidas_camisa; begin // manga_curta := [pequeno, grande]; manga_comprida := [pequeno..grande]; outra_manga := [grande]; // end.

No fcil visualizar utilizaes muito prticas dos conjuntos, em Pascal. Contudo, ser construdo, mais frente, um programa para exemplificar a sua utilidade. Para j, vamos aprender a realizar operaes com conjuntos.

1.2. Operaes com conjuntosAo operar com conjuntos, estamos a falar de trs operaes bsicas, familiares da Teoria de Conjuntos na Matemtica: Interseco; Unio; Diferena. Ser abordada cada uma delas, por ordem, atravs de exemplos prticos, todos seguindo a coleco criada anteriormente sobre medidas de camisas.

INTERSECOA interseco baseia-se no princpio de obter os elementos que esto em comum entre dois ou mais conjuntos. Por exemplo, a interseco entre o conjunto de nmeros {1, 2, 3, 4, 5} e o conjunto {0, 3, 4, 6} o conjunto {3, 4}. Na matemtica, esta operao representa-se por uma multiplicao. Assim o em Pascal:manga_curta := [pequeno, medio] * [medio, grande];

Neste caso, manga-curta ser, por fim, o conjunto [medio]. J no seguinte caso:manga_comprida := [pequeno] * [grande];

manga_comprida ser o conjunto vazio, [ ]. Como constatvel, existe o conjunto vazio em Pascal. Ora, isto obriga desde j a retirar uma propriedade da interseco.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 43

Comunidade Portugal-a-Programar

Tutoriais, 2011

A interseco entre um conjunto e o conjunto vazio o prprio conjunto vazio.

UNIO (ou REUNIO)A unio, ou reunio, de dois ou mais conjuntos resulta num novo conjunto que contenha todos os elementos, sem excepo, de todos os conjuntos envolvidos na operao, sem que haja elementos repetido. Por exemplo, a reunio entre os conjuntos {1, 2, 3, 4} e {0, 3, 4, 6} o conjunto {0, 1, 2, 3, 4, 6}, e no o conjunto {0, 1, 2, 3, 3, 4, 4, 6}. Regra geral, na matemtica esta operao representa-se como sendo uma soma. Em Pascal:manga_curta := [pequeno] + [grande];

Neste caso, resulta o conjunto [pequeno, grande].manga_comprida := [pequeno, grande] + [medio, grande];

Agora, resulta o conjunto [pequeno, medio, grande]. Mais, uma propriedade da unio intrnseca na anlise desta operao: A unio entre um conjunto e o conjunto vazio o prprio primeiro conjunto.

DIFERENAPegando em dois conjuntos, a diferena do primeiro pelo segundo resulta num conjunto constitudo pelos elementos do primeiro excepto os do segundo. Por exemplo, {1, 2, 3, 4} {0, 3, 4, 6} dar o conjunto {1, 2}. J no caso da operao {0, 3, 4, 6} {1, 2, 3, 4}, o resultado ser o conjunto {0, 6}. A diferena de conjuntos feita, na matemtica, exactamente pela operao da subtraco. Em Pascal, o mesmo acontece:manga_curta := [pequeno, medio] [pequeno, grande];

Neste caso, o conjunto soluo [medio].manga_comprida := [pequeno, medio, grande] [medio];

J neste caso, o conjunto soluo [pequeno, grande]. Duas propriedades, intimamente relacionadas, podem ser deduzidas: A diferena de um conjunto pelo conjunto vazio o prprio primeiro conjunto. A diferena do conjunto vazio por outro conjunto o prprio conjunto vazio. Segue-se um exemplo de atribuio de conjuntos, com operaes:manga_curta := [pequeno, medio, grande]; manga_comprida := manga_curta [pequeno]; // manga_comprida = [medio, grande] manga_curta := manga_curta * (manga_comprida [grande]); // manga_curta = [medio]

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 44

Comunidade Portugal-a-Programar

Tutoriais, 2011

1.3. Comparao de conjuntosAps as operaes de conjuntos, segue-se ento a comparao. Em matemtica, isto resume-se em expresses como pertence a, est contido em ou no est contido em. O Pascal tem a capacidade de realizar estas comparaes, tendo, para tal, quatro operadores. O resultado resultante destas comparaes sempre e to-somente um valor booleano. = Igualdade ambos os conjuntos contm os mesmos membros, independentemente da ordem; Desigualdade os conjuntos no contm exactamente os mesmos membros; = Incluso cada membro do segundo conjunto est contido no primeiro conjunto. Analise-se, ento, uma srie de comparaes entre conjuntos, e o resultado retornado por cada uma: [pequeno, grande] = [pequeno, medio, grande] falso; [pequeno, grande] = [grande, pequeno] verdadeiro; [pequeno, mdio, grande] [pequeno..grande] falso; [pequeno, grande] [grande] verdadeiro; [pequeno] =0) and (avaliacao=10) then positivas := positivas + 1; end; writeln; writeln('Existem ',positivas,' positivas (',(positivas/alunos)*100:0:1,'%)'); readln; end.

Exerccio 3program ex3; // 19 linhas uses crt; var numero, maior : real; n, i : integer; begin repeat write('Quantos numeros vai introduzir? (5-50) '); readln(n); until (n>=5) and (n maior) then maior := numero; end; writeln; writeln('O maior numero foi: ',maior:0:10); readln; end.

Exerccio 4program ex4; // 24 linhas uses crt; var s : string; i, j : integer; begin writeln('Este programa tira os espacos a mais de uma STRING'); writeln; write('Escreva uma STRING: '); readln(s); j := 0; for i:=1 to length(s) do begin j := j+1; if (s[i] = ' ') then begin s[j] := ' '; while (s[i] = ' ') do i := i+1; j := j+1 end; s[j] := s[i]; end; writeln('Nova STRING: ',s); readln; end.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 61

Comunidade Portugal-a-Programar

Tutoriais, 2011

Exerccio 5program ex5; // 24 linhas uses crt; var numero : real; function factorial(n : integer) : integer; var i, temp : integer; begin if (n=0) or (n=1) then factorial := 1 else begin temp := n; for i:=n-1 downto 1 do begin temp := temp * i; end; factorial := temp; end; end; begin repeat write('Numero para calcular factorial: '); readln(numero); until (numero = ROUND(numero)) and (numero>=0); writeln; writeln('Factorial de ',ROUND(numero),': ',factorial(ROUND(numero))); readln; end.

Exerccio 6program ex6; // 46 linhas uses crt; var a, b : real; oper : string[1]; begin REPEAT textcolor(15); writeln('CALCULADORA SIMPLES'); write('Valor 1: '); readln(a); write('Operador (+, -, *, /): '); readln(oper); if (oper='/') then begin repeat write('Valor 2: '); readln(b); if (b=0) then begin textcolor(12); writeln('ERRO! Divisao por zero!'); textcolor(15); end; until (b0); end else begin write('Valor 2: '); readln(b); end; writeln; write('RESULTADO da operacao: '); textcolor(14); if (oper='+') then write(a+b:0:10) else begin if (oper='-') then write(a-b:0:10) else begin if (oper='*') then write(a*b:0:10) else write(a/b:0:10); Thoga31Tutorial de Pascal, Fevereiro de 2011 Pgina 62

Comunidade Portugal-a-Programar

Tutoriais, 2011

end; end; textcolor(15); writeln('1 > Repetir operacao'); writeln('0 > Sair'); repeat readln(oper); until (oper='1') or (oper='0'); if (oper='1') then writeln; UNTIL (oper='0'); end.

Exerccio 7program ex7; // 17 linhas uses crt; var i, j : integer; begin for i:=1 to 20 do begin for j:=1 to 45 do begin case j of 1..15 : textbackground(1); 16..30 : textbackground(7); 31..45 : textbackground(4); end; write(' '); end; writeln; end; readln; end.

Exerccio 8program ex8; // 60 linhas uses crt; var aluno : array[1..30] of record // RECORD referido no exerccio nome : string[60]; matematica : real; portugues : real; end; media : record // RECORD facultativo: depende do mtodo de cada programador matematica : real; portugues : real; end; quantos, i : integer; begin writeln('ESTATISTICA DA TURMA'); writeln; repeat write('Quantos alunos sao? (1-30) '); readln(quantos); until (quantos>=1) and (quantos=0) and (matematica =0) and (portugues=9.5) then writeln(' ',aluno[i].nome); end; writeln; writeln('ALUNOS APTOS A COMPARECER AO EXAME NACIONAL DE PORTUGUES:'); for i:=1 to quantos do begin if (aluno[i].portugues>=9.5) then writeln(' ',aluno[i].nome); end; readln; end.

Exerccio 9program ex9; // 48 linhas uses crt; var operacao : record a : real; b : real; oper : char; end; opcao : char; begin REPEAT textbackground(7); textcolor(16); clrscr; writeln('CALCULADORA'); with operacao do begin write(' Valor 1: '); readln(a); write(' Operacao (+, -, *, /): '); repeat oper := readkey; until (char(oper)='+') or (char(oper)='-') or (char(oper)='*') or (char(oper)='/'); if (oper='/') then begin repeat write(' Valor 2: '); readln(b); until (b0); end else begin write(' Valor 2: '); readln(b); end; write('Resultado: '); if (char(oper)='+') then write(a+b:0:10) Thoga31Tutorial de Pascal, Fevereiro de 2011 Pgina 64

Comunidade Portugal-a-Programar

Tutoriais, 2011

else begin if (char(oper)='-') then write(a-b:0:10) else begin if (char(oper)='*') then write(a*b:0:10) else write(a/b:0:10); end; end; end; writeln; writeln('1 > Repetir operacao'); writeln('0 > Sair'); repeat opcao := readkey; until (char(opcao)='1') or (char(opcao)='0'); UNTIL (char(opcao)='0'); end.

Exerccio 11program ex11; // 20 linhas uses crt; var face : array[1..6] of integer; i : integer; begin randomize; for i:=1 to 1000000 do begin case round(random(7)) of 0 : i := i-1; // no h face zero: repete o lanamento 1 : face[1] += 1; 2 : face[2] += 1; 3 : face[3] += 1; 4 : face[4] += 1; 5 : face[5] += 1; 6 : face[6] += 1; end; end; for i:=1 to 6 do writeln('Face ',i,': ',face[i]); readln; end.

Thoga31

Tutorial de Pascal, Fevereiro de 2011

Pgina 65

Comunidade Portugal-a-Programar

Tutoriais, 2011

Desafio 1program des1; // 21 linhas uses crt; var texto : string; procedure ler(var s : string); begin readln(s); end; procedure escrever(s : string); var i : integer; begin for i:=length(s) downto 1 do write(s[i]); end; begin write('Escreva linha de texto: '); ler(texto); writeln; write('Texto por ordem inversa: '); escrever(texto); writeln; readln; end.

Desafio 2program des2; // 23 linhas uses crt; var i, j : integer; key : char; begin writeln('Cores disponiveis: '); writeln; for i:=1 to 8 do write(i,' '); writeln; for i:=1 to 16 do begin for j:=1 to 8 do begin textcolor(i); textbackground(j); if (i>=1) and (i