PROGRAM SINX(input,output); (* produced by Marcello Mengoni - www.mengoni.org *) uses crt,Graph; var grDriver : Integer; grMode : Integer; scala,colore,spc:integer; axa,axz,axc,axb,axx,axy:integer; x,y:real; valore:integer; (*************************************************************************) function POT(fpa,fpb:real):real; var fpc,fpe:integer; fpd:real; begin fpe:=trunc(fpb); fpd:=1; for fpc:=1 to fpe do fpd:=fpd*fpa; pot:=fpd end; function sgn(fs:real):integer; begin if fs<>0 then sgn:=trunc(fs/(abs(fs))) else sgn:=1 end; function fraz(ff:real):real; begin fraz:=ff-trunc(ff) end; function adattatore(getmaxx,scala:integer):integer; var faa,fac,fad,fae,fak:real; fab,faf,fag:integer; begin fag:=getmaxx; fak:=fag/2; faf:=0; repeat faa:=fak/scala; fab:=trunc(faa); fac:=faa-fab; if fac < 0.5 then fae:=0 else begin fab:=trunc(faa+1); fae:=1 end; fad:=abs(faa-fab); if fad < 0.5 then faf:=1 else begin if fae =1 then fak:=fak+1 else fak:=fak-1 end; until faf=1; adattatore:=fab end; procedure assi(getmaxx,getmaxy:integer); var paa,pab,pac,pad:integer; begin paa:=trunc(getmaxx/2); pab:=trunc(getmaxy/2); for pac:=1 to getmaxx do putpixel(pac,pab,15); for pad:=1 to getmaxy do putpixel(paa,pad,15) end; procedure unita(axc,getmaxx,getmaxy,scala:integer); var pua,pub,puc,pud,pue,puf,pug,puh,pui:integer; begin puc:=adattatore(getmaxx,scala); pue:=trunc(getmaxy/2)-3; puf:=trunc(getmaxx/2)-3; for pua:=1 to 5 do begin for pub:=-scala to (scala-1) do begin pud:=pub*puc+trunc(getmaxx/2); pui:=-(pub*puc)+trunc(getmaxy/2); pug:=pue+pua; puh:=puf+pua; putpixel(pud,pug,15); putpixel(puh,pui,15) end; end; end; procedure quesito(spazio,altezza:integer); var ascii:char; ch,decine,conta,potenza:integer; numero:array[1..6] of integer; begin decine:=0; repeat ch:=ord(readkey); if (ch>47) and (ch<58) then begin decine:=decine+1; numero[decine]:=ch-48; spazio:=spazio+10; ascii:=char(ch); outtextxy(spazio,altezza,ascii); end; until ch=13; valore:=0; for conta:=1 to decine do begin potenza:=decine-conta; valore:=valore+numero[conta]*trunc(pot(10,potenza)); end; end; (*************************************************************************) begin grDriver := Detect; InitGraph(grDriver,grMode,''); outtextxy(10,100,'dimmi la scala (standard = 11) '); quesito(270,100); scala:=valore; outtextxy(10,200,'dimmi di che colore vuoi la funzione (standard = 4) '); quesito(440,200); colore:=valore; InitGraph(grDriver,grMode,''); (*************************************************************************) assi(getmaxx,getmaxy); axz:=0; axc:=adattatore(getmaxx,scala); unita(axc,getmaxx,getmaxy,scala); for axa:=-scala to (scala-1) do begin for axb:=1 to axc do begin axx:=axa*axc+axb+trunc(getmaxx/2); x:=axa+(axb/axc); y:=sin(x); axy:=-(trunc(y)*axc+round(fraz(y)*axc))+trunc(getmaxy/2); putpixel(axx,axy,colore) end end; outtextxy(450,470,'RETURN per continuare'); (*************************************************************************) ReadLn; CloseGraph end.