lunes, 22 de noviembre de 2010

Recursión (Puntos extras)

La recursión se basa en expresar el resultado de un problema como operaciones aplicadas sobre una instancia reducida del mismo problema, hasta que se llega a un caso donde el problema queda bien definido.

En terminos mas simples la recursión se realiza cuando una función se llama a si misma, hasta llegar a un caso base.

Algunos ejemplos sobre recursión:

  • Factorial(x: Entero): Sea N := x el tamaño del problema, podemos definir el problema de forma recurrente como x*Factorial(x - 1); como el tamaño de Factorial(x - 1) es menor que N podemos aplicar inducción por lo que disponemos del resultado. El caso base es el Factorial(0) que es 1.
  • Ordenación por fusión(v: vector): Sea N := tamaño(v), podemos separar el vector en dos mitades. Estas dos mitades tienen tamaño N/2 por lo que por inducción podemos aplicar la ordenación en estos dos subproblemas. Una vez tenemos ambas mitades ordenadas simplemente debemos fusionarlas. El caso base es ordenar un vector de 0 elementos, que está trivialmente ordenado y no hay que hacer nada.

 Ejemplos Básicos en C

 Bueno a continuación dos ejemplos en C sobre la recursión, ya saben cuales son.

Fibonacci

#include <stdio.h>
 
long fibonacci( long n ); 
 int main()
{
   long resultado; 
   long numero;     
   printf( "Introduzca un entero: " );
   scanf( "%ld", &numero);
 
     resultado = fibonacci( numero );
 
     printf( "Fibonacci( %ld ) = %ldn", numero, 
    resultado );
      return 0; 
 
} 
 long fibonacci( long n )
{
      if ( n == 0 || n == 1 ) {
      return n;   }
   else { 
      return fibonacci( n - 1 ) + fibonacci( n - 2 );
   }    } 




Factorial

#include <stdio.h>
 
long factorial( long numero ); 
int main()
{
   int i; 

   for ( i = 0; i <= 10; i++ ) {
      printf( "%2d! = %ldn", i, factorial( i ) );
   }     return 0; 
} 
 long factorial( long numero )
{
     if ( numero <= 1 ) {
       return 1;   } 
   else { 
      return ( numero * factorial( numero - 1 ) );
   }  } 




Referencias:

Recursión
Información Sobre recursión
Ejemplo 1

Ejemplo 2

Lenguajes Multiparadigma (Puntos extra)

Lenguajes Multiparadigma

Un lenguaje de programación multiparadigma es el cual soporta más de un paradigma de programación. Según lo describe Bjarne Stroustrup, permiten crear “programas usando más de un estilo de programación”.

El objetivo en el diseño de estos lenguajes es permitir a los programadores utilizar el mejor paradigma para cada trabajo, admitiendo que ninguno resuelve todos los problemas de la forma más fácil y eficiente posible.

Bueno pues la caraceristica principal de estos no están orientados solo a un paradigma, si no a varios.



Lenguaje Go (El lenguaje de Google)

Go es un lenguaje de programación concurrente y compilado inspirado en la sintaxis de C. Ha sido desarrollado por Google y sus diseñadores iniciales son Robert Griesemer, Rob Pike y Ken Thompson.

En pocas palabras, es el lenguaje que desarrolló google y tiene una sintaxis parecida a la de C, si no me creen aqui les dejo unos ejemplos.

Ejemplos

El "Hola mundo"


package main

import "fmt"

func main() {
    fmt.Println("Hola mundo")
}


Otro ejemplo, la serie de fibonacci

package main


func fib() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return b
    }
}

func main() {
    f := fib()
    println(f(), f(), f(), f(), f())
}



Los comentarios son como en C , de una sola linea //  y de varias lineas /*  */ , ¿que le pasó al printf?  se convirtió en fmt.Println("Hola mundo") o también fmt.Printf("Hola")   

¿Un manual de Go?
Lenguaje OZ



Oz es un lenguaje de programación multi-paradigma y lenguaje de programación esotérico.
Oz fue originalmente desarrollado en el laboratorio de Programación de Sistemas en la Universidad de Saarland por Gert Smolka y sus estudiantes a comienzos de 1990. 

Oz tiene una implementación de gran calidad, el Sistema de Programación Mozart, que fue liberado bajo una licencia de Código Abierto por el Consorcio Mozart. Mozart ha sido portado a diferentes plataformas como Unix, FreeBSD, Linux, Microsoft Windows, y Mac OS X.

