Ir ao conteúdo
  • Cadastre-se

Python Transformar código em Pascal para Python


Posts recomendados

 

Olá pessoal

Sou bem leigo na programação e estou precisando da ajuda de alguém que tenha disponibilidade.

Tenho um script de um programa que me auxilia a realizar o cálculo da energia cinética de uma gota de chuva. Só que está em Pascal e gostaria de colocá-lo em python para rodar sem precisar de nenhum programa 

 

Se alguém puder ajudar converter me ajudaria muito, vou utilizar em aulas, então mais pessoas serão beneficiadas. Se eu tiver o script em python depois posso tentar fazer um layout bonitinho para disponibilizar para eles 

Desde já agradeço. Segue o script em pascal

 

USES CRT;

Const
	g = 9.81;
Var
	TxTArq                               		: text;
	i, j, n                                 			: integer;
	ch, fixatela                          			: char;
	K1, K2, K3, K4, EcN, EcS, 
	tempoPrec, t, dt, V, tfim, alt, 
	L, hb, deltaD, Ca, vou, PS, D, Ip		: real;

Procedure Entra_Dados;
begin
	clrscr; 	gotoxy(8,8);
	writeln('   FORNECA OS SEGUINTES DADOS: ');
	write('- Intensidade de Precipitacão, mm h-1.......  I  = ');readln(Ip);
	write('- Diâmetro medio das gotas; mm............  D  = ' );readln(D);
	write('- Pressão nos bicos,  PSI, ........................  P  = ');readln(PS);
	write('- Altura  do  Bico, m, .............................. H  = ');readln(hb);
	write('- Duração da precipitação, h,......... T  =); readln(tempoPrec);
end;

Function f ( a, b: real): real;
begin
	f :=  g - C2 * sqr(v) 
end;

Procedure Calcula_Velocidade;
begin
	t:= 0;
	dt:= 0.001;
	tfim:= 2;
	alt:= hb - 0.30;
	C2 := EXP(ln(0.4671)-0.9859 * ln(D));
	vou:= 0;
	vou:= 0.95 * sqrt((2 * 9.81) * (PS * (10/14.2)));
	v:= vou;
	deltaD:= 0;
	WHILE (t <= tfim) and (alt >= 0) do
	begin
		K1 := dt * f(t,v);
		K2 := dt * f(t + dt/2, v + K1/2);
		K3 := dt * f(t + dt/2, v + K2/2);
		K4 := dt * f(t + dt  , v + K3);
		t := t + dt;
		v := v + (1/6) * (K1 + 2 * K2 + 2 * K3 + K4);
		deltaD := v * dt;
		alt := alt - deltaD;
	end;
end;


Procedure Calcula_Energias_Cinetica;
	begin
		L:= Ip * tempoPrec;
		EcS:= ((sqr(v)*L)/2);
		EcN :=((2.27093 * (Ln(Ip)) + 17.124)) * L;
	end; 


Procedure Mostra_Resultados;
begin
	clrscr;
	gotoxy(14,2);
	writeln('-------------------------------------------------------------------');
	writeln('  DADOS DE ENTRADA:');
	writeln('- Intensidade de Precipitação...............I = ', Ip:3:1,' mm h-1');
	writeln('- Diâmetro metro medio das gotas .....D50 =  ', D:3:2,' mm');
	writeln('- Pressão nos bicos............................. PS =  ',PS:3:1,' PSI.');
	writeln('- Altura  do Bico ............................... Hb =  ',Hb:3:1,' m');
	write('- Duração da precipitação, h,.................T=);
         readln(tempoPrec);
	writeln('-------------------------------------------------------------------');
	gotoxy(14,12);
	writeln('-------------------------------------------------------------------');
	writeln('  DADOS DE SAIDA:');
	writeln;
	writeln('- Velocidade Inicial da gota ..........  vou  = ', vou:3:2,' m s-1');
	writeln('- Velocidade Final da gota ..............Vf  =  ', V :3:2,' m s-1');
	writeln('- Energia Cinética Simulada......... EcS = ', Ecs :3:2,' J m-2');
	writeln('- Energia Cinética da Chuva......... EcN = ',Ecn :3:2,' J m-2');
	writeln('- Relação EcS / EcN ............RE = ',(Ecs/Ecn)*100:3:0,' %');
	writeln('-------------------------------------------------------------------');
end;



BEGIN
	clrscr;
	Entra_Dados;
	Calcula_velocidade;
	Calcula_Energias_Cineticas;
	Mostra_Resultados;
	Fixatela := readkey;
END.

 

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

  • Membro VIP

@Jefferson Gomes Confessor, esse código não está compilando em Pascal. Faltou declarar umas variáveis e fechar algumas strings.

 

Tentei dar uma arrumada geral, segue:

{$CODEPAGE UTF8} //Uma forma de tentar conseguir imprimir palavras acentuadas
uses
  CRT;
const
  g = 9.81;
var
  //TxTArq: text;
  i, j, n: integer;
  //ch, fixatela: char;
  ch : char;
  C2, K1, K2, K3, K4, EcN, EcS, 
  tempoPrec, t, dt, V, tfim, alt, 
  L, hb, deltaD, Ca, vou, PS, D, Ip: real;

procedure Entra_Dados;
begin
  ClrScr; GotoXY(8,8);
  writeln('   FORNECA OS SEGUINTES DADOS: ');
  write  ('- Intensidade de Precipitacão, mm h-1.......  I  = '); readln(Ip);
  write  ('- Diâmetro medio das gotas; mm............  D  = ' ); readln(D);
  write  ('- Pressão nos bicos,  PSI, ........................  P  = '); readln(PS);
  write  ('- Altura  do  Bico, m, .............................. H  = '); readln(hb);
  write  ('- Duração da precipitação, h,......... T  ='); readln(tempoPrec);
end;

function f (a, b: real): real;
begin
  f := g - C2 * sqr(v) 
end;

procedure Calcula_Velocidade;
begin
  t := 0;
  dt := 0.001;
  tfim := 2;
  alt := hb - 0.30;
  C2 := EXP(ln(0.4671)-0.9859 * ln(D));
  vou := 0;
  vou := 0.95 * sqrt((2 * 9.81) * (PS * (10/14.2)));
  v := vou;
  deltaD := 0;
  while (t <= tfim) and (alt >= 0) do
  begin
    K1 := dt * f(t,v);
    K2 := dt * f(t + dt/2, v + K1/2);
    K3 := dt * f(t + dt/2, v + K2/2);
    K4 := dt * f(t + dt  , v + K3);
    t := t + dt;
    v := v + (1/6) * (K1 + 2 * K2 + 2 * K3 + K4);
    deltaD := v * dt;
    alt := alt - deltaD;
  end;
end;

procedure Calcula_Energias_Cinetica;
begin
  L := Ip * tempoPrec;
  EcS := ((sqr(v)*L)/2);
  EcN := ((2.27093 * (Ln(Ip)) + 17.124)) * L;
end; 

procedure Mostra_Resultados;
begin
  ClrScr;
  GotoXY(14,2);
  writeln('-------------------------------------------------------------------');
  writeln('  DADOS DE ENTRADA:');
  writeln('- Intensidade de Precipitação...............I = ', Ip:3:1,' mm h-1');
  writeln('- Diâmetro metro medio das gotas .....D50 =  ', D:3:2,' mm');
  writeln('- Pressão nos bicos............................. PS =  ', PS:3:1,' PSI.');
  writeln('- Altura  do Bico ............................... Hb =  ', Hb:3:1,' m');
  write  ('- Duração da precipitação, h,.................T='); readln(tempoPrec);
  writeln('-------------------------------------------------------------------');
  GotoXY(14,12);
  writeln('-------------------------------------------------------------------');
  writeln('  DADOS DE SAIDA:');
  writeln;
  writeln('- Velocidade Inicial da gota ..........  vou  = ', vou:3:2, ' m s-1');
  writeln('- Velocidade Final da gota ..............Vf  =  ', V:3:2, ' m s-1');
  writeln('- Energia Cinética Simulada......... EcS = ', Ecs :3:2, ' J m-2');
  writeln('- Energia Cinética da Chuva......... EcN = ', Ecn :3:2, ' J m-2');
  writeln('- Relação EcS / EcN ............RE = ', (Ecs/Ecn)*100:3:0, ' %');
  writeln('-------------------------------------------------------------------');
end;

BEGIN
  ClrScr;
  Entra_Dados;
  Calcula_velocidade;
  Calcula_Energias_Cinetica;
  Mostra_Resultados;
  ReadKey;
END.

 

 

Sobre a questão sobre converter (ou não) deixo para outros membros mais experientes tratarem. Favor aguardar.

 

 

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

@Simon Viegas Justamente Simon, eu nao estava conseguindo rodar ele. Vi que além da minha duvida, você também tem ajudado a responder muitas outras aqui no site, então te agradeço muito viu. Só de ter corrigido esse erro para mim já foi de imensa ajuda. Muito obrigado mesmo.

E para futuros leitores, eu estava querendo transformá-lo em python para criar um layout mais receptivo.

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

  • 7 meses depois...

@Jefferson Gomes Confessor Eu corrigi o programa em Pascal, está rodando e converti em Python, mas estão dando resultados diferentes.
Diferenças básicas: no Pascal a variáveis não são case-sensitive, já em Python são, encontrei esses problemas e resolvi, mas mesmo assim ainda dá erro no cálculo.

No Python usar variáveis globais não é recomendado, esse pode ser um dos problemas, tentei usar a palavra revervada 'global' nos procedimentos, mas mesmo assim, não calcula como o programa em Pascal.

E analisando mais a fundo a função 'f", tem os parâmetros 'a' e 'b', mas não são usados, 'f(a,b)' usa g e v, ambas convertidas em 'global', talvez seja ai o erro no cálculo.

Se você tiver a fórmula pura em "matematiquez" :), consigo corrigir pra você.

Mas resta saber se o programa em Pascal também está calculando certo, pois como eu disse a função 'f', não usa 'a' e 'b', mas são passados a ele.

Segue o programa em Pascal corrigido, compilei no FreePascal pra Linux e rodou, pra Windows não fiz, tem 20 anos q não uso ele :)!

