Xwork's Blog

The lord is waiting to take your hand.

Mostrando las entradas con la etiqueta pascal. Mostrar todas las entradas
Mostrando las entradas con la etiqueta pascal. Mostrar todas las entradas

Learning machine #18 - Programando en Pascal - Estructuras de datos (Record).

Hola de nuevo a todos, el día de hoy vamos a continuar con mas del aprendizaje del lenguaje de programación en pascal.

"En el capítulo anterior de <<Learning machine>>" vimos cómo es que se usan los arreglos de una o varias dimensiones. Hoy vamos a ver cómo es que se usan las estructuras de datos o "Record" (registro en español). Un registro  básicamente es un conjunto de variables bajo un mismo nombre o tipo.

Para crear un registro, hay que crear un tipo usando la palabra "Type" seguido del nombre o identificador que le daremos al registro, hasta aquí todo es igual a cuando creamos los tipos, ahora la diferencia viene en que hay que asignarlo al tipo "Record", es decir tendríamos algo cómo: "Type NombreDelRegistro = Record" una vez creado, dentro de este nuevo tipo, agregaremos "campos"; cada campo sera una variable de cualquiera de los tipos soportados por Pascal. Una vez agregados todos los campos, finalizaremos la declaracion, con la palabra reservada "end;". Para apreciar un poco mejor cómo es todo el proceso, tomemos el siguiente ejemplo:

Type MiCancion = Record
	Cancion,Artista,Album : string;
	Year : Integer;
	BeatPerMinute : single
end;

Con esto habremos creado un nuevo registro llamado "MiCancion"; este contendrá los campos: "Cancion, Artista, Album, Year y BeatPerMinute" del tipo "string, string, string, integer y single" respectivamente. Para poder usar el registro, crearemos variables del tipo que acabamos de crear.

Si queremos acceder a los campos, bastará con escribir el nombre de la variable seguido de "." y despues el nombre del campo. Para visualizar mejor cómo es que se hace, observemos el siguiente código:

        KillerQueen.Cancion := 'Killer Queen.flac';
	KillerQueen.Artista := 'Queen';
	KillerQueen.Album := 'Sheer Heart Attack';
	KillerQueen.Year := 1974;
	KillerQueen.BeatPerMinute := 117.27;

	writeln(KillerQueen.Cancion);
	writeln(KillerQueen.Artista);
	writeln(KillerQueen.Album);
	writeln(KillerQueen.Year);
	writeln(KillerQueen.BeatPerMinute);

Una forma de agilizar el acceso al registro, es hacer uso de la palabra reservada "with", para ello, escribiremos "with" seguido del nombre del registro al cual queremos acceder seguido de de la palabra reservada "do", luego "begin", para poder acceder a los miembros solo bastará con escribir el nombre de cada campo; y cómo cada sección, la finalizaremos con su respectivo "end;". Ahora revisemos el siguiente código que ejemplifica lo anterior.

with Epitaph do
	begin
		Cancion := 'Epitaph.flac';	
		Artista := 'King Crimson';
		Album := 'In the court of the crimson king';
		Year := 1969;
		BeatPerMinute := 100.37;
	end;

Los registros son utiles a la hora de trabajar con estructuras de datos ya que una vez que se crean y se asignan los valores correspondientes, todo el conjunto pasara a ser parte de la misma variable y si por ejemplo asignamos "KillerQueen := Epitaph" tendremos una copia exacta del primero.

Solo por si se ofrece, dejo el código de un programa completo que hace uso de los registros.

program Registros(output);

uses crt, sysutils;

Type MiCancion = Record
	Cancion,Artista,Album : string;
	Year : Integer;
	BeatPerMinute : single
end;

var

KillerQueen, Epitaph : MiCancion;

begin
	KillerQueen.Cancion := 'Killer Queen.flac';
	KillerQueen.Artista := 'Queen';
	KillerQueen.Album := 'Sheer Heart Attack';
	KillerQueen.Year := 1974;
	KillerQueen.BeatPerMinute := 117.27;

	writeln(KillerQueen.Cancion);
	writeln(KillerQueen.Artista);
	writeln(KillerQueen.Album);
	writeln(KillerQueen.Year);
	writeln(KillerQueen.BeatPerMinute);

	with Epitaph do
	begin
		Cancion := 'Epitaph.flac';	
		Artista := 'King Crimson';
		Album := 'In the court of the crimson king';
		Year := 1969;
		BeatPerMinute := 100.37;
	end;
    
	writeln(Epitaph.Cancion);
	writeln(Epitaph.Artista);
	writeln(Epitaph.Album);
	writeln(Epitaph.Year);
	writeln(Epitaph.BeatPerMinute);
	
	readln();

end.

Y bien, por ahora es todo. El código lo puedes copiar para probarlo. Antes de terminar, hay que aclarar algo, si bien en español, se puede leer "Record" cómo registro, no hay que confundirlo con "Register" que es una cosa completamente diferente (que eventualmente veremos).

Los leo luego.

Learning machine #17 - Programando en Pascal - Arreglos, arreglos dinámicos y arreglos multidimensionales.

 Hola de nuevo a todos, el dia de hoy vamos a continuar con un poco mas de programación en Pascal. EN alguno de los post anteriores, vimos cómo usar arreglos, arreglos de punteros,  pero nos falto ver cómo usar arreglos dinámicos y arreglos de dimensiones múltiples. Si bien ya los usamos en los arreglos de punteros, no hemos visto aun cómo son la reglas para usarlos.


Arreglos de una sola dimensión.

A manera de repaso veamos cómo es que se crea un arreglo de una sola dimensión en Pascal. En Pascal, para poder crear un arreglo, se debe de hacer lo siguiente.
type
	MiArr = array [0..9] of integer;
var
    Lista : MiArr;
Primero, debemos de crear un nuevo tipo, en el ejemplo anterior es "MiArr", seguido de la palabra reservada "array[]", dentro de los corchetes, se debe de establecer el rango para los valores de los índices. Normalmente se establece de cero a n pero se pueden crear arreglos que no sean de base cero (que no empiece el primer índice en cero). Incluso para valores que NO sean del tipo "real", se pueden usar valores negativos. Después de los corchetes debe de ir la palabra reservada "of" y finalmente el tipo del que serán los elementos contenidos en el arreglo.

