Clu példaprogramok

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.c

Ezek 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 letrehoz

feltolt=proc(k: cvt, s:stream) signals (rossz_szam(int))
 w:string:=""
 sz:int

 k.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 feltolt

elemei=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 elemei

atlag=proc(k:kep) returns(int)
 sum:int:=0

 for e:int in kep$elemei(k) do
  sum:=sum+e
 end

 return(sum/tomb$size(down(k).adat))

end atlag
 

kiirx=proc(s:stream,k:cvt)
 stream$putl(s,int$unparse(k!get_x))
end kiirx

kiiry=proc(s:stream,k:cvt)
 stream$putl(s,int$unparse(k!get_y))
end kiiry

kiir=proc(s:stream,k:cvt)
 i:int:=1
 j:int:=1

 while 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: end

end 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 kuszobindex

end 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")
 end

 kep$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