domingo, 7 de noviembre de 2010

Máquinas de Turing

La máquina de Turing es un modelo computacional autómata que de una forma secuencial realiza una lectura/escritura de datos, moviéndose en los dos sentidos, derecha e izquierda.

Kurt Gödel descubrió que ciertos teoremas matemáticos aunque eran ciertos no podían ser probados por personas, entonces aquí entra lo que es el concepto de máquina de Turing, introducido por Alan Mathison Turing, quien quería demostrar que estos teoremas se podían probar de una manera mecánica a través de la máquina de Turing.


La máquina de Turing esta conformada por:

  • Una cinta. Una cinta es infinita y esta conformada por celdas o casillas, además sobre ella se realiza la lectura/escritura de los datos. Las celdas en las que en un principio no se ha escrito nada, contienen un carácter especial nulo o vacío que se representa por medio de un 0 o por medio de #. En cada celda se puede escribir un símbolo de un conjunto finito de símbolos llamado alfabeto de la máquina.
  • Un cabezal. Hay un dispositivo que se mueve sobre la cinta, el cual contiene un cabezal. El cabezal se puede mover a la derecha y a la izquierda de la posición en que se encuentre de la cinta. Además el cabezal puede leer el contenido de una celda, de una en una, o escribir en la celda cualquier símbolo de su alfabeto .
  • Un registro de estado. El registro de estado es el que almacena los estados de la máquina. Lo estados de la máquina son finitos y la máquina no tiene que empezar exactamente con un estado especifico.
  • Tabla de acción. Contiene las instrucciones que se realizarán, y al ejecutarse estas instrucciones, se siguen los siguientes pasos:
  1. Se lee el carácter o símbolo en la posición que se encuentra el cabezal.
  2. Se escribe un nuevo símbolo en esa posición (puede ser el mismo que había). El símbolo que se escriba tiene que ser del alfabeto de la máquina y además depende del estado actual y del carácter leído.
  3. Se desplaza el cabezal una celda ya sea a la izquierda o a la derecha.
  4. Se decidirá cual será el nuevo estado en función del estado actual y del carácter que se acaba de leer. Si la tabla de acción no tiene ya correspondencia con el estado actual y con el símbolo, entonces la máquina ya no realiza su funcionamiento, es decir la máquina detiene su funcionamiento.
Ejemplo de una suma de dos números.
Para realizar la suma de dos números, representaremos a cada número tantos unos como se el tamaño del número, es decir, que si vamos a sumar los números 3 y 5, entonces al número 3 lo representaremos así, 111 (3 veces 1) y al número 5 lo representaremos así 11111 (5 veces 1).

Si tenemos a los dos números que sumaremos, separados por un 0, entonces lo que haríamos para sumarlos, sería cambiar un 1 de cualquier extremo de la cinta a un 0, y después al 0 que esta separando a los dos números lo convertiríamos a un 1. Así, ya tendríamos todos los unos juntos, es decir, ya tendríamos los dos números (3 y 5) juntos, es decir, ya estarían sumados.

Es decir, esto sería así:
Cinta
0000111011111000

Ahora colocaremos un 0 en el primer 1 de la izquierda.
0000011011111000

Ahora, colocaremos un 1 en donde se encuentra el 0 de separación.
0000011111111000

Y ahora que ya tenemos todos los unos juntos, es decir los dos números, 3 y 5, ya tenemos la suma, que es 8 unos, entonces la suma de 3 y 5 es 8.

Veamos esto ahora implementándolo con la máquina de Turing.

Vamos a suponer que la máquina se encuentra del lado izquierdo. Empezamos con el estado A y como el cabezal no se encuentra necesariamente antes del primer número, en este caso en el 111 (3), haremos que el cabezal llegue hasta allí sin alterar los caracteres anteriores a este número. Lo que haremos, será que cuando el cabezal lea un 0 en una celda y este en estado A, entonces se escribirá un cero, es decir no se alterará nada, después se volverá al estado A y se moverá hacia la derecha.

