Program gas5;
 (* esempi problemi sui GAS  INTERATTIVO con valutazione*) 
 (* dati da inserire da libro o foglio *)
 uses memtypes,quickdraw,OSintf,tooLIntf,fixmath;
 const r=0.082;
       v1='volume in litri-------------=';
       p1='pressione in atmosfere------=';
       t1='temperatura in kelvin-------=';
       g1='massa in grammi-------------=';
       m1='peso molecolare-------------=';
       tipo1='calcola pressione in atmosfere e in mmHg ';
       tipo2='calcola volume in litri e in cc.';
       tipo3='calcola temperatura in kelvin e centigradi';
       tipo4='calcola massa in grammi e Kg e numero moli';
       tipo5='calcola peso molecolare del gas ';
       ris1='pressione in atmosfere-- =';
       ris2='pressione in mmHg--------=';
       ris3='volume in litri----------=';
       ris4='volume in cc-------------=';
       ris5='massa in grammi----------=';
       ris6='massa in Kg--------------=';
       ris7='temperatura in kelvin----=';
       ris8='temperatura in centigradi=';
       ris9='peso molecolare----------=';
       ris10='numero di moli----------=';
   VAR    ris,rip,nmoli,numoli,dx1,dx2,dx3:real;
          p,v,g,t,hg,tc,tk,cc,Kg,pm1:real;
          a,esatte,errate,totale,pm:integer;
          tipo:string;
procedure cancella;
begin
clearscreen;
end;
procedure pausa;
begin
writeln('premi ENTER ');readln;
end;
procedure fine;  
begin
writeln('fine operazione:confermare :premi enter');
readln;
end;
procedure analisi1(risx,ripx:real);
var k:integer;
begin
k:=1;
dx1:=abs(risx-ripx);
writeln('differenza tra valore atteso e valore inserito=',dx1:0:5);
if ((dx1<k) or (dx1=k)) 
then begin writeln('ESATTO');esatte:=esatte+1;end
else begin writeln('ERRATO');errate:=errate+1;end;
end;
procedure analisi2(risx,ripx,ris2,rip2:real);
var k:integer;
begin
k:=2;
dx1:=abs(risx-ripx);dx2:=abs(ris2-rip2);
writeln('differenza tra valore atteso e valore inserito=',dx1:0:5);
writeln('differenza tra valore atteso e valore inserito=',dx2:0:5);
if (((dx1<k) or (dx1=k)) and ((dx2<k) or (dx2=k)))
then begin writeln('ESATTO');esatte:=esatte+1;end
else begin writeln('ERRATO');errate:=errate+1;end;
end;

