Cursos de Informática Grátis www.megainforcursos.com

10 de agosto de 2012

Criar um programa em pascal de caixa eletrônico

a consegui depois de muito esforço o deposito é saldo:=saldo+deposito; e no saque é saldo:=saldo-saque;e no saldo é saldo:=saldo; so isso valew gente

Program caixa ;

var
saldo,senha,login,saque,deposito,soma:real;
resp,resposta:string;
opcao:char;
Begin

repeat
CLRSCR;


WRITELN;writeln;
writeln('[1]-Cadastrar Senha de Acesso');
writeln('[2]-Deposito');
writeln('[3]-saque');
writeln('[4]-Saldo');
writeln('[5]-Cancelar operação');
writeln;writeln;

opcao:=readkey;
case opcao of
'1': Begin
writeln('Crie uma Senha de Acesso');
readln(senha);
writeln('senha criada com Secesso');
readkey;
end;
'2':Begin

writeln('Entre com a senha');
readln(login);
if senha<>login then
Writeln('Erro,Por motivos de Segurança Reinicie o Programa.Aperte CTRL+C')


else
writeln('Entre com o Valor do do deposito');
readln(deposito);
readkey;

saldo:=saldo+deposito;
end;


'3':Begin
writeln('Entre com a Senha');
readln(login);
if senha<>login then
Writeln('Erro,Por motivos de Segurança Reinicie o Programa.Aperte CTRL+C')


else
writeln('Entre com o Valor do saque');
readln(saque);
saldo:=saldo-saque;
readkey;
end;


'4': Begin
writeln('Entre com a Senha');
readln(login);
if senha<>login then

Writeln('Erro,Por motivos de Segurança Reinicie o Programa.Aperte CTRL+C')
else
saldo:=saldo;
Writeln('Seu saldo é:',saldo:6:2);

readkey;
end;

else
writeln('Deseja Fazer mais alguma coisa? [N] não [S] sim' );

end;
until (resposta=('n')) or (resposta=('N'));
End.

Programas em Pascal

Programas em Pascal




Todos os programas que se seguem foram implementados usando o compilador Turbo Pascal.



Neste programa o computador mostra no ecrã todos os caracteres do código ASCII.



PROGRAM Ascii(INPUT,OUTPUT);
VAR i,n,val:INTEGER;
c:CHAR;

BEGIN
n:=0;
FOR i:=0 TO 256 DO
BEGIN
n:=n+1;
WRITELN(i,' -> ',CHR(i),' ');
IF n=22 THEN BEGIN
WRITELN('c para continuar');
REPEAT
READLN(c);
UNTIL c='c';
n:=0;
END;
END;
READLN

END.







Neste programa indicando o número de lados de um polígono o computador indica de que tipo de polígono se trata. No caso do polígono ter mais de 3 lados tem que se indicar ainda se os ângulos internos são iguais.



PROGRAM OutrosPoligonos(INPUT,OUTPUT);
VAR lados:INTEGER;
SimNao:CHAR;

BEGIN
WRITE('Qual o numero de lados ? ');
READLN(lados);
CASE lados OF
1,2: ;
3:WRITE('E um triangulo');
4:BEGIN
WRITE('Os angulos internos sao iguais ? ');
READLN(SimNao);
IF SimNao='S' THEN WRITE('E quadrado')
ELSE WRITE('E losango')
END;
5:WRITE('E um pentagono')
END;
READLN
END.
Neste programa dado um número n de alunos o computador pede a nota de cada aluno e conta quantos têm nota positiva.


PROGRAM NotasPositivas(INPUT,OUTPUT);
VAR n,conta,i,nota:INTEGER;
BEGIN
WRITE('Quantos estudantes obtiveram classificao na frequencia ? ');
READLN(n);
conta:=0;
FOR i:=1 TO n DO
BEGIN
WRITE('Qual a nota que o estudante obteve ? ( 0 a 20 ) ');
READLN(nota);
IF nota>=10 THEN conta:=conta+1
END;
WRITELN('Existem ',conta,' estudantes com nota positiva')
END.







Nos dois programas que se seguem pode ver-se como ler valores de vários tipos de variáveis.




PROGRAM Leimp1(INPUT,OUTPUT); { Le e imprime valores }

VAR a,b,pi:REAL;
e,f,g:INTEGER;
h,i,j,k:CHAR;

BEGIN
READLN(a,e,h,h,i,j,k);
READLN(f,k,k,b,j,j);
READLN(pi,g);
WRITELN(a,b,e,f,g,h,i,j,k,pi);
READLN
END.









PROGRAM Leimp2(INPUT,OUTPUT);

CONST pi=3;

VAR a,b,c,d:REAL;
e,f:INTEGER;
h,i,j,k:CHAR;

BEGIN
READ(a);READ(e);READLN(i,j,h,k);
READLN(f,k,a,h);
READ(d);READLN(j);
WRITELN(a);WRITELN(d);
WRITELN(h,i,j,k);
WRITELN(pi);
READLN
END.
Nos 4 seguintes programas são exemplos da utilização de procedimentos na linguagem Pascal.


PROGRAM Arvore1(INPUT,OUTPUT);

PROCEDURE Ramo;

BEGIN
WRITELN('X');
WRITELN('XX');
WRITELN('XXX');
WRITELN('XXXX')
END;

PROCEDURE Tronco;

BEGIN
WRITELN('I')
END;


BEGIN { Bloco Principal }
Ramo;
Tronco;
Ramo;
Tronco;
ramo;
WRITELN('T');
WRITE('T')
END.

PROGRAM Arvore2(INPUT,OUTPUT);


PROCEDURE Ramo(n:INTEGER);
VAR i,j:INTEGER;

BEGIN
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i DO WRITE('X');
WRITELN
END;
END;

PROCEDURE Tronco;

BEGIN
WRITELN('I')
END;


BEGIN { Bloco Principal }
Ramo(3);
Tronco;
Ramo(4);
Tronco;
ramo(5);
WRITELN('T');
WRITE('T')
END.

PROGRAM Arvore3(INPUT,OUTPUT);
VAR t1,t2,t3:INTEGER;

PROCEDURE Ramo(n:INTEGER);
VAR i,j:INTEGER;

BEGIN
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i DO WRITE('X');
WRITELN
END;
END;

PROCEDURE Tronco;

BEGIN
WRITELN('I')
END;


BEGIN { Bloco Principal }
WRITE('Qual o tamanho para o 1§ ramo ? ');
READLN(t1);
WRITE('Qual o tamanho para o 2§ ramo ? ');
READLN(t2);
WRITE('Qual o tamanho para o 3§ ramo ? ');
READLN(t3);
Ramo(t1);
Tronco;
Ramo(t2);
Tronco;
ramo(t3);
WRITELN('T');
WRITE('T')
END.

PROGRAM Arvore4(INPUT,OUTPUT);
VAR t1,t2,t3,conta1,conta2,conta3,tconta:INTEGER;

PROCEDURE Ramo(n:INTEGER; VAR c:INTEGER);
VAR i,j:INTEGER;

BEGIN
c:=0;
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i DO
BEGIN
WRITE('X');
c:=c+1;
END;
WRITELN
END;
END;

PROCEDURE Tronco;

BEGIN
WRITELN('I')
END;


BEGIN { Bloco Principal }
WRITE('Qual o tamanho para o 1§ ramo ? ');
READLN(t1);
WRITE('Qual o tamanho para o 2§ ramo ? ');
READLN(t2);
WRITE('Qual o tamanho para o 3§ ramo ? ');
READLN(t3);
Ramo(t1,conta1);
Tronco;
Ramo(t2,conta2);
Tronco;
ramo(t3,conta3);
tconta:=conta1+conta2+conta3;
WRITELN('T');
WRITELN('T');
WRITELN('Existem ',tconta,' folhas');

END.
O seguinte programa é um bom exemplo do uso de funcões e procedimentos em Pascal.


PROGRAM PotenciaExp5_de_4_valores(INPUT,OUTPUT);

VAR valor1,valor2,valor3,valor4:INTEGER;

PROCEDURE Leitura(n:INTEGER;VAR num:INTEGER);

BEGIN
REPEAT
WRITE('Escreva o ',n,'§ valor -> ');
READLN(num);
UNTIL (num>0) AND (num<51); END; FUNCTION Potenciaexp5(x:INTEGER):INTEGER; BEGIN potenciaexp5:=SQR(x)*SQR(x)*x END; PROCEDURE Escrita(n,auxresult:INTEGER); BEGIN WRITELN('A Potˆncia de expoente 5 de ',n,' ‚ ',auxresult) END; BEGIN { bloco principal } Leitura(1,valor1); Leitura(2,valor2); Leitura(3,valor3); Leitura(4,valor4); Escrita(valor1,potenciaexp5(valor1)); Escrita(valor2,potenciaexp5(valor2)); Escrita(valor3,potenciaexp5(valor3)); Escrita(valor4,potenciaexp5(valor4)); END Outro exemplo do uso de funções e procedimentos em Pascal. PROGRAM NumDigitos(INPUT,OUTPUT); VAR valor1,valor2,valor3,valor4:INTEGER; PROCEDURE Leitura(n:INTEGER;VAR num:INTEGER); BEGIN REPEAT WRITE('Escreva o ',n,'§ valor -> ');
READLN(num);
UNTIL (num>=0) AND (num<10000); END; FUNCTION Contadigitos(num:INTEGER):INTEGER; VAR c,quoc:INTEGER; BEGIN c:=0; REPEAT quoc:=num DIV 10; c:=c+1; num:=quoc; UNTIL quoc=0; Contadigitos:=c; END; PROCEDURE Escrita(num,conta:INTEGER); BEGIN WRITELN('O valor ',num,' tem ',conta,' d¡gitos'); END; BEGIN { bloco principal } Leitura(1,valor1); Leitura(2,valor2); Leitura(3,valor3); Leitura(4,valor4); Escrita(valor1,Contadigitos(valor1)); Escrita(valor2,Contadigitos(valor2)); Escrita(valor3,Contadigitos(valor3)); Escrita(valor4,Contadigitos(valor4)); END. Ainda outro exemplo do uso de funcões e procedimentos em Pascal. PROGRAM Divisores_de_4_valores(INPUT,OUTPUT); VAR valor1,valor2,valor3,valor4:INTEGER; PROCEDURE Leitura(n:INTEGER;VAR num:INTEGER); BEGIN REPEAT WRITE('Escreva o ',n,'§ valor -> ');
READLN(num);
UNTIL (num>0) AND (num<1001); END; FUNCTION Contadivisores(num:INTEGER):INTEGER; VAR divisor,c:INTEGER; BEGIN c:=0; FOR divisor:=num DOWNTO 1 DO IF num MOD divisor=0 THEN c:=c+1; Contadivisores:=c; END; PROCEDURE Escrita(num,conta:INTEGER); BEGIN WRITELN('O valor ',num,' tem ',conta,' divisores'); END; BEGIN { bloco principal } Leitura(1,valor1); Leitura(2,valor2); Leitura(3,valor3); Leitura(4,valor4); Escrita(valor1,Contadivisores(valor1)); Escrita(valor2,Contadivisores(valor2)); Escrita(valor3,Contadivisores(valor3)); Escrita(valor4,Contadivisores(valor4)); END. O seguinte programa mostra os divisores inteiros de um dado número. PROGRAM DivisoresInteiros(INPUT,OUTPUT); VAR n,divisor,resto:INTEGER; BEGIN WRITE('Qual o numero de que quer saber os divisores inteiros ? '); READLN(n); FOR divisor:=n DOWNTO 1 DO BEGIN resto:=n MOD divisor; IF resto=0 THEN WRITELN('Divisor -> ',divisor)
END;
END.
O seguinte programa calcula a raíz quadrada de um dado número.


