Sintaxis C#

Logo C++

Sintáxis básica de C++

Elementos básicos del lenguaje#

Instalación#

Para poder compilar un programa escrito en C++ debemos instalar un compilador, yo personalmente utilizo en linux GCC y el comando para instalarlo es: sudo apt install build-essential

Comentarios#

  • Comentarios de una sola línea:

1// Comentario de una sola línea
  • Comentarios multilínea:

1/* Este comentario
2tiene más de una línea.
3Puede servir para escribir
4un manual u otras cosas.
5*/

Entrada y salida estandar#

C utiliza para entrada de datos la función scanf() y para la impresión de estos por consola printf()

  • Entrada de datos:

1cout << "introduce un número: << endl;
2cin >> numero;
  • Salida de datos:

1// salida estandar:
2cout << "Hola amigo" << " así se puede " << " unir cadenas " endl; // endl salto de página o \n.
3
4// uso de variables:
5cout << "Tu número es " << numero << endl;

Estructura en c#

  • Código c puro:

1#include "iostream"
2
3using namespace std;
4
5int main(){
6    cout << "Hola mundo";
7
8    return 0;
9}

Atención

Las líneas terminan en ; obligatóriamente.

Extensión#

La extensión utilizada por los archivos C++ es cpp

Compilación y ejecución#

  • El comando para compilar un programa en C++ con G++ es g++ -o hola hola-mundo.cpp

  • La compilación nos devolverá un programa llamado hola que ejecutamos en Linux como ./hola

Variables y tipos de datos#

  • Declaración, asignación y tipo:

 1#include <iostream>
 2using namespace std;
 3
 4int main(){
 5    // tipo char:
 6    char x = 'a';
 7
 8    // tipo entero:
 9    int entero = 10;
10
11    // tipo flotante:
12    float decimal = 3.5;
13
14    // operaciones:
15    float resultado = entero + decimal;
16
17    // booleano:
18    bool valor = false;
19
20    // impresión de resultado:
21    cout << resultado << endl;
22
23    return 0;
24}
  • Constantes:

 1#include <iostream>
 2using namespace std;
 3
 4// definir constante en la cabezera:
 5#define PI 3.1416;
 6
 7int main(){
 8    // o también se declara la constante con const:
 9    const float PI = 3.1416;
10
11    // imprimir la constante:
12    cout << "El valor de PI es: " << PI;
13
14    return 0;
15}

Operadores#

Operadores aritméticos#

  • Operaciones aritméticas:

 1#include <iostream>
 2using namespace std;
 3
 4int main (){
 5    sumar = 3 + 6;
 6    restar = 7 * 9;
 7    multiplicar = 11 * 6;
 8    dividir = 13 / 20;
 9    resto = 54 % 7;
10    // impresión con calculo:
11    cout << 3 - 2 << endl;
12}
  • Incremento y decremento:

1i++;
2++i;
3--i;
4i--;
  • Asignar operación:

 1#include <iostream>
 2
 3int main (){
 4    // la variable debe tener un valor asignado:
 5    resultado = 0
 6
 7    resultado += 12;
 8    resultado -= 16;
 9    resultado *= 19;
10    resultado /= 6;
11    resultado %= 19;
12}

Operadores relacionales#

Validación entre dos números.

  • Mayor que: >.

  • Menor que: <.

  • Mayor o igual que: >=.

  • Menor o igual que: <=.

  • Igual que: ==.

Operadores lógicos#

Expresiones de operaciones lógicas.

  • and: &&.

  • or: ||.

  • not: !.

Estructuras de control#

Condicional if#

  • if sencillo:

 1#include <iostream>
 2#include <string>
 3
 4using namespace std;
 5
 6
 7int main(){
 8    int resultado = 0;
 9
10    cout << "Cuanto es 39+50?" << endl;
11    cin >> resultado;
12
13    if(resultado == 39+50){
14        cout << "Respuesta Correcta!" << endl;
15    }
16
17    return 0;
18}
  • if / else:

 1#include <iostream>
 2#include <string>
 3
 4using namespace std;
 5
 6
 7int main(){
 8    int resultado = 0;
 9
10    cout << "Cuanto es 39+50?" << endl;
11    cin >> resultado;
12
13    if(resultado == 39+50){
14        cout << "Respuesta Correcta!" << endl;
15    }else{
16        cout << "Respuesta incorrecta, el resultado es: " << 39+50 << endl;
17    }
18
19    return 0;
20}
  • else-if:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7    int edad = 0;
 8
 9    cout << "¿Qué edad tienes?" << endl;
