Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Procedures, iniciei agora e quero algumas explicações mais profundas :D


Posts recomendados

Program Pzim ;
Var Numero: Real; Procedimento: Char;
////
Procedure Raiz;
Var Resultado: Real;
Begin
  Resultado:= Sqrt(Numero);
  Writeln('A raiz quadrada de  ', Numero:2:1,'  é  =  ', Resultado:2:2);
end;
Procedure Potencia;
Var Resultado: Real;
Begin
  Resultado:= Exp(Numero*ln(Numero));
  Writeln('A Potencia de  ',Numero:2:1,'  por ele mesmo é:  ', Resultado:2:2);
end;
////
Begin
  Writeln('  P   PARA POTENCIA E   R   PARA RAIZ');
  Writeln;
  Writeln('Digite qual procedimento deseja usar: '); Readln(Procedimento);
  Writeln('Digite o numero: '); Readln(Numero);
  Case (Upcase(Procedimento)) of
    'P': Potencia;
    'R': Raiz;
  End;
  Readln;
end.

Quero saber o que uma procedure faz generalizada, e como ela é mais usada

Link para o comentário
Compartilhar em outros sites

Vamos ao básico!

 

Quando você cria um programa simples, ele vai ser o seu procedimento principal.

Program Nada;	{ Esse e o nome do seu procedimento principal, que no caso e o seu programa }
uses  { Inclui uma biblioteca. só o procedimento principal pode usar essa diretiva }
  Crt;
{ Tudo abaixo de uses vai nessa sequencia, Não é obrigatoria mas e bom seguir. }
(* Constants *)

(* Types *)

(* Vars *)

(* Procedures *)

(* Funtions *)


begin
  writeln('Hell world....');
  readln;
end.

Da para notar uma pequena semelhança com um procedimento comum

Program Nada;
uses
  Crt;

procedure GotoHell;	{ Não use goto ;) }
begin
  	writeln('Hell world');
	readln;
end;

begin
    GotoHell;
end.

Isso significa que você pode ter procedimentos dentro de procedimentos.

Program Nada;
uses
  Crt;

procedure GotoHell;	{ Não use goto ;) }
procedure Paarou;
begin
	readln;
end;
begin
  	writeln('Hell world');
	Paarou;
end;

begin
    GotoHell;
end.

Podendo seguir a mesma estrutura do programa principal (Tirando a parte do uses).

 

Qualquer coisa estamos aí (Eu acho que compliquei mais do que expliquei).

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

8 minutos atrás, AnonymousLPH disse:

Por que não usar Goto? Vá para.

Ele quebra o fluxo o programa e deixa um pouco mais difícil de depurar.

adicionado 9 minutos depois

Do jeito que eu explique ficou meio confuso.

então pegue duas apostilas que explicam melhor, leia a "apostila de turbo pascal 7" lá pra pagina 63 e a "Linguagem pascal avancado" na pagina 54.

Support.zip

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Complementando sobre "procedimentos dentro de procedimentos":

Program Nada;
uses
  Crt;
procedure GotoHell;
  procedure Paarou; //esse procedimento só existe dentro do GotoHell
    begin
      readln;
    end;
  begin
    writeln('Hell world');
    Paarou;
  end;
begin
  GotoHell;
  Paarou; //não vai funcionar, pois o programa principal não exerga ele
end.

 

Ou seja: foi apenas um exemplo que possível criar procedimentos/funções dentro de outra.

 

Outra funcionalidade:

Program Nada;
uses
  Crt;
procedure UmNomeQualquer; //esse procedimento é global. Todo o programa o exerga
  begin
  writeln('Estou executando a proceure global');;
  end;

procedure GotoHell;
  procedure UmNomeQualquer; //esse procedimento só existe dentro do GotoHell
    begin
    writeln('Estou executando a procedure local');
    end;
  begin
  writeln('Hell world');
  UmNomeQualquer; //vai invocar a procedure do escopo mais próximo (a local)
  end;