Para Windows tem o Lazarus, versão do Delphi open source, você consegue compilar nele, inclusive depois fazer uma versão GUI e posteriormente uma versão para Android você consegue compilar nele também.

Segue a versão em Python 3.5+ na 2.x não roda!

Veja se descobre o erro, provavelmente é a função 'f'. Pois não ocorre a computação dos parâmetros passados.

Na versão Python deixei o código em Pascal comentado pra você ter uma referência.

Para comentar uma linha no Python use '#" (hashtag), pode ser usado no meio da linha, tudo q for escrito após será considerado comentário.

 

USES CRT;

Const
	g = 9.81;
Var
//	TxTArq : text;
//	i, j, n : integer;
//	ch, 
        Fixatela : char;
	K1, K2, K3, K4, EcN, EcS, 
	tempoPrec, t, dt, V, tfim, alt, 
//	L, hb, deltaD, Ca, vou, PS, D, Ip, : real;
	L, hb, deltaD, vou, PS, D, Ip, C2 : real;

Procedure Entra_Dados;
begin
//	clrscr; 
//        gotoxy(8,8);
	writeln('   FORNECA OS SEGUINTES DADOS: ');
	write('- Intensidade de Precipitacão, mm h-1.......  I  = ');readln(Ip);
	write('- Diâmetro medio das gotas; mm............  D  = ' );readln(D);
	write('- Pressão nos bicos,  PSI, ........................  P  = ');readln(PS);
	write('- Altura  do  Bico, m, .............................. H  = ');readln(hb);
	write('- Duração da precipitação, h,......... T  ='); readln(tempoPrec);
