domingo, 23 de abril de 2023

Uso de pair, vector, string en programas de C++ (Mac OS 10.x y Visual Studio Code)

No cabe duda que estás personas de la OMI (Olimpiada Mexicana de Informática) me invitan a dar una interesante revisión, en este caso al lenguaje de programación de C (C++ para ser específicos) ya que lo poco que lo use no había o al menos no investigué o me ensañaron ciertas colecciones o tipos de datos complejos, aparte de las clases.

Mi hija con mucho pesar me dijo que al menos vídeos no hay muchos acerca de pair, sin embargo información escrita si hay un  poco más. Es por eso que escribo este breve post.

Pues bien antes de eso para darle sabor quería capturar un dato de tipo string, encontrándome  que no es tan simple como poner string var; por lo que investigando en stackoverflow vi una forma de solucionarlo.

#include <string>
#include <vector>

using namespace std;

int main(){
int n, c, dato;
std::string nombre;


Hay que poner el include del string, poner el using namespace std y definir la variable como std::string.

Volviendo a pair como su nombre lo indica es un pareja de datos, que no necesariamente tiene que ser del mismo tipo. Esta es una clase que tiene sus métodos y dos propiedades muy importantes como lo son el first y el second ya que con estas se leen los pares de valores.

Por un momento creí encontrar similitud con los Dictionary o Map, de C# y Java respectivamente sin embargo pair no es una colección, yo diría que es un tipo de datos compuesto, entonces si queremos tener una colección de pair una opción es usarlas con un otra clase llamada vector. 

Cuando explicaba a mis alumnos las colecciones, les decía que son arreglos con anabólicos, ya que nos resuelven muchas cosas que con los arreglos teníamos que programar tanto sus métodos como sus propiedades (que tiempos aquellos de estructura de datos con la maestra Lucía Barrón) es por ello que podemos dimensionar al vuelo, aplicar métodos para insertar, borrar, actualizar, sortear y un largo etcétera.

 Les dejo un código que muestra el uso de pair y vector.

#include <vector>

#include <iostream>

#include <string>
#include <utility>

using namespace std;

int main(){
vector <std::string> ciudades;
vector <int> distancias;
ciudades.push_back("Zac");
ciudades.push_back("Gto");
ciudades.push_back("Gdl");
ciudades.push_back("León");
ciudades.push_back("Col");

distancias.push_back(118);
distancias.push_back(180);
distancias.push_back(221);
distancias.push_back(127);
distancias.push_back(410);

vector <pair<std::string, int> > vciudad_distancia;

int i=0;

while(i<5){
pair <std::string, int> ciudad_distancia;
ciudad_distancia.first = ciudades[i];
ciudad_distancia.second = distancias[i];
vciudad_distancia.push_back(ciudad_distancia);
i++;
}

// Obtener la ciudad más lejana
int distanciamayor = vciudad_distancia[0].second;
i=0;
std::string ciudad_mas_lejana = vciudad_distancia[0].first;
while(i<5){
if(distanciamayor<vciudad_distancia[i].second){
distanciamayor = vciudad_distancia[i].second;
ciudad_mas_lejana = vciudad_distancia[i].first;
}
i++;
}

std::cout << "Ciudad más lejana:" << ciudad_mas_lejana << " ";
std::cout << "Distancia:" << distanciamayor << endl;

return 1;

} 

Tenemos 2 objetos de tipo vector, en una vienen las ciudades y en el otro las distancias hacia ellas, en base a ellos creamos un nuevo objeto de tipo 

vector que contiene un tipo pair en cada uno de sus elementos (vciudad_distancia), en algunos ejercicios que probamos se puede usar o no usar el objeto de tipo pair para introducirlo en el vector, aquí se utilizó la forma en como lo explican los materiales de la OMI, por lo cual creamos el objeto ciudad_distancia que es un pair al cual en la propiedad first se guarda el nombre de la ciudad destino y en second la distancia a la que se encuentra de Aguascalientes.

Hacemos el algoritmo para determinar la distancia más larga - un clásico de mis tiempos - y se muestra en la consola dicho resultado.

 Mi hija muy apurada encontró un vídeo de pair, en un inglés algo suigéneris por lo que yo grabé uno donde hago este ejemplo y si bien tengo algunos tropiezos, es parte también del quehacer del programador, ya que en este rol pasa mucho, sobre todo cuando estamos iniciando en un nuevo lenguaje o bien retomándolo después de mucho tiempo como es mi caso. Pueden checar el vídeo aquí.

Bueno espero haber sido claro y que los que llegaran a usar el vídeo no digan esta en español, pero parece como si hablará en chino. Hasta el siguiente post.

Miguel Araujo.

viernes, 21 de abril de 2023

C++ en Visual Studio Code para MacOS 10.x

 Aunque no soy un usuario asiduo al sistema operativo MAC OS, me he percatado que cada vez es más difícil instalar aplicaciones de App Store ya que se necesita un sistema operativo de la versión 11 en adelante, para este caso es un equipo que aunque tiene un procesador i5 ya es un modelo de hace más de 10 años por lo que la actualización quedó en la versión Mac OS High Sierra 10.13.6.

Sin embargo para beneplácito mío, al querer programar un poco de C++ recurrí a Visual Studio Code ya que XCode no lo pude instalar por la razón que ya mencioné anteriormente. En principio pensé en solo usarlo como un un editor sin embargo es posible, aunque con un mensaje de error, también ejecutar los programas desde la terminal desde el mismo Visual Studio Code.

Primero instalé las extensiones, con instalar una, que me base en el número de estrellas que tiene el plug-in, el mismo IDE me recomendó otras del mismo lenguaje, quedando como se muestra en la imagen.

Otra cosa importante es que a la gente de Microsoft no le importa tanto la versión del Mac OS y si se tiene una versión muy actualizada del producto.
Con esto ya podemos escribir código con todas las ayudas que brinda es popular y poderoso IDE, entonces procedí a escribir un código de ejemplo, como el siguiente:


Hay un botón y una opción de menú para "ejecutar y depurar ("debuguear")", al querer hacer esta acción me pidió el compilar de C++ y tal parece que el IDE detecta los que tiene el equipo, elegí el primero de la lista y procedí a ejecutar y con esto compilar el código. Para consultar que compilador se tiene elige la opción de "Terminal - Configure Tasks" donde para este caso quedó "C/C++: clang compilar archivo activo". Al dar la opción de "Debug C/C++ File" se muestra el siguiente mensaje:


Después de algunos segundos el IDE manda una ventana con el mensaje "Unable to start debugging. LLDB exited unexpectedly with exit code 134 (0x86)" se tienen 2 botones, más sin embargo al volver a solicitar la terminal, se ejecuta el comando "sudo ./holamundo", con el siguiente resultado:


Aquí nos damos cuenta que Mac OS es una derivación de Unix al igual que Linux, por lo que es necesario dar contraseña de superusuario para ejecutar un compilado de C++.

Hasta aquí con este artículo, hasta la próxima.

Miguel Araujo.


sábado, 8 de abril de 2023

POO ¡Vive! (o al menos para mi)

 

Sería entre los años 1987 y 88 cuando nuestro maestro de una de las materias de programación en el CETis 155, Luis Ignacio Ortiz Villaseñor, nos dejó como actividad traducir un artículo de una de las revistas de aquella época de más renombre, la memoria no da, pero una de ellas era la BYTE, sin embargo en una búsqueda en internet me di cuenta que hay varias, no se si todas, digitalizadas para su consulta y descarga y no encontré una imagen que se quedó en mi mente hasta ahora.

El artículo era sobre una "nueva" forma de programar denominada como "Programación Orientada a Objetos (POO)", la imagen era un dibujo de un bebé jugando con unos dados, se convirtió un poco en mi obsesión buscándola en la web pero como mencioné anteriormente no tuve éxito, por lo que ilustro este artículo con una fotografía que da la misma idea.

La lectura de este artículo no fue suficiente para desde aquellos entonces hubiéramos aplicado y explorado este nuevo paradigma ya que en la retícula de nuestro añorado plantel cubría tres lenguajes básicos de programación los cuales eran BASIC, COBOL y PASCAL los cuales en aquellos tiempos no tenían la posibilidad de poder aplicar esta nueva forma de programar.

En lugar de ello teníamos las llamadas "unidades" de nuestra arma como programadores de mucho tiempo que era el PASCAL, las unidades pudiéramos decir que "encapsulaban" las tareas comunes a varias aplicaciones y que las podíamos escribir en un código aparte y de ahí utilizarlas en nuevos programas aunque todo esto usando el paradigma que nos enseñaron que era el de la "Programación Estructurada".

Ya en la carrera profesional aunque las autoridades se esforzaban por tener la retícula de la carrera actualizada, no tuvimos un curso de Programación Orientada a Objetos.

Fue hasta el entorno laboral, donde gracias a capacitaciones de mucho valor, conocimos algo de este nuevo paradigma con cursos de C++  así como algo de Análisis y Diseño Orientado a Objetos tanto por Manuel Cota padre y su hijo que creo llevaba el mismo nombre.

Sin embargo y nuevamente los lenguajes que se usaban en el Instituto - específicamente en el área que trabajaba - no tenían esa capacidad, entonces muchas de aquellas valiosas enseñanzas se quedaban a la deriva coqueteando con el olvido.

Mi primer intento con una aplicación real fue un instalador (ignoro si para esos años existía el InstallShield) que usábamos para hacer actualizaciones a nuestros sistemas de estatales y regionales. Ya enterado que Borland Turbo Pascal ya era un híbrido y que soportaba el enfoque de la POO, esta aplicación definía una clase con un par de métodos, aunque en el sentido real solo usaba el encapsulamiento no la herencia ni el polimorfismo. Orgulloso de este primer paso cité a Neil Armstrong con las palabras que dijo al pisar la Luna "un pequeño paso para el hombre, un gran salto para la humanidad", una exageración claro esta.

Siguieron pasando los años y el Instituto se organizaba una "Semana de la Tecnología" y dentro esta misma había un maratón de programación, mi compañera Stella Díaz y un servidor nos inscribimos sin mucho éxito, pero ahí mi compañero de la prepa Marco Alfonso López me decía que lo mejor era "pensar y programar" en objetos, la verdad no entendí el mensaje y pues igual sentí que no le había servido mucho a él, pues tampoco ganó :), sin embargo dejó nuevamente sembrada la inquietud de migrar a este paradigma.

