Computação I MPCE Programação Pascal Prof. Dr. Marcelo Duduchi Objetivos Como funciona e qual a estrutura básica de um programa Pascal? Quais as estruturas de controle de fluxo de controle existentes no Pascal? Quais as estruturas de dados prédefinidas no Pascal? Como trabalhar com subrotinas em Pascal? Tópicos Abordados (1) Estrutura de um programa Pascal; Tipos de dados, variáveis e constantes; Operadores; Comandos de leitura e escrita (I/O); Estruturas de controle seqüencial; Estruturas de controle de decisão; Estruturas de controle de repetição; Tópicos Abordados (2) Transformação de tipos de dados; Tipos estruturados homogêneos: unidimensionais e multidimensionais; Tipos estruturados heterogêneos; Criação de Novos tipos de dados; Manipulação de cadeias de caracteres; Subrotinas (funções e procedimentos); Passagem de parâmetros; Estrutura de um programa Pascal Program Nomedoprograma; uses biblioteca 1,...,biblioteca n; const constante 1,...,constante n; type nome do tipo = declaração do tipo; var lista de variáveis : tipo da variável; declaração das procedures e functions; begin comandos end. Tipos de Dados Inteiro; Número em ponto flutuante (real); Caractere; Cadeia de Caracteres; Lógico; Valores Inteiros byte: shortint word integer longint 0 a 255; -128 a 127; 0 a 65.535; -32.768 a 32.767; -2147483648 a 2147483647; respectivamente: 1, 1, 2, 2 e 4 bytes Valores em Ponto Flutuante single 1.5E-45 a 3.4E38; real 2.9E-39 a 1.7E38; double 5.0E-324 a 1.1E308; extended 3.4E-4951 a 1.1E4932; comp 9.2E-18 a 9.2E18; respectivamente:8,12,15,20 e 20 casas; respectivamente:4,6,8,10 e 8 bytes Um Único Caractere (char) Ocupa um byte e permite armazenar um caractere da tabela ASCII que possui 256 caracteres; Pode ser informado entre apóstrofo ou com o caractere # e o número da tabela referente ao caractere; Exemplo: #70 ou ‘F’ Cadeia de Caracteres (String) Ocupa até 256 bytes dependendo da declaração e permite armazenar caracteres da tabela ASCII; seu tamanho pode ser informado entre colchetes na declaração e tem valor referenciado entre apóstrofos; exemplo: ‘cadeia de caracteres’ Valor lógico (boolean) Ocupa um byte de memória usado para armazenar os valores lógicos verdadeiro (true) e falso (false); pode ser manipulado pelos operadores lógicos: NÃO (not), E (and), OU (or) e OU EXCLUSIVO (xor) Identificadores Nomes que são criados pelo programador para representar elementos diversos dentro do programa; São usados no Pascal para denominar programas, novos tipos de dados, constantes, variáveis, funções e procedimentos; Identificadores Pode ter qualquer tamanho com 63 primeiros dígitos significativos; Pode utilizar os caracteres de: ‘0’ a ‘9’, ‘A’ a ‘Z’, ‘a’ a ‘z’ e ‘_’ Deve ser diferente das palavras reservadas do Pascal; Não pode começar por número; Trata Maiúsculas = Minúsculas; Declaração de Constantes Deve-se indicar a palavra const seguida do nome, = e o valor a ser armazenado; Não pode ter seu valor alterado durante o programa; const nome = valor; Exemplo: const PI = 3.1416; Variáveis Área de memória cujo valor pode ser alterado através de seu nome ou seu endereço; É utilizada para guardar valores temporários do programa; Seu conteúdo pode ser alterado durante a execução do programa; Declaração de Variáveis Deve-se indicar a palavra var seguida do nome, : e o tipo de dados a ser armazenado por ela; var nome : tipo de dado; Exemplos: var nota:integer; var N1, N2, N3:real; var Nome: string[40]; Operadores Lógicos NÃO: identificado por not; E: identificado por and; OU: identificado por or; OU EXCLUSIVO: por xor; Operadores Aritméticos +: -: *: /: div : mod: adição; subtração; multiplicação; divisão real; divisão inteira; resto da divisão; Operadores Relacionais < , <= : menor e menor ou igual; > , >= : maior e maior ou igual; = : valor igual; < > : valor diferente; in [ valor inicial .. valor final] : verificar se o valor está entre valor inicial e final citado no comando; Comando de Escrita (saída) Pode ser usado só write escrevendo na posição corrente do cursor o conteúdo indicado; Pode ser usado writeln escrevendo o conteúdo indicado e pulando de linha em seguida; Formato: write ( valor : tamanho : decimais ); Comando de Escrita (saída) Exemplos: write(custo:9:2); writeln(‘João’); writeln(‘Valor = ’,x); write(x+y); Comando de Leitura (entrada) Pode ser usado read ou readln colocando dentro da variável indicada o valor digitado pelo usuário; O readln é usado para ler a linha toda até o enter o read permite a inclusão de diversos valores de acordo com o número de variáveis Formato: read (variável1, variável2); Comando de Leitura (entrada) Exemplos: read(a,b,c); readln(nome); readln(turma); Pode ter sua saída controlada por {$I-} e {$I+} em conjunto com o ioresult; Comando de Leitura (readkey) Utilizado quando necessitamos de digitação onde a entrada não necessita de um <enter> no final; Retorna um valor para a rotina chamadora que deve ser atribuído a alguma variável; formato: variável : = readkey; Comando de Leitura (readkey) Exemplos: x:=readkey; writeln(readkey); entrada:=readkey; Necessita da declaração: “uses CRT”; Comentários Às vezes é interessante comentar linhas de código para que este fique documentado. Para isto usamos seguinte: { comentário } ou (* comentários de diversas linhas *) Controle de fluxo de execução Para que se controle a seqüência de comandos a serem executados permitindo que seja criada uma lógica que corresponde ao algoritmo desejado usamos as estruturas de controle: seqüencial; de decisão ou condicional; de repetição ou de loop; Estrutura de controle seqüencial Usada para agrupar conjunto de comandos; Faz com que o bloco seja tratado como um único comando; Usado em estruturas de controle, funções e procedimentos com “;” e no final do programa com o “.”; Formato: begin comandos end; Estrutura de controle de decisão If é usada quando se deve tomar uma decisão de qual grupo de rotinas o programa deve executar; Não permite por si só que comandos voltem a executar de forma repetitiva; Pode ser usada de forma a encadear uma estrutura de decisão dentro de outra (ninho de if ’s); Estrutura de controle de decisão Formatos: If decisão then comando ou bloco de comandos; If decisão then comando ou bloco de comandos else comando ou bloco de comandos; cuidado: antes do “else” não colocar “;” Estrutura de controle de decisão Exemplos: ... If nota >= 5.0 then writeln(‘aprovado’); ... ... readln(nota); If nota >= 5.0 then writeln(‘aprovado’) else writeln(‘reprovado’); ... Estrutura de controle de decisão Exemplos: ... If nota >= 5.0 then begin writeln(‘exame:’); readln(nota); end; ... If x <= y then begin writeln(‘pode ser:’); writeln(‘x < ou = y’); end else writeln(‘x é maior’); ... Estrutura de controle de decisão Exemplos: ... If x > 3 then begin if y > 3 writeln(‘saída A’) else writeln(‘saída B’); end; Se X = 2 e Y = 2: Se X = 2 e Y = 5: Se X = 5 e Y = 2: Se X = 5 e Y = 5: Estrutura de controle de decisão Exemplos: ... If x > 3 then begin if y > 3 then writeln(‘saída A’) else writeln(‘saída B’); end; Se X = 2 e Y = 2: Não escreve nada; Se X = 2 e Y = 5: Não escreve nada; Se X = 5 e Y = 2: Escreve “saída B”; Se X = 5 e Y = 5: Escreve “saída A”; Estrutura de controle de decisão Exemplos: ... If (x>3) and (y>3) then begin writeln(‘saída A’) else writeln(‘saída B’); end; Se X = 2 e Y = 2: Se X = 2 e Y = 5: Se X = 5 e Y = 2: Se X = 5 e Y = 5: Estrutura de controle de decisão Exemplos: ... If (x>3) and (y>3) then begin writeln(‘saída A’); end else begin writeln(‘saída B’); end; Se X = 2 e Y = 2: Escreve “saída B”; Se X = 2 e Y = 5: Escreve “saída B”; Se X = 5 e Y = 2: Escreve “saída B”; Se X = 5 e Y = 5: Escreve “saída A”; Faça um programa que receba duas notas, calcule a média das notas e mostre na tela se o aluno foi aprovado. Program exmedia; uses crt; var soma,nota1,nota2:real; begin writeln(´Digite as notas das provas´); read (nota1,nota2); media:=(nota1+nota2)/2; if media>=5 then writeln(´Aprovado´) else writeln(´Reprovado´); end. Faça um programa que tendo como entrada a altura e o sexo de uma pessoa , construa um algorítimo que calcule seu peso ideal, utilizando as seguintes fórmulas: para homens: (72.7*h)-58; para mulheres: (62,1*h)-44.7; Program expesoideal; uses crt; var sexo:char; h,peso:real; begin writeln(´Calcule seu Peso Ideal´); write (´Digite seu sexo (M:masculino , F:feminino)´); readln (sexo); write (´Entre com a sua altura´); readln(h) if sexo=´F´ then peso:=(62.1*h)-44.7 else peso:=(72.2*h)-58; writeln(´seu peso ideal é´,peso:2:2); readkey; end. Estrutura de controle de decisão Case é usada quando se deve tomar uma decisão entre mais de duas opções para uma variável enumerável; Usada só com inteiros, caracteres e variáveis do tipo lógico; Pode ter opção else caso nenhuma das anteriores for aceita; Possui um end no final sem begin; Estrutura de controle de decisão Formato: case variável of constante1: comandos1; constante2: comandos2; constante3: comandos3; else comando n; end; Estrutura de controle de decisão Exemplo: case idade of 1,2,3:writeln(‘bebê’); 4..12:writeln(‘criança’); 13..22:writeln(‘adolesc.’); else writeln(’adulto’); end; Estrutura de controle de repetição while é usado quando o teste deve ser feito no início e não se tem um valor contável determinado; repeat é usado quando o teste deve ser feito no final; for é usado quando a iteração utiliza um evento contável tendo controle automático da variável de controle; Estrutura de controle de repetição Formato 1: while decisão do comandos; Formato 2: repeat comandos; until decisão; Estrutura de controle de repetição Exemplo 1: ... ct:=1; while ct<11 do begin writeln(‘4*’,ct,’=’,ct*4); ct:=ct+1; end; ... Estrutura de controle de repetição Exemplo 2: ... ct:=1; repeat writeln(‘4*’,ct,’=’,ct*4); ct:=ct+1; until ct >10; ... Estrutura de controle de repetição Formato 3: for ct:= v.i. to v.f. do comandos; Formato 4: for ct:= v.i. downto v.f. do comandos; Estrutura de controle de repetição Exemplo 3: for ct:= 1 to 10 do writeln(‘4*’,ct,’=’,ct*4); Exemplo 4: writeln(‘contagem...’) for ct:= 10 downto 1 do writeln(ct); Transformação de tipos de dados Inteiro para caractere: variável caractere:=chr(variável inteira); Ex: ch:=chr(97); { retorna ‘a’ } Caractere para inteiro: variável inteira:=ord(variável caractere); Ex: varint:=ord(‘A’); { retorna 65 } Transformação de tipos de dados String para número: val(cadeia,variável numérica,erro); Ex: val(leitura,num,erro); Número para string: str(variável numérica:tam:dec,cadeia); Ex: str(num:10:2,valor); Tópicos a abordar na seqüência... Tipos estruturados homogêneos: unidimensionais e multidimensionais; Tipos estruturados heterogêneos; Manipulação de cadeias de caracteres; Criação de Novos tipos de dados; Subrotinas (funções e procedimentos); Passagem de parâmetros; Tipos estruturados homogêneos Conjunto de elementos do mesmo tipo que ocupam uma área contínua de memória e são referenciados através de um nome e um índice; Também denominados de: Vetores, Matrizes, Tabelas, Arrays; Podem ser: Unidimensionais ou Multidimensionais; Tipos estruturados homogêneos Declaração (unidimensional): var nome:array [vi..vf] of tipo de dados; onde: nome: rótulo dado ao array; vi: valor inicial do array; vf: valor final do array; tipo de dados: tipo de dados dos elementos do array; Tipos estruturados homogêneos Utilização (unidimensional): utilizar o nome seguido da posição entre colchetes que deseja considerar tanto para atribuição de valores quanto para a recuperação: nome [ posição ] Tipos estruturados homogêneos Exemplo (unidimensional): ... var notas:array [1..4] of integer; ... begin... For i:=1 to 4 do read(notas [ i ]); ... Tipos estruturados homogêneos Declaração (multidimensional): var nome:array [vi..vf] of tipo de dados; onde: nome: rótulo dado ao array; [vi..vf ]: podem ser substituídos por [vi1..vf1,vi2..vf2,...,viN..vfN] tipo de dados: tipo de dados dos elementos do array; Tipos estruturados homogêneos Utilização (multidimensional): utilizar o nome seguido das posições entre colchetes que deseja considerar tanto para atribuição de valores quanto para a recuperação. Não omitir nenhuma dimensão; nome [ posições entre vírgulas ] Tipos estruturados homogêneos Exemplo (multidimensional): var vet:array [1..50,1..4] of real; ... begin... for i:=1 to 50 do for j:=1 to 4 do read(vet [ i , j ]); ... Faça um programa que receba um conjunto de 100 valores inteiros colocando-os em um vetor e em seguida mostre na tela o maior dos valores do vetor. program exmaior; const fim=100; var seq: array[1..fim] of integer; k,maior:integer; begin for k:=1 to fim do readln(seq[k]); maior:=seq[1]; for k:=2 to fim do if seq[k]>maior then maior:=seq[k]; writeln(maior); end. Tipos estruturados heterogêneos Conjunto de elementos de tipos diferentes agrupados por estarem relacionados entre si de acordo com a lógica do programa; Também denominados de: registros ou records; São sempre unidimensionais e podem estar atrelados a declaração de vetores e arquivos; Tipos estruturados heterogêneos Declaração: Utilizar o nome, “:”, a palavra reservada record seguido da definição dos elementos que o compõe através da declaração destes da mesma forma que as variáveis com um end no final; Tipos estruturados heterogêneos Declaração: var nome: record nome1:tipo de dados; nome2:tipo de dados; ... nomeN:tipo de dados; end; Tipos estruturados heterogêneos Exemplo de declaração: var aluno: record ca:longint; nome:string[30]; notafinal:real; end; Tipos estruturados heterogêneos Utilização: utilizar o nome seguido de “.” (ponto) e o nome do elemento do registro que deseja considerar tanto para atribuição de valores quanto para a recuperação; Não omitir o elemento a referenciar; nome . elemento Tipos estruturados heterogêneos Exemplo de utilização: ... readln(aluno.ca); readln(aluno.nome); readln(aluno.notafinal); ... {considerando a declaração do exemplo anterior} Utilizando tipos estruturados Podemos declarar também: var classe: array [1..40] of record ca:longint; nome:string[30]; nt1,nt2,nt3,nt4:real; end; Utilizando tipos estruturados E utilizar no programa: ... For i:=1 to 40 do begin readln(classe [ i ].ca); readln(classe [ i ].nome); readln(classe [ i ].nt1); end; ... Utilizando tipos estruturados Ou ainda: ... For i:=1 to 40 do begin writeln( (classe [ i ].nt1*0.4+ classe [ i ].nt2*0.4+ classe [ i ].nt3*0.2); end; ... Criação de novos tipos de dados Podemos criar nossos próprios tipos de dados usando: Type nome= declaração; Exemplo: Type aluno = record Nome:string; nt1,nt2:real; end; Estrutura de um programa Pascal Program Nomedoprograma; uses biblioteca 1,...,biblioteca n; const constante 1,...,constante n; type nome do tipo = declaração do tipo; var lista de variáveis : tipo da variável; declaração das procedures e functions; begin comandos end. Subrotinas Rotina que executa uma tarefa específica que pode ser: Procedimento (procedure): Não retorna valor à rotina chamadora de forma explícita; Função (function): Retorna um único valor à rotina chamadora de forma explícita; Estrutura de um programa Pascal Program Nomedoprograma; uses biblioteca 1,...,biblioteca n; const constante 1,...,constante n; type nome do tipo = declaração do tipo; var lista de variáveis : tipo da variável; declaração das procedures e functions; begin comandos end. Subrotinas (Procedimento) Sintaxe: procedure nome (parâmetros); var variáveis locais; begin comandos; end; Subrotinas (Procedimento) Exemplo: procedure linha (tamanho:integer); var i:integer; begin for i:= 1 to tamanho do write(´-´); writeln; end; Subrotinas (função) Sintaxe: function nome (parâmetros):tipo; var variáveis locais; begin comandos; nome:=valor de retorno; end; Subrotinas (função) Exemplo: function soma (n1,n2:integer):integer; var total: integer; begin total:=n1+n2; soma:=total; end; Subrotinas (Procedimento) Exercício: alterar a rotina linha para que o símbolo da linha apresentada possa variar: Subrotinas (Procedimento) Exercício: alterar a rotina linha para que o símbolo da linha apresentada possa variar: procedure linha (tamanho:integer;ch:char); var i:integer; begin for i:= 1 to tamanho do write(ch); writeln; end; Parâmetros (valor e referência) Valor (ou cópia): As alterações dentro da rotina não alteram as variáveis da rotina chamadora passadas como parâmetro; Referência: As alterações dentro da rotina alteram as variáveis da rotina chamadora passadas (basta usar o var antes da declaração dos parâmetros); Complementos: Expressões inteira s e reais Aritmética e lógica no pascal: Blaise Pascal (matemático do século XVII); Base Aritmética: Expressão (ou equação) Combinação de: Identificadores Valores Funções numéricas Operadores, que resultam num valor numérico específico, Complementos: Expressões inteira s e reais Exemplo de expressão: Valor numérico: 2 Operador: + 2+2 No pascal uma expressão integra uma instrução de atribuição ou uma instrução lógica. Complementos: Expressões inteira s e reais Exemplo de instrução aritmética: atribuição Resultado : = 2+2; Quando o pascal executa a instrução, o lado direito é calculado e o resultado é atribuído a Resultado. Complementos: Expressões inteira s e reais Exemplo de instrução lógica: comparação If Resultado = (2+2) then Uma expressão aritmética que pertence a uma instrução lógica tem como resultado Verdadeira ou Falsa. O valor em Resultado não é alterado. Complementos: Uso de integer. program m1; Uses Crt; var x, y, z: real; i, j, k: integer; begin clrscr; j:=2; i:= j+1; k:= (1+j) div (3+j); writeln(i, ' ', j, ' j:= 3 div j; ', k); Complementos: Uso de integer j:=2; x:= j+1; z:= (1+j) div (3+j); Writeln(x:2:2, ' z:2:2); y:= 3 / j; ', y:2:2, ' Writeln; writeln('Aperte enter readln; end. ', '); Complementos: Hierarquia de operadores Nível 1: Unário (Subtração e Adição) Nível 2: Parênteses Nível 3 Multiplicação e Divisão Nível 4: Adição e Subtração Exemplo: A:= 3*4+5; A:= 3*(4+5); Complementos: Hierarquia de operadores Nível 1: Unário (Subtração e Adição) Nível 2: Parênteses Nível 3 Multiplicação e Divisão Nível 4: Adição e Subtração Exemplo: A:= 3*4+5; A:= 3*(4+5); Complementos: Hierarquia de operadores mmmm Complementos: Hierarquia de operadores Uses Crt; var l1, l2, l3: real; begin clrscr; write('digite l1: '); readln(l1); Write('Digite l2: '); readln(l2); Write('Digite l3: '); readln(l3); if (l1+l2<l3) or (l1+l3<l2) or (l2+l3<l1) then writeln ('triangulo invalido') program triang; Complementos: Hierarquia de operadores else begin if (l1=l2) and (l1=l3) and (l2=l3) then writeln('equilatero'); if (l1=l2) or (l1=l3) or (l2=l3) then writeln('isosceles'); if (l1<>l2) and (l1<>l3) and (l2<>l3) then writeln('escaleno'); end; Write('pressione enter'); end. readln; Complementos: Hierarquia de operadores program oplogico; Uses Crt; var Byte1, Byte2, Byte3: byte; begin clrscr; byte1:=77; byte2:= 62; byte3:= byte1 and byte2; writeln('byte1= ', byte1, ' byte2= ',byte2, ' byte3= ',byte3); Writeln; writeln('Aperte enter '); readln; end.