Después al moverse a la derecha se llegará al primer número, es decir al 111 (3), y como nos encontraremos en estado A y llegamos a un 1, entonces se cambiará al 1 por un 0 (este 1 es el único que debemos cambiar a 0 como lo mencione anteriormente, cambiar un 1 de cualquier extremo de la cinta a un 0). Como seguiremos a la derecha para llegar al 0 de separación, nos encontraremos con mas unos, entonces como nos encontramos en estado A, esos unos se convertirían en ceros, pero no queremos esto, ya que queremos juntar los unos, para realizar la suma de los dos números, entonces lo que haremos será añadir un nuevo estado B, que cuando se encuentre un 1 en estado A, se deberá pasar a estado B.

Ya cuando se convirtió en 0 el 1, el estado A se pasa a estado B, entonces se seguirá desplazando el cabezal hacia la derecha hasta llegar al 0 de separación, sin alterar nada y cuando se va desplazando el cabezal por cada celda y se encuentra un 1 en estado B, entonces este 1 se convertirá en un 1 y se pasará el cabezal hacia la derecha y se pasará de nuevo a estado B. Y ya cuando llegue a una celda en donde encuentre el carácter 0, significa que ha llegado al 0 de separación y si esta en estado B, entonces este 0 se convertirá a 1.

Ahora que la suma esta terminada, entonces la máquina deberá de parar y pasar a un estado correspondiente, al cual llamaremos @. Cuando la máquina llega a este estado, ya no leerá ninguna celda mas y tampoco ya no se desplazará, entonces la máquina se detendrá.

El programa de este ejemplo con la máquina Turing es así (donde > es desplazarse hacia la derecha):

           0         1 

A 0,A,> 0,B,>

B 1,@ 1,B,>

Las páginas en las que me base son las siguientes:

Computación: Máquina de Turing
Máquina de Turing
Máquinas de Turing

Videos sobre la máquina de Turing

viernes, 29 de octubre de 2010

Mas Scripts

Hola compañeros, a continuación les mostraré mas programas que realice en los lenguajes AWK y PYTHON.

Lenguaje AWK
En este lenguaje cree dos programas más. Como ya lo había mencionado antes, AWK es un lenguaje que es muy eficiente para bases de datos, ya que con tan solo unas líneas de código, es posible acceder a una base de datos y realizar distintas instrucciones.

Uno de los programas que realicé en AWK, lo llame sumarregistros.awk, y es el siguiente:

#!/usr/bin/awk

BEGIN{suma = 0}
{sum = suma + NR}
END{print "El archivo contiene", sum, "registros"}

Lo que este programa realiza, es, sumar el numero de registros que se pueden encontrar en una base de datos, es decir, el numero total de lineas que contiene el archivo o base de datos y después imprime ese número de registros.
Este código comienza con la expresion BEGIN y termina con la expresion END, esto hace que el programa realice acciones antes de ir (procesar) al primer registro; si estas expresiones no se colocaran, entonces el programa me imprimiría el numero de cada registro (linea), es decir, si el archivo contiene 4 lineas o registros, entonces me imprimirá 4 veces, El archivo contiene 1 registros y asi hasta llegar al número 4.

Iniciamos con suma = 0, y después coloque sum = suma + NR, que es aquí donde se obtiene la suma total de registros del archivo o base de datos.

NR (Number of record, Número de registro) es una variable predefinida, que contiene el numero de registros del archivo o base de datos.

Y al final del código coloque {print "El archivo contiene", sum, "registros"}, que esto hace que se impriman en la terminal el número de registros.

A continuación, les muestro el archivo que utilicé para ejecutar este programa, al cual nombre como arch.txt.

arch.txt

Como vemos, este archivo llamado arch.txt, solo contiene 4 registros ó lineas.

Para ejecutar este programa tecleeamos lo siguiente en la terminal:
awk -f sumarregistros.awk arch.txt


Ejecución