PROGRAM RaizQuadrada(INPUT,OUTPUT);
VAR n,raiz,erro:REAL;
BEGIN
WRITE('Qual o n£mero de que quer calcular a raiz quadrada ? ');
READLN(n);
raiz:=SQRT(n);
raiz:=(n/raiz+raiz)/2;
erro:=(n/SQR(raiz))-1;
IF erro<1E-06 THEN WRITELN('A raiz de ',n,' ‚ ',raiz,' ',erro) ELSE WRITELN('Existe um erro > 10E-06')
END.







O seguinte programa calcula a soma dos dígitos de um dado numero.



PROGRAM SomaDigitos(INPUT,OUTPUT);

VAR num,resto,restotal:INTEGER;

BEGIN
restotal:=0;
WRITE('Escreva o n£mero de que quer somar os digitos -> ');
READLN(num);
REPEAT
resto:=num MOD 10;
num:=num DIV 10;
restotal:=restotal+resto
UNTIL num0 DO
BEGIN
WRITE('Qual o n£mero ? ');
READLN(num);
soma:=soma+num;
n:=n-1
END;
media:=soma DIV aux;
WRITELN('A m‚dia dos ',n,' numeros ‚ ',media)
END.
O seguinte programa conta quantos dos números introduzidos são divisíveis por 5.


PROGRAM NumerosDiv5(INPUT,OUTPUT);
VAR n,num,conta,result:INTEGER;
BEGIN
conta:=0;
result:=0;
WRITE('Quantos n£meros quer dar entrada ? ');
READLN(n);
REPEAT
conta:=conta+1;
WRITE('Qual o n£mero ? ');
READLN(num);
IF num MOD 5 = 0 THEN result:=result+1
UNTIL conta=n;
WRITE('Existem ',result,' n£meros divisiveis por 5')
END.
O programa seguinte conta quantas vezes o caracter a foi digitado.


PROGRAM Caracter_a(INPUT,OUTPUT);
VAR n,conta:INTEGER;
car:CHAR;
BEGIN
conta:=0;
FOR n:=1 TO 10 DO
BEGIN
WRITE('Escreva o ',n,'§ caracter -> ');
READLN(car);
IF car='a' THEN conta:=conta+1
END;
WRITE('O caracter a foi digitado ',conta,' vezes')
END.
O seguinte programa guarda o maior numero de um numero n de numeros introduzidos.


PROGRAM MaiorNumero(INPUT,OUTPUT);
VAR n,maior,conta,num:INTEGER;
BEGIN
maior:=0;
conta:=0;
WRITE('Quantos numeros quer dar entrada ? ');
READLN(n);
REPEAT
conta:=conta+1;
WRITE('Qual o ',conta,'§ numero ? ');
READLN(num);
IF maior=0;
REPEAT
WRITE('Quantas horas extra fez o funcion rio ? ');
READLN(horas)
UNTIL horas>0;
CASE horas OF
1..10:quantia:=(venc*(1/50))*horas;
11..20:quantia:=(venc*(1/45))*horas;
21..30:quantia:=(venc*(1/35))*horas;
31..40:quantia:=(venc*(1/25))*horas
ELSE quantia:=(venc*(1/10))*horas
END;
WRITELN('O vencimento total ‚ ',venc+quantia:8:4)
END.







O seguinte programa coloca no lugar das letras curvas introduzidas um asterisco.



PROGRAM LetrasCurvas(INPUT,OUTPUT);

VAR n,numletras:INTEGER;
car:CHAR;

BEGIN
WRITE('Qual o n£mero de letras que a linha de texto vai ter ? ');
READLN(numletras);
FOR n:=1 TO numletras DO
BEGIN
READ(car);
CASE car OF
'B'..'D':car:='*';
'G':car:='*';
'J':car:='*';
'O'..'S':car:='*';
'U':car:='*';
END;
WRITE(car);
END;
END.
O seguinte programa mostra os multiplos de 3 e de 5 entre 10 e 1000.


PROGRAM Multiplosde3e5(INPUT,OUTPUT);
VAR c,n,mult3,mult5:INTEGER;
car:CHAR;
BEGIN
c:=0;
WRITELN('NUM MULT.3 MULT.5');
FOR n:=10 TO 1000 DO
BEGIN
mult3:=n MOD 3;
mult5:=n MOD 5;
IF (mult3=0) AND (mult5<>0) THEN WRITELN(n,' X');
IF (mult5=0) AND (mult3<>0) THEN WRITELN(n,' X');
IF (mult3=0) AND (mult5=0) THEN WRITELN(n,' X X');
IF ((mult3=0) AND (mult5=0)) OR (mult3=0) OR (mult5=0) THEN c:=c+1;
IF c=23 THEN BEGIN
WRITE('c para continuar ');
REPEAT
READLN(car)
UNTIL car='c';
c:=0;
WRITELN('NUM MULT.3 MULT.5')
END;
END;
READLN
END.
O seguinte programa desenha um losango conforme o tamanho escolhido para o lado.


PROGRAM Losango(INPUT,OUTPUT);
VAR lado,m,a,y:INTEGER;
BEGIN
REPEAT
WRITE('Qual o valor do lado do losango (entre 1 e 12) ? ');
READLN(lado)
UNTIL (lado>0) AND (lado<13); IF lado>1 THEN BEGIN
m:=0;
a:=lado;
WRITELN('*':lado);
FOR lado:=lado-1 DOWNTO 1 DO
BEGIN
m:=m+2;
WRITELN('*':lado,'*':m);
END;
lado:=lado+1;
m:=m-2;
FOR y:=lado TO a-1 DO
BEGIN
WRITELN('*':y,'*':m);
m:=m-2;
END;
WRITELN('*':a);
END
ELSE WRITELN('*');
END.







O programa seguinte mostra uma pirâmide de números.



PROGRAM Piramide_de_Numeros(INPUT,OUTPUT);

VAR numlinhas,aux,coluna,conta,contacontra:INTEGER;

BEGIN
REPEAT
WRITE('Qual o n£mero de linhas que a pirƒmide vai ter (entre 1 e 9) ? ');
READLN(numlinhas);
UNTIL (numlinhas>0) AND (numlinhas<10); aux:=numlinhas-2; WRITELN('1':numlinhas); FOR coluna:=2 TO numlinhas DO BEGIN IF aux>0 THEN WRITE(' ':aux);
aux:=aux-1;
FOR conta:=1 TO coluna DO WRITE(conta);
FOR contacontra:=coluna-1 DOWNTO 1 DO WRITE(contacontra);
WRITELN
END
END.







O programa que se segue desenha uma recta de asteriscos consoante as coordenadas introduzidas.



PROGRAM Linha_de_Asteriscos(INPUT,OUTPUT);
USES crt;
VAR xaler,yaler,compaler:INTEGER;
direcaler:CHAR;

PROCEDURE Linha(x,y,comp:INTEGER;direc:CHAR);
VAR i,j:INTEGER;

BEGIN
CASE direc OF
'H','h':BEGIN
FOR i:=x TO comp+x-1 DO
BEGIN
GOTOXY(i,y);
WRITE('*')
END;
END;
'V','v':BEGIN
FOR j:=y TO comp+y-1 DO
BEGIN
GOTOXY(x,j);
WRITE('*')
END;
END;
END;
END;

BEGIN { bloco principal }
CLRSCR;
REPEAT
WRITE('Escreva o valor de x da origem (x>=1) -> ');
READLN(xaler)
UNTIL xaler>0;
REPEAT
WRITE('Escreva o valor de y da origem (y>=1) -> ');
READLN(yaler)
UNTIL yaler>0;
WRITE('Escreva o comprimento da linha -> ');
READLN(compaler);
WRITE('Escreva a direc‡Æo ( h-horizontal, v-vertical ) -> ');
READLN(direcaler);
Linha(xaler,yaler,compaler,direcaler)
END.







O programa seguinte desenha um rectangulo formado por asteriscos.



PROGRAM Rectangulo_de_Asteriscos(INPUT,OUTPUT);
USES crt;
VAR xaler,yaler,compaler,ladoaler:INTEGER;

PROCEDURE Rectangulo(x,y,comprect,ladorect:INTEGER);

PROCEDURE Linha(x1,y1,comp:INTEGER;direc:CHAR);
VAR i,j:INTEGER;

BEGIN
CASE direc OF
'H','h':BEGIN
FOR i:=x1 TO comp+x1-1 DO
BEGIN
GOTOXY(i,y1);
WRITE('*')
END;
END;
'V','v':BEGIN
FOR j:=y1 TO comp+y1-1 DO
BEGIN
GOTOXY(x1,j);
WRITE('*')
END;
END;
END;
END;

BEGIN { Desenho do Rectƒngulo }
Linha(x,y,comprect,'h');
Linha(x,y,ladorect,'v');
Linha(x+comprect-1,y,ladorect,'v');
Linha(x,y+ladorect-1,comprect,'h');
END;

BEGIN { bloco principal }
CLRSCR;
REPEAT
WRITE('Escreva a coordenada x do canto superior esquerdo do Rectƒngulo (x>=1) -> ');
READLN(xaler)
UNTIL xaler>0;
REPEAT
WRITE('Escreva a coordenada y do canto superior esquerdo do Rectƒngulo (x>=1) -> ');
READLN(yaler)
UNTIL yaler>0;
REPEAT
WRITE('Escreva o valor do comprimento do Rectƒngulo ( comprimento>0 ) -> ');
READLN(compaler)
UNTIL compaler>0;
REPEAT
WRITE('Escreva o valor do lado do Rectƒngulo ( lado>0 ) -> ');
READLN(ladoaler)
UNTIL ladoaler>0;
CLRSCR;
Rectangulo(xaler,yaler,compaler,ladoaler)
END.







O programa seguinte desenha um triangulo.



PROGRAM Triangulo(INPUT,OUTPUT);
VAR b:INTEGER;

PROCEDURE Desenhatriangulo(base:INTEGER);
VAR i,j,e:INTEGER;

BEGIN
FOR i:=1 TO base DO WRITE('x');
WRITELN;
e:=1;
REPEAT
base:=base-2;
WRITE(' ':e);
FOR j:=1 TO base DO
WRITE('x');
WRITELN;
e:=e+1
UNTIL base=1;
END;

BEGIN { programa principal }
REPEAT
WRITELN;
WRITE('Qual a base do triƒngulo ( base entre 1 e 80 e de n£mero ¡mpar) ? ');
READLN(b)
UNTIL (b>0) AND (b<81) AND (ODD(b)=true); Desenhatriangulo(b); READLN END. Com o seguinte programa pode simular-se as operacões de uma calculadora. PROGRAM Calculadora(INPUT,OUTPUT); VAR totaloper,membro2:REAL; varifict,operador:CHAR; BEGIN WRITE('Escreva a sua opera‡Æo -> ');
READ(totaloper);
READ(varifict);
READ(operador);
REPEAT
READ(membro2);
CASE operador OF
'+':totaloper:=totaloper+membro2;
'-':totaloper:=totaloper-membro2;
'/':totaloper:=totaloper/membro2;
'*':totaloper:=totaloper*membro2
END;
READ(varifict);
READ(operador)
UNTIL operador='=';
WRITE(totaloper)
END.







O seguinte programa calcula o maximo divisor comum entre dois numeros.



PROGRAM MaximoDivisorComum(INPUT,OUTPUT);

VAR n1,n2,divisor,resto1,resto2,mdc:INTEGER;

BEGIN
REPEAT
WRITE('Escreva o 1§ n£mero -> ');
READLN(n1)
UNTIL n1>0;
REPEAT
WRITE('Escreva o 2§ n£mero -> ');
READLN(n2)
UNTIL n2>0;
IF n2>n1 THEN divisor:=n1
ELSE divisor:=n2;
REPEAT
resto1:=n1 MOD divisor;
resto2:=n2 MOD divisor;
IF (resto1=0) AND (resto2=0) THEN BEGIN
mdc:=divisor;
divisor:=1
END;
divisor:=divisor-1
UNTIL divisor=0;
WRITELN('O M ximo Divisor Comum entre ',n1,' e ',n2,' ‚ ',mdc)
END.