Esta inquietud la transmití a un nuevo integrante del equipo, mi a veces némesis y a veces gran amigo Fernando Díaz quien desprecio mi propuesta, para ese entonces ya llevaba algunos sistemas ya migrados a Visual Basic de los sistemas antes en DOS con Turbo Pascal e IMPS.

Cuando inició a estudiar la maestría en Informática y Tecnologías Computacionales ahí ya se convenció de migrar el sistema de Cultura a web usando para aquel entonces la naciente y popular plataforma de .NET en su versión 2003 y ya con el paradigma de POO, el dirigió el proyecto en la parte de desarrollo y yo negociaba con el cliente y los usuarios, además que las validaciones en el cliente con JavaScript y algunas rutinas estaban a mi cargo, también participaron mis compañeros Francisco Díaz y Ángel Mauricio López usando el patrón Modelo-Vista-Controlador (MVC), también contamos con el valioso acompañamiento y asesoramiento de nuestro compañero Juan Aguilar Puebla.

El equipo al cambiar de área donde formamos parte de la Dirección de Informática de la Dirección General de Estadística y poco a poco fuimos dejando de dar mantenimiento a dichos sistemas y paulatinamente el área de Informática del Instituto junto con nuestra anterior área tomó los sistemas, para nosotros dedicarnos a elaborar sistemas de captura, validación y algunas ocasiones de explotación de encuestas en hogares los cuales nos pedían en cuestión de meses a lo mucho 3 y ante esta situación dejamos de lado la plataforma .NET para hacer interfaces (lanzadores) en Visual Basic que conectaban a aplicaciones de CSPro cayendo nuevamente en el sueño de los justos :).

