pila1

 

program pila1c;
(* esempi schematizzazione pile e ricerca polarita *)
(* controllo su simboli inseriti:solo con IDENTICA VALENZA *)
(* gestione analitica e grafica DIMOSTRATIVO completo *)
USES Memtypes,QuickDraw,OSIntf,ToolIntf;
const k=13;
      s1=' / ';s2=' // ';sp1=' (1+)  ';sp2=' (2+)  ';
      re='riduzione';ox='ossidazione';red='redox';
      fre='------->>>    ';
var n:array[1..k] of string;
    va:array[1..k] of integer;
    en:array[1..k] of real;
    s,a,v1,v2:integer; 
    e1,e2,anodo,catodo:string;
    en1,en2:real;   
    gPort:GrafPort;            
    ele1,ele2,cella,galva:rect;
procedure cancella; { cancella finestra}
begin
  EraseRect(gPort.portRect);
  FrameRect(gPort.portRect);
 end;
                
procedure fine;
begin
writeln('premi enter');
readln;
end;
procedure pausa;
begin
moveto(10,370);
writeln('premi ENTER ');readln;
end;
procedure grafica;
BEGIN
{inizializzazione sottoprogrammi o routine}
   InitGraf(@thePort);      
   initfonts;
   InitCursor;
   HideCursor;
   OpenPort(@gPort);     
   PenPat(white);
   BackPat(black);
  textsize(10);
  textfont(9);
  textface([outline]);
   EraseRect(gPort.portRect);
   FrameRect(gPort.portRect);
 end;
 
 procedure testo(x,y:integer;frase:string);
 begin
 moveto(x,y);drawstring(frase);
 end;
  
 
 procedure disegna;
 begin
 grafica;
  setrect(ele1,100,100,150,300);
  fillrect(ele1,gray);
  testo(90,90,anodo);
  setrect(ele2,300,100,350,300);
  fillrect(ele2,white);
  testo(360,90,catodo);
  setrect(cella,70,150,380,350);
  framerect(cella);
  setrect(galva,200,50,225,75);
  frameoval(galva);
  moveto(125,100);lineto(125,60);lineto(200,60);
  moveto(325,100);lineto(325,60);lineto(225,60);
  testo(20,20,'anodo :polo negativo-->ossidazione');
  testo(300,20,'catodo:polo positivo-->riduzione');
  testo(200,90,'voltmetro ');
  testo(180,40,'--- moto elettroni ---> ');
  pensize(10,10);
  moveto(225,140);lineto(225,340);
  testo(100,370,'soluzione elettrolitica (es.solfato di..)');
  testo(360,370,anodo);testo(380,370,',');testo(400,370,catodo);
  testo(90,330,'cationi di ');testo(160,330,anodo);
  testo(290,330,'cationi di ');testo(360,330,catodo);
  testo(100,340,'setto poroso che separa due semipile');
  testo(110,310,'<<<---moto radicali anionici(SO4--) ---');
  pausa;
  end; 
    