O seguinte programa diz-nos se o numero introduzido e capicua ou nao. Exemplos de numeros que sao capicuas : 424, 3113, 747.



PROGRAM Capicua(INPUT,OUTPUT);

VAR n,potencias,i,num,auxnum,totalnumcont,quoc,resto,numerocont:WORD;

BEGIN
WRITE('Quantos d¡gitos tem o seu n£mero ? ');
READLN(n);
potencias:=1;
FOR i:=1 TO n-1 DO
BEGIN
potencias:=potencias*10
END;
WRITE('Escreva o n£mero -> ');
READLN(num);
auxnum:=num;
totalnumcont:=0;
REPEAT
quoc:=num DIV 10;
resto:=num MOD 10;
numerocont:=resto*potencias;
totalnumcont:=totalnumcont+numerocont;
potencias:=potencias DIV 10;
num:=quoc;
UNTIL quoc=0;
IF totalnumcont=auxnum THEN WRITELN('O n£mero ‚ Capicua')
ELSE WRITELN('O n£mero nÆo ‚ Capicua');
END.







Os tres seguintes programas sao exemplo da utilizacão de variaveis booleanas.



PROGRAM Boolean1(INPUT,OUTPUT);
VAR intei:INTEGER;
continua:BOOLEAN;

BEGIN
REPEAT
WRITE('Escreva um n£mero inteiro ');READLN(intei);
IF (intei<=10) OR (intei>20) THEN continua:=FALSE
ELSE continua:=TRUE;
WHILE continua DO
BEGIN
WRITELN(intei);intei:=intei+1;
continua:=intei<=20 END; UNTIL NOT continua END. PROGRAM Boolean2(INPUT,OUTPUT); VAR valorlog:BOOLEAN; car:CHAR; BEGIN valorlog:=TRUE; WHILE valorlog DO BEGIN WRITELN('Uma cÆo tem 4 patas (s/n) ?'); READLN(car); CASE car OF 's','S':BEGIN WRITELN('Muito bem.  verdade'); valorlog:=FALSE END; 'n','N':BEGIN WRITELN('Est mal.  mentira'); WRITELN('Tem que responder outravez') END; ELSE BEGIN WRITELN('NÆo conhe‡o esse caracter'); WRITELN('Tem que responder outravez') END; END; END; END. PROGRAM Boolean3(INPUT,OUTPUT); VAR valorlog:BOOLEAN; car:CHAR; BEGIN valorlog:=TRUE; REPEAT BEGIN WRITELN('Uma cÆo tem 4 patas (s/n) ?'); READLN(car); CASE car OF 's','S':BEGIN WRITELN('Muito bem.  verdade'); valorlog:=FALSE END; 'n','N':BEGIN WRITELN('Est mal.  mentira'); WRITELN('Tem que responder outravez') END; ELSE BEGIN WRITELN('NÆo conhe‡o esse caracter'); WRITELN('Tem que responder outravez') END; END; END; UNTIL NOT valorlog; END. O programa que se segue indica o maior e o menor numeros num vector com numeros introduzidos pelo utilizador. PROGRAM Probl35(input,output); VAR i,n,maior,menor:INTEGER; vector:ARRAY[1..100] OF REAL; BEGIN WRITE('N§ de elementos do vector: '); READLN(n); FOR i:=1 TO n DO BEGIN WRITE('Elemento ',i,' : '); READLN(vector[i]) END; maior:=1; menor:=1; FOR i:=2 TO n DO BEGIN IF vector[i]>vector[maior] THEN maior:=i;
IF vector[i] ');
READLN(n)
END;

PROCEDURE Lematriz(n:INTEGER;VAR qqmatriz:matriz);
VAR i,j:INTEGER;

BEGIN
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
BEGIN
WRITE('Valor ',i,j,': ');
READLN(qqmatriz[i,j])
END
END
END;

PROCEDURE Soma_2_matrizes(n:INTEGER;a,b:matriz;VAR c:matriz);
VAR i,j:INTEGER;

BEGIN
FOR i:=1 TO n DO
FOR j:=1 TO n DO
c[i,j]:=a[i,j]+b[i,j]
END;

PROCEDURE Mostra_matriz_resul(n:INTEGER;c:matriz);
VAR i,j:INTEGER;

BEGIN
WRITELN('A soma das matrizes ‚ : ');
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
BEGIN
WRITE(i,j,' ',c[i,j],' ')
END;
WRITELN
END
END;

BEGIN { programa principal }
Dimensao(n);
Lematriz(n,a);
Lematriz(n,b);
Soma_2_matrizes(n,a,b,c);
Mostra_matriz_resul(n,c)
END.







O programa seguinte mostra como se multiplicam duas matrizes.



PROGRAM Probl37b(input,output);
VAR matrizA:ARRAY[1..50,1..50] OF REAL;
matrizB:ARRAY[1..50,1..50] OF REAL;
matrizR:ARRAY[1..50,1..50] OF REAL;
n,i,j,k:INTEGER;

BEGIN
WRITELN('Programa para calcular o resultado da multiplica‡Æo de 2 matrizes quadradas');
WRITE('Qual a dimensÆo das matrizes ? ');
READLN(n);
WRITELN('Escreva os elementos da matriz A: ');
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
BEGIN
WRITE('a',i,j,': ');
READLN(matrizA[i,j])
END
END;
WRITELN('Escreva os elementos da matriz B: ');
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
BEGIN
WRITE('b',i,j,': ');
READLN(matrizB[i,j])
END
END;
{ Multiplica‡Æo das matrizes A e B }
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
BEGIN
matrizR[i,j]:=0;
FOR k:=1 TO n DO
matrizR[i,j]:=matrizR[i,j]+matrizA[i,k]*matrizB[k,j]
END
END;
WRITELN('A matriz resultado da multiplica‡Æo das matrizes A e B ‚ :');
FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO n DO
WRITE('r',i,j,matrizR[i,j],' ');
WRITELN
END;
END.







O programa seguinte passa as letras minusculas de uma string a maiusculas.



PROGRAM Uppercase;

{$P+}

USES crt;

VAR s:STRING[80];

FUNCTION UpCaseStr(s:STRING):STRING;
VAR i:INTEGER;

BEGIN
FOR i:=1 TO LENGTH(s) DO
s[i]:=UPCASE(s[i]);
UpCaseStr:=s;
END;


BEGIN
CLRSCR;
s:='abc';
WRITELN(s);
WRITELN('Change to uppercase');
WRITELN(UpCaseStr(s));
WRITELN;
WRITE('Press ENTER...');
READLN
END.







O programa seguinte conta quantas palavras uma string contém.



PROGRAM Probl46(input,output);
VAR s:STRING;
i,conta:INTEGER;

BEGIN
WRITE('Escreva uma STRING: ');
READLN(s);
conta:=0;
IF (s[1]=' ') AND (s[2]<>' ') THEN conta:=1;
IF s[1]<>' ' THEN conta:=1;
FOR i:=2 TO LENGTH(s) DO
IF (s[i]=' ') AND (UPCASE(s[i+1])IN['A'..'Z']) THEN conta:=conta+1;
{IF (s[1]= ' ') AND (s[2]<>' ') THEN conta:=1;}
WRITELN('A STRING cont‚m ',conta,' palavras');
END.







O programa que se segue reduz para um espaco entre duas palavras sempre que aí encontra dois ou mais espacos.



PROGRAM Problema47(input,output);
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;
WRITE('Nova STRING: ');
FOR i:=1 TO j DO
WRITE(s[i])
END.







O programa que se segue cria um ficheiro de texto e guarda neste alguns dados.



PROGRAM Probl50A(input,output);
VAR fich:TEXT;
s:STRING;

BEGIN
ASSIGN(fich,'texto.txt');
REWRITE(fich);
s:='ab de?gz 2!vl 345 aaa';
WRITE(fich,s);
CLOSE(fich)
END.







No programa que se segue o computador lê o ficheiro criado no programa anterior e conta todos os espaços em branco que lá existem.



PROGRAM Probl50B(input,output);
VAR fich:TEXT;
s:STRING;
conta,i:INTEGER;

BEGIN
ASSIGN(fich,'texto.txt');
RESET(fich);
READLN(fich,s);
conta:=0;
FOR i:=1 TO LENGTH(s) DO
IF s[i]=' ' THEN conta:=conta+1;
WRITELN('Existem ',conta,' espa‡os em branco');
END.







Os dois programas que se seguem exemplificam como se podem manipular ficheiros de texto em Pascal.



PROGRAM Probl51A(input,output);

VAR ficheiro:TEXT;

BEGIN
ASSIGN(ficheiro,'prob51.txt');
REWRITE(ficheiro);
WRITELN(ficheiro,'jdfhsakjdhksajdsa1995fgjfdkgjd');
WRITELN(ficheiro,'ndfskahfjskdahfkjdshfkjshdfkjhdsfjkshdkjf');
WRITELN(ficheiro,'1995kdfjkldsjflksdjfklsdjfklfdjksdfjkdsf');
WRITELN(ficheiro,'sdkfjslkdjflksfjlksafdjlksdjflksdjf‡lksdjflkd1995');
CLOSE(ficheiro);
END.









PROGRAM Probl51B(input,output);

VAR ficheiro1,ficheiro2:TEXT;
s,f:STRING;
n:BYTE;
BEGIN
WRITE('Escreva o nome do ficheiro -> ');
READLN(f);

ASSIGN(ficheiro1,f);
RESET(ficheiro1);

ASSIGN(ficheiro2,'apoio.txt');
REWRITE(ficheiro2);

WHILE NOT EOF(ficheiro1) DO
BEGIN
READLN(ficheiro1,s);
n:=0;
n:=POS('1995',s);
IF n>0 THEN BEGIN
DELETE(s,n+3,1);
INSERT('6',s,n+3);
END;
WRITELN(ficheiro2,s);
END;
CLOSE(ficheiro1);
CLOSE(ficheiro2);

ASSIGN(ficheiro1,f);
REWRITE(ficheiro1);

ASSIGN(ficheiro2,'apoio.txt');
RESET(ficheiro2);

WHILE NOT EOF(ficheiro2) DO
BEGIN
READLN(ficheiro2,s);
WRITELN(ficheiro1,s);
END;

CLOSE(ficheiro1);
CLOSE(ficheiro2);
END.







O programa seguinte é exemplo da utilização de fichas e tabelas.



PROGRAM Notas(input,output);

CONST maxalunos=5;

TYPE aluno=RECORD
nome:STRING[60];
nota:INTEGER
END;
tabela=ARRAY[1..maxalunos] OF aluno;

VAR ta,a,r:tabela;
i:INTEGER;


PROCEDURE TabAlunos(VAR todosalunos:tabela);

BEGIN
WITH todosalunos[1] DO
BEGIN
todosalunos[1].nome:='Marcelo';
todosalunos[1].nota:=20
END;
WITH todosalunos[2] DO
BEGIN
todosalunos[2].nome:='Pedro';
todosalunos[2].nota:=10;
END;
WITH todosalunos[3] DO
BEGIN
todosalunos[3].nome:='Engra‡adinho';
todosalunos[3].nota:=0
END;
WITH todosalunos[4] DO
BEGIN
todosalunos[4].nome:='Gordo';
todosalunos[4].nota:=5
END;
WITH todosalunos[5] DO
BEGIN
todosalunos[5].nome:='C¢c¢';
todosalunos[5].nota:=9
END;
END;

PROCEDURE Aprovados_Reprovados(alunos:tabela;VAR aprovados,reprovados:tabela);

VAR i,conta1,conta2:INTEGER;

BEGIN
conta1:=0;
conta2:=0;
FOR i:=1 TO maxalunos DO
WITH alunos[i] DO
IF alunos[i].nota>=10 THEN BEGIN
conta1:=succ(conta1);
aprovados[conta1].nome:=alunos[i].nome;
aprovados[conta1].nota:=alunos[i].nota
END
ELSE BEGIN
conta2:=succ(conta2);
reprovados[conta2].nome:=alunos[i].nome;
reprovados[conta2].nota:=alunos[i].nota
END;

