lunes, 15 de noviembre de 2010

Lenguaje Logico en C (Extra)

Hola compañeros, acabo de utilizar el problema lógico que nuestro compañero Guillermo realizo como reporte 5, bueno ambos somos compañeros desde la preparatoria y ese problema yo también ya lo tenía resuelto.
Bueno pues como ya saben el problema lógico consiste en un granjero que quiere proteger a sus ovejas de los lobos, para esto nesecitara una alarma que se active cuando:
1.- Las ovejas estén afuera y la puerta este abierta.
2.- Cuando los lobos estén cerca y las ovejas estén fuera del corral.
Utilizando los siguientes valores:
Ovejas dentro: 0        Puerta cerrada: 0         Lobos lejos: 0
Ovejas afuera: 1        Puerta abierta: 1          Lobos cerca: 1
Estas son las combinaciones en una tabla de verdad de 3 variables donde para que la alarma se active es de la siguiente manera:
O: ovejas     P: puerta     L: lobos    A: alarma
O P L   A
0 1 1    1
1 1 0    1
1 1 1    1
Codificacion en C
Ejecucion del programa en Dev c(Windos)
Cuando se activa la alarma:
Cuando la alarma no se activa:
Explicacion:

Bueno pues en si lo que ise en este programa fue utilizar puro if-else y utulizando los valores de la tabla de verdad hise que la funcion fuera solo verdadera para que la alarma sonara, utilizando las conjunciones basicas.
Y basicamente es el mismo proceso para cuando no suena la alarma.
Para lograr que el programa se buelva a ejecutar sin necesedad de salir de la aplicacion, solo ahy que usar las funciones do-while.
En mi caso yo hice que el programas se regrese solo si presionamos 5, esto lo hice poniendo una variable entera, despues coloque el "do" despues de introducir las variables y al final coloque un "while(C==5)" de esta manera el programa segura una secuencia recursiva cada vez que coloquemos el nuemero 5.
Y en si creo que es todo.
Bueno y grasias a Guillermo por darme permiso en subir esto.

domingo, 14 de noviembre de 2010

Arreglos(Extra)


Arreglos

Un arreglo es una colección finita, homogénea y ordenada de elementos.
Finita, porque todo arreglo tiene un límite, ósea, se debe determinar el número máximo de elementos en un arreglo. Homogénea, porque todos sus elementos deben ser el mismo tipo. Ordenada, porque se puede determinar cuál es el primer elemento, el segundo, ya así hasta llegar al número máximo en un arreglo.

Existen Arreglos Unidimensionales y multidimensionales

Arreglos Unidimensionales
Es una colección finita, homogénea y ordenada de datos, en la que se hace referencia a cada elemento del arreglo por medio de un índice, esto quiere decir que indica la casilla donde se encuentra el elemento.
Permite almacenar N elementos del mismo tipo ya sean enteros, reales, caracteres, cadena de caracteres, entre otros, y acceder a ellos por medio de un índice. En los arreglos Unidimensionales dos partes fundamentales: los componentes y el índice. Los componentes son aquellos que hacen referencia a los elementos que se almacenan en cada una de las celdas o casillas. El índice especifica la forma de acceder a cada uno de estos elementos.

Se declaran de la siguiente manera:

main()
{
Int A[10]; Aquí definimos un arreglo de 10 elementos de tipo entero.
Float B[6]; Aquí definimos un arreglo de 6 elementos de tipo real.
}
Una vez que se definen los arreglos, sus elementos puede recibir valores a través de múltiples asignaciones, o bien, en un ciclo.

Aquí un programas simple de como funciona un arreglo unidimensional:

Codificación en C, con terminal emacs :
 Ejecución del programa en emacs:
 En si en este programa colocamos 10 arreglos y le daremos un valor numerico a cada una de los 10 arreglos, lo que va hacer el programa es buscar un valor en estos 10 arreglos e imprimir el numero buscado y cuantas veces se repite en dicho programa.

Arreglos Multidimensionales

Es una colección finita, homogénea y ordenada de datos, en la que se hace referencia a cada elemento del arreglo por medio de dos índices. El primero de los índices se utiliza para indicar la fila y el segundo, para indicar la columna.
Estos arreglos permiten almacenar N x M elementos del mismo tipo ya sean enteros, reales, caracteres, cadena de caracteres, entre otros, y acceder a cada uno de ellos.

