Sab Jul 28, 2007 7:33 am
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 117
|
|
|
|
|
Me pongo con el siguiente ejercicio:
9) Operaciones con matrices.
A ver si repaso estas operaciones que ya se me olvidaron jejeje.  |
|
|
|
Sab Jul 28, 2007 8:25 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
Como ejercicios para el futuro, estaría bien reescribir estos programas, pero intentando reducirlos a la mitad, a la tercera y a la cuarta parte (o menos).  |
|

Sab Jul 28, 2007 8:40 am
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
| explorer escribió: | | creating021 escribió: | | Cuando usas esa formula estás encontrando el área de un cuadrilátero regular y dividiéndolo por dos... si el triángulo no es de 90º no puedes usar la fórmula (sin partir el triángulo)... es más, ni siquiera la fórmula de Herón es válida para todos los triángulos (ver geometría hiperbólica y curvatura del espacio-tiempo) aunque con ingenio y mucho tiempo de trabajo se puede lograr. | Por favor, creating021, entra en el enlace que he puesto a la página de Wikipedia. Y presta especial atención al gráfico animado de la derecha.
He revisado media docena de páginas más, de matemáticas, y todas ponen lo mismo. Se puede aplicar la formula independientemente de si es o no un triángulo rectángulo. Nada de partir el triángulo. Si se dispone de una base y de una altura, es fácil calcular su área.
¿Tienes un contraejemplo?
http://descartes.cnice.mecd.es/3_eso/Figuras_geometricas_del_plano/figugeo_2.htm
http://www.dmae.upct.es/~pepemar/triangulo/area.htm (el primer applet es particularmente divertido)
http://mimosa.cnice.mecd.es/clobo/geoweb/area5.htm (último applet, todas las combinaciones de base y altura) |
Si... supongamos que tienes un triángulo isósceles, 10 cm. los lados mayores y 5 el menor.
Encuentra el área _sin_ usar pitágoras y usando la fórmula propuesta (b*a/2) de este triángulo (10 cm. los mayores y 5 el menor).
Como verás, en el mismo dibujo animado que comentas, parten el triángulo (de forma imaginaria) en dos (a la mitad) llamándola altura y encontrándola por medio del teorema de pitágoras (ya que forma dos triángulos rectos)... después duplican el área triangular original formando un cuadrilátero regular (base x altura) y lo dividen para tener el triángulo.
Bien, con cualquiera de los dos lo puedes lograr, solo que con Herón te ahorras tiempo y recursos al no tener que encontrar la altura. |
|

Sab Jul 28, 2007 8:43 am
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
| explorer escribió: | Como ejercicios para el futuro, estaría bien reescribir estos programas, pero intentando reducirlos a la mitad, a la tercera y a la cuarta parte (o menos).  |
Y ahora que lo comentas o lo quiero hacer unificado (como un solo programa) para hacer un suit matemático-geométrico y agregar un par de cosas. |
|
Sab Jul 28, 2007 9:32 am
|
 |
Norther
Perlero Frecuente

|
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
|
|
|
|
|
Al menos no apuntas muy alto...  |
|

Sab Jul 28, 2007 10:30 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
| creating021 escribió: | | explorer escribió: | | ¿Tienes un contraejemplo? |
Si... supongamos que tienes un triángulo isósceles, 10 cm. los lados mayores y 5 el menor.
Encuentra el área _sin_ usar pitágoras y usando la fórmula propuesta (b*a/2) de este triángulo (10 cm. los mayores y 5 el menor). |
Muy fácil... usando trigonometría básica:
Para conocer la altura h del triángulo isósceles necesitamos conocer el ángulo α entre el lado mayor y el menor.
Sabemos que 10 * cos α = 2,5. 2,5 es la mitad de la base de lado 5, hasta el punto donde se cruza con la altura h, por lo que también sabemos que 10 * sin α = h.
Bueno, de la primera fórmula sacamos que el ángulo es α = 1,318 rad. Aplicándolo a la segunda tenemos que h = 9,6824.
Luego la superficie del triángulo es S = base * h / 2 = 5 * 9,6824 / 2 = 24,2061.
Comprobémoslo con la fórmula de Herón:
S = 1/4 * sqr( (10+10+5) * (10+10-5) * (10-10+5) * (10-10+5) ) = 24,2061.
Aquí no se está discutiendo si el número de operaciones es mayor o menor. Estamos viendo que si el usuario dispone de la base y la altura, se puede aplicar la fórmula a cualquier triángulo para poder saber su superficie. Si dispone sólo de la longitud de los lados naturalmente que puede usar Herón, pero aquí estamos hablando de una afirmación que todavía no has demostrado, de la que la base*altura/2 no es aplicable a triángulos distintos de los rectángulos.
| creating021 escribió: | | Como verás, en el mismo dibujo animado que comentas, parten el triángulo (de forma imaginaria) en dos (a la mitad) llamándola altura y encontrándola por medio del teorema de pitágoras (ya que forma dos triángulos rectos)... después duplican el área triangular original formando un cuadrilátero regular (base x altura) y lo dividen para tener el triángulo. |
O yo estoy ciego o no estamos viendo el mismo dibujo. Yo no veo por ninguna parte que la altura divida el triángulo por la mitad.
No hay fórmula de pitágoras. Lo que hacen es: dividen el triángulo en dos partes (distintas). Pero en la siguiente secuencia lo que hacen es duplicar la superficie del triángulo y colocar sobre uno de los lados, formando un paralelepípedo (cuya superficie es S=base*altura). De este segundo triángulo lo dividen por la altura, esta vez sí, y "mueven" la parte del triángulo más a la derecha a la parte izquierda del paralelepípedo, para convertirlo en un rectángulo (así es como se demuestra el cálculo de la superficie de un paralelepípedo). Bueno, pues si la superficie de este rectángulo es base por altura, como hemos duplicado el área del triangulo original, significa que su área es la mitad.
Si hubieras visto alguno de los applets que te ponía más arriba verías que la fórmula se aplica a TODO triángulo. |
|