Otro programa que realicé en AWK, es uno que procesa o lee cada linea de un archivo o base de datos, e imprime el número total de campos que hay en cada uno de los registros o lineas del archivo. El

El código del programa, al cual nombre como linea.awk, es el siguiente:

#!/usr/bin/awk

{print "Procesando linea"}
{print "La linea", NR, "contiene", NF, "campos"}

Como ya sabemos NR es el número de registros de un archivo, pero ahora utilicé además de esta variable, a la variable NF(Number of fields, Número de campos), que es el número de campos que contiene cada registro que se va leyendo o procesando de un archivo o base de datos.
Este programa, en la parte de {print "La linea", NR, "contiene", NF, "campos"}, me va imprimiendo el número de cada línea del archivo, junto con el número total de campos que contiene esta linea.
Los campos son el total de palabras que contiene cada registro o línea, que son delimitados por el caracter "espacio".

A continuación, les muestro el archivo que utilicé para este programa, el cual nombre como archivo.txt.

archivo.txt


Podemos ver, que la linea 1 contiene 4 campos, la linea 2 contiene 3 campos, la linea 3 contiene 5 campos, la linea 4 contiene 6 campos y la linea 5 contiene 4 campos.

Para ejecutar este programa, tecleamos en la terminal lo siguiente:
awk -f linea.awk archivo.txt


Ejecución


Lenguaje PYTHON
En el lenguaje Python realice varios programas utilizando un módulo o libreria llamada os, la cual contiene comandos para crear carpetas, borrar carpetas, eliminar archivos, cambiar nombre a un archivo, ver si algun archivo existe o no, etc.

Uno de los programas que realicé en Python, lo llame oscrear.py, y es el siguiente:

#!usr/bin/python

import os

b = raw_input("\nNombre de la carpeta que desea crear: ")

os.mkdir(b)

print("Creando carpeta..."), b


Lo que este programa realiza, es crear una carpeta.
Principalmente, se coloca el módulo o librería os, colocandola así import os.
La parte de b = raw_input("\nNombre de la carpeta que desea crear: "), pide al usuario que introduzca el nombre de la carpeta que desea que se cree.
Si en vez de colocar raw_input(""), se colocara int(input("")), al momento de que se te pide el nombre de la carpeta a crear, aparece un error, ya que se esta introduciendo el nombre de una carpeta, es decir, se estan introduciendo letras, y es por eso que se debe colocar raw_input(""), ya que esta función lee la entrada, en este caso, el nombre de la carpeta a crear y la convierte en una cadena.

El comando os.mkdir(b), es el que reliza la creación de la carpeta.
b es la carpeta a crear, y es por eso que se coloca dentro de (), en el comando os.mkdir, para que el comando cree a b, es decir, cree a la carpeta con el nombre que el usuario haya introducido.

A continuación les muestro la imagen en donde aún no se ha creado la carpeta.


Para ejecutar este programa, introducimos en la terminal lo siguiente:
python oscrear.py


Ejecución

En este caso, el nombre de la carpeta que se creó se llama Trabajos, y a continuación les muestro la imagen en donde se muestra que esta carpeta ya ha sido creada.


Otro programa que realice en Python lo llame osborrac.py, y es el siguiente:

#!/usr/bin/python

import os

c = raw_input("\nIntroduzca el nombre de la carpeta que desea eliminar: ")

os.rmdir(c)

print "Borrando...", c

Este programa lo que realiza es eliminar una carpeta que el usuario introduzca, por eso es c = raw_input("\nIntroduzca el nombre de la carpeta que desea eliminar: "), donde c, es la carpeta que se desea que sea eliminada. E igualmente utilice raw_input(), ya que se introduce también el nombre de una carpeta (cadena), pero en este caso para ser eliminada.
os.rmdir(c), es el comando que realiza la acción de eliminar la carpeta.
Algo que es importante, es que este comando solo elimina carpetas vacías. Algo también importante es que al ser eliminada la carpeta, se eliminará totalmente, es decir, no se enviará a la papelera de reciclaje o Trash.

