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.