Para inicializar los valores del arreglo, simplemente se les asigna un valor (normalmente usando un "for") y para poder usar los valores, bastara con llamar a la variable seguida de un corchete dentro del cual ira el valor del índice que queremos leer. Para ver con más claridad, retomemos un ejemplo que ya habíamos visto.
program Arreglos;

type
ArregloDeNumeros = array[0..99] of integer;

var
MisNumeros : ArregloDeNumeros;
i : integer;

begin

    for i := 0 to 99 do
    begin 
        MisNumeros[i] := i * 2;
    end;
    
    for i := 1 to 99 do
    begin 
        writeln(MisNumeros[i]);
    end;
    
end.
Cómo podrás ver, para asignar valores a todos los elementos del arreglo, simplemente usamos un ciclo "for" y para leer los valores usamos otro, pero si queremos leer solo uno en particular, solo bastaría con algo cómo "MisNúmeros[3]" que serviría para retornar el valor del elemento con índice tres.

Arreglos multidimensionales.

Para declarar un arreglo de dimensión múltiple, se sigue mas o menos los pasos anteriores, es decir: creamos un tipo, asignamos a una variable el nuevo tipo  y lo usamos. Pero el cambio viene al momento de definir el tamaño del arreglo. Primero veamos el siguiente ejemplo.

type
	MiArr = array [0..9 , 0..9] of integer;
var
    Lista : MiArr;

Cömo podrás observar, simplemente se definen las dimensiones de cada uno de los arreglos, por lo que en ejemplo anterior, habremos creado un arreglo de dos dimensiones con un tamaño de 10x10. Para agregar una dimensión mas, bastará con agregar otra coma seguida del rango.

Ahora miremos el siguiente ejemplo:
program ArreglosMulti;

type
ArregloDeNumeros = array[0..9 , 0..9] of integer;

var
MisNumeros : ArregloDeNumeros;
i , j : integer;

begin

    for i := 0 to 9 do
    begin 
    for j := 0 to 9 do
        MisNumeros[i,j] := i + j * 2;
    end;
    
    for i := 1 to 9 do
    begin 
        for j := 0 to 9 do
        write(' ',MisNumeros[i,j]);
        writeln();
    end;
	
end.
Si miramos bien ahora los arreglos se accesan mediante un sistema coordenado. para acceder al tercer elemento de la segunda fila, bastaría con tener algo cómo "MisNumeros[2,3]". Finalmente y de manera meramente ilustrativa, veamos el ejemplo de un array de 10x10x10 elementos.
program ArreglosMulti;

type
ArregloDeNumeros = array[0..9 , 0..9, 0..9] of integer;

var
MisNumeros : ArregloDeNumeros;
i , j , k : integer;

begin

    for i := 0 to 9 do
    begin 
        for j := 0 to 9 do
        begin
            for k := 0 to 9 do
                MisNumeros[i , j , k] := i + j + k * 2;
        end;
    end;
    
    for i := 1 to 9 do
    begin 
        for j := 0 to 9 do
        begin
            for k := 0 to 9 do
            write(' ',MisNumeros[i,j,k]);
            
        writeln();
        end;
        writeln();
    end;

end.
Y de manera similar, para acceder a un elemento seria "MisNumeros[1,2,3]".
Al momento de crear arreglos de varias dimensiones, no es necesario que estos sean "cuadrados", en los ejemplos, son arreglos de 10x10, pero pueden ser de valores diferentes cómo de 3x4x10 y para definir su tamaño solamente debemos de establecerlos al momento de crear el tipo "array[0..3,0..4,0..10]", solamente debemos de tener cuidado a la hora de acceder a los valores y que el indice al que queremos acceder, este dentro del intervalo.

Arreglos dinámicos.

Los arreglos dinámicos se distinguen de los otros por no tener un tamaño fijo y que a la hora de inicializarlos, tienen tamaño cero. Son especialmente útiles a la hora de ejecución, ya que nos permite cambiar el tamaño del arreglo en función a lo que el programa requiera y así en lugar de crear un arreglo de longitud 1000 para cubrir todas las posibles necesidades, solamente se crean los necesarios a cómo se vaya necesitando.

Para crear un arreglo dinámico, se siguen los mismo pasos que antes, es decir; se crea un tipo  nuevo y cuando le indicamos que va  a ser un arreglo no establecemos la longitud. Para apreciar mejor cómo se hace, veamos el siguiente ejemplo:
program ArreglosDina;

type
ArregloDeNumeros = array of integer;

var
MisNumeros : ArregloDeNumeros;
i , Items : integer;

begin

    Items := 10;
    setlength(MisNumeros , Items);
    
    for i := 0 to (Items - 1) do
            MisNumeros[i] := i * 2;

    for i := 0 to (Items - 1) do
            writeln(' ',MisNumeros[i]);

end.
Cómo podrás ver, al momento de crear el tipo "ArregloDeNumeros" seguido de la palabra reservada array, no se establece el tamaño pero simplemente se establece el tipo. Para ajustar el tamaño del arreglo, antes de usarlo, debemos de usar la función "setlength()". La función "setlength()".recibe dos o mas parámetros, el primero es el nombre de la variable del cual va a ajustar el tamaño, en el ejemplo anterior fue "MisNumeros", seguido del tamaño a asignar (que en el ejemplo fue la variable "Items" con un valor de 10). Para acceder al valor de cada elemento se hace igual que con los arreglos tradicionales.

Y bien, por ahora es todo. Aun quedan muchas cosas pendientes en el lenguaje Pascal, pero creo que solo un post mas dedicado a los arreglos estará bien (antes de olvidarme de la serie "programando en Pascal" por dos años). Cómo de costumbre puedes copiar y pegar los códigos para probarlos.

Los leo luego.


Learning machine #16 - Programando en Pascal - Arreglos de punteros.

 Hola de nuevo a todos, el día de hoy vamos a continuar con más aprendizaje del lenguaje de programación Pascal.


En el post anterior vimos cómo es posible crear arreglos y usar punteros, pero en el programa del triangulo de Pascal, fue cuando mucha gente prguntó cómo es que funcionaba. Hay que recordar que cuando usamos punteros, el código debe de ser bien manejado si no, pueden ocurrir cosas malas.


Para poder crear un arreglo de punteros, primero debemos de crear un par de tipos, el primero debe de ser una nuevo tipo del tipo "array of algo" donde "algo" es alguno de los tipos soportados por Pascal. Seguido debemos de crear un nuevo tipo que va a ser un puntero del tipo que acabamos de crear. Para ilustrar un poco mejor, retomemos parte del código del triangulo de Pascal.


