Mostrando entradas con la etiqueta Lenguajes de Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Lenguajes de Programación. Mostrar todas las entradas

domingo, 21 de noviembre de 2010

LENGUAJES ORIENTADOS A OBJETOS - Reporte 8

Lenguajes de Programación - Semana 14 - Reporte 8

C++


Este programa que hice en C++ genera un buen amigo que se preocupa por ti :), llamado "Fulanito", fulanito es un objeto, los objetos de su clase tienen lo que yo llame "memoria", la memoria se divide en tres atributos, un string que almacena tu nombre y 2 enteros que almacenan las 2 respuestas que des a las 2 preguntas que te hará nuestro amigo. A su vez se implementan 3 métodos, uno de presentación y los otros 2 son cuando fulanito te formula las 2 preguntas.
#include <iostream>
#include <string>
using namespace std;

class Amigo {
string nombre;
int pre1, pre2;
public:
void presentacion();
int pregunta1();
void pregunta2();
};

void Amigo::presentacion() {
cout << "\nHola, me llamo Fulanito :), Como te llamas?" << endl;
getline(cin, nombre);
cout << "\nHola " << nombre << ", mucho gusto!!" << endl;
return;
}

int Amigo::pregunta1() {
cout << "\nY como has estado" << endl;
cout << "\n\t1. Bien :)\t\t2. Mal :(" << endl;
cin >> pre1;
if (pre1 == 1) {
cout << "\nQue bueno, yo tambien estoy muy bien :)" << endl;
return pre1;
} else
return pre1;
}

void Amigo::pregunta2 () {
cout << ":( cuentame porque estas mal... " << endl;
cout << "\n1. Estoy triste\t\t2. Estoy enfermo" << endl;
cin >> pre2;
if (pre2 == 1)
cout << "No estes triste, hoy es un lindo dia, vamos a pasear :)" << endl;
else if (pre2 == 2)
cout << "Bueno, deberias ir a ver al medico y descansar todo el dia :)" << endl;
else
return;
}

int main(int argc, char** args) {
Amigo fulanito;
int x;
fulanito.presentacion();
x = fulanito.pregunta1();
if (x == 2) {
fulanito.pregunta2();
}
return 0;
}

DESCARGA: amigo.cpp
Para compilar: g++ -o amigo amigo.cpp
Para ejecutar: ./amigo

EJECUCIÓN


Python


Para mi programa en Python decidí practicar la herencia múltiple, una caracteristica de la Programacion Orientada a Objetos de este lenguaje.
Declare muchas clases, cada una parecida pero diferente a las demás, y despues declare otras mas cuyo fin es heredar los atributos de las anteriores para asi generar un solo mensaje concatenado.
#!/usr/bin/python

class Mamifero:
def tipo (self):
print "Es mamifero, tiene pelo y es viviparo."

class Reptil:
def tipo (self):
print "Es reptil, tiene sangre fria y es oviparo."

class Ave:
def tipo (self):
print "Es un ave, tiene plumas y alas por lo que puede volar."

class Insecto:
def tipo (self):
print "En un insecto, come hojas, tiene antenas, tres pares de patas y exoesqueleto."

class Pez:
def tipo(self):
print "Es un pez, tiene escamas, es oviparo y respira por sus branquias."

class Acuatico:
def desplazar (self):
print "Como vive en el agua este animal nada y no se como duermen :p."

class Terrestre:
def desplazar (self):
print "Como vive en la tierra este animal camina sobre sus patas."

class Perro(Mamifero, Terrestre):
def caracteristicas(self):
print "\nEl perro come todo lo que le den y tiene 4 patas."

class Cocodrilo(Reptil, Terrestre):
def caracteristicas(self):
print "\nEl cocodrilo se come a otros animales y tiene 4 patas"

class Aguila(Ave):
def caracteristicas(self):
print "\nLas aguilas son carnivoras, cazan a sus presas."

class Hormiga(Insecto, Terrestre):
def caracteristicas(self):
print "\nLas hormigas cavan sus hogares bajo la tierra."

class Salmon(Pez, Acuatico):
def caracteristicas(self):
print "\nEl salmon es un pez espectacular, come otros peces mas pequenos que el y crustaceos, hacen el viaje mas impresionante del reino animal al regresar al lugar donde nacieron."

def main():
print "\n1. Perro\t\t2. Cocodrilo"
print "3. Aguila\t\t4. Hormiga"
print "5. Salmon"
x = input("Elige uno ->")
if x == 1:
obj = Perro()
obj.caracteristicas()
obj.desplazar()
obj.tipo()
elif x == 2:
obj = Cocodrilo()
obj.caracteristicas()
obj.desplazar()
obj.tipo()
elif x == 3:
obj = Aguila()
obj.caracteristicas()
obj.tipo()
elif x == 4:
obj = Hormiga()
obj.caracteristicas()
obj.desplazar()
obj.tipo()
elif x == 5:
obj = Salmon()
obj.caracteristicas()
obj.desplazar()
obj.tipo()
else:
print "\nOpcion no valida"

if __name__ == "__main__" :
main()

DESCARGA: animales.py
Para modificar permisos: chmod u+x animales.py
Para interpretar: ./animales.py

EJECUCIÓN


Java


Por último en Java, decidí implementar una calculadora super sencilla, con varios errores porque no he implementado las condiciones para los números negativos, pero funciona con números positivos. Toda la visualizacion es dentro de una ventana generada con las librerias de Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Calculadora extends JFrame {

JTextField pantalla;
double resultado;
String operacion;
JPanel numeros, operaciones;
boolean nuevaOperacion = true;

public Calculadora() {
super();
setSize(200, 250);
setTitle("Calculadora");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setResizable(false);

JPanel panel = (JPanel) this.getContentPane();
panel.setLayout(new BorderLayout());

pantalla = new JTextField("0", 20);
pantalla.setHorizontalAlignment(JTextField.RIGHT);
pantalla.setEditable(false);
pantalla.setBackground(Color.WHITE);
panel.add("North", pantalla);

numeros = new JPanel();
numeros.setLayout(new GridLayout(4, 3));

for (int n = 9; n >= 0; n--) {
BotonNumero("" + n);
}
BotonNumero(".");

panel.add("Center", numeros);

operaciones = new JPanel();
operaciones.setLayout(new GridLayout(6, 1));

BotonOperacion("C");
BotonOperacion("+");
BotonOperacion("-");
BotonOperacion("X");
BotonOperacion("/");
BotonOperacion("=");

panel.add("East", operaciones);
}

private void BotonNumero(String digito) {
JButton b = new JButton();
b.setText(digito);
b.addMouseListener(new MouseAdapter() {

@Override
public void mouseReleased(MouseEvent e) {
JButton b = (JButton) e.getSource();
numpresionado(b.getText());
}
});
numeros.add(b);
}

private void BotonOperacion(String operacion) {
JButton b = new JButton(operacion);
b.setForeground(Color.BLACK);
b.addMouseListener(new MouseAdapter() {

@Override
public void mouseReleased(MouseEvent e) {
JButton b = (JButton) e.getSource();
operpresionado(b.getText());
}
});
operaciones.add(b);
}

private void numpresionado(String digito) {
if (pantalla.getText().equals("0") || nuevaOperacion) {
pantalla.setText(digito);
} else {
pantalla.setText(pantalla.getText() + digito);
}
nuevaOperacion = false;
}

private void operpresionado(String tecla) {
if (tecla.equals("=")) {
calcular();
} else if(tecla.equals("C")) {
resultado = 0;
pantalla.setText("");
nuevaOperacion = true;
} else {
operacion = tecla;
if((resultado > 0) && !nuevaOperacion) {
calcular();
} else {
resultado = new Double(pantalla.getText());
}
}
nuevaOperacion = true;
}

private void calcular() {
if (operacion.equals("+")) {
resultado += new Double(pantalla.getText());
} else if (operacion.equals("-")) {
resultado -= new Double(pantalla.getText());
} else if (operacion.equals("/")) {
resultado /= new Double(pantalla.getText());
} else if (operacion.equals("X")) {
resultado *= new Double(pantalla.getText());
}
pantalla.setText("" + resultado);
operacion = "";
}

public static void main(String[] args) {
Calculadora c = new Calculadora();
c.setVisible(true);
}
}