Oz contiene una forma simple y bien hecha de la mayoría de los conceptos de los principales paradigmas de programación, incluyendo programación lógica, funcional, imperativa, orientada a objetos, con restricciones, distribuida, concurrente. Oz tiene una semántica formal simple y una implementación eficiente, el Sistema de Programación Mozart.  



Ejemplo 

El clasico hola mundo se escribe así en Oz

 {Browse 'Hello World'}

¿y el compilador?

Bueno pues aqui en esta pagina está

Compilador


Referencias:

Información - 1
Información - 2
Ejemplos - Vienen en el cuadrito amarillo
Información - 3

sábado, 20 de noviembre de 2010

Arreglos multidimensionales en C (Puntos extra)

Introducción

Un arreglo o vector o array es una colección de variables del mismo tipo que se refieren por medio de indices.

Por ejemplo un arreglo sería este:

int numeros[10];
En este caso son 10 variables llamadas todas "numeros" pero por ejemplo, si quiero acceder a alguna de ellas solo hago referencia al indice que quiero. En C el primer indice o elemento es el elemento 0.


Arreglos 
Desde el punto de vista lógico una matriz se puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos dimensiones). 

Hay arreglos unidimensionales(fila)  o multidimensionales. Generalmente se trabaja con arreglos de 2 dimensiones ( fila y columna).

Ejemplo Clasico (Arreglo Bidimensional)

En este ejemplo mostraré como funcionan los arreglos multidimensionales, en este caso trabajaré con 2 dimensiones (bidimensionales) , lo unico que hace este programa es hacer una suma de arreglos los hice yo , te pide el numero de filas y de columnas (tienen que ser el mismo valor en las 2 ) , lo llenas y al final suma todos los elementos del arreglo.

#include <stdio.h>   

int main (void){
   
   
    int F; //Filas//
    int C; //Columnas//
   
    do
    {
    
     printf("Escriba las filas de la matriz ");
     scanf ("%d", &amp;F);
     printf("Escriba las columnas de la matriz ");
     scanf ("%d", &amp;C);
   
     }
    while ( F != C );
    printf("La matriz es de %d x %d por lo cual tendra %d elementos \n\n" , F , C , (F*C));
   
  int matriz [F][C];   //F - Filas      C -  Columnas // //j - Filas   i = Columnas //

 
  int i;  //Columna//
  int j;  // Fila//
 
  for ( i = 1 ; i &lt;= C ; i++ ) 
  {

      for (j=1 ; j &lt;= F ; j++ )
    {
         
          printf("Escriba el valor de elemento %d en la columna %d " , j,i);
          scanf ("%d" , &amp;matriz[i][j] );
         
         
    }
   
}  
   
int suma=0;

for (i = 1 ; i &lt;= C ; i++ )
{
    for (j = 1 ; j&lt;= F ; j++ )
    {
        suma = suma + matriz[i][j];
        }
}


   
  printf ("La suma es %d \n\n" , suma ); 
   

    return 0;
}

Gráficamente

Bueno pues aqui les muestro una imagen para que entiendan los arreglos unidimensionales,  bidimensionales y multidimensionales.

La primer imagen ,  un arreglo unidimensional , la segunda a la derecha es un arreglo bidimensional y el de abajo un arreglo multidimensional.

Fuentes:
http://es.wikipedia.org/wiki/Vector_%28programaci%C3%B3n%29  --
Un poco de la info de introducción

http://logicacomputacion.blogspot.com/2007/09/clase-10-estructuras-de-datos-y.html --
Imagen

Punteros en C (Puntos extras)

 ¿Que és un apuntador?

Un puntero o apuntador es una variable que referencia una región de memoria; en otras palabras es una variable cuyo valor es una dirección de memoria.

Simplemente almacena la dirección en la memoria de una variable, pero no su valor, no confundir dirección con valor .

Por ejemplo aqui hay un codigo que permite saber si dos variables son iguales utilizando apuntadores:


#include <stdio.h>

int main()
     {
     int a, b;
     int *punt1, *punt2;

     a = 5; b = 5;
     punt1 = &a; punt2 = &b;

     if ( *punt1 == *punt2 )
     printf( "Son iguales\n" );
     }
Otro ejemplo es usar los apuntadores o punteros como argumentos de funciones:


#include <stdio.h>

int suma( int *a, int b )
     {
     int c;

     c = *a + b;
     *a = 0;
     return c;
     }

