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".
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;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.
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.
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.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;program Pointers;
type
PointToInt = ^integer;
var
MiNumero : PointToInt;
begin
new(MiNumero);
MiNumero^ := 20;
writeln (MiNumero^);
Dispose(MiNumero);
end.Arreglos.
type ArregloDeNumeros = array[0..99] of integer;
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.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.
writeln(MisNumeros[90]); writeln(MisPalabras[90]);
Learning machine #14 - WinBreadboard
Antes que nada, hay que resaltar que hay dos versiones de este programa, la primera de paga y la segunda una versión de prueba. La versión de prueba solo ofrece la capacidad de utilizar un chip a la vez, pero para nuestros fines aplica de maravilla. Si quieres la versión completa, con tristeza les anuncio que aqui no la van a encontrar y el sitio que aparece en la ayuda no está activo por lo que nuestro amigo "gugul" puede darnos una ayudadita para obtener la version completa. Recuerda que aqui no apoyamos la pirateria, pero cuando el software escasea, algo se debe de hacer.
Primero vamos a probar la compuerta lógica "AND" para poder agregarla, debemos de ir al menú "Chips">>"And Gates">>"7408 Quad 2 input"
Al hacer clic, se colocará un chip con el número 7408. El chip 7408 contiene cuatro compuertas lógicas "AND" y su diagrama funcional es el que sigue:
Para poder usarlo, debemos de conectar VCC (pin 14) a 5v y GND (pin 7) a tierra, una vez conectados los pines anteriores, el chip estará listo para usarse. Si te fijaste bien, verás que los pines 1, 2 y 3 conforman una compuerta "and".
Para hacer las conexiones bastará con hacer clic en cualquier cuadro del "protoboard" y arrastrar el cable que se crea hasta cualquier orificio disponible.
Del lado izquierdo están posicionados el control de encendido (parce un swicht con las posiciones on/off), +5 (que provee 5 volts) y GND (que es la conexion a tierra). Para hacer funcionar el chip bastaría con conectar GND del protoboard con GND del chip y VCC del chip con +5 del protoboard, pero lo recomendable es conectar el extremo inferior del protoboard a GND y el superior a +5, con esto todo el riel estaría conectado, por lo que a la hora de conectar mas chips las conexiones serían mas cortas.
Para poder alternar entre el apagado y encendido en cada entrada de la compuerta "AND", hay dos opciones. Cuando conectamos la entrada "A" a +5, le estamos dando un uno (encendido), pero si en su lugar la conectamos con GND, le estaríamos dando un cero (apagado). WinbreadBoard ofrece la posibilidad de alternar entre estos estados usando "pequeños apagadores". En la parte superior en orden de izquierda a derecha se encuentran:
- Un generador de pulsos
- Cuatro dip switches (a, b, c, d)
- Un panel para nombrar los switch (a, b, c, d)
- Ocho dip switches mas (e ~ l)
![]() |
| Conectamos EL swicth D con el pin dos del chip y el switch C con el pin uno del chip |
![]() |
| Las conexiones pueden ser iguales a las de la imagen. |
![]() |
| Ambas entradas son ceros |
![]() |
| Una de las entradas es uno |
![]() |
| Ambas entradas son uno por lo que la salida es un uno tambien. |
Y bien, por ahora es todo, puedes explorar todas las opciones que WinbreadBoard trae, pero si es recomendable usar la versión completa para poder agregar mas chips y usar todos los disponible. Nuevamente te recuerdo que no soy fan de la piratería, pero si no encuentras cómo comprar la versión completa, puedes preguntarle a "guguel" para que te asista. En el próximo post veremos cómo usar los chips reales (suponiendo que la cuarentena me deje comprarlos).
Los leo luego.
Learning Machine #13 - Expresiones regulares.
Hace algunos años publiqué un programa llamado VEncoder 2, que en su tiempo funcionó, pero poco despues se volvio obsoleto debido a que ffmpeg sufrió cambios y por lo tanto VEncoder paso a ser obsoleto.
Para solucionar eso, decidí que ya era hora de empezar a actualizarlo y tratar de hacerlo a "prueba de tiempo", pero lo haré poco a poco.
Una de las funciones que estaban planeadas desde el inicio, era la de poder escribir a mano algunos parámetros adicionales o simplemente sobre-escribir los pararmetros y sus valores. Para poder realizar ese trabajo, debemos de encontrar una forma de encontrar exactamente cada valor, es decir si queremos cambiar la resolución, debemos de encontrar la forma de saber si ya hay o no este parámetro. En c# hay varias formas de lograrlo, pero creo que la mas adecuada es mediante el uso de expresiones regulares.
Expresiones regulares
En cómputo teórico y teoría de lenguajes formales una expresión regular, también conocida como regex, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe con el patrón "H(a|ä|ae)ndel". La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Wikipedia/expresionRegular.Entonces para definir un patrón, disponemos de las siguientes:
- Clases de caracteres
- . - Cualquier carácter (menos el de nueva linea).
- \w\d\s - palabra, dígito, espacio en blanco.
- \W\D\S - NO palabra, NO dígito, No espacio en blanco.
- [abc] - cualquier letra dentro del corchete.
- [^abc] - Ninguna de las letras dentro del corchete.
- [a-g] - carácter entre "a" y "g".
- Anclas
- ^abc$ - inicio/ fin de la palabra.
- \b\B - final/NO final.
- Agrupación.
- (abc) - Agrupación.
- \1 - referencia hacia atrás.
- (?:abc) omitir grupo.
- (?=abc) busqueda hacia adelante.
- (?!abc) busqueda haci atras.
- Alternación
- a*a+a? - 0 o mas, 1 o mas, 0 o 1.
- a{5}a{2,} - Exactamente 5,2 o mas.
- a{1,3} - entre uno y tres.
- a+?a{2,}? - Buscar el menor posible.
- ab|cd - busca ab o cd.
Learning Machine #12 - Diseño de aplicaciones multi-hilo
En post anteriores hemos visto que hay tareas que requieren una tiempo de procesamiento largo; dependiendo del caso, hay situaciones en las que el usuario podrá seguir trabajando ya que no depende del resultado de la computación. En otros casos no es así, ya que se depende mucho de los datos resultantes.
Cuando nos encontramos en la primer situación, podemos informar o no que es lo que está sucediendo, pero cuando se presenta la segunda, por lo general es importante hacerlo. En alguna ocasión en un post, mostré cómo es que las barras de progreso suelen ser meros placebos ya que hay una serie de factores que afectan el tiempo en que cada calculo se hace (cuantas veces no hemos visto el famoso "Restan cero segundos" o "Progreso 100%" que dura más que todo lo anterior). Ahora pra entender un poco, veremos cada caso.
Caso uno: "no necesito los datos".
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)
{
Thread.Sleep(1500);
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();
}
private void RunWorkWithNoThread(string Number)
{
CalculateCollatz(Number);
}
public FrmMain()
{
InitializeComponent();
}
private void BtnStart_Click(object sender, EventArgs e)
{
LBResults.Items.Clear();
RunWork(TxtNumberIn.Text);
}
private void BtnStart2_Click(object sender, EventArgs e)
{
RunWorkWithNoThread(TxtNumberIn.Text);
}
}
}
Caso dos "necesito esos datos".
En alguno de los post que hemos hecho, hicimos un programa en android que se conectaba al bluetooth del Clock View (puedes ver el post), hacemos uso de dos tipos de thread, en la primera, simplemente notificábamos al usuario que se está realizando la conexión entre el dispositivo y Clock view y cuando esta se llevaba a cabo, un "thread" diferente se se ejecutaba y su función era manejar todos los datos que se transmitían desde/hacia el dispositivo y el bluetooth y mientas no se pida que la conexión se cierre (o se cierre la aplicación), este hilo seguirá corriendo en el fondo.
Y bien, por ahora es todo, el código de la conjetura de Collatz lo puedes modificar para probar el ejemplo de este post. En los siguiente post continuaremos con más programación.
Los leo luego
Learning Machine #11 - Programando en Pascal - Ciclos for y repeat.
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.
{ ... }
{ ... }
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.
{ ... }
{ ... }
repeat
{ haz algo }
{ haz algo }
{ haz algo }
{ haz algo }
until ({condicion});
{...}
{...}
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.
Learning Machine #10 - Código Bacon.
El día de hoy vamos a ver otro método de cifrado, veremos cómo encriptar una cadena de texto y cómo des-encriptarla.
Código Bacon.
El Código Bacon o clave Baconiana (en inglés Baconian cipher), es un método esteganográfico desarrollado por Francis Bacon. El mensaje estaría oculto en la presentación del texto, más que en su contenido.El código Bacon consiste prácticamente en ocultar un mensaje dentro de otro, de la manera que el primero pase de forma desapercibida dentro del segundo, este, debe de ser un mensaje legible y coherente para no llamar la atención.
De acuerdo a Sir Francis Bacon, existen tres propiedades que debe de tener un cifrado
1) Debe de ser fácil de escribir y de leer
2) Que debe de ser confiable y que no pueda ser descifrado
3) Si es posible libre de sospecha.
Debido a que si un mensaje llegara a caer en manos incorrectas, este no pueda ser descifrado a pesar que sea examinado por expertos.1
Esta última condición hace que el código Bacon suponga un híbrido entre los sistemas criptográficos y los esteganográficos compartiendo características de ambos. "Wikipedia/CodigoBacon"
¿Cómo cifrar?
- a - AAAAA
- b - AAAAB
- c - AAABA
- d - AAABB
- e - AABAA
- f - AABAB
- g - AABBA
- h - AABBB
- i-j - ABAAA
- k - ABAAB
- l - ABABA
- m - ABABB
- n - ABBAA
- o - ABBAB
- p - ABBBA
- q - ABBBB
- r - BAAAA
- s - BAAAB
- t - BAABA
- u-v - BAABB
- w - BABAA
- x - BABAB
- y - BABBA
- z - BABBB
XWorks Blog.
- Mensaje precifrado
- BABABBABAAABBABBAAAAABAABBAAABAAAABABABAABBABAABBA
- Mensaje para ocultar el pre-cifrado
- Todos somos idiotas hasta que se demuestre lo contrarioooo
- Resultado
- ToDoSSoMosiDIoTAshastAquESedeMuestReLoConTRaRioOOo
¿Cómo des-cifrar?
HelLOWorlDxwORk
Seguiremos las mismas reglas y cuando encontremos una letra mayúscula, anotaremos una letra "B", cuando sea minúscula, anotaremos una letra "A" y obtendremos lo siguiente:
BAABB BAAAB AABBA
Luego separaremos de cinco en cinco y compararemos con la tabla. En este caso obtendremos lo siguiente:
BAABB BAAAB AABBA
EL resultado es: USG , solo bastará un poco de acomodo para darle el sentido correcto, pero en este caso solo es USG la frase cifrada.
Learning Machine #8 - Programando en Pascal - Funciones y procedimientos.
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.
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.
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.
Diferencias.
Learning Machine #7 - Programando en Pascal - 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.
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.
Learning Machine #6 - Programando en Pascal - 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:
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.
Learning Machine #5 - Programando en Pascal - Estructura de control if y else.
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
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
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.
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.
Variables y sus tipos.
| 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
Learning Machine #2 - Programando en pascal - Fundamentos del lenguaje.
Palabras reservadas.
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.
- +
- -
- *
- /
- =
- <
- >
- [ ]
- .
- ,
- ( )
- :
- ^
- @
- { }
- $
- #
- &
- %
- <<
- >>
- **
- <>
- ><
- <=
- >=
- :=
- +=
- -=
- *=
- /=
- (*
- *)
- (.
- .)
- //
Comentarios.
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.
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.
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.
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.






