Bueno, les mostraré la imagen de una carpeta llamada Tareas que contiene un archivo.


Y para ejecutar el programa, teclearemos lo siguiente:
python osborrarc.py


Ejecución (Con carpeta Tareas, no vacía)

Como vemos, nos marca un error, diciendonos que el directorio o carpeta no esta vacía.

Aquí les muestro la imagen de la carpeta que en el programa anterior realice, llamada Trabajos.


Ejecución (Eliminar carpeta Trabajos, vacía)

Como vemos, ya no nos mostró ningún error, ya que la carpeta Trabajos esta vacía

Y a continuación les muestro la imagen donde ya la carpeta Trabajos ha sido eliminada.


Bueno, el siguiente programa lo llamé osborrara.py, , que igual que los programas anteriores contiene un comando que en esete caso lo que realiza, es eliminar un archivo.
El código de este programa es el siguiente:

#!/usr/bin/python

import os

a = raw_input("\nArchivo que se desea eliminar: ")

os.remove(a)

print "Borrando archivo...", a

En este programa también se tiene que colocar la funciónraw_input(""), ya que este programa lo que realiza es eliminar un archivo, y primeramente se pide al usuario que introduzca el nombre del archivo que desea eliminar, y el nombre del archivo debe convertirse en una cadena; es por eso que se utiliza también en este programa la función raw_input(""), siendo a, el archivo a eliminar.
El comando os.remove(), es el que realiza la función de eliminar el archivo que el usuario ha introducido.
El archivo a, se encuentra dentro de (), en el comando os.remove(), para que sea eliminado.
Algo importante, es que al ser eliminado el archivo, se eliminará totalmente, es deicr, no se enviará a la papelera de reciclaje o Trash.

Si se desea eliminar directamente un archivo sin la necesidad de introducir el nombre de este en la terminal, entonces en el comando se tendrá que colocar el nombre del archivo a eliminar junto con su extensión y entre comillas simples o dobles, es decir, os.remove('nombredearchivo.extension') o os.remove("nombredearchivo.extension").

El archivo que utilice para ejecutar este programa, lo nombre ar.txt, y a continuación les muestro la imagen en donde se muestra que el archivo aún no se ha eliminado.


Para ejecutar el programa, tecleamos en la terminal lo siguiente:
python osborrara.py


Ejecución


Aquí les muestro la imagen donde se muestra que el archivo ar.txt ha sido eliminado.


El siguiente programa que realicé, lo llame oscambiar.py, y es el siguiente:

#!/usr/bin/python

import os

d = raw_input("\nNombre del archivo al que desea cambiar el nombre: ")

e = raw_input("\nNombre nuevo del archivo: ")

os.rename(d,e)

print "\nCambiando nombre del archivo ", d
print "por el nombre de ", e

Lo que este programa realiza es cambiar el nombre de un archivo.
Primeramente mediante la parte del código:
d = raw_input("\nNombre del archivo al que desea cambiar el nombre: ")
e = raw_input("\nNombre nuevo del archivo: ")
se le pide al usuario que introduzca el nombre del archivo al que desea cambiarle el nombre, y después se pide al usuario que introduzca el nombre nuevo del archivo, siendo d y e, el archivo al que se le desea cambiar el nombre, y el nombre nuevo del archivo, respectivamente.

El comando os.rename(d,e), es el que realiza el cambio de nombre del archivo. Dentro de (), se coloca primeramente el archivo al que se desea cambiarle el nombre y después de una coma se coloca el nombre nuevo del archivo, en este caso, os.rename(d,e).
Si directamente se desea cambiar el nombre de un archivo sin la necesidad de introducirlo en la terminal, entonces en el comando os.rename(), se colocará dentro de (), el nombre del archivo al que se desea cambiar el nombre, y el nombre nuevo del archivo, respectivamente, con sus extensiones, dentro de comillas simples o comillas dobles, es decir, os.rename('nombredearchivo.extension','nombrenuevodearchivo.extension') o os.rename("nombredearchivo.extension","nombrenuevodearchivo.extension").