Estos se declaran de la siguiente manera:

main()
{
int A[10][20]; Aquí se declara un arreglo bidimensional de tipo entero con 10 filas y 20 columnas.
float B[10][10]; Aquí se declara un arreglo bidimensional de tipo real con 10 filas y 10 columnas.
}
Una vez que se definen los arreglos, sus elementos puede recibir valores a través de múltiples asignaciones, o bien, en un ciclo.


Aquí un programas simple de como funciona un arreglo multidimensional:

Codificacion del programa en C, con terminal emacs:

Ejecución del programa en emacs:
En este programa en si colocaremos las filas y la columnas con las queremos trabajar y una vez que les demos valores a cada fila y a cada columna, este programa sumara los valores de todas la filas y columnas imprimiendo el resultado.

Punteros(Extra)

Punteros
Los punteros permiten simular el paso por referencia, osea crear y manipular estructuras dinamicas de datos, tales como listas encadenadas, pilas, colas y árboles. Generalmente las variables contienen valores especificos. Los punteros son variables pero en vez de contener un valor especifico, contienen las direcciones de las variables a las que apuntan. Para obtener o modificar el valor de la variable a la que apuntan se utiliza el operador de indirección. Los punteros, al ser variables deben ser declaradas como punteros antes de ser utilizadas.
Sintaxis
int *ptrID, ID;
ID = 8;
ptrID = &ID;
ptrID es un puntero a int, mientras que la variable ID es solo una variable del tipo int. Todo puntero debe ser precedido por un asterisco (*).
Esto se representa graficamente de la siguiente manera:
Se puede declarar mas de un puntero en la misma sentencia. En el ejemplo que sigue se ve la declaración de dos punteros a int.
int *ptrY, *ptrX;
Operadores
Existen dos operadores a tener en cuenta cuando trabajamos con punteros. El operador de dirección (&) que devuelve la dirección de memoria de su operando y el operador de indirección (*) que devuelve un alias para el objeto al cual apunta el operando del puntero.
En el siguiente ejemplo vemos como se inicializa una variable X con el valor 15. Luego se crea un puntero a int y por último el puntero pasa a apuntar a la variable X. Esto es, ptrX es un puntero a X.
int X = 15;
int *ptrX;
ptrX = &X;

Punteros y matrices
Las matrices son punteros constantes. Una matriz sin subindice es un puntero al primer elemento de la matriz.
int X[15];
int *ptrX;
ptrX = X; // ptrX recibe la dirección del primer elemento ( 0 ) de X
Asi como tambien podria escribirse
int X[15];
int *ptrX;
ptrX = &X[0]; // ptrX es igual a la dirección del primer elemento de X
Se pueden utilizar distintos elementos de la matriz teniendo en cuenta la sintaxis de punteros.
int X[15], Y, *ptrX;
ptrX = X;

Y = *( ptrX + 7 );
En este caso puede verse que Y toma el valor del elemento 7 de la matriz X, siendo 7 el desplazamiento dentro de la matriz. El operador de indirección queda fuera del parentesis porque tiene una prioridad superior a la del operador +. De no existir los parentesis, se sumaria 7 al elemento X[0]. Teniendo en cuenta que las matrices son punteros constantes, el nombre de la matriz puede tratarse como un puntero:
Y = *( X + 7 );

Aritmética de Punteros
Al usar punteros a matrices, hay que tener en cuenta que la aritmética cambia sensiblemente.
#include

using std::cout;
using std::endl;