Es importante mencionar que por ejemplo ya casi todos los lenguajes de programación inclusive el popular y por algunos despreciado Visual FoxPro tenía la opción de programar con clases (que recuerdo que junto con Adán Aguilera - un joven que hizo sus practicas profesionales con nosotros - se hizo otro intento de programar alguna clase en VFP) sin embargo se seguía trabajando con el mismo paradigma y si acaso agregando el enfoque de programación basada en eventos.

Antes de que Fernando Díaz dejará el área nos aconsejó cambiar al lenguaje de programación a C# en la misma plataforma de .NET, ya que nosotros iniciamos con Visual Basic .NET, sin embargo poco a poco y ante el empuje de los capturadores que algunos compañeros desarrollaron junto con el naciente IKTAN además de la partida de otro de los programadores el área donde estaba paso a lo mucho a realizar procesos que auxiliaban a los de captura, validación y explotación con lo cual ya no se hacían sistemas integrales.

Quiero mencionar que abrirse al nuevo paradigma no es una cuestión sencilla para algunos, es algunas ocasiones es como forjar la roca, sin embargo otro acontecimiento importante fue el tomar un curso con Alejandro Jiménez de otro de los grandes protagonistas en el escenario de los lenguajes de programación como lo es Java. Alejandro nos enseñó el lenguaje, muy cercano a los contenidos de la certificación, era aprender el paradigma si o si, con el no vimos las aplicaciones para Windows así que la programación era totalmente con clases y objetos.

