Info2/2008tavasz/zh

A MathWikiből
(Változatok közti eltérés)
53. sor: 53. sor:
 
=== Mintafeladatok ===
 
=== Mintafeladatok ===
  
1. Szimuláljunk 6 kockadobást, és adjuk össze a dobott számokat!
+
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. Írja át az alábbi kódot úgy, hogy <code>@a<=@b</code> 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!
+
2. Írjuk a <code>nev</code> változóban megadott nevet egy több sorból álló <code>email</code> nevű sztring megadott helyére!
 +
 
 +
 
 +
 
 +
9. Írj <code>sortores</code> 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 <code>@a<=@b</code> 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
 
  class Intervallum
 
   attr_accessor :a, :b
 
   attr_accessor :a, :b
62. sor: 83. sor:
 
   end
 
   end
 
  end
 
  end
 +
Útmutatás: írja meg az <code>a=</code> és a <code>a=</code> metódusokat! <code>attr_accessor</code> helyett mit kell írni?
  
3. Í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 <code>s.chomp!</code> hívással törölje a soremelést a string végéről. A beolvasás elvégezhető a
+
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 <code>s.chomp!</code> hívással törölje a soremelést a string végéről. A beolvasás elvégezhető a
 
<code>STDIN.each_line</code> iterátorral.
 
<code>STDIN.each_line</code> iterátorral.
  
4. Í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 <code>s.chomp!</code> 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 <code>s=s.split('').sort.join</code> hívással.
+
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 <code>s.chomp!</code> 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 <code>s=s.split('').sort.join</code> hívással.
  
 
=== Megoldások ===
 
=== Megoldások ===
1.
+
 
 +
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}
 
  (Array.new(6) {rand(6) + 1}).inject {|s,i| s + i}
 
vagy
 
vagy
75. sor: 112. sor:
 
  a.inject {|s,i| s + i}
 
  a.inject {|s,i| s + i}
  
2. 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:
+
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=Intervallum.new(2,4)
 
  i.methods
 
  i.methods
109. sor: 146. sor:
 
  end
 
  end
  
3.  
+
13.  
 
  STDIN.each_line do |s|
 
  STDIN.each_line do |s|
 
   s.chomp!
 
   s.chomp!
117. sor: 154. sor:
 
  end
 
  end
  
4. Mintamegoldás:
+
14. Mintamegoldás:
 
  def palindromlehet(s)
 
  def palindromlehet(s)
 
   s=s.chomp.split(//).sort.join
 
   s=s.chomp.split(//).sort.join

A lap 2008. április 27., 19:26-kori változata

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