END;


BEGIN { Programa Principal }
TabAlunos(ta);
Aprovados_Reprovados(ta,a,r);
WRITELN('Alunos Aprovados');
FOR i:=1 TO maxalunos DO
WRITELN(a[i].nome,' ',a[i].nota);
WRITELN('Alunos Reprovados');
FOR i:=1 TO maxalunos DO
WRITELN(r[i].nome,' ',r[i].nota);

END.







O programa seguinte é exemplo da utilização de fichas e ficheiros.



PROGRAM Probl53(input,output);

TYPE ficha=RECORD
nome:STRING[40];
altura:INTEGER;
peso:INTEGER;
END;

VAR criminoso:ARRAY[1..100] OF ficha;
i,n_criminosos:INTEGER;
suspeito:ficha;
ficheiro:TEXT;

PROCEDURE lista_criminosos;
VAR i,j:INTEGER;

BEGIN
WRITELN('Criminosos Suspeitos:');
FOR i:=1 TO n_criminosos DO
IF (ABS(suspeito.peso-criminoso[i].peso)<=6) AND (ABS(suspeito.altura-criminoso[i].altura)<=5) THEN WRITELN(criminoso[i].nome); END; BEGIN { Programa Principal } { Lˆ ficheiro } ASSIGN(ficheiro,'bandidos.txt'); RESET(ficheiro); READLN(ficheiro); i:=0; WHILE NOT EOF(ficheiro) DO BEGIN i:=i+1; READLN(ficheiro,criminoso[i].nome,criminoso[i].altura, criminoso[i].peso); n_criminosos:=i; END; { Lˆ Suspeito } WRITE('Qual a altura do suspeito ? '); READLN(suspeito.altura); WRITE('Qual o peso do suspeito ? '); READLN(suspeito.peso); { Compara e Lista criminosos suspeitos } lista_criminosos; CLOSE(ficheiro); END. Os dois programas seguintes são novo exemplo da utilização de fichas e ficheiros. PROGRAM Probl54(input,output); TYPE tipoficha=RECORD matricula:STRING[6]; ano:INTEGER; nome_propr:STRING[65] END; VAR ficha:tipoficha; ficheiro:FILE OF tipoficha; sn:CHAR; BEGIN ASSIGN(ficheiro,'dados.dat'); REWRITE(ficheiro); REPEAT WITH ficha DO BEGIN WRITE('Escreva a matr¡cula do autom¢vel -> ');
READLN(ficha.matricula);
WRITE('Escreva o ano de matr¡cula -> ');
READLN(ficha.ano);
WRITE('Escreva o nome do proprietario do automovel -> ');
READLN(ficha.nome_propr);
END;
WRITE(ficheiro,ficha);
WRITE('Quer introduzir mais dados (s/n) ? ');
READLN(sn);
UNTIL (sn='n') OR (sn='N');
CLOSE(ficheiro);

END.

PROGRAM Probl55(input,output);

TYPE tipoficha=RECORD
matricula:STRING[6];
ano:INTEGER;
nome_propr:STRING[65];
END;

VAR m:STRING[6];

PROCEDURE Procura(matric:STRING);

VAR ficheiro:FILE OF tipoficha;
ficha:tipoficha;

BEGIN
ASSIGN(ficheiro,'dados.dat');
RESET(ficheiro);
WHILE NOT EOF(ficheiro) DO
BEGIN
READ(ficheiro,ficha);
WITH ficha DO
IF matric=ficha.matricula THEN
WRITELN(ficha.matricula,' ',ficha.ano,' ',ficha.nome_propr);
END;
CLOSE(ficheiro);
END;


BEGIN
WRITE('Escreva a matricula -> ');
READLN(m);
Procura(m);
END.
Os 3 programas seguintes são exemplo do uso de variáveis dinâmicas.


PROGRAM Circulo(input,output);

VAR praio:^REAL;

BEGIN
NEW(praio);
WRITE('Qual o raio do c¡rculo ? ');
READLN(praio^);
WRITELN('Diametro: ',praio^*2);
WRITELN('Area: ',PI*SQR(praio^));
WRITELN('Perimetro: ',2*PI*praio^);
DISPOSE(praio)
END.

PROGRAM Probl12(input,output);

VAR n1,n2,n3:^INTEGER;
result:^REAL;

BEGIN
WRITELN('Este programa calcula a media de 3 valores inteiros');
WRITELN('Usa so variaveis dinamicas');
WRITE('Indique o 1 valor inteiro -> ');
NEW(n1);
READLN(n1^);
WRITE('Indique o 2 valor inteiro -> ');
NEW(n2);
READLN(n2^);
WRITE('Indique o 3 valor inteiro -> ');
NEW(n3)
READLN(n3^);
NEW(result);
result^:=(n1^+n2^+n3^)/3;
DISPOSE(n1);
DISPOSE(n2);
DISPOSE(n3);
WRITELN('A media dos 3 valores inteiros ‚ ',result^);
DISPOSE(result);
READLN
END.









PROGRAM Probl13(input,output);

VAR a,b,temp:^INTEGER;

BEGIN
WRITELN('Este programa passa o valor de A para B e vice-versa');
NEW(a);
NEW(b);
a^:=3;
b^:=4;
WRITELN('A ‚ ',a^);
WRITELN('B ‚ ',b^);
temp:=a;
a:=b;
b:=temp;
WRITELN('A agora ‚ ',a^);
WRITELN('B agora ‚ ',b^);
DISPOSE(a);
DISPOSE(b);
READLN
END.







O programa seguinte serve para determinar quais o menor e o maior elementos de um vector em que o vector é uma variável dinâmica.



PROGRAM Vector(input,output);

TYPE vector=ARRAY[1..2000] OF REAL;

VAR pvector:^vector;
i,n:INTEGER;
menor,maior:REAL;

BEGIN
NEW(pvector);
WRITE('Qual o n§ de elementos do vector ? ');
READLN(n);
FOR i:=1 TO n DO
BEGIN
WRITE('Escreva o ',i,'§ elemento -> ');
READLN(pvector^[i]);
END;
menor:=pvector^[1];
maior:=pvector^[1];
FOR i:=1 TO n DO
BEGIN
IF pvector^[i]maior THEN maior:=pvector^[i];
END;
DISPOSE(pvector);
WRITELN('Maior: ',maior);
WRITELN('Menor: ',menor);
END.







O programa seguinte soma dois vectores usando variáveis dinâmicas.



PROGRAM Soma_de_2_Vectores(input,output);

TYPE vector=ARRAY[1..2000] OF REAL;
pvector=^vector;

VAR pvect1,pvect2:pvector;
i,n:INTEGER;

PROCEDURE Le_vector(vector:pvector;n:INTEGER);

VAR i:INTEGER;

BEGIN
FOR i:=1 TO n DO
BEGIN
WRITE('Escreva o ',i,'. elemento do vector -> ');
READLN(vector^[i]);
END;
END;

BEGIN
WRITE('Qual o n. de elementos de cada vector ? ');
READLN(n);
NEW(pvect1);
WRITELN('Vector 1:');
Le_vector(pvect1,n);
NEW(pvect2);
WRITELN('Vector 2:');
Le_vector(pvect2,n);
WRITELN('Vector Soma:');
FOR i:=1 TO n DO
WRITELN(pvect1^[i]+pvect2^[i]);
DISPOSE(pvect1);
DISPOSE(pvect2)
END.







O programa seguinte serve para contruir uma lista ligada com 5 elementos inteiros introduzidos pelo utilizador. Neste programa encontram-se dois procedimentos, um para acrescentar um elemento a uma lista ligada e ainda outro procedimento para eliminar o último elemento da lista ligada.



PROGRAM Probl19(input,output);

TYPE pont_int=^comp_lista;
comp_lista=RECORD
int:INTEGER;
seg:pont_int;
END;

VAR lista,plista:pont_int;
i,j:INTEGER;

PROCEDURE Acrescenta_lista(dado:INTEGER;VAR lista:pont_int);

VAR pAux:pont_int;

BEGIN
NEW(pAux);
pAux^.int:=dado;
pAux^.seg:=lista;
lista:=pAux;
END;

PROCEDURE Elimina_ultimo_lista(lista:pont_int); { Probl21 }

VAR pAux:pont_int;

BEGIN
pAux:=lista;
IF pAux<>NIL THEN
IF pAux^.seg=NIL THEN
BEGIN
DISPOSE(pAux);
lista:=NIL;
END
ELSE BEGIN
WHILE pAux^.seg^.seg<>NIL DO
pAux:=pAux^.seg;
DISPOSE(pAux^.seg);
pAux^.seg:=NIL;
END;
END;


BEGIN
plista:=NIL;
FOR i:=1 TO 5 DO
BEGIN
WRITE('Introduza o ',i,'. inteiro -> ');
READLN(j);
Acrescenta_lista(j,plista);
END;
Elimina_ultimo_lista(plista); { Probl21 }
WRITELN('Lista: ');
lista:=plista;
WHILE NOT(lista=NIL) DO
BEGIN
WRITELN(lista^.int);
lista:=lista^.seg;
END;
END.







Com o programa que se segue podemos inserir elementos no fim de uma lista ligada.



PROGRAM Insere_Cauda(input,output);

TYPE pont_int=^comp_lista;
comp_lista=RECORD
int:INTEGER;
seg:pont_int;
END;

VAR lista,plista:pont_int;
i,j:INTEGER;

PROCEDURE Inserir_na_Cauda(dado:INTEGER;VAR lista:pont_int);

VAR pAux,pAux2:pont_int;

BEGIN
NEW(pAux);
NEW(pAux2);
pAux2:=lista;
pAux^.int:=dado;
pAux^.seg:=NIL;
IF lista=NIL THEN lista:=pAux
ELSE BEGIN
WHILE pAux2^.seg<>NIL DO
pAux2:=pAux2^.seg;
pAux2^.seg:=pAux;
END;

END;

BEGIN
plista:=NIL;
FOR i:=1 TO 5 DO
BEGIN
WRITE('Introduza o ',i,'§ inteiro -> ');
READLN(j);
Inserir_na_Cauda(j,plista);
END;
WRITELN('Lista: ');
lista:=plista;
WHILE NOT(lista=NIL) DO
BEGIN
WRITELN(lista^.int);
lista:=lista^.seg;
END;
READLN;
END.







O programa seguinte contém um procedimento para inserir um elemento na n-esima posição da lista ligada. Contém ainda uma função para se saber quantos elementos tem uma lista ligada.



PROGRAM Probl22(input,output);

TYPE pont_int=^comp_lista;
comp_lista=RECORD
int:INTEGER;
seg:pont_int;
END;

VAR lista,plista:pont_int;
i,j,posic:INTEGER;


FUNCTION Compr_lista(lista:pont_int):INTEGER;

VAR n:INTEGER;
pAux:pont_int;

BEGIN

n:=0;
pAux:=lista;
WHILE pAux<>NIL DO
BEGIN
pAux:=pAux^.seg;
n:=n+1;
END;
Compr_lista:=n;
END;

PROCEDURE Inserir_n_esima_posicao(n:INTEGER;dado:INTEGER;VAR lista:pont_int);

VAR pAux,pAux2:pont_int;
i:INTEGER;

BEGIN
NEW(pAux);
pAux^.int:=dado;
pAux2:=lista;
IF lista=NIL THEN BEGIN
pAux^.seg:=NIL;
lista:=pAux;
END
ELSE BEGIN
IF n=1 THEN BEGIN
pAux^.seg:=lista;
lista:=pAux;
END;

IF n>1 THEN BEGIN
i:=2;
WHILE i ');
READLN(j);
WRITE('Qual a posicao em que o quer inserir na lista ? ');
READLN(posic);
Inserir_n_esima_posicao(posic,j,plista);
END;
WRITELN('Lista: ');
lista:=plista;
WHILE NOT(lista=NIL) DO
BEGIN
WRITELN(lista^.int);
lista:=lista^.seg;
END;
READLN;
END.