El programa que utilicé para ejecutar este programa se llama HolaMundo.java.
Aquí les muestro la imagen en donde se muestra este archivo con el nombre que aún no ha sido cambiado.


Para ejecutar este programa, tecleamos en la terminal lo siguiente:
python oscambiar.py


Ejecución

Como se muestra en la ejecución, se cambió el nombre de HolaMundo.java por el nombre de HelloWorld.java.

Aquí les muestro la imagen en donde se muestra el archivo HolaMundo.java ahora con el nombre de HelloWorld.java.


El siguiente programa lo nombre osexiste.py y es el siguiente:

#!/usr/bin/python

import os

a = raw_input("\nQue archivo desea saber si existe: ")

os.path.exists(a)

if os.path.exists(a):

print "\nSi existe el archivo ", a
print "\nEl archivo es el siguiente: \n"
f = open(a, "r")
for i in f:
print i

else:
print "\nNo existe el archivo ", a


Lo que este programa realiza, es decir si un archivo existe o no, y si existe, imprime lo que se encuentra en el archivo.
Primero se pide al usuario que introduzca el nombre del archivo que desea saber si existe mediante: a = raw_input("\nQue archivo desea saber si existe: "), donde a, es el archivo que se desea saber si existe. También se utiliza la función raw_input(""), para convertir en cadena el nombre del archivo.

El comando os.path.exists(a), es el que realiza la función de decir si un archivo existe.
if os.path.exists(a):, es una condición que menciona que si a existe, entonces mediante print "\nSi existe el archivo ", a , se imprimirá que el archivo a, existe. Además, ya que el archivo si existe, entonces mediante f = open(a, "r"), el archivo a, será abierto en modo de lectura ("r"), y mediante for i in f:, se irá leyendo el archivo a, y mediante print i, se imprimirá el contenido del archivo a. Y mediante else:
print "\nNo existe el archivo ", a, se dice que si no existe el archivo entonces se imprimirá que el archivo a, no existe.

Hay algo muy importante en la sintaxis del if, del for y del else.
Esto es, que cuando después de cada una de estas sentencias, todo lo que se coloque dentro de ellas, se deberá pasar un espacio hacia la derecha en cada línea, sino se hace esto, al momento de ejecutar el programa, se maracará un error, ya que se estará esperando que se coloque una sangría o espacio en lo que esta dentro de cada una de estas sentencias. Ya que si no se coloca de esta manera lo que este dentro de cada sentencia, entonces el programa estará tomando en cuenta que esa parte no esta dentro de la sentencia.
Además después de cada una de estas sentencias se deberan de color : (dos puntos).

Aquí les muestro la imagen de los archivos existentes.


Para ejecutar este programa, tecleamos en la terminal lo siguiente:
python osexiste.py


Aquí les muestro la ejecución del programa, en donde se introdujo el nombre de un archivo que no existe.

Como vemos el archivo jik.txt no existe, como lo podemos ver en la imagen en donde se encuentran los archivos existentes.

Aquí les muestro la imagen de un archivo que si existe, el cual se llama palabras.py.

Como podemos ver, este archivo si existe, y lo podemos comprobar observando la imagen en donde se encuentran los archivos existentes.
También en esta ejecución se puede ver que se imprimió lo que se encuentra dentro de este archivo palabras.py.

Aquí les muestro lo que en este archivo existe, para que se observe que es la misma información que se imprimió en la terminal.


Bueno aquí les dejo los links para descargar estos programas:
oscrear.py
osborrarc.py
osborrara.py
oscambiar.py
osexiste.py

También les dejo los links de las páginas que utilice para realizar los programas, (son en las que mas me base):
AWK
PYTHON

Bueno espero que hayan entendido cada uno de estos programas.
Gracias por su atención.
Saludos.

martes, 19 de octubre de 2010

Terecera Presentación "Detección de palíndromos"


