Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contenido
Prefacio.............................................................................................................v
Organizacin del Libro................................................................................v
Agradecimientos.........................................................................................vi
Parte I................................................................................................................1
Breve Historia de Ruby...............................................................................1
Audiencia ....................................................................................................1
Motivacin...................................................................................................2
Cmo Instalar Ruby en Windows...............................................................2
Cmo Instalar Ruby en Linux.....................................................................3
Parte II Las Bases..............................................................................................5
Leccin 1. Ruby Interactivo........................................................................6
Leccin 2. Nmeros....................................................................................8
Leccin 3. Funciones Mtematicas Pre-definidas.....................................11
Leccin 4. Cadenas de Caracteres.............................................................12
Leccin 5. Arreglos (Arrays).....................................................................14
Leccin 6. Fechas y Horas........................................................................16
Leccin 7. Hash.........................................................................................17
Leccin 8. Each y Bloques........................................................................18
Leccin 9. Contadores y Acumuladores....................................................20
Leccin 10. Expresiones Condicionales....................................................22
Parte III El Lenguaje.......................................................................................23
Cmo usar SciTE.......................................................................................24
Leccin 11. Lgica Condicional...............................................................25
Leccin 12. Ciclos Repetitivos..................................................................27
Leccin 13. Condiciones Mltiples (Case)...............................................31
Leccin 14. Funciones...............................................................................33
Leccin 15. Clases.....................................................................................36
Leccin 16. Atributos de Clases................................................................39
Leccin 17. Control de Acceso a la Clase.................................................42
Leccin 18. Herencia y Taxonomas.........................................................44
Leccin 19. Expresiones Regulares...........................................................45
Leccin 20. Archivos................................................................................47
Leccin 21. Directorios.............................................................................50
Leccin 22. Entrada/Salida, Corrientes y Tubos.......................................51
Leccin 23. Formatos de salida.................................................................53
Leccin 24. Yield......................................................................................55
Leccin 25. Mdulos y Mixins..................................................................56
Parte IV Usos Avanzados (omitido)...............................................................59
Soluciones a Ejercicios Selectos.....................................................................60
Bibliografa.....................................................................................................73
Libros sobre Ruby.....................................................................................73
Otros Enlaces sobre Ruby en Internet.......................................................74
iii
Curiosidades Matemticas.........................................................................75
Apndices..................................................................................................76
Apndice A. El Cdigo ASCII..................................................................76
Apndice B. Cmo usar SciTE..................................................................77
Sobre el Autor...........................................................................................81
iv
Prefacio
Este libro se origin hace varios meses, a travs de un intercambio de
correspondencia con mi padre, un ingeniero electricista ya retirado, de 77
aos, que vive en Colombia, quien me manifest su inters en aprender algn
lenguaje de programacin. Yo le suger Ruby, pues es un lenguaje popular
que considero sencillo, bonito, y elegante. Empezamos as un intercambio de
correspondencia por correo electrnico, que poco a poco fue tomando la
forma de un libro.
Queremos que llegue a las manos de profesionales y estudiantes, y
especialmente, de principiantes, a quienes queremos motivar para que
aprendan a programar con Ruby.
Organizacin del Libro
El libro est organizado en cuatro partes:
La Parte 1 cubre la instalacin y seleccin de herramientas.
La Parte 2 introduce los elementos bsicos del lenguaje, que en
trminos tcnicos se conoce como primitivas; esto incluye los
tipos de datos principales, y su uso.
La Parte 3 describe las estructuras de control, programacin por
objeto, manejo de archivos y directorios.
La Parte 4 explica temas que tienen aplicacin comercial en la
empresa: programacin web, interfaces grficas, reporte y manejo de
errores, acceso a bases de datos.
Esta seccin se omite en esta versin del libro; los lectores
interesados pueden comprar el libro que se encuentra disponible en:
http://www.lulu.com/content/1759456
Cada captulo sugiere algunos ejercicios para poner en prctica lo aprendido.
El rango de dificultad oscila desde lo bien bsico, como verificar todo el
cdigo descrito en la leccin, hasta problemas un poquito ms sofisticados de
aplicacin en matemticas y otros campos. Al final del libro, el lector
encontrar las soluciones a casi todos los ejercicios.
Consideramos que la mejor manera de aprender a programar es aprender
haciendo. Asumimos que el lector tiene un computador en casa (o escuela u
oficina), conectado a internet, as que instalar y seguir las lecciones al lado
de la mquina.
vi
Parte I
Breve Historia de Ruby
El lenguaje Ruby fue inventado por Yukihiro Matz Matsumoto, en Japn,
en 1995. Siguiendo la tradicin de los lenguajes de programacin que han
sido desarrollados recientemente, y que gozan de popularidad, Ruby es un
lenguaje interpretado, gratuito (Open Source), y orientado por objeto. Matz
admite que se inspir en los lenguajes Perl y Python, pero Ruby es mucho
ms orientado por objeto; de hecho, todo en Ruby son objetos.
En Japn, este lenguaje goza de una popularidad mayor que la del lenguaje
Python, que tambin es muy popular en el mundo entero.
Ruby es un lenguaje genrico que se puede utilizar en muchos campos: desde
procesamiento de texto y programacin web, hasta ingeniera, gentica, y
programacin comercial a gran escala.
La comunidad Ruby sigue creciendo mundialmente, y ahora que tambin ha
salido la plataforma Ruby on Rails para programar aplicaciones Web, este
lenguaje cobra cada da ms seguidores.
Audiencia
Este libro ha sido escrito principalmente para novatos, pero esperamos que
los profesionales en sistemas tambin lo encuentren til.
En los 1980s, cuando pasamos por la universidad, saber programar un
computador era una cosa esotrica, y la gente lo consideraba cosa de
brujos. Hoy en da esta tecnologa se encuentra en todas partes, y hasta los
estudiantes de las escuelas primarias estn aprendiendo a programar.
As que este libro es para la gente curiosa, que tiene acceso a Internet, y que
tiene inters en saber cmo funcionan las cosas. El nico pre-requisito es
tener un conocimiento de matemticas bsicas (lgebra, y trigonometra),
para poder hacer los ejercicios.
Motivacin
Siguiendo la evolucin de este lenguaje desde el principio, nos damos cuenta
de que su acogida ha sido tremenda en los ltimos dos aos. Nos bastara con
ver la cantidad de libros que han salido sobre el tema. Como van las cosas,
muy pronto el conocimiento de Ruby ser necesario para conseguir un
empleo en el rea de sistemas y computadores.
El objetivo al escribir este libro no es reemplazar ni superar a los otros textos
existentes sobre Ruby, sino ms bien ayudar a demistificar el tema de la
programacin y hacerlo accesible a un gran nmero de personas. Y qu mejor
que hacerlo con un lenguaje moderno y bonito, como lo es Ruby.
En una poca en que los computadores se hacen cada vez ms poderosos, los
lenguajes de programacin ya no tienen por qu ser orientados solamente
hacia la mquina; deben ser orientados hacia los seres humanos que lo van a
usar. Ruby ha sido diseado con el programador en cuenta; como dice Matz:
Ruby ha sido diseado bajo el principio de menor sorpresa, es decir, entre
menos nos sorprenda, mejor. Ha sido diseado para seres humanos. Ruby es
un lenguaje fcil, elegante y entretenido. Aprendamos a programar en Ruby!
Cmo Instalar Ruby en Windows
Para Windows, bajar a Ruby desde el siguiente sitio:
http://www.ruby-lang.org/en/downloads/
El instalador de Ruby se llama:
Ruby_x.y.z_OneClick_Installer
El signo # se usa para indicar que lo que sigue es un comentario que no debe
ser interpretado por Ruby. Se puede poner al principio de la lnea, o despus
de la instruccin, seguido de una explicacin de lo que estamos haciendo.
Para terminar la ejecucin de irb, escribir: quit o exit.
Ruby es un lenguaje de programacin moderno. En sta, y en las lecciones
que siguen, veremos cmo cobran vida las matemticas con Ruby.
Empezamos con una asignacin a una variable.
a=5
#1
#1.5
En este caso, el operador "+" funciona como concatenador (pega una cadena
de letras con otra), produciendo:
saludos=Salut,AugustusCaesar
#Salut,AugustusCaesar
Leccin 2. Nmeros
Ruby maneja varios tipos de nmeros: enteros, reales, racionales, y
complejos.
De la leccin anterior, recordemos que la aritmtica de nmeros enteros es
diferente a la de nmeros reales. Es decir, las siguientes dos asignaciones dan
resultados diferentes:
a=3/2#1#divisionenteraignoraelsobrante
b=3.0/2.0#1.5
#equivalea123456;
#elunderscore_facilitalalectura
#octales(base8)empiezanconcero
#hexadecimales(base16)empiezancon0x
#binarios(base2)empiezancon0b
#equivalea1.0*10**6;notacioncientifica
#equivalea4*10**20;omiteelpuntodecimalycero
#5
#definamosunentero
#"5" #convierteacadena(string)
#5.0 #convierteareal(floating)
#6
#sucesor(n+1)
#7
#definamosotroentero
#false #comparacionporigualdad(doblesigno=)
#comparaelcontenidodeiconj
#2
#divisionpormodulo;retornaelsobrante
Algunas de las funciones que actan sobre los nmeros reales son las
siguientes:
r=3.14
#3.14
r.to_i
#3
#convierteanumeroentero(integer)
r.to_s
#"3.14"#convierteacadena(string)
r.abs
#3.14 #retornaelvalorabsoluto
s=3.14
#3.14
r==s
#true #comparacionporigualdad
r.ceil
#3
#elenteroinmediatosuperiorar(ceiling)
r.floor
#4
#elenteroinmediatoinferiorar(floor)
r.round
#3
#redondeoalmasproximoentero
(r/0.0).finite? #false #pruebasilaoperacionesfinita
(r/0.0).infinite?#1 #elresultadotiendeainfinito
(0/r).zero?
#true #pruebasilaoperaciondaceroono
r%3.0
#0.14 #divisionpormodulo;retornaelsobrante
0==0.0
#true #comoeradeesperarse
Los nmeros enteros se pueden usar para generar letras del cdigo ASCII:
65.chr
"A"
Los nmeros racionales son los que se pueden expresar como cociente de dos
enteros. Para este efecto, Ruby tiene un mdulo 'rational', que debemos
incluir antes de poder usar sus definiciones:
require'rational'
r=Rational(2,3)#Rational(2,3)
s=Rational(3,4)#Rational(3,4)
r+s
#Rational(17,12)
r*3
#Rational(2,1)
r*2.0
#1.33333333333333
r<=>s
#1
Rational(391,493)#Rational(23,29)
r.to_f
#0.666666666666667
s==0.75
#true
#racionalporrealdareal
#resmenorques
#losreduce
#convierteareal
#comoesdeesperarse
10
#5
#resultado
11
La diferencia es que las cadenas que usan comillas dobles pueden incluir
caracteres especiales tales como \t (tab), \n (carriage return), y nmeros en
diferentes representaciones (octales, \061, hexadecimal, etc).
Como se vio en la leccin anterior, los enteros y los reales tambin se pueden
convertir a cadenas:
i=5
i.to_s
r=3.14
r.to_s
#
#
#
#
5
"5"
3.14
"3.14"
#valorentero
#cadena
#valorreal
#cadena
83
10
1234.5
1234
10
101
#cadenaoctalaentero
#cadenahexadecimalaentero
#convierteareal
#convierteaentero
#conviertedesdehexadecimal
#conviertedesdebinario
#"Laedades25"
#expresinequivalente
#"ja"
#"jajaja"
#"jaji"
#concatenatrescopias
#elsigno+concatenacadenas
z="za"
z==s
#"za"
#false
#elcontenidoesdistinto
y="ab"
y<<"cde"
y.length
#"ab"
#"abcde"
#5
#append:concatenaalfinal
#elnmerodecaracteres
12
#"ABCDE"
#"mn"
#"aZ"
#"Sam"
#97
#98
#retornaelcdigodelcaracterenlaposicin0,"a"
#retornaelcdigodelcaracterenlaposicin1,"b"
#
#
"z"
"zbcde"
#
#
#
"bcde"
"zbxcde"
"edcbz"
Ejercicio 4.1: Verificar todas las operaciones anteriores con Ruby interactivo.
13
a[i] nos retorna el (i-1)-simo elemento de la lista. Por eso decimos que tiene
base 0 (el primer elemento tiene ndice 0, el segundo 1, etc).
a[3]
#"Maria"
#"Juan"
#"azul"
#false
#accesaelprimero
#accesaelultimo
#preguntasiestavacio
#[1,2,3,4,5,6,7,8,9,10]
14
#["b","m","p","z"]
#"Monk"
#["Mozart"]
#["Mozart","Bach"]
Para insertar y remover elementos hacia el comienzo del arreglo, usar unshift
y shift, respectivamente:
d.unshift("Beethoven")
#["Beethoven","Mozart","Bach"]
d.shift
d
#"Beethoven"
#["Mozart","Bach"]
#["Mozart","Bach","Listz"]
#"p,z,b"
15
#"MonSep1023:11:06+10002007"
#primerdadelasemana
#dadelao
#nombredelmescompleto
#idemabreviado
#dadelasemana
#idem,abreviado
#AMoPM
La clase Date sirve para especificar fechas, que no requieren el uso del
tiempo.
require'date'
fecha=Date.new(2007,06,15)
fecha.to_s#"20070615"
hoy=Date.today
puts"#{hoy.day}/#{hoy.month}/#{hoy.year}"#"17/12/2007"
Ejercicio 6.1: Verificar todas las operaciones anteriores con Ruby interactivo.
16
Leccin 7. Hash
Existe otra estructura de datos bastante conveniente llamado el Hash.
Consiste en un arreglo que permite almacenar valores indexados por palabras
(a diferencia del arreglo, que indexa los valores por nmeros naturales).
As se usara un hash que empieza vaco, y poco a poco se le van aadiendo
elementos:
genios=Hash.new
#declaraunhashnuevo,lavariablegenios
genios["matematicas"]="Gauss"
#"matematicas"indice,"Gauss"valor
genios["violin"]="Paganini"
#declaraunhash,lavariablelang
#relacionalenguajesconsusautores
#elsigno=>separallavedevalor
}
lang['Ruby']
lang.has_key?('Java')
lang.has_value?('McCarthy')
lang.sort
lang.values_at('Python','Ruby')
lang.values
lang.keys
lang.length
#'Matsumoto'
#accesaunvalor
#false #preguntasiexistellave
#false #preguntasiexistevalor
#ordenaporordendellave(key)
#['Guido','Matsumoto']
#['Larry','Guido','Matsumoto']
#['Perl','Python','Ruby']
#3#numerodeparesenelhash
#eliminaelpar'COBOL'=>'CODASYL'
Ejercicio 7.1: Verificar todas las operaciones anteriores con Ruby interactivo.
17
#empecemosconesteArray
#porcadaelemento|i|de'a',imprimirlo:
#dentrodelbloque,i2yluegoputs2
#sigueconi4yluegoputs4
#etc
En lugar de las llaves {} del each, se pueden usar las palabras do y end, y
expresar el bloque entre varias lneas. Esto es conveniente cuando lo que va
dentro del bloque puede tener una lgica un poco ms elaborada que no cabe
en una sola lnea.
Veamos un ejemplo aplicado a una cadena de varias lneas. El siguiente
programa procesa y cuenta las lneas de un cuento, una lnea a la vez:
18
lineas="Eraseunavez\nenunlugarlejano...\nFin\n"
num=0
lineas.eachdo|linea| #usadoalprincipiodelbloque
num+=1
#elcontenidodelbloquevadepormedio
print"Line#{num}:#{linea}"#seextiendesobrevariaslineas
end
#usaendalfinaldelbloque
19
cuenta=cuenta+1
El ejemplo anterior es solamente para ilustrar el uso del contador, pues, como
ya vimos en una leccin anterior, en Ruby bastara con hacer a.size para saber
el nmero de elementos de un arreglo.
De manera similar se podra pensar en un contador que contara hacia abajo:
count=1
20
#equivaleasumasuma+cantidad
#iniciaunarrayconnumeros
#inicialasumaen0
#cadaelementoiseacumulaensuma
#produceelresultado
21
#1
#0
#1
Hay ocasiones en las que estas expresiones pueden llegar a ser compuestas:
expr1orexpr2,expr1andexpr2
#nil
#false #falsoycualquiercosa,dafalso
#false
#nil
#true #andesciertocuandoambossonciertos
#nil
#false
#99
#true #oresciertocuandoalgunoescierto
#false
#true
22
Por conveniencia, tambin vamos a asumir que todos los programas los
vamos a guardar bajo el directorio siguiente:
c:\code\ruby
23
24
end
#casoa>b
#casoa==b
#casoa<b
25
#retornax=1sia>b;
#alternativamenteretornax=0.
puts"aesmayorqueb"ifa>b
printtotalunlesstotal.zero?
26
#resultaena,b,cencadalineaseparada
#porcadaelementoedea,haga
#imprimaelvalordee
#findelciclo
Cuando usamos tres puntos, excluye el ltimo valor del rango. Esto es til
para iterar sobre los valores de un array (cuyo ltimo ndice es n-1):
a=["a","b","c"]
foriin0...a.size
#size=3;asignavaloresientre0..2
puts"#{i}:#{a[i]}" #evaluadesdea[0]hastaa[2]ylosimprime
end
#imprime0:a,1:b,2:c(unparporlinea)
27
Una cuenta que incremente por nmeros diferentes de 1 se puede hacer con la
funcin step():
2.step(10,2)do|i|
putsi
end
#desde2hasta10,incrementandodea2
#imprimei:2,4,6,8,10
Aunque parezca increble, la funcin step() tambin funciona sobre los reales,
con incrementos fraccionarios:
2.step(10,0.5)do|r|
putsr
end
#desde2hasta10,incrementandodea0.5
#imprimer:2.0,2.5,3.0,3.5,etc
#imprimedesde0hasta4
#imprimedesde0hasta4
Otra instruccin, loop, crea un ciclo potencialmente infinito. Para salirse del
ciclo se usa la instruccin break, junto con una condicin. El ciclo anterior se
expresara de la siguiente manera:
28
cuenta=0
loop
breakifcuenta>=5
putscuenta
cuenta+=1
end
#imprimedesde0hasta4
e =lim 1
n
x x x
x
...
1! 2! 3!
n!
29
30
[ ][ ][ ]
132 0 05 13 7
100 7 50 = 85 0
122 2 11 33 3
31
32
33
Ejercicio 14.2: La funcin recursiva anterior se hace lenta porque, cada que
se la invoca, tiene que calcular una y otra vez todos los valores anteriores.
Para optimizarla, escriba un programa que recuerde cada uno de los valores
calculados, y los almacene en un arreglo, de manera que pueda responder
rpidamente cuando se use consecutivamente. Ayuda: usar un arreglo global.
Ejercicio 14.3: Demostrar, por medio de un programa que use la funcin
Fibonacci anterior, que el cociente de dos nmeros sucesivos de Fibonacci,
tiende hacia el cociente ureo (Golden Ratio): [demostrado por Kepler]
Fib n 1
1 5
lim
= =
Fib n
2
n
Ejercicio 14.4: Escribir un programa que produzca una matriz con el
tringulo de Pascal usando una funcin que reciba como parmetro el nmero
de filas deseadas. Cada elemento del tringulo de Pascal tiene la siguiente
relacin:
a(i, j) = a(i-1, j) + a(i-1, j-1),
con unos en la primera columna, y en la diagonal:
34
1
121
1331
etc
n!
n
n k k
x y = n x y , donde n =
k k! nk !
k =0 k
35
Una vez que ya est definida, para usar una clase, primero hay que crear un
objeto, o instancia, de la clase. Ya sabemos hacer esto con la funcin new:
h=Hash.new#creaunobjetodelaclaseHash
a=Array.new#creaunobjetodelaclaseArray
m=MiClase.new#creaunobjetodelaclaseMiClase
36
Ejemplos: @temperatura.
A las variables visibles desde afuera, les llamaremos atributos, como
si fueran una propiedad del objeto que se puede leer y/o cambiar.
Normalmente, los atributos son sustantivos, y sus valores son
adjetivos, o nmeros.
Ejemplos: perro.color, planeta.gravedad, motor.cilindros,
paciente.edad.
A las funciones de la clase le llamaremos mtodos y normalmente
usamos verbos para describir las acciones que van a desempear.
Ejemplos: perro.ladrar, motor.arrancar, paciente.crear.
37
38
#produceunerror
Ruby nos permite hacer esto de otra manera ms fcil. Si queremos declarar
atributos legibles, los podemos declarar usando la palabra clave attr_reader:
classPerro
attr_reader:nombre,:fecha_de_nacimiento,:color
#atributoslegibles
...
end
Ahora, hay que modificar el constructor para que acepte valores iniciales:
39
classPerro
...
definitialize(nombre,nacimiento,color)#metodoconstructor
@nombre=nombre#@nombre
@fecha_de_nacimiento=nacimiento#@edad
@color=color#@color...variablesinternas
end
...
end
Esto permite cambiarle el valor desde afuera, como si fuera una propiedad,
as:
f=Perro.new("fifi","20000621","gris")
f.sobrenombre="fifirucho"
La declaracin alternativa, attr se puede usar para declarar atributos que son
legibles y escribibles:
attr:nombre,true
40
41
42
43
44
Significado
Caracteresespeciales:\t,\n,\s(espacio),\d
(digito),\007(octal),\x7f(hex),\|(lineavertical)
cualquiercaracter,excepto\n
elprincipiodeunacadena
elfinaldeunacadena
elelementoanteriorocurre0omasveces
elelementoanteriorocurre1omasveces
elelementoanteriorocurre0o1veces
{}
especificaunrangodeelementos
[]
unaclasedecaracterescontenidosdentrodelosparentesis
()
agrupaexpresionesregulares
expresionesalternativas
Ejemplos:
En la tabla siguiente, el patrn de la columna izquierda hace juego con las
cadenas de la derecha:
Expr Regular
Ejemplo
/\d\d:\d\d:\d\d/
"12:34:56"
/\w+/
unaomaspalabras
/\s+/
unoomasespacios
/a.c/
"xabcz","xamcz","xa9cz",...
(cualquiercaracterentreayc)
/Jair(o|ito)/
"Jairo","Jairito"
/[Ee]lla/
"Ella","ella"
/^Salud/
"Saludando"(cadenaqueempiececonesapalabra)
/Salud$/
"ParasuSalud"(cadenaquetermineconesapalabra)
/ab*c/
"xacz","xabcz","xabbbbcz",...
(ceroomasocurrenciasdeb,precedidaspora,y
seguidasporc)
/ab+c/
"xabcz","xabbbbbcz",...
(unaomasocurrenciasdeb,precedidasporay
seguidasporc)
45
/a?c/
"xcz","xacz"
(ceroounaocurrenciadea,seguidadec)
/[09]/
cualquiernumerodeundigito
/[azAZ]/
cualquierpalabradeunaletra
/tu|yo|el|ella/
cualquieradelascuatropalabrasentre//
46
47
Significado
Sololectura;comienzadesdeelprincipiodelarchivo(default).
r+
Lectura/Escritura:comienzadesdeelprincipiodelarchivo.
Soloescritura:truncaelarchivosiexiste,ocreaunonuevo
paraescritura.
w+
Lectura/Escritura:truncaelarchivosiexiste,ocreaunonuevo
paralectura/escritura.
Soloescritura:comienzadesdeelfinaldelarchivosiexiste,o
locreanuevoparaescritura.
a+
Lectura/Escritura:comienzadesdeelfinaldelarchivosi
existe,olocreanuevoparalectura/escritura.
(SoloenWindows).Modobinario,ysepuedecombinarcon
cualquieradelasletrasanteriores.
48
Figura 20.1 Archivos: (1) de lectura, (2) de escritura, y (3) de ambos: lectura y escritura
49
Con el mtodo glob() se puede filtrar la lista de archivos con una expresin
regular:
a=Dir.glob("*.rb")#listadearchivosconterminacionrb
50
Para hacer esto posible, Ruby (igual que muchos otros lenguajes) tiene
predefinidas las constantes globales STDIN, STDOUT, y STDERR, de tipo
IO, que sirven para pasar streams, o corrientes de datos hacia dentro y
hacia afuera del programa. STDIN se usa para leer datos hacia adentro,
STDOUT para escribir resultados hacia afuera, y STDERR para reportar
errores.
Tambin existe una variable $stdin, que normalmente tiene el valor STDIN,
pero se puede redefinir para leer datos desde diferentes fuentes:
51
s=$stdin.gets#leedesdeSTDIN
archi=File.new("misdatos.txt","r")
$stdin=archi#reasignaelvalorde$stdin
s=$stdin.gets#ahoraleelineadesdearchivoarchi
archi.close
$stdin=STDIN#reasignaaldefault
s=$stdin.gets#leedesdeSTDIN
52
Descripcin
binario
entero
decimal
real(puntoflotante)
cadenadecaracteres
usarepresentacincientfica(exponencial)
similarae,perousalaletramayuscula
similarae,perodefaulta4decimales,omenos.
convierteaoctal
cadenaalfanumrica
trataelargumentocomodecimalsinsigno
convierteahexadecimalusandoletrasmayusculas
convierteahexadecimal
53
Ejemplos:
sprintf("%12.9f",Math::PI)#"3.141592654"#picon9decimales
sprintf("%4i",557)
#"557"#enteroa4cifras
sprintf("%1.1e",1230000)
#"1.2e+06"
sprintf("%1g",1230000)
#"1.23e+06"
sprintf("%b%o",127,127)
#"1111111177"#binario,octal
sprintf("%x",127)
#"7f"#hexadecimal.
Ejemplos:
sprintf("%10s","hola")
sprintf("%10s","hola")
#"hola"
#"hola"
54
55
PHI=1.61803398874989 #elcocienteaureo
defmifuncion
puts"Unsaludodesdemifuncion"
end
classMiclase
defmimetodo
puts"UnsaludodesdeMiclase.mimetodo"
end
end
end
#extiendelaclase
classMiClase2
end
m1=MiClase1.new
m1.mifuncion
#"Unsaludodesdemifuncion"
m2=MiClase2.new
m2.extend(MiModulo)
m2.mifuncion
#extiendelainstacia
#"Unsaludodesdemifuncion"
56
57
58
59
#3.14159292035398
2.2.4:piFibonacci=864.0/275 #3.14181818181818
2.3:farenheit=(celcius*9/5)+32
2.4:celcius=(farenheit32)/1.8
2.5:radianes=grados*2*Math.PI/360.0
2.6:grados=radianes*360.0/(2*Math.PI)
3.3:a,b,c=3,6,2
x1=b+Math.sqrt(b**24*a*c)/(2*a)
#daerrorcuandob**2<4ac
x2=bMath.sqrt(b**24*a*c)/(2*a)
3.6:piEuler1=4*(5*Math.atan(1.0/7)+2*Math.atan(3.0/79))
#3.14159265358979
piEuler2=4*(2*Math.atan(1.0/3)+Math.atan(1.0/7))
#3.14159265358979
#Nota:dentrodelasfuncionestrigonomtricas
#hayqueusarnmerosreales.
3.7:piWrenchShanks=24*Math.atan(1.0/8)+8*Math.atan(1.0/57)+
4*Math.atan(1.0/239)
#3.14159265358979
3.8:piRuby=Math::PI
#3.14159265358979
#tieneelmismovalorquepiEuler1,piEuler2,ypiWrenchShanks.
8.2:a=[1,2,3,4,5]
a.each{|i|putsi.to_s+","+(i**2).to_s+","+
Math.sqrt(i).to_s}
8.3:a=["estas","son","algunas","palabras"]
a.eachdo|p|
putsp+":tiene#{p.length}letras."
end
9.1:a=[1,2,3,4,5]
total=0
a.each{|n|total+=n}
#equivaleadecir:total=total+n
#acumulalasumaenlavariabletotal
puts"Lasumaes:"+total.to_s
60
11.1:
#asignarvaloresalasvariables,a,b,c
a,b,c=5,3,7
#fijensecomohayqueconsiderartodosloscasos,unoporuno
#laindentacionseusaparahacerelprogramamasfacildeleer
#ponercomentarioslibrementeparaayudaraseguirlalogicadel
programa
if(a>b)
if(a>c)
if(b>c)
puts"a=#{a}>b=#{b}>c=#{c}"
elsif(b==c)
puts"a=#{a}>b=#{b}=c=#{c}"
else#esteesuncomentario:(a>c>b)
puts"a=#{a}>c=#{c}>b=#{b}"
end
elsif(a==c)
puts"a=#{a}=c=#{c}>b=#{b}"
else#otrocomentario:(c>a>b)
puts"c=#{c}>a=#{a}>b=#{b}"
end
elsif(a==b)
if(a>c)
puts"a=#{a}=b=#{b}>c=#{c}"
elsif(a==c)
puts"a=#{a}=b=#{b}=c=#{c}"
else#(c>a=b)
puts"c=#{c}>a=#{a}=b=#{b}"
end
else#(b>a)
if(b>c)
if(a>c)
puts"b=#{b}>a=#{a}>c=#{c}"
elsif(a==c)
puts"b=#{b}>a=#{a}=c=#{c}"
else#(b>c>a)
puts"b=#{b}>c=#{c}>a=#{a}"
end
elsif(b==c)
puts"b=#{b}=c=#{c}>a=#{a}"
else#(c>b>a)
puts"c=#{c}>b=#{b}>a=#{a}"
end
end
61
11.2:
a=[2,8,4,7,1]#arreglocondatosacomparar
min=a[0]#asumirqueelprimerelementoeselmenor
max=a[0]#asumirqueelprimerelementoeselmayor
a.eachdo|v|#porcadaelementovdelarreglo
ifv<min#siesmenor
min=v#asigneunnuevominimo
end
ifv>max#siesmayor
max=v#asigneunnuevomaximo
end
end#findelciclo
putsResultadofinal:
puts"Elminimoes:#{min}"
puts"Elmaximoes:#{max}"
11.3:
a=[1,2,3,4,5,6]
a.eachdo|i|
if(i%2==0)#siladivisionmodulo2dacero,espar
puts"#{i}espar."
else
puts"#{i}esimpar."
end
end
12.2:
n=100
s=0 #iniciaelacumuladorenzero
1.upto(n){|i|s+=i}
puts"eltotales:#{s}"
#5050
s2=(n+1)*n/2
puts"usandolaformulanosda:#{s2}"#5050
12.3:
n=5
fact_n=1
1.upto(n)do|i|
fact_n*=i
#objetivo
#valorinicialdeacumulador
#cuentaentre1y5
#equivaleafact_n=fact_n*i
#fact_n=1*2*3*4*5
puts"#{n}:#{fact_n}" #imprimeresultadosparciales(opcional)
end
puts"fact(#{n})=#{fact_n}"#resultadofinal
62
12.4:
#exp(1)=1+1/1!+1/2!+...+1/n!
e1=Math::E
#2.71828182845905valordereferencia
#Queremoscalcularhastaqueobtengamoselvalor2.718;estoes:
e2=(e1*1000).to_i/1000.0#metodoparatruncara3decimales
s=1
#sllevalasumadelaserie
i=1#icuentalasiteracionesdelciclo
whiles<e2#elcicloserepitemientrasques<e2
fact_n=1
1.upto(i){|j|fact_n*=j}#aquicalculamoselfactorial
s+=1.0/fact_n#yaquiloacumulamosas
i+=1#contamoslasiteracioneseni
puts"#{i}:#{s}"#imprimimosresultadosparciales
end
puts"Serequieren#{i}iteraciones"#imprimimoselresultadofinal
#Dehecho,laserieconvergerapidamente.
#Serequiren7iteracionesparallegarae2(3decimalesdeprecision)
#yserequieren15iteracionesparallegarae1(14decimales)
12.5:
0.step(360,5)do|i|
#desde0hasta360,incrementandodea5
rad=i*2.0*Math::PI/360 #conversiongradosaradianes
putsi.to_s+":"+Math.sin(rad).to_s #imprimei:sin(i)
end
12.6:
e1=Math::E#e1=2.71828182845905
e2=(e1*1000).to_i/1000.0#e2=2.718
x=1#xesuncontadoryempiezaen1
loopdo#empiezaelciclo
f=(1+1.0/x)**x#calculaf
puts"#{x}:#{f}"#imprimeelresultadoparcial
breakiff>e2#examinayterminaelciclo
x+=1
#incrementaelcontador
end#repiteelciclodesdeaqui
#estaformularequiere4,822repeticionesparaacercarseae2;
#requiere67,095,913ciclosparaacercarseae1;
#diriamosqueconvergelentamentehaciae.
63
12.7:#sumadedosmatrices
a=[[1,3,2],[1,0,0],[1,2,2]]#matriza
b=[[0,0,5],[7,5,0],[2,1,1]]#matrizb
c=Array.new#matrizdefilasc
m,n=a.size,a[1].size#m:filas,n:columnas
foriin0...mdo#iteradorsobrefilas
c[i]=Array.new#la2dadimension(cols)dec
forjin0...ndo#iteradorsobrecolumnas
c[i][j]=0#lasiniciamosen0
end
end
foriin0...mdo#iterarsobrelasfilas
forjin0...ndo#porcadafila,iteracolumnas
c[i][j]=a[i][j]+b[i][j]#ycalculamoslasuma
end
end
c.eachdo|fila|#porcadafila
putsfila.join("")#imprimeelresultado
end
13.1:
calificaciones=[20,55,61,70,98,48,87,120,3]
resultados=Array.new
fornotaincalificacionesdo
casenota
when0..59#valoresposiblesquedancubiertos
resultados.push("malo")#prepararlistanueva
when60..79
resultados.push("regular")
when80..89
resultados.push("bueno")
when90..100
resultados.push("excelente")
else
resultados.push("error")
end
end
printresultados.join(",")
#imprimelalistaconlosresultados
13.2:
lista=["MOZART","haydn","mozart","bach","BACH","Liszt",
"Palestrina"]
cuenta={"Mozart"=>0,"Haydn"=>0,"Bach"=>0,"otros"=>0}
lista.eachdo|nombre|
nombre=nombre.downcase.capitalize#aseguraformatocomparable
casenombre
when"Mozart"
cuenta["Mozart"]+=1#acumulacuentaenhash
when"Haydn"
cuenta["Haydn"]+=1
when"Bach"
cuenta["Bach"]+=1
else
cuenta["otros"]+=1
end
end
cuenta.each{|k,v|puts"#{k}:#{v}"}#imprimelacuentadecadauno
64
14.1:
deffib(n)
casen
when1,2
return1
else
returnfib(n1)+fib(n2)#calculorecursivoylento
end
end
fib(20)
#6765
fib(30)
#832040
#sehacelentoparanumerosgrandes
14.2:#AlgoritmoFibonacciconmemoria:
$f=[1,1]
#declaraunarrayglobal
deffibm(n)
if$f[n]
#siyatieneelvalor
return$f[n]
#lodevuelve
else
#sino
$f[n]=fibm(n1)+fibm(n2)
#localcularecursivamente
return$f[n]
#ylodevuelve
end
end
#efectosecundario,$fcrece
fibm(100)
#354224848179261915075
14.3:
deflimgolden(n)
phi=(1+Math.sqrt(5))/2.0
#1.61803398874989
phi2=(phi*10**n).to_i/(10.0**n)#precisionandecimales
i=1
loopdo
m=1.0*fibm(i+1)/fibm(i)#calculaelcocienteaureo
m=(m*10**n).to_i/(10.0**n)
#aproximaandecimales
puts"#{i}:#{m}"
#imprimeresultadoparcial
breakif(m==phi2)
#precisiondeseada?
i+=1
#contadordeiteraciones
end
print"#{n}decimalestoma#{i}iteraciones"
end
limgolden(3)
#3decimalestoma10iteraciones
limgolden(6)
#6decimalestoma17iteraciones
limgolden(14)
#14decimalestoma36iteraciones
#podemosconcluirqueconvergerapidamenteaphi
65
14.4:
defpascal(n)
m=Array.new#crealamatriz,deunadimension
#vamosaconsiderar:ifilas,yjcolumnas
foriin0..ndo#porcadafila
m[i]=Array.new#crealasegundadimension
m[i].fill(0,0..n)#inicialafilaenceros
m[i][0]=1#inicialaprimeracolumnaenunos
m[i][i]=1#inicialadiagonalenunos
end
foriin0..ndo#porcadafila
forjin0...ido#porcadacolumna,hastaladiagonalexcl.
m[i][j]=m[i1][j]+m[i1][j1]#calcula
end
putsm[i].join("")#imprimelafila
end
end
#paraensayarlointentarlosiguiente:
pascal(10)
14.5:
$prefijos0={1=>"hena",2=>"di",3=>"tri",4=>"tetra",5=>"penta",
6=>"hexa",7=>"hepta",8=>"octa",9=>"enea",10=>"deca",20=>"icosa"}#+
sufijogono
$prefijos10={1=>"hen",2=>"dode",3=>"tri",4=>"tetra",5=>"penta",
6=>"hexa",7=>"hepta",8=>"octa",9=>"enea"}#+sufijodecagono
$prefijos100={2=>"icosi",3=>"triaconta",4=>"tetraconta",
5=>"pentaconta",6=>"hexaconta",7=>"heptaconta",8=>"octaconta",
9=>"eneaconta"}#+kai+prefijo0(1..9)+gono
defpoligono(n)
if(n<1)or(n>99)
return"error:#{n}estafueradelimites"
elsif(n<11)or(20==n)
return$prefijos0[n]+"gono"
elsif(n>10)and(n<20)
m=n10
return$prefijos10[m]+"decagono"
elsif(n>20)
decenas=n/10
unidades=n(decena*10)
if(unidades>0)
return$prefijos100[decenas]+"kai"+
$prefijos0[unidades]+"gono"
else
return$prefijos100[decenas]+"gono"
end
end
end
#ahoraalgunosejemplosparaensayarlo:
poligono(0)#"error:0estafueradelimites"
poligono(5)#"pentagono"
poligono(13)#"tridecagono"
poligono(20)#"icosagono"
poligono(30)#"triacontagono"
poligono(54)#"pentacontakaitetragono"
66
14.6:
deffact(x)#calculamosfact(x)recursivamente
if(0==x)or(1==x)
1
else
x*fact(x1)
end
end
defcoef(n,k)#definimoscoef(n,k)enterminosdefact()
fact(n)/(fact(k)*fact(nk))
end
defbinom(n)
a=Array.new#unarrayparaguardarlasexpresionesparciales
forkin0..n#lasumatoriaimplicaquevaahaberunciclo
c=coef(n,k)#calculamoselcoeficientepara(n,k)
m=nk#guardamoselvalordenk
a[k]="#{c}*x^#{m}*y^#{k}"#calculamoslaexpresionparcial
end
putsa.join("+")#concatenamostodoconelsigno+
end
binom(3)#produceelsiguienteresultado:
#1*x^3*y^0+3*x^2*y^1+3*x^1*y^2+1*x^0*y^3
15.1,15.3:
classPerro
definitialize(nombre,color,edad,sexo)#constructor
@nombre=nombre
@color=color
@edad=edad
@sexo=sexo
@ladrido="guau"
end
defto_s#representaciontextual
"Nombre=#@nombre,Ladrido=#@ladrido,"+
"Color=#@color,Edad=#@edad,Sexo=#@sexo"
end
defnombre
@nombre
end
defcolor
@color
end
defedad
@edad
end
defsexo
@sexo
end
def<=>(perro)#15.3permiteordenarloporedad
@edad<=>perro.edad
end
defladra
@ladrido
end
end
67
15.4
a=Array.new
a[0]=Perro.new("fifi","negro",3,"femenino")
a[1]=Perro.new("milu","blanco",5,"masculino")
a[2]=Perro.new("goofy","cafe",7,"masculino")
a.eachdo|p|
putsp.to_s#examinalaspropiedadesdecadauno
putsp.ladra#lohaceladrar
end
a.sort#losordenaporedad
16.1:
classPerro
attr_reader:nombre,:color,:edad,:sexo
attr_writer:nombre,:color,:edad,:sexo
definitialize(nombre,color,edad,sexo)#constructor
@nombre=nombre
@color=color
@edad=edad
@sexo=sexo
@ladrido="guau"
end
defto_s#representaciontextual
"Nombre=#@nombre,Ladrido=#@ladrido,"+
"Color=#@color,Edad=#@edad,Sexo=#@sexo"
end
def<=>(perro)#permiteordenarloporedad
@edad<=>perro.edad
end
defladra
@ladrido
end
end
68
18.1:
classCaja#Cajaessuperclasedetodas
attr_reader:color
definitialize(color)
@color=color
end
end
classCilindro<Caja#CilindroessubclasedeCaja
attr_reader:radio,:lado,:volumen
definitialize(color,radio,lado)
super(color)#pideasuperclasequeguardecolor
@radio,@lado=radio,lado
@volumen=2*Math::PI*radio*lado
end
end
classCubo<Caja#CuboessubclasedeCaja
attr_reader:lado,:volumen
definitialize(color,lado)
super(color)#pideasuperclasequeguardecolor
@lado=lado
@volumen=lado*lado*lado
end
end
classEsfera<Caja#EsferaessubclasedeCaja
attr_reader:radio,:volumen
definitialize(color,radio)
super(color)#pideasuperclasequeguardecolor
@radio=radio
@volumen=(4.0/3.0)*Math::PI*(radio**3)
end
end
tubo=Cilindro.new("gris",2,2)
puts"tubo:#{tubo.volumen}"#25.1327412287183
dado=Cubo.new("rojo",2)
puts"dado:#{dado.volumen}"#8
pelota=Esfera.new("azul",2)
puts"pelota:#{pelota.volumen}"#33.5103216382911
19.2:
s="Paris|Roma|Madrid|Estambul|Damasco"
s.split(/\|/)
#["Paris","Roma","Madrid","Estambul","Damasco"]
19.3:
s="http://sitioweb.net?var1=1&var2=2&var3=3"
url,vars=s.split(/\?/)#separa"url?vars"
v=vars.split(/\&/)#separaexpresionesusando&comoseparador
h=Hash.new
h["url"]=url
v.eachdo|par|
izq,der=par.split(\=)#separacadaladodel=
h[izq]=der
end
#produce:
#h=[url=>http://sitioweb.net,var1=>1,var2=>2,var3=>3]
69
20.2:
archivo="datos.txt"#archivoaleer
ifFile.exists?(archivo)#loprocesamossiexiste
f=File.open(archivo)
a=f.readlines(archivo)#loleemos
f.close#locerramos
dic=Hash.new#contaremosenundiccionario
a.eachdo|linea|#procesamoscadalineadelarreglo
palabras=linea.downcase.split([\.,'"!;:\s])#separarlaspalabras
palabras.eachdo|palabra|#procesarcadapalabra
ifdic[palabra]#siestaeneldiccionario
dic[palabra]+=1#aumentarelcontador
else#sinoestaeneldiccionario
dic[palabra]=1#anadirlaycontarla
end
end
end
sa=dic.sort#ordenaarreglodearreglos
sa.eachdo|par|#paracadaelemento
puts"#{par[0]}:#{par[1]}"#imprimeelpar:palabra,cuenta
end
else
puts"#{archivo}noexiste"#reportamosunerrorsinoexiste
end
20.3:
archivo="datos2.txt"#archivoaleer
ifFile.exists?(archivo)#loprocesamossiexiste
f=File.open(archivo)
a=f.readlines(archivo)#loleemos
f.close#locerramos
dic={"@nombre@"=>"Cesar","@mensaje@"=>"vencimos"}#areemplazar
a.eachdo|linea|#procesamoscadalinea
dic.eachdo|w1,w2|
linea.gsub!(w1,w2)#reemplazaenlinea
end
end
f=File.new("resultados.txt","w")
a.each{|linea|f.puts"#{linea}"}#imprimeenelarchivo
f.close
else
puts"#{archivo}noexiste"#reportamosunerrorsinoexiste
end
Datos2.txt:
Esteesunmensajepara@nombre@:@mensaje@;quedesetranquilo.
EstimadoSr@nombre@,sustropasdicen:"@mensaje@,@mensaje@,@mensaje@".
Resultados.txt:
EsteesunmensajeparaCesar:vencimos;quedesetranquilo.
EstimadoSrCesar,sustropasdicen:"vencimos,vencimos,vencimos".
70
20.4:
defesComienzo(codon)#verificaelcodondecomienzo
return("AUG"==codon)
end
defesFinal(codon)#verificaelcodondeterminacion
return(("UAG"==codon)or("UGA"==codon)or("UAA"==codon))
end
#datosparatraducirdecodonaproteina
$codigoGenetico={"UUU"=>"F","UUC"=>"F","UUA"=>"L","UUG"=>"L",
"UCU"=>"S","UCC"=>"S","UCA"=>"S","UCG"=>"S","UAU"=>"Y",
"UAC"=>"Y","UAA"=>"[stop]","UAG"=>"[stop]","UGU"=>"C",
"UGC"=>"C","UGA"=>"[stop]","UGG"=>"W","CUU"=>"L",
"CUC"=>"L","CUA"=>"L","CUG"=>"L","CCU"=>"P","CCC"=>"P",
"CCA"=>"P","CCG"=>"P","CAU"=>"H","CAC"=>"H","CAA"=>"Q",
"CAG"=>"Q","CGU"=>"A","CGC"=>"A","CGA"=>"A","CGG"=>"A",
"AUU"=>"I","AUC"=>"I","AUA"=>"I","AUG"=>"M","ACU"=>"T",
"ACC"=>"T","ACA"=>"T","ACG"=>"T","AAU"=>"N","AAC"=>"N",
"AAA"=>"K","AAG"=>"K","AGU"=>"S","AGC"=>"S","AGA"=>"R",
"AGG"=>"R","GUU"=>"V","GUC"=>"V","GUA"=>"V","GUG"=>"V",
"GCU"=>"A","GCC"=>"A","GCA"=>"A","GCG"=>"A","GAU"=>"D",
"GAC"=>"D","GAA"=>"E","GAG"=>"E","GGU"=>"G","GGC"=>"G",
"GGA"=>"G","GGG"=>"G"}
deftoRNA(linea)#conviertecadenalargaaarraydecodones
returnlinea.scan(/.../)#partecadatresletras
end
defestaBienConstruida(codons)#funcionparaverificarcomienzoyfinal
returnesComienzo(codons[0])andesFinal(codons[1])
end
archivo="arn.txt"#archivoaleer
ifFile.exists?(archivo)#loprocesamossiexiste
f=File.open(archivo)
a=f.readlines(archivo)#loleemos
f.close#locerramos
result=Array.new#nuevoarregloconresultados
a.eachdo|linea|#procesamoscadalinea
linea.lstrip!#remueveespaciosalaizquierda
linea.rstrip!#remueveespaciosaladerecha
linea.chomp!#remueve\nalfinal
ifnotlinea.empty?
linea.upcase!#convierteamayusculas
codons=toRNA(linea)#conviertecadenaaarreglo
ifestaBienConstruida(codons)
proteina=String.new#preparacadenapararesultado
codons.eachdo|codon|
proteina+=$codigoGenetico[codon]#reemplazaproteina
end
result.push(proteina)
else
result.push("Error:cadenanocomienzaoterminabien")
end
result.push(proteina)#anadelanuevacadenaalarreglo
end
end
#(continua...)
71
#(...continua)
f=File.new("proteinas.txt","w")
result.each{|linea|f.puts"#{linea}"}#imprimeenelarchivo
f.close
else
puts"#{archivo}noexiste"#reportamosunerrorsinoexiste
end
#esteeselarchivodedatos(ponerloseparado):arn.txt:
AUGGCACUCGCGGAGGCCGACGACGGCGCGGUGGUCUUCGGCGAGGAGCAGUGA
#esteeselresultado:proteinas.txt:
MALAEADDGAVVFGEEQ[stop]
23.2:
0.step(3.14,0.02){|x|putssprintf("%3.2f%5.3f",x,Math.sin(x))}
72
Bibliografa
73
74
Learn to Program
http://pine.fm/LearnToProgram/
Learn Ruby
http://www.math.umd.edu/~dcarrera/ruby/0.3/
Curiosidades Matemticas
Algunos de los ejercicios hacen referencia a temas, en su mayora,
matemticos, con los que quizs el lector no est familiarizado. Los
siguientes enlaces ofrecen ms informacin sobre estos temas.
Cociente Aureo
http://en.wikipedia.org/wiki/Golden_ratio
Cdigo Gentico
http://en.wikipedia.org/wiki/Genetic_code
Coeficiente Binomial
http://en.wikipedia.org/wiki/Binomial_coefficient
Nmero de Euler, e
http://en.wikipedia.org/wiki/E_%28mathematical_constant%29
Serie de Fibonacci
http://en.wikipedia.org/wiki/Fibonacci_number#Limit_of_consecuti
ve_quotients
Frmula de Euler
http://en.wikipedia.org/wiki/Euler%27s_formula
Lmites
http://en.wikipedia.org/wiki/Limit_%28mathematics%29
Matrices
http://en.wikipedia.org/wiki/Matrix_%28mathematics%29
Series de Taylor
http://en.wikipedia.org/wiki/Taylor_series
Tringulo de Pascal
http://en.wikipedia.org/wiki/Pascal%27s_triangle
Pi
http://en.wikipedia.org/wiki/Pi
Polgonos
http://en.wikipedia.org/wiki/Polygon
75
Apndices
Apndice A. El Cdigo ASCII
El cdigo ASCII, American Standard Code for Information Interchange,
(Cdigo Estndar Americano para Intercambio de Informacin) fue definido
en 1960 para teletipos (mquinas que mandaban mensajes elctricos por
cable), y es un cdigo de 7 bits (de 0 a 127) para los caracteres impresos del
ingls.
Este cdigo tuvo muchas limitaciones: por ejemplo, no se podan hacer los
caracteres especiales del espaol (), as que luego tuvo que ser
extendido a 8 bits. Pero tampoco se podan hacer los caracteres de otros
idiomas, as que hubo necesidad de desarrollar otros cdigos, tales como
Unicode y UTF, que son los que actualmente se usan, de 2 bytes, y que
cubren todos los idiomas del mundo, incluyendo smbolos especiales de
matemticas, financieros, etc.
El cdigo ASCII se puede generar fcilmente con un ciclo que itere sobre la
funcin chr: [del 0 al 31, y el 127, se omiten por ser caracteres de control]
32.upto(126){|c|putsc.chr}
32:(espacio)
33:!
34:"
35:#
36:$
37:%
38:&
39:'
40:(
41:)
42:*
43:+
44:,
45:
46:.
47:/
48:0
49:1
50:2
51:3
52:4
53:5
54:6
55:7
56:8
57:9
58::
59:;
60:<
61:=
62:>
63:?
64:@
65:A
66:B
67:C
68:D
69:E
70:F
71:G
72:H
73:I
74:J
75:K
76:L
77:M
78:N
79:O
80:P
81:Q
82:R
83:S
84:T
85:U
86:V
87:W
88:X
89:Y
90:Z
91:[
92:\
93:]
94:^
95:_
96:`
97:a
98:b
99:c
100:d
101:e
102:f
103:g
104:h
105:i
106:j
107:k
108:l
109:m
110:n
76
111:o
112:p
113:q
114:r
115:s
116:t
117:u
118:v
119:w
120:x
121:y
122:z
123:{
124:|
125:}
126:~
77
78
79
80
Sobre el Autor
Diego F Guilln Nakamura tiene un BSc en ingeniera
Elctrica y Electrnica de la Universidad de Los Andes
(Bogot, Colombia), y un MSc con especializacin en
Inteligencia Artificial de la Universidad de Sofa (Tokyo,
Japn). Diego lleva ejerciendo su profesin ms de 25 aos,
durante el cual ha usado ms de 15 lenguajes de
programacin. Actualmente, Diego trabaja en el rea de
software para una multinacional japonesa, y vive en Gold Coast, Australia.
En el presente, sus intereses acadmicos estn en las reas de matemticas,
bioinformtica, lenguajes de programacin, y Linux. En sus ratos libres
Diego disfruta escuchando y practicando las armonas de la msica choro y
bossanova de Brazil en la guitarra clsica.
Este libro fue hecho, en su mayora, con tecnologas Open Source, gratuitas:
81
Indice Alfanumrico
abs....................................................9
acos().............................................11
acumuladores.................................20
and.................................................22
append............................................12
aprender haciendo............................v
archivos..........................................47
arrays.............................................14
arreglo............................................14
ASCII.........................................9, 76
asignacin........................................6
asin()..............................................11
atan()..............................................11
atributo escribible..........................39
atributo legible...............................39
atributos.........................................37
attr..................................................40
attr_reader......................................39
attr_writer......................................40
binario............................................12
break..............................................28
cadena..............................................7
cadenas...........................................12
capitalize........................................13
case................................................31
categoras.......................................36
ceil...................................................9
chr....................................................9
Ciclos.............................................27
Clases.............................................36
collect.............................................57
comentario.......................................6
complejos.........................................9
concat()..........................................14
constructor.....................................37
contadores......................................20
corrientes.......................................51
cos()...............................................11
cosh().............................................11
Date................................................16
day.................................................16
def..................................................33
delete..............................................13
82
detect..............................................57
Dir..................................................50
directorios......................................50
do...................................................19
downcase........................................13
downto().........................................28
each....................................18, 27, 57
each_with_index().........................57
editor de texto................................23
else...........................................25, 31
elsif................................................25
empty?............................................14
enteros, ............................................8
Enumerable....................................57
exp()...............................................11
expresiones regulares.....................45
factorial....................................29, 33
falso................................................22
Fechas............................................16
File.................................................47
File.exists?()...................................47
File.new().......................................48
File.open()......................................47
finite?...............................................9
first.................................................14
flatten.............................................14
floor..................................................9
flujo del programa..........................25
for ... in...........................................27
funciones........................................33
funciones hiperblicas...................11
funciones trigonomtricas..............11
gsub().............................................46
has_key?()......................................17
has_value?()...................................17
Hash...............................................17
Hash.delete.....................................17
Hash.keys.......................................17
Hash.sort........................................17
Hash.values....................................17
Hash.values_at...............................17
Herencia.........................................44
hex..................................................12
Horas..............................................16
hour................................................16
HTML............................................23
hypot()...........................................11
if.....................................................25
igualdad...........................................8
incremento.....................................28
ndice.............................................14
infinite? ...........................................9
initialize().......................................37
insert..............................................13
insert()............................................14
Instalar.............................................3
instancias.................................36, 38
IO.............................................47, 51
IO.lineno........................................48
IO.read()........................................48
IO.readlines().................................47
irb.....................................................6
iterar...............................................18
join()..............................................15
last..................................................14
length.............................................12
llaves..............................................18
log()...............................................11
log10()...........................................11
Lgica Condicional........................25
loop................................................28
map()..............................................57
matemtica viva..............................vi
Math...............................................11
Math::E..........................................11
Math::PI.........................................11
matrices..........................................29
menor sorpresa.................................2
mtodos..........................................37
min.................................................16
mixins............................................57
modulo.............................................8
mdulos.........................................56
month.............................................16
new.................................................36
now................................................16
nmeros...........................................8
objeto.........................................8, 36
oct..................................................12
Open Source.....................................1
or....................................................22
parmetros......................................33
patrones genricos.........................45
polimorfismo de interfaces............57
Pop.................................................15
private............................................42
propiedades....................................36
protected........................................42
public.............................................42
punto flotante...................................8
push................................................15
puts...................................................7
Python..............................................1
racionales.........................................9
Rails.................................................1
rango..............................................27
RDE...............................................23
reales, racionales, y complejos........8
recursividad....................................33
return........................................12, 33
reverse........................................13 s.
round................................................9
Ruby.................................................1
Ruby interactivo...............................6
scan()..............................................46
SciTE....................................23 s., 77
sec..................................................16
serie de Taylor...............................29
shift................................................15
smbolos.........................................41
sin()................................................11
sinh()..............................................11
sort.................................................14
sprintf()..........................................53
sqrt.................................................11
STDERR........................................51
STDIN............................................51
STDOUT........................................51
step()..............................................28
streams...........................................51
strftime...........................................16
Strings............................................12
sub()...............................................46
subcadena.......................................13
subclase..........................................44
83
superclase.......................................44
swapcase........................................13
tab..................................................12
tan()................................................11
tanh()..............................................11
Taxonoma.....................................44
taxonomas.....................................36
Time...............................................16
times...............................................27
Tk...................................................23
to_f...................................................8
to_s...................................................8
unless.............................................26
unshift............................................15
until................................................28
upcase............................................13
upto().............................................27
valores de verdad...........................22
variable............................................6
variables de la instancia.................36
variables globales..........................33
vector.............................................14
verdadero.......................................22
vim.................................................23
visibilidad......................................39
wday...............................................16
when...............................................31
while..............................................28
yday...............................................16
84
year................................................16
yield...............................................55
zero? ................................................9
......................................................14
-........................................................7
-=....................................................20
@....................................................37
*.......................................................7
**.....................................................7
*=...................................................21
/........................................................7
/=....................................................21
\n....................................................12
\t.....................................................12
#.......................................................6
%......................................................8
+.......................................................7
+=...................................................20
<.....................................................22
<<.............................................12, 15
<=...................................................22
<=>.................................................22
=.......................................................7
=()..................................................39
==...............................................8, 22
=>...................................................17
=~...................................................46
>.....................................................22
>=...................................................22