int main()
     {
     int var1, var2, resultado;

     var1 = 5; var2 = 8;
     resultado = suma(&var1, var2);
     printf( "La suma es: %i y a vale: %i\n", 
     resultado , var1 );
     }



Usos de los apuntadores

Algunos de los usos de los apuntadores son: pasar argumentos (o parámetros) a una función y modificarlos. También permiten el manejo de cadenas y de arrays. Otro uso importante es que nos permiten acceder directamente a la pantalla, al teclado y a todos los componenetes de la computadora.




Bibliografía:

http://basicma.iespana.es/tc/punteros.htm
http://www.elrincondelc.com/cursoc/cursoc9.html  - Ejemplos

Generación de Números aleatorios (Puntos extra)

Bueno compañeros , aqui les pongo esta entrada sobre la generación de numeros aleatorios en C.


Primero, lo que tenemos que saber esque hay una función llamada rand en C para la generación de numeros aleatorios. Se encuentra en la libería

A continuación un ejemplo:


Bueno esa es la ejecución de un programa que genera 20 numeros aleatorios, el codigo fuente es este:

Bueno pues ahi como ven en la imagen, está la libería stdlib la cual tiene la función rand (random), en este caso para llamar a la funcion usamos la siguiente función:

rand() % x;

En donde x es el rango hasta el cual se harán los numeros aleatorios.

por ejemplo si uso esto:

rand() % 10;

te generará numeros aleatorios entre el 0 al 10 , y si pongo esto

rand() % 10 + 1;

te generará numeros desde el 1 al 10, como se ve en la imagen de mi codigo.



EL PROBLEMA

El problema de esto , es que el programa "calcula" los numeros, no los genera, ¿que quiero decír con esto? , cada vez que ejecutes el programa anterior que puse , te "calculará" los mismos 20 numeros aleatorios, nunca cambiará , siempre serán los mismos números aleatorios.

LA SOLUCIÓN

La solución se encuentra al utilizar la función srand (se encuentra tambien en stdlib) la cual necesita de una "semilla" para que cada vez que se use la funcion rand genere numeros aleatorios diferentes ,el problema es estar dandole al programa una semilla cada vez que vaya a generar numeros aleatorios. Para esto haremos que se genere una semilla automaticamente cada vez que empiece el programa utilizando una función de la librería "time.h" .

Entonces nos quedará así utilizando el tiempo como una semilla:

srand (time (NULL)); 

eso generará una semilla aleatoriamente, basandose en la hora del sistema, dandole un valor en segundos a srand haciendo que por ejemplo , cada segundo que pase en la computadora sea una semilla diferente.  haciendo que siempre se generen numeros aleatorios automáticos distintos.


Implementando el ejemplo anterior usando srand nos quedaría así:

y bueno ahora si nos generará un numero al azar distintos cada vez que ejecutemos el programa.


PROBABILIDAD

La función rand da la misma probabilidad a todos los numeros que genere, si genera 1000 veces numeros entre el 1 y el 2 la probabilidad es casi la misma, puede que en el numero 1 sean 515 y en el numero 2 sean 485 o cualquier otro resultado, los resultados se aproximan. Para afirmar esto haré el siguiente ejemplo:

Veamos un ejemplo simulando el lanzamiento de un dado 1000 veces y vermos que las probabilidades que cayó son similiares.


El codigo es el siguiente: 


¿PARA QUE TODO ESTO?

La generación de números aleatorios nos puede servir para muchas cosas, una de las cosas que considero en la que es muy util esto ,es en los juegos, o cosas donde se ocupe la probabilidad y ese tipo de cosas.

A continuación y ya para terminar , les dejo un programa que hice el semestre pasado en estructura de datos , era un juego que genera un numero aleatorio entre el 1 y el 1000 y tu le escribes el numero y el programa te dice si está abajo o arriba de ese número hasta que aciertes con el número.



Bueno es todo, si tienen alguna pregunta del como generar numeros escribanla en los comentarios.

Codigos:


Tablas de Disperción (Puntos extra)

 ¿Qué es?

Es una técnica que se utiliza para implementar inserciones, eliminaciones y búsquedas en un tiempo medio constante.

Elementos

La estructura hash se construye con tres elementos básicos:

  • Un vector direccionable mediante números de posición capaz de almacenar N elementos.
  • Una función de dispersión que nos permita a partir de la clave,obtener el índice donde estará el dato asociado a esa clave.
  • una función de resolución de colisiones.

