listati per programmi in turbo pascal

gas

iso.pto , isoterma.pro

 


program iso;
(* legge isoterma dei gas boyle *)
(* disco 65 dispensa 49 \tu53\ con turbo pascal v.5 *)

uses crt,graph;
type string15=string[20];
type vet=array[1..800] of byte;

var   k,v1,v2,p1,sosta,codice,y:integer;
      varia,volume,pressione,volume1,vs1,vs2,ps1,ps2,ps3,ks:string15;
      stantu,mano:vet;
      p2,px:real;

procedure presenta;
begin
writeln('legge dei gas:isoterma o di boyle');
writeln;
writeln('per una determinata massa gassosa,di qualsiasi natura');
writeln('se si mantiene la temperatura costante');
writeln('e si varia la pressione del gas o il volume a disposizione');
writeln('il prodotto tra la pressione e il volume rimane costante');
writeln;
writeln('la costante varia in funzione dei valori iniziali');
writeln('PRESSIONE * VOLUME = COSTANTE ');
writeln('pressione e volume sono inversamente proporzionali P=K/V ');
writeln;
writeln('premi return,prego');readln;clrscr;
writeln('provare prima con valori indicati,per maggiore evidenziazione:');
writeln('per valori fuori del campo si assume volume=400..pressione=1');
writeln;
writeln('volume...310..400..600.800...900 pressione..1..10..20..50..100');
writeln('indica volume iniziale da comprimere:');
writeln('volume >= 310 e <=900,intero,multiplo di 10 ');readln(v1);
if (v1<310) then v1:=400;
if (v1>900) then v1:=400;
writeln('indica pressione iniziale del gas da comprimere:valori interi');
readln(px);
p1:=trunc(px);
if (p1<1) or (p1>100) then p1:=1;
p1:=trunc(p1);
writeln('indica velocita simulazione:10=veloce..500=lento..');readln(sosta);
writeln('premi return,prego');readln;clrscr;
end;

procedure leggi;
begin
writeln('leggi ricavate dalla osservazione');
writeln('a temperatura costante,per una determinata massa gassosa');
writeln('indipendentemente dalla sua natura,');
writeln('il prodotto tra la pressione e il volume rimane costante');
writeln;
writeln('premi return,prego');
readln;clrscr;
end;


procedure grafica(f:integer);   (* attiva pagina grafica*)
(* coordinate finestra,colore sfondo e disegno *)
var sc,tp:integer;
    stringa:string;

begin
 sc:=0;                         (* valore risoluzione 0,1,2,3,4,5,8,9 *)
 tp:=0;                         (* valore valido 1 - 0 palette *)
 stringa:='c:\';                (* indica ove cercare GRAPH *)
 initgraph(sc,tp,stringa);      (* attiva scheda grafica *)
 setbkcolor(f);                 (* colore sfondo *)
end;

procedure testo(x,y:integer;nome:string); (* stampa legenda testo *)
begin
 outtextxy(x,y,nome);
 setcolor(14);
end;

procedure pausa;                (* premere return per proseguire *)
var ch:char;
begin
testo(10,430,'premi return,prego');
 ch:=readkey;
 setcolor(1);
 testo(10,430,'premi return,prego');
 setcolor(14);
end;

procedure stantuffo;
begin
setfillstyle(1,14);
bar(20,20,117,30);
getimage(20,20,117,30,stantu);
setfillstyle(1,2);
bar(200,20,217,30);
getimage(200,20,217,30,mano);
setfillstyle(1,1);
bar(20,20,117,30);
setfillstyle(1,1);
bar(200,20,217,30);
end;