Recurs�o (Aula 10)

Recurs�o
(Aula 10)
A recurs�o � bastante usada na matem�tica para definir fun��es, usando elas mesmas nas suas pr�prias defini��es. Por exemplo o calculo de um fatorial, pode ser representada em forma de recurs�o da seguinte forma:
n!=0 se n = 0
n!=n*(n-1)! se n > 0
Usando a defini��o acima, o fatorial de um n�mero podemos calcular multiplicando o n�mero pelo fatorial do n�mero inteiro anterior, e por sua vez o fatorial deste n�mero podemos calcular multiplicando ele pelo fatorial de seu antecessor, e assim sucessivamente at� chegar a 0, onde o fatorial � igual a 1. Nesse momento acaba a recurs�o.
Existem muitas fun��es ou procedimentos que podemos definir em forma simples e compacta usando a recurs�o. Vejamos como podemos usar a recurs�o em Pascal para calcular o fatorial de um n�mero.

Vamos definir a fun��o fatorial(n) que recebe como par�metro um n�mero inteiro n e retorna o fatorial do n�mero.
Fun��o
function fatorial(n:integer):integer;
begin
if(n=0) then fatorial:=1
else fatorial:=n*fatorial(n-1);
end;
Para testar a fun��o vamos escrever o programa que chama a fun��o fatorial
Fun��o
Program TestaFatorial;
Var n, f: integer;

function fatorial(n:integer):integer;
begin
if(n=0) then fatorial:=1
else fatorial:=n*fatorial(n-1);
end;
Begin
writeln('entre com um n�mero inteiro');
Readln(n);
f:=fatorial(n);
writeln('o fatorial de ',n,' eh ',f);
End.
Vejamos a aplica��o da recurs�o num outro problema mais interessante.
Problema: Torre de Hanoi
As Torres de Han�i s�o um quebra-cabeca muito antigo e conhecido. Ele consiste de um conjunto de N discos de tamanhos diferentes e tr�s pinos verticais, nos quais os discos podem ser encaixados.




Cada pino pode conter uma pilha com qualquer n�mero de discos, desde que cada disco n�o seja colocado acima de outro disco de menor tamanho. A configurac�o inicial consiste de todos os discos no pino 1. O objetivo � mover todos os discos para um dos outros discos, sempre obedecendo � restric�o de n�o colocar um disco sobre outro menor.
Tarefa
Escrever um programa que determine quantos movimentos de trocar um disco de um pino para outro ser�o necess�rios para levar todos os disco do pino 1 (origem) para o pino 3 (destino). Como entrada o programa recebe o n�mero de discos.
Solu��o
Este problema vamos resolver analisando varias situa��es da seguinte forma:
Primeiro vamos analisar a situa��o mais simples: o que fazemos se temos apenas um disco?. A resposta � levar o disco do origem ao destino, neste caso o n�mero de movimentos � 1.
Agora vamos analisar a situa��o em que temos 2 discos (N=2) no origem. Neste caso, levamos primeiro o disco mais leve ao pino temporario (pino 2), logo levamos o disco mais pesado ao destino e finalmente levamos o disco menor do temporario ao destino. Se podemos levar os dois disco ao destino, tamb�m poderiamos levar os dois discos ao pino temporario (seguindo a seguinte seq��ncia: disco menor ao destino, disco maior ao temporario, disco menor ao temporario). Agora imagina que temos 3 discos no origem. O que podemos fazer � levar os dois discos menores ao temporario (isso ja sabemos fazer), logo levar o disco mais pesado ao pino destino e finalmente os dois discos menores levar para o pino destino usando o pino origem. Em forma geral se temos, N discos, levamos os N-1 discos menores ao pino temporario, o disco maior levamos ao destino e depois levamos os N-1 discos ao destinos. Portanto o algoritmo seria:
Algoritmo
procedimento Hanoi(N, Orig, Dest, Temp, contador)
se N = 1 ent�o
mover o menor disco do pino Orig para o pino Dest;
acrecentar o contador;
sen�o
Hanoi(N-1, Orig, Temp, Dest, contador);
mover o N-�simo menor disco do pino Orig para o pino Dest;
acrecentar o contador;
Hanoi(N-1, Temp, Dest, Orig, contador);
fim-se
fim
Em cada movemento vamos acrecentar o valor de um contador para determinar o numero de movimentos. Para que o contador possa ser alterado quando retornar a fun��o, valor utilizar a ideia de passagem de parametro por referencia, o que foi aprendido na aula anterior. Vejamos como seria o programa:
Program
Program testahanoi;
Var n,contador:integer;

Procedure Hanoi(n,origem,dest, temp:integer; var contador:integer);
Begin
if(n=1) then begin
contador:=contador+1;
end
else begin
Hanoi(n-1, origem, temp, dest,contador);
contador:=contador+1;
Hanoi(n-1, temp, dest, origem,contador);
end;
End;
Begin
writeln('entre com o numero de discos');
readln(n);
contador:=0;
Hanoi(n,1,2,3,contador);
writeln('o numero de movimentos eh: ',contador);
End.
Como podemos notar a recurs�o pode ser uma ferramenta muito �til para resolver alguns problemas de repeti��o. No entanto, a recurs�o consome mais memoria que uma itera��o normal, por isso devemos evitar usar a recurs�o quando seja poss�vel. Por exemplo, � melhor calcular o fatorial usando um la�o como foi feito na aula 4 que usando a recurs�o como foi mostrado nesta aula.
Exerc�cios
Somas dos numeros
A soma dos primeiros N numeros inteiros pode ser calculado facilmente com um programa utilizando os la��s. Como poderiamos fazer a mesma soma, usando a recurs�o?
Tarefa
Fa�a um fun��o recurs�o que calcula a soma dos primeiros N numeros.
Exemplo de entrada
120

Exemplo de sa�da
7260

Coelhos de Fibonacci
Certo matem�tico italiano com nome de Leonardo de Pisa, conhecido tambem como Fibonacci, propos o seguinte problema: Suponha que acabamos de comprar um casal de coelhos. No final do mes este casal vai ter um casal de coelhinhos (um coelho e uma coelha). Um mes depois, o casal vai ter outro casal de coelhinhos e ao mesmo tempo seus primeiros filhos que agora ja est�o adultos tambem v�o ter um casal de coelhinhos. Assim a cada mes, cada casal de coelhos adultos tem um casal de coelhinos e cada casal de coelhos nacidos no mes anterior viram adultos. A pergunta �, �quantos casais de coelhos vamos ter no final do mes N?.
Este problema pode ser tratado usando a recurs�o. Se consideramos Fn o numero de coelhos do final do mes, este ser� a soma dos casais adultos no mes (n-2) e os casais que virar�o adultos no mes (n-1). Ou seja:
Fn=Fn-1 + Fn-2

como no primeiro mes e anterior o numero de casais era apenas 1 ent�o F0=1 e F1=1. A seq��ncia de n�mero obtidos usando esta recurs�o s�o chamados de n�meros de fibonacci. Vejamos como � a seq��ncia:
F0 = 1
F1 = 1
F2 = 2
F3 = 3
F4 = 5
F5 = 8
.....

Tarefa
Fazer um programa que calcula em forma recursiva o n�mero do fibonacci. como entrada o programa recebe o n�mero do mes N e como saida mostra o numero de fibonacci FN
Exemplo de Entrada
10

Exemplo de Sa�da
89

Turismo do planalto
Planalto � uma cidade planejada e possui uma caracter�stica muito peculiar. Todas as suas ruas s�o orientadas na direc�o oeste-leste e norte-sul, e todos os quarteir�es s�o do mesmo tamanho, formando uma grid regular. As interse��es de ruas em Planalto s�o identificados pelo n�mero da rua, em cada dire��o, por exemplo, (2,4) representa a interse��o da rua 2 em dire��o oeste-leste e a rua 4 em dire��o norte-sul. Agora suponha que um turista com um obse��o por geometria esta planejando visitar a cidade do Planalto. Nosso turista quer come�ar seu trajeto no ponto central da cidade, marcado com a interse��o (0,0), depois quer caminhar uma quadra para norte, sul, oeste, ou leste, para ver as vista na interse��o (0,1) se va para norte, (0,-1) se va para sul, (1,0) se va para leste e (-1,0) se va para oeste. Nosso turista se sente mais animado ao ver a regularidade da cidade, e decide agora andar mais dois quarteir�es. So que n�o quer mais caminhar na mesma dire��o e quer ir para direita o esquerda, tamb�m n�o quer voltar. No pr�ximo segmento ele caminha tres quarteir�es, depois quatro, cinco, e assim sucessivamente ate chegar ao ponto inicial, sempre trocando de dire��o a cada segmento. Lamentavelmente, nosso visitante quer fazer essa visita em pleno ver�o quando algumas interse��es est�o interrompidas por causa de trabalhos nas ruas. No entanto a prefeitura do planalto sempre publica as informa��es de quais interese��es que est�o bloquedas.


Tarefa
Fa�a um programa que ajude a nosso tourista determinar qual deve ser a ruta, de forma que consiga fazer o trajeto acima especificado.
Entrada
A primeira entrada para o programa � um n�mero inteiro n�o maior que 20 indicando o comprimento do maior segmento. Este � o comprimento do ultimo segmento que leva ao ponto de partida. Na linha seguinte ser� dado um inteiro de 0 a 50 indicando o n�mero de interse��es que est�o bloqueadas. Nas proximas linhas ser�o dadas as coordenadas das interse��es bloqueada. Um par de n�meros inteiros por linha, indicando as coordenadas x e y.
exemplo de Entrada
8
2
-2 0
6 2

Sa�da
Na s�ida deve ser impresso a seq��ncia de carateres N, S, L, O, indicando a dire��o de cada segmento da ruta. Caso n�o seja poss�vel fazer o trajeto especificado, indicar que n�o � poss�vel.
Exemplo de sa�da
O S L N L N O S

as solu��es voce encontra aqui

Procedimentos e Fun��es (Aula 9)

Procedimentos e Fun��es
(Aula 9)
A medida que vamos resolvendo problemas mais complexos o tamanho dos nossos programas vai crescendo, portanto vai ficando dif�cil acompanhar a funcionalidade dos trechos de programas. No Pascal existe a possibilidade de agrupar trechos do programa em procedimentos ou fun��es. Os trechos devem ser logicamene coerentes, ou seja, cada uma deve fazer uma fun��o ou tarefa definida. As fun��es ou procedimentos tem a mesma estrutura do programa principal, ou seja, tem o cabe�alho e o corpo. A �nica diferen�a � que as fun��es e procedimentos podem receber par�metros e retornar resultados. Os detalhes sobre as fun��es e procedimentos e suas diferen�as veremos a seguir.
Procedimentos
Os procedimentos tem a seguinte estrutura
procedure nome (lista de parametros)
Declara��es de vari�veis
Begin
Comandos
End;
Para entender como funciona um procedimento vamos come�ar analisando um exemplo. Na aula anterior fizemos um programa que l� informa��es sobre o aluno, calcula a m�dia das notas e finalmente imprime os dados do aluno. Cada uma destas tarefas poder�amos passar a um procedimento. Vejamos como ficaria o programa se a parte de imprimir fosse feita como um procedimento.
Programa
PROGRAM dadosaluno;
TYPE tipoaluno=RECORD
nome: string;
idade: integer;
notas: array[1..5] of real;
END;
VAR aluno : tipoaluno;
media,soma : real;
i : integer;

PROCEDURE imprimirdados(aluno:tipoaluno;media: real);
BEGIN
WRITELN(aluno.nome);
WRITELN(aluno.idade);
WRITELN(media);
END;