end;

Function f ( a, b: real): real;
begin
	f :=  g - C2 * sqr(v) 
end;

Procedure Calcula_Velocidade;
begin
	t:= 0;
	dt:= 0.001;
	tfim:= 2;
	alt:= hb - 0.30;
	C2 := EXP(ln(0.4671)-0.9859 * ln(D));
	vou:= 0;
	vou:= 0.95 * sqrt((2 * 9.81) * (PS * (10/14.2)));
	v:= vou;
	deltaD:= 0;
	WHILE (t <= tfim) and (alt >= 0) do
	begin
		K1 := dt * f(t,v);
		K2 := dt * f(t + dt/2, v + K1/2);
		K3 := dt * f(t + dt/2, v + K2/2);
		K4 := dt * f(t + dt  , v + K3);
		t := t + dt;
		v := v + (1/6) * (K1 + 2 * K2 + 2 * K3 + K4);
		deltaD := v * dt;
		alt := alt - deltaD;
	end;
end;


Procedure Calcula_Energias_Cinetica;
	begin
		L:= Ip * tempoPrec;
		EcS:= ((sqr(v)*L)/2);
		EcN :=((2.27093 * (Ln(Ip)) + 17.124)) * L;
	end; 


Procedure Mostra_Resultados;
begin
	clrscr;
