13.07.2015 Views

Ejercicios de Programación con Ruby Ingenier´ıa de Sistemas de ...

Ejercicios de Programación con Ruby Ingenier´ıa de Sistemas de ...

Ejercicios de Programación con Ruby Ingenier´ıa de Sistemas de ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Ejercicios</strong> <strong>de</strong> Programación <strong>con</strong> <strong>Ruby</strong>Ingeniería <strong>de</strong> <strong>Sistemas</strong> <strong>de</strong> InformaciónDepartamento <strong>de</strong> <strong>Sistemas</strong> Telemáticos y Computación (GSyC)18 <strong>de</strong> septiembre <strong>de</strong> 2012Notas:1. Al lado <strong>de</strong> cada ejercicio aparecen una o más cruces, en función <strong>de</strong> su dificultad y <strong>de</strong> la cantidad <strong>de</strong> tiempoestimado que requiere. Cuantas más cruces tenga un ejercicio más difícil es o más tiempo pue<strong>de</strong> requerir.2. Aparte <strong>de</strong> las transparencias que estamos usando en clase, utiliza ri y la siguiente documentación <strong>de</strong> <strong>Ruby</strong>:Documentación online <strong>de</strong> <strong>Ruby</strong>: http://ruby-doc.org/core-1.9.3/API <strong>de</strong> la biblioteca estándar <strong>de</strong> <strong>Ruby</strong>: http://ruby-doc.org/Libro Programming <strong>Ruby</strong>: http://ruby-doc.org/docs/Programming<strong>Ruby</strong>/3. Utiliza este resumen sobre el uso <strong>de</strong> expresiones regulares en <strong>Ruby</strong>:Figura 1: Fuente: Engineering Long-Lasting Software. Armando Fox, David Patterson1


Ejercicio 1 +Dada esta <strong>de</strong>finición <strong>de</strong> un método:<strong>de</strong>f foo(arg, hash1, hash2)end¿Cuál <strong>de</strong> las siguientes NO es una llamada legal al método foo?1. foo a, {:x=>1, :y=>2}, :z=>32. foo(a, :x=>1, :y=>2, :z=>3)3. foo(a, {:x=>1, :y=>2}, {:z=>3})4. foo(a, {:x=>1}, {:y=>2, :z=>3})Ejercicio 2 +Dada la siguiente <strong>de</strong>claración <strong>de</strong> la clase SavingsAccount:class SavingsAccount < Account<strong>de</strong>f initialize(starting_balance=0)@balance = starting_balanceend<strong>de</strong>f balance@balanceend<strong>de</strong>f balance=(new_amount)@balance = new_amountend<strong>de</strong>f <strong>de</strong>posit(amount)@balance += amountend@@bank_name = "MyBank.com"<strong>de</strong>f self.bank_name@@bank_nameen<strong>de</strong>ndIndica cuáles <strong>de</strong> las siguientes líneas son correctas:1. SavingsAccount.new.@balance2. SavingsAccount.new.balance3. SavingsAccount.new.balance()2


Ejercicio 3 +Dada esta asignación:rx = {:primero=>/^rub/,’primero’=>[/RA(IL)$/, /ra(il)/i]}¿Cuál <strong>de</strong> las siguientes expresiones se evaluará correctamente, <strong>de</strong>volviendo algo que no sea nil?1. "rubyonrails" =~ rx{:primero}2. rx[:primero][1] =~ "RUBYONRAILS"3. rx[’primero’][1] =~ "RUBYONRAIL"4. "rubyonrails" =~ rx[’primero’, 1]5. "rubyonrails" =~ rx[’primero’][0]Ejercicio 4 +Dada esta extensión <strong>de</strong> la clase String:class String<strong>de</strong>f curvy?!("AEFHIKLMNTVWXYZ".inclu<strong>de</strong>?(self.upcase))en<strong>de</strong>nd¿Cuál <strong>de</strong> las siguientes líneas es correcta?:1. String.curvy?("foo")2. "foo".curvy?3. self.curvy?("foo")4. curvy?("foo")3


Ejercicio 5 +Se ha extendido la clase Numeric <strong>de</strong> la siguiente forma:class Numeric<strong>de</strong>f eurosself * 1.292en<strong>de</strong>ndAhora se <strong>de</strong>sea po<strong>de</strong>r ejecutar esta línea:5.euros.in(:rupias)¿Cuál <strong>de</strong> los siguientes mecanismos sería más apropiado?1. Cambiar Numeric.method_missing para que <strong>de</strong>tecte llamadas al método in2. Cambiar Numeric#method_missing para que <strong>de</strong>tecte llamadas al método in3. Definir un método Numeric#in4. Definir un método Numeric.inEjercicio 6 +¿Cuál <strong>de</strong> los siguientes string NO aparecerá como resultado <strong>de</strong> ejecutar este código?:[’banana’, ’anana’, ’naan’].map do |food|food.reverseend.select { |f| f.match /^a/ }1. "naan"2. "ananab"3. "anana"4. El código no funcionará <strong>de</strong>bido a errores <strong>de</strong> sintaxisEjercicio 7 +¿Cuáles <strong>de</strong> las siguientes expresiones <strong>de</strong> <strong>Ruby</strong> son equivalentes entre sí?:A) :fooB) %q{foo}C) %Q{foo}D) ’foo’.to_symE) :foo.to_s4