procedure cella;
begin
 str(v1,vs1);
 str(v2,vs2);
 str(p1,ps1);
 str(p2,ps2);
 setlinestyle(0,0,3);
 testo(10,10,'cilindro con stantuffo mobile');
 testo(10,30,'gas sottoposto a compressione');
 testo(300,10,'manometro e variazione pressione');
 testo(300,30,'del gas in condizioni isoterme');
 testo(10,60,'volume iniziale='+vs1);
 testo(10,420,'volume finale='+vs2);
 testo(300,60,'pressione finale='+ps2);
 testo(270,420,'pressione iniziale='+ps1);
 setcolor(5);
 testo(300,80,'pressione*volume=K:'+ks);
 setcolor(4);
 rectangle(100,90,200,410);
 rectangle(238,90,260,410);
 rectangle(200,400,238,410);
 settextstyle(0,1,1);
 testo(80,150,'volume in diminuzione');
 testo(280,150,'pressione in aumento');
 settextstyle(0,0,0);
end;

procedure muove;
var n,u:integer;
begin
 for n:=0 to 290 do         (* volume totale 300*)
 begin
  u:=100+n;
  putimage(103,u,stantu,1);
  putimage(240,490-u,mano,0);
  if (n=50) or (n=100) or (n=150) or (n=200) or (n=250) then delay(3000);
  delay(sosta);
  putimage(103,u,stantu,1);
 end;
 putimage(103,u,stantu,1);
end;


procedure gradua;
var n,u:integer;
begin
setcolor(2);
n:=100;
for u:=0 to 300 do
begin
 str(v1-u,volume);
 str(k/(v2+u),ps2);
 str(v2+u,volume1);
 line(220,100,220,410);
 setcolor(2);
 if (u/10=trunc(u/10)) then testo (470,n,volume);
 setcolor(14);
 if (u/10=trunc(u/10)) then line (210,n,230,n);
 if (u/5=trunc(u/5)) then line (215,n,225,n);
 if (u/10=trunc(u/10)) then testo (10,n,volume);
 setcolor(4);
 if (u/10=trunc(u/10)) then testo (440,n,volume1);
 setcolor(4);
 if (u/10=trunc(u/10)) then testo (290,n,ps2);
 if (u/10=trunc(u/10)) then n:=n+10;
end;
end;

procedure grafico;
var a,v:integer;
begin
 setcolor(2);
 line(500,410,500,80);
 line(500,410,620,410);
 testo(510,80,'v.i.='+vs1);
 setcolor(2);
 testo(450,420,'p.f.='+ps3);
 v:=1;
 line(521,400,521,100);
 for a:=1 to 100 do
 begin
 putpixel(520+a,400-trunc(100/v),14);
 line(520+a,400,520+a,400-trunc(100/v));
 v:=v+1;
 end;
end;

procedure spiega;
begin
writeln('interpretazione del fenomeno e delle sue leggi ');
writeln('secondo la teoria cinetica');
writeln;
writeln('la pressione del gas dipende dalla frequenza e dalla energia');
writeln('degli urti delle parricelle presenti nel contenitore:');
writeln('la energia rimane costante se rimane costante la temperatura');
writeln('la frequenza degli urti aumenta se aumenta la densita');
writeln('mediante riduzione del volume a disposizione');
writeln;
writeln('arrivederci:premi return,prego');
pausa;
end;

 begin                    (* programma principale *)
 clrscr;
 presenta;leggi;         (* eliminabile *)
 v2:=v1-300;
 k:=v1*p1;
 p2:=(k/v2);
 str(p2,ps3);
 str(k,ks);
 grafica(1);              (* attiva pagina grafica *)
 cella; gradua;stantuffo;muove;grafico;
 pausa;
 textmode(2);
 spiega;                  (* eliminabile *)
 end.

program isoterma;
(* legge isoterma dei gas boyle *)
(* disco 65 dispensa 49 \tu53\ con turbo pascal v.5 *)

uses crt,graph;
type string15=string[20];
type vet=array[1..800] of byte;

var   sosta,codice,y:integer;
      varia,volume,pressione,volume1:string15;
      stantu,mano:vet;