DESCARGA: Calculadora.java
Para compilar: javac Calculadora.java
Para ejecutar: java Calculadora

EJECUCIÓN

sábado, 13 de noviembre de 2010

TIPOS DE DATOS - Presentacion 4

Lenguajes de Programacón - Semana 13

Espero les guste mi presentacion:




DESCARGA DEL CODIGO FUENTE: agenda.c


ANTES DE . . .

Antes de ejecutar el código, asegurense de crear una carpeta llamada agenda en donde descarguen el archivo, si no lo hacen el programa lanzara error porque lo primero que realiza es buscar dicha carpeta para generar el archivo de texto donde se guardarán los registros.

Comentarios, dudas, sugerencias son bienvenidas!!! ^_^ Participen para ganar puntos :p

C - Listas Enlazadas

Lenguajes de Programacón - Semana 12 - PUNTOS EXTRA

Esta aplicacion que escribí el semestre pasado nos permite realizar de una forma simple una lista enlazada. Primero se crea un nodo inicial el cual despues de llena con la información que nos es pedida, despues se nos pregunta si queremos seguir agregando nodos, esto se hace repetiviamente hasta que decidimos no agregar mas datos a la lista, al llegar a este punto la lista se imprime mostrandonos todos los datos incluidos.
// Programa que arma una lista doblemente enlazada

# include

typedef struct nodoN{
int info;
int cabecera;
struct nodoN *prev;
struct nodoN *next;
} NODO;

int main(void){
char pregunta;
int i = 1;
NODO *list, *p, *q;
list=(NODO*)malloc(sizeof(NODO));
list->info = 0;
list->cabecera = 1;
list->prev = NULL;
q = list;
p = (NODO*)malloc(sizeof(NODO));
list->next=p;
do{
++list->info;
printf("Dame un dato para la lista -> ");
scanf("%d", &p->info);
p->cabecera = 0;
p->prev = q;
p->next = NULL;
printf("Deseas seguir (s/n)");
scanf("%s", &pregunta);
if(pregunta == 's' || pregunta == 'S'){
q = p;
p = (NODO*)malloc(sizeof(NODO));
q->next = p;
}
} while(pregunta != 'n' && pregunta != 'N');
q = list;
printf("los nodos de la lista son %d\n", q->info);
do{
if(q == list){
q = list->next;
} else {
q = q->next;
}
printf("%d.-\t %d\n", i, q->info);
i++;
} while(q->next != NULL);
return 0;
}

DESCARGA: lista.c

Para compilar: gcc -o lista lista.c
Para ejecutar: ./lista


EJECUCION:



La lista utiliza punteros y su tamaño es definido por la funcion malloc. Es un ejemplo basico de una lista, de este esqueleto podemos hacer otras mas extensas y con mas funcionalidad

SALUDOS!!! ^_^

C - Pilas y Colas

Lenguajes de Programación - Semana 12 - PUNTOS EXTRA

Esta vez tambien traigo unos programitas que concluí en estos dias, se tratan se unas aplicaciones que simulan las estructuras de datos: pilas y colas.

PILA

Esta aplicación permite mediante un menú ejecutar diferentes tareas a la pila, claro que para ello primero hay que rellenarla con algunos datos, podemos imprimir los elementos, sacar elementos, meter elementos. Además es posible realizar operaciones con los 2 elementos de hasta arriba de la pila.
Se realiza con arreglos y realmente no es nada complicado de entender:
#include 
#define FALSE -1
#define TRUE 1

void cabecera(void) {
int i;
printf("|");
for(i = 0; i < 50; i++) printf("-");
printf("|\n|");
printf("\t\tEJEMPLO DE PILA\t\t\t |\n");
printf("|");
for(i = 0; i < 50; i++) printf("-");
printf("|\n");
return;
}

int empty(int top) {
if(top > -1)
return FALSE;
return TRUE;
}

int menu(void) {
int op;
printf("\n\t1. Push data\n");
printf("\t2. Pop data\n");
printf("\t3. Stacktop\n");
printf("\t4. Empty\n");
printf("\t5. Print\n");
printf("\t6. Operador\n");
printf("\t7. Exit\n\n");
printf(" Selecciona una opcion -> ");
scanf("%d", &op);
return (op);
}

int main(void) {
int opcion = 0, temp, i, temp2[2];
int pila [15], tope = -1;
char operador;
cabecera();
while (opcion < 7) {
switch(opcion = menu()) {
case 1: {
printf("\n\tIntroduce un dato -> ");
scanf("%d", &temp);
tope++;
pila[tope] = temp;
break;
}

case 2: {
printf("\n");
if(empty(tope) == FALSE) {
printf("\t\tElemento retirado -> [%d]\n\n", pila[tope]);
tope = tope -1;
} else
printf("\t\tPILA VACIA\n\n");
break;
}

case 3: {
printf("\n");
for(i = tope; i == tope; i++)
printf("\tElemento en el tope -> [%d]\n\n", pila[i]);
break;
}

case 4: {
if(empty(tope) == TRUE)
printf("\n\tLA PILA ESTA VACIA\n\n");
else
printf("\n\tLA PILA NO ESTA VACIA\n\n");
break;
}

case 5: {
printf("\n\tELEMENTOS EN PILA\n\n");
for(i = tope; i >= 0; i--)
printf("\t\t[%d]\n",pila[i]);
printf("\n");
break;
}

case 6: {
while (getchar() != '\n') continue;
printf("Que operacion quieres realizar?\n\n");
printf("\tSUMA -> +\n\tRESTA -> -\n\tMULTIPLICACION -> *\n\tDIVISION -> /\n");
scanf("%c", &operador);

switch(operador) {
case '*': {
if(empty(tope) == FALSE) {
temp2[0]=pila[tope];
tope = tope -1;
if(empty(tope) == FALSE) {
temp2[1]=pila[tope];
tope = tope;
pila[tope] = temp2[0] * temp2[1];
break;
}
}
}

case '/': {
if(empty(tope) == FALSE) {
temp2[0]=pila[tope];
tope = tope -1;
if(empty(tope) == FALSE) {
temp2[1]=pila[tope];
tope = tope;
pila[tope] = temp2[0] / temp2[1];
break;
}
}
}

case '+': {
if(empty(tope) == FALSE) {
temp2[0]=pila[tope];
tope = tope -1;
if(empty(tope) == FALSE) {
temp2[1]=pila[tope];
tope = tope;
pila[tope] = temp2[0] + temp2[1];
break;
}
}
}

case '-': {
if(empty(tope) == FALSE) {
temp2[0]=pila[tope];
tope = tope -1;
if(empty(tope) == FALSE) {
temp2[1]=pila[tope];
tope = tope;
pila[tope] = temp2[0] - temp2[1];
break;
}
}
}
}
}
}
}
return 0;
}


DESCARGA: pila.c

Para compilar: gcc -o pila pila.c
Para ejecutar: ./pila


EJECUCIÓN



COLA DE DATOS

En escencia se trata casi del mismo código anterior pero no es igual, ya que ahora se emula lo que sería una cola de datos, de igual forma se incluye un menú con las operaciones que se pueden realizar en una cola de datos, en este ejemplo no podemos realizar operaciones aritmeticas.
#include 
#define FALSE -1
#define TRUE 1

void cabecera(void) {
int i;
printf("|");
for(i = 0; i < 50; i++) printf("-");
printf("|\n|");
printf("\t\tEJEMPLO DE COLA DE DATOS\t |\n");
printf("|");
for(i = 0; i < 50; i++) printf("-");
printf("|\n");
return;
}

int empty(int frente, int fondo) {
if(frente > fondo)
return FALSE;
return TRUE;
}