Ejercicio 8 +¿Qué se captura en $1 buscando en el string ”25 to 1” las siguientes expresiones regulares?:/(\d+)$//^\d+([^0-9]+)/Ejercicio 9 +¿Cuándo es correcto utilizar la siguiente línea en <strong>Ruby</strong>?:Fixnum num=3Ejercicio 10 +¿Por qué al ejecutar 5.superclass se eleva una excepción “un<strong>de</strong>fined method”?.Ejercicio 11 +Escribe utilizando send las siguientes expresiones:1. a1, :b => 2Ejercicio 13 +¿Por qué esta expresión es incorrecta en <strong>Ruby</strong>?:movie.@year=19985


Ejercicio 14 ++Time.now <strong>de</strong>vuelve el número <strong>de</strong> segundos que han pasado <strong>de</strong>s<strong>de</strong> las 00:00 GMT <strong>de</strong>l 1/1/1970, que es la formaen que se representa una hora en Unix. Se ha extendido la clase Fixnum para po<strong>de</strong>r hacer aritmética <strong>con</strong> las horasutilizando expresiones como las siguientes:Time.now# => Mon Nov 07 10:18:10 -0800 20115.minutes.ago# => Mon Nov 07 10:13:15 -0800 20115.minutes - 4.minutes# => 603.hours.from_now# => Mon Nov 07 13:18:15 -0800 2011A <strong>con</strong>tinuación se muestra la extensión <strong>de</strong>l código <strong>de</strong> la clase Fixnum que permite hacer este tipo <strong>de</strong> operaciones:class Fixnum<strong>de</strong>f se<strong>con</strong>ds ; self ; end<strong>de</strong>f minutes ; self * 60 ; end<strong>de</strong>f hours ; self * 60 * 60 ; end<strong>de</strong>f ago ; Time.now - self ; end<strong>de</strong>f from_now ; Time.now + self ; en<strong>de</strong>ndSin embargo, esta sentencia no se pue<strong>de</strong> ejecutar: 1.minute.agoLa razón es que no existe el método minute.El siguiente código soluciona este problema:class Fixnum<strong>de</strong>f method_missing(method_id, *args)name = method_id.to_sif name =~ /^(se<strong>con</strong>d|minute|hour)$/self.send(name + ’s’)elsesuper # se llama al mismo método (method_missing) <strong>de</strong> clases ancestroen<strong>de</strong>n<strong>de</strong>ndExplica por qué son necesarios $ y ^ en la expresión regular <strong>de</strong> la línea 4. Una pista: piensa qué ocurriría si omitimosalguno <strong>de</strong> estos dos caracteres e intentamos hacer la siguiente llamada: 5.millise<strong>con</strong>ds o 5.se<strong>con</strong>dary.6


Ejercicio 22 ++El módulo Enumerable <strong>de</strong>fine el iterador each_with_in<strong>de</strong>x que <strong>de</strong>vuelve cada uno <strong>de</strong> los elementos enumerablejunto a un índice que empieza en cero. Veamos un ejemplo <strong>de</strong> su uso:%w(alice bob carol).each_with_in<strong>de</strong>x do |person,in<strong>de</strong>x|puts ">> #{person} is number #{in<strong>de</strong>x}"end>> alice is number 0>> bob is number 1>> carol is number 2Escribe un iterador each_with_custom_in<strong>de</strong>x en el módulo Enumerable que permita fijar el valor inicial <strong>de</strong>l índiceque <strong>de</strong>volverá para el primer elemento, y el número <strong>de</strong> saltos que <strong>de</strong>be ir dando el índice al ir iterando. Ejemplo <strong>de</strong>uso:inclu<strong>de</strong> Enumerable%w(alice bob carol).each_with_custom_in<strong>de</strong>x(3,2) do |person,in<strong>de</strong>x|puts ">> #{person} is number #{in<strong>de</strong>x}"end>> alice is number 3>> bob is number 5>> carol is number 7Ejercicio 23 ++En la sucesión <strong>de</strong> Fibonacci los dos primeros enteros son 1 y 1, y cada número sucesivo es la suma <strong>de</strong> los dos previos.Crea una clase FibSequence que <strong>de</strong>vuelva un iterador para los n primeros números <strong>de</strong> Fibonacci. Ejemplo <strong>de</strong> uso:f = FibSequence.new(6) # <strong>de</strong>vuelve un iterador para los 6 primeros números# <strong>de</strong> la sucesión <strong>de</strong> Fibonaccif.each { |s| print(s,’:’) } # => 1:1:2:3:5:8:f.reject { |s| s.odd? } # => [2, 8]f.map { |x| 2*x } # => [2, 2, 4, 6, 10, 16]Recuerda que si la clase FibSequence implementa each, al incluir el módulo mix-in Enumerable se aña<strong>de</strong>n losmétodos <strong>de</strong>finidos en este módulo como reject, map,...Ejercicio 24 +++Implementa un iterador each_with_flattening que se comporte <strong>de</strong>l siguiente modo:[1, [2, 3], 4, [[5, 6], 7]].each_with_flattening { |s| print "#{s}," }>> 1, 2, 3, 4, 5, 6, 7Ejercicio 25 +Aña<strong>de</strong> al módulo Enumerable un nuevo iterador, each_permuted que <strong>de</strong>vuelva los elementos <strong>de</strong> una colección enor<strong>de</strong>n aleatorio. El iterador pue<strong>de</strong> asumir que la colección respon<strong>de</strong> al método each pero no <strong>de</strong>be esperar nada <strong>de</strong>cada elemento.Utiliza el método rand.9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!