Sab Jul 28, 2007 11:04 am
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
Je, je bueno, me explico:
Mi demostración es la siguiente:
Requieres de una segunda ecuación para encontrarlo y esto requiere partir el triángulo para encontrar una área distinta (un cuadrado, por eso b*a).
¿Que tipo de demostración es esa si la ecuación es correcta?
Bueno que estos triángulos "carecen" de una altura definida y digo que "carecen" puesto que no está explicita y creo (sólo creo) que a nivel aplicativo es mas útil ingresar los 3 lados y que el programa haga el resto.
Mi demostración no es matemática sino funcional y si estoy siendo muy "cabeciduro" lo siento.
| Cita: | | No hay fórmula de pitágoras. Lo que hacen es: dividen el triángulo en dos partes (distintas). Pero en la siguiente secuencia lo que hacen es duplicar la superficie del triángulo y colocar sobre uno de los lados, formando un paralelepípedo (cuya superficie es S=base*altura). De este segundo triángulo lo dividen por la altura, esta vez sí, y "mueven" la parte del triángulo más a la derecha a la parte izquierda del paralelepípedo, para convertirlo en un rectángulo (así es como se demuestra el cálculo de la superficie de un paralelepípedo). Bueno, pues si la superficie de este rectángulo es base por altura, como hemos duplicado el área del triangulo original, significa que su área es la mitad. |
Como quieras, por ahora me quedo con Herón, simple y limpio. |
|

Sab Jul 28, 2007 11:50 am
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 117
|
|
|
|
|
La formula de Herón me parece que tiene unas limitaciones, esta claro que es la forma más sencilla. Pero creo recordar que en triángulos con forma de alfiler esta fórmula falla. El caso de triángulo con forma de alfiler se da si introduces dimensiones para dos de los lados pequeñas en relación al otro lado, por ejemplo:
 |
|
Sab Jul 28, 2007 1:01 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
| Zeokat escribió: | La formula de Herón me parece que tiene unas limitaciones, esta claro que es la forma más sencilla. Pero creo recordar que en triángulos con forma de alfiler esta fórmula falla. El caso de triángulo con forma de alfiler se da si introduces dimensiones para dos de los lados pequeñas en relación al otro lado, por ejemplo:
 |
Ese no es un triángulo según el teorema del seno  |
|
Sab Jul 28, 2007 3:08 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
| JAJAJA.... ¡ay!, ¡¡¡que me parto!!! |
|
Dom Jul 29, 2007 1:12 pm
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 117
|
|
|
|
|
Bueno.... no termino de ver lo que dices creating...
Seguimos con los ejercicos. 
Ultima edición por Zeokat el Dom Jul 29, 2007 5:53 pm, editado 1 vez |
|

