domingo, 21 de noviembre de 2010

Lenguajes Orientados a Objetos

El concepto de programación orientada a objetos (OOP)  se basa en la idea natural de la existencia de todo aquello que nos rodea lleno de objetos y que la resolución del problema se realiza en términos de objetos, un lenguaje se dice que está basado en objetos si soporta objetos como una característica fundamental del mismo.
El elemento fundamental de la OOP es tal y como lo indica es un objeto.  
Podemos definir un objeto como un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización.
En primer lugar, un objeto no es un dato simple, si no que contiene en su interior cierto número de componentes bién estructurados. En segundo lugar, cada objeto no es un ente aislado, sino que forma parte de una organización conjunta o de otro tipo.
Un objeto puede considerarse como una especie de cápsula dividida en tres partes:

1 - RELACIONES
2 - PROPIEDADES
3 - MÉTODOS
Las relaciones: permiten que el objeto se insterte en la organización y están formadas esencialmente por punteros a otros objetos.
Las propiedades: distinguen un objeto determinado de los restantes que forman parte de la misma organización y tiene valores que dependen de la propiedad de que se trate. Las propiedades de un objeto pueden ser heredadas a sus descendientes en la organización.
Los métodos: son las operaciones que pueden realizarse sobre el objeto, que normalmente estarán incorporados en forma de programas (código) que el objeto es capaz de ejecutar y que también pone a disposición de sus descendientes a través de la herencia.
Algunos lenguajes orientados a objetos son:
C++: Es un lenguaje de programación siendo este una mejora del lenguaje C, con el cual puedes crear muchos tipos de programas. Ademas de que una gran diferencia con el lenguaje C es que C++ posee la capacidad de crear objetos y clases (Programacion orientada a objetos) mientras que C solo permite la programación estructurada.
Ejemplo de programa en C++:
Codificación:
Ejecucion de programa:
Cabe destacar que para compilar C++ en emacs, tenemos que escribir guardar nuestro archivo con la extensión.cpp y el compilador es 
g++ archivo.cpp

Java:es un lenguaje de programación y entre sus características se encuentran las siguientes:

Es orientado a objetos:
esto es , que el paradigma de programación que utiliza y para el cuál fue construido es la Programación Orientada a Objetos (POO) y consiste en relacionar todo como si se trataran de objetos del mundo real.
En este lenguaje todo son objetos excepto los básicos como ( int, float, double, char... ).
Es un lenguaje de propósito general: ya que esta diseñado para que puedas programar cualquier cosa con el.
Es un lenguaje interpretado: esto es, que hay una máquina virtual llamada JVM (Java Virtual Machine) que se encarga de interpretar y ejecutar el código de los programas hechos en Java en tiempo de ejecución. 
Es un lenguaje portable: esto significa que si tu escribes el código se debe  ejecutar en cualquier Sistema Operativo para el cuál se haya elaborado y tenga instalada la JVM antes mencionada.

Ejemplo de codificación en java:
Serie Fibonacci:

public class Fibonacci
{
public static void main (String [] args)
{
int f1=1, f2=1;
System.out.println (f1);
while (f1<500)
{
System.out.println(f2);
f2+=f1;
f1 = f2 - f1;
}
}
}

Ejecución del programa:

Reporte #6(Lenguajes imperativos)

Lenguajes Imperativos

Estos lenguajes cuyo origen está ligado a la propia arquitectura de von Neumann, la arquitectura consta de una secuencia de celdas, llamadas memoria, en la cual se pueden guardar en forma codificada, los mismos  datos que instrucciones y de un procesador, el cual es capaz de ejecutar de manera secuencial una serie de operaciones, principalmente aritméticas y booleanas, llamadas comandos.
Un lenguaje imperativo conceptos que se traducen de forma natural al modelo de la máquina.

Por ejemplo los lenguajes imperativos más destacados de la historia han sido: Fortran, Algol, Pascal, C, Modula-2, Ada.

Fortran: es lenguaje de propósito general, principalmente orientado a la computación matemática, por ejemplo en ingeniería. Originalmente fue escrito con mayúsculas como FORTRAN. Pero pos lo habitual es poner sólo la primera letra con mayúscula, que es como se escribe actualmente como Fortran.
Fortran fue el primer lenguaje de programación de alto nivel. Su desarrollo inicio en la decada de 1950 en IBM y han habido muchas versiones desde entonces.  Como estas:
  • Fortran 66
  • Fortran 77
  • Fortran 90 (95)
La versión más común de Fortran actualmente es todavía Fortran 77, sin embargo Fortran 90 esta creciendo en popularidad. Fortran 95 es una versión revisada de Fortran 90 la cual fue aprobada por ANSI en 1996. Hay también varias versiones de Fortran para computadoras paralelas. La más importante es HPF (High Performance Fortran), la cual es de hecho el estándar.
Pero se debe ser cuidadoso con los compiladores de Fortran 77, ya que pueden manejar un superconjunto de Fortran 77, por ejemplo contienen extensiones no estándarizadas.

Programa en Fortran
parte 1

parte 2
Este es el compilador de Fortran ya que cada Fortran tiene su propio compilador que es: gfortran -ffree-form nombre del archivo.for y después para ejecutarlo ./a.out


Ejecución de programa en Fortran



Pues en si no hay mucho que explicar de este programa ya que solo se esta implementando una sentencia que en C conocemos como switch, el cual calcula las cuatro operaciones aritméticas básicas.
Bueno aqui les dejo un excelente manual de Fortran ya que explica a detalle cada sentencia, variable y operaciones aritméticas.

www.uam.es/.../kike/FORTRAN/FORTRAN.html
  
Lenguaje C: Bueno ya todos conocemos este lenguje desde el semestre pasado pero como quiera le voy a poner una breve explicacion.


C es un lenguaje de programación de propósito general que ofrece economía sintáctica, control de flujo y estructuras sencillas y un buen conjunto de operadores.
No es un lenguaje de muy alto nivel y más bien un lenguaje pequeño, sencillo y no está especializado en ningún tipo de aplicación.
Es fácil de dominar y en poco tiempo, un programador puede utilizar la totalidad del lenguaje.
Los tipos que ofrece son caracteres, números enteros y en coma flotante, de varios tamaños. Además se pueden crear tipos derivados mediante la utilización de punteros, vectores, registros y uniones. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propio sistema operativo en C.Introducción al lenguaje C.

Ejemplo de programa en C

Disculpen el pagadero de imágenes pero bueno este es nuestro programa en C el cual su función es insertar una cantidad N de numero y luego el programa te los acomoda en ordene ascendente.
Para lograr esto vamos a utilizar la secuencia repetitiva for la cual leerá, acomodara e imprimirá dicho resultado.

Su ejecución seria la siguiente:


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.