BEGIN
READLN(aluno.nome);
READLN(aluno.idade);
FOR i:=1 TO 5 DO BEGIN
READLN(aluno.notas[i]);
END;
soma:=0;
FOR i:=1 TO 5 DO BEGIN
soma:=soma+aluno.notas[i];
END;
media:=soma/5;
imprimirdados(aluno,media);
END.
Passagem de Par�metros
No programa anterior vimos que o conte�do da vari�vel � passado ao procedimento no momento em que o chamamos. No procedimento o valor � recebido na vari�vel que esta declarada dentro do par�ntesis, por exemplo a vari�vel aluno, mas poderia ser qualquer outro nome, n�o precisa ser necessariamente o mesmo nome da vari�vel que chama. Esta forma de passagem de par�metro � chamado de passagem por valor. J� que estamos passando apenas o conte�do da vari�vel, isso indica que se fizermos qualquer altera��o no conteudo da vari�vel aluno dentro do procedimento n�o vai alterar o conte�do do aluno declarado no programa principal. Por�m existem situa��es em que gostar�amos que o conte�do da vari�vel no programa principal tamb�m fosse alterado quando alteramos no procedimento. Este mecanismo � principalmente �til quando queremos retornar resultados de c�lculos ao programa principal. Vejamos por exemplo como far�amos para transformar em procedimento a parte do programa que faz o c�lculo da m�dia.
Programa
PROGRAM dadosaluno;
TYPE tipoaluno=RECORD
nome: string;
idade: integer;
notas: array[1..5] of real;
END;
VAR aluno: tipoaluno;
i: integer;
media: real;
PROCEDURE calcularmedia(aluno:tipoaluno; Var med:real);
VAR media,soma: real;
i: integer;
BEGIN
soma:=0;
FOR i:=1 TO 5 DO BEGIN
soma:=soma+aluno.notas[i];
END;
media:=soma/5;
END;
PROCEDURE imprimirdados(aluno:tipoaluno; med:real);
BEGIN
WRITELN(aluno.nome);
WRITELN(aluno.idade);
WRITELN(media);
END;
BEGIN
READLN(aluno.nome);
READLN(aluno.idade);
FOR i:=1 TO 5 DO BEGIN
READLN(aluno.notas[i]);
END;
calcularmedia(aluno,media);
imprimirdados(aluno,media);
END.
Observando o programa, vemos que na declara��o dos par�metros do procedimento calcularmedia existem uma palavra Var. Esta palavra indica que a vari�vel media do programa principal ser� alterada se a vari�vel med for alterada no procedimento. Esta forma de passagem de par�metro � chamada de passagem por refer�ncia. Isso indica que n�o � o conte�do que esta passando mas sim o endere�o da caixa media. Agora est� faltando passar a parte de entrada de dados para um procedimento. Esta tarefa fica como exerc�cio.
Fun��es
Uma fun��o � um caso especial de procedimento, tem practicamente a mesma estrutura, por�m uma fun��o pode retornar um valor diretamente. Geralmente, fun��es s�o usadas para fazer c�lculos que apenas retornam um resultado. A formato de um fun��o tem a seguinte estrutura:
Function nome (lista de parametros):tipo de dado a ser retornado;
declara��o de vari�veis
Begin
comandos
End;
O valor a ser retornado pela fun��o � calculado dentro do corpo do fun��o e o nome da vari�vel que vai retornar tem que ser igual ao nome da fun��o. Vejamos num exemplo simples o uso de uma fun��o: vamos fazer um programa para calcular o m�ximo entre dois n�meros inteiros a e b, usando fun��o.
Programa

Program calmax;
Var max,a,b: integer;

Function maximo(a,b:integer):integer;
begin
if(a>b) then maximo:=a
else maximo:=b;
end;

Begin
Readln(a);
Readln(b);
max:=maximo(a,b);
writeln('o valor maximo �: ', max)
End.
Fun��es predefinidas
Nas aulas anteriores ja tivemos a oportunidade de usar alguns comandos do Pascal definidas como fun��es. Por exemplo, para gerar um n�mero aleat�rio foi usado o random e para arredondar um n�mero real para um inteiro foi usado o round. Estes comandos, s�o chamados de fun��es predefinidas da linguagem Pascal e sempre retornam um resultado. Dentro da linguagem j� existem muitas outras fun��es predefinidas, estas s�o principalmente fun��es matem�ticas para nos facilitar os c�lculos. Aqui vai uma lista de algumas fun��es predefinidas:

abs(x) retorna o valor absoluto de um n�mero x
sqr(x) retorna o quadrado de um n�mero x
srqt(x) retorna a raiz quadrada de x
sin(x) retorna o valor do seno do angulo x
cos(x) retorna o valor do coseno do angulo x

length(s) retorna o tamanho de uma string s
pos(s1,s2) retorna a posi��o da cadeia s1 na cadeia s2 (0 se n�o ocorre)
upcase(c) converte para maiuscula o caratere c
Exerc�cios
n�mero pi
O n�mero PI � bastante usado em calculos matematicos, por exemplo, para calcular o perimentro de uma circunfer�ncia multiplicamos e seu di�metro pelo numero PI. Segundo a historia, o primeiro a usar a letra grega PI, foi Welshman Willian Jones em 1706, que abreviou "periphery" (per�metro) de um c�rculo de di�metro unit�rio. Euler adotou o s�mbolo e rapidamente ele se tornou uma nota��o padr�o.
Desde muitos s�culos atr�s, os povos antigos j� tinhas conhecimento do n�mero PI:
No Egito antigo, se considerava PI=256/81 = 3,1604938.... Na Babil�nia, PI=3,125; Na China, no s�culo III eles usavam PI=3,14.
No Oriente M�dio, os �rabes, com h�beis matem�ticos, obtiveram 17 casas decimais para PI usando pol�gonos inscritos e circunscritos numa circunfer�ncia, por volta do s�culo XV.
Na Europa, a b�blia d� um valor de PI=3. Arquimedes j� sabia que 223/71 < PI < 22/7 usando um pol�gono de 96 lados. No s�c XVIII, Lambert e Legendre demonstraram que o n�mero PI era irracional. Na Holanda, o matem�tico Ludolph Van Cenlen (1539-1610) determinou 35 casas decimais para o n�mero PI, superando pela primeira vez os resultados dos �rabes. Quando morreu, foi gravado em sua l�pide seu n�mero PI de 35 casas decimais, e at� hoje na Alemanha o n�mero PI � chamado de N�mero de Ludolph.
Hoje em dia, temos o n�mero PI calculado com milh�es de casas decimais, para tanto usam-se computadores potentes e s�ries infinitas que convergem para o n�mero PI. Por exemplo usando o Algor�tmo de Gottfried Wilhem von Leibniz o PI pode ser calculado da seguinte forma
PI/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - .........

Tarefa
Fazer uma fun��o para calcular o valor do PI usando o algoritmo de Gottfried Wilhem von Leibniz. O PI deve ser determinado com 4 casas decimais, para isso, durante o c�lculo os termos devem ser somados ate que a diferen�a de dois termos consecutivos seja menor que 0.00000000001. Para testar sua fun��o fa�a um programa que chama a fun��o pi() e imprime o valor do PI.
Pot�ncia de um n�mero
Nas aulas anteriores vimos que para calcular o quadrado de um n�mero � suficiente multiplicar o n�mero por ele mesmo, inclusive em Pascal ja existe um fun��o chamado sqr(x), que calcula o quadrado de um n�mero x. Agora imagina que voce quera elevar um n�mero a uma potencia diferente de 2, como fazer.? A solu��o � multiplicar o n�mero a quantidade de vezes igual a pot�ncia, por exemplo, 34 e igual a 3x3x3x3=81.
Tarefa
Fazer uma fun��o chamado pow, que dado um x e y calcula xy
Entrada
A entrada para o programa s�o os n�mero x e y.
Exemplo de entrada
5 7

Sa�da
A sa�da do programa � o resultado do c�lculo de x elevado a y.
Exemplo de sa�da
78125

as solu��es voce encontra aqui

Defini��o de tipos (Aula 8)

Defini��o de tipos
(Aula 8)
At� agora temos usado apenas os tipos de dados b�sicos definidos pela linguagem, tais como integer, real, char e boolean. Por�m a linguagem Pascal nos permite tamb�m definir nossos proprios tipos e usar na declara��o de vari�veis. Por exemplo, se o tipo string ainda n�o esta definido em alguns compiladores de Pascal nos poderiamos definir o tipo string como um vetor de caracteres da seguinte forma.
TYPE string = array[1..255] of char;
Neste caso, a palavra TYPE informa ao computador que neste campo ser�o definidos os tipos adicionais que ser�o usados no programa. Agora, se desejamos declarar uma vari�vel para armazenar por exemplo o nome de uma pessoa, podemos faz�-lo da seguinte forma:
VAR nome: string;
Neste caso o nome pode ter at� 255 caracteres. Agora imagine que desejamos armazenar num vetor o nome dos alunos da turma, tratado no problema da aula anterior. Neste caso, podemos declarar um vetor da seguinte forma:
Var nome_aluno: array [1..10] of string;
Ou seja, os tipos definidos por n�s podem ser usados como qualquer outro tipo definido pela linguagem Pascal. A vantagem de definir novos tipos � para simplificar a declara��o de vari�veis. Vejamos por exemplo, como seria a declara��o da vari�vel nome_aluno sem a defini��o do tipo string.
VAR nome_aluno: array[1..10] of array[1..255] of char;
A defini��o de tipos � principalmente �til quando trabalhamos com registros.
REGISTROS
Nas duas aula anteriores vimos como declarar uma vari�vel (usando arrays) para armazenar um conjunto de dados do mesmo tipo. Neste aula vamos aprender como agrupar v�rios conjuntos de dados inclusive de tipo diferentes. Em Pascal, utilizamos a paravra record (registro) para declarar uma vari�vel contendo v�rios conjuntos de dados. Por exemplo, vejamos a seguinte declara��o:
Var aluno: record
nome: string;
idade: integer;
sexo: char;
notas: array[1..5] of real;
end
Nesta declara��o podemos observar que em uma �nica vari�vel est�o armazenadas v�rios tipos de dados, inclusive temos um vetor que cont�m as notas do aluno em v�rias disciplinas. Se vamos utilizar a mesma declara��o para outras vari�veis, seria melhor declarar como um tipo, especialmente se pretendemos declarar um vetor de alunos, para guardar a informa��o de todos os alunos. A declara��o do tipoaluno seria a seguinte:
Type tipoaluno=record
nome: string;
idade: integer;
sexo: char;
notas: array[1..5] of real;
end
Para declarar um vetor de alunos utilizariamos o tipoaluno.
Var alunos: array[1..100] of tipoaluno;
Vejamos num exemplo como utilizar estes conceitos na solu��o de um problema.
Problema
Utilizando registros, escrever um programa que l� os dados de um aluno e imprime na tela do computador.
Programa
PROGRAM dadosaluno;
TYPE tipoaluno=RECORD
nome: string;
idade: integer;
notas: array[1..5] of real;
END;
VAR aluno: tipoaluno;
soma,media: real;
i: integer;
BEGIN
READLN(aluno.nome);
READLN(aluno.idade);
FOR i:=1 TO 5 DO BEGIN
READLN(aluno.notas[i]);
END;
soma:=0;
FOR i:=1 TO 5 DO BEGIN
soma:=soma+aluno.notas[i];
END;
media:=soma/5;
WRITELN(aluno.nome);
WRITELN(aluno.idade);
WRITELN(media);
END
Observando o programa vemos que para acessar aos campos de um registro utilizamos um ponto. Agora vejamos um outro exemplo interessante.
Problema: Estagio
Voc� conseguiu um est�gio para trabalhar como programador na secretaria da sua escola. Como primeira tarefa, Dona Vilma, a coordenadora, solicitou que voc� aprimore um programa que foi desenvolvido pelo estagi�rio anterior. Este programa tem como entrada uma lista de nomes e de m�dias finais dos alunos de uma turma, e determina o aluno com a maior m�dia na turma. Dona Vilma pretende utilizar o programa para premiar o melhor aluno de cada turma da escola. O programa feito pelo estagi�rio anterior � mostrado a seguir.
Programa
Program estagio;