type
    Values = array of integer;
    PValues = ^Values;

En la declaración de los tipos, creamos primero el tipo "Values" que a su vez es del tipo "array of integer", una vez creado, solo queda crear un nuevo tipo que será un puntero al tipo que acabamos de crear, en este caso es "PValues" que es un puntero de "^Values".

Para poder utilizar los punteros hay que inicializarlos y para eso, hay que hacer la declaración de una variable que sea del tipo que creamos al ultimo, es decir al puntero "PValues" (en el área de las variables) y después cuando vayamos a usar la variable, debemos de inicializarla de forma explicita haciendo uso de la función "new()". Finalmente hay que establecer el tamaño que tendrá el arreglo haciendo uso de la función "setlength()". Para poder apreciar un poco más, de nueva cuenta tomemos el código del triangulo de Pascal y revisemos la función "CalculateLevel()".

function CalculateLevel (Level : integer) : PValues;
var
    i : integer;
    Result1 : PValues;
    PResult : PValues;

begin
    
    new(Result1);
    Setlength(Result1^, Level);
    
    
    if (Level = 1) then
    begin
        Result1^[1] := 1;
    end;

    if (Level = 2) then
    begin
        Result1^[1] := 1;
        Result1^[2] := 1;
    end;
	
    if (Level > 2) then
    begin
        PResult := CalculateLevel(Level - 1);
        for i := 1 to Level do
        begin
            if (i = 1) or (i = Level) then
            begin
                Result1^[i] := 1;
            end
            else
            begin
                Result1^[i] := PResult^[i] + PResult^[i - 1];
            end;
        end;
    end;
	
    exit(Result1);
	
end;
Para poder usar los valores dentro del arreglo, bastará con usar el nombre de la variable que se el arreglo, seguido de "^" y a su vez seguido del número del índice entre corchetes, en el código anterior, cuando queremos asignar el valor de uno al elemento uno, tenemos "Result1^[1] := 1;".

Un ejemplo pero ahora usando el tipo string.

program ArregloDePunteros;
    type
        Nombres = Array of string;
        PointToNombres = ^Nombres;
    var
        ListaDeNombres : PointToNombres;
        i : integer;
begin
    New(ListaDeNombres);
    Setlength(ListaDeNombres^ , 4);

    ListaDeNombres^[1] := 'RMFP';
    ListaDeNombres^[2] := 'RSC';
    ListaDeNombres^[3] := 'USG';
    ListaDeNombres^[4] := 'SCL';

    for i := 1 to 4 do
        writeln (ListaDeNombres^[i]);
        
end.

Cómo podrás observar, el procedimiento es exactamente el mismo. Primero creamos los tipos "Nombres"; que es del tipo "Array Of String", y seguido creamos el tipo "PointToNombres" que es un puntero a "Nombres". Después creamos una variable llamada "ListaDeNombres" que será del tipo "PointToNombres", luego la inicializamos usando "New()" y establecemos el tamaño usando "Setlength()". Finalmente para acceder a los valores, usamos la variable "ListaDeNombres^".




Y bien, por ahora es todo, en el siguiente post veremos mas a detalle los arreglos. Cómo de costumbre, puedes usar el compilador online para probar el código.

Los leo luego.

Learning machine #15 - Programando en Pascal - Tipos, Punteros y arreglos.

 Hola de nuevo a todos, el día de hoy vamos a continuar con un poco mas del lenguaje de programacion Pascal.


Hace algunos días hice un programa que sirve para calcular el triangulo de Pascal. La versión en C, Python y Pascal están disponibles para su consulta, pero a partir de ellos, se generaron dudas y si bien en el caso de Python y C siempre he dicho que en el blog no hay tutoriales para aprender a programar, en el caso de Pascal no es así. En el caso de C y Pascal se hacen uso de punteros y si bien la forma de declararlos en cada uno es diferente, la forma de uso es esencialmente la misma, por eso este post sirve para poder entender cómo es que se utilizan los punteros en Pascal, pero la idea para C es la misma (en el caso de los punteros). Para poder entender cómo se usan los tipos también es necesario saber sobre los tipos (solo en el caso de Pascal)


Tipos.

En pascal es simple declarar tipos. Para hacerlo, debemos de hacer uso de la palabra reservada "Type"
Tomemos cómo ejemplo el código que sigue.

program Tipos;
type
    Colores = string;
    DiasDeLaSemana = string;
    Numeros = integer;
    
var
    MiColor : Colores;
    Hoy : DiasDeLaSemana;
    Fecha : Numeros;
    
begin

    MiColor := 'Verde';
    Hoy := 'Sabado';
    Fecha := 24;

    writeln (MiColor);
    writeln (Hoy);
    writeln (Fecha);

end.

Con lo anterior, habremos creado tres nuevos tipos, el tipo "Colores", el tipo "DiasDeLaSemana" y el tipo "Numeros", a su vez cada uno hereda del tipo "string", "string" e "integer" respectivamente. Para poder usar cada nuevo tipo creado, simplemente creamos variables y les asignamos el tipo que acabamos de crear, en el caso del ejemplo anterior tenemos: "MiColor", "Hoy" y "Fecha" cada una de los tipos que acabamos de declarar.

A simple vista no parece tener mucho chiste, ¿por qué no usar "MiColor" directamente con el tipo "string" o "Fecha" con el tipo "integer"?, la respuesta es simple, el poder declarar tipos "propios" nos da la posibilidad de manejar nuestro código mejor, pero no solo eso, algunas variables cómo los registros "record" son mas fáciles de manejar así, pero además es un requisito necesario para poder trabajar con arreglos de punteros.

Punteros.

En ciencias de la computación, un puntero es un objeto del lenguaje de programación, cuyo valor se refiere a (o "apunta a") otro valor almacenado en otra parte de la memoria del ordenador utilizando su dirección. Un puntero referencia a una ubicación en memoria, y a la obtención del valor almacenado en esa ubicación se la conoce como desreferenciación del puntero. A modo de analogía, un número de página en el índice de un libro podría considerarse un puntero a la página correspondiente; desreferenciar un puntero sería como ir a la página con el número de página especificada en el índice wikipedia/Punteros