begin
GotoHell;
UmNomeQualquer; //vai invocar a procedure global, pois nem enxerga a local
readln;
end.

 

Vai aparecer na tela:

Hell world
Estou executando a proceure local
Estou executando a proceure global

Perceba que deixei (propositalmente) os dois procedimentos com o mesmo nome, pois como o escopo externo não enxerga o interno, não dá erro. Já no escopo interno, mesmo já existindo um igual, o programa vai permitir criar uma novo procedimento, pois ele só será utilizado internamente. Essa característica serve por exemplo para não precisamos nos preocupar com o que já tem no mundo externo... os procedimentos ficam independentes, dá mesma forma que você pôde usar a mesma nomenclatura Resultado nos 2 procedimentos e não deu erro, será possível criar procedimento internos com o mesmo nome que outro procedimento interno de outra função qualquer (o procedimento não se importa).

 

 

Outra forma interessante de utilizar esses comandos é definindo recebendo os dados necessário por parâmetro, ex.:

program Pzim;

var 
  numero :real;
  procedimento :char;
  
procedure raiz(x :real);
  var
    resultado :real;
  begin
  resultado := sqrt(x);
  writeln('A raiz quadrada de ', x:2:2,' é = ', resultado:2:3);
  end;
  
procedure potencia(x :real);
var
  resultado :real;
  begin
  resultado := exp(x * ln(x));
  writeln('A potencia de ', x:2:2,' por ele mesmo é: ', resultado:2:3);
  end;
  
begin
writeln('  P   PARA POTENCIA E   R   PARA RAIZ');
writeln();
writeln('Digite qual procedimento deseja usar: '); Readln(Procedimento);
writeln('Digite o numero: '); Readln(Numero);
case (Upcase(Procedimento)) of
  'P' :potencia(numero);
  'R' :raiz(numero);
end; //fim case
readln();
end.

 

Obs.: eu coloquei como x, mais poderia utilizar numero que também iria funcionar, ou seja: as variáveis que estão nos parâmetros são também locais, desta forma podendo ter a mesma nomenclatura de uma global que vai não vai dar conflito. Serão duas variáveis distintas (apenas eventualmente com o mesmo nome).

 

Uma vantagem de utilizar parâmetros é que você pode reutilizar esse procedimento em outro programas e nem precisará alterar algo.. ele tem tudo que precisa.

 

 

Outra forma, utilizando funções:

program Pzim;

var 
  numero :real;
  procedimento :char;
  
function raiz(x :real):real;
  begin
  raiz := sqrt(x);
  end;
  
function potencia(x :real):real;
  begin
  potencia := exp(x * ln(x));
  end;
  
begin
writeln('  P   PARA POTENCIA E   R   PARA RAIZ');
writeln();
writeln('Digite qual procedimento deseja usar: '); Readln(Procedimento);
writeln('Digite o numero: '); Readln(Numero);
case (Upcase(Procedimento)) of
  'P' :begin
       potencia(numero);
       writeln('A potencia de ', numero:2:2,' por ele mesmo é: ', potencia(numero):2:3);
       end;
  'R' :begin
       raiz(numero);
       writeln('A raiz quadrada de ', numero:2:2,' é = ', raiz(numero):2:3);
       end;
end; //fim case
readln();
end.

Obs.: o fato de ter tirado o resultado da estrutura, foi apenas porque pôde ser feito sem... não tem relação por ter mudado de procedure para function.

 

Perceba que function e procedure são a mesma* coisa, apenas diferem que a primeira sempre retorna algo nela mesma. Já a segundo, não... tanto são iguais*,  que em outras linguagens como Java, C#, C etc, não tem diferenciação...  lá é tudo como uma funtcion, daí o que você não quer retornar algo, define como void (ausência de retorno). Entende? Se o Pascal seguisse a mesma lógica de outras principais linguagens, seria algo como:

function raiz(x :real):void;

:)

 

Por aí vai.

  • Curtir 1
  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...