Las tablas hash se suelen implementar sobre arreglos de una dimensión aunque se pueden hacer implementaciones multi-dimensionales basadas en varias claves, las tablas hash proveen tiempo constante de busqueda promedio, sin importar el número de elementos de la tabla. Sin embargo, en casos particularmente malos el tiempo de búsqueda puede llegar a O(n) , es decír, en función del
numero de elementos.

Otras estructuras como arboles binarios son más rápidos en promedio ( tiempo de búsqueda(log n))
pero la información está ordenada en todo momento.

 Un ejemplo

Un diccionario es una estructura de datos abstracta para conjuntos dinámicos en los cuales se aplican las operaciones INSERCION, SUPRESION y BUSQUEDA.



Bibilografía:

http://www.slideshare.net/salomonkarr/tablas-de-dispersin
http://delta.cs.cinvestav.mx/~adiaz/anadis/hash-pdf2.pdf

IEEE 754 (Puntos Extra)

 IEE 754 (Estandar para el punto flotante)


El estándar IEEE 754 ha sido definido por el Instituto de Ingenieros Eléctricos y Electrónicos (Institute of Electrical and Electronics Engineers, IEEE) y establece dos formatos básicos para representar a los números reales en la computadora digital: precisión simple y precisión doble.
El estándar de la IEEE para aritmética en coma flotante (IEEE 754) es el estándar más extendido para las computaciones en coma flotante, y es seguido por muchas de las mejoras de CPU y FPU.

El estándar define formatos para la representación de números en coma flotante (incluyendo el cero) y valores desnormalizados, así como valores especiales como infinito y NaN, con un conjunto de operaciones en coma flotante que trabaja sobre estos valores. También especifica cuatro modos de redondeo y cinco excepciones (incluyendo cuándo ocurren dichas excepciones y qué sucede en esos momentos).

 Representación de Valores

 IEEE 754 especifica cuatro formatos para la representación de valores en coma flotante: 
  • precisión simple (32 bits)  
  • precisión doble (64 bits) 
  • precisión simple extendida (≥ 43 bits, no usada normalmente) 
  • precisión doble extendida (≥ 79 bits, usualmente implementada con 80 bits)

Sólo los valores de 32 bits son requeridos por el estándar, los otros son opcionales. Muchos lenguajes especifican qué formatos y aritmética de la IEEE implementan, a pesar de que a veces son opcionales. Por ejemplo, el lenguaje de programación C, ahora permite pero no requiere la aritmética de la IEEE (el tipo de C float es típicamente usado para la precisión simple de la IEEE y el tipo double usa la precisión doble del la IEEE).


Fuentes:
http://www.carlospes.com/curso_representacion_datos/06_01_estandar_ieee_754.php


http://es.wikipedia.org/wiki/IEEE_754

Punto Flotante ( Puntos Extra)

 Punto Flotante

Coma flotante es un metodo de representación de números reales que se puede adaptar al orden de magnitud del valor a representar, usualmente trasladando la coma decimal —mediante un exponente— hacia la posición de la primera cifra significativa del valor.

De esta forma, con un número dado de dígitos representativos se obtiene mayor precisión que con la coma fija, debido a que el valor de estos dígitos es siempre significativo sea el que sea el orden de magnitud del número a representar. Debido a esta adaptación, permite representar un rango mucho mayor de números (determinado por los valores límite que puede tomar el exponente).

¿Como se representa?
r = m · b^e

En donde:

r: valor real del número a representar.

m: mantisa o significando, dígitos significativos del número. El tamaño máximo de este campo, usualmente fijo y limitado, determina la precisión de la representación. 

b: base del sistema de representación.

e: exponente, orden de magnitud del significando. El mínimo y máximo valor posible del exponente determinan el rango de valores representables. 


Fuentes:

http://es.wikipedia.org/wiki/Coma_flotante



PRESENTACION 4 - TIPOS DE DATOS



Mi presentación del tema de tipos de datos.

Tuve algunos problemas con el audio. espero que puedan escuchar bien el video.

El codigo fuente es el siguiente:

Codigo

Le faltan unos detalles pero si funciona.

Notas:

En mi ejemplo consideré todos los campos como char ya que considero que en los que tienen int o float son generalmente donde se manejan cantidades como para un inventario , un negocio , el precio de algo , y pues solo eso.

domingo, 14 de noviembre de 2010