En pascal, primero debemos de crear un tipo, este a su vez será un puntero de cualquiera de los admitidos por Pascal precedido por "^". Si queremos declarar un puntero hacia un valor "integer", debemos de hacer una declaración cómo la que sigue:

type
    PointToInt = ^integer;
Con eso habremos creado un nuevo tipo llamado "PointToInt" que es un puntero hacia el tipo "integer", al igual que cualquier tipo que hayamos creado, para usarlo, simplemente debemos de crear una nueva variable del tipo "PointToInt" (en este caso)

program Pointers;
type
    PointToInt = ^integer;
var
    MiNumero : PointToInt;
begin
    new(MiNumero);
    MiNumero^ := 20;
    writeln (MiNumero^);
    Dispose(MiNumero);
end.

Para poder utilizar la variable, además de declarar la  variable con el nuevo tipo, debemos de inicializarla (reservar memoria), esto lo logramos con el procedimiento "new()" que recibe cómo parámetro la variable que queremos usar. Una vez que se inicializo, para poder acceder a los valores, debemos de escribir el nombre de la variable seguido por "^". Cuando terminamos de usar cualquier variable creada de esta forma, debemos de liberar la memoria que usamos (dependiendo del sistema operativo, en la mayoría de los casos cuando cerramos el programa, se liberan en automático los recursos, pero siempre es una buena idea hacerlo por nuestra cuenta) para poder hacerlo, hacemos uso del procedimiento "dispose()" que recibe cómo parámetro el nombre de la función.

Algunos dirán que no es necesario crear un tipo para cada puntero, pero creo que más sencillo hacerlo, así si queremos crear más punteros bastará con mandar a llamar al tipo.

Arreglos.

Los arreglos son colecciones de variables del mismo tipo, se pueden crear de cualquier tipo soportado por Pascal. Al igual que los punteros, se pueden declarar definiendo un tipo. Para hacerlo, debemos de hacerlo declarando al tipo como "array[] of algo", Dentro de los corchetes, debemos de introducir el rango en el cual el arreglo desde índice mas bajo, seguido de ".." y finalmente el índice mas alto, para el tipo "algo", puede ser cualquiera de los que soporta Pascal. Un ejemplo de una declaración de un arreglo es el siguiente:

type
ArregloDeNumeros = array[0..99] of integer;
Con lo anterior habremos creado un nuevo tipo llamado "ArregloDeNumeros", que posee 100 espacios desde 0 hasta 99 y cada uno de ellos será del tipo "integer". Para poder utilizar el arreglo, bastará con crear una variable y asignarle el tipo que recién acabamos de crear. Para inicializar el arreglo, bastará con asignarle valores a cada elemento. La forma más sencilla de hacerlo es mediante un ciclo "for" con el siguiente código:

program Arreglos;

type
ArregloDeNumeros = array[0..99] of integer;

var
MisNumeros : ArregloDeNumeros;
i : integer;

begin

    for i := 1 to 99 do
    begin 
        MisNumeros[i] := i * 2;
    end;
    
    for i := 1 to 99 do
    begin 
        writeln(MisNumeros[i]);
    end;
    
end.

Ahora un ejemplo con arreglos del tipo "string":

program Arreglos;
uses
	sysutils;
type
	ArregloDeNumeros = array[0..99] of integer;
	ArregloDePalabras = array[0..99] of string;
var
	MisPalabras : ArregloDePalabras;
	MisNumeros : ArregloDeNumeros;
	i : integer;
begin
	for i := 0 to 99 do
	begin 
		MisNumeros[i] := i * 2;
		MisPalabras[i] := concat('EL valor de i es ', IntToStr(i));
	end;
	for i := 0 to 99 do
	begin 

	end;
end.

Para acceder a cada valor dentro del arreglo; una vez que ya ha sido inicializado, simplemente escribimos el nombre de la variable, seguido de corchetes ([]) y dentro de estos escribiremos el valor del elemento, en este caso si po ejemplo queremos saber el valor del elemento con índice 90 tendríamos

		writeln(MisNumeros[90]);
		writeln(MisPalabras[90]);

Y bien, por ahora es todo, pero aun queda pendiente una parte importante que hace que el programa del triangulo de pascal funcione y para eso necesitamos saber de arreglos dinámicos en este post solamente vimos como usar los estáticos, pero además necesitamos saber cómo funciona u arreglo de punteros, pero eso será en el siguiente post. Recuerda que puedes probar los códigos en el compilador online.

Los leo luego.

Vamos a programar #93 - El triangulo de pascal (ver. Pascal)

 Hola de nuevo el día de hoy vamos a continuar con mas del triangulo de Pascal, pero esta vez en el lenguaje de programación pascal.



Para entender un poco sobre el triangulo de pascal, recuerda que en el post "Vamos a programar #91" podemos encontrar cómo se calcula a mano y el código en Python. Ahora veamos el código en Pascal que sirve para calcular el triangulo de Pascal.





Lo primero que hacemos es declarar variables globales. Seguido. creamos dos tipos, el tipo "Values" que a su vez es del tipo "array of integer" y el segundo tipo llamado "PValues" que es un puntero a "Values" (en el siguiente post detallaremos algunas cosas sobre los tipo y los punteros).

Después creamos dos funciones. La primera función es "CalculateLevel" y cómo su nombre sugiere sirve para calcular los valores del nivel actual, recibe un parametro del tipo "integer" que sirve para indicar el numero de nivel a calcular, esta regresa un valor del tipo "PValues"

La siguiente función es "DrawPascalTriangle" que cómo su nombre lo indica sirve para dibujar el triangulo. Recibe un parámetro del tipo "integer" que sirve para indicar el numero de niveles que el triangulo tendrá. Para hacerlo, simplemente recorre de uno al número de niveles y a su vez por cada nivel, recorrerá todos los valores que el resultado de "CalculateLevel" contenga.

SI habrás notado, el código en C y el código en Pascal son bastante diferentes al de Python; esto se debe a un par de razones. La primera de ellas es que el código en Python está administrado por el propio interprete, en el caso de C y Pascal; en estos ejemplos, no es así ya que usamos punteros.

