Info2/2008tavasz/zh

A MathWikiből
A lap korábbi változatát látod, amilyen Wettl (vitalap | szerkesztései) 2008. április 27., 19:26-kor történt szerkesztése után volt.

Tartalomjegyzék

A második ZH

Időpont, hely: április 30 16-17, Ka.26

ZH papíron, használható a 2-oldalas Ruby Quick Ref

A ZH témája objektum-orientált programozás Ruby nyelven.

Mit kell ismerni

if, else, elsif, if kifejezésekben, ?:, unless, case/when/else, === és szerepe a case-ben, while, until, for/in, iterátorok: times, upto, downto, each, map/collect, inject, each_with_index break/next,

Mely beépített metódusokat kell ismerni az egyes osztályokból

  • Object
    • class (pl. 5.class)
    • methods (5.methods)
  • Float
    • abs + - * < <= == != >= > <=> ** (a <=> az összahasonlítás után -1/0/1 értéket ad vissza)
  • Fixnum
    • abs + - * < <= == != >= > <=> << >> **
  • Bignum
    • (semmit)
  • Integer
    • (semmit)
  • String
    • + =~ !~ chomp chomp! reverse upcase upcase! downcase downcase! reverse reverse!
  • Array
    • [] []= + - each size << max min sort sort! include?
  • Class
    • superclass
  • TrueClass
    • && || ! == !=
  • FalseClass
    • && || ! == !=
  • NilClass
    • == !=
  • Hash
    • [] []= keys values size delete each_pair
  • Regexp
    • (semmit)
  • Math
    • sqrt PI

p, print, puts.

Hogy a fentiek mit csinálnak, annak itt lehet utánanézni: http://www.ruby-doc.org/core/

Mintafeladatok

1. Mit ad vissza a Ruby az alábbi kifejezésekre

1<2 && 2<4
2 & 7
"#{n=6; n+=1}"
'pi = %.5f' % Math::PI
?a
'a'[0]
'abcd'[0]
123.to_s
17.5.to_i
"17.5".to_i
12.to_f
"alma korte szilva barack".gsub(/([^\s]+)/,'(\1)')
'10-99'.succ

2. Írjuk a nev változóban megadott nevet egy több sorból álló email nevű sztring megadott helyére!


9. Írj sortores nevű függvényt, mely egy sztringet megadott sorszélességűre tördel. Ez azt jelenti, hogy egy sor sem lehet a megadott szélességnel szélesebb, hacsak nincs a sorban egyetlen szóköz vagy TAB karakter sem. Minden sor a lehető legszélesebb legyen a megadott határon belül. A tördelés csak szóköz vagy TAB karakter helyén lehet (a korábbi újsor karaktereket meg kell tartani). Ha a sortörés helyén több szóköz/TAB karakter van, azokat csak egyetlen újsor karakterre cseréljük! A függvénynek két argumantuma legyen, első egy sztring, a második opcionális, mely alapértelmezésben 70, és amely a sorszélességet adja meg. (Használjuk a gsub metódust, és reguláris kifejezéseket!)

11. Szimuláljunk 6 kockadobást, és adjuk össze a dobott számokat!

12. Írja át az alábbi kódot úgy, hogy @a<=@b mindig teljesüljön. Ha a hívó olyan helyzetet akarna előidézni, amely megsérti a fenti feltételt, akkor cserélje fel a változók értékét!

class Intervallum
  attr_accessor :a, :b
  def initialize(a, b)
    @a=a; @b=b
  end
end

Útmutatás: írja meg az a= és a a= metódusokat! attr_accessor helyett mit kell írni?

13. Írjon Ruby-programot palindrom.rb néven, amely beolvassa a bemenet sorait, és kiírja a palindrom sorokat. Egy string palindrom, ha a megfordítása önmaga. Segítség: beolvasás után, de még összehasonlítás előtt az s.chomp! hívással törölje a soremelést a string végéről. A beolvasás elvégezhető a STDIN.each_line iterátorral.

14. Írjon Ruby-programot palindromlehet.rb néven, amely beolvassa a bemenet sorait, és kiírja azokat a sorokat, melyekben a betűk átrendezésével palindrom string készíthető. Egy string palindrom, ha a megfordítása önmaga. 1. segítség: beolvasás után, de még összehasonlítás előtt az s.chomp! hívással törölje a soremelést a string végéről. 2. segítség: vágja szét betűkre/rendezze/ragassza össze a sztring karaktereit az s=s.split().sort.join hívással.

Megoldások

2. Egy lehetséges megoldás:

nev = "Kati"
email = <<END
Kedves #{nev}!
Szeretettel gondolunk...
...
Pista
END

9.

def sortores( s, sorszelesseg = 70 )
  s.gsub(/(.{1,#sorszelesseg}})(\s+|\z)/,"\\1\n")
end

11.

(Array.new(6) {rand(6) + 1}).inject {|s,i| s + i}

vagy

a = Array.new(6) {rand(6) + 1}
a.inject {|s,i| s + i}

12. A feladatban megadott kód eredményeként létrejön egy "a", "b", "a=" és egy "b=" metódus is. Teszteljük le irb-ben:

i=Intervallum.new(2,4)
i.methods
i.a
i.a=1
i.a

A feladat megoldása:

class Intervallum
  attr_reader :a, :b    # ide most elég attr_reader
  def initialize(a, b)
    if a < b
      @a=a; @b=b
    else
      @a=b; @b=a
    end
  end
  def a=(a)             
    if a <= @b
      @a=a
    else
      @a=@b
      @b=a
    end
  end
  def b=(b)
    if @a <= b
      @b=b
    else
      @b=@a
      @a=b
    end
  end
end

13.

STDIN.each_line do |s|
  s.chomp!
  if s == s.reverse
    puts s
  end
end

14. Mintamegoldás:

def palindromlehet(s)
  s=s.chomp.split(//).sort.join
  # i db karaktert vizsgáltunk meg
  # a megvizsgált karakterek küzül az utolsó j db azonos
  i=1; j=1; k=0;
  while i<s.size
    if (s[i]==s[i-1])
      j+=1
    else
      if (j%2==1)
        k+=1
      end
      j=1
    end
    i+=1
  end
  if (j%2==1)
    k+=1
  end
  k<2
end

STDIN.each_line { |s|
  if palindromlehet(s)
    print s
  end
}
Személyes eszközök