Info2/2008tavasz/zh
53. sor: | 53. sor: | ||
=== Mintafeladatok === | === Mintafeladatok === | ||
− | 1. | + | 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? | ||
− | + | 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. | ||
− | + | 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} | ||
− | + | 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 | ||
− | + | 13. | |
STDIN.each_line do |s| | STDIN.each_line do |s| | ||
s.chomp! | s.chomp! | ||
117. sor: | 154. sor: | ||
end | end | ||
− | + | 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 }