10    cin >> edad;
11
12    if(edad >= 18){
13        cout << "Eres mayor de edad!" << endl;
14    }else if(edad >=16 && edad < 18){
15        cout << "Eres un adolescente " << endl;
16    }else{
17        cout << "Eres menor de edad" << endl;
18    }
19
20    return 0;
21}

Condicional Switch#

Estructura de un switch:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7    cout << "Elije una opción: ";
 8    int opcion;
 9    cin >> opcion;
10
11    switch(opcion){
12        case 1:
13            cout << "Has seleccionado la primera opción" << endl;
14            break;
15        case 2:
16            cout << "Has seleccionado la segunda opción" << endl;
17            break;
18        case 3:
19            cout << "Has seleccionado la tercera opción" << endl;
20            break;
21        default:
22            cout << "Opción incorrecta" << endl;
23    }
24
25    return 0;
26}

Bucle for#

  • for básico:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7
 8    for(int i=10; i > 0; i--){
 9        cout << "Cuenta atras... "<< i << endl;
10    }
11
12    return 0;
13}
  • foreach:

 1#include <iostream>
 2using namespace std;
 3
 4int main()
 5{
 6    int numeros[] = { 8, 154, 32, 25 };
 7
 8    for (int num : numeros){
 9        cout << num << endl;
10    }
11
12}

Bucle while#

  • While sencillo:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7
 8    int numero;
 9    cout << "Introduce un número" << endl;
10    cin >> numero;
11    while(numero <= 100){
12        cout << "Introduce un número" << endl;
13        cin >> numero;
14    }
15
16    return 0;
17}
  • Bucle infinito:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7
 8    int numero;
 9    numero = 0;
10    while(1){
11        numero++;
12        cout << numero << endl;
13    }
14
15    return 0;
16}
  • do-while:

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7
 8    int numero;
 9    cout << "Introduce un número" << endl;
10    cin >> numero;
11    do{
12        cout << "Introduce un número" << endl;
13        cin >> numero;
14    }while(numero <= 100);
15
16    return 0;
17}

Detener secuenda de script#

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7
 8    int numero;
 9    numero = 0;
10    while(1){
11        numero++;
12        cout << numero << endl;
13
14        if(numero == 100){
15            break;
16        }
17    }
18
19    return 0;
20}

Punteros#

Cuando trabajamos con punteros establecemos un enlace con una variable, de modo que por ejemplo en el caso de las funciones, al enviar parámetros lo que mandamos es una copia, pero gracias a los punteros se puede enviar por parámetros la variable original para modificarla.

 1#include <stdio.h>
 2
 3#include <iostream>
 4
 5using namespace std;
 6
 7int funcion(int valor){
 8    valor = valor + 10;
 9    return valor;
10}
11
12int funcionPunteros(int* valor){
13    *valor = *valor + 10;
14    return *valor;
15}
16
17int main(){
18    int numero = 10;
19
20    cout << "Antes de función " << numero << endl;
21    funcion(numero);
22    cout << "Después de funcion " << numero << endl;
23
24    cout << "Antes de funcionPunteros " << numero << endl;
25    funcionPunteros(&numero);
26    cout << "Después de funcionPunteros " << numero << endl;
27
28    return 0;
29}

Tipos de datos avanzados#

Arrays o vectores#

 1#include <iostream>
 2
 3using namespace std;
 4
 5
 6int main(){
 7    // declaración y asignación de elementos al array:
 8    int edades[] = {1,2,9,10,16,32,33,22,15};
 9
10    // estableciendo el tamaño de la cadena, algo similar a la función length en otros lenguajes:
11    int limite = (sizeof(edades)/sizeof(edades[0]));
12
13    // Recorrido e impresión del array:
14    for(int i = 0; i < limite; i++){
15        cout << edades[i] << endl;
16    }
17
18    // cambiando el valor de un elemento de la cadena:
19    edades[2] = 27;
20    // impresión de un valor específico del array:
21    cout << edades[2] << endl;
22
23    return 0;
24}

Matrices#