Y bien por ahora es todo, cómo de costumbre, puedes descargar el código de mi dropbox para que lo pruebes o en el código hay un botón de ejecutar que te llevará a la versión en línea (donde se puede ejecutar). Pero antes debo de hacer énfasis en cómo es que pascal maneja el tipo "integer". Por default cuando compilamos código, se usaran 16 bits para los enteros, cómo estos tienen signo, los valores permitidos estarán en el rango de -32,768 a 32,767 (por eso está limitado a 18 niveles en el compilador online). Podemos cambiar las directivas para que se usen 32 bits, pero eso será en otro post. Por ahora recomiendo la versión en línea.

Los leo luego.

Vamos a programar #92 - El triangulo de Pascal (ver. C)

 Hola de nuevo a todos, el día de hoy vamos a ver cómo hacer un programa en C que calcule el triangulo de Pascal.


Cómo podrás recordar, hace unos día publiqué una version en Python; y tal cómo lo prometí justo antes de acabar el 2020, les traigo la versión en C. Cómo la explicación de que es el triangulo de Pascal se incluye en ese post (además de cómo hacer los cálculos a mano), simplemente pasaremos al código fuente. Al igual que el código en Python, vamos a calcular el triangulo de Pascal de manera recursiva y si surgen dudas las resolveremos en los próximos post

El código en C que sirve para calcular el triangulo de Pascal es el siguiente ():


// Prueba del triangulo de pascal en C

#include <stdio.h>
#include <stdlib.h>

int *CalculateLevel(int Level)
{
    int *Result;
    Result  = (int *)malloc(Level * sizeof(int));
        
    if (Level == 0)
         *Result = 1;
    if (Level == 1)
    {
        *Result = 1;
        *(Result + 1) = 1;
    }
    if (Level > 1)
    {
        int *ResultP = CalculateLevel(Level - 1);
        for (int i = 0; i < Level; i++)
        {
            if (i == 0 || i == Level - 1)
                *(Result + i) = 1;
            else
                *(Result + i) = *(ResultP + i) + *(ResultP + i - 1);
        }
    }
    return(Result);
    
}

void DrawPascalTriangle(int Number)
{

    if (Number > 20)
    {
        printf("Solo se admiten 20 niveles");
    }
    else
    {
        for (int i = 0; i < (Number + 1); i++)
        {
            int *Result = CalculateLevel(i);
            for (int j = 0; j < i; j++)
            {
                printf( " %5d ", *(Result + j));
            }
        printf("\n");
        }

    }
}


int main()
{
    int Levels;
    printf("Numero de niveles\n");
    scanf("%d", &Levels);
    DrawPascalTriangle(Levels);

    return 0;
}



Y bien, cómo podrás notar, resulta un poco sencillo portar programas de un lenguaje a otro, si tienes dudas de cómo funciona el programa puedes escribir aquí o en mi twitter. Cómo de costumbre puedes descargar el código fuente de mi Dropbox para que lo pruebes, pero ademas puedes verlo funcionar en linea gracias a los compiladores web.

Los leo luego.

Vamos a programar #91 - EL triangulo de Pascal (ver. Python)

 Hola de nuevo a todos, el día de hoy vamos a ver cómo hacer el triangulo de pascal usando Python.




Hace unos días mientras leía los comentarios, alguien sugirió que hiciera un programa que calculara el triangulo de pascal y ya que ando un poco corto de ideas, decidí hacerlo. Pero antes de continuar, veamos que es el triangulo de pascal.

En las matemáticas, el triángulo de Pascal es una representación de los coeficientes binomiales ordenados en forma de triángulo. Es llamado así en honor al filósofo y matemático francés Blaise Pascal, quien introdujo esta notación en 1654, en su Traité du triangle arithmétique.1​ Si bien las propiedades y aplicaciones del triángulo fueron conocidas con anterioridad al tratado de Pascal por matemáticos indios, chinos, persas, alemanes e italianos, fue Pascal quien desarrolló muchas de sus aplicaciones y el primero en organizar la información de manera conjunta.2​


El triángulo de Pascal se puede generalizar a dimensiones mayores. La versión de tres dimensiones se llama pirámide de Pascal o tetraedro de Pascal, mientras que las versiones más generales son llamadas simplex de Pascal.

Wikipedia/Triangulo De Pascal

 La composición del triangulo de pascal es realmente simple, en la cima del triangulo, siempre ubicaremos un uno, de hecho en todas las orillas pondremos un uno de modo que en cada nivel haya tantos número cómo el nivel en el que estamos. Para el nivel dos, ya que solo hay extremos en ambos se pondrá un uno.

Para calcular los números del tercer nivel, imaginemos que tenemos tres lugares, los extremos deben de llevar el número uno, por lo que solo nos hace falta determinar el que esta en el lugar dos. Para hacerlo de manera "sencilla" debemos de revisar el nivel anterior y debemos de sumar el numero que esta en la misma posición que el numero que queremos saber (DEL NIVEL ANTERIOR), y sumarlo con el que inmediatamente antes. Para darnos una idea, miremos la siguiente imagen.


Si revisamos bien, nos ubicamos en el nivel tres, pero el numero que queremos saber es el que esta en el segundo lugar del tercer nivel (marcado con una X), entonces tenemos que tomar el numero del nivel anterior que esta en las misma posición que nuestro numero, en la imagen podemos apreciar que el número que esta en la segunda posición del nivel dos es uno y el numero que esta antes en el nivel dos, también es uno, por lo que tendríamos que el segundo numero del tercer nivel es igual a uno mas uno, por lo tanto su valor es dos.


Ahora a manera de ejemplo calculemos el valor de los números en el nivel 4, para eso imaginemos que tenemos algo cómo la imagen que sigue.


Solo tendríamos que determinar X y Y. Para X ya que está en la posición dos del cuarto nivel, tomaríamos los números en la posición dos y uno del tercer nivel y tendríamos cómo resultado 3




Para calcular el numero Y, simplemente hacemos lo mismo. Tomamos el tercer y segundo número del nivel tres y simplemente lo sumamos obteniendo otro tres.


Así podemos calcular cualquier nivel.


Entonces en python podemos crear código cómo el que sigue:


# Prueba del triangulo de pascal en python
def CalculateLevel(Level):
    Result = {}
    if Level == 1:
        Result[0] = 1
    if Level == 2:
        Result[0] = 1
        Result[1] = 1
    if Level > 2:
        ResultP = CalculateLevel(Level - 1)
        for i in range(Level):
            if (i == 0) or (i == Level - 1):
                Result[i] = 1
            else:
                Result[i] = ResultP[i - 1] + ResultP[i]
    return Result
 