int menu(void) {
int op;
printf("\n\t1. Insertar elemento\n");
printf("\t2. Retirar elemento\n");
printf("\t3. Elemento de incio\n");
printf("\t4. Verificar cola de datos\n");
printf("\t5. Imprimir cola de datos\n");
printf("\t6. Operador\n");
printf("\t7. Salir\n\n");
printf(" Selecciona una opcion -> ");
scanf("%d", &op);
return (op);
}

int main(void) {
int opcion = 0, temp, i, temp2[2];
int cola [15], frente = 0, fondo = -1;
char operador;
cabecera();
while(opcion < 6) {
switch(opcion = menu()) {
case 1: {
printf("\n\tDame el dato a ingresar -> ");
scanf("%d", &temp);
fondo++;
cola[fondo] = temp;
break;
}

case 2: {
printf("\n");
if(empty(frente, fondo) == FALSE) {
printf("\t\tElemento retirado -> [%d]\n\n", cola[frente]);
frente = frente +1;
} else
printf("\t\tCOLA DE DATOS VACIA\n\n");
break;
}

case 3: {
if(empty(frente, fondo) == FALSE)
printf("Elemento al frente es %d\n", cola[frente]);
else
printf("LA COLA DE DATOS ESTA VACIA\n");
break;
}

case 4: {
if(empty(frente, fondo)==TRUE)
printf("\n\tLA COLA DE DATOS ESTA VACIA\n\n");
else
printf("\n\tLA COLA DE DATOS NO ESTA VACIA\n\n");
break;
}

case 5: {
printf("\n\tELEMENTOS EN COLA\n\n");
printf("INICIO");
for(i=frente;i<=fondo;i++)
printf(" <- [%d]",cola[i]);
printf(" <- FIN\n\n");
break;
}
}
}
return 0;
}

DESCARGA: cola.c

Para compliar: gcc -o cola cola.c
Para ejecutar: ./cola


EJECUCIÓN



Espero y les sirvan para comprender estos dos conceptos con los que batallamos tanto el semestre pasado

SALUDOS!!! ^_^

C - Calculadora de Fracciones

Lenguajes de Programación - PUNTOS EXTRA

Termine de escribir este código que lo había dejado pendiente desde el semestre pasado, se trata de una calculadora que suma fracciones por medio una estructura, o mas bien, un nuevo tipo de dato definido por mi que toma la forma de una fracción y realiza las operaciones de la aritmética básica.

Esta es la definición de mi nuevo tipo de dato:
typedef struct fraccion {
int num;
int den;
} frac;

Un tipo de dato "fraccion" al cual me referire durante el programa como "frac", mi tipo de dato solo esta compuesto por el numerador y el denominador, ambos son enteros.

Este es el constructor del dato:
frac construye(int a, int b) {
frac temp;
temp.num = a;
if(b==0){
printf("El denominador no puede ser cero");
temp.den = 1;
return(temp);
}
temp.den = b;
return(temp);
}

Toma los parámetros enviados desde main, el numerador y denominador, y los fusiona en un solo tipo de dato; si el denominador el 0, la función regresa una fracción entera ademas de una advertencia. El constructor se visita 2 veces, porque las operaciones se realizan por parejas de datos.

Estas son los algoritmos para realizar las operaciones:
// Para sumar

frac add(frac a, frac b) {
frac temp;
temp.den = a.den * b.den;
temp.num = (a.num * b.den) + (a.den * b.num);
return(temp);
}

//Funcion para multiplicar

frac mult(frac a, frac b) {
frac temp;
temp.num = a.num * b.num;
temp.den = a.den * b.den;
return(temp);
}

//Funcion para div

frac div(frac a, frac b) {
frac temp;
temp.num = a.num * b.den;
temp.den = a.den * b.num;
return(temp);
}

// Para restar
frac res(frac a, frac b) {
frac temp;
b.num = b.num * -1;
temp = add(a, b);
return(temp);
}

Por si no se acuerdan: la suma es la adición de la multiplicación cruzada de los numeradores y denominadores, los denominadores se multiplican directo; la resta es igual solo cambiamos el signo de un numerador. La multiplicación es directa numerador x numerador, denominador x denominador; mientras que para la división se realiza una multiplicación cruzada.

Para imprimir los datos utilizo esta rutina:
void imprime (frac a, char op, frac b, frac c) {
printf("\n");
toprint(a);
printf(" %c ", op);
toprint(b);
printf(" = ");
toprint(c);
printf("\n");
return;
}

Esta rutina imprime las fracciones construidas con su resultado.

La funcion main pide los datos de una forma especial, no hace falta hacer elecciones ni nada, el formato de entrada de datos es el siguiente: num/den + num/den, mas grafico: 1/2+1/4
La funcion reconoce los datos y los envía al constructor y reconoce el operador aritmético para realizar determinada accion:
int main(int argc, char** args) {
char f, op;
int an, bn;
frac A, B, C;
f = 's';
printf("\t\tPROGRAMA PARA REALIZAR CALCULOS CON FRACCIONES\n\n");
do{
printf("Dame los datos\n");
scanf("%d/%d", &an, &bn);
A = construye(an, bn);
scanf("%c", &op);
scanf("%d/%d", &an, &bn);
B = construye(an, bn);
if(op == '+')
C = add(A, B);
if(op == '*')
C = mult(A, B);
if(op == '/')
C = div(A, B);
if(op == '-')
C = res(A, B);
imprime(A, op, B, C);
scanf("%c", &f);
} while(f!='f');
return 0;
}


PROGRAMA COMPLETO: fracciones.c

Para compilar: gcc -o fracciones fracciones.c
Para ejecutar: ./fracciones

EJECUCIÓN



PD: Para salir del programa escriben "f"

SALUDOS!!! ^_^

lunes, 8 de noviembre de 2010

C - Ejemplos sencillos

Lenguajes de Programación - Semana 12- PUNTOS EXTRA

Estas con algunas aplicaciones pequeñas escritas en C para pasar el rato :) que me gustaria compartirles

FRASE AL REVES

Toma una frase escrita desde el teclado, la almacena en un arreglo y despues utilizando la funcion strlen de la libreria string.h y con la ayuda de un ciclo for giramos la frase al reves.
//Leer una frase y escribirla al reves

#include
#include

int main(void) {
char frase[100];
int n;

printf("Introduce una frase y la escribire al reves [255 letras]\n");
printf("Cuando termines pulsa ENTER\n\n");
scanf("%[^\n]", frase);
printf("\n");

for (n=strlen(frase)-1; n>=0; n--)
printf("%c", frase[n]);

printf("\n\n");
return 0;
}

DESCARGA: frase.c

Para compilar: gcc -o frase frase.c
Para ejecutar: ./frase

EJECUCION


MULTIPLICACION

Este programa genera multiplicaciones aleatorias con la ayuda de la funcion rand y la libreria time.h que nos ayuda a variar los datos generados.
#include 
#include

DESCARGA: multaleatoria.c

Para compilar: gcc -o multaleatoria multaleatoria.c
Para ejecutar: ./multaleatoria

EJECUCION



RAIZ "X" DE UN NUMERO

Este programa resuelve la raiz "n" del numero que demos, por un metodo llamado de aproximacion.
// Programa para calcular una Raiz Cuadrada "x" de un numero "n"

#include

double absoluto(double x){
if(x < 0)
return(-1.0 * x);
return(x);
}

double potencia(double x, int n) {
int i;
double resultado = 1.0;
for(i = 0; i < n; i++)
resultado = resultado * x;
return(resultado);
}

double raizn(double R, int n) {
double x = 1.0, y = 2.0;
while(absoluto(x - y) > .00001) {
y = x;
x = (1.0 / n) * (((n - 1) * x) + (R / potencia(x, (n - 1))));
}
return(x);
}