Las matrices son básicamente arrays multidimensionales a los que les asignamos una cantidad de casillas y este se puede representar como una tabla a la hora de guardar y acceder a la información:

 1# include "iostream"
 2
 3using namespace std;
 4
 5int main(){
 6    // creamos una matriz de 4x4
 7    int matriz[4][4] = {
 8        {1,2,3,4},
 9        {4,5,6,7},
10        {8,9,10,11},
11        {12,13,14,15}
12    }; // el primer array representa las filas y el segundo las columnas
13
14    // impresión del número 11:
15    cout << matriz[2][3] << endl;
16
17    // recorrer matriz con un bucle anidado:
18    for(int fila = 0; fila <= 3; fila++){
19        cout << "==============" << endl;
20        cout << "|";
21        for(int columna = 0; columna <= 3; columna++){
22            cout << matriz[fila][columna] << "|";
23        }
24        cout << endl;
25    }
26}

Enumeradores#

Los enumeradores nos sirven para generar un tipo de dato utilizando typedef y enum, por ejemplo en el ejemplo generamos y usamos un tipo Booleano.

Ejemplo:

 1# include "iostream"
 2using namespace std;
 3
 4
 5// definir un enum:
 6enum Consola {
 7    Mandos,
 8    Aparato,
 9    Soporte
10};
11
12int main(){
13    // definir una variable:
14    Consola VideoConsola;
15    // asignar un valor disponible (esto establecerá una posición 1 de 0,1 y 2 que hay disponibles):
16    VideoConsola = Aparato;
17
18    // se podrá validar con switch los distintos casos:
19    switch(VideoConsola){
20        case Mandos:
21            cout << "La Nintendo 64 tiene 4 puertos de mandos" << endl;
22            break;
23        case Aparato:
24            cout << "La Nintendo 64 es una consola de 64 bits" << endl;
25            break;
26        case Soporte:
27            cout << "La nintendo 64 funciona con cartuchos de juego" << endl;
28            break;
29    }
30    // Al imprimir este valor del enum nos devolverá un número (de ahí su nombre enum-erador)
31    cout << VideoConsola << endl;
32
33}

Estructura de datos#

La estructura de datos se genera también con typedef junto a struct

 1#include <stdio.h>
 2
 3# include "iostream"
 4using namespace std;
 5
 6
 7// definir una estructura:
 8struct CONSOLA {
 9    // declarar los tipos de datos presentes:
10    string marca;
11    string modelo;
12    int lanzamiento;
13} videoconsola;
14
15int main(){
16    // cargar la estrucutra en una variable:
17    struct CONSOLA playstation;
18    // asignar valores:
19    playstation.marca = "Sony";
20    playstation.modelo = "PlayStation";
21    playstation.lanzamiento = 1994;
22
23    cout << "La consola " << playstation.marca << " " << playstation.modelo << " fue lanzada en " << playstation.lanzamiento << endl;
24}

Programación modular#

Funciones#

 1#include <iostream>
 2#include <string>
 3
 4using namespace std;
 5
 6int funcion(int num1, int num2){
 7    return num1 + num2;
 8}
 9
10int main(){
11    cout << "el total es: " << funcion(10, 15) << endl;
12
13    return 0;
14}

Programación Orientada a objetos#

Clases#

El gran avance de C++ frente a C tradicional es la inclusión del paradigma orientado a objetos.

  • Creación de clases con atributos, metodo y creación del objeto:

 1#include <iostream>
 2using namespace std;
 3
 4// creamos la clase:
 5class MiClase {
 6    public: // definimos el tipo de encapsulación si es publica o privada
 7        // definimos los atributos
 8        int numero;
 9        string cadena;
10        // y esto es un método de ejemplo:
11        void miMetodo(){
12            cout << "Metodo de prueba" << endl;
13        }
14        // metodo que recibe parámetros:
15        void conParametros(int edad){
16            cout << "Tienes " << edad << " años." << endl;
17        }
18}; // las clases se cierran con ;
19
20int main(){
21    // creamos un objeto a partir de la clase anterior:
22    MiClase miObjeto;
23
24    // podemos acceder directamente a sus atributos
25    miObjeto.numero = 20;
26    miObjeto.cadena = "Texto de prueba";
27
28    // imprimimos los valores:
29    cout << miObjeto.numero << endl;
30    cout << miObjeto.cadena << endl;
31    // llamar a un método:
32    miObjeto.miMetodo();
33    // llamar a un metodo y enviar un parámetro:
34    miObjeto.conParametros(33);
35
36    return 0;
37}