//	gotoxy(14,2);
	writeln('-------------------------------------------------------------------');
	writeln('  DADOS DE ENTRADA:');
	writeln('- Intensidade de Precipitação...............I = ', Ip:3:1,' mm h-1');
	writeln('- Diâmetro metro medio das gotas .....D50 =  ', D:3:2,' mm');
	writeln('- Pressão nos bicos............................. PS =  ',PS:3:1,' PSI.');
	writeln('- Altura  do Bico ............................... Hb =  ',Hb:3:1,' m');
	write('- Duração da precipitação, h,.................T=');
         readln(tempoPrec);
	writeln('-------------------------------------------------------------------');
//	gotoxy(14,12);
	writeln('-------------------------------------------------------------------');
	writeln('  DADOS DE SAIDA:');
	writeln;
	writeln('- Velocidade Inicial da gota ..........  vou  = ', vou:3:2,' m s-1');
	writeln('- Velocidade Final da gota ..............Vf  =  ', V :3:2,' m s-1');
	writeln('- Energia Cinética Simulada......... EcS = ', Ecs :3:2,' J m-2');
	writeln('- Energia Cinética da Chuva......... EcN = ',Ecn :3:2,' J m-2');
	writeln('- Relação EcS / EcN ............RE = ',(Ecs/Ecn)*100:3:0,' %');
	writeln('-------------------------------------------------------------------');
end;

BEGIN
	clrscr;
	Entra_Dados;
	Calcula_velocidade;
	Calcula_Energias_Cinetica;
	Mostra_Resultados;
	Fixatela := readkey;
END.

 

Resultado do programa em Pascal:

-------------------------------------------------------------------
  DADOS DE ENTRADA:
- Intensidade de Precipitação...............I = 1.0 mm h-1
- Diâmetro metro medio das gotas .....D50 =  1.00 mm
- Pressão nos bicos............................. PS =  1.0 PSI.
- Altura  do Bico ............................... Hb =  1.0 m
- Duração da precipitação, h,.................T=1
-------------------------------------------------------------------
-------------------------------------------------------------------
  DADOS DE SAIDA:

- Velocidade Inicial da gota ..........  vou  = 3.53 m s-1
- Velocidade Final da gota ..............Vf  =  4.07 m s-1
- Energia Cinética Simulada......... EcS = 8.29 J m-2
- Energia Cinética da Chuva......... EcN = 17.12 J m-2
- Relação EcS / EcN ............RE =  48 %
-------------------------------------------------------------------

 

Python 3.5+

# USES CRT;
#from math import exp, log
from math import exp, log, sqrt
from os import system

# A função log sem o segundo parametro é o ln do Pascal, se quiser log10, é só fazer log( valor, 10)
def log10(valor):
    return log(valor,10)

# Funcao para limpar a tela, no Linux é diferente do Windows, Comente a linha do SO q você não quer
def clrscr():
    system('clear') # Linux
    #system('cls') # Windows
    
#Const
g = 9.81
#Var
TxTArq = ''
#i, j, n = 0 
# : integer;
#//	ch, 
Fixatela = '' # : char;
K1 = K2 = K3 = K4 = EcN = EcS = tempoPrec = t = dt = v = V = tfim = alt = L = hb = deltaD = vou = PS = Ip = C2 = 0.0 #: real;
Ip = D = 1.0

#writeln, write = print

#Procedure Entra_Dados;
def Entra_Dados():
#begin
    global Ip, D, PS, hb, tempoPrec
#//	clrscr;
    clrscr()
#//        gotoxy(8,8);
    print('   FORNECA OS SEGUINTES DADOS: ');
    Ip = float(input('- Intensidade de Precipitacão, mm h-1.......  I  = '))
    D = float(input('- Diâmetro medio das gotas; mm............  D  = ' ))
    print(f'D={D}')
    PS = float(input('- Pressão nos bicos,  PSI, ........................  P  = '))
    hb = float(input('- Altura  do  Bico, m, .............................. H  = '))
    tempoPrec = float(input('- Duração da precipitação, h,......... T  ='))
