Vamos a programar #38 - La conjetura de Collatz (Números maravillosos) versión C#.
Hola de nuevo a todos, el día de hoy vamos a hacer un pequeño receso a la programación en Pascal y vamos a ver un poco de C#.
La conjetura de Collatz dice que todos aquellos números son "maravillosos", siempre y cuando al aplicar las siguientes operaciones de forma recursiva, nos resulte 1.
El enunciado dice:
En .net 4.0 se introdujo este nuevo tipo de dato, que permite utilizar enteros de longitud arbitraria, mas que suficiente para poder calcular la conjetura. Actualmente el número mas grande calculado tiene mas de 60 mil millones de cifras.
El código es realmente simple, ya que solo hacemos, para empezar, un bucle "while", que se ejecutará mientras la variable "MyNumber", sea mayor que uno. Después comprobamos si el numero es par, dentro de la estructura del "BigInteger", hay una función llamada "IsEven", la cual sirve para comprobar si un número es par. La utilizamos y si el resultado es "true", hacemos la división entre dos (cómo dice el enunciado), en caso contrario multiplicamos por 3 y le sumamos uno.
Para poder agilizar un poco, todo el proceso, se hace en un "thread" diferente, con lo cual la aplicación no se bloquea.
Por ahora, es todo. Desde mi punto de vista, parece que todos los numero son maravillosos, puesto que al ser impar (que usualmente son números raros), al multiplicar y sumarle uno, en algún punto, siempre nos dará un numero par. Aunque la conjetura no se ha probado (de ahí lo de conjetura), resulta un buen ejercicio para todo programador.
En el siguiente post de C#, agregaremos funciones para obtener más datos que son relevantes para la conjetura, Además, veremos un poco mas a fondo el tipo "BigInteger" y extenderemos el uso de threads para hacer cálculos un poco más "masivos". Cómo de costumbre, el código completo lo dejo en mi dropbox para que lo descargues.
Los leo luego.
La conjetura de Collatz dice que todos aquellos números son "maravillosos", siempre y cuando al aplicar las siguientes operaciones de forma recursiva, nos resulte 1.
El enunciado dice:
Sea la siguiente operación, aplicable a cualquier número entero positivo:El problema en si, es fácil, pero al momento de crear la aplicación, debemos de recordar que estamos limitados en el numero máximo que podemos usar. Para solucionarlo, vamos a usar el tipo "BigInteger".
- Si el número es par, se divide entre 2.
- Si el número es impar, se multiplica por 3 y se suma 1.
En .net 4.0 se introdujo este nuevo tipo de dato, que permite utilizar enteros de longitud arbitraria, mas que suficiente para poder calcular la conjetura. Actualmente el número mas grande calculado tiene mas de 60 mil millones de cifras.
El código.
El codigo en c# que calcula la conjetura de Colltaz es el siguiente (la lista de controles no se incluye, todo el código fuente lo puedes descargar de dropbox):
using System;
using System.Windows.Forms;
using System.Numerics;
using System.Threading;
namespace ConjeturaDeCollatz
{
public partial class FrmMain : Form
{
private delegate void UpdateListDelegate(string Value);
private void UpdateList(string Value)
{
if (LBResults.InvokeRequired)
{
LBResults.Invoke(new UpdateListDelegate(UpdateList), Value);
}
else
{
LBResults.Items.Add(Value);
}
}
private void CalculateCollatz(string Number)
{
BigInteger MyNumber;
BigInteger.TryParse(Number, out MyNumber);
while (MyNumber > 1)
{
if (MyNumber.IsEven == false)
{
MyNumber = MyNumber * 3 + 1;
UpdateList(MyNumber.ToString());
}
else
{
MyNumber = MyNumber / 2;
UpdateList(MyNumber.ToString());
}
}
}
private void RunWork(string Number)
{
Thread DoWork = new Thread(new ThreadStart(() => CalculateCollatz(Number)));
DoWork.Start();
}
public FrmMain()
{
InitializeComponent();
}
private void BtnStart_Click(object sender, EventArgs e)
{
LBResults.Items.Clear();
RunWork(TxtNumberIn.Text);
}
}
}
El código es realmente simple, ya que solo hacemos, para empezar, un bucle "while", que se ejecutará mientras la variable "MyNumber", sea mayor que uno. Después comprobamos si el numero es par, dentro de la estructura del "BigInteger", hay una función llamada "IsEven", la cual sirve para comprobar si un número es par. La utilizamos y si el resultado es "true", hacemos la división entre dos (cómo dice el enunciado), en caso contrario multiplicamos por 3 y le sumamos uno.
Para poder agilizar un poco, todo el proceso, se hace en un "thread" diferente, con lo cual la aplicación no se bloquea.
Por ahora, es todo. Desde mi punto de vista, parece que todos los numero son maravillosos, puesto que al ser impar (que usualmente son números raros), al multiplicar y sumarle uno, en algún punto, siempre nos dará un numero par. Aunque la conjetura no se ha probado (de ahí lo de conjetura), resulta un buen ejercicio para todo programador.
En el siguiente post de C#, agregaremos funciones para obtener más datos que son relevantes para la conjetura, Además, veremos un poco mas a fondo el tipo "BigInteger" y extenderemos el uso de threads para hacer cálculos un poco más "masivos". Cómo de costumbre, el código completo lo dejo en mi dropbox para que lo descargues.
Los leo luego.
7/29/2017 07:10:00 p.m.
conjetura de collatz
,
csharp
,
depuracion
,
programacion
Learning Machine #6 - Programando en Pascal - Bucle while.
Hola de nuevo a todos, el dia de hoy vamos a ver un poco mas de programacion en pascal. Hoy toca ver cómo se usa el bucle "while".
El bucle "while" cómo su nombre lo indica, es una palabra reservada que sirve para indicar que queremos hacer un proceso y que este se repita hasta que cierta condición se cumpla.
Supongamos que queremos comprobar un numero que el usuario escriba con un numero que nosotros tengamos almacenados en una variable, para evitar que se la pase todo el día escribiendo números, vamos a darle un numero limitados de intentos; supongamos 5.
Para llevar a cabo la tarea mencionada antes, podemos usar código como el que sigue:
Para empezar veamos cómo es que funciona la palabra reservada while. Esta palabra va seguida de una condición, en el código anterior, la condición es: "Oportunidades <= 5" después sigue la palabra reservada "do". todo el bloque de código que se usa debe ir en medio de las palabras reservadas "begin" y "end;". Todo el código que se quiera ejecutar debe de ir en esta sección. Una representación de cualquier bucle "while", puede ser el siguiente:
Algo que se debe de tener muy en cuenta, es el cómo se plantea la condición. Al ir avanzando linea por linea, cuando en la ejecución se encuentra "while" evaluara la expresión y si al hacerlo esta ya se cumple, simplemente avanzara hasta la linea donde se encuentre el "end" del cierre del bucle.
Para el caso del primer código, primero le asignamos un valor a la variable "MiNumero" y después viene el bucle "while" con la condición que mientras la variable "Oportunidades" sea menor o igual que 5, haga lo que está dentro del bucle.
Adentro del bucle, le vamos a preguntar un numero al usuario y lo almacenaremos en la variable "TuNumero", luego compararemos la variable "TuNumero" con la variable "MiNumero" y si son diferentes, a la variable "Oportunidades" le sumaremos 1. Si escribimos 5 veces un numero que no sea 64, llegaremos al final de la ejecución, pero si solo escribimos el numero 64, esto nos llevara al final del programa, porque la palabra reservada "break", sirve para salir del bucle sin importar que la condición se haya cumplido o no, en el caso anterior, en el "if", solo hay dos posibles vias, una es cuando "TuNumero" y "MiNumero" son diferentes y la otra es cuando el número es igual, cuando se escribe 64 no tiene sentido que le sigamos preguntando cual es nuestro numero porque ya lo ha averiguado, entonces hacemos uso de "break" y con eso iremos al final del programa.
Solo para probar que funciona, puedes cambiar el "<=" por ">=". Con esto, el programa ira directamente a la penúltima linea ("readln"), porque se habrá brincado todo el bucle.
Y bien, por ahora es todo, la semana que viene continuaremos con mas de la programación en Pascal.
El bucle "while" cómo su nombre lo indica, es una palabra reservada que sirve para indicar que queremos hacer un proceso y que este se repita hasta que cierta condición se cumpla.
Supongamos que queremos comprobar un numero que el usuario escriba con un numero que nosotros tengamos almacenados en una variable, para evitar que se la pase todo el día escribiendo números, vamos a darle un numero limitados de intentos; supongamos 5.
Para llevar a cabo la tarea mencionada antes, podemos usar código como el que sigue:
program Bucle;
uses crt;
var Oportunidades, MiNumero, TuNumero : integer;
begin
MiNumero := 64;
clrscr;
while Oportunidades <= 5 do
begin
writeln('Ingresa un numero');
readln(TuNumero);
if TuNumero <> MiNumero then
Oportunidades := Oportunidades + 1
else
break;
end;
writeln('Fin del programa');
readln();
end.
Para empezar veamos cómo es que funciona la palabra reservada while. Esta palabra va seguida de una condición, en el código anterior, la condición es: "Oportunidades <= 5" después sigue la palabra reservada "do". todo el bloque de código que se usa debe ir en medio de las palabras reservadas "begin" y "end;". Todo el código que se quiera ejecutar debe de ir en esta sección. Una representación de cualquier bucle "while", puede ser el siguiente:
while "Condicion No se cumple" do
begin
{ ... }
{ ... }
{ ... }
{ ... }
end
Algo que se debe de tener muy en cuenta, es el cómo se plantea la condición. Al ir avanzando linea por linea, cuando en la ejecución se encuentra "while" evaluara la expresión y si al hacerlo esta ya se cumple, simplemente avanzara hasta la linea donde se encuentre el "end" del cierre del bucle.
Para el caso del primer código, primero le asignamos un valor a la variable "MiNumero" y después viene el bucle "while" con la condición que mientras la variable "Oportunidades" sea menor o igual que 5, haga lo que está dentro del bucle.
Adentro del bucle, le vamos a preguntar un numero al usuario y lo almacenaremos en la variable "TuNumero", luego compararemos la variable "TuNumero" con la variable "MiNumero" y si son diferentes, a la variable "Oportunidades" le sumaremos 1. Si escribimos 5 veces un numero que no sea 64, llegaremos al final de la ejecución, pero si solo escribimos el numero 64, esto nos llevara al final del programa, porque la palabra reservada "break", sirve para salir del bucle sin importar que la condición se haya cumplido o no, en el caso anterior, en el "if", solo hay dos posibles vias, una es cuando "TuNumero" y "MiNumero" son diferentes y la otra es cuando el número es igual, cuando se escribe 64 no tiene sentido que le sigamos preguntando cual es nuestro numero porque ya lo ha averiguado, entonces hacemos uso de "break" y con eso iremos al final del programa.
Solo para probar que funciona, puedes cambiar el "<=" por ">=". Con esto, el programa ira directamente a la penúltima linea ("readln"), porque se habrá brincado todo el bucle.
Y bien, por ahora es todo, la semana que viene continuaremos con mas de la programación en Pascal.
7/22/2017 05:04:00 p.m.
aprende
,
Learning Machine
,
programacion
Learning Machine #5 - Programando en Pascal - Estructura de control if y else.
Hola de nuevo a todas, el día de hoy vamos a continuar con el aprendizaje del lenguaje de programación Pascal. Hoy toca ver la estructura de control if.
Parte fundamental de cualquier programa, es tomar una decisión en base a algo, en el caso de la programación, podemos por ejemplo: decidir si hacer algo o no si un numero es tan grande; o tan pequeño en comparación a otro, juntar todas las cosas que el usuario escriba que empiecen por una letra.
Si el número es mas grande, Si es mas pequeño o si es igual.
Entonces tenemos que usar: ">", "<" y "=".
Ahora tenemos el siguiente código
Como verás, primero creamos dos variables del tipo "integer", luego le preguntamos al usuario por un número que vamos a almacenar en la variable "TuNumero", luego vienen las comparaciones. La primera vamos a comprobar si el numero que el usuario escribió es mas pequeño que el que nosotros le asignamos a la variable "MiNumnero", si es así, le mostraremos un mensaje que dice: "Mi número es mas grande". Para el segundo caso, vamos a comprobar si le número que escribió es más grande y para el tercer caso solo comprobaremos si el número es igual.
El código de arriba tambien se puede plantear de la siguiente manera
Para hacerlo de la forma anterior hacemos uso de la palabra reservada "else", seguida de la palabra reservada "if" y después la condición (cómo en el primer caso). Ademas, no hacemos uso de ";" porque cuando lo hacemos, indicamos que es el final de la instrucción "if", entonces solo hay que ponerlo para indicar que terminamos.
A veces resulta realmente dificil poder listar todas las posibles situaciones, pero con el uso de "else" nos podemos ahorrar un poco.
Y bien, por ahora es todo, en el sigueinte post continuaremos con mas de programacion en pascal.
Los leo luego.
Parte fundamental de cualquier programa, es tomar una decisión en base a algo, en el caso de la programación, podemos por ejemplo: decidir si hacer algo o no si un numero es tan grande; o tan pequeño en comparación a otro, juntar todas las cosas que el usuario escriba que empiecen por una letra.
IF
La estructura de control "if" sirve para redireccionar el flujo de un programa, para hacerlo, primero hará una comprobación y si el resultado es cierto, el programa ejecutará cierto código.
Para usar "if" en Pascal, primero hay que escribir la palabra reservada "if", depues viene la parte de la comprobación lógica en la cual si el resultado es "verdadero", ejecutara código dentro de la instrucción if. una vez escrita la condición, debemos de incluir la palabra reservada "then".
Para hacer las comparaciones disponemos de los siguientes simbolos de comparacacion:
Para usar "if" en Pascal, primero hay que escribir la palabra reservada "if", depues viene la parte de la comprobación lógica en la cual si el resultado es "verdadero", ejecutara código dentro de la instrucción if. una vez escrita la condición, debemos de incluir la palabra reservada "then".
Para hacer las comparaciones disponemos de los siguientes simbolos de comparacacion:
- < Menor que
- <= Menor o igual que
- > Mayor que
- >= Mayor o igual que
- = Igual que
- <> Distinto que
Si el número es mas grande, Si es mas pequeño o si es igual.
Entonces tenemos que usar: ">", "<" y "=".
Ahora tenemos el siguiente código
Program HelloWorld(output);
uses crt;
var MiNumero, TuNumero : integer;
begin
MiNumero := 20;
clrscr;
writeln('Escribe un numero');
readln(TuNumero);
if TuNumero < MiNumero then
writeln('Mi numero es mas grande');
if TuNumero > MiNumero then
writeln('Tu numero es mas grande');
if TuNumero = MiNumero then
writeln('Los numeros son iguales');
readln;
end.
Como verás, primero creamos dos variables del tipo "integer", luego le preguntamos al usuario por un número que vamos a almacenar en la variable "TuNumero", luego vienen las comparaciones. La primera vamos a comprobar si el numero que el usuario escribió es mas pequeño que el que nosotros le asignamos a la variable "MiNumnero", si es así, le mostraremos un mensaje que dice: "Mi número es mas grande". Para el segundo caso, vamos a comprobar si le número que escribió es más grande y para el tercer caso solo comprobaremos si el número es igual.
El código de arriba tambien se puede plantear de la siguiente manera
Program HelloWorld(output);
uses crt;
var MiNumero, TuNumero : integer;
begin
MiNumero := 20;
clrscr;
writeln('Escribe un numero');
readln(TuNumero);
if TuNumero < MiNumero then
writeln('Mi numero es mas grande')
else if TuNumero > MiNumero then
writeln('Tu numero es mas grande')
else if TuNumero = MiNumero then
writeln('Los numeros son iguales');
readln;
end.
Para hacerlo de la forma anterior hacemos uso de la palabra reservada "else", seguida de la palabra reservada "if" y después la condición (cómo en el primer caso). Ademas, no hacemos uso de ";" porque cuando lo hacemos, indicamos que es el final de la instrucción "if", entonces solo hay que ponerlo para indicar que terminamos.
Else
Para hacer uso de la palabra else, debemos de seguir los mismo pasos que para "else if", ademas debemos de usarlo siempre al final de la instruccion if.
Ahora supongamos que solo queremos saber si el numero es igual o diferente al que nosotros almacenamos en nuestra variable, podemos hacer lo mismo que al inicio o podemos hacer uso de "else" (un tanto inpractico pero sirve para demostrar lo que queremos).
Entonces podemos usar código como el que sigue:
Program HelloWorld(output);
uses crt;
var MiNumero, TuNumero : integer;
begin
MiNumero := 20;
clrscr;
writeln('Escribe un numero');
readln(TuNumero);
if TuNumero = MiNumero then
writeln('Los numeros son iguales')
else
writeln('Los numeros son diferentes');
readln;
end.
A veces resulta realmente dificil poder listar todas las posibles situaciones, pero con el uso de "else" nos podemos ahorrar un poco.
Y bien, por ahora es todo, en el sigueinte post continuaremos con mas de programacion en pascal.
Los leo luego.
7/14/2017 07:16:00 p.m.
aprende
,
Learning Machine
,
pascal
,
programacion
Learning Machine #4 - Programando en Pascal - Declaraciones, ámbitos y constantes.
Hola a todos, el día de hoy vamos a continuar con la programación es Pascal. En el post anterior, vimos cuales son los tipos de datos que se pueden usar, pero olvide algo realmente fundamental, el cómo declararlas.
Para declarar una variable en Pascal, es necesario usar la palabra reservada "var", la mayorías de las variables globales que van a ser usadas por el programa, deben de ser declaradas justo antes del inicio del programa, siempre es bueno declarar la mayor parte de estas en este punto, así el programa al iniciar, cargará la mayor parte de los recursos necesarios al inicio.
En pascal la forma de declarar las variables es la siguiente:
NombreDeLaVariable : tipo;
El nombre de la variable debe de empezar por una letra y puede incluir números y símbolos que no sean usados por el lenguaje de ":" y finalmente el tipo del cual será.
Por ejemplo, vamos a crear 5 variables:
Con el fragmento de código anterior, hemos creado 3 variables del tipo integer llamadas: "Valor1", "Valor2" y "Valor3", además de 2 variables del tipo string llamadas: "Nombre1" y "Nombre2".
Se puede ahorrar un poco de espacio si en lugar de crear una variable del mismo tipo por linea, se declaran todas las variables similares en una sola. Para hacer eso, hay que escribir el nombre de la variable seguido de una coma ",", cuando se hallan declarado todas la variables que queramos que pertenezcan al mismo tipo, se pondrá ":" seguido por el tipo al cual pertenecerán. Entonces, el fragmento de código anterior puede crearse de la siguiente manera:
Si se intenta cambiar el valor de una constante en algún punto del programa, este producirá un error en tiempo de compilación.
Los siguientes son ejemplos de declaración de variables:
En lenguajes que sean orientados a objetos (c#, delphi, etc), existen palabras reservadas que sirven para indicar directamente si una variable es privada o no, es decir si se puede usar más allá del ámbito en el cual fue creada.
Y bien, por ahora es todo, en el siguiente post continuaremos con más programación para Pascal
Los leo luego
Para declarar una variable en Pascal, es necesario usar la palabra reservada "var", la mayorías de las variables globales que van a ser usadas por el programa, deben de ser declaradas justo antes del inicio del programa, siempre es bueno declarar la mayor parte de estas en este punto, así el programa al iniciar, cargará la mayor parte de los recursos necesarios al inicio.
En pascal la forma de declarar las variables es la siguiente:
NombreDeLaVariable : tipo;
El nombre de la variable debe de empezar por una letra y puede incluir números y símbolos que no sean usados por el lenguaje de ":" y finalmente el tipo del cual será.
Por ejemplo, vamos a crear 5 variables:
var Valor1 : integer; Valor2 : integer; Valor3 : integer; Nombre1 : string; Nombre2 : string; begin ...
Con el fragmento de código anterior, hemos creado 3 variables del tipo integer llamadas: "Valor1", "Valor2" y "Valor3", además de 2 variables del tipo string llamadas: "Nombre1" y "Nombre2".
Se puede ahorrar un poco de espacio si en lugar de crear una variable del mismo tipo por linea, se declaran todas las variables similares en una sola. Para hacer eso, hay que escribir el nombre de la variable seguido de una coma ",", cuando se hallan declarado todas la variables que queramos que pertenezcan al mismo tipo, se pondrá ":" seguido por el tipo al cual pertenecerán. Entonces, el fragmento de código anterior puede crearse de la siguiente manera:
var Valor1, Valor2, Valor3 : integer; Nombre1, Nombre2 : string; begin ...
Constantes.
Las constantes son valores que se declaran y se les asigna un valor al mismo tiempo, una vez que el valor a sido establecido, ya no es posible cambiarlo. Cuando queremos hacer uso del la constante, basta con mandarla a llamar por su nombre y entonces se usará el valor que está posea.Si se intenta cambiar el valor de una constante en algún punto del programa, este producirá un error en tiempo de compilación.
Los siguientes son ejemplos de declaración de variables:
Const e = 2.7182818; MyName = 'XWork';El uso de constantes es realmente útil cuando trabajemos con valores conocidos que no se van a modificar.
Visibilidad de los datos.
Algo muy importante que hay que tomar en cuenta, es la visibilidad de los datos, cuando creamos las variables en esta parte del programa, al estar en la parte principal, estos serán visibles para todo el programa, es decir estos valores podrán ser leídos y escritos desde cualquier lugar de la aplicación. Lo importante de esto, es que hay que tener muy en mente que es lo que vamos a hacer y cómo vamos a hacerlo, supongamos que creamos variables al inicio del programa y llegamos al punto en que el programa es tan grande y tiene tantas variables que por error escribimos el nombre de una variable que no es la que estamos usando. Al haber modificado los datos de una variable sin darnos cuenta, el programa producirá un error en algún momento. Aunque en pascal solo hay ámbitos, local y global. Cuando una variable se crea dentro de una función o procedimiento (cosas que veremos un poco después), esta solo sera visible dentro de la funcion (o procedimiento) en el cual se haya creado.En lenguajes que sean orientados a objetos (c#, delphi, etc), existen palabras reservadas que sirven para indicar directamente si una variable es privada o no, es decir si se puede usar más allá del ámbito en el cual fue creada.
Y bien, por ahora es todo, en el siguiente post continuaremos con más programación para Pascal
Los leo luego
7/06/2017 04:47:00 p.m.
aprende
,
Learning Machine
,
pascal
,
programacion
Learning Machine #3 - Programando en Pascal - Variables.
Hola de nuevo a todos, el día de hoy vamos a continuar con más de programación en Pascal. En el post del día de hoy vamos a ver los tipos de datos que se pueden usar. En algunos post anteriores hemos visto algo similar, pero hoy veremos el caso concreto para pascal, ademas es importante repetir esto tantas veces cómo sea necesario para que nuestros programas estén lo más optimizados posibles en el uso de memoria.
Los datos anteriores solo corresponden a las variables del tipo "numérico" o tipos simples. Antes de avanzar hay que ver un poco sobre el tipo integer.
Cuando Pascal compila, el tipo integer dependerá de cual fue el objetivo de la compilación, usualmente, la mayoría de la gente está familiarizado con máquinas de 32 bits, pero existen 3 tipos de estándares, 16,32,64. Cuando se compila una aplicación cuyo objetivo es una máquina de 16 bits, pascal usará 16 bits (2 bytes) para almacenar los valores del tipo integer, esto nos dará una capacidad de -32,768 a 32,767, pero en cambio si nuestro objetivo es una máquina de 32 bits, se usaran 32 bits(valga la redundancia) y podrá almacenar desde -2,147,483,648 a 2,147,683,647. En el caso de las máquinas de 64 bits ocurre exactamente lo mismo.
El otro caso que debemos de revisar es el tipo "Char", este puede almacenar un valor entre 0 a 255, pero solo es en teoría, porque este se usa para hacer referencia a un elemento del estándar ASCII y por ejemplo, si tratamos de hacer una operación matemática sobre una variable declarada cómo "char", el compilador nos marcará un error.
Para los tipos complejos, por ahora solo veremos el tipo "String". Este tipo se usa para almacenar cadenas de texto con una longitud de hasta 255 caracteres (aunque se puede ampliar), este es el tipo que se usara para poder trabajar con cadenas de texto.
Y bien, por ahora es todo, si bien aún hay algunos tipos más, por ahora estos serán más que suficiente para empezar a programar con pascal.
Los leo luego
Variables y sus tipos.
Al igual que en los otros lenguajes de programacion, en Pascal haremos uso de variables. Estas serán las encargadas de almacenar valores que posteriormente usaremos, pero dependiendo de cómo sea declarada, será el tipo de "datos" que se le pueda asignar.
Los datos y los valores que pueden almacenar son los siguientes:
| Tipo | Rango | Tamańo en bytes |
|---|---|---|
| Byte | 0 .. 255 | 1 |
| Shortint | -128 .. 127 | 1 |
| Smallint | -32768 .. 32767 | 2 |
| Word | 0 .. 65535 | 2 |
| Integer | *** | *** |
| Longint | -2147483648 .. 2147483647 | 4 |
| Longword | 0 .. 4294967295 | 4 |
| Int64 | -9223372036854775808 .. 9223372036854775807 | 8 |
| Qword | 0 .. 18446744073709551615 | 8 |
| Char | *** | 1 |
Los datos anteriores solo corresponden a las variables del tipo "numérico" o tipos simples. Antes de avanzar hay que ver un poco sobre el tipo integer.
Cuando Pascal compila, el tipo integer dependerá de cual fue el objetivo de la compilación, usualmente, la mayoría de la gente está familiarizado con máquinas de 32 bits, pero existen 3 tipos de estándares, 16,32,64. Cuando se compila una aplicación cuyo objetivo es una máquina de 16 bits, pascal usará 16 bits (2 bytes) para almacenar los valores del tipo integer, esto nos dará una capacidad de -32,768 a 32,767, pero en cambio si nuestro objetivo es una máquina de 32 bits, se usaran 32 bits(valga la redundancia) y podrá almacenar desde -2,147,483,648 a 2,147,683,647. En el caso de las máquinas de 64 bits ocurre exactamente lo mismo.
El otro caso que debemos de revisar es el tipo "Char", este puede almacenar un valor entre 0 a 255, pero solo es en teoría, porque este se usa para hacer referencia a un elemento del estándar ASCII y por ejemplo, si tratamos de hacer una operación matemática sobre una variable declarada cómo "char", el compilador nos marcará un error.
Para los tipos complejos, por ahora solo veremos el tipo "String". Este tipo se usa para almacenar cadenas de texto con una longitud de hasta 255 caracteres (aunque se puede ampliar), este es el tipo que se usara para poder trabajar con cadenas de texto.
Y bien, por ahora es todo, si bien aún hay algunos tipos más, por ahora estos serán más que suficiente para empezar a programar con pascal.
Los leo luego
6/29/2017 04:41:00 p.m.
Learning Machine
,
pascal
,
programacion
Cumplimos un año!!
Hola a todos, el día de hoy solo escribo para agradecer a todos los que nos visitaron, visitan y visitaran.
Ha sido un largo trayecto desde el primer día hasta hoy. Solo me resta agradecer a las personas que me motivaron a iniciar con este proyecto (muy particularmente a una ;) ).
Continuaremos con los proyectos y actualizaciones pendientes y todos juntos avanzaremos hacia adelante.
Gracias a todos, Nos leeremos luego.
Ha sido un largo trayecto desde el primer día hasta hoy. Solo me resta agradecer a las personas que me motivaron a iniciar con este proyecto (muy particularmente a una ;) ).
Continuaremos con los proyectos y actualizaciones pendientes y todos juntos avanzaremos hacia adelante.
Gracias a todos, Nos leeremos luego.
6/21/2017 05:30:00 p.m.
1st anniversary
,
offtopic
Learning Machine #2 - Programando en pascal - Fundamentos del lenguaje.
Hola de nuevo a todos, el día de hoy vamos a continuar con el aprendizaje del lenguaje de programación en pascal. En el post anterior vimos un poco sobre el ciclo de vida de un programa (para este y todo los lenguajes). En este post vamos a ver un poco más sobre Pascal.
Palabras reservadas.
Al igual que todos los otros lenguajes de programación, en Pascal se usan una serie de palabras que tienen una función en especifico y no puede ser usadas como nombres para variables.
La siguiente lista muestra las palabras reservadas en Free Pascal (su uso las veremos más adelante):
La siguiente lista muestra las palabras reservadas en Free Pascal (su uso las veremos más adelante):
- absolute
- and
- array
- asm
- begin
- case
- const
- constructor
- destructor
- div
- do
- downto
- else
- end
- file
- for
- function
- goto
- if
- implementation
- in
- inherited
- inline
- interface
- label
- mod
- nil
- not
- object
- of
- operator
- or
- packed
- procedure
- program
- record
- reintroduce
- repeat
- self
- set
- shl
- shr
- string
- then
- to
- type
- unit
- until
- uses
- var
- while
- with
- xor
Simbolos.
En el lenguaje de programación Pascal, se reconocen todos los símbolos en el estandar ASCII, pero ademas, los siguiente símbolos tienen un uso especial:
- +
- -
- *
- /
- =
- <
- >
- [ ]
- .
- ,
- ( )
- :
- ^
- @
- { }
- $
- #
- &
- %
Y los siguientes pares de símbolos también:
- <<
- >>
- **
- <>
- ><
- <=
- >=
- :=
- +=
- -=
- *=
- /=
- (*
- *)
- (.
- .)
- //
Comentarios.
Los comentarios son partes de código que van a ser omitidos por el compilador al momento de generar el ejecutable. Principalmente se usan para proporcionar información adicional en el código, en pascal, se puede comentar de tres maneras distintas. supongamos el siguiente código:
Program HelloWorld(output);
uses crt;
(* Aqui empieza la parte principal *)
begin
clrscr;
writeln('Hello World');
(* Usamos readln() para esperar que se presione enter *)
readln();
end.
Ahora el siguiente:
Program HelloWorld(output);
uses crt;
{ Aqui empieza la parte principal }
begin
clrscr;
writeln('Hello World');
{ Usamos readln() para esperar que se presione enter }
readln();
end.
Y el siguiente:
En todos los casos anteriores, el código es exactamente igual, solo que se usan todas las formas de comentar disponibles.
Y bien, por ahora es todo, en el siguiente post seguiremos viendo más sobre el lenguaje de programación Pascal.
Los leo luego.
Program HelloWorld(output);
uses crt;
//Aqui empieza la parte principal
begin
clrscr;
writeln('Hello World');
//Usamos readln() para esperar que se presione enter
readln();
end.
En todos los casos anteriores, el código es exactamente igual, solo que se usan todas las formas de comentar disponibles.
Y bien, por ahora es todo, en el siguiente post seguiremos viendo más sobre el lenguaje de programación Pascal.
Los leo luego.
6/15/2017 06:18:00 p.m.
aprende
,
Basics
,
Learning Machine
,
pascal
Learning machine #1 - Programando en Pascal.
Hola de nuevo a todos, el día de hoy vamos a ver una introduccion al mundo de la programación.
Varios usuarios me han preguntado (atraves del formulario de contacto) sobre la posibilidad de crear "tutoriales" para aprender a programar, al inicio no me gustaba la idea, porque no soy bueno explicando, pero alguien alguna vez dijo: "Cuando enseñas tu tambien aprendes", entonces, trataré de hacer algunos post en donde mostraré las cuestiones básicas (y un poco más).
Al inicio no se me ocurria en que programa empezar así que en vez de ir a C#; porque hay mucho código en el post o java (para android), decidí empezar con lo que yo empecé: Pascal.
Si bien no es un lenguaje muy popular ni mucho menos nuevo, creo que sirve para sentar las bases que cualquier programador necesita.
Para empezar, descargaremos el IDE de Pascal desde su página. Antes de empezar vamos a ver el ciclo de vida de un programa.
El diseño, este consiste en tratar de pasar el algoritmo que se concebi antes al código, esta parte es esencial y muy importante, dado que el programa resultante será la implementación del código que nosotros hayamos escrito. Un buen código producirá una buena ejecución.
Las pruebas, estas deben de realizarse para corregir errores y tratar de evitarlos lo más que se pueda. En está etapa debemos de probar las cosas más absurdas. Es importante probar la mayoría de los escenarios posibles, en algunas ocasiones, lo errores serán producto de las propias limitantes del lenguaje de programación, otras serán producto de nuestro propio descuido, y finalmente vendrán lo errores que el usuario pueda causar. Es importante que tratemos de no asumir, por más absurdo que algo nos pueda parecer, hay que manejarlo cómo es debido. Supongamos que seguimos con el programa de la calculadora, el usuario la ejecuta y quiere hacer una división; 13/0. Todos los lenguajes producirán un error si se quiere dividir cualquier número entre 0 y si no hay un manejo adecuado, la aplicación simplemente se cerrará (o peor, puede comprometer todo el sistema, eso dependiendo de que es lo que hacemos). La manera de evitarlo, sera comprobar cual es el valor del divisor y si es 0 simplemente no hacer la operación y decirle al usuario cual fue la razón por la que no se pudo resolver su operación.
Finalmente la implementacion, esta parte corresponde a la ejecucion, cuando ya se han hecho las debidas pruebas y hemos minimizado los errores, si es cierto, siempre, cualquier programa será propenso a los errores (aun si llevas decadas programando), pero siempre (y aunque suene repetitivo) debemos de probar la mayoria de escenarios posibles.
Un programa en pascal consiste de 5 partes:
Para hacer la declaración de las librerías que vamos a usar, debemos de hacer uso de la palabra reservada "uses" seguida del nombre de la librería (por ahora solo usamos crt que proporciona funciones básicas).
Después vendría la declaración de las variables que vayamos a usar, la palabra reservada "begin" indica el inicio del programa en sí, seguido de está, debemos de escribir el código de la aplicación.
"clrscr;"limpia la pantalla, es decir borra todo el contenido previo y deja lista la ventana en "blanco". "writeln("Hello World");" la función "writeln" se usa para mostrar texto pero además, inserta un linea nueva al final. "readln();" se usa para que el programa reciba texto por parte del usuario, en programas simples, es recomendable usar un "readln();" al final del programa, porque cuando acaba la ejecución, el programa se cierra de manera inmediata, en el código anterior, si no usáramos la función, al ejecutar la aplicación solo veríamos una ventana negra que se cierra de inmediato. "end." se usa para indicar que es el fin del programa.
Y bien, por ahora es todo, en el siguiente post veremos cómo usar librerías y ademas vernos cuales son las más comunes y las funciones que ofrecen, además de los tipos de datos que podemos usar en Pascal.
Los leo luego.
Varios usuarios me han preguntado (atraves del formulario de contacto) sobre la posibilidad de crear "tutoriales" para aprender a programar, al inicio no me gustaba la idea, porque no soy bueno explicando, pero alguien alguna vez dijo: "Cuando enseñas tu tambien aprendes", entonces, trataré de hacer algunos post en donde mostraré las cuestiones básicas (y un poco más).
Al inicio no se me ocurria en que programa empezar así que en vez de ir a C#; porque hay mucho código en el post o java (para android), decidí empezar con lo que yo empecé: Pascal.
Si bien no es un lenguaje muy popular ni mucho menos nuevo, creo que sirve para sentar las bases que cualquier programador necesita.
Para empezar, descargaremos el IDE de Pascal desde su página. Antes de empezar vamos a ver el ciclo de vida de un programa.
Ciclo de vida de un programa/aplicación.
El ciclo de vida consiste basicamente de cuatro partes:- Analisis.
- Diseño.
- Pruebas.
- Implementacion.
El diseño, este consiste en tratar de pasar el algoritmo que se concebi antes al código, esta parte es esencial y muy importante, dado que el programa resultante será la implementación del código que nosotros hayamos escrito. Un buen código producirá una buena ejecución.
Las pruebas, estas deben de realizarse para corregir errores y tratar de evitarlos lo más que se pueda. En está etapa debemos de probar las cosas más absurdas. Es importante probar la mayoría de los escenarios posibles, en algunas ocasiones, lo errores serán producto de las propias limitantes del lenguaje de programación, otras serán producto de nuestro propio descuido, y finalmente vendrán lo errores que el usuario pueda causar. Es importante que tratemos de no asumir, por más absurdo que algo nos pueda parecer, hay que manejarlo cómo es debido. Supongamos que seguimos con el programa de la calculadora, el usuario la ejecuta y quiere hacer una división; 13/0. Todos los lenguajes producirán un error si se quiere dividir cualquier número entre 0 y si no hay un manejo adecuado, la aplicación simplemente se cerrará (o peor, puede comprometer todo el sistema, eso dependiendo de que es lo que hacemos). La manera de evitarlo, sera comprobar cual es el valor del divisor y si es 0 simplemente no hacer la operación y decirle al usuario cual fue la razón por la que no se pudo resolver su operación.
Finalmente la implementacion, esta parte corresponde a la ejecucion, cuando ya se han hecho las debidas pruebas y hemos minimizado los errores, si es cierto, siempre, cualquier programa será propenso a los errores (aun si llevas decadas programando), pero siempre (y aunque suene repetitivo) debemos de probar la mayoria de escenarios posibles.
Estructura de un programa en pascal.
- Titulo del programa.
- Declaracion de librerias.
- Declaracion de variables.
- Cuerpo del programa
- Implementacion.
- Fin del programa.
Para hacer la declaración de las librerías que vamos a usar, debemos de hacer uso de la palabra reservada "uses" seguida del nombre de la librería (por ahora solo usamos crt que proporciona funciones básicas).
Después vendría la declaración de las variables que vayamos a usar, la palabra reservada "begin" indica el inicio del programa en sí, seguido de está, debemos de escribir el código de la aplicación.
"clrscr;"limpia la pantalla, es decir borra todo el contenido previo y deja lista la ventana en "blanco". "writeln("Hello World");" la función "writeln" se usa para mostrar texto pero además, inserta un linea nueva al final. "readln();" se usa para que el programa reciba texto por parte del usuario, en programas simples, es recomendable usar un "readln();" al final del programa, porque cuando acaba la ejecución, el programa se cierra de manera inmediata, en el código anterior, si no usáramos la función, al ejecutar la aplicación solo veríamos una ventana negra que se cierra de inmediato. "end." se usa para indicar que es el fin del programa.
Y bien, por ahora es todo, en el siguiente post veremos cómo usar librerías y ademas vernos cuales son las más comunes y las funciones que ofrecen, además de los tipos de datos que podemos usar en Pascal.
Los leo luego.
6/08/2017 06:14:00 p.m.
aprende
,
Basics
,
lazarus
,
Learning Machine
,
pascal
Back to basics #4 - Eligiendo al mejor tipo.
Hola de nuevo a todos, el día de hoy vamos a continuar con lo básico. En el post anterior, vimos cómo al elegir un tipo de variable, puede ser determinante a la hora de que se producen los errores.
Antes que nada vamos a ver cuales son los tipos disponibles en C# y Java en la siguiente tabla:
La tabla anterior está disponible en la página de ayuda de MSDN,
Ahora, que es lo que debemos antes de empezar a crear una aplicación, bueno, debemos de tener muy claro que es lo que queremos lograr, si no tenemos eso muy claro desde el principio, es muy posible que a medio programa encontremos algunas dificultades. En C# disponemos de 15 tipos de variables y es necesario saber que tipo de datos se almacenan en cada una.
Antes que nada vamos a ver cuales son los tipos disponibles en C# y Java en la siguiente tabla:
| Nombre corto | Clase .NET | Tipo | Ancho | Intervalo (bits) |
|---|---|---|---|---|
| byte | Byte | Entero sin signo | 8 | 0 a 255 |
| sbyte | SByte | Entero con signo | 8 | -128 a 127 |
| int | Int32 | Entero con signo | 32 | -2.147.483.648 a 2.147.483.647 |
| uint | UInt32 | Entero sin signo | 32 | 0 a 4294967295 |
| short | Int16 | Entero con signo | 16 | -32.768 a 32.767 |
| ushort | UInt16 | Entero sin signo | 16 | 0 a 65535 |
| long | Int64 | Entero con signo | 64 | -922337203685477508 a 922337203685477507 |
| ulong | UInt64 | Entero sin signo | 64 | 0 a 18446744073709551615 |
| float | Single | Tipo de punto flotante de precisión simple | 32 | -3,402823e38 a 3,402823e38 |
| double | Double | Tipo de punto flotante de precisión doble | 64 | -1,79769313486232e308 a 1,79769313486232e308 |
| char | Char | Un carácter Unicode | 16 | Símbolos Unicode utilizados en el texto |
| bool | Boolean | Tipo Boolean lógico | 8 | True o false |
| object | Object | Tipo base de todos los otros tipos | ||
| string | String | Una secuencia de caracteres | ||
| decimal | Decimal | Tipo preciso fraccionario o integral, que puede representar números decimales con 29 dígitos significativos | 128 | ą1.0 × 10e?28 a ą7.9 × 10e28 |
Ahora, que es lo que debemos antes de empezar a crear una aplicación, bueno, debemos de tener muy claro que es lo que queremos lograr, si no tenemos eso muy claro desde el principio, es muy posible que a medio programa encontremos algunas dificultades. En C# disponemos de 15 tipos de variables y es necesario saber que tipo de datos se almacenan en cada una.
¿Cómo aplicar el tamaño adecuado a las variables?
Muchas veces hay que elegir que tipo de variables son la que debemos de usar en determinada parte de nuestro programa, generalmente siempre se buscará usar la variable más grande disponible, eso siempre y cuando no sepamos cual será el valor que está poseerá. Pero es recomendables hacer eso?, por supuesto que no! siempre debemos de tratar de tener el menor consumo de memoria.
Imaginemos que tenemos un programa en el cual una variable va a recibir el valor que el usuario introduzca, así que creamos una variable del tipo long (cuyo valor máximo es 922337203685477507), en tiempos modernos funciona de maravilla y nos ahorra muchos dolores de cabeza, finalmente que son 64 bits de 32,000,000,000 que hay disponibles en la mayoria de las computadoras (64 de 8,000,000,000 de los móviles). Pero la cosa no siempre fue así, hace no mucho tiempo, la cantidad de memoria era mucho más limitada, los computadores más potentes solamente tenían 64MBytes de RAM, por lo que administrar de manera prudente los recursos era primordial para el buen desarrollador de software. Entonces asumir no era una opcion, en ese caso lo que se hacia limitar al usuario, poner las condiciones pertinentes para que todo este dentro de los esperado. Podemos concluir que siempre debemos de usar la variable del tipo mas razonablemente pequeña y condicionar al usuario a que se ajuste, solo en casos realmente específicos es cuando debemos de adecuar el programa al usuario.
¿Cuando si debemos de ajustarnos?
En tiempos recientes es difícil citar un caso en el cual el programa deba de ajustarse a las condiciones del usuario. Hace no mucho tiempo una canción coreana se volvió inmensamente popular y la plataforma de videos más popular no estaba lista para poder llevar la cuenta, entonces un día, este video hizo lo impensable (por esas fechas) paso las 2,147,483,647 vistas y cómo vimos en el post anterior, un valor del tipo "int" no puede mostrar un número mas allá de ese y pasó lo que tenía que pasar, los desarrolladores se vieron en la necesidad de actualizar su código y ahora en lugar de usar una variable del tipo "int", optaron por usar valores de tipo long. Es una buena solución, ya que 922,337,203,685,477,507 es aproximadamente 131,762,457 la población de la tierra, más que suficiente en mi opinión.
Otro problema de este tipo surge con los equipos relativamente viejos, en ellos el tiempo se mide en segundos y se almacena en una espacio de 32 bits, haciendo cálculos, en el 2038 habrán alcanzado el limite que se puede almacenar en 32bits, pero este a diferencia del caso anterior es un poco mas complejo en su resolución. Muchos dirán que se puede arreglar con solo usar 64 bits para almacenar el tiempo, pero cuando se realizan operaciones de forma binaria se perdería compatibilidad con el software viejo. Muchos de los que previeron el problema hicieron que el hardware fuera compatible con 64bits y crearon software especifico para la plataforma, por lo que se evitarían el problema.
Otro problema de este tipo surge con los equipos relativamente viejos, en ellos el tiempo se mide en segundos y se almacena en una espacio de 32 bits, haciendo cálculos, en el 2038 habrán alcanzado el limite que se puede almacenar en 32bits, pero este a diferencia del caso anterior es un poco mas complejo en su resolución. Muchos dirán que se puede arreglar con solo usar 64 bits para almacenar el tiempo, pero cuando se realizan operaciones de forma binaria se perdería compatibilidad con el software viejo. Muchos de los que previeron el problema hicieron que el hardware fuera compatible con 64bits y crearon software especifico para la plataforma, por lo que se evitarían el problema.
En el caso de las aplicaciones que he hecho para el blog, lo admito, he sido flojo, pero muchos de los errores que tienen son de los más básicos y por más simple que sea, siempre se debe de entregar software lo mas completo y listo posible. A partir de eso, la mayoría de programas se van a actualizar para quitar todas las partes "flojas".
Y bien por ahora es todo, los leo luego.
Y bien por ahora es todo, los leo luego.
6/01/2017 07:04:00 p.m.
Basics
,
csharp
,
programacion
Back to basics #3 - Variables y sus tipos.
Hola de nuevo a todos, el día de hoy vamos a ver un poco más de las nociones básicas de programación.
En los post anteriores, hemos visto que resulta relativamente fácil portar un pedazo de código que hace algo, de una plataforma a otra, en el caso particular de C# y java, el código es especialmente parecido.
Al momento de crear código, uno debe de tener en mente que es lo que desea crear, pero no solo eso, también debe de imagina el cómo lo va a hacer, eso incluye: procedimientos,funciones y variables.
El caso de la variables es donde debemos de prestar especial atención ya que en ellas es donde se almacenarán los resultados de la ejecución, entonces si escogemos mal el tipo de variable, podemos echar a perder una buena ejecución.
En los post anteriores, hemos visto que resulta relativamente fácil portar un pedazo de código que hace algo, de una plataforma a otra, en el caso particular de C# y java, el código es especialmente parecido.
Al momento de crear código, uno debe de tener en mente que es lo que desea crear, pero no solo eso, también debe de imagina el cómo lo va a hacer, eso incluye: procedimientos,funciones y variables.
El caso de la variables es donde debemos de prestar especial atención ya que en ellas es donde se almacenarán los resultados de la ejecución, entonces si escogemos mal el tipo de variable, podemos echar a perder una buena ejecución.
El caso concreto: DecToAny.
Recientemente publiqué un par de programas que se encargaban de convertir un número decimal a cualquier base en el rango 2-35, todo parecía funcionar bien, eso al menos hasta el número 2,147,483,647, intentar convertir el número 2,147,483,648 produce un fallo que causa que la aplicación se detenga.
Al inspeccionar la imagen, podemos ver que el error es: OverflowException (en el caso de C#, pero te aseguro que es el mismo para java). Este tipo de errores/excepciones, se producen cuando intentamos asignar un valor más grande del que la variable puede manejar. hay que recordar que para almacenar el valor de entrada en la función que convierte el numero, usamos una variable del tipo "int" y si buscamos el valor máximo que este tipo de variable puede almacenar tenemos que es 2,147,483,647 y el mínimo es -2,147,483,648, eso quiere decir que se intentamos guardar un numero por arriba (o por abajo), simplemente no podremos hacerlo.
Un poco más del tipo int.
El tipo int es uno de los más comunes que usaremos, en la vida real hay muy pocas cosas que requieran un numero tan grande, pero porque solo puede almacenar ese numero? Bueno, la razón es porque utiliza un espacio de 32 bits, pero no todos están disponibles para almacenar el valor del número, el primer byte (de izquierda a derecha), se usará para almacenar el signo, cuando este byte tenga 1, indicará que es un número negativo, para el caso contrario, será positivo.
![]() |
| Si cuentas los unos, verás 31 de ellos, el 32 está reservado para el signo. |
Para solucionar el error, debemos de escoger una variable que pueda contener un valor más grande, pero que tenga características similares a la que usamos actualmente y la más parecida es "long" que puede almacenar un valor de -922337203685477508 a 922337203685477507, más que suficiente para nosotros. Por ahora queda de tarea ajustar el programa en C#.
Y bien, por ahora es todo, en el transcurso de la semana actualizaré los programas.
Por ahora es todo, los leo luego.
5/25/2017 05:41:00 p.m.
Basics
,
binario
,
Convertidor de bases
,
decimal
,
hexadecimal
,
how to
,
octal
,
programacion
Suscribirse a:
Entradas
(
Atom
)