Bueno, esta es la presemtación del tema "Detección de palíndromos que mi compañera Sandra Cecilia Urbina Coronado y yo escogimos.
Saludos.

viernes, 24 de septiembre de 2010

Lenguajes Scripting

Hola compañeros a continuación les publicaré los programas que realice en los lenguajes scripting: AWK, SHELL y PERL.

AWK
Bueno un programa en el lenguaje AWK, que sencillamente este lenguaje scripting es muy sencillo de utilizar, y me llamó la atención que solo con pocas líneas de código se pueden realizar cosas tan eficaces y rápidas.

EL primer programa que realicé en AWK se llama buscar.awk; este programa lo realice con el fin de buscar datos en un archivo, ya que cotidianamente se pueden tener bases de datos con mucha información, y en las cuales se requiere encontrar una información específica y pues con este programa se pueden buscar datos que contengan algunas letras o números específicamente, por ejemplo se pueden buscar datos en donde se encuentren palabras que lleven el término "es", o también se pueden buscar datos que contengan por ejemplo el número "7".

Bueno, hice dos archivos de texto que contienen columnas con datos, para que al momento de que el programa se ejecutará, me buscará cierta información con ciertos términos y después me los imrpimiera.

Código buscar.awk

#!/usr/bin/awk
/do/ {print $0}
/re/ {print $0}
/es/ {print $0}
/0/ {print $0}


Bueno, los términos encerrados entre //, son los términos que se buscarán en los dos archivos de texto que hice, en los cuales realice tres columnas en cada uno; el print$0, hace que se impriman las líneas en donde se encuentren dichos términos. Y si en vez de escribir print$0, se escribe print$1, entonces se imprimirá la primera columna, pero no toda la columna, si no las filas de la columna, de las cuales se hallen los términos buscados, es decir de la ejecución que hice de este programa, se imprimirán todas las tres columnas, cuyas filas contienen los términos buscados, pero con el print$1 solo se imprimirá la columna uno de esta ejecución, y si fuese print$2, se imprimirá la segunda columna e igualmente si fuese print$3, se imprimirá la tercera columna.

Un dato importante, es que, al tener cada fila, más de un dato de los que se estan buscando, la fila se imprimirá el número de veces, tantos datos se hayan encontrado en ella.

Bueno, aquí coloco la ejecución de este programa y así mismo las imagenes de los archivos de texto que utilice. Y como la imagen lo muestra, para ejecutar el programa buscar.awk se tendrá que escribir en la terminal lo siguiente:

awk -f buscar.awk archivo.txt archivo2.txt


Archivo.txt



Archivo2.txt



Ejecución




SHELL
SHELL es un lenguaje scripting sencillo de entender.
El programa que realice en SHELL se llama eliminar.sh, en sí lo que este programa realiza es eliminar archivos o programas con una extensión en especifico, en este caso con la extensión .txt, pero te los elimina totalmente de la computadora, es decir no los manda a la papelera de reciclaje o Trash. Este programa me agrado hacerlo en este lenguaje ya que fue muy sencillo y no necesite de mucho código.

Bueno, aquí les introduzco el código del programa:

Código eliminar.sh

#!/bin/sh
for a in $(ls *.txt); do
rm $a
echo ""
echo Archivo $a Eliminado
done


Bueno, para comenzar se utilizo el for para que fuese leyendo todos los archivos que tenían la extensión .txt, después se colocó a, que en si viene siendo la variable archivo, es decir todos los archivos .txt. Lo que va dentro del parentesis, es decir (ls *.txt), es la lectura que hace el for.
Si se quieren eliminar archivos .pl, pues solo se colocaría (ls *.pl) y asi con cualquier extensión.
Lo que hace rm $a es ir eliminando cada archivo .txt.
Y echo Archivo $a Eliminado solo muestra los archivos que se han eliminado con la extensión .txt.
El in el do y el done son parte de la sintaxis del for.

Para ejecutar el programa, se escribirá en la terminal, lo siguiente:

./eliminar.sh