Tarea 7 - Lenguajes Imperativos

Aqui mis programas de Lenguajes Imperativos.



Fortran

Este programa, realiza las tablas de multiplicar , empezando desde la que quieras ,hasta la que quieras terminar, y puedes seleccionar cuantas veces multiplicará en cada tabla, por ejemplo , si  quieres que nadamas muestre la tabla del 2 y 3 y que solo llegue a 5 es decir 

2x1 = 2
2x2 = 4
2x3 = 6
2x4 = 8
2x5 = 10

3x1 = 3
3x2 = 6
3x3 = 9
3x4 = 12
3x5 = 15

Ejecución




Codigo







Lenguaje C




El programa que hice, deposita las calificaciones de los examenes de medio curso y examenes finales, de un grupo de alumnos, los almacena en un arreglo y al final saca el promedio de los alumnos , les dice cuantos aprobaron y cuantos reprobaron, y muestra el promedio final del grupo.
Ejecución

Ejecución





Codigo

El codigo fuente es un poco largo, se los pondré aquí en varias imagenes:






PASCAL

Bueno, ahora hice este pero con Windows porque no pude instalar el paquete ( ni tampco sabia cual era) , el que me permite compilar en Pascal, asi que utilicé el unico compilador que vi por la red para Windows, está algo "viejo" pero me funcinó para hacer mi programa.

El programa es simple, solo hace una sumatoria de N numeros y muestra la suma y saca el promedio, es un programa muy simple, pero me ayudó a entender la estructura de Pascal.


Ejecución


Codigo


El ejemplo mas sencillo de todos,  solo te pide tus datos y los muestra por pantalla, ademas de pedirte 2 numeros y realizar una suma , una resta y una multiplicación. Lo compilé con SmallBasic ya que seguia con el mismo problema de no saber como compilarlo ni que programa descargar para ubuntu.

Ejecución


 Codigo


Link de Small Basic




Codigos Fuente

Los codigos fuente los pueden descargar desde aqui:  Codigos Fuente




Comentarios

Si tienen duda de como funciona alguno de mis programas, diganme para explicarlos en otra entrada, sobre todo el de C, que está un poco largo.

miércoles, 27 de octubre de 2010

Tarea 5 - Problema Logico

Esta es mi entrada acerca del problema logico que habiamos escogido en clase, yo escogí el problema llamado "Crates of fruit" (Cajas de Fruta)

PROBLEMA

El problema dice así:

"You are on an island and there are three crates of fruit that have washed up in front of you. One crate contains only apples. One crate contains only oranges. The other crate contains both apples and oranges.

Each crate is labeled. One reads "apples", one reads "oranges", and one reads "apples and oranges". You know that NONE of the crates have been labeled correctly - they are all wrong.

If you can only take out and look at just one of the pieces of fruit from just one of the crates, how can you label ALL of the crates correctly?"


Bueno pues mi problema planteado es que estoy en una isla y hay cajas de fruta  enfrente de mi, una caja contiene solo manzanas, otra caja contiene solo naranjas y otra caja contiene ambas ( manzanas y naranjas.)

Cada caja está etiquetada, una dice "manzanas" , otra dice "naranjas" y otra dice "manzanas y naranjas". Tu sabes que NINGUNA de las cajas está etiquetada correctamente, todas ellas están etiquetadas incorrectamente.

Si solo puedes tomar y mirar una de las piezas de solo una de las cajas, ¿como puedes etiquetar las cajas correctamente?

ANÁLISIS

Bien pues analizando esta situación puedo decir lo siguiente:

Primero si sabemos que las cajas estan etiquetadas incorrectamente podemos afirmar que la caja con la etiqueta:

Caja etiquetada "Manzanas" --> Puede contener  naranjas  o  manzanas y naranjas

Caja etiquetada "Naranjas" --> Puede contener manzanas  o  manzanas y naranjas

Caja etiquetada "Manzanas y Naranjas" --> Puede contener manzanas o naranjas



Ilustrativamente podriamos decirlo con la siguiente imagen



Si ustedes se preguntan ¿por qué ésto? , es porque TODAS LAS CAJAS ESTAN ETIQUETADAS INCORRECTAMENTE.

Bueno y si nos centramos en el problema de esa persona, que quiere saber que hay en las 3 cajas con tan solo agarrar una fruta de una caja.

Caso I
Caja etiquetada manzanas

Si la persona agarrara una fruta de la caja que dice manzanas puede tocarle o naranjas o manzanas y naranjas.