def DrawPascalTriangle(Number):
    if Number > 20:
        print("Solo se admiten 20 Niveles")
    else:
        for i in range(Number + 1):
            Result = CalculateLevel(i)
            for j in range(len(Result)):
                print(Result[j], end = '  ')
            print()
    


if __name__ == "__main__":
    import sys
    DrawPascalTriangle(int(sys.argv[1]));


El código consta de dos funciones, la primera de ellas es "CalculateLevel(Level)" y cómo su nombre lo sugiere, calcula los valores para el nivel actual, recibe un parámetro numérico que indica cual es el nivel que queremos calcular. En el algoritmo anterior, vimos que cuando el triangulo consta de un nivel, el valor es uno por lo que creamos una condición y si el nivel solicitado es uno, en un arreglo agregamos un valor de uno. Si la variable "Level" es dos, hacemos lo mismo, solo que agregamos otro valor de uno. Para cuando el valor es mayor que dos, lo primero que hacemos es llamar de forma recursiva a "CalculateLevel" pero usando cómo parámetro el valor de "Level" menos uno así obtenemos el nivel anterior, después hacemos un iterador para recorrer todos las posiciones del nivel y dentro de el primero hacemos una comparación y si el valor del iterador corresponde al primer o al ultimo elemento le asignamos el valor de uno, en caso contrario hacemos los calculo usando el valor del iterador para asignar el valor a la posición actual usando los valores del nivel anterior (cómo explicamos antes). Finalmente devolvemos el valor de la variable "Result" que es donde almacenamos los valores

Después creamos la función "DrawPascalTriangle(Number)" que sirve para "dibujar" el triangulo, ya que la consola suele ser pequeña, si el parámetro "Number" es mayor a 20 escribimos un mensaje diciendo que solo se admiten 20 niveles en caso contrario, hacemos dos iteradores, uno que va a recorrer de uno hasta el nivel dado y a su vez calculará cada nivel y el otro que imprimirá en pantalla todos los valores en cada nivel.

Cómo podrás ver el código es realmente sencillo, para usarlo, simplemente debes de ejecutarlo desde la consola pasando cómo parámetro el valor del nivel hasta el cual quieres calcular
pascaltri.py 20
Y bien por ahora es todo, cómo de costumbre puedes descargar el código de mi dropbox para que lo pruebes antes de que acabe el año voy a publicar las versiones en pascal, en c y probablemente en C# o Javascript.

Los leo luego.

Vamos a programar #80 - La conjetura de Collatz (Ver. Pascal).

Hola de nuevo a todos, el día de hoy vamos a continuar con re-fritos de viejos programas, pero ahora en lenguajes que no habíamos usado. En esta ocasión vamos continuar con la prueba de la conjetura de Collatz pero en el lenguaje de programación pascal.



Antes de continuar, es importante mencionar la importancia de saber crear un programa en un lenguaje distinto al que estamos acostumbrados usando los fundamentos del lenguaje, en este caso, deberías de ser capas de crear este programa leyendo los post de aprendizaje que hice para pascal (Para el resto de lenguajes no hay pero recuerda que mi objetivo no es enseñarte a programar). Y bien ahora continuemos con el código.

El código en Pascal que hace funcionar las cosas es el siguiente:

program Collatz (output);
uses crt, sysutils;
var MyVal: integer;
function IsEven (Number:integer): boolean;
begin
	if Number mod 2 = 1 then
		exit (false)
	else
		exit (true);
end;

procedure CalculateCollatz (Number:integer);
begin
	while Number > 1 do
	begin
		if IsEven (Number) = false then
		begin
			Number:= Number * 3 + 1;
			writeln (Number);
		end
		else
		begin
			Number:= Number div 2;
			writeln (Number);
		end;
	end;
end;

begin
	writeln('Inserta un numero');
	readln(MyVal);
	CalculateCollatz(MyVal);
	readln();
end.

Cómo podrás ver, el programa consta de dos funciones, la primera de ellas en orden de aparición es "IsEven()" y recibe un parámetro del tipo "integer" y sirve para determinar si el número que se paso cómo argumento es par o no; si el valor es par, la funcion devuleve "true", en caso contrario devuelve "false".

La siguiente función es "CalculateCollatz" aquí es donde se hace el calculo (siguiendo las reglas de la conjetura). Si revisaste alguno de los post de aprendizaje para Pascal, pero mas específicamente el post "Learning Machine #5", verás que hacemos uso de "if" y hace poco tiempo alguien me pregunto: "¿Que pasa si tengo más de una línea de código después de mi if?". Y pido una disculpa ya que en su momento lo olvide por completo pero si cambia un poco el uso de "if" si es de una línea o no. Cuando usamos la instrucción "if" si es de múltiples lineas, se deberá de hacer uso de la palabra reservada "begin" seguida de todo el código que se requiera ejecutar en la condición y se termina con "end;" si se usan instrucciones "else" (de igual manera que con if), cada una deberá de ir con su respectivo inicio y final, pero solo la última deberá tener punto y coma.

Y bien, por ahora es todo, cómo de costumbre puedes bajar el código de mi dropbox para que lo pruebes, pero además, puedes probarlo en linea por si no quieres instalar el compilador. En el siguiente post continuaremos con mas programación y con mas refritos hasta que se me ocurra algo bueno.

Los leo luego.

Learning Machine #11 - Programando en Pascal - Ciclos for y repeat.

Hola de nuevo a todos, el dia de hoy vamos a continuar con la serie "learning machine" para el lenguaje de programación Pascal. Anteriormente vimos algunas de las partes mas importanes del lenguaje, pero por alguna razon las parte número 9 no la publique o no lo hice bien. El punto es que vamos a ver una parte importante. Cómo usar los ciclos.

Muchas veces debemos hacer operaciones que requieren ser repetidas N número de veces, anteriormente vimos que podemos hacer que algumos procesos se repitan haciendo uso de while, pero que pasa si lo que queremos  hacer, ya lo tenemos bien definido, bien, para eso existe el ciclo for.

Ciclo for.

El ciclo for sirve para hacer N veces determinada tarea, en pascal la forma más básica de si uso es la siguiente:

{ ... }
{ ... }
	for {Desde} to {hasta} do
	begin
		{ haz algo }
	end;
{...}
{...}