procedure datipile;
begin
n[1]:='Zn';va[1]:=2;en[1]:=-0.76;
n[2]:='Cu';va[2]:=2;en[2]:=0.34;
n[3]:='Fe';va[3]:=2;en[3]:=-0.44;
n[4]:='Sn';va[4]:=2;en[4]:=-0.14;
n[5]:='Ni';va[5]:=2;en[5]:=-0.24;
n[6]:='Pb';va[6]:=2;en[6]:=-0.13;
n[7]:='Co';va[7]:=2;en[7]:=-0.28;
n[8]:='Li';va[8]:=1;en[8]:=-3.02;
n[9]:='K';va[9]:=1;en[9]:=-2.92;
n[10]:='Na';va[10]:=1;en[10]:=-2.71;
n[11]:='Ag';va[11]:=1;en[11]:=0.80;
n[12]:='Cd';va[12]:=2;en[12]:=-0.40;
n[13]:='H';va[13]:=1;en[13]:=0.00;
end;
procedure cerca1;
begin
datipile;
for a:=1 to k do
if e1=n[a] then begin en1:=en[a];v1:=va[a];end;
end;
procedure cerca2;
begin
datipile;
for a:=1 to k do
if e2=n[a] then begin en2:=en[a];v2:=va[a];end;
end;
procedure polarita;
begin
writeln('anodo o polo negativo  = ',anodo:8,' ossidazione ');
writeln('catodo o polo positivo = ',catodo:8,' riduzione ');
pausa;
end;
procedure schema1;
begin
writeln(anodo,s1,anodo,sp1,s2,catodo,sp1,s1,catodo);
pausa;
end;
procedure schema2;
begin
writeln(anodo,s1,anodo,sp2,s2,catodo,sp2,s1,catodo);
pausa;
end;
procedure annulla;
begin
v1:=10;v2:=10;
end;
procedure reazioni1;
begin
writeln(anodo,' - ':12,1,'e   ',fre:8,anodo,sp1,'  ',ox);
writeln(catodo,sp1,' + ':5,1,'e   ',fre:8,catodo,'   ',re);
writeln('-------------------------------------------------------------');
writeln(anodo,' + ':12,catodo,sp1,fre:8,anodo,sp1,'  + ',catodo,'  ',red);
pausa;
end;
procedure reazioni2;
begin
writeln(anodo,' - ':12,2,'e   ',fre:8,anodo,sp2,'   ',ox);
writeln(catodo,sp2,' + ':5,2,'e   ',fre:8,catodo,'   ',re);
writeln('-------------------------------------------------------------');
writeln(anodo,' + ':12,catodo,sp2,fre:8,anodo,sp2,'  +  ',catodo,'  ',red);
pausa;
end;
procedure tensione;
begin
writeln('differenza potenziale pila = Eo(+) - Eo(-) ');
writeln(abs(en1-en2):8:2);
pausa;
end;
procedure simboli;
begin
datipile;
for a:=1 to k do
write(n[a],'..');
writeln;
for a:=1 to k do
write(va[a],'...');
writeln;
end;
procedure pro1;
begin
datipile;
writeln('simbolo  ':15,'valenza  ':15,'elettronegativita  ':30);
writeln;
for a:=1 to k do
begin 
 writeln(n[a]:15,va[a]:15,en[a]:30:2);
 end;
 writeln;
 pausa;
 end;
 
procedure pro2;
label salta;
begin
writeln('elementi disponibili in archivio dati per scelta simboli ');
writeln;
simboli;
writeln('scegliere elementi con stessa valenza 1,1...2,2 ');
writeln;
write('simbolo primo   elettrodo     ');readln(e1);
writeln;
cerca1;if v1=10 then begin writeln('elementi non validi ');goto salta;end;
write('simbolo secondo elettrodo     ');readln(e2);
cerca2;if v2=10 then begin writeln('elementi non validi ');goto salta;end;
if v1<>v2 then begin
writeln('elementi con valenza diversa:non validi ');goto salta;end;
writeln('stampa simboli elementi,valenza,elettronegativita ');
writeln('simbolo':12,'valenza':12,'volt':12,'simbolo':12,'valenza':12,'volt':12);
writeln(e1:12,v1:12,en1:12:2,e2:12,v2:12,en2:12:2);
pausa;
if en1<en2 then begin anodo:=e1;catodo:=e2;end
else begin anodo:=e2;catodo:=e1;end;
polarita;
if v1=1 then schema1 else schema2;
if v1=1 then reazioni1 else reazioni2;
tensione;
salta:
annulla;
end;
procedure pro4;
begin
pro1;clearscreen;pro2;clearscreen;disegna;
end;
procedure scelta;
var ancora:integer;
begin
clearscreen;
grafica;
writeln('seleziona opzione ');
writeln('1...tabella simboli,potenziali,valenze ');
writeln('2...schema pile,polarita,semireazioni,redox ');
writeln('3...disegnare la pila precedentemente selezionata');
writeln('4...sequenza automatica dimostrazione ');
writeln('9...fine ');
write('opzione=');readln(s);
clearscreen;
case s of
1:pro1;
2:pro2;
3:disegna;
4:pro4;
9:fine;
end;
EraseRect(gPort.portRect);
writeln('----------------------------');
writeln('altro problema o DISEGNO della pila:scrivi 1...fine:scrivi 2 ');
readln(ancora);
if ancora =1 then scelta else fine;
end;
begin
clearscreen;
anodo:='Zn';catodo:='Cu';
writeln('programma:schemi pile ,ricerca polarita,reazioni redox');
writeln('---------------------------------------------------');
writeln('premi enter');readln;
scelta;
end.