void main()
{
    int X[6] = { 1, 2, 3, 4, 5, 6 };
    int *prtX;

    prtX = X; // incializo el valor del puntero.

    cout << endl << *prtX;
    prtX += 2;
    cout << endl << *prtX;
    prtX -= 2;
    cout << endl << *prtX;
    prtX++;
    cout << endl << *prtX;
}
En el siguiente código, primero se crea un puntero a un arreglo de 6 elementos y si inicializa el puntero prtX al primer elemento del arreglo X[0]. Si tenemos en cuenta que el siguiente ejemplo se ejecuta en una computadora con enteros de 4 bytes, el segundo elemento de la matriz tendrá en memoria un desplazamiento de 4 bytes, el 2 de ocho y asi sucesivamente. La operación prtX += 2; produce un desplazamiento llevándolo al 3 elemento dentro del arreglo. Debe entenderse que prtX ahora apunta a una dirección de memoria y la instrucción cambia esta dirección de memoria sumándole 2 multiplicado por el tamaño del tipo de dato del arreglo que en este supuesto sería de 4. (dir = ( dir + 2 * 4 )), dando por resultado un desplazamiento de 8 bytes. Sería igual que ejecutar la operación prtX = &X[2];. La operación prtX -= 2 obedece a la misma lógica estableciendo el puntero al primer elemento del array X[0] y el operador ++ modifica el puntero desplazándolo 4 bytes y asignándole el segundo elemento de la matriz.
Matrices de punteros
Para realizar una estructura de datos dinámica, se puede utilizar una matriz donde sus elementos sean punteros. Suponiendo que queramos hacer un calendario y lo dividamos por semanas. Podríamos utilizar una matriz con los días de la semana.
const char *dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" }
Cada día de la semana, no es un elemento de la matriz, sino que la expresión dias[7] crea una matriz de siete elementos como punteros a char.


Gnerador de Numeros Aleatorios(Extra)

Un Generador de números aleatorios es un componente que crea números o símbolos para un programa en una forma que carezca de un patrón evidente, y que así parezcan ser números aleatorios.

La mayor parte de los generadores de números aleatorios son, en realidad, pseudoaleatorios: se calcula  un valor X0, que se le podría llamar semilla, y, a partir de él, se van generando X1, X2, X3, ... Xn.

Siempre que se parta de la misma semilla, se obtendrá la misma secuencia de valores.
El algoritmo básico es el método congruencial123, que genera valores en el intervalo [0,1), mediante el siguiente esquema:

Se fijan A, B, enteros positivos (deben tener ciertas propiedades para obtener un buen generador), y, a partir de una semilla X0 en el conjunto 0,1,...,(N-1), se generan X1 = A*X0+B (mod N) X2 = A*X1+B (mod N) X3 = A*X2+B (mod N) ... X(k+1) = A*Xk+B (mod N) ...
donde A*X+B (mod N) es el resto de la división entera de A*X+B entre N. Por ejemplo, 16 (mod 7) es 2.

A partir del método congruencial, es posible tomar valores pseudoaleatorios en el intervalo [0,1) como sigue: Se toma N, entero, muy grande, se toman A, B adecuados, y una semilla X0 en 0,1,..,(N-1). A partir de ella, se generan X1,X2,X3,... por el método congruencial, y a partir de ellos, Y0,Y1,Y2,Y3,... mediante la fórmula Yk = Xk /N

El método base es el método congruencial de generación de números en el conjunto
{1,2...,(N-1)}
Para ello, se toman A,B enteros adecuados, se indica un valor inicial (semilla) X0 en el conjunto {1,2,...,(N-1)},  y se aplica el esquema recursivo:
X1=(A.X0+B)ModN, X2=(A.X1+B)modN.
Xk+1=(A.Xk+B)modN:=: donde por XmodN indica el resto de la división entera de X entre N.
Por ejemplo, 12mod7 = 5
Si se conoce cómo generar valores en {1,2,...,(N-1)}, es posible generar valores en el intervalo [0,1), como sigue: Se toma N, muy grande, entero, se toma una semilla X0E {1,2,...,(N-1)}, y se construye la secuencia Y0,Y1,Y2..., obtenida aplicando la expresión Yk = Xk / N

Hay varias formas de generar números aleatorios con las librerías de JAVA 2. Si no se utiliza
el método adecuado, seguramente obtendremos resultados inesperados o mal distribuidos en la generación de números aleatorios.

La libreria java.util.Random está disponible desde la versión 1.2 del SDK. La libreria tiene un método nextInt() que acepta un argumento entero.
public int nextInt(int n)
Dado algún valor mayor o igual cero pero menor que el entero pasado: 0 <= nextInt() < n.
Como muestra, aquí vemos el código que genera un conjunto de números aleatorios e imprime la media:
int count = 1000000;
int range = Integer.MAX_VALUE / 3 * 2;
double sum = 0;
Random rand = new Random();
for (int i=0; i
sum += rand.nextInt(range);
}
System.out.println(sum/count);

Existen métodos más antiguos, como el uso de la función nextInt() sin parámetros y después aplicar el operador abs y %, de la siguiente forma:

Math.abs(rand.nextInt()) % range;

