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

16 de agosto de 2012

o Windows XP e o Windows 7 em Dual Boot

Olá pessoal, eu uso, em meu PC, o Windows XP e o Windows 7 em Dual Boot. E assim como muitos, já tive a chata tarefa de ter que formatar um dos S.O.s por motivo de vírus ou mal funcionamento do PC e perder o bendito boot de um dos Sistemas Operacionais e ter que recriá-lo após a formatação, sem contar a árdua tarefa de ter que reinstalar os programas e configurações dos mesmos. Nesse tutorial irei ensinar como criar uma imagem das partições dos S.O.s para que não precise mais formatar e instalar tudo de novo e nem correr o risco de perder o boot dos Sistemas e o melhor: ter sempre um Sistema Operacional "Recém-Instalado".

Nesse tutorial será usado o programa Acronis True Image Home 2010. Ele é compatível com o Windows XP, Vista e 7. (Já existe a versão 2011) O programa é PAGO. Mas existe a versão Acronis True Image WD Edition (feita sobre a versão 2009 do Acronis) e é gratuita, mas inglês. Ela tem algumas funções do Acronis, como criar e recuperar. Só que eu não a testei, caso queiram testar, o link está em baixo.

http://download.wdc.com/atiwd/tih_s_e_14010.exe 100 MB

Site do Acronis True Home
http://br.acronis.com


LEIAM PRIMEIRO E SÓ DEPOIS PONHAM EM PRÁTICA O CONTEÚDO DESSE TUTORIAL

1 - Ao abrir o programa Acronis True Image Home 2010, como não existe nenhuma imagem do HD criada, será mostrado a seguinte janela:



Nessa janela podemos escolher onde será criada uma imagem clicando no link azul abaixo de Localização do arquivo e também escolher uma data para que o programa execute um backup automaticamente, mas não é o que queremos. Então clique em Cancelar.

2 - Na janela principal do programa existe uma seção chamada O que pretende fazer? aqui, podemos tanto fazer um backup, opções da esquerda, quanto Recuperar (aplicar) um backup já existente, opções da direita. Escolheremos a opção Backup > Os meus discos.

Resized ImageClique aqui para ver a imagem no tamanho real.


3 - Será aberto outra janela onde podemos escolher qual ou quais partições estarão no nosso backup. Como estamos usando um Sistema Dual Boot, o recomendado é criar backup das partições independentes, ou seja, backups separados. Já que nosso intuito é restaurar as partições separadas, e se caso quisermos atualizar o nosso backup de uma das partições, o processo será mais rápido, já que será apenas uma unidade. 



4 - Feito a escolha da partição, clique em Seguinte. Não marque a opção Fazer o backup sector a sector, senão a imagem da partição ficará do mesmo tamanho da unidade. Sem essa opção, o Acronis compactará apenas os arquivos existentes, no meu caso são 5,138Gbs e o arquivo final resultará em um arquivo bem menor que isso (1,89Gb).

Na próxima janela, na seção selecção do alvo, escolheremos a opção Criar novo arquivo de backup e em Localização do backup, podemos escolher onde será criada a imagem/backup da nossa partição. Aqui, também, é possível mudar o nome da imagem alterando o nome depois da ultima barra (\), mas preservando a extensão (*.tib). Tanto o nome da imagem quanto o seu destino também podem ser escolhidos através do botão Procurar. Digite primeiro o nome no campo Nome do ficheiro e só depois escolha a pasta de destino. (Sempre escolham outras unidades que não sejam as dos Sistemas Operacionais.)



5 - Na ultima janela será mostrado o resumo do que será feito, conferido tudo, cliquem em Concluir.



Agora é só esperar o término da operação.



Obs.: Não sei se isso influencia em alguma coisas mas, nos meus backups, eu fiz o da partição do Windows XP no Acronis instalado no Windows 7 e o do Windows 7, no Acronis do Windows XP.



RESTAURANDO UMA PARTIÇÃO 

QUANDO EU ME REFIRO A RESTAURAR UMA PARTIÇÃO NÃO TEM NADA A VER COM A RESTAURAÇÃO DO WINDOWS, TENHAM EM MENTE QUE, AO RESTAURAR\RECUPERAR USANDO O BACKUP, O ACRONIS IRÁ FORMATAR A UNIDADE EM QUESTÃO E SÓ DEPOIS IRÁ COPIAR OS ARQUIVOS DO BACKUP PARA A PARTIÇÃO SELECIONADA

Na janela principal escolha Recuperar > Os meus discos.



Na segunda janela escolha o backup que acabamos de fazer. No exemplo irei restaurar a unidade do Windows XP. Escolhida a unidade, cliquem emSeguinte. Caso o backup não esteja na lista, cliquem em Procurar e localizem o arquivo do backup.



Na próxima janela iremos escolher qual método de recuperação será utilizado. Escolham a primeira opção Recuperar disco completo e partições. 



Aqui podemos escolher recuperar apenas os arquivos da unidade e/ou o MBR. Por via das dúvidas escolhi os dois.



Nessa janela podemos escolher a letra da unidade, o tipo da partição e o tamanho da partição.