Dom Jul 27, 2008 10:44 am
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 117
|
|
|
|
|
Tras un tiempo ocupado con otras cosas, continúo.
Tengo un par de dudas, antes de empezar:
¿Qué diferencia hay entre las comillas simples y las comillas dobles?
Por ejemplo, a la hora de declarar una variable
| Perl: | my $variable = "@palabra"; #esto da error
my $variable = '@palabra'; #no da error
#¿Por qué?
|
Ahora tengo problemas con los array (matrices). Hasta ahora siempre usé array unidimensionales o listas. Pero ahora necesito trabajar con array de varias dimensiones, en principio bidimensionales.
Las primeras dudas están en el siguiente código:
| Perl: | #!/usr/bin/perl -w
use strict;
use diagnostics;
#¿Una matriz con valores predefinidos se declara así?
my @matriz = (["uno-uno", "uno-dos", "uno-tres"],
["dos-uno", "dos-dos", "dos-tres"],
["tres-uno", "tres-dos", "tres-tres"]);
print $matriz[1][2], "\n"; #Esto imprime correctamente
print @matriz , "\n"; #¿Qué imprime esto?
print $matriz[1] , "\n"; #Y esto ¿qué imprime?
#¿Se declara así una matriz de tres filas vacías?
#¿Declaro con los corchetes el número de filas?
my @matriz2 = ([], [], []);
#¿Cómo añado por ejemplo la variable "salami" en la posición (0,1) de @matriz2?
|
|
|

Dom Jul 27, 2008 1:05 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
La diferencia entre las comillas simples y dobles se comenta varias veces en este sitio. Por ejemplo, en el último comentario de este hilo.
En cuanto a las dudas que tienes con el segundo programa, lo mejor es ejecutarlo, claro.
Para imprimir estructuras más allá de los tipos simples, lo recomendable es usar Data::Dumper.
En Perl no se declara, a priori, el tamaño que van a ocupar los array.
La documentación relacionada con esto la tienes en perldata , perllol, y el tutorial perldsc.
En cuanto a la última pregunta, lo debes hacer como lo has dicho:
| Perl: | $matriz2[0][1] = 'salami'; |
|
|

Dom Jul 27, 2008 5:15 pm
|
 |
Zeokat
Perlero Frecuente

|
Registrado: 22 Ago 2006
Mensajes: 117
|
|
|
|
|
Cuando preguntaba qué imprimía, evidentemente ya había ejecutado el script, pero como salían cosas extrañas a la hora de imprimir, pues tenía curiosidad por saber qué era eso... direcciones de memoria... o quién sabe...
Escribí unas líneas tras echar un ojo por encima a los links facilitados por explorer, con la documentación.
| Perl: | #!/usr/bin/perl -w
use strict;
use diagnostics;
my @matriz = ([1, 5, 1],
[0, 1, 1],
[9, 4, 2]);
my @matriz1 = ([2, 2, 3],
[0, 8, 8],
[1, 3, 7]);
my @matriz_suma = ([], [], []);
#Sumar dos elementos directamente.
print $matriz[0][1] + $matriz1[0][0], "\n";
print @ {$matriz[0]}, "\n"; #Imprime una fila (empezando a contar en 0).
print $ #matriz,"\n\n"; #Me devuelve el numero de filas
print $ #{$matriz[0]},"\n"; #Me devuelve el numero de columnas
#Suma @matriz + @matriz1
for my $i ( 0 .. $ #matriz ) {
for my $j ( 0 .. $ #{$matriz[$i]} ) {
my $suma = $matriz[$i][$j] + $matriz1[$i][$j];
$matriz_suma[$i][$j] = $suma;
}
}
#Imprime una matriz por filas, en este caso la matriz suma.
for my $i ( 0 .. $ #matriz_suma ) {
print @ {$matriz_suma[$i]} , "\n";
}
#Imprime una matriz elemento a elemento.
for my $i ( 0 .. $ #matriz_suma ) {
for my $j ( 0 .. $ #{$matriz_suma[$i]} ) {
print $matriz_suma[$i][$j], " | ";
}
} |
Quizás haya cosas que se hagan de una forma más sencilla e incluso más rápida y cómoda. El Data::Dumper no lo usé y quizás me hubiese simplificado las cosas  |
|

Dom Jul 27, 2008 6:18 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
Yo veo bien todo lo que haces.
Solo dos detalles:
* No es necesario que inicialices la variable @matriz_suma. Perl construirá la estructura a medida de que vayas indicando cómo es
* Una cosa es pintar una fila con esta forma
| Perl: | print @ {$matriz_suma[$i]} , "\n"; | que con esta otra forma | Perl: | print "@{$matriz_suma[$i]}\n"; |
En la segunda forma, estás indicando una interpolación de las variables (por efecto de las dobles comillas), por lo que Perl desarmará el array que encuentra ahí, pero usando como valor de separador el valor de la variable especial $" (ver perlvar).
Pruébalo. Notarás la diferencia. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|