Para hacer uso del ciclo, debemos de hacer uso de la palabra reservada "for" seguida del número desde cual se va empezar a contar, se debe de usar una variable que es la que usaremos a manera de contador. Seguido viene la palabra reservada "to" y despues viene lo que será el "tope" del ciclo, una vez indicado esto viene la palabra reservada "do" y dependiendo de cuanto código vamos a usar, podemos hacer uso de "begin" (para inidicar el inicio), todo el código contenido entre éste y su respectivo "end;", será lo que se ejecutará hasta que el contador llegue al limite indicado.

Ahora imaginemos que queremos hacer un programa que cuente del 1 al 100 y que además escriba "este mensaje se ha escrito N veces" en la consola. tomando en cuenta lo anterior, podemos hacer código cómo el siguiente:

Program Ciclofor;
uses crt, sysutils;
var
Contador : integer;
begin
	for Contador := 1 to 100 do
	begin
		writeln(concat('Este mensaje se ha escrito ', IntToStr(Contador) ,' veces usando for'));
	end;
	readln();
end.


Repeat until.

El bucle Repeat until, es muy similar al bucle while, es decir el ciclo se repetirá hasta que cierta condicion se cumpla.

Para hacerlo, primero debemos de hacer uso de la palabra reservada "repeat", luego escribiremos todo el código que se va a ejecutar y finalmente, pondremos la palabra reservada "until" y la condición que se debe de cumplir.

En la forma más simple, el bucle repeat tendrá la siguiente forma:

{ ... }
{ ... }
	repeat
		{ haz algo }
		{ haz algo }
		{ haz algo }		
		{ haz algo }
	until ({condicion});
{...}
{...}


Para tener una mejor idea de cómo se usa, vamos a hacer el mismo programa que usamos cómo ejemplo en el ciclo "for" solo que ahora lo adaptaremos a "repeat".
Program RepeatUntil;
uses crt, sysutils;
var
Contador : integer;
begin
	Contador := 100;
	repeat
		writeln(concat('Este mensaje se ha escrito ', IntToStr(Contador) ,' veces usando until'));
		Contador := Contador + 1;
	until (Contador > 100);
	readln();
end.

Algo importante que hay que resaltar, es que "repeat" a diferencia de "while", ejecutará al menos una vez el código dentro del bloque, esto debido a que la expresion se evalua hasta el final, cosa contraria a "while". Si quieres probar esto, puedes asignarle el valor de 100 a la variable "Contador" justo antes de "Repeat", la condicion ya se cumple, porque por obvio que parezca, 100 es mayor que 99.

Y bien, por ahora es todo, en post futuros veremos más aprendizaje de pascal (incluso la primer imagen te puede dar una idea de lo que viene). Puedes copiar los códigos anteriores para probarlos.

Los leo luego.

Learning Machine #8 - Programando en Pascal - Funciones y procedimientos.

Hola de nuevo a todos, el día de hoy vamos a continuar con el aprendizaje de Pascal. El tema de hoy corresponde a procedimientos y funciones.


Las funciones y procedimientos, son bloques de código que están separados del código que se ejecuta en la parte principal, además se distinguen porque estos se pueden ejecutar tantas veces mientras se les "llame", cuando lo hacemos, todo el código contenido en estos se ejecutará y al terminar, la ejecución continuará en la linea inmediata a la cual fue llamada la función/procedimiento.

Procedimientos.

Los procedimientos, son bloques de código que se ejecutan y no devuelven ningún tipo de resultado (o no que sea utilizable).
Veamos el siguiente código:

program Procedimiento;
uses crt;
var Number1, Number2 : integer;
procedure suma(N1 : integer; N2 : integer);
var Resultado : integer;
begin
	Resultado := N1 + N2;
	writeln('El Resultado es ', Resultado);
end;
begin
	clrscr;
	writeln('Ingresa el primer numero');
	readln(Number1);
	writeln('Ingresa el segundo numero');
	readln(Number2);
	suma(Number1,Number2);
	readln();
end.


Para definir un procedimiento, debemos de hacer uso de la palabra reservada "procedure", seguida del nombre que queramos darle al procedimiento. En el caso del código anterior, al procedimiento le dimos el nombre "suma", entre paréntesis, deben de ir los parámetros que el procedimiento vaya a usar, se pueden usar tantos cómo uno desee, pero cada uno debe de  ser definido con el tipo de datos que se usen y cada parámetro debe de ir separado por ";". Para abrir un procedimiento usamos "begin" y para cerrarlo usaremos "end;". Todo el código que se encuentre en medio de las palabras reservadas de apertura y cierre, sera el que se ejecute cada vez que se llame a la función; en este caso "suma". Para hacer uso de los parámetros, solamente debemos de llamarlos. para usar variables, debemos de declararlas en seguida de la creación del procedimiento, usando la palabra reservada "var", al igual cómo lo hacemos con las variables globales.

Funciones.

Las funciones son bastante similares a los procedimientos, es decir, van a ejecutar un bloque de código cada vez que se mande a llamar. La diferencia principal con los procedimientos, es que estas, devolverán un valor que se puede usar para otras cosas. Veamos el siguiente bloque de código:

program Funciones;
uses crt;
var Number1, Number2 : integer;
function suma(N1 : integer; N2 : integer) : integer;
var Resultado : integer;
begin
	Resultado := N1 + N2;
	{ suma:=Resultado; }
	exit(Resultado);
end;
begin
	clrscr;
	writeln('Ingresa el primer numero');
	readln(Number1);
	writeln('Ingresa el segundo numero');
	readln(Number2);
	writeln('La suma da ', suma(Number1,Number2));
	readln();
end.

Para definir una función, debemos de hacer uso de la palabra reservada "function", seguida del nombre del nombre que queramos darle a la función. Al igual que al procedimiento, en este caso le dimos el nombre de "suma", entre paréntesis deben de ir los parámetros y ademas, le debemos de dar un tipo, puede ser cualquiera de los soportados por Pascal (Boolean, integer, string, etc.).
Sabiendo que la función debe de devolver un dato que sea utilizable, debemos de ver la forma que este la regrese, para eso se hace uso de la palabra reservada "exit" y el valor que queramos regresar, deberá de ir entre paréntesis o podemos asignar el valor que queramos devolver a la función, en el caso del código anterior, es lo mismo "exit(Resultado)" que "suma:=Resultado", en ambos casos le estamos diciendo que el valor que la función regresará, será el que tenga la variable "Resultado".

Diferencias.

