Kép típus:A CLU programozási nyelv a típusmegvalósítás egyik hatékony eszköze.
A példánk egy egyszerû kép típust valósít meg. Egy kép képpontokból áll, és minden képpontot a színével reprezentálunk, ami egy 0 es 256 közötti egész szám. A képpontokat mátrix formában adjuk meg. A kép alakjára nincs kikötés.A megvalósítás:
A mátrixot egy recordban implementáljuk, ami tartalmazza a kép méreteit (x,y), és egy vektorban sorfolytonosan a képpontokat.
A record es a vektor mutable objektumok.A típushoz tartozó függvények:
letrehoz |
Egy új képet hoz létre |
feltolt |
Egy tetszõleges streambõl (egy file-ból, vagy a képernyõrõl) olvassa be a képet. |
elemei |
Egy iterátor, ami felsorolja a képpontokat |
atlag |
Kiszámolja a képpontok értékeinek átlagat. |
kiir |
Kiírja a képet egy tetszõleges streambe (file-ba, vagy a képernyõre) |
kiirx |
Kiírja a kép x koordinátáját egy tetszõleges streambe (file-ba, vagy a képernyõre) |
kiiry |
Kiírja a kép y koordinátáját egy tetszõleges streambe (file-ba, vagy a képernyõre) |
kuszobindex |
Egy meghatározott küszöbérték alapján a képet "fekete-fehérre" konvertálja, azaz a küszöbnél kisebb értékek 0-k lesznek, a nagyobbak pedig 256-ok. |
A fõprogram:Az in.txt file-ból beolvassa a képet, átlagolja az értékeket, ezzel az átlaggal, mint küszöbértékkel fekete fehér képet készit, amit az out.txt file-ba, és a képernyõre is kiír.
A program fordítása és futtatása:
A program az augusta.inf.elte.hu ELTE-s szerveren fordítható a következõ parancsokkal:
use_clu2c
clu2c kep.clu
clulink -o kep kep.cEzek után a program a ./kep paranccsal futtatható.
Készítette: Fazekas Ágota ( gota@elte.hu ), Pelikán Dóra ( peli@elte.hu )
2000. június 15.
kep = cluster is letrehoz,feltolt,elemei,atlag,kiir,kiirx,kiiry,kuszobindex
tomb = array[int]
% x, y: a kep merete
% adat: a kep elemei egy vektorban
rep = record[x,y:int,adat:tomb]letrehoz=proc() returns (cvt)
return (rep${x:0,y:0,adat:tomb$new()})
end letrehozfeltolt=proc(k: cvt, s:stream) signals (rossz_szam(int))
w:string:=""
sz:intk.x:=int$parse(stream$getl(s))
k.y:=int$parse(stream$getl(s))
while ~stream$empty(s) do
c:char := stream$peekc(s) % nezi a kovetkezo karaktert
if c <= '9' cand c >= '0' then
w := w || string$c2s(c) %c-t stringge konvertalja, es osszefuzi
% w-vel
elseif c=' ' cor c='\n' then
sz:=int$parse(w)
if sz<0 cor sz>256 then
signal rossz_szam(sz) % rossz_szam exceptiont valt ki
else
tomb$addh(k.adat,sz) % a w-t integerre alakitja, es
end % elmenti a tomb megfelelo helyere
w:=""
else
break
end
stream$getc(s)
end
end feltoltelemei=iter(k:cvt) yields(int)
i:int:=tomb$low(k.adat)
while true do
yield(k.adat[i])
except when bounds: return end
i:=i+1
end
end elemeiatlag=proc(k:kep) returns(int)
sum:int:=0for e:int in kep$elemei(k) do
sum:=sum+e
endreturn(sum/tomb$size(down(k).adat))
end atlag
kiirx=proc(s:stream,k:cvt)
stream$putl(s,int$unparse(k!get_x))
end kiirxkiiry=proc(s:stream,k:cvt)
stream$putl(s,int$unparse(k!get_y))
end kiirykiir=proc(s:stream,k:cvt)
i:int:=1
j:int:=1while i<=k.x do
while j<=k.y do
stream$puts(s,int$unparse(k.adat[(i-1)*k.y+j])||" ")
j:=j+1
end
stream$putl(s,"")
i:=i+1
j:=1
end
except when bounds: endend kiir
kuszobindex=proc(k:cvt,kuszob:int)
i:int:=tomb$low(k.adat)
while true do
if (k.adat[i]<kuszob) then
k.adat[i]:=0
else
k.adat[i]:=256
end
except when bounds: return end
i:=i+1
end
end kuszobindexend kep
% foprogram
start_up=proc()
be:file_name:=file_name$create(working_dir(),"in","txt","")
f1:stream :=stream$open(be,"read")ki:file_name:=file_name$create(working_dir(),"out","txt","")
delete_file(ki)
f2:stream :=stream$open(ki,"write")o:stream:=stream$primary_output()
e:stream:=stream$error_output()k:kep:=kep$letrehoz()
kep$feltolt(k,f1)
except when rossz_szam(sz:int):
stream$puts(e,int$unparse(sz)||" nem megfelelo szam \n")
endkep$kiir(o,k)
kep$kuszobindex(k,kep$atlag(k))kep$kiirx(f2,k)
kep$kiiry(f2,k)
kep$kiir(f2,k)
stream$putl(o,"")
kep$kiir(o,k)
end start_up