Si le toca naranja entonces esa persona no sabria si en esa caja solo hay naranjas o si hay manzanas y naranjas, y no podria decidir por alguna de las dos opciones. Entonces no es la respuesta correcta.

En caso de agarrar una manzana sabria que en esa caja hay manzanas y naranjas ya que no puede haber solo manzanas porque las etiquetas están mal y quedarian 2 cajas , una que tiene la etiqueta de naranajas y manzanas y otra que tiene la etiqueta de naranjas , en la de naranjas tendria que haber manzanas  y en la de manzanas y naranjas habria naranjas.

En este caso podriamos saber que hay en las 3 cajas en el caso de que de la caja que dice manzanas sacaramos una manzana. Habria dos posibilidades y en solo una de esas se cumpliria.


Caso II
Caja etiquetada naranjas

Si la persona agarra una fruta de la caja marcada como naranjas y le sale una naranja el sabria que en esa caja hay manzanas y naranjas porque ambas van en conjunto , entonces le quedarian 2 cajas  una que tiene una etiqueta de manzanas en la que habria naranjas y otra que tiene que la etiqueta de manzanas y naranjas en la que hay manzanas entoces vuelve a suceder lo mismo que arriba, ¿que pasaria si en lugar de salir naranja sale una manzana ? volvemos al mismo caso anterior hay dos posibles respuestas y de esas dos solo 1 es correcta.

Caso III
Caja etiquetada Manzanas y naranjas

La tercera opcion seria agarrar de la caja manzanas y naranjas aqui solo habria dos posiblidades: o es la caja de manzanas nadamas o es la caja de naranjas nadamas porque no puede contener ambas, entonces digamos que tomamos una naranja, entonces en esa caja sabremos que solo hay naranjas,  y por lo tanto  en las otras cajas quedan manzanas o naranjas o manzanas

nos quedaria algo asi

Caja de manzanas y naranjas  = Caja de naranjas

Caja de manzanas = ???? 

Caja de naranjas = ????


Entonces, nos quedan dos caja (Caja de manzanas y Caja de naranjas )  , y nos quedan dos tipos de respuestas , manzanas y naranjas o manzanas , entonces si sabemos que en la de naranjas no puede haber naranjas porque estan etiquetadas incorrectamente, tiene que haber manzanas porque en la de manzanas no puede haber manzanas por estar mal etiquetada entonces en la caja de manzanas tiene que haber naranjas y manzanas porque es lo ultimo que nos queda.


Caja de manzanas y naranjas  = Caja de naranjas


Caja de manzanas = Caja de manzanas y naranjas


Caja de naranjas = Caja de Manzanas


Igualmente en el caso de que saque una manzana de la caja de manzanas y naranjas seria lo mismo, nadamas que en la caja de manzanas no habria manzanas sino naranjas con lo que nos sobraria una caja  que dice naranjas en la que habria manzanas y naranjas.

Entonces se cumple que en caso de sacar una naranja o una manzana se puede saber que hay en las otras dos cajas.

Bueno a todo esto puedo concluir con la siguiente respuesta:


RESPUESTA

De la caja de manzanas y naranjas tomo una fruta , si es naranja entonces en la caja de naranjas hay manzanas y en la de manzanas hay naranjas y manzanas.

Si fuera un manzana la que saco de la caja de manzanas y naranjas  entonces en la de manzanas hay naranjas y en la de naranjas hay manzanas y naranjas.



Nota: Lo mas probable esque se confundan con el razonamiento, yo tambien tuve esos problemas pero luego analice bien la situación y me di cuenta como estaba esto.
espero le entiendan.

1.¿Por qué no elegi los otros dos casos como respuesta?
R= Porque en los primeros dos casos hay 2 opciones en ambos y solo una opcion lleva a la respuesta y el tercer caso son 2 opciones y las dos llevan a la respuesta.

2.¿Por qué usé muchos colores?
Para diferenciar entre frutas, las verdes eran ambas (manzanas y naranjas).


Mi problema fué este

Problema Lógico


Es todo.

Notación Backus-Naur


La notación de Backus-Naur, es una metasintaxis usada para expresar gramáticas libres de contexto: es decir, una manera formal de describir lenguajes formales.