Const MAX_ALUNOS = 1000;
Type aluno = record
codigo, media: integer;
end;
Var i, indice_melhor, n: integer;
turma: integer;
alunos: array [1..MAX_ALUNOS] of aluno;

Begin
readln(n);
turma:=1;
while n > 0 do begin
{ le dados dos alunos }
for i := 1 to n do
readln(alunos[i].codigo, alunos[i].media)
{ procura aluno de maior media }
indice_melhor = 1;
for i := 2 to n do
if alunos[i].media > alunos[indice_melhor].media then
indice_melhor = i;
turma:=turma+1;
{ escreve resposta }
writeln('Turma ', turma);
writeln(alunos[indice_melhor].codigo);
{ le numero de alunos da proxima turma }
readln(n);
end;
End.
Como voc� pode verificar, o programa na forma atual tem uma imperfei��o: em caso de haver alunos empatados com a melhor m�dia na turma, ele imprime apenas o primeiro aluno que aparece na lista.
Tarefa
Dona Vilma deseja que voc� altere o programa para que ele produza uma lista com todos os alunos da turma que obtiveram a maior m�dia, e n�o apenas um deles. Voc� consegue ajud�-la nesta tarefa?
Entrada
A entrada � constitu�da da seguinde v�rios conjuntos de teste, representando v�rias turmas. A primeira linha de um conjunto de testes cont�m um n�mero inteiro N (1 ≤ N ≤ 1000) que indica o total de alunos na turma. As N linhas seguintes cont�m, cada uma, um par de n�meros inteiros C (1 ≤ C ≤ 20000) e M (0 ≤ M ≤ 100), indicando respectivamente o c�digo e a m�dia de um aluno. O final da entrada � indicado por uma turma com N = 0.
Exemplo de Entrada
3
1 85
2 91
3 73
5
12300 81
12601 99
98012 76
10111 99
212 99
Sa�da
Para cada turma da entrada seu programa deve produzir tr�s linhas na sa�da. A primeira linha deve conter um identificador do conjunto de teste, no formato "Turma n", onde n � numerado a partir de 1. A segunda linha deve conter os c�digos dos alunos que obtiveram a maior m�dia da turma, separados por um espa�o em branco. Os c�digos dos alunos devem aparecer na mesma ordem da entrada, e cada um deve ser seguido de um espa�o em branco. A terceira linha deve ser deixada em branco. O formato mostrado no exemplo de sa�da abaixo deve ser seguido rigorosamente.
Exemplo de Sa�da

Turma 1
2

Turma 2
12601 10111 212

(esta sa�da corresponde ao exemplo de entrada acima)
Restri��es
0 ≤ N ≤ 1000 (N = 0 apenas para indicar o fim da entrada)
1 ≤ C ≤ 20000
0 ≤ M ≤ 100
Solu��o
Em primeiro lugar vamos esclarecer um novo termo que aparece na segunda linha do programa. Quando queremos definir vari�veis constantes utilizamos a palabra const. Neste caso o valor da vari�vel n�o pode ser alterado no programa. As constantes s�o �teis por exemplo, para limitar as dimens�es dos arrays. No programa MAX_ALUNOS define o n�mero maximo de alunos.
Para determinar todos os alunos que tem a maior nota, vamos achar em primeiro lugar o valor da maior nota. Logo depois comparamos a nota dos alunos com a maior nota. Para todos os alunos que tiverem a nota igual � maior nota vamos mostrar o seu codigo na tela do computador.
Programa
Program estagio;

Const MAX_ALUNOS = 1000;
Type aluno = record
codigo, media: integer;
end;
Var i, indice_melhor, n: integer;
turma: integer;
alunos: array [1..MAX_ALUNOS] of aluno;
max: integer;