Pero no es un sistema equivalente y tiene varios problemas.

Aqui en lenguaje C

Números aleatorios en C

La generación de números aleatoreos es una de las prácticas mas importantes en cualquier lenguaje de programación, sobre todo cuando deseamos desarrollar juegos, por ejemplo. Para usar números aleatorios en C podemos utilizar la clase Random del nombre espacio System, de la siguiente manera:

1 Random objeto = new Random(); 

2 int numero = objeto.Next();


El método Next de la libreria Random genera y devuelve un número aleatorio entre 0 y la constante Int32.MaxValue (2,147,483,647). El número es generado después complejos procesos matemáticos, y como en casi todos los lenguajes necesitan de una semilla para ser generados, que por defecto es la hora del sistema.

Aún así, muchas veces necesitamos que el número sea generado en un rango específico de valores. Por ejemplo, para una aplicación que simula el lanzamiento de un dado de seis caras necesitamos generar números entre 1 y 6. Para lograr esto, el método Next puede recibir además un entero que indica el rango máximo del número aleatorio. Por ejemplo, el código:

1 Random objeto = new Random(); 

2 int numero = objeto.Next(6);


generaría un número aleatorio entre 0 y 7 (pero no 6), es decir, seis posibles números. Pero, si desearamos algún rango más exacto, podríamos hacer algo como:

1 Random objeto = new Random(); 

2 int numero = objeto.Next(1, 7);


lo que generaría números entre 1 y 7 (pero no 7), de nuevo seis números posibles.

Ejemplo
En el siguiente ejemplo se utilizará la clase Random para generar una serie de números aleatorios cada vez que se presiona un botón:



01 private Random obj = new Random(); 
02 //Método ejecutado al presionar el botón 
03 protected virtual void generar_Click (object sender, System.EventArgs e) 
04 { 
05     etiqueta.Text = ""; 
06     for(int i = 0; i < 4 ; i++) 
07     { 
08         for(int j = 0; j < 4 ; j++) 
09             etiqueta.Text += obj.Next(1, 10) +"\t\t"; 
10         etiqueta.Text += "\n\n"; 
11     } 
12 }

jueves, 4 de noviembre de 2010

Reporte #5(Problema Logico)

¿Qué son los lenguajes lógicos?
Los lenguajes lógicos son declarativos, como opuestos a los lenguajes procedimentales. En un lenguaje de programación lógica típico, de los que Prolog es claramente el mejor representante, cada aserción o sentencia expresa una proposición que puede ser representada por una fórmula lógica. Las proposiciones son hechos o reglas. Nuevos hechos pueden ser evaluados frente a otros hechos existentes dados por verdaderos. Las reglas matemáticas de la lógica que pueden reducir sentencias textuales a representaciones simbólicas existen desde hace mucho tiempo, aunque tan sólo desde 1965 contamos con el denominado principio de resolución, que mostraba cómo estas representaciones podían ser integradas en un ordenador digital para su análisis. El software que utiliza el principio de resolución trabaja con cláusulas lógicas, y utiliza la unificación para intentar identificar las partes derecha e izquierda de las cláusulas de una forma lógica, investigando los valores de la variable que permitirá una identificación correcta.

¿Para qué sirven?

Direcciona métodos de procesamiento basados en el razonamiento formal. Los objetos de tales razonamientos son "hechos" o reglas "if then". Para computar lógicamente se utiliza un conjunto de tales estamentos para calcular la verdad o falsedad de ese conjunto de estamentos. Un estamento es un hecho si sus tuplas verifican una serie de operaciones.
Un hecho es una expresión en la que algún objeto o conjunto de objetos satisface una relación específica. Una tupla es una lista inmutable. Una tupla no puede modificarse de ningún modo después de su creación. Una regla if then es un estamento que informa acerca de conjuntos de tuplas o estamentos relacionados que pueden predecir si otras tuplas satisficieran otras relaciones.
Un estamento que es probado verdadero como resultado de un proceso se dice que es una inferencia del conjunto original. Se trata por tanto de una descripción de cómo obtener la veracidad de un estamento dado que unas reglas son verdaderas. La computación lógica está por tanto relacionada con la automatización de algún conjunto de métodos de inferencia.

