Info2/2008tavasz/kuka

A MathWikiből
(Változatok közti eltérés)
1. sor: 1. sor:
== 6. előadás (2008-03-28) ==
+
A tárgy főoldala: [[info2/2008tavasz]]
 +
A tárgy oktatásához felhasznált, http://wiki.math.bme.hu/ -n belüli wikioldalak [http://en.wikipedia.org/wiki/GNU_Free_Documentation_License GNU FDL] licenc vagy (választás szerint) [http://hu.wikipedia.org/wiki/Creative_commons CC-BY-SA-2.0] licenc szerint szabadon használhatók és terjeszthetők.
  
=== Ami az eddigiekből kimaradt ===
+
== 8. előadás (2007-04-04) ==
  
==== Felsorolások (enumerátorok), az enum adattípus ====
+
=== Objektum-orientált programozás ===
  
<code>enum</code> ''típusazonosító'' {''felsorolás''} ''változók'';
 
  
enum hetkoznap {hetfo, kedd, szerda, csutortok, pentek};
+
Néhány új fogalom:
enum Boolean {true, false} elment=false;
+
...
+
enum hetkoznap fogorvos=szerda;
+
fogorvos=pentek;
+
...
+
elment=true;
+
  
Automatikusan 0-tól sorszámozódó int típusok. Az érték megválasztható:
+
* osztály (a C-beli struktúratípusnak felel meg)
 +
* objektum (a C-beli struktúrának felel meg)
 +
* attribútum (a C-beli struktúramezőnek felel meg)
 +
* metódus (a C-beli függvénynek felel meg)
  
enum t_vegu_szamjegyek {ot=5, hat, het};
+
Osztály ''class'' (síkidom), osztálypéldány ''class instance'' = objektum ''object'' (kör, téglalap), konstruktor ''constructor'' (új objektum létrehozása), objektum azonosító (object identifier - object ID), példány változó ''instance variable'' (mely az objektum állapotát/tulajdonságait tartalmazza, pl. középpont), példány metódus ''instance method'' (),  
  
''típusazonosító'' nélküli ''egyszer használatos'' felsorolások:
+
=== Ruby nyelv ===
  
enum {tegnap, ma, holnap} mikor=ma;
+
A Ruby '''interpretált''', '''szkriptnyelv''' (interpretált, és minden rendszer szintű szolgáltatáshoz hozzá lehet férni).  
...
+
mikor=holnap;
+
  
==== typedef -- típus definiálása ====
+
A Ruby osztályhierarchiája hasonló a biológiai törzsfához. Például a gerincesek (osztály) törzsén belül a madarak (osztály) osztályának egy alosztálya a pacsirta (osztály) nevű faj, melynek egy példánya a Csipcsip nevű kismadarunk (objektum), aki nem mellesleg egy pacsirta. Őt jellemezhetjük különböző tulajdonságai alapján; ezek az attribútumok. Például: él-e még? , mennyire éhes, hogy hívják a párját, stb. Tehát bizonyos tulajdonságait megadjuk, amik csak rá jellemzőek.
  
Definiáljuk a Gauss-egészek struktúráját:
+
                      Változók                                Konstansok és
 +
Lokális        Globális        Példány        Osztály        osztály nevek
 +
 +
valtozo        $valami        @nev            @@osztvalt      PI
 +
joEjt_2        $_              @XY            @@N            String
  
struct Gauss_egesz {
 
  int x;
 
  int y;
 
} a, b;
 
  
Legyen egy ilyen típusunk:
+
=== feltételes és ciklusutasítások ===
  
typedef struct Gauss_egesz GEtipus;
+
==== if ====
GEtipus a, b;
+
  
vagy összeolvasztva:
+
Először then-nel, majd újsorral elválasztva:
  
  typedef struct Gauss_egesz {
+
  if x==2 then x += 1 end
  int x;
+
  int y;
+
} GEtipus;
+
GEtipus a, b;
+
  
 +
if x==2
 +
  x += 1
 +
end
  
==== esetszétválasztás (switch/case/default) ====
+
if x==2; x += 1 end
  