Afortunadamente aun conservo mi suscripción MSDN de Microsoft que junto con mis labores en la academia a pesar de ya no estar en el desarrollo de software en el Instituto seguí trabajando con la plataforma .NET y poco con Java.

De ahí adelante ya programe siempre usando clases y a pesar de tratar de transmitirlo en mis grupos ha sido labor casi imposible, y es que ocurre que parece ser que ya los patrones de diseño así como los frameworks de desarrollo, así como las bibliotecas ya tienen una madurez que difícilmente los programadores desarrollan una clase.

Sin embargo debo decir que mis bibliotecas de clases me han ahorrado muchísimas horas de desarrollo y otro factor importante es que el lenguaje de programación C# sigue muy vigente por lo que solo se agregan las nuevas características que brinda el mismo.

Dichas bibliotecas me han brindado pequeños logros y grandes satisfacciones, la última fue que debido a lo delicado de la información que manejamos mi jefe me pidió que generará información aleatoria para tratar de desarrollar un prototipo de "Lago de datos", años atrás ya había hecho una aplicación para generar scripts aleatorios de SQLite de información para encuestas donde la verdad casi todos eran valores numéricos, en este caso necesitamos nombres (textos), por lo que esas bibliotecas me sirvieron mucho, sin embargo había que adecuarlas y crear algunas nuevas clases para atender este nuevo requerimiento.

Es aquí donde me viene a la mente esa imagen del bebé, tomo mis cubos, les agrego pequeñas partes y funcionalidades y listo puedo usar mucho de lo ya programado y solo agrego lo faltante, tal como si fuera un mecano o lego, y de una aplicación que yo creo me hubiera llevado mínimo un mes siendo muy optimista la terminé en a lo mucho 4 días.

Clases que fueron programadas para propósitos distintos y otras creadas para este problema en específico, trabajando juntas para lograr el objetivo de crear registros aleatorios es una versión un poco "silvestre" que puede tener muchas mejoras para versiones posteriores.
Otra ventaja es el bajo número de "bugs" al programar de esta manera, ya que mucho de la clase esta ya probada, y solo se tiene que hacer pruebas de los nuevos métodos y las nuevas clases.

Concluyendo, no se si ya no sea necesaria diseñar nuestras propias clases y quizás el diseño de mis clases no sea lo mejor, sin embargo para responder mis casos de uso específicos, mis clases han funcionado de forma muy eficaz y con una eficiencia muy respetable, un código independiente y que permite específicamente ir donde se proviene el error y una revisar cientos o miles de líneas de código de una aplicación completa y monolítica.

Hasta aquí este primer artículo donde expongo mi visión del desarrollo de software y que si seguimos con las fuerzas y la lucidez necesaria seguiremos explorando nuevas soluciones a nuevas necesidades. Hasta el siguiente artículo.