Problema numero 1
Dos hermanos y su destino
Juan y Pedro son dos gemelos que van al colegio en autobús, ya que éste es diez veces más rápido que ellos. En la calle donde viven hay dos paradas de la misma línea de autobuses y, aunque viven juntos, Juan siempre sale hacia la parada del norte, que es la más cercana, y Pedro lo hace a la vez hacia la parada del sur, en la misma dirección que el autobús. Curiosamente siempre llegan al colegio en el mismo autobús. Si a Juan le cuesta nueve minutos llegar a su parada,

¿Cuánto tiempo tarda Pedro en llegar a la suya?
Solución:
Son 11 minutos.

¿Por qué?

Ambos siempre llegan en el mismo autobús esto quiere decir que o los dos lo toman o lo pierden. Esto es porque el tiempo que tarda Pedro en llegar a su parada es igual a la suma del tiempo que tarda Juan en llegar a su parada más el tiempo que tarda el autobús en ir de una parada a otra. Un muchacho haría 9+11=20 minutos en ir de una parada a la otra. El autobús, que es 10 veces más rápido tarda 2 minutos, lo que significa que 2=11-9 que es la ventaja de tiempo que Juan tenía sobre Pedro. Ósea los dos minutos de ventaja de Juan es el tiempo que tarda en ir de una parada a otra el autobús.

Problema numero 2 
El campesino amable:
tres guapas muchachas se presentan en casa de un campesino para pedirle que les venda huevos frescos.

CAMPESINO les voy a dar los que tengo, en la despensa, pues últimamente mis gallinas ponen pocos huevos.
1.- A ti Luisa, te doy la mitad de todos mas medio huevo.
2.- Y a ti, maria, la mitad de los que quedan, más otro medio huevo.
3.- A ti, ilenia, también te doy la mitad de los huevos restantes mas medio huevo.
No le  ha quedado ni un solo huevo y a tenido que romper ninguno. Os veo asombradas. ¿Cómo le a hecho
El problema, aparentemente, consiste en el hecho de que el campesino da a las niñas medio huevo sin romper ninguno. Esto no sucede así porque si, sino por la presencia de determinados números. Para entender cómo es posible, se piensa un número inicial de huevos hipotético y se efectúan los cálculos requeridos para el problema.

1. ° Caso hay 20 huevos para la primera niña, el campesino regala la mitad de
todos los huevos, es decir, 10+1/2, y  no puede hacerlo

2.° Caso hay 21 huevos para luisa da la mitad de todo, es decir,10
huevos y medio +1/2 huevo en total,11 huevos.
para maría da la mitad de los huevos
que quedan, es decir, 5 huevos +1/2 huevo, y esto
no es posible.

estos intentos , sin embargo te han hecho entender que los numeros de huevos a dividir deben ser siempre impares
prueba ahora de resolver el problema por intentos hasta que encuentres el numero justo, teniendo en cuenta que siempre debes partir de un número impar

3.° Caso hay 3 huevos, pero no son suficientes para las tres niñas.

4.° Caso hay 5 huevos, para luisa son 5:2+1/2=3 huevos que le quedan 2 huevos
para maría 2:2+1/2=1 huevo y1/2.
no es posible.

5.° Caso hay 7 huevos para luisa 7:2+1/2=4 huevos que quedan 3 huevos
6.° Caso 3:2+1/2=2 huevos. queda 1 huevo a maría
7.° Caso 1:2+1_/2=1 huevo.  le quedan 0 huevos a ilena.


Esto concluye que los huevos a repartir son solo 7.















lunes, 25 de octubre de 2010

Presentacion Numero 3 (Bfs en Grafos)

Hola compañeros aquí les dejo la presentación de la clase pasada la cual fue presentada por Guillermo, Alfonzo y por supuesto yo.


En esta presentación nosotros trabajamos con BFS que por sus siglas en ingles significa búsqueda en anchura, trata de un algoritmo de búsqueda en un grafo y su principal función consiste en recorrer cierto grafo, nodo por nodo hasta llegar a su nodo de destino.

Aquí están las diapositivas que presentamos en clase.

sábado, 23 de octubre de 2010

Presentacion Numero 2 (Recursividad)

Compañeros Disculpen la tardansa pero aqui esta la segunda presentacion que me toco exponer junto a mis compañeros Guillermo y David.
A nosotros nos toco el tema de recursividad en focado mas que nada a los palindromos los cuales son aquellos que disen lo mismo, tanto si lo lees de izquierda a derecha o visebersa.