procedure analisi3(risx,ripx,ris2,rip2,ris3,rip3:real);
var k:integer;
begin
k:=1;
dx1:=abs(risx-ripx);dx2:=abs(ris2-rip2);dx3:=abs(ris3-rip3);
writeln('differenza tra valore atteso e valore inserito=',dx1:0:5);
writeln('differenza tra valore atteso e valore inserito=',dx2:0:5);
writeln('differenza tra valore atteso e valore inserito=',dx3:0:5);
if (((dx1<k) or (dx1=k)) and ((dx2<k) or (dx2=k)) and ((dx3<k) or (dx3=k)))
then begin writeln('ESATTO');esatte:=esatte+1;end
else begin writeln('ERRATO');errate:=errate+1;end;
end;
procedure spiega1;
begin
writeln('----------------------------------------------------------');
writeln('confronta con risultato atteso e passaggi da eseguire');
writeln('trasformo gradi centigradi in  kelvin :K = 273 +C  = ',tk:0:3);
writeln('----------------------------------------------------------');
writeln('*************** applico la formula P = m*R*T/PM*V = ',p:0:3);
writeln('----------------------------------------------------------');
writeln('trasformo atmosfere in mmHg : Hg = atmosfere*760 = ',hg:0:3);
writeln('----------------------------------------------------------');
end;
procedure spiega2;
begin
writeln('----------------------------------------------------------');
writeln('confronta con risultato atteso e passaggi da eseguire');
writeln('trasformo gradi centigradi in  kelvin :K = 273 +C  = ',tk:0:3);
writeln('----------------------------------------------------------');
writeln('****************applico la formula V = m*R*T/PM*P = ',v:0:3);
writeln('----------------------------------------------------------');
writeln('trasformo litri  in  cc : cc = litri*1000 = ',cc:0:3);
writeln('----------------------------------------------------------');
end;
procedure dati(tipo,v1,t1,g1,p1,ris1,ris2:string);
begin
writeln(tipo);
writeln('usando i dati assegnati:R = 0.082 ');
writeln('formula generale PV=mRT/PM ');
writeln('---------------------------------------------------------');
write(v1);readln(v);
write(t1);readln(t);
write(g1);readln(g);
write(m1);readln(pm);
end;
procedure pressione;
begin
tk:=tc+273;
writeln('----------------------------------------------------------');
writeln('scrivi il risultato ottenuto o scrivi 0 se non lo sai');
write(ris1);readln(ris);
write(ris2);readln(rip);
p:=(g*R*tk)/(pm*v);hg:=p*760;
analisi2(p,ris,hg,rip);
pausa;cancella;
end;
procedure volume;
begin
writeln('scrivi il risultato ottenuto o scrivi 0 se non lo sai');
write(ris3);readln(ris);
write(ris4);readln(rip);
v:=(g*R*tk)/(pm*p);cc:=v*1000;
analisi2(v,ris,cc,rip);
pausa;cancella;
end;
procedure gradi(tipo:string);  
begin
writeln(tipo);
writeln('usando i dati assegnati:R = 0.082 ');
writeln('formula generale PV=mRT/PM ');
writeln('---------------------------------------------------------');
write('volume in litri ----------------=');readln(v);
write('pressione in atmosfere P -------=');readln(p);
write('massa in grammi---------------=');readln(g);
write('peso molecolare-----------------=');readln(pm);
writeln('----------------------------------------------------------');
writeln('scrivi il risultato ottenuto o scrivi 0 se non lo sai');
write('risultato kelvin     = ');readln(ris);
write('risultato centigradi = ');readln(rip);
t:=(p*v*pm)/(R*g);tc:=t-273;
analisi2(t,ris,tc,rip);
writeln('----------------------------------------------------------');
writeln('confronta con risultato atteso e passaggi da eseguire');
writeln('----------------------------------------------------------');
writeln('*****************applico la formula T = P*V*PM/R*m= ',t:0:3);
writeln('----------------------------------------------------------');
writeln('trasformo gradi kelvin in centigradi :C = K - 273 = ',tc:0:3);
writeln('----------------------------------------------------------');
pausa;cancella;
end;
procedure massa(tipo:string);  
begin
writeln(tipo);
writeln('usando i dati assegnati:R = 0.082 ');
writeln('formula generale PV=mRT/PM ');
write('volume in litri ------------------=');readln(v);
write('pressione in atmosfere P ---------=');readln(p);
write('temperatura in kelvin------------ =');readln(t);
write('peso molecolare-------------------=');readln(pm);
writeln('----------------------------------------------------------');
writeln('scrivi il risultato ottenuto o scrivi 0 se non lo sai');
write('risultato  grammi = ');readln(ris);
write('risultato  Kg     = ');readln(rip);
write('risultato  moli   = ');readln(nmoli);
g:=(p*v*pm)/(R*t);kg:=g/1000;numoli:=g/pm;
analisi3(g,ris,Kg,rip,numoli,nmoli);
writeln('----------------------------------------------------------');
writeln('confronta con risultato atteso e passaggi da eseguire');
writeln('----------------------------------------------------------');
writeln('*****************applico la formula m = P*V*PM/R*T= ',g:0:3);
writeln('----------------------------------------------------------');
writeln('trasformo i grammi in Kg : Kg = grammi/1000 = ',kg:0:3);
writeln('----------------------------------------------------------');
writeln('calcolo numero moli: moli = massa/PM = ',numoli:0:3);
writeln('----------------------------------------------------------');
pausa;cancella;
end;
procedure mole(tipo:string); 
begin
writeln(tipo);
writeln('usando i dati assegnati:R = 0.082 ');
writeln('formula generale PV=mRT/PM ');
writeln('---------------------------------------------------------');
write('volume in litri ------------------=');readln(v);
write('pressione in atmosfere P ---------=');readln(p);
writeln('temperatura in kelvin---------- =');readln(t);
writeln('massa in grammi      ---------- =');readln(g);
writeln('----------------------------------------------------------');
writeln('scrivi il risultato ottenuto o scrivi 0 se non lo sai');
write('risultato PM   = ');readln(ris);
pm1:=(g*R*t)/(p*v);analisi1(pm1,ris);
writeln('----------------------------------------------------------');
writeln('confronta con risultato atteso e passaggi da eseguire');
writeln('***************applico la formula PM = m*R*T/P*V = ',pm1:0:3);
writeln('----------------------------------------------------------');
pausa;cancella;
end;
procedure pro1;
begin
dati(tipo1,v1,t1,g1,m1,ris1,ris2);pressione;spiega1;
end;
procedure pro2;
begin
dati(tipo2,p1,t1,g1,m1,ris3,ris4);volume;spiega2;
end;
procedure pro3;
begin
tipo:='calcolare la temperatura in gradi kelvin e centigradi';
gradi(tipo);
end;
procedure pro4;
begin
tipo:='calcolare la massa in grammi e in Kg e numero di MOLI';
massa(tipo);;
end;
procedure pro5;
begin
tipo:='calcolare peso molecolare ';
mole(tipo);
end;
procedure scelta;  
var s,sn:string;opzione:integer;
begin
clearscreen;
writeln('seleziona opzione :');
writeln('1...calcolo PRESSIONE:interattivo');
writeln('2...calcolo VOLUME:interattivo');
writeln('3...calcolo TEMPERATURA:interattivo');
writeln('4...calcolo MASSA e numero MOLI:interattivo');
writeln('5...calcolo PESO MOLECOLARE:interattivo');
writeln('9...fine ');
writeln('scelta =');readln(opzione);clearscreen;
case opzione of
1:pro1;2:pro2;3:pro3;4:pro4;5:pro5;
9:fine;
end;
writeln('altra operazione?Esperimenti?:premi S...fine:premi N '); readln(sn);
if ((sn='S') or (sn='s')) then scelta ;
end;
begin            
cancella;
esatte:=0;errate:=0;
writeln('esempi proposti e commentati di problemi sui gas ');
writeln('applicando la legge generale PV=nRT = gRT/PM ');
writeln('e le formule derivate inverse :scrivere la risposta');
writeln('se decimali,usare 4 cifre DECIMALI');
pausa;
scelta;
totale:=esatte+errate;
writeln('risposte esatte =',esatte ,' su domande ',totale);
writeln('risposte errate =',errate ,' su domande ',totale);
pausa;
end.