Az if-else csak kétfelé elágazást enged, a switch többfelé:
+
==== else ====
  
  switch(ch) {
+
  if x==2 then x += 1 else x += 2 end
  case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
+
    printf("decimális");
+
    break;
+
  case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+
    printf("hexadecimális");
+
    break;
+
  default:
+
    print("nem számjegy");
+
}
+
  
==== Feltételes kifejezés ====
+
if x==2
 +
  x += 1
 +
else
 +
  x += 2
 +
end
  
a feltételes művelet ''ternér művelet'', azaz 3 argumentuma van.
+
==== elsif ====
  
''feltétel'' ? ''kifejezés_1'' : ''kifejezés_2''
+
if x == 1
 +
  "hetfo"
 +
elsif x == 2
 +
  "kedd"
 +
elsif x == 3 then "szerda"
 +
else "hetvege"
 +
end
  
Például:
+
==== if kifejezésben ====
  
  z = x<y ? x : y;
+
  x = if y == 1
 +
      3
 +
    else
 +
      4
 +
    end
  
Ami a következő kóddal ekvivalens:
+
x = 4
 +
x = 3 if y == 1
  
  if(x<y)
+
==== unless ====
   z = x;
+
 
 +
  unless x <= 4
 +
   "nagyobb, mint 4"
 +
end
 +
 
 +
unless x <= 4
 +
  "nagyobb, mint 4"
 
  else
 
  else
   z = y;
+
   "nem nagyobb"
 +
end
 +
 
 +
x = unless x <= 4 then 5 end
 +
 
 +
x = 5 unless x <= 4
 +
 
 +
 
 +
 
 +
Matmul Ruby nyelven:
 +
 
 +
a=[[1,2],                #megadjuk az 'a' mátrixot
 +
    [3,4],
 +
    [5,6]]
 +
 +
b=[[7],                  #megadjuk a 'b' mátrixot
 +
    [8]]
 +
 +
ab=[]                    #létrehozzuk az üres szorzatmátrixot
 +
i=0; while i<a.size;    #'' while'' ciklust nem véletlenül használunk, mivel Rubyban nincs ''for'' ciklus
 +
  ujsor=[]
 +
  j=0; while j<b[0].size;
 +
    x=0
 +
    k=0; while k<b.size
 +
      x+=a[i][k]*b[k][j]
 +
      ujsor[j]=x
 +
    end
 +
  ab[i]=ujsor
 +
end
 +
 
 +
Objektum-orientáltan kezdtünk programozni Ruby nyelven, a Sikidom, BBox és Kor osztályok kerültek fel a táblára.
 +
 
 +
class BBox
 +
  attr_accessor :llx, :lly, :urx, :ury
 +
end
 +
 +
class Sikidom
 +
  def bbox()
 +
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
 +
  end
 +
  def kerulet()
 +
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
 +
  end
 +
  def terulet()
 +
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
 +
  end
 +
end
 +
 +
class Kor <Sikidom
 +
  attr_accessor :cx, :cy, :r
 +
  def bbox()
 +
    b=BBox.new
 +
    b.llx=@cx-@r; b.lly=@cy-@r
 +
    b.urx=@cx+@r; b.ury=@cy+@r
 +
    return b  # a return fölösleges
 +
  end
 +
  def kerulet()
 +
    Math::PI*2*@r
 +
  end
 +
  def terulet()
 +
    Math::PI*@r*@r
 +
  end
 +
end
 +
 
 +
 
 +
==== Iterátorok ====
  
=== Állapottér, állapotgép (automata) ===
+
Az
  