A única alteração que eu fiz o deixar 0 Mb livre antes da partição. Isso pode ser feito clicando em Alterar predefinição em Tamanho da partição. Pode ser digitando o zero, arrastando o primeiro botão deslizante para a esquerda ou usando o botões de quantidades.



Nas duas ultimas janelas não mexi em nada. Caso queira voltar uma etapa bastas clicar no nome da mesma que se encontra no painel esquerdo.
O programa pedirá para reiniciar. Façam isso.



Pronto. Agora é só esperar a Recuperação concluir para dizerem ADEUS a formatação do PC. O único trabalho que terão é atualizar alguns poucos programas de vez em quanto, caso usem um backup antigo. Então, é interessante ficarem atualizando (usar a opção update ou criar um novo backup) o backup sempre que instalarem\atualizarem vários programas como antivírus e etc.





E se nenhum dos Sistemas Operacionais estiverem mais iniciando, como recuperar?

O Acronis tem um ferramenta que cria um CD com uma cópia "Live"do programa, ou seja, inicializável (bootavel).
Para criá-la, escolha Ferramentas &Utilitários > Criar média de recuperação inicializável



Na janela que abrirá clique em Seguinte. Na próxima janela marque das duas opções. Nessa janela também podemos escolher o tempo, em segundos, para que o CD inicie a opção automaticamente caso não seja pressionado nenhuma tecla em seu menu. Depois de escolherem as opções, clique novamente em Seguinte e na próxima janela também. 



Agora, na quarta janela, escolha a opção Imagem ISO... e clique em Seguinte mais uma vez.



Na quinta janela escolha o nome da ISO e o local onde ela será criada.



Agora é só Concluir.



Espere o carregamento e clique em OK




AGORA, GRAVEM A ISO EM UM CD



Dando boot no CD 

Após iniciarem o CD do Acronis, escolha a primeira opção, esperar o carregamento do programa, escolher a opção Recuperação > Os Meus Discos, na próxima janela clicar em Procurar e escolherem o arquivo do backup, clicar em Seguinte e segam os passos para recuperar uma unidade.





Recomendações


Seria bem interessante que antes que coloquem em prática as informações que estou compartilhando, vocês usassem programas de limpeza de arquivos desnecessários, como o Ccleaner. Após fizerem isso, desfragmentem as unidades e o registro do Windows.

O Ccleaner tem uma opção legal, chamada Limpeza do Dispositivo. Ela, penso eu, apagará definitivamente todos os arquivos que já foram apagados da unidade. Mas escolham a opção APENAS ESPAÇO LIVRE. Acho que seria bom usar antes e/ou depois da desfragmentação. 

E NÃO SE ESQUEÇAM DE SALVAR OS ARQUIVOS PESSOAIS, COMO DOCUMENTOS, SALVE DE JOGOS, CONFIGURAÇÃO DE PROGRAMAS, FAVORITOS E PLUGUINS DOS NAVEGADORES E O QUE ACHAREM IMPORTANTE CONTIDO NAS UNIDADES DO SISTEMA OPERACIONAL QUE SERÁ RESTAURADO, POIS O ACRONIS IRÁ "TORRAR" TUDO QUE ESTIVER NA UNIDADE.

13 de agosto de 2012

Limpar o Cache do Squid 2.6


Limpar o Cache do Squid 2.6

Após notar algumas dificuldades em limpar o cache do squid 2.6 (Debian) resolvi colocar um passo-a-passo para facilitar a vida de todos =)

mãos a obra

abra o terminal e pare o serviço do squid

# /etc/init.d/squid stop

ou

# service squid stop

em seguida

acesse o diretório onde esta o cache e de o comando de exclusão total

# cd /var/spool/squid/

# rm -rf *

Agora reconstrua os diretórios

# squid -z

Inicie novamente os serviços

# /etc/init.d/squid start

ou

# service squid start

e pronto caso encerrado.

abraços a todos

Agora você pode criar seu próprio blog e fotolog sem auxílio de ninguém! Apenas assistindo a este curso interativo da Mega Infor Cursos, você cria seu blog e fotolog.

Pronto! Completo! Agora você pode criar seu próprio blog e fotolog sem auxílio de ninguém! Apenas assistindo a este curso interativo da Editora Europa, você cria seu blog e fotolog.



O curso é bem explicado com interação dinâmica o aluno tem como editar partes do próprio curso on-line para facilitar o aprendizado e também tem imagens passo-a-passo e narração das etapas; bem organizado e com instruções de uso da interface.



Acesse o site da empresa para pode ficar por dentro de todo o curso
www.megainforcursos.com




Título: Curso Interativo de Blogs e Flogs
Formato: Aplicativo Executável
Módulos: 5 + Links Grátis
Tamanho: 98,5 MB
Idioma: Português – BR
Descrição: Você aprenderá etapa por etapa a criar blogs no Blogger e Uol Blog. Aprenderá:
como utilizar o curso; o que são blogs e flogs; todas as etapas de criação a publicação no Blogger e Uol Blog; etapas da criação a personalização de seu fotolog (flog); divulgação de seu blog na web e diversos links de apoio grátis para melhorar seu aprendizado.

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

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