Al revisar el código del procedimiento y el de la función, verás que al momento de llamar al procedimiento, simplemente lo hacemos y cómo definimos en el procedimiento que escriba el resultado de sumar los parámetros, lo hará y se mostrará en pantalla, pero si no lo hacemos y queremos hacer uso del valor de la suma que se hace en el procedimiento, simplemente no podremos.
Ahora en el caso de la función, vemos que hacemos uso de ella cómo parámetro para "writeln" y está es la importancia de usar las funciones, todos los valores que estas generen se pueden usar cómo parámetros para otras funciones, para cambiar valores de variables, imaginemos que tenemos una función que hace un calculo grande y a ese valor lo queremos dividir a la mitad, simplemente definimos la función y directamente a la llamada de está dividirla.
Si quisiéramos hacer uso de un procedimiento y pasarlo cómo parámetro de un función (por ejemplo), el compilador nos marcaría un error como el de la imagen siguiente:
Si la tarea no es muy compleja se puede hacer uso de los procedimientos, en caso contrario, se recomiendan las funciones. En ambos casos, se recomienda su uso para llevar a cabo tareas que se repitan, siempre resulta más fácil llamar a una función/procedimiento en una linea que escribir diez lineas de código cada vez.

Y bien, por ahora es todo, todos los programas que se han hecho para Pascal, en breve, subire el código fuente para que lo revises.

Los leo luego.

Learning Machine #7 - Programando en Pascal - Select.

Hola a todos, el día de hoy vamos a continuar con más del aprendizaje del lenguaje de programación Pascal, continuaremos con las instrucción "Select"

Algunas veces debemos de elegir una opción entre un numero finito de ellas, cuando son reducidas o podemos predecirlas, la instrucción "select" nos servirá para llevar esa tarea.

La instrucción "select" en Pascal, tiene la siguiente forma:

	case MiRespuesta of
		Respuesta1:
		Código que se ejecuta por la respuesta1;
		Respuesta2:
		Código que se ejecuta por la respuesta2;
		else
		Código que se ejecuta si ninguna respuesta anterior se cumple;
	end;


Para cada sentencia posible, se pueden usar números o cadenas de texto, es conveniente utilizar solo un tipo, ya que a veces las conversiones de una cadena de texto por ejemplo: "7"; no se puede convertir directamente a 7, entonces si estamos esperando un valor numérico, siempre debemos de usar 7 en la sentencia.
Cada sentencia debe de ir seguida por ":" (dos puntos), cuando terminamos de escribir el código que se ejecutará, pondremos ";" para indicar que es el fin de esa parte.

Supongamos que queremos crear un programa que pase un número a su correspondiente día de la semana de la siguiente forma:


  • 1 -> Domingo.
  • 2 -> Lunes.
  • 3 -> Martes.
  • 4 -> Miércoles.
  • 5 -> Jueves.
  • 6 -> Viernes.
  • 7 -> Sábado.
Usando "Select", lo podemos hacer de la siguiente manera:

program Casos;
uses crt;
var MiRespuesta : integer;
begin
	writeln('ingresa un numero del 1 al 7');
	readln(MiRespuesta);
	case MiRespuesta of
		1:
		writeln('El dia 1 corresponde al domingo');
		2:
		writeln('El dia 2 corresponde al lunes');
		3:
		writeln('El dia 3 corresponde al martes');
		4:
		writeln('El dia 4 corresponde al miercoles');
		5:
		writeln('El dia 5 corresponde al jueves');
		6:
		writeln('El dia 6 corresponde al viernes');
		7:
		writeln('El dia 7 corresponde al sabado');
		else
		writeln('Dia desconocido');
	end;
	readln;
end.

Cómo veras, esta definida una respuesta para cada día de la semana, si el usuario escribe 1, el programa mostrará que ese día corresponde al domingo, en este ejemplo, se hace uso de la conversión implícita, para empezar funciona, pero no en todos los casos se puede convertir un fragmento de texto (que parezca número) a un número.
También hacemos uso de "else", esta, se debe de usar al final de todos los casos y será utilizada cuando ninguno de los casos definidos se cumpla, en el caso del programa anterior, si el usuario introduce un valor fuera del rango 1-7, se mostrará: "Día desconocido".

Y bien, por ahora es todo, en futuros post, veremos cuando es conveniente el uso de "if" y cuando el uso de "case", el ejemplo anterior puede ser hecho usando solo "if" en lugar de "Select".

Los leo luego.

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.


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:

  • < Menor que
  • <= Menor o igual que 
  • > Mayor que
  • >= Mayor o igual que
  • = Igual que
  • <> Distinto que
Los símbolos anteriores los usaremos de la siguiente forma, supongamos que queremos comparar un numero que el usuario ingrese, y mostraremos 3 frases dependiendo de los siguientes casos:
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.

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:

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

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.



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:
TipoRangoTamańo en bytes
Byte0 .. 2551
Shortint-128 .. 1271
Smallint-32768 .. 327672
Word0 .. 655352
Integer******
Longint-2147483648 .. 21474836474
Longword0 .. 42949672954
Int64-9223372036854775808 .. 92233720368547758078
Qword0 .. 184467440737095516158
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

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):

  • 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:
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.

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.

Ciclo de vida de un programa/aplicación.

El ciclo de vida consiste basicamente de cuatro partes:

  • Analisis.
  • Diseño.
  • Pruebas.
  • Implementacion.
El analisis, cómo su nombre lo dice, consiste en buscar que es lo que qeuremos lograr y cómo hacerlo (creacion del algoritmo en resumidas cuentas). Suponiendo que qeuremos hacer una aplicacion que haga las cuatro operaciones básicas: Suma, Resta, Multiplicación y División. Lo primero que hacemos es ver que funciones tenemos disponibles para llevar a cabo las tareas antes dichas, planear cómo es que se va a interactuar con el usuario (tanto de entrada y salida) y cómo debe de lucir la aplicación (aunque en pascal son "limitadas" las opciones para interactuar con el usuario). En pocas palabras, debemos de buscar una forma de resolver el problema

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.


Un programa en pascal consiste de 5 partes:

  • Titulo del programa.
  • Declaracion de librerias.
  • Declaracion de variables.
  • Cuerpo del programa
    • Implementacion.
  • Fin del programa.
Observando la imagen, el titulo del programa es HelloWorld. La palabra reservada "Program" se usa para indicar el inicio 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.