Atte.
Miguel Araujo.





jueves, 6 de abril de 2023

La motivación de este blog

 

Ada Lovelace (1815-1852) es considerada la primer mujer programadora, hay un lenguaje de programación que lleva su nombre y en un reciente descubrimiento de mi parte supe que su padre fue Lord Byron un noble y poeta inglés. Otra nota curiosa es que se dice que su madre temerosa que pudiera heredar "la locura poética" se esforzó en estimular y apoyar el interés de Ada en las matemáticas y la lógica.

En mis aproximadamente 15 años de docente tuve 2 blogs y ahí escribí junto con algunos alumnos que quisieron participar y otros más que lo hicieron para obtener una nota, escribí quizás poco más de 50 artículos, generalmente sin un orden o secuencia, eran simples descubrimientos que me habían costado varias horas de investigación y prueba.

Hoy día, ambos blogs están fuera del aire (quedando solo uno de esta misma plataforma "Aplicaciones para Estadística") y creo me será imposible recuperarlos, aunque como es bien sabido, en temas de Tecnologías de la Información esta información en su mayoría se vuelve poco útil y aplicable debido a la velocidad con que evolucionan las mismas.

Por lo anterior y casi cumpliendo un año que estoy fuera de la academia, inicio este blog que tiene un tinte y matiz enfocado en la programación de aplicaciones.

No solo es la añoranza de las aulas, sino que me mueve un sentimiento paternal a mi hija adolescente, que con sus debidas excepciones, tiene similitudes con Ada.

Desde sus primeros años, al igual que yo, la vena musical y artística despertó y fue floreciendo con el apoyo de mi esposa que a diferencia de Anabella Milbanke - mamá de Ada -  a ella le agradaba esta faceta de mi hija en relación con las artes, claro a sabiendas que la música tiene una fuerte relación con las ciencias puras específicamente las matemáticas, llevándola desde los 4 años al Centro Cultural "Los Arquitos". Debido a esto parecía que la carrera de artes era el destino natural de mi hija, sin embargo al crecer tomo gusto por los derechos humanos y ahora tenía - y según me dice aun no descarta - la carrera de leyes. Sin embargo en los meses pasados y no solo heredando el gusto musical mío sino la tenacidad de su mamá, empezó a interesarse en participar en concursos relacionados no con las humanidades sino ahora con las ciencias puras, le llamó la atención un par de eventos en la cual de manera grupal lograron un primer lugar nacional en el "International Young Physicists’ Tournament (IYPT)" y de manera individual se encuentra en la fase estatal de la "Olimpiada Mexicana de la Informática".

Por lo anterior esta es la  segunda y más importante motivación de abrir este blog, ya que en los meses anteriores, me consultaba algunos de los ejercicios básicos de programación los cuales reconozco tienen una complejidad muy interesante y que se sale de los viejos ejercicios que me tocaron en mi época de estudiante, y con mas de uno requirieron de mucho esfuerzo intelectual para darle caminos a mi hija y pudiera obtener soluciones a tales retos.

La verdad y en base a mi experiencia de docente, veo con agrado que parece que mi hija tiene vocación y nivel para seguir esta carrera, ya que el no rendirse y el pensar "fuera de la caja" es fundamental para la creación de aplicaciones debido a la calidad dual que aun tienen las ciencias computacionales - específicamente la programación de aplicaciones - de ciencia y arte.

Es por ello que como todo padre orgulloso, la URL de este blog es la unión de las dos mujeres programadoras, una consagrada y la otra incipiente, además de las siglas IT que aunque mi buen compañero Ernesto Espinoza, me sugiere - y le he hecho caso - castellanizar las cosas, este termino la verdad es que siempre me ha agradado. 

Dicho pues, a mis pocos y a veces no tan pocos lectores, esperen mi próximo artículo.

Siempre buscando el compartir conocimiento, su seguro amigo y compañero.

Miguel Araujo.


Python y el algebra lineal (2)

 Suma y resta de vectores y multiplicación de un escalar por un  vector Para la suma y resta de vectores los arreglos y/o vectores deben ser...