Clases con constructor#

 1#include <iostream>
 2using namespace std;
 3
 4class MiClase {
 5    public:
 6        string nombre;
 7        int edad;
 8
 9        // el constructor lleva el nombre de la clase y puede recibir parametros:
10        MiClase(string n, int e){
11            nombre = n;
12            edad = e;
13
14            cout << "Objeto creado con éxito" << endl;
15        }
16
17        void presentacion(){
18            cout << "Te llamas " << nombre << " y tienes " << edad << " años." << endl;
19        }
20};
21
22int main(){
23    MiClase miObjeto("Felipe", 37);
24
25    miObjeto.presentacion();
26    return 0;
27}

Tipos de encapsulación en C++#

Existen tres tipos de encapsulación en C++:

  • public: los atributos y métodos son publicos y por tanto se puede acceder a ellos una vez creado el objeto.

  • private: los atributos y metodos no pueden ser llamados o modificados desde el objeto.

  • protected: los atributos y metodos solo pueden ser llamados o modificados desde la clase.

Get y Set#

Para manejar atributos y metodos privados utilizaremos los get y set, estos metodos son una convención en programación:

 1#include <iostream>
 2using namespace std;
 3
 4class MiClase {
 5    // cada atributo o metodo lo manejaremos en su propia capa de encapsulación.
 6    private:
 7        int numA;
 8    public:
 9        // Con los setter modificamos el atributo:
10        void setNumero(int n){
11            numA = n;
12        }
13
14        // y con los getter recuperamos el atributo, debemos poner el tipo de devolución como en las funciones:
15        int getNumero(){
16            return numA;
17        }
18};
19
20int main(){
21    MiClase numeros;
22
23    numeros.setNumero(27);
24    cout << "El numero establecido es: " << numeros.getNumero() << endl;
25}

Herencia#

La herencia en C++ se realizaría del siguiente modo:

 1#include <iostream>
 2using namespace std;
 3
 4// clase padre:
 5class Mueble {
 6    public:
 7        string mueble = "Mesa";
 8        void accion(){
 9            cout << "PONER LA MESA" << endl;
10            cout << "=============" << endl;
11        }
12};
13
14// clase hijo que hereda del padre:
15class MesaComedor: public Mueble {
16    public:
17        string tipo = "Mesa del comedor";
18};
19
20int main(){
21    MesaComedor mesa;
22
23    mesa.accion();
24    cout << "Hay que poner la " << mesa.mueble << endl;
25    cout << "¿Qué mesa?" << endl;
26    cout << "La " << mesa.tipo << endl;
27}

Importante

En la herencia de clases existe otro concepto llamado polimorfismo y se basa en reutilizar los metodos de las clases padre para modificarlos en las clases hijo de forma que podemos reutilizarlos sin necesidad de crear unos nuevos.

Manejo de errores#

El manejo de errores en C++ se realiza con try y catch:

 1#include <iostream>
 2using namespace std;
 3
 4int main(){
 5    int numeroA;
 6    int numeroB = 20;
 7    int total;
 8
 9    cout << "introduce un número:" << endl;
10    cin >> numeroA;
11    total = numeroA + numeroB;
12
13    // con try probaremos a ejecutar una operación:
14    try{
15        // si el valor es mayor a 20 siginfica que el numeroA no es una letra o un valor igual menor que 0:
16        if(total > 20){
17            cout << "El resultado de la suma es: " << total << endl;
18        }else{
19            // sino provocaremos un error:
20            throw(numeroA);
21        }
22    } // catch caputará el error provocado:
23    catch(int numero){
24        cout << "El valor introducido no es correcto: " << numero << endl;
25    }
26}

Empaquetado y Preprocesamiento#

He estado buscando información en la red y no he dado con mucho así que he comprobado que se puede crear paquetes del mismo modo que C.

  • Archivo modulo.cpp con la función del paquete:

1int sumar(int num1, int num2){
2    return num1 + num2;
3}
  • Archivo de intercambio intercambio.h:

1extern int sumar(int a, int b);
  • Archivo main.cpp con el código principal:

1#include "iostream"
2#include "intercambio.h"
3
4using namespace std;
5
6int main(){
7    cout << sumar(20,15) << endl;
8}

Uso del preprocesador#

Este ejemplo de preprocesado sin utilizar el archivo .h es identico al de C.

  • Archivo modulo.cpp con la función del paquete:

1int sumar(int num1, int num2){
2    return num1 + num2;
3}
  • Archivo main.cpp con el código principal:

1#include "iostream"
2extern int sumar(int a, int b);
3
4using namespace std;
5
6int main(){
7    cout << sumar(20,15) << endl;
8}