Ld. Szeberényi Imre [http://www.fsz.bme.hu/~szebi/slides/c5_gy_sz.pdf egyik] vagy
+
>> [1,2,3].each {|i| p i}
[http://www.fsz.bme.hu/~szebi/slides/C7/sld033.htm másik] anyagában.
+
1
 +
2
 +
3
 +
=> [1, 2, 3]
 +
>> [1,2,3].map {|i| i**2}
 +
=> [1, 4, 9]
 +
>> [1,2,3].inject {|sum, i| sum + i}
 +
=> 6

A lap 2008. április 24., 09:35-kori változata

A tárgy főoldala: info2/2008tavasz A tárgy oktatásához felhasznált, http://wiki.math.bme.hu/ -n belüli wikioldalak GNU FDL licenc vagy (választás szerint) CC-BY-SA-2.0 licenc szerint szabadon használhatók és terjeszthetők.

Tartalomjegyzék

8. előadás (2007-04-04)

Objektum-orientált programozás

Néhány új fogalom:

  • osztály (a C-beli struktúratípusnak felel meg)
  • objektum (a C-beli struktúrának felel meg)
  • attribútum (a C-beli struktúramezőnek felel meg)
  • metódus (a C-beli függvénynek felel meg)

Osztály class (síkidom), osztálypéldány class instance = objektum object (kör, téglalap), konstruktor constructor (új objektum létrehozása), objektum azonosító (object identifier - object ID), példány változó instance variable (mely az objektum állapotát/tulajdonságait tartalmazza, pl. középpont), példány metódus instance method (),

Ruby nyelv

A Ruby interpretált, szkriptnyelv (interpretált, és minden rendszer szintű szolgáltatáshoz hozzá lehet férni).

A Ruby osztályhierarchiája hasonló a biológiai törzsfához. Például a gerincesek (osztály) törzsén belül a madarak (osztály) osztályának egy alosztálya a pacsirta (osztály) nevű faj, melynek egy példánya a Csipcsip nevű kismadarunk (objektum), aki nem mellesleg egy pacsirta. Őt jellemezhetjük különböző tulajdonságai alapján; ezek az attribútumok. Például: él-e még? , mennyire éhes, hogy hívják a párját, stb. Tehát bizonyos tulajdonságait megadjuk, amik csak rá jellemzőek.

                      Változók                                 Konstansok és
Lokális        Globális        Példány         Osztály         osztály nevek

valtozo        $valami         @nev            @@osztvalt      PI
joEjt_2        $_              @XY             @@N             String


feltételes és ciklusutasítások

if

Először then-nel, majd újsorral elválasztva:

if x==2 then x += 1 end
if x==2 
  x += 1 
end
if x==2; x += 1 end

else

if x==2 then x += 1 else x += 2 end
if x==2 
  x += 1 
else 
  x += 2
end

elsif

if x == 1
  "hetfo"
elsif x == 2
  "kedd"
elsif x == 3 then "szerda"
else "hetvege"
end

if kifejezésben

x = if y == 1
      3
    else
      4
    end
x = 4
x = 3 if y == 1

unless

unless x <= 4
  "nagyobb, mint 4"
end
unless x <= 4
  "nagyobb, mint 4"
else
  "nem nagyobb"
end
x = unless x <= 4 then 5 end
x = 5 unless x <= 4


Matmul Ruby nyelven:

a=[[1,2],                #megadjuk az 'a' mátrixot
   [3,4],
   [5,6]]

b=[[7],                  #megadjuk a 'b' mátrixot
   [8]]

ab=[]                    #létrehozzuk az üres szorzatmátrixot
i=0; while i<a.size;     # while ciklust nem véletlenül használunk, mivel Rubyban nincs for ciklus
  ujsor=[]
  j=0; while j<b[0].size;
    x=0
    k=0; while k<b.size
      x+=a[i][k]*b[k][j]
      ujsor[j]=x
   end
 ab[i]=ujsor
end

Objektum-orientáltan kezdtünk programozni Ruby nyelven, a Sikidom, BBox és Kor osztályok kerültek fel a táblára.

class BBox
  attr_accessor :llx, :lly, :urx, :ury
end

class Sikidom
  def bbox()
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
  end
  def kerulet()
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
  end
  def terulet()
    fail  # még nem tudjuk megírni, a Sikidom túl absztrakt
  end
end

class Kor <Sikidom
  attr_accessor :cx, :cy, :r
  def bbox()
    b=BBox.new
    b.llx=@cx-@r; b.lly=@cy-@r
    b.urx=@cx+@r; b.ury=@cy+@r
    return b  # a return fölösleges
  end
  def kerulet()
    Math::PI*2*@r
  end
  def terulet()
    Math::PI*@r*@r
  end
end


Iterátorok

Az

>> [1,2,3].each {|i| p i}
1
2
3
=> [1, 2, 3]
>> [1,2,3].map {|i| i**2}
=> [1, 4, 9]
>> [1,2,3].inject {|sum, i| sum + i}
=> 6
Személyes eszközök