procedure presenta;
begin
writeln('legge dei gas:isoterma o di boyle');
writeln('premi return,prego');readln;clrscr;
end;

procedure leggi;
begin
writeln('leggi ricavate dalla osservazione');
writeln;
writeln('premi return,prego');
readln;clrscr;
end;


procedure grafica(f:integer);   (* attiva pagina grafica*)
(* coordinate finestra,colore sfondo e disegno *)
var sc,tp:integer;
    stringa:string;

begin
 sc:=0;                         (* valore risoluzione 0,1,2,3,4,5,8,9 *)
 tp:=0;                         (* valore valido 1 - 0 palette *)
 stringa:='c:\';                (* indica ove cercare GRAPH *)
 initgraph(sc,tp,stringa);      (* attiva scheda grafica *)
 setbkcolor(f);                 (* colore sfondo *)
end;

procedure testo(x,y:integer;nome:string); (* stampa legenda testo *)
begin
 outtextxy(x,y,nome);
 setcolor(14);
end;

procedure pausa;                (* premere return per proseguire *)
var ch:char;
begin
testo(10,430,'premi return,prego');
 ch:=readkey;
 setcolor(1);
 testo(10,430,'premi return,prego');
 setcolor(14);
end;

procedure stantuffo;
begin
setfillstyle(1,14);
bar(20,20,117,30);
getimage(20,20,117,30,stantu);
setfillstyle(1,2);
bar(200,20,217,30);
getimage(200,20,217,30,mano);
setfillstyle(1,1);
bar(20,20,117,30);
setfillstyle(1,1);
bar(200,20,217,30);
end;

procedure cella;
begin
 setlinestyle(0,0,3);
 testo(10,10,'cilindro con stantuffo mobile');
 testo(10,30,'gas sottoposto a compressione');
 testo(300,10,'manometro e variazione pressione');
 testo(300,30,'del gas in condizioni isoterme');
 testo(10,80,'volume iniziale');
 testo(10,420,'volume finale');
 testo(300,80,'pressione finale');
 testo(300,420,'pressione iniziale');
 setcolor(5);
 testo(450,80,'volume*pressione=K');
 setcolor(4);
 rectangle(100,90,200,410);
 rectangle(238,90,260,410);
 rectangle(200,400,238,410);
 settextstyle(0,1,1);
 testo(80,150,'volume in diminuzione');
 testo(280,150,'pressione in aumento');
 settextstyle(0,0,0);
end;

procedure muove;
var n:integer;
begin
 for n:=90 to 390 do         (* volume totale 300*)
 begin
  putimage(103,n,stantu,1);
  putimage(240,480-n,mano,0);
  delay(sosta);
  putimage(103,n,stantu,1);
 end;
 putimage(103,n,stantu,1);
end;

procedure gradua;
var n:integer;
      p:real;
begin
setcolor(2);
p:=30;
for n:=100 to 390 do
begin
 str(400-n,volume);
 str(300-(390-n),volume1);
 str(p,pressione);
 line(220,100,220,410);
 if (n/10=trunc(n/10)) then line (210,n,230,n);
 if (n/5=trunc(n/5)) then line (215,n,225,n);
 if (n/10=trunc(n/10)) then testo (10,n,volume);
 if (n/10=trunc(n/10)) then testo (470,n,volume1);
 if (n/10=trunc(n/10)) then testo (300,n,pressione);
 if (n/10=trunc(n/10)) then testo (500,n,pressione);
 if (n/10=trunc(n/10)) then p:=p-1;
end;
end;

procedure spiega;
begin
writeln('interpretazione del fenomeno e delle sue leggi ');
writeln('secondo la teoria cinetica');
writeln;
writeln('arrivederci:premi return,prego');
pausa;
end;

 begin                    (* programma principale *)
 clrscr;
 grafica(1);              (* attiva pagina grafica *)
 cella;
 sosta:=100;
 gradua;
 stantuffo;
 muove;
 pausa;
 end.