NOCIONES BÁSICAS DE ARDUINO
COPIA Y PEGA EL SIGUIENTE LINK EN LA BARRA DE DIRECCIÓN:
https://www.prometec.net/curso-kit-inicio/nuestro-primer-programa/
Qué es un Lenguaje de Programación
Antes de hablar de C++, es necesario explicar que un lenguaje de programación es una herramienta que nos permite comunicarnos e instruir a la computadora para que realice una tarea específica. Cada lenguaje de programación posee una sintaxis y un léxico particular, es decir, forma de escribirse que es diferente en cada uno por la forma que fue creado y por la forma que trabaja su compilador para revisar, acomodar y reservar el mismo programa en memoria.
Existen muchos lenguajes de programación de entre los que se destacan los siguientes:
1. C
2. C++ (Usado en Arduino)
3. C # (Usado en Videojuegos)
4. Basic
5. Ada
6. Java
7. Pascal
8. Python
9. Fortran
10.Smalltalk
Historia de C++
C++ es un lenguaje de programación creado por Bjarne Stroustrup en los laboratorios de At&T en 1983. Stroustrup tomó como base un lenguaje de programación popular en aquella época el cual era C.
El C++ es un derivado del mítico lenguaje C, el cual fue creado en la década de los 70 por la mano del finado Dennis Ritchie para la programación del sistema operativo (un sistema parecido a Unix es GNU/Linux), el cual surgió como un lenguaje orientado a la programación de sistemas (System Programming) y de herramientas (Utilities) recomendado sobre todo para programadores expertos, y que no llevaba implementadas muchas funciones [¿cómo cuáles?] que hacen a un lenguaje más comprensible.
Sin embargo, aunque esto en un inicio se puede convertir en un problema, en la práctica es su mayor virtud, ya que permite al programador un mayor control sobre lo que está haciendo. Años más tarde, un programador llamado Bjarne Stroustrup, creo lo que se conoce como C++.
Necesitaba ciertas facilidades de programación, incluidas en otros lenguajes pero que C no soportaba, al menos directamente, como son las llamadas clases y objetos, principios usados en la programación actual. Para ello rediseñó C, ampliando sus posibilidades pero manteniendo su mayor cualidad, la de permitir al programador en todo momento tener controlado lo que está haciendo, consiguiendo así una mayor rapidez que no se conseguiría en otros lenguajes.
C++ pretende llevar a C a un nuevo paradigma de clases y objetos con los que se realiza una comprensión más humana basándose en la construcción de objetos, con características propias solo de ellos, agrupados en clases. Es decir, si yo quisiera hacer un programa sobre animales, crearía una clase llamada animales, en la cual cada animal, por ejemplo un pato, sería un objeto, de tal manera que se ve el intento de esta forma de programar por ser un fiel reflejo de cómo los humanos (en teoría) manejamos la realidad[referencia].
Se dice que nuestro cerebro trabaja de forma relacional[referencia] (relacionando hechos), es por ello que cada vez que recuerdas algo, (cuentas un hecho), termina siendo diferente (se agregan u omiten partes).
Qué es C++
C++ es un lenguaje de programación orientado a objetos que toma la base del lenguaje C y le agrega la capacidad de abstraer tipos como en Smalltalk.
La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitieran la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido [¿por? fusionar con el siguiente].
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.
Herramientas Necesarias
Las principales herramientas necesarias para escribir un programa en C++ son las siguientes:
1. Un equipo ejecutando un sistema operativo.
2. Un compilador de C++
1. Windows MingW (GCC para Windows) o MSVC (compilador de microsoft con versión gratuita)
2. Linux (u otros UNIX): g++
3. Mac (con el compilador Xcode)
3. Un editor cualquiera de texto, o mejor un entorno de desarrollo (IDE)
1. Windows:
1.Microsoft Visual C++ (conocido por sus siglas MSVC). Incluye compilador y posee una versión gratuita (versión express)
2.Bloc de notas (no recomendado)
3.Editor Notepad++
4.DevCpp (incluye MingW - en desuso, no recomendado, incluye también un compilador)
5.Code::Blocks
2. Mac:
1.Xcode (con el compilador trae una IDE para poder programar)
4. Tiempo para practicar
5. Paciencia
Adicional
1. Inglés (Recomendado)
2. Estar familiarizado con C u otro lenguaje derivado (PHP, Python, etc).
También, hay que recordar que C++, admite C, por lo que se puede programar (reutilizar), funciones de C que se puedan usar en C++.
Aunque No es obligación aprender C, es recomendable tener nociones sobre la programación orientada a objetos en el caso de no tener conocimientos previos de programación estructurada. Asimismo, muchos programadores recomiendan no saber C para saber C++, por ser el primero de ellos un lenguaje imperativo o procedimental y el segundo un lenguaje de programación orientado a objetos.
1. Programa para mostrar el texto "Hola mundo" en la pantalla
2. Programa para detectar si un número introducido por un usuario es par o impar.
Fuente: https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Introducci%C3%B3n
PROGRAMACIÓN ORIENTADA A OBJETOS (POO) CON C++
Primera parte
1. TÉRMINOS Y CONCEPTOS DE POO
El esquema tradicional de un programa, independientemente del lenguaje que se utilice, está compuesto por una secuencia de sentencias, más o menos agrupadas en rutinas o funciones, que van operando sobre una información contenida en campos o variables. El problema de esta estructura estriba en que ni las sentencias tienen un control de las variables con las que trabajan, ni estas variables están relacionadas en forma alguna con las sentencias que habrán de tratarlas. ¿Cómo puede la POO ayudarnos?
1.1. ¿Qué Significa POO?
La filosofía de la POO (Object Oriented Programming, Programación Orientada a Objetos) rompe con este esquema, dando lugar a una nueva idea, el objeto. El objeto es una abstracción en la que se unen sentencias y datos, de tal forma que a un objeto sólo lo van a poder tratar los métodos definidos para él, y estos métodos están preparados para trabajar específicamente con él. Este grado de compenetración evita que un método pueda tratar datos no apropiados, o bien que unos datos puedan ser tratados por un método no adecuado, ya que la llamada a cualquier método ha de ir siempre precedida del objeto sobre el que se quiere actuar, y éste sabe si ese método se ha definido o no para él. C++ es un lenguaje que contiene estos y otros conceptos de POO.
En terminología POO, cuando se quiere ejecutar un método (función) sobre un objeto, se utiliza un mensaje que se envía al objeto, de tal forma que el objeto llame al método y éste sepa qué objeto lo ha llamado.
1.2. Encapsulación
Este concepto permite tener un control de acceso selectivo tanto a los miembros como a los métodos, de tal forma que desde fuera del objeto sólo se pueda acceder a los métodos e identificadores que permita el creador del objeto.
1.3. Herencia
Permite la reutilización y la extensión del código. Permite diseñar nuevas clases a partir de otras ya existentes, pudiéndose además extender sus métodos (cambiar su semántica en la clase que hereda).
q Ej. Pilas y Colas.
1.4. Polimorfismo
Permite tratar de forma genérica objetos de distintas clases, ahorrando así código y proporcionando simplicidad. Por tanto, trata de forma genérica objetos de distintos tipos derivados de una misma clase de objetos.
1.5. Constructores y Destructores
Un constructor es un método que se ejecuta automáticamente cuando se define o se crea un objeto, y su función es inicializar el objeto y prepararlo para realizar las operaciones necesarias.
Un destructor es un método que se ejecuta automáticamente cuando un objeto queda fuera del ámbito en el que se creó, y su función es destruir el objeto, liberando cualquier asignación dinámica de memoria que se haga.
El objeto puede tener o no definidos explícitamente el constructor y el destructor, o tener varios constructores.
2.1. Clases
Una clase es una definición de operaciones que se define una vez en algún punto del programa, pero normalmente se define en un archivo cabecera, asignándole un nombre que se podrá utilizar más tarde para definir objetos de dicha clase. Las clases se crean usando la palabra clave class, y su sintaxis podemos verla pulsando class.
Nota: Muy importante no olvidar el punto y coma final.
Cuando deseemos crear un objeto de una clase definida lo que haremos será lo siguiente:
Nombre de la Clase Nombre del Objeto;
Punto p1,p2; // Creación de dos objetos
// de la clase Punto
También se pueden definir apuntadores a objetos.
Se puede acceder a los datos y métodos de una clase de la misma forma que se accede a un campo de una estructura, es decir,. con ->, seguido del nombre del elemento a usar.
2.2. Miembros Públicos, Protegidos y Privados
Un miembro público es accesible en cualquier lugar en el que exista un objeto de la clase.
Un miembro protegido sólo es accesible desde las clases que se hereden de la clase que lo contiene.
Un miembro privado sólo es accesible por los métodos de la clase a la que pertenece.
También se puede crear una clase usando la palabra clave struct, la diferencia es que con struct los miembros se hacen públicos por defecto, mientras que con class se hacen privados por defecto.
Para hacer un miembro público, privado o protegido usamos respectivamente:
public, private o protected
2.3. Definición de una Clase
El cuerpo de un método, puede o bien incluirse en la definición de una clase, en cuyo caso lo llamaremos método inline, o bien en un archivo fuera de la clase.
Para que C++ sepa cuándo una función es simplemente una función, y cuándo es un método, en éste último caso siempre debemos poner al método como prefijo el nombre de la clase a la que pertenece seguido de :: (operador de ámbito).
En la definición de la clase anterior pueden verse dos variantes, en la primera los métodos se definen dentro de la misma clase, mientras que en la segunda sólo se incluye en la clase un prototipo de los métodos, su implementación está fuera. Los métodos cuya definición se incluye en la clase se denominan Métodos inline.
En el caso de emplear métodos inline, vamos a tener como beneficio que la ejecución va a ser más rápida, pero sin embargo, el código objeto que genera el compilador va a ser mayor.
En algunos compiladores puede que no suceda esto, pero normalmente suele ocurrir. Así, a la conclusión a la que podemos llegar es que, para métodos pequeños, el método Inline si es óptimo, pero en caso contrario no lo será.
2.5.1. cin y cout
cin y cout son dos flujos (entrada y salida) de datos pertenecientes a la biblioteca de C++ llamada iostream, y se utilizan para lo siguiente:
cin>>dato : Almacena el carácter introducido por teclado en dato.
cout<<dato : Lee el contenido de dato y lo muestra por pantalla.
Fuente: http://www.lcc.uma.es/~eat/services/poo_c/fra2.html
PROGRAMACIÓN ORIENTADA A OBJETOS (POO) CON C++
Segunda parte
3. SOBRECARGA
Consiste en la redefinición de un método. Por tanto, un método sobrecargado es un método que consta de varias definiciones distintas, aunque todas ellas llamadas de igual forma. Lo que va a permitir distinguir un método de otro que se llame de igual forma van a ser el tipo y el número de parámetros que recibe.
4. CONSTRUCTORES Y DESTRUCTORES
Cada vez que se define una variable de un tipo básico, el programa ejecuta un procedimiento que se encarga de asignar la memoria necesaria, y si es necesario, también realizará las inicializaciones pertinentes.
De forma complementaria cuando una variable queda fuera de ámbito se llama a un procedimiento que libera el espacio que estaba ocupando dicha variable.
El método al que se llama cuando creamos una variable es el constructor, y al que se llama cuando se destruye una variable es el destructor.
Una clase puede tener uno o varios constructores, pero un sólo destructor. El constructor debe tener el mismo nombre que la clase a la que pertenece, mientras que el destructor también debe llamarse de igual forma pero precedido por el carácter ~ .
Estos métodos no van a tener parámetros de salida, ni siquiera puede usarse void. Sin embargo, el constructor sí podría tomar parámetros de entrada, cosa que no puede hacer el destructor.
Al haber creado un constructor que toma un parámetro - la cadena a asignar a la cadena que se está declarando -, ya no es posible crear un objeto de clase Cadena sin ese parámetro. Puesto que es posible tener varios constructores, estamos usando sobrecarga. También se puede tener un constructor que por ejemplo inicialice a nulo todos los datos miembros de la clase.
4.1. Constructor de Copia y Asignación
En el ejemplo anterior, se observa que el operador de concatenación devuelve un objeto de la clase Cadena a fin de que ese valor de retorno se asigne a algún objeto de la forma C3=C1+C2. Sin embargo, no se ha definido el operador = para esta clase, y esto va a funcionar a pesar de ello porque por defecto el operador = hace una copia bit a bit. Por el contrario sí va a haber problemas cuando ocurra que el operando de destino (C2=C1) apunte a alguna dirección de memoria y con esta asignación se pierda. Para evitar este problema, se usa el constructor de copia y asignación, definiendo el método operator=(). Sin embargo, hay a veces un problema con este operador que nos lleva a que tengamos que sobrecargarlo.
Si se ejecuta el programa de la figura 5 paso a paso, se verá que para crear e inicializar los objetos C3 y C4 se usa el constructor de copia, mientras que en la asignación C3=C2 se llama al método operator=(). También observará que el programa llama a veces al constructor de copia sin causa aparente, esto es porque dicho constructor también se utiliza para crear objetos temporales por parte del programa, por ejemplo para pasar un objeto de una función a otra.
4.2. Constructor de Conversión
A veces es necesario usar un objeto de una determinada clase en una expresión que no está preparada para él, y habrá que realizar conversiones (casting).
Pueden ocurrir dos casos:
a) Que se asigne a un objeto de nuestra clase otro que no lo es.
b) Que se asigne a un objeto de otra clase otro de la nuestra.
Esto sí es correcto, porque estamos asignando a C1 un char *, que sería la cadena "Hola, mundo", que será lo que reciba como parámetro el constructor de la clase Cadena:
Cadena(char *Str);
Sin embargo no sería correcto:
Cadena C1;
Fecha Hoy;
C1=Hoy;
Esto no sería correcto hasta que no se cree un constructor que recibiendo un objeto de la clase Fecha cree un objeto de la clase Cadena. En el otro caso, es decir, convertir un dato de nuestra clase en otro tipo, hay que sobrecargar los operadores de moldeado o casts.
Por ejemplo, si queremos mostrar por pantalla la cadena de caracteres que tiene un objeto, así como su longitud, no podríamos hacer cout<<C1, sino que tendríamos que especificar el tipo básico de datos que queremos mostrar, es decir, debemos hacer lo siguiente: cout<<(char *) C1; cout<<(int) C1;
4.3. Destructores
El destructor, como se mencionó antes, se distingue del resto de miembros de una clase porque va precedido por el carácter ~ . Cada vez que un objeto deja de ser útil, se llamará al destructor del objeto, que realizará sobre éste las últimas operaciones que sean necesarias. Si no se provee de un destructor se creará uno por defecto, que destruirá el objeto, sin tener en cuenta posibles liberaciones de memoria.
Cualquier destructor no puede aceptar parámetros ni de entrada ni de salida, y además sólo puede aparecer a lo sumo uno en cada clase.
4.4. Asignación Dinámica de Memoria
Se llama Asignación Dinámica de Memoria al proceso mediante el cual, se va reservando memoria a medida que vaya haciendo falta, y se va liberando cuando ya no sea útil. Algunos ejemplos son los vistos antes con new y delete.
Un objeto también se puede crear explícitamente por medio del operador new, que asignará la memoria necesaria para contener al objeto y devolverá un puntero al objeto en cuestión.
El operador new siempre va seguido de un parámetro que indica el tipo de objeto que se quiere crear. De este parámetro, new obtiene el número de bytes necesarios para almacenar el objeto, y a continuación buscará un bloque de memoria apropiado, lo asigna al programa y devuelve su dirección. En este caso, accederemos a los miembros de la clase mediante el operador ->, y por medio de * accedemos al contenido. Lo que ocurre es que un objeto creado con new no se destruirá automáticamente cuando quede fuera de su ámbito, sino que ha de usarse para liberar memoria el comando delete. Al crear un objeto con new detrás del nombre de la clase se le puede hacer una asignación poniéndola entre paréntesis.
4.5. Errores en Asignación de Memoria
El operador new devuelve la dirección de memoria reservada para el objeto que se crea, pero esto lo hará siempre y cuando no haya problemas. Si no hay memoria suficiente devolverá un valor NULL. Por tanto, para controlar tales tipos de problemas lo que podemos hacer es crearnos una función que los trate.
Esto puede automatizarse en C++ usando la función set_new_handler() a la que se le pasará como parámetro el nombre de la función que maneja el error. Es necesario para poder usarlo incluir el fichero cabecera new.h.
4.6. Sobrecarga de New y Delete
El operador new, así como el delete, se pueden sobrecargar y así particularizar su funcionamiento dentro de una clase. new toma como parámetro size_t, indicando el tamaño del objeto a crear, y devuelve un puntero de tipo void. Delete por su parte, recibe un puntero void y no devuelve nada.
Además de new y delete también podemos utilizar malloc() o free().