Y a continuación les muestro las imagenes, de cuando estaban los archivos.txt y cuando ya fueron eliminados y además la ejecución en la terminal.

Con archivos.txt



Archivos.txt eliminados



Ejecución



Una nota importante, es, que solo se eliminarán los archivos, en este caso .txt que se encuentren en donde yo me encuentre en la terminal, es decir, si en la terminal yo estoy en Documentos, y alli ejecuto el programa, pues solamente se eliminarán los archivos .txt que se encuentren en Documentos.

Realice un segundo programa en SHELL, que a la verdad es igual al programa anterior, solo que en este no se eliminarán los archivos, si no solo se mostrarán y por esta razón le llame mostrar.sh. Puede servir para cuando se tienen demasiados archivos y se quieren encontrar ciertos archivos con especificas extensiones.

Aquí esta el código:

Código mostrar.sh


#!/bin/sh
echo "*Mostrando archivos*"
echo ""
for a in $(ls *.java); do
echo Archivo $a
echo ""
done


En este caso, los archivos que me mostrará el programa al ejecutarse, serán archivos .java.
La sintaxis es la misma que la del programa anterior, solo que aqui se omite el rm, y se muestra echo Archivo $a, que lo que esto hace es ir imprimiendo los archivos .java que se han encontrado. Y el echo "", imprime un espacio (un enter o línea nueva). De la misma manera que en el programa anterior, si se quiere que la terminal te imprima los archivos.cpp, solo se necesita colocar *.cpp en (ls *.java), en vez de *.java.

Para ejecutar el programa, coloquen en la terminal:

./mostrar.sh


Aquí les muestro la imagen de los archivos .java que se encuentran y la ejecución del programa.

Archivos .java



Ejecución




PERL

Perl es un lenguaje Scripting, en el cual no es necesario declarar variables, pero también deja que lo hagas. Su sintaxis es muy sencilla, parecida a la del lenguaje C.

El programa que realice en el lenguaje PERL, se llama ecuacion.pl, el cual resuelve una ecuación de segundo grado. Fue bueno realizar este programa en PERL, ya que se aprende a utilizar funciones matemáticas y además el uso del if.

El código del programa es el siguiente:

Código ecuación.pl


#!/usr/bin/perl
$a;
$b;
$c;
$discr;
$x1;
$x2;
$xr;
$xi;
print "\n*Solucion de la ecuacion de segundo grado*\n\n";
print "Ingrese el valor de a -- > ";
($a = );
print "Ingrese el valor de b -- > ";
($b = );
print "Ingrese el valor de c -- > ";
($c = );

$discr = ($b**2)-4*$a*$c;

if($discr > 0){
print "\nLas dos raices son reales y distintas\n";
$x1 = (-$b + sqrt($discr))/(2*$a);
$x2 = (-$b - sqrt($discr))/(2*$a);
print "x1 = $x1 x2 = $x2\n";
}
if($discr == 0){
print "\nLas dos raices son reales e iguales x1 = x2\n";
$x1 = -$b/(2*$a);
print "x1 = $x1\n";
}
if($discr < 0){
print "\nLas dos raices son complejas conjugadas\n";
$xr = -$b/(2*$a);
$xi = sqrt(-$discr)/(2*$a);
print "xr = $xr xi = $xi\n";
}


Una ecuación de segundo grado se resuelve por la fórmula general que ya todos sabemos. Pero hay tres casos que se pueden dar en la solución de una ecuación de segundo grado. Los tres casos se dan, al resolver el discriminante de la ecuación, el cual se calcula asi, b²-4.a.c.
En la parte del código que dice

print "Ingrese el valor de a -- > ";
($a = );
print "Ingrese el valor de b -- > ";
($b = );
print "Ingrese el valor de c -- > ";
($c = );

se estan pidiendo los tres valores de la ecuación, a, b y c. STDIN, lee el valor que le damos a cada variable, es decir, a las variables $a, $b y $c y después les asigna ese valor.