#end;

#Function f ( a, b: real): real;
def f( a, b):
#begin
#	f :=  g - C2 * sqr(v) 
    global C2, g, v
    return  g - C2 * sqrt(v) 
#end;

#Procedure Calcula_Velocidade;
def Calcula_Velocidade():
#begin
    global t, dt, tfim, alt, C2, vou, v, deltaD, K1, K2, K3, K4, alt
    t = 0;
    dt = 0.001;
    tfim = 2;
    alt = hb - 0.30;
    C2 = exp(log(0.4671)-0.9859 * log(D))
#    vou:= 0;
    vou = 0.95 * sqrt((2 * 9.81) * (PS * (10/14.2)));
    v = vou;
    deltaD = 0;
#    WHILE (t <= tfim) and (alt >= 0) do
    while (t <= tfim) and (alt >= 0):
#	begin
        K1 = dt * f(t,v);
        K2 = dt * f(t + dt/2, v + K1/2);
        K3 = dt * f(t + dt/2, v + K2/2);
        K4 = dt * f(t + dt  , v + K3);
        t = t + dt;
        v = v + (1/6) * (K1 + 2 * K2 + 2 * K3 + K4);
        deltaD = v * dt;
        alt = alt - deltaD;
#	end;
#end;

#Procedure Calcula_Energias_Cinetica;
def Calcula_Energias_Cinetica():
#	begin
    global L, EcS, EcN, Ip, tempoRec
    L = Ip * tempoPrec;
    EcS = ((sqrt(v)*L)/2);
    EcN = ((2.27093 * (log(Ip)) + 17.124)) * L;
#	end; 

#Procedure Mostra_Resultados;
def Mostra_Resultados():
#begin
#	clrscr;
    clrscr()
#//	gotoxy(14,2);
    global tempoRec
    print('-------------------------------------------------------------------');
    print('  DADOS DE ENTRADA:');
    print(f'- Intensidade de Precipitação...............I = {Ip:3.1f}  mm h-1');
    print(f'- Diâmetro metro medio das gotas .........D50 = {D:3.2f} mm');
    print(f'- Pressão nos bicos........................PS = {PS:3.1f} PSI.');
    print(f'- Altura  do Bico .........................Hb = {hb:3.1f} m');
#        readln(tempoPrec);
    tempoPrec = float(input(f'- Duração da precipitação, h,.............. T ='))
#	writeln('-------------------------------------------------------------------');
#//	gotoxy(14,12);
    print('-------------------------------------------------------------------');
    print('  DADOS DE SAIDA:');
    print(f'- Velocidade Inicial da gota ............vou = {vou:3.2f} m s-1');
    print(f'- Velocidade Final da gota ...............Vf = {v:3.2f} m s-1');
    print(f'- Energia Cinética Simulada..............EcS = {EcS:3.2f} J m-2');
    print(f'- Energia Cinética da Chuva..............EcN = {EcN:3.2f} J m-2');
    print(f'- Relação EcS / EcN ......................RE = {((EcS/EcN)*100):4.1f} %');
    print('-------------------------------------------------------------------');
#end;

#BEGIN
#	clrscr;
clrscr()
Entra_Dados()
Calcula_Velocidade()
Calcula_Energias_Cinetica()
Mostra_Resultados()
Fixatela = input()
#END.

 

Resultado em Python, veja q estão diferentes.

-------------------------------------------------------------------
  DADOS DE ENTRADA:
- Intensidade de Precipitação...............I = 1.0  mm h-1
- Diâmetro metro medio das gotas .........D50 = 1.00 mm
- Pressão nos bicos........................PS = 1.0 PSI.
- Altura  do Bico .........................Hb = 1.0 m
- Duração da precipitação, h,.............. T =1
-------------------------------------------------------------------
  DADOS DE SAIDA:
- Velocidade Inicial da gota ............vou = 3.53 m s-1
- Velocidade Final da gota ...............Vf = 4.99 m s-1
- Energia Cinética Simulada..............EcS = 1.12 J m-2
- Energia Cinética da Chuva..............EcN = 17.12 J m-2
- Relação EcS / EcN ......................RE =  6.5 %
-------------------------------------------------------------------

 

Espero ter ajudado!

[]'s

calc_energia_cinetica_gota_de_chuva.zip

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!