int main(void) {

double raiz, valor, resultado;

printf("\t\t\tPROGRAMA PARA CALCULAR UNA RAIZ\n\n");
printf("Dame el numero para saber su raiz cuadrada -> ");
scanf("%lf", &valor);
printf("Dame el valor de la raiz -> ");
scanf ("%lf", &raiz);

resultado = raizn(valor, raiz);

printf("\nLa raiz %1.1lf del numero %1.1lf en = %1.2lf\n\n", raiz, valor, resultado);
return 0;
}


DESCARGA: raiz.c

Para compilar:gcc -o raiz raiz.c
Para ejecutar: ./raiz

EJECUCION



NUMEROS PRIMOS

Este programita generara una serie que contiene n numeros primos, la cantidad de resultados se puede controlar desde la constante MAX en el codigo fuente.
/* Programa que imprime "n" numeros primos de acuerdo al numero especificado 
en la constante MAX */

#include
#define MAX 50

int primo(int numero) {
int i;
for(i = 2; i < numero; i++)
if(numero % i == 0)
return 0;
return 1;
}

int main(void) {
int primos[MAX], i = 2, k = 0;
while(k < MAX) {
if(primo(i) == 1) {
primos[k] = i;
k = k + 1;
}
i = i + 1;
}
printf("\n\t\t\t%d numeros primos\n\n", MAX);
for(i = 0; i < MAX; i++)
printf("%d\t", primos[i]);
putchar('\n');
return 0;
}


DESCARGA: primos.c

Para compilar: gcc -o primos primos.c
Para ejecutar: ./primos

EJECUCION



SALUDOS!!! ^_^

FORTRAN - Ejemplos

Lenguajes de Programacón - PUNTOS EXTRA

MÁXIMO COMÚN DIVISOR

Este programa calcula el máximo común divisor de una pareja de números utilizando el Algoritmo de Euclides. Como sabemos el algoritmo de Euclides se fundamenta en que el máximo común divisor de la pareja de números a,b es el mismo que el de b,r, siendo r el residuo de la division anterior, por ello intercambiamos los valores de a por r a lo largo de la ejecucion del programa mientras el numero menor no sea igual a 0.

Para compilar: gfortran -o mcd mcd.f
Ejecutar con: ./mcd

Codigo
C ****** PROGRAMA QUE CALCULA EL ******
C ******* MAXIMO COMUN DIVISOR ********
C =====================================
PROGRAM mcd
REAL m, n, r, aux
PRINT*, 'Dame M: '
READ(*,*) m
PRINT*, 'Dame N: '
READ(*,*) n
PRINT*, 'Maximo Comun Divisor de:'
PRINT*, m, n
IF (m.LT.n) THEN
aux = m
m = n
n = aux
ENDIF
DO WHILE (r.NE.0)
r = MOD(m,n)
m = n
n = r
ENDDO
PRINT*, 'es',m
STOP
END


EJECUCION


Para verificar que los resultados son correctos, pueden hacerlo en esta página o calcular el MCD ustedes mismos Calcular MCD

DESCARGA: mcd.f

CALCULO DE LA FUERZA MAGNETICA APLICADA A SUS TRES VARIANTES

Como lo dice el tÍtulo, este algoritmo calcula la fuerza magnetica aplicada ya sea a una particula en movimiento, generada en un conductor o en un solenoide.
Tuve un pequeno problema con el calculo del angulo ya que fortran lo pedia en radianes, aplicando una formula de conversion resolvi el problema :)

Para compilar: gfortran -o fisica fisica.f
Para ejecutar: ./fisica

Codigo
C ******** PROGRAMA QUE CALCULA ************
C ******** LA FUERZA MAGNETICA *************
C ******** EN SUS TRES CASOS **************
C ==========================================
PROGRAM fisica

REAL x, q, v, b, i, l, n, o, theta, fb, a
PRINT*, 'Calcular la magnitud de la fuerza magnetica para: '
PRINT*, '1. Particulas en movimiento'
PRINT*, '2. Conductores'
PRINT*, '3. Solenoides'
PRINT*, '4+. Salir'
READ(*,*) x
IF (x.EQ.1) THEN
PRINT*, 'Dame la carga de la particula (Columb) '
READ(*,*) q
PRINT*, 'Dame la velocidad de la particula (Metros x seg.)'
READ(*,*) v
PRINT*, 'Dame la magnitud del campo magnetico (Teslas) '
READ(*,*) b
PRINT*, 'Dame el angulo de los vectores V X B (grados)'
READ(*,*) o
theta = ( o * 3.14159 ) / 180
fb = abs(q)*v*b*sin(theta)
PRINT*, 'La fueza magnetica para esta particula es',fb,'N'
ENDIF
IF (x.EQ.2) THEN
PRINT*, 'Dame la intensidad de la corriente (Amperes)'
READ(*,*) i
PRINT*, 'Dame la longitud del conductor (metros)'
READ(*,*) l
PRINT*, 'Dame la magnitud del campo magnetico (Teslas)'
READ(*,*) b
PRINT*, 'Dame el angulo de los vectores I X B (Grados)'
READ(*,*) o
theta = ( o * 3.14159 ) / 180
fb = i*l*b*sin(theta)
PRINT*, 'La fuerza magnetica para este conductor es',fb,'N'
ENDIF
IF (x.EQ.3) THEN
PRINT*, 'Dame el numero de vueltas del solenoide'
READ(*,*) n
PRINT*, 'Dame la intensidad de la corriente (Amperes)'
READ(*,*) i
PRINT*, 'Dame el area del solenoide (metros cuadrados)'
READ(*,*) a
PRINT*, 'Dame la magnitud del campo magnetico (Teslas)'
READ(*,*) b
PRINT*, 'Dame el angulo de los vectores V X B (Grados)'
READ(*,*) o
theta = ( o * 3.14159 ) / 180
fb = n*i*a*b*(sin(theta))
PRINT*, 'La fuerza magnetica para este solenoide es',fb,'N'
ENDIF
IF (x.GT.3) THEN
PRINT*, 'Saliendo . . . . .'
ENDIF
STOP
END


EJECUCION


DESCARGA: fisica.f



SALUDOS!!! ^_^

domingo, 7 de noviembre de 2010

LENGUAJES IMPERATIVOS - Programas Reporte 7

Lenguajes de Programación - Semana 12

FORTRAN
Fortran me inspiró bastante, asi que decidí aplicar algo de matemáticas para este lenguaje. Un programa que calcula las raices de una ecuación de segundo grado, incluyendo sus raices complejas. Para ello apliqué la fórmula general que todos conocemos y le agregue las condiciones para hallar las raices complejas, la cual es simple:

si el discriminante ( b^2 * 4*a*c ) es menor a 0, entonces la ecuación tendra raices complejas

Codigo:
C PROGRAMA QUE CALCULA LAS RAICES
C DE UNA ECUACION DE SEGUNDO GRADO
C --------------------------------------------
PROGRAM raices
REAL a, b, c, r, bc, rc, rc2, x, x1, x2
PRINT*, 'Dame el valor de A: '
READ(*,*) a
PRINT*, 'Dame el valor de B: '
READ(*,*) b
PRINT*, 'Dame el valor de C: '
READ(*,*) c

r = ((b**2)-(4*a*c))
PRINT*, r

IF (r.GE.0) THEN
x1 = (-b + (sqrt(r)))/(2*a)
x2 = (-b - (sqrt(r)))/(2*a)
PRINT*, 'x1 = ',x1
PRINT*, 'x2 = ',x2
ELSE
rc = (sqrt(abs(r)))
bc = -b / (2*a)
rc2 = rc / (2*a)
PRINT*, 'Solucion compleja x = ',bc,'+-',rc2,'i'
ENDIF
STOP
END

DESCARGA: raices.f

Para compilar: gfortran -o raices raices.f

Para ejecutar: ./raices


BASIC

Para BASIC hice una calculadora sencilla, da la opción de seguir introduciendo operaciones hasta hartarte, no te permite dividir entre 0 y no acepta letras al momento de realizar una operacion, esto último ya es una funcionalidad del lenguaje. Para cada operación de 2 numeros, los valores se separan por una coma (ver imagen).