Begin
readln(n);
turma:=1;
while n > 0 do begin
{ le dados dos alunos }
for i := 1 to n do
readln(alunos[i].codigo, alunos[i].media)
{ procura a maior media }
max:=0;
for i := 1 to n do begin
if alunos[i].media > max then
max=alunos[i].media;
end
turma:=turma+1;
{ escreve resposta }
writeln('Turma ', turma);
{procura alunos com a maior m�dia}
for i:=1 to n do begin
if(alunos[i].media=max then
write(alunos[i].codigo);
end
writeln;
{ le numero de alunos da proxima turma }
readln(n);
end;
End.
Exerc�cios
Biblioteca
A diretora da escola quer agora informatizar a biblioteca. Para come�ar ela quer que todos os livros que est�o nos estandes sejam cadastrados no computador. Depois de uma consulta como um especialista em banco de dados, ela decideu que as seguintes informa��es de cada livro deveram ser armazenadas no computador:
codigo, titulo, autor, ano de edi��o e quantidade. O codigo � um identificador un�co de cada livro e consta de 5 carateres.
Tarefa
Foi dado para voce a tarefa de montar a estrutura de dados e fazer um programa que testa se um livro ja esta armazenado no computador.
Entrada
Como entrada o programa recebe o n�mero de livros para armazenar, depois em cada linha entram o titulo, autor e ano de edi��o. Em seguida encontrase a entrada de consulta: um n�mero indicando o quantidade de consultas e a continua��o os codigos de livros que precisam ser consultados
Exemplo de Entrada
4
140DR
programando em Pascal
Douglas Riddle
1991
132NW
Algorithms + Data Structures = Programs
Niklaus Wirth
1975
182YP
Matematica Recreativa
Yakov Perelman
1938
183YP
Fisica Recreativa
Yakov Perelman
1938
2
182YP
143NW
Sa�da
Na sa�da o programa deve imprimir se os livros consultados ja est�o cadastrados ou n�o no compurador.
Exemplo de sa�da
Cadastrado
N�o cadastrado
Lista Ordenada
No final de anho, para selecionar os primeiros 3 alunos que tiveram a melhor media na turma, a diretora pede para voce fazer uma lista ordenada de todos os alunos segundo o valor da media em ordem decrecente. Essa ordena��o � importante, ja que o premio para os primeiros 3 alunos � uma viagem de ferias com tudo pago.
Tarefa
Sua tarefa � fazer um programa que ordene a lista de acordo com a nota media em forma descrecente. A lista tem o formato similar ao problema do estagio, porem em vez de codigo, fue substituido pelo nome, ja que n�o tem nomes repetidos na turma. Portanto o tipo aluno pode ser definido da seguinte forma:
type aluno = record
nome: string;
media: real;
end;
Voce j� aprendeu como determinar o valor m�ximo de um vetor. Como voce pode resolver este problema aproveitando seus conhecimentos adquiridos sobre programa��o?.
Entrada
A primeira entrada � o numero de alunos da turma, nas seguintes linhas s�o fornecidos os nomes e as medias de todos os alunos em forma sequencial.
Exemplo de entrada
10
Jo�nzinho
8.5
Pedrino
8.4
Pablito
10
Ritza
9.5
Jorginho
7.5
Julinho
6.5
verushka
7.0
Gisele
9.3
Paulinho
8.2
Robertinho
6.0
Sa�da
Na sa�da o programa deve imprimir a lista ordenada
Exemplo de sa�da
Pablito
Ritza
Gisele
Jo�nzinho
Pedrinho
Paulinho
Jorginho
Verushka
Julinho
Robertinho
Escaner
O aparelho para escanear imagenes em branco e preto funciona da seguinte forma. Os 4 sensores presentes no escaner barren a imagem em varios passos sucessivos. O primeiro escanea horizontalmente linea por linea, o segundo diagonalmente para direita, o terceiro verticalmente e o quarto em forma diagonal para a esquerda, como mostra a figura abaixo. Em cada barredura os sensores contam os quadradinhos (celulas) que contem algum peda�o da figura.


Tarefa
Fa�a um programa que dado as informa��es lidas pelos sensores, imprima na tela a figura escaneada. O tamanho do escaner � 10 pontos de largura e 15 de comprimento.
Entrada
A entrada contem 4 lineas com 10, 24, 15 e 24 n�meros inteiros represetando os dados dos 4 sensores coletados em cada barredura.
Exemplo de entrada
11 14 12 8 8 8 8 13 14 12
4 10 10 10 10 10 4 7 8 19 19 6 6 6 5 2
1 2 2 3 4 5 5 4 8 9 9 9 9 8 5 4 2 3 3 3 3 3 2 0
1 2 2 3 4 5 5 4 8 9 9 9 9 9 6 5 3 3 3 3 4 2 0 0
Sa�da
O programa deve imprimir uma matriz de 10x15 celulas. Para indicar que uma celula representa parte do objeto imprimir o caractere (#) por celula e para indicar que a celula n�o representa parte do objeto, impirmir o ponto (.)
Exemplo de Sa�da
######..#####..
######.#######.
.####..#######.
.####.####.....
.####.####.....
.####.####.....
.####.####.....
.####.#########
######.########
######..######.

as solu��es voce encontra aqui

Matrizes (Aula 7)

Matrizes
(Aula 7)
Uma matriz � um array de duas dimens�es. Uma matriz � �til por exemplo para armazenar tabelas, fazer calculos matem�ticos, fazer desenhos, resolver problemas, etc. Imagina que desejamos guardar no computador a lista dos alunos com suas respetivas notas em todas as disciplinas cursadas durante o ano. Por exemplo a seguinte tabela mostra a lista de 10 alunos e as notas em 8 disciplinas.

Alunos notas Media
1 2 3 4 5 6 7 8
Jo�ozinho 7 7 8 9 5 6 6 9
Pedrinho 4 5 5 7 8 9 6 6
Gabriela 8 8 7 5 7 8 9 7
Roberto 4 5 6 7 5 6 7 3
Paulo 5 4 5 4 6 5 5 3
Gisele 6 7 7 8 5 9 8 9
Vera 7 7 8 8 6 6 8 9
Jorginho 6 4 5 4 6 5 5 6
Paulinho 6 4 5 4 6 5 5 6
Flavio 7 7 8 6 8 9 8 9
Gostariamos fazer um programa para armazenar essa tabela no computador e depois poder calcular por exemplo a media de todas as notas de todos os alunos. Inclusive para saber o desempenho da turma inteira poderiamos calcular a media das medias.

Bom, para come�ar vamos pensar apenas em como armazenar as notas na memoria do computador. Para isso vamos utilizar uma matriz. Em Pascal, uma matriz � definida em forma muito similar a um vetor, da seguinte forma:
Var notas : array [1..10,1..8] of real;
Onde o n�mero 10 indica o n�mero maximo de linhas da matriz e o n�mero 8 indica o n�mero maximo de colunas. Se n�o sabemos com antecedencia qual ser� o tamanho de nossa matriz podemos reservar um n�mero grande como foi feito com vetores.

Para manter a informa��o completa da tabela no computador, poderiamos armazenar tamb�m os nomes dos alunos num vetor de string e as medias dos alunos num vetor de n�meros reias.
Vejamos como trabalhar com matrizes, analisando o seguinte programa que le as notas dos alunos, calcula as medias, guarda num vetor e imprime os resultados na tela do computador.
Programa
Program Turma;
Var notas: array [1..10,1..8] of real;
Media: array [1..8] of real;
Soma: real;
i,j,N,M: integer;
Begin
{Entrada de Dados}
Readln(N); {ler o n�mero de alunos}
Readln(M); {ler o n�mero de disciplina}
For i:=1 to N do Begin
For j:=1 to M do Begin
{ler as notas dos alunos em cada disciplina}
Read (notas[i][j]);
End;
End;
{Processamento de Dados}
For i:=1 to N do Begin
Soma:=0; {zerar a soma das notas do aluno i}
For j:=1 to M do Begin
{acrecentar a soma as notas da disciplina j}
Soma:=Soma + notas[i][j]
End;
Media[i]:=Soma/M;
End;
{Sa�da de Resultados}
For i:=1 to N do Begin
Writeln('a nota media aluno ',i,' : ',Media[i]);
End;
End.
Para acessar aos elementos de uma matriz utilizamos dois �ndices: o primeiro para definir a linha e o segundo para definir a coluna. No programa observamos que precisamos sempre de dois la�os para percorrer todos os elementos de uma matriz. Quando um la�o est� dentro de outro la�o, estes s�o chamados de la�os aninhados. � muito comum encontrar em programas la�os anhinhados, especialmente quando se trabalha com vetores e matrizes. Os vetores e matrizes s�o bastante usados em c�lculos matem�ticos. Vejamos agora um outro exemplo de opera��es com matrizes.
Problema
Fazer um programa que dada duas matrizes A e B, determinar a soma de A e B.

A soma de duas matrizes � bastante simples, apenas precisamos somar os elementos correspondentes de cada matriz e o resultado colocar em uma outra matriz. Veja o seguinte exemplo de soma de dois matrizes A e B de tamanho 3x3:
A B C
| 1 4 2 | | 1 2 3 | | 2 6 5 |
| 0 5 1 | + | 1 0 1 | = | 1 5 2 |
| 2 2 8 | | 2 3 2 | | 4 5 10|

Solu��o
Vamos escrever um programa que le os elementos da matriz, depois faz a soma de seus elementos e finalmente imprime a matriz resultante. A primeira entrada s�o as dimens�es da matriz. Para poder somar duas matrizes, elas devem ter as mesmas dimens�es. Os elementos de cada linha devem ser digitados deixando um espaco, como mostra o seguinte exemplo:
Exemplo de entrada:
digite as dimens�es das matrizes:
3
3
digite os elementos da matriz A:
1 4 2
0 5 1
2 2 8
digite os elementos da matriz B:
1 2 3
1 0 1
2 3 2
Programa
Program soma_matrizes;
Var A,B,C: array[1..100,1..100] of integer;
i,j: integer;
M,N: integer;
Begin
Writeln('digite as dimens�es das matrizes:');
Readln(N,M);
Writeln('digite os elementos da matriz A:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Read(A[i,j]);
End;
Readln;
end;
Writeln('digite os elementos da matriz B:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Read(B[i,j]);
End;
Readln;
end;
{calcular a soma de A + B}
For i:=1 to N do Begin
For j:=1 to M do Begin
C[i,j]:=A[i,j]+B[i,j];
End;
End;
{imprimir o resultado}
Writeln('O resultado da soma de A+B:');
For i:=1 to N do Begin
For j:=1 to M do Begin
Write(C[i,j],' '); {deixar espa�o entre n�meros}
End;
Writeln; { quebra linha }
End;
End.
Problema: Aeroporto
A crescente utiliza��o do transporte a�reo preocupa os especialistas, que prev�em que o congestionamento em aeroportos poder� se tornar um grande problema no futuro. Os n�meros atuais j� s�o alarmantes: relat�rios oficiais demonstram que na Europa, em junho de 2001, houve uma m�dia de 7.000 atrasos de v�os por dia. Preocupada com a previs�o dos seus especialistas em tr�fego a�reo, a Associa��o de Transporte A�reo Internacional (ATAI) est� come�ando um estudo para descobrir quais s�o os aeroportos onde o tr�fego a�reo pode vir a ser mais problem�tico no futuro.
Tarefa
Como programador rec�m contratado pela ATAI voc� foi encarregado de escrever um programa para determinar, a partir de uma listagem de aeroportos e v�os, qual aeroporto possui maior probabilidade de congestionamento no futuro. Como medida da probabilidade de congestionamento ser� utilizado neste estudo o n�mero total de v�os que chegam ou que partem de cada aeroporto.
Entrada
A primeira linha de entrada cont�m dois n�meros inteiros A e V, que indicam respectivamente o n�mero de aeroportos e o n�mero de v�os. Os aeroportos s�o identificados por inteiros de 1 a A. As V linhas seguintes cont�m cada uma a informa��o de um v�o, representada por um par de n�meros inteiros positivos X e Y, indicando que h� um v�o do aeroporto X para o aeroporto Y.
Exemplo de Entrada
5 7
1 3
2 1
3 2
3 4
4 5
3 5
2 5
Restri��es
0 ≤ A ≤ 100
0 ≤ V ≤ 10000
1 ≤ X ≤ A
1 ≤ Y ≤ A
X ≠ Y
Solu��o
Para resolver este problema vamos usar matrizes. Os indices de cada elemento da matriz vai indicar o origem e o destino do v�o, por exemplo 1,3 indica que tem v�o do aeroporto 1 ao aeroporto 3. Em cada elemento da matriz vamos armazenar o n�mero de v�os, por exemplo mat[1][3] vamos colocar um 1 indicando que existe um v�o entre estes dois aeroportos. A tabela ou matriz para armazenar os dados de acima seria uma matriz quadrada de tamanho igual ao n�mero de aeroportos.
1 2 3 4 5
1 0 0 1 0 0
2 1 0 0 0 1
3 0 1 0 1 1
4 0 0 0 0 1
5 0 0 0 0 0
A partir desta tabela podemos determinar os aeroportos mas congestionados, contando os v�os que chegam e os v�os que saem. Para isso vamos somar as linhas e as colunas de forma similar como foi feito com a tabela das notas. Estes ser�o armazenados em vetores para depois fazer a soma e finalmente procurar os aeroportos mais congestionados. Vejamos o programa:
Programa
PROGRAM aeroporto;
VAR mat: array [1..100,1..100] of integer;
total,sai,cheg: array[1..100] of integer;
A,V:integer;
i,j:integer;
x,y:integer;
max: integer;
BEGIN
WRITELN('digite o n�mero de aeroportos e o n�mero de v�os');
READ(A); {ler numero de aeroportos}
READLN(V); {ler n�mero de v�os}
{zerar a matriz mat}
FOR i:=1 TO A DO BEGIN
FOR j:=1 TO A DO BEGIN
mat[i][j]:=0;
END;
END;
{ler x, y e acrecentar 1 na matriz se existir v�o de x para y}
Writeln('para cada v�o digite o origem e o destino na mesma linha');
FOR i:=1 to V DO BEGIN
READLN(x,y);
mat[x][y]:=mat[x][y]+1;
END;

{somar as saidas do aeroporto i}
FOR i:=1 TO A DO BEGIN
sai[i]:=0;
FOR j:=1 TO A DO BEGIN
sai[i]:=sai[i]+mat[i][j];
END;
END;

{somar as chegadas ao aeroporto j}
FOR j:=1 TO A DO BEGIN
cheg[j]:=0;
FOR i:=1 TO A DO BEGIN
cheg[j]:=cheg[j]+mat[i][j];
END;
END;
{procurar o valor maximo da soma de chegadas e saidas}
max:=0;
FOR i:=1 TO A DO BEGIN
total[i]:=cheg[i]+sai[i];
IF(total[i]>max) THEN max:=total[i];
END;
{imprimir os aeroportos congestionados}
WRITELN(' Os aeroportos congestionados:');
FOR i:=1 TO A DO BEGIN
IF(max=total[i]) THEN WRITE(i, ' ');
END;
WRITELN; {quebra linha}
END.
Exerc�cios
O jogo de xadrez, al�m de ser um jogo que exige bastante racioc�nio, � uma �tima fonte de quebra-cabe�as. Este problema trata de um destes quebra-cabe�as, envolvendo os movimentos de uma de suas pe�as, o cavalo. Os movimentos do cavalo s�o ditos em 'L', pois ele sempre deve andar duas casas em uma dire��o e uma casa na dire��o perpendicular.



A figura acima ilustra os poss�veis movimentos do cavalo, onde o caractere 'C' indica a posi��o inicial e o caractere '•' representa as poss�veis finais. � importante notar que o cavalo � a unica pe�a que pode saltar sobre outras pe�as do xadrez. Note ainda que na representa��o que usamos n�o desting�imos casas brancas de casas pretas no tabuleiro.
Tarefa
Usando os movimentos do cavalo, voce deve fazer um programa para determinar qual o n�mero m�nimo de movimentos do cavalo para ir de uma casa Inicio at� uma casa Final, sendo proibido que o cavalo para sobre algumas casas especificadas com X durante a seq��ncia de movimentos.



Entrada
Como entrada ser�o fornecidas LI e CI indicando a posi��o (coluna e linea) inicial do cavalos no tabuleiro, a posi��o final LF e CF, o n�mero de casas proibidas e a sequencia de LX e CX indicando a posi��o das casas proibidas.
Exemplo de entrada:
4 3
7 8
13
3 5
4 4
4 5
5 3
5 4
5 5
5 6
5 7
6 2
6 3
6 4
8 5
8 6
Sa�da
O programa deve mostrar o minimo n�mero de movimentos que o cavalo deve fazer para ir da posi��o inicial ate a posi��o final. Por exemplo, a sa�da para os dados de acima �: 6.
Quebracabe�a
Este � um jogo antigo bem popular entre crian�as que consiste de uma matriz de 5x5 contendo 25 quadradinho todos de igual tamanho. Em cada quadradinho esta escrito uma unica letra do alfabeto, por�m um quadradinho esta vazio, como mostra a figura abaixo.



Um quadradinho pode ser movido para o espa�o vazio se este estiver a direita, esquerda, acima ou abaixo imediato. O objetivo da quebracabe�a � mover os quadradinho no espa�o vazio de forma que todas as letras aparecem em ordem alfabetico.
Tarefa
Escreva um programa que mostre o quebracabe�a resultante depois de uma seq��ncia de movimentos dada a posi��o inicial.
Entrada
A entrada consiste da configura��o inicial da quebracabe�a, e a sequencia de movimentos. As primeiras 5 linhas descreve a configura��o inicial, a linha seguinte contem a seq��ncia de movimentos, definidos pelas letras A,B,E,D. Onde cada letra tem o seguinte significado
A --- O movimento � para abaixo, a letra que esta acima do espa�o vazio ser� movido
B --- O movimento � para acima, a letra que esta abaixo do espa�o vazio ser� moviemdo
E -- O movimento � para esquerda, a letra que esta � direita do espa�o vazio ser� movida
D -- O movimento � para a direita, a letra que esta � esqueda do espa�o vazio ser� movida
Caso exista algum movimento n�o permitido, imprimir que a quebracabe�a n�o tem configura��o final.
Exemplo de entrada
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
AEEBBR
S�ida
A s�ida � a configura��o final da quebracabe�a depois da seq��ncia de movimentos, as letras devem ser imprimidas deixando um espa�o, como mostra o exemplo:
Exemplo de sa�da
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
Sensor do escaner
Uma imagem em branco e preto pode ser considerado como uma matriz de pontos brancos e pretos. Onde os pontos pretos representam o objeto e o branco o fundo. Quando desejamos guardar no computador uma imagem, utilizamos um escaner. O escaner � um aparelho que tem v�rios sensores que detecta os pontos brancos e pretos quando passa pela imagem e depois reconstrui a imagem colocando numa matriz de zeros e unos. Um dos sensores do escaner barre a imagem em forma diagonal, como mostra a figura abaixo. Em cada diagonal conta o n�mero de pontos pretos.


Tarefa
Fa�a um programa que conte o n�mero de pontos pretos em cada diagonal da imagem.
Dados de entrada
A entrada � composta de M e N que indica o tamanho da imagem e de uma matriz de 1s e 0s que representa a imagem.

Ejemplo de entrada
5 7
0 0 0 0 0 1 0
1 1 0 1 0 0 0
0 0 1 0 0 1 0
0 1 0 1 0 0 0
0 0 0 1 0 1 0
Sa�da
Na sa�da o programa deve imprimir o n�mero de pontos pretos em cada diagonal.
Exemplo de sa�da
0 1 1 0 3 1 1 2 0 1 0
As solu��es voce encontra aqui.

 
Design by Wordpress Theme | Bloggerized by Free Blogger Templates | coupon codes