Y como ya se tienen los valores de las tres variables, ahora si se puede calcular el discriminante, de la siguiente manera, $discr = ($b**2)-4*$a*$c;, en donde ($b**2), hace que el valor de la variable $b, se eleve al cuadrado y la parte 4*$a*$c, es una multiplicación de 4 por el valor de la variable $a por el valor de la variable $b y el resultado de esta multiplicación se le resta a ($b**2); es por eso que entre ($b**2) y 4*$a*$c, se coloca el operador -.

Pero, al evaluarse ya el discriminante, como ya mencione, se pueden dar tres casos.
El primero de ellos, en la parte del código es:

if($discr > 0){
print "\nLas dos raices son reales y distintas\n";
$x1 = (-$b + sqrt($discr))/(2*$a);
$x2 = (-$b - sqrt($discr))/(2*$a);
print "x1 = $x1 x2 = $x2\n";
}

Este nos dice, que si el discrimante fue mayor a cero, entonces nos imprimirá en la terminal que Las dos raíces son reales y distintas y además se evaluarán los resultados de $x1 y $x2 y se imprimirán. Se debe tener cuidado en como se escriben las operaciones, por ejemplo, para una raíz se debe colocar sqrt($variable), en donde $variable, será la variable a la cual se le obtenga la raíz cuadrada. Una multiplicación simplemente es asi, $var1*$var2, donde el operador es *. Una división es $var1/$var2, donde el operador es /. Al colocar un signo a una variable, como en el código, en la parte de -$b, simplemente, se le cambia el signo al valor de la variable $b.
Se debe tener cuidado con los parentesis, al evaluarse alguna operación o fórmula.

El segundo caso que se puede obtener es:

if($discr == 0){
print "\nLas dos raices son reales e iguales x1 = x2\n";
$x1 = -$b/(2*$a);
print "x1 = $x1\n";
}

Aquí nos dice, que si el valor del discriminante es igual a cero, entonces se imprimirá que Las dos raíces son reales e iguales y solo se hará la operación de $x1, ya que $x1 y $x2 son iguales. Y la operación que se raliza es, $x1 = -$b/(2*$a), en donde -$b, es el cambio de signo de el valor de la variable $b, y esto mismo se divide entre el resultado de multiplicar (2*$a). Y luego se imprime el resultado de $x1.
Select files to upload
Select folders to upload
Y la última parte del código que es:

if($discr < 0){
print "\nLas dos raices son complejas conjugadas\n";
$xr = -$b/(2*$a);
$xi = sqrt(-$discr)/(2*$a);
print "xr = $xr xi = $xi\n";
}

Este es el tercer caso, que nos menciona que si el valor del discriminante es menor a cero, entonces se imprimirá que Las dos raíces son complejas conjugadas.
Y se realizan dos operaciones, para obtener las dos raices que son $xr(raíz real) y $xi(raíz imaginaria). Como el discriminante aquí es negativo entonces en $xr = -$b/(2*$a), se omite la raíz del discriminante, porque el resultado de $xr es una raíz real. Y en la fórmula de $xi, si se coloca la raíz del dicriminante, ya que el resultado de $x1, es una raíz imaginaria. Pero hay algo muy importante en la parte de sqrt(-$discr), que es el signo de -, el cual hace que el valor del discriminante, al momento de realizarse su raíz cuadrada, sea positivo, ya que no se podría realizar la operación de una raíz negativa, y es por eso mismo que es una raíz imaginaria.

Pare ejecutar este programa, se colocará en la terminal lo siguiente:


perl ecuacion.pl


Aquí les colocó las imagenes de la ejecución del programa con los tres diferentes casos.

Raíces reales y distintas



Raíces reales e iguales



Raíces complejas conjugadas



Bueno estos son los programas que realice, de antemano espero que hayan entendido la expicación de cada uno de ellos.

Aquí les dejo los links para que puedan descargarlos.

buscar.awk
eliminar.sh
mostrar.sh
ecuacion.pl

Gracias por su atención.