Codigo:
DECLARE SUB suma (a AS SINGLE, b AS SINGLE)
DECLARE SUB res (a AS SINGLE, b AS SINGLE)
DECLARE SUB mult (a AS SINGLE, b AS SINGLE)
DECLARE SUB div (a AS SINGLE, b AS SINGLE)
DECLARE SUB pot (a AS SINGLE, b AS SINGLE)
DECLARE SUB raiz (a AS SINGLE)

''' Calculadora Sencilla
DIM x AS SINGLE, y AS SINGLE, opcion AS INTEGER
PRINT
PRINT "===== CALCULADORA 1.0 ====="
DO
PRINT
PRINT "1. Suma"
PRINT "2. Resta"
PRINT "3. Multiplicacion"
PRINT "4. Division"
PRINT "5. Potencia"
PRINT "6. Raiz Cuadrada"
PRINT "7+. SALIR"
PRINT
INPUT "Elige la operacion -> ", opcion
PRINT

SELECT CASE opcion
CASE 1
INPUT "Dame los dos valores a sumar -> ", x, y
suma x, y
CASE 2
INPUT "Dame los dos valores a restar -> ", x, y
res x, y
CASE 3
INPUT "Dame los dos valores a multiplicar ->", x, y
mult x, y
CASE 4
INPUT "Dame los dos valores a dividir -> ", x, y
div x, y
CASE 5
INPUT "Dame la base y el exponente (respect.) -> ", x, y
pot x, y
CASE 6
INPUT "Dame un numero para obtener su raiz cuadrada -> ", x
raiz x
CASE ELSE
PRINT "Saliendo . . . . . "
END SELECT
LOOP WHILE opcion < b =" 0"> ", b
WEND
r = a / b
PRINT
PRINT "Resultado: "; r
END SUB

SUB pot (a AS SINGLE, b AS SINGLE)
DIM i AS INTEGER
DIM c AS SINGLE
c = 1
FOR i = 1 TO b
c = c * a
NEXT i
PRINT
PRINT "Resultado: "; c
END SUB

SUB raiz (a AS SINGLE)
PRINT
PRINT "Resultado: "; SQR(a)
END SUB

DESCARGA: calculadora.bas

Para compilar: fbc calculadora.bas

Para ejecutar: ./calculadora


PASCAL

En este lenguaje batalle un poco, al final les muestro este otro que sirve para practicar la recursion en este lenguaje, un menú utilzando CASES, para seleccionar fibonacci, potencias o factorial

Codigo
PROGRAM recursion;

uses
crt;

Function fibonacci (x : Integer):LongInt;
Begin
If x <= 1 Then fibonacci := x Else fibonacci := (fibonacci(x-1) + fibonacci(x-2)); End; { fibonacci } Function potencia (a , b : Integer):LongInt; Begin If b = 0 Then potencia := 1 Else potencia := a * potencia(a , b-1); End; Function factorial(m : Integer):LongInt; Begin If m < recursion ="="="="="="="="');"> ');
opcion := ReadKey;

Case opcion of
'a' : begin
Writeln('');
Writeln('');
Write('BASE -> ');
Readln(num1);
Write('EXPONENTE -> ');
Readln(num2);
Writeln('');
Writeln('RESULTADO = ',potencia(num1,num2));
Writeln('');
end;
'b' : begin
Writeln('');
Writeln('');
Write('Cantidad de valores en la serie -> ');
Readln(num1);
For num2 := 1 To num1 Do
Write(fibonacci(num2),' | ');
Writeln('');
end;
'c' : begin
Writeln('');
Writeln('');
Write('Factorial de? -> ');
Readln(num1);
Writeln('');
Writeln(num1,'! = ',factorial(num1));
Writeln('');
end;
end; { case }
End.

DESCARGA: recursion.pas

Para compilar: fpc recursion.pas

Para ejecutar: ./recursion


C

En C hice este programita que calcula el salario de los trabajadores de una empresa, el programa solicita las horas trabajadas totales a las que se les aplica el sueldo base seleccionado. Tambien se calculan horas extra (si son mas de 40 horas) y se les aplica una tarifa especial.
Los impuestos se aplican de la siguiente forma:
15% a los primeros $500
16% a los siguientes $300
17% a lo que resta
Despues se suman los descuentos y se le restan a la percepcion asi se obtiene un sueldo neto.
Al final el programa imprime todo el desglose de descuentos, horas y sueldo neto. Todo se maneja por medio de constantes por lo que es fácilmente editable a otros impuestos y sueldos base

Codigo
/*Programa para calcular salario en diferentes esquemas de pago*/

#include <stdio.h>
#define BASE1 57.46
#define BASE2 55.84
#define BASE3 54.47
#define BASE4 53.00
#define EXTRA 15.00
#define TAX1 0.15
#define TAX2 0.16
#define TAX3 0.17

int menu(void) {
int opcion = 0, i;
for(i=0; i<79; i++) printf("=");
printf("\n\n");
printf("\t SELECCIONA EN NUMERO CORRESPONDIENTE A LA TAZA DE PAGO\n\n");
printf("\t1) $ %.2f hr \t\t\t\t", BASE1);
printf("\t2) $ %.2f hr\n\n", BASE2);
printf("\t3) $ %.2f hr\t\t\t\t", BASE3);
printf("\t4) $ %.2f hr\n\n", BASE4);
printf("\t5) Salir\n\n");
for(i=0;i<79;i++) printf("=");
scanf("%d", &opcion);
while(opcion > 5 || opcion == 0) {
printf("Elige una opcion valida -> ");
scanf("%d", &opcion);
}
return opcion;
}


float calculos(float x, float y) {
float horas, hrbase, hrext=0.0, hrtot;
float salariobase, temp=0.0, percepcion, sueldoneto;
float temp1=0.0, temp2=0.0, temp3=0.0;
float imp1=0.0, imp2=0.0, imp3=0.0, descuento;
hrbase = y;
if (y > 40) {
hrbase = 40;
hrext = y - 40;
temp = hrext * EXTRA;
}
hrtot = hrbase + hrext;
salariobase = hrbase * x;
percepcion = salariobase + temp;
if (percepcion <= 300.0) imp1 = percepcion*TAX1; if (percepcion > 300.0) {
temp1 = 300.0;
temp2 = percepcion - 300;
if (temp2 > 150.0){
temp3 = temp2 - 150;
temp2 = 150;
}
imp1 = temp1 * TAX1;
imp2 = temp2 * TAX2;
imp3 = temp3 * TAX3;
}

descuento = imp1 + imp2 + imp3;
sueldoneto = percepcion - descuento;
printf("\nHORAS BASE %1.2f\nHORAS EXTRA %1.2f\nHORAS TOTALES %1.2f\n\n", hrbase, hrext, hrtot);
printf("SALARIO BASE $%1.2f\nPAGO EXTRA $%1.2f\nPERCEPCION $%1.2f\n\n", salariobase, temp, percepcion);
printf("IMPUESTO 15%% -$%1.2f\nIMPUESTO 20%% -$%1.2f\nIMPUESTO 25%% -$%1.2f\nDESCUENTOS -$%1.2f\n\n", imp1, imp2, imp3, descuento);
return(sueldoneto);
}

int main(int argc, char** args) {
int opcion;
float horas, salario;
while(( opcion = menu()) != 5) {
switch(opcion) {
case 1: {
printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE1);
printf("\t\tHORA EXTRA [ $ %.2f ] \n\n", EXTRA);
printf("INTRODUCE LAS HORAS LABORADAS -> ");
scanf("%f", &horas);
salario = calculos(BASE1, horas);
printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
break;
}
case 2: {
printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE2);
printf("\t\tHORA EXTRA [ $ %.2f ] \n\n", EXTRA);
printf("INTRODUCE LAS HORAS LABORADAS -> ");
scanf("%f", &horas);
salario = calculos(BASE2, horas);
printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
break;
}
case 3: {
printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE3);
printf("\t\tHORA EXTRA [ $ %.2f ] \n\n", EXTRA);
printf("INTRODUCE LAS HORAS LABORADAS -> ");
scanf("%f", &horas);
salario = calculos(BASE3, horas);
printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
break;
}
case 4: {
printf("\n\t\tSistema para calcular el sueldo con base a $ %.2f x hr\n\n", BASE4);
printf("\t\tHORA EXTRA [ $ %.2f ] \n\n", EXTRA);
printf("INTRODUCE LAS HORAS LABORADAS -> ");
scanf("%f", &horas);
salario = calculos(BASE4, horas);
printf("SUELDO NETO A PAGAR [ $%1.2f ]\n\n", salario);
break;
}
}
}
return 0;
}

DESCARGA: salario.c

Para compilar: gcc -o salario salario.o

Para ejecutar: ./salario

Ejecucion


SALUDOS

domingo, 31 de octubre de 2010

PROLOG - Horario de Clase

Lenguajes de Programación - Semana 9 - PUNTOS EXTRA

Se plantea el siguiente acertijo:

”Un alumno de ITS, debido al nerviosismo del primer día de clase, ha anotado el nombre de sus profesores (Elisa, Fernando y Carlos), las asignaturas que se imparten (Lógica, Programación y Matemáticas) y el día de la semana de las distintas clases (lunes, miércoles y viernes), pero sólo
recuerda que:
- La clase de Programación, impartida por Elisa, es posterior a la de Lógica
- A Carlos no le gusta trabajar los lunes, día en el que no se imparte Lógica
Ayudale a relacionar cada profesor con su asignatura, así como el día de la semana que se imparte
(Sabemos que cada profesor imparte una única asignatura y que las clases se dan en días diferentes)”


Analicemos el problema mentalmente:

Tenemos 3 materias:

Lógica
Programación
Matemáticas


Tenemos 3 dias:

Lunes
Miércoles
Viernes


Tenemos 3 maestros:

Elisa
Carlos
Fernando


Con base a la redacción del problema tenemos las siguientes proposiciones:

Elisa da programación.
Carlos no trabaja el lunes.
El lunes no hay clase se Lógica.
Programación se imparte cualquier día posterior al Lunes.


Para acomodar los días en que se imparte cada materia sabemos solamente que los lunes no hay lógica, como programacón se da el día posterior a lógica entonces no puede impartirse el miércoles , y aunque necesitamos un día anterior ese día anterior no puede ser el lunes, entonces las materias se imparten en el siguiente orden:

Matemáticas los Lunes
Lógica los Miércoles
Programación los Viernes


Como Carlos no trabaja los lunes entonces solo le queda el miércoles para impartir clase porque Elisa le gan&ocute; los viernes, a Fernando no le qued&ocute; de otra mas que dar matemáticas. Entonces la respuesta al problema es:

Fernando da Matemáticas los Lunes
Carlos da Lógica los Miércoles
Elisa da Programación los Viernes


Analicemos el problema en PROLOG:

Primero convertimos cada una de las proposiciones en hechos:

materia(logica).
materia(programacion).
materia(matematicas).
maestro(elisa).
maestro(fernando).
maestro(carlos).
dia(lunes).
dia(miercoles).
dia(viernes).


Tendremos 3 formatos de respuesta diferentes:

imparte(X,Y) "Profesor X imparte la materia Y"
trabaja(X,Z) "Profesor X trabaja el día Z"
clase(Y, Z) "Hay clase Y el dia Z"

Tenemos la siguientes proposiciones predefinidas:

imparte(elisa, programacion). "Elisa imparte programacón"

Entonces para saber que maestro va el resto de las materias aplicaremos la siguiente regla:

imparte(X, Y) :- maestro(X), X\=elisa, materia(Y), imparte(elisa,YA), YA\=Y. "Sera verdad si hay un maestro X, a excepcion de Elisa; y existe una materia Y. Sacamos a Elisa de este conjunto porque ya sabemos que clase imparte, además recursivamente quitaremos el curso que imparte Elisa."

Sabemos tambien que Carlos ira cualquier día que no sea lunes, entonces:

trabaja(carlos, Z) :- dia(Z), Z\=lunes. " Carlos trabaja algún día Z, a excepción del Lunes"

La regla general queda:

trabaja(X, Z) :- maestro(X), X\=carlos, dia(Z), Z\=miercoles. "Sera verdad si hay un maestro X, quitando a Carlos, un dia Y. Quitamos a Carlos porque ya sabemos que lunes no va y los miercoles porque Carlos no va lunes y el viernes es de Elisa"

Tambien tenemos conocimento de que la clase de lógica no se da los lunes, entonces:

clase(logica, Z) :- dia(Z), Z\=lunes, Z\=viernes. "Sera verdad que logica se imparte el dia Z, si ese dia no es lunes o viernes; porque el lunes no aplica y el viernes tampoco puesto que sabemos hay una clase delante de ella"

clase(programacion, Z) :- dia(Z), Z\=lunes, clase(logica, ZA), ZA\=Z. "Sera verdad que programación se da un día Z, si ese día no es lunes; porque sabemos que hay una clase anterior a ella. Recursivamente quitamos el día en el que lógica puede impartirse"

La regla general queda:

clase(Y, Z) :- materia(Y), Y\=logica, Y\=programacion, clase(logica, ZA), clase(programacion, ZB), dia(Z), ZA\=Z, ZB\=Z. "Sera verdad si hay una materia Y que no sea lógica o programación, y cualquier día de la semana que no sean los días en que se imparte lógica y programación"

PROGRAMA COMPLETO

materia(logica).
materia(programacion).
materia(matematicas).
maestro(elisa).
maestro(fernando).
maestro(carlos).
dia(lunes).
dia(miercoles).
dia(viernes).
imparte(elisa, programacion).
imparte(X, Y) :- maestro(X), X\=elisa, materia(Y), imparte(elisa, YA), YA\=Y.
trabaja(carlos, Z) :- dia(Z), Z\=lunes.
trabaja(X, Z) :- maestro(X), X\=carlos, dia(Z), Z\=miercoles.
clase(programacion, Z) :- dia(Z), Z\=lunes, clase(logica, ZA), ZA\=Z.
clase(logica, Z) :- dia(Z), Z\=lunes, Z\=viernes.
clase(Y, Z) :- materia(Y), Y\=logica, Y\=programacion, clase(programacion, ZA), clase(logica, ZB), dia(Z), ZA\=Z, ZB\=Z.


Abrimos un archivo en emacs y lo llamaremos "horario.pro" (en terminal tecleamos: emacs -nw horario.pro ), tecleamos el código que les acabo de mostrar y guardamos todo.
Despues procedemos a abrir el interprete SWI-PROLOG:


Posteriormente cargamos el código que acabmos de guardar:


** OPCIONALMENTE PODEMOS TECLEAR LA OPCION listing. PARA VER LA CARGA DEL ARCHIVO, YO LA OMITO PORQUE LA IMAGEN ES MUY LARGA PARA ESTA ENTRADA.

Ahora evaluamos el problema, en este caso hay que concatenar todas nuestras preguntas para que se evalún juntas, si las ponemos separadas solo se nos mostraran todas las combinaciones de maestros, días y clases, pueden probarlo si quieren; asi evaluaremos toda la pregunta completa:

imparte(X,Y),trabaja(X,Z),clase(Y,Z).

Y este es el resultado:


Como ven, el resultado es el horario armado tal como la respuesta que obtuvimos analíticamente.

PD: La "a" al lado de la respuesta de Elisa la teclee yo, sirve para mostrar toda la lista de resultados sin tener que aplanar la tecla ";" para listar respuesta tras respuesta.

SALUDOS!!! ^_^

PROLOG - Cuatro Perros

Lenguajes de Programación - PUNTOS EXTRA

Se establece el siguiente razonamiento:

CUATRO PERROS

Tenemos cuatro perros: un galgo, un dogo, un alano y un podenco. Éste último come más que el galgo; el alano come más que el galgo y menos que el dogo, pero éste come más que el podenco. ¿Cuál de los cuatro será más barato de mantener?

La crisis esta dura, queremos una mascota y necesitamos saber cuál de todos los perros que nos mostraron en la tienda de mascotas es mas barato de mantener, analizando el problema mentalmente tenemos las siguientes proposiciones:

El Podenco come más que el Galgo.
EL Alano come más que el Galgo.
El Dogo come más que el Alano.
El Alano come más que el Podenco.

Entonces el orden (del más caro de mantener, al mas barato) es el siguiente:

1. DOGO
2. ALANO
3. PODENCO
4. GALGO

El Galgo es el mas barato a la larga, asi que corremos a comprarlo. ^_^

Vamos a analizar el mismo problema en PROLOG.

Primero convertimos las proposiciones a hechos para que sean compatibles con PROLOG, los hechos se basaran en "quien come mas que quien", es decir, tendremos esta sintaxis en los hechos:

come_mas(X , Y) "X come mas que Y.

Entonces:

come_mas(podenco, galgo).
come_mas(alano, galgo).
come_mas(dogo, alano).
come_mas(alano, podenco).

La regla se basara obviamente en "quien come menos de todos los demas", asi que generalizaremos la regla de la siguiente manera

come_menos(X, _) "X come menos que todos"

Esta regla aplica entonces a la inversa del hecho "quien come mas que quien", es decir, para evaluar quien come menos necesitamos el miembro Y del que come mas.

Entonces la regla queda así:

come_menos(X,_) :- come_mas(_,X).

PROGRAMA COMPLETO:

come_mas(podenco, galgo).
come_mas(alano, galgo).
come_mas(dogo, alano).
come_mas(alano, podenco).

come_menos(X,_) :-
come_mas(_,X).

Abrimos un archivo en emacs y lo llamaremos "perros.pro" (en terminal tecleamos: emacs -nw perros.pro ), tecleamos el código que les acabo de mostrar y guardamos todo.
Despues procedemos a abrir el interprete SWI-PROLOG:


Posteriormente cargamos el código que acabmos de guardar:


Ahora evaluamos el problema:

come_menos(X, _) "Quien come menos que todos?"

EJECUCIÓN:


Efectivamente, PROLOG nos responde que el Galgo come menos que todos los demas perros, ahora estamos mas que convencidos de comprar un Galgo.

SALUDOS!!! ^_^

jueves, 21 de octubre de 2010

CLASE - Selección e Iteración

Lenguajes de Programación - Semana 11 - Tarea 9 - Tercera Presentación

ALGORITMO DE FLOYD-WARSHALL

Diapositiva 1



Diapositiva 2


Ideado por Robert W. Floyd en 1962 basado en el Teorema de Warshall, es un algoritmo de análisis y optimizacion. Su objetivo encontrar la distancia mínima entre los vertices que forman un grafo, los cuales pueden tener una direccion y una ponderacion.

Diapositiva 3


Tenemos un grafo G con n vertices V y queremos ir por el Camino C, osea, ir del vertice 1 al 4. Sabemos que podemos pasar por puntos intermedios K que iran desde V1+1 a Vn-1. El algoritmo comparara todos los posibles caminos entre el par de vértices, teniendo un posible punto intermedio y se hara la estimación del camino más corto entre dos vértices, hasta que se sabe que la estimación es la óptima.
Este es el pseudocodigo lo explicare al grandes razgos la parte verde indica la carga de los datos, la funcion floyd_warshall, recibe el numero de vertices y una matriz cuadrada W de n X n vertices, se crea la matriz principal de distancias y una matriz de pasos, despues con los cliclos for de va cargando uno a uno los datos de W a D.
La parte roja son los ciclos principales del algoritmo, ahi se van comparando las distancias del vertice i al j pasando por k. Se comparan la suma de las coordenadas de las componentes de la matriz, si la suma es menor a la distancia original se mejora y se marca el paso en la matriz pasos y al terminar se regresa la matriz D optimizada
El algoritmo realiza V^3 comparaciones, es decir, aqui se pueden realizar hasta 64 comparaciones!!!

Diapositiva 4: Resultados Animación


Diapositiva 5: Referencias



Descarga: presentacion.odp

Descarga animación: Presentacion.mpeg

Saludos!! ^_^

LENGUAJES LÓGICOS - Resolución de Problemas

Lenguajes de Programación - Semana 9 - Tarea 7

Resolución de Problemas

MATCHING SOCKS
You are about to leave for holiday, but you forgot socks! You race back to your room, but all the lights are off, so you can't see the color of the socks.

Never mind, because you remember that in your drawer there are ten pairs of white socks, ten pairs of black socks, and eleven pairs of blue socks, but they are all mixed up.

How many of your socks do you need to take before you can be sure to have at last one matching pair?


Atinale a los calcetines
Estas por irte de vacaciones, ¡pero olvidaste los calcetines! Entonces te apresuras de vuelta a tu cuarto, pero todas las luces están apagadas, por lo que no puedes ver el color de los calcetines.

No te preocupas, porque sabes que en tu cajón hay 10 pares de calcetines blancos, 10 pares de calcetines negros y 11 de calcetines azules, pero están revueltos.

¿Cuántos calcetines necesitas sacar para estar seguro de que mínimo haz armado un par?


RESPUESTA

Se trata de un juego de azar, podemos tomar un puñado de calcetines y obtener varios pares de calcetines, pero no se trata de eso.
Tenemos 31 calcetines en el cajón, de 3 colores diferentes. Podemos hacer varias combinaciones, por ejemplo:

- 2 blancos 1 negro
- 2 blancos 1 azul
- 2 negros 1 blanco
- 2 negros 1 azul
- 2 azules 1 blanco
- 2 azules 1 negro
- 3 negros
- 3 blancos
- 3 azules

En la lista anterior vemos que el azar sigue jugando el papel determinante para obtener un par, y es que prácticamente todos los colores tienen la misma probabilidad de salir (aprox. 30%).

Para romper las reglas de azar que rigen este caso hay que sacar tres calcetines y suponer que los tres son de diferente color, como ya tenemos todos los colores disponibles esta por demás decir que el cuarto calcetín tiene que ser 100% par de alguno de los tres anteriores, ya sea par blanco, azul o negro.

LA SOLUCION ES SACAR CUATRO CALCETINES Y ASI OBTENDREMOS UN PAR

SALUDOS !!! ^_^

LENGUAJES LÓGICOS - Generalidades PROLOG

Lenguajes de Programación - Semana 9 - PUNTOS EXTRA

Es un lenguaje declarativo e interpretado, es decir, se usa para representar conocimientos sobre determinado universo y las relaciones entre los objetos de ese universo. A partir de esos conocimientos el sistema comienza a deducir todos las cuestiones que se pueden plantear, las cuales pueden ser verdaderas o falsas.

En la sintaxis de Prolog se utilizan cláusulas y comandos.

Las cláusulas son definidas por nosotros y se subdividen en hechos y reglas, terminan cada una en punto siempre, por ejemplo:

HECHO: nombre_pred(X, Y, Z, ...).
Donde X, Y, Z son los argumentos del hecho y pueden ser dos, tres, etc...

REGLA: nombre_pred(X, Y, Z, ...) :- pred1(...) , pred2(...).
Esto se puede leer: nombre_pred es verdad si pred1 y pred2 son verdad

Podemos utilizar la siguiente tabla:




:- CondiciónSi... entonces...
, Conjunción... y ...
; Disyunción... o ...


En cambio los comandos son los objetivos que se plantean al sistema, por ejemplo:

Supongamos que tengo el hecho:

raton(jerry). (jerry es un raton)

quiero saber los siguientes comandos asi que le pregunto al sistema:

a) ?- raton(mickey). (Es mickey un raton?), el sistema respondera FALSE porque no lo he declarado asi.

b) ?- raton(X). (qué cosa es un raton?), el sistema respondera X = jerry, osea, jerry es un raton.

A los comandos tambien se les conoce tambien como GOAL (metas).

Las variables son secuencias de caractéres alfanumericos que comienzan siempre en mayúscula o con guión bajo, por ejemplo:

Variable1
_Variable2

Vamos a ver un ejemplo sencillo de ejecución de prolog. Para ello tenemos primero que instalar el interprete de Prolog en nuestro sistema, teclearemos en una terminal los siguientes comandos: sudo apt-get install swi-prolog y sudo apt-get install gprolog.

Una vez instalados los paquetes vamos a iniciar alguno de los interpretes, en mi caso abriré GPROLOG, asi que tecleamos en la terminal gprolog, se vera algo como esto:


Ahora declaremos algunos hechos para comprobar si son verdaderos; abrimos un documento de emacs (emacs -nw ejemplo1.pro) y tecleamos lo siguiente:

vehiculo(X,Y,Z):-auto(X,Y,Z);camioneta(X,Y,Z).
auto(dodge,45000,rojo).
auto(nissan,20000,blanco).
camioneta(ford,60000,negro).
camioneta(chevrolet,50000,azul).

Donde: X es la marca del auto, Y es el precio y Z es el color.

Ahora ustedes diran, qué quiere decir esto, bueno mas o menos se traduce asi:

un vehiculo es verdad si auto es verdad o camioneta es verdad
dodge es un auto que cuesta 45000 y es color rojo
nissan es un auto que cuesta 20000 y es color blanco
ford es una camioneta que cuesta 60000 y es color negro
chevrolet es una camioneta que cuesta 50000 y es colo azul

La primera linea tambien quiere decir que cualquier auto y cualquier camioneta se consideran vehiculos.

GUARDAMOS EL DOCUMENTO CON TERMINACION *.PRO Ó *.PROLOG

Ahora, regresamos al interprete gprolog y compilamos el archivo, ello usamos la siguente sintaxis: consult('/home/usuario/ubicacion/ejemplo1.pro')., cada uno sabe donde guardo el archivo, presionamos enter y en mi caso se ve algo asi:


Ahora, hagamosle algunas preguntas al sistema para ver que nos responde:

vehiculo(_,_,_). (existen vehiculos?), en este caso se escriben guiones bajos porque no nos interesan sus caracteristicas, solo si existen en el dominio:


el sistema nos responde yes , es decir, si hay vehiculos.

vehiculo(X,_,_) (marcas de los vehiculos?) recordemos: X es la marca del auto, Y es el precio y Z es el color; en Y y Z escribimos guiones bajos porque solo nos interesa la marca:


el sistema nos muestra la primera marca, despues hay que presionar la tecla de punto y coma para listar las demas marcas, el sistema cierra la pregunta con un yes.

vehiculo(ford,Y,_). (precio del vehiculo ford?) En este caso especificamos la marca y escribirmos la Y para el precio, un guion bajo porque no nos interesa su color.


El sistema nos da la respuesta y cierra con un yes.

vehiculo(X,_,azul) (dime la marca del vehiculo azul, si este existe?) X para la marca, guion bajo porque no nos interesa el precio y especificamos el color:


Para terminar: vehiculo(X,Y,Z). (dame las caracteristicas de todos los vehiculos). Cubrimos todos los argumentos con variables para saber sus caracteristicas:


Una vez mas, nos mostrara el primer resultado, presionamos la tecla punto y coma para listar los demas.

Bueno, espero y les haya servido este mini-mini tutorial, y que haya sido lo mas explicito posible.

SALUDOS!!! ^_^


FUENTE: http://es.wikipedia.org/wiki/Prolog

domingo, 17 de octubre de 2010

LENGUAJES FUNCIONALES - Generalidades Scheme

Lenguajes de Programación - Semana 7 - Tarea 6

Scheme usa un dialecto parecido al de LISP, es decir, su notación es prefija, además de ofrecer la posibilidad de crear nuestras propias funciones para utilizarlas varias veces.

Lo primero que hay que hacer es instalar un interprete de Scheme, si que vamos a irnos directo a nuestra terminal y escribiremos el comando:

sudo apt-get install mit-scheme

Despues podemos inicializarlo escribiendo el comando: mit-scheme, asi se vera la terminal con el interprete ejecutandose:


Vamos a ver algunas generalidades de este lenguaje.

Primero, ya sabemos que toda su sintaxis es prefija, lo que en otros lenguajes es 2 + 5, en notación prefija sería es (+ 2 5), se puede decir que el operando es una función y 2, 5 son las variables que esta recibe.

EJEMPLOS:

(+ 1 2 3) = 6
(- 5.3 2) = 3.3
(- 5 2 1) = 2
(* 2 4 8) = 64
(/ 50 10) = 5


VARIABLES

Para declarar una variable global se utiliza la función

(define var val)

, donde var es el nombre de la variable y val es el valor asignado a dicha variable; por ejemplo:

(define x 5) esto es: x = 5
(define siete 7) esto es: siete = 7

Las variables declaradas bajo este método serán globales, es decir visibles durante todo el programa.

Para una variable local se utiliza la función

(let ((var val)) ... procesos ... ).

Se sigue la mism sintaxis que en la función define, solo que las variables serán locales al alcance de let.

FUNCIONES

Esta es una cualidad distintiva de Scheme, la definición de funciones personalizadas, claro que no es una cualidad única de este lenguaje ya que en cualquier otro tambien es posible hacerlo.
Para ello se utiliza la función

(defun (nombre_fun arg1 arg2) ... procesos ... )

, donde nom_fun es el nombre de nuestra función, y arg1 y arg2 son los argumentos que enviaremos a la función.

EJEMPLOS

Primero abrimos una nueva pestaña en la misma terminal o abrimos otra nueva, como sea, donde abriremos un documento en emacs con el nombre que queramos, pero con la terminación *.scm (extension del interprete Scheme), en mi caso escribiré emacs -nw areas.scm y tecleamos lo siguiente:

(define pi 3.14159)
(define (cuadrado x) (* x x))
(define (circulo x)(* pi x x ))
(define (triangulo x y) (/ (* x y) 2))
(define (rombo x y) (/ (* x y) 2))
(define (trapecio x y z) (/ (* (+ x y) z) 2))

Yo creo que no hace falta explicar mucho que hace este programita, son 5 formulas para calcular el área de las figuras geometricas detalladas en el código.

Guardamos los cambios y ahora vamos a cargar el archivo al interprete de Scheme, en la ventana de la terminal con el interprete Scheme tecelamos la ubicación del archivo que acabamos de escribir, en mi caso:

(load "/home/juancarlos/temp/areas.scm")

Se verá algo asi:


Ahora empezamos a probar cada una de las formulas que definimos, por si hay alguna duda les explico que realiza cada función:

(define pi 3.14159) : Se define el valor de Pi.
(define (cuadrado x) (* x x)) : Ecuación para calcular el área de un cuadrado, la función recibe un solo parámetro, la longitud de los lados y realiza el producto de los mismos.

(define (circulo x)(* pi x x )) : Ecuación para calcular el área de un circulo, la función recibe un solo parámetro, la longitud del radio, eleva su valor al cuadrado y lo multiplica por el valor de Pi.

(define (triangulo x y) (/ (* x y) 2)) : Ecuación para calcular el área de un triangulo, la función recibe dos parámetros, las longitudes de la base y la altura, los multiplica y divide el producto entre 2.

(define (rombo x y) (/ (* x y) 2)) : Ecuación para calcular el área de un rombo, la función recibe dos parámetros: las longitudes de la diagonal mayor y menos, las multiplica y divide su producto entre 2.

(define (trapecio x y z) (/ (* (+ x y) z) 2)) : Ecuación para calcular el área de un trapecio, la función recibe tres parámetros: las longitudes de las bases mayor y menor, y la altura; suma las bases las multiplica por la altura y divide todo el producto entre 2.

Asi se realiza la ejecución del programa:


SALUDOS!! ^_^