El BNF se utiliza extensamente como notación para las gramáticas de los lenguajes de programación de la computadora, de los sistemas de comando y de los protocolos de comunicación, así como una notación para representar partes de las gramáticas de la lengua natural (por ejemplo, el metro en la poesía de Venpa). La mayoría de los libros de textos para la teoría o la semántica del lenguaje de programación documentan el lenguaje de programación en BNF.


Una especificación de BNF es un sistema de reglas de derivación, escrito como:
 
<simbolo> ::= <expresión con símbolos>
donde es un no terminal, y la expresión consiste en secuencias de símbolos o secuencias separadas por la barra vertical, '|', indicando una opción, el conjunto es una posible substitución para el símbolo a la izquierda. Los símbolos que nunca aparecen en un lado izquierdo son terminales.


Otros ejemplos:

<dirección postal> ::= <nombre> <dirección> 
<apartado postal> 
 
<personal> ::= <primer nombre> | <inicial> "."
 
  • Un dirección postal consiste de un nombre, seguido por una dirección, seguida por un apartado postal.
  • Una parte "personal" consiste en un nombre o una inicial seguido(a) por un punto.

Bueno pues esto es algo de lo que se habló en la clase de lenguajes de programación, sobre las diferentes grámaticas entre los lenguajes. este formato se utiliza comunmente para describir la la sintaxis de los diferentes lenguajes usados en la computación,.




Fuentes:
http://es.wikipedia.org/wiki/Notaci%C3%B3n_de_Backus-Naur
http://www.worldlingo.com/ma/enwiki/es/Backus%E2%80%93Naur_Form
http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form

Tutorial para descargar e instalar Algol (Algol68) (Extra Points)

Bueno, esta es mi segundo tutorial , ahora les mostraré los pasos a seguir para instalar el Algol68 (Para poder compilar el lenguaje Algol).

1. Primero entramos a este sitio web:


Algol 68


2. Ahora damos clic en el boton verde "Download now!"  , los redireccionará a otra pagina, esperen unos segundos e inmediatamente verán la opcion de descargar, bajamos el archivo  "algol68g-2.0.0.tgz" , y lo movemos a nuestro escritorio o Desktop,


Ahora que lo tenemos aquí damos clic con el botón derecho en el archivo y seleccionamos la opción  "Extraer aquí" o "Extract here" ,  se creará una carpeta en nuestro escritorio con el mismo nombre del archivo:


Ahora esa carpeta que se creó le cambiamos el nombre por uno mas corto, en mi caso lo dejé como "algol68" ,para acceder a ella mas facilmente por medio del terminal.

Ahora que tenemos la carpeta renombrada, abrimos el terminal y nos movemos hacia la carpeta, en este caso mi ruta fué:

cd Desktop
cd algol68

Ahora que estamos dentro de nuestra carpeta, por medio del terminal,
ejecutamos el comando siguiente

sudo ./configure 

y damos enter, empezará a mostrar datos en la pantalla, hasta llegar a un mensaje que dice algo asi como "make install" , y luego podremos volver a introducir comandos, nos quedara algo asi la pantalla:


Ahora tendremos que instalar la libreria "libncurses5-dev" (creo que es libreria) ,  es necesario para poder continuar la instalación.

Introducimos el siguiente comando:

sudo apt-get install libncurses5-dev

y empezará otra vez a descargar paquetes para instalarla. esto puede tardar algo de tiempo, unos 10 minutos, se paciente.

Luego que termine de descargar y podamos escribir comandos,ahora escribimos

primero

sudo install make 

y luego

sudo apt-get install make


Si te pregunta algo le dices que si. (S)

Empezará a instalar... esperamos un momento

Luego ya despues de haber hecho esto, si gustan abran otra nueva ventana en la terminal y vuelvan a moverse hacia la carpeta del escritorio:

cd Desktop
cd algol68

Ahora que estamos en la carpeta de algol68
vamos a ejecutar un ejemplo que está dentro de la carpeta,
escribimos el comando siguiente

./a68g demo/sierpinski.a68

y finalmente obtendremos la siguiente imagen:




Hay mas ejemplos dentro de la carpeta demo pero de este ultimo comando notemos algunas cosas

./a68g demo/sierpinski.a68


./a68g    =  Es lo se utilizaremos para compilar, pero recuerden estar dentro de la carpta de algol68, 

demo = Es una subcarpeta que está dentro de la carpeta algol68, pueden abrirla si gustan desde el explorador de ubuntu.


sierpinski.a68  =  Es el nombre del archivo que estamos ejecutando, en este caso se llama asi, tiene la extension .a68


y finalmente como resumen, pues , si quieren compilar algo, primero hacemos el codigo y luego lo metemos directamente a la carpeta algol68, luego nos desplazamos a la carpeta y ejecutariamos algo asi.


./a68g nombrearchivo.a68 


y ya podriamos ejecutar nuestro codigo.
 



Bueno eso es todo, esos fueron los pasos realizados en clase y los que seguí para hacer este tutorial.

Bueno es todo, espero que les sirva.

y espero recibir puntos :D , le dedique un buen ratito para hacer este tutorial y el anterior.

Tutorial para Instalar Fortran en Ubuntu (PUNTOS EXTRAS)

Bueno compañeros, esta es una entrada en donde les mostraré como instalar Gfortran,  para poder compilar codigos del lenguaje Fortran, en Ubuntu.

Los pasos a realizar, son los siguientes:


1. Abrimos la terminal de ubuntu:


2.Escribimos el comando siguiente y presionamos enter.

sudo apt-get install gfortran

3. Despues de haber hecho eso, aparecera informacion sobre la instalacion y te preguntara algo, tu contestas con la letra S y le das enter




 4. Luego de esto continuará la instalación , puede tardar entre 5 a 10 minutos a lo mucho, despues de la instalacion aparecera una pantalla como esta:



y te dejará seguir escribiendo comandos,

Nota: A mi me aparecia un error en initramfs-tools y en nvidia-current, esto puede que no te aparesca a ti, esto me aparecio por la falta de compatibilidad de ubuntu hacia mi tarjeta de gráficos, asi que lo que te aparesca despues de la instalación puede variar.



En este momento (cuando ya puedes seguir introduciendo comandos) , ya instalaste el Gfortran, ahora mostraré como compilar tus programas.


6. Utilizaré el código que está en esta página (La cual usamos en la clase)

http://www.scriptol.com/programming/fibonacci.php
 
En la parte del lenguaje fortran,  es la serie de fibonacci, para compilarlo lo tuve que dejar el código asi:


      I=35; K=I
      CALL F(I)
      PRINT *,K,'th Fibonacci number is',I
      STOP
      END PROGRAM

      SUBROUTINE F(I)
      DIMENSION A(I+1)
      A(1)=1; A(2)=1
      DO1J=3,I+1
      A(J)=A(J-1)+A(J-2)
1    CONTINUE
      I=A(I+1)
      RETURN
      END SUBROUTINE

Bueno pues ese codigo lo copian y pegan en emacs, y lo guardan como extensión .f  , yo lo guardé como codigo.f  ,  no olviden borrar las lineas rojas de arriba que salen cuando abres una ventana nueva en emacs, pues se puede interpretar como linea de codigo. Me refiero a estas lineas:


Las borran antes de guardar el codigo.


Ahora viene lo bueno,   despues de que guardamos nuestro archivo con extensión .f  ( lo puedes guardar en donde quieras, en mi ejemplo lo guarde en el escritorio), abrimos la terminal.

y si lo guardaste en tu escritorio o en desktop escribe el siguiente comando

cd Desktop

ahora te encuentras en desktop, osea, tu escritorio, luego escribes el siguiente comando:

gfortran codigo.f 

en la palabra codigo es el nombre de tu archivo, y como les mencioné , yo le puse codigo.f , luego de haber escrito eso notarás que en tu escritorio hay un archivo con el nombre de a.out.


Ahora escribes esto ya para compilar:

./a.out

y podrás ver el resultado

En la siguiente imagen verás lo que tienes que hacer:


y es todo, ahora te toca hacer a ti el resto.

Bueno fué todo, aun queda pendiente el segundo tutorial de como instalar el Algol,espero que esta guia les sirva, no solo para instalar el gfortran, si no también para saber como compilar un codigo de éste. Hice este tutorial orientado para los que talvez no sepan nada mucho de como usar ubuntu y/o los que faltaron ese dia de clases,es todo.




Descarga el ejemplo codigo.f (Clic en la carpeta)


Descarga

lunes, 18 de octubre de 2010

Tercera Presentación - DFS En Grafos

Presentacion 3 - DFS - Busqueda en Profundidad

Bueno pues aqui está mi presentacion sobre DFS en grafos y su pseudocodigo y con ejemplos.

Expondré el tema junto con mis compañeros Jurgen Martinez Sanchez y Gustavo Rafael.

Descarga:
 (Clic en la carpeta)

En Power Point


En PDF