4. Curso C++: Operadores en C++ - Una Guía Completa

4. Curso C++: Operadores en C++ - Una Guía Completa

Los operadores son elementos que disparan ciertos cálculos cuando se aplican a variables u otros objetos en una expresión. En esta guía, aprenderemos sobre los diferentes tipos de operadores en C++, cómo se utilizan y sus particularidades.

1. Definiciones Básicas 📚

  • Variable: Entidad que almacena un valor que puede cambiar durante la ejecución del programa.

  • Operando: Constante, variable o expresión que interviene en una operación.

  • Operador: Símbolo que indica las operaciones a realizar sobre los operandos.

  • Expresión: Conjunto de operadores y operandos que da como resultado un valor.

Por ejemplo, en la expresión a + b, a y b son operandos, + es el operador, y todo junto forma una expresión que devuelve un valor.

2. Tipos de Operadores

Los operadores se pueden clasificar según el número de operandos que afectan:

  • Unitarios: Afectan a un solo operando.

  • Binarios: Afectan a dos operandos.

  • Ternarios: Afectan a tres operandos.

Veamos cada tipo en detalle.

3. Operadores Aritméticos

Los operadores aritméticos se usan para crear expresiones matemáticas. Hay dos operadores aritméticos unitarios:

  • + <expresión> y - <expresión>: Asignan valores positivos o negativos a la expresión.

Ejemplo:

int x = -5; // Aplicación de operador unitario

Existen también varios operadores binarios: +, -, *, /, que admiten tanto expresiones enteras como en coma flotante.

Ejemplo:

int a = 10;
int b = 3;
int suma = a + b;    // Resultado: 13
int resta = a - b;   // Resultado: 7
int producto = a * b; // Resultado: 30
float division = a / (float)b; // Resultado: 3.3333
  • Operador Módulo %: Devuelve el resto de la división entera entre dos operandos. Solo funciona con operandos enteros.

Ejemplo:

int resto = 17 % 7; // Resultado: 3

Resumen Rápido de los Operadores Aritméticos

OperadorDescripciónEjemplo
+Sumaa + b
-Restaa - b
*Multiplicacióna * b
/Divisióna / b
%Módulo (resto división)a % b

4. Operadores de Asignación 🖊️

El operador más común es el =, que asigna un valor a una variable. Además, existen operadores compuestos que combinan una operación con una asignación:

  • +=, -=, *=, /=, %=

Ejemplo:

int a = 10;
a += 5; // Es equivalente a: a = a + 5; Resultado: 15

Estos operadores permiten escribir el código de forma más concisa y clara.

Tabla de Operadores de Asignación

OperadorDescripciónEjemplo
=Asignación simplea = b
+=Suma y asignacióna += b
-=Resta y asignacióna -= b
*=Multiplicación y asignacióna *= b
/=División y asignacióna /= b

5. Operadores de Incremento y Decremento 🔄

  • ++ y --: Incrementan o decrementan una variable en una unidad. Pueden usarse en modo prefijo o sufijo.

Ejemplos:

int b = 10;
int c = ++b; // Pre-incremento: b vale 11, c también vale 11
int d = b--; // Post-decremento: d vale 11, luego b vale 10

En su forma de prefijo (++b), el operador incrementa el valor antes de evaluarlo en el resto de la expresión. En la forma sufijo (b++), se evalúa primero la expresión y luego se incrementa.

6. Operadores Lógicos y de Comparación ⚖️

  • Operadores Lógicos: && (AND), || (OR), ! (NOT). Permiten combinar expresiones lógicas.

  • Operadores de Comparación: ==, !=, <, >, <=, >=. Se usan para comparar dos valores y devolver un booleano (true o false).

Ejemplo:

int a = 5;
int b = 10;
bool resultado = (a < b) && (b > 0); // Resultado: true

Tabla de Operadores de Comparación

OperadorDescripciónEjemplo
==Igualdada == b
!=Desigualdada != b
<Menor quea < b
>Mayor quea > b
<=Menor o igual quea <= b
>=Mayor o igual quea >= b

7. Desafío Práctico 🚀

¿Podés adivinar el resultado de este código?

int a = 5;
int b = 3;
int resultado = a++ + ++b;
// ¿Cuál es el valor final de `resultado`?

Pista: Presta atención a cómo se incrementan a y b en cada paso 😏.

3. Curso C++: Funciones I - Declaración y Definición

3. Curso C++: Funciones I - Declaración y Definición

Las funciones en C++ son un conjunto de instrucciones que realizan una tarea específica. En general, toman ciertos valores de entrada, llamados parámetros, y proporcionan un valor de salida o valor de retorno. En C++, tanto los parámetros como el valor de retorno son opcionales, pero comprender el concepto de las funciones es esencial para escribir código modular y reutilizable.

Las funciones son fundamentales en C++, ya que todos los programas contienen al menos una función: la función main(). Comprender cómo funcionan las funciones es crucial para escribir código eficiente. Vamos a explorar cómo se declaran y se definen las funciones en un programa C++.

1. Prototipos de Funciones en C++ 📋

En C++, es obligatorio usar prototipos. Un prototipo es una declaración previa de una función que indica al compilador qué esperar. Básicamente, es la estructura de la función sin el cuerpo y termina con un punto y coma (;). Los prototipos permiten que el compilador valide llamadas a funciones antes de que estas se definan.

Estructura de un Prototipo de Función:

[tipo de almacenamiento] <tipo_valor_retorno> <nombre_función>(<lista_parámetros>);
  • Tipo de almacenamiento: Puede ser extern o static. Si no se especifica, será extern por defecto. Por el momento, solo usaremos funciones extern.

  • Tipo de valor de retorno: Define qué tipo de dato devolverá la función. Si no devuelve nada, usamos void.

  • Nombre de la función: Debe ser descriptivo. Es buena práctica usar nombres claros como BuscaTelefono o calculaPromedio, lo que facilita la lectura del código.

  • Lista de parámetros: Son los valores de entrada. Pueden ser variables de cualquier tipo y se separan con comas. Si no hay parámetros, se usan paréntesis vacíos: func().

Ejemplo de Prototipo de Función:

int Mayor(int a, int b);

Este prototipo indica que la función Mayor aceptará dos enteros como parámetros y devolverá un entero.

Nota: Los nombres de los parámetros son opcionales en el prototipo, pero agregarlos mejora la comprensión del código.

2. Definición de Funciones en C++ ✍️

Después de declarar una función, debemos definirla, es decir, proporcionar el cuerpo de la función con las instrucciones que se ejecutarán cuando la función sea llamada.

Sintaxis de una Definición de Función en C++:

[tipo de almacenamiento] <tipo_valor_retorno> <nombre_función>(<lista_parámetros>) {
  // Cuerpo de la función
  [sentencias]
}
  • Tipo de almacenamiento: Igual que en el prototipo (extern o static).

  • Cuerpo de la función: Las instrucciones que ejecutará la función.

Ejemplo de Definición de Función:

int Mayor(int a, int b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}

En este ejemplo, la función Mayor toma dos enteros y devuelve el mayor de ambos.

3. La Función main() en C++ 🏁

La función main() es especial porque es el punto de entrada de cualquier programa en C++. Su definición siempre debe existir para que el programa pueda ejecutarse correctamente.

Ejemplo de Función main() en C++:

int main() {
  // Código principal
  return 0; // Indica que el programa terminó correctamente
}

El valor 0 indica que el programa finalizó sin errores. Otros valores se usan para indicar errores específicos.

4. Prototipos vs. Definiciones en C++ ⚖️

  • Prototipos: Son útiles para indicar al compilador la existencia de una función antes de su uso. Permiten definir el flujo del programa sin importar el orden de las funciones en el código.

  • Definiciones: Son la implementación real de la función. Deben proporcionar el cuerpo con el código que realiza la tarea.

En C++, los prototipos de funciones suelen ubicarse al principio del archivo o en ficheros de cabecera (.h), que luego se incluyen con #include.

5. Ejemplo Completo de un Programa en C++ 🖥️

#include <iostream>

// Prototipo de función
int Mayor(int a, int b);

int main() {
  int x = 5;
  int y = 10;
  int resultado = Mayor(x, y);
  std::cout << "El mayor es: " << resultado << std::endl;
  return 0;
}

// Definición de la función
int Mayor(int a, int b) {
  return (a > b) ? a : b;
}

En este programa, el prototipo de la función Mayor se declara antes de main(), y luego se define al final. Esto asegura que el compilador conozca la función cuando se usa en main().

6. Resumen Rápido sobre Funciones en C++ 📜

  • Prototipo: Declara la función e indica al compilador qué esperar.

  • Definición: Implementa la función y contiene el código ejecutable.

  • main(): Punto de entrada de cualquier programa en C++.

7. Desafío Práctico sobre Funciones en C++ 🚀

Escribe una función llamada Menor que tome dos números enteros y devuelva el menor de los dos. Declara el prototipo al principio del archivo y luego define la función después de main(). ¿Podés hacerlo? 😊

2. Curso C++: Tipos de Variables - Introducción Completa

2. Curso C++: Tipos de Variables - Introducción Completa

Conceptualmente, desde el punto de vista de un programador, una variable es una entidad cuyo valor puede cambiar a lo largo de la ejecución de un programa.

A nivel más bajo, una variable se almacena en la memoria del ordenador. Esa memoria puede estar compuesta de semiconductores, ciertos campos magnéticos en la superficie de un disco, polarizaciones en una memoria de ferrita, o cualquier otra tecnología que esté por venir. Por suerte, no necesitamos preocuparnos por esos detalles tan técnicos. Lo importante es saber que la información se almacena en forma binaria. El tipo de variable es lo que nos permite definir cómo interpretar esa información binaria.

En un nivel más lógico, una variable ocupa un espacio de memoria reservado para contener sus valores durante la ejecución del programa. Cada variable debe tener un tipo, y ese tipo determina tanto el tamaño del espacio de memoria como la manera en que se manipula la información.

En este capítulo, veremos los tipos fundamentales: void, char, int, float, double, y en C++ también el tipo bool. Además, existen modificadores como short, long, signed, y unsigned, que permiten ajustar ciertas propiedades de los tipos. También aprenderemos sobre los tipos enumerados, enum.

1. Sintaxis y Tipos de Variables

A partir de ahora, mostraremos las definiciones de la sintaxis para las diferentes sentencias en C++. Esto nos ayudará a entender las opciones, las partes obligatorias y opcionales, y dónde colocar los identificadores.

Ejemplo de Sintaxis para Declarar una Variable char:

[signed | unsigned] char <identificador>[, <identificador2>, ...];
  • Se puede usar signed o unsigned, o ninguna de las dos (en cuyo caso, se asume signed por defecto).

  • Luego de char debe escribirse un identificador que será el nombre de la variable.

  • Opcionalmente, podemos declarar más variables del mismo tipo separándolas con comas.

  • Finalmente, la declaración termina con un punto y coma (;).

Reglas para Crear Identificadores:

  • Solo se pueden usar letras, números y ciertos caracteres como el guion bajo (_).

  • El primer carácter no puede ser un número.

  • C++ distingue entre mayúsculas y minúsculas, así que numero y Numero son diferentes.

  • Las palabras reservadas de C++ (como char, int, float, etc.) no se pueden usar como identificadores.

Ejemplos de Declaración de Variables Válidas:

signed char cuenta, cuenta2, total;
unsigned char letras;
char caracter, inicial, respuesta;
signed char _letra;

2. Tipos Fundamentales de Variables

Veamos los tipos fundamentales uno por uno y cómo afectan los modificadores.

Tipo char o Carácter

El tipo char almacena un solo carácter, ya sea una letra, un dígito o un signo de puntuación. Ocupa 1 byte en memoria y puede ser signed (valores entre -128 y 127) o unsigned (valores entre 0 y 255).

Este tipo de variable también se puede usar para almacenar números pequeños debido a la correspondencia entre números y caracteres definida por el código ASCII.

Ejemplo de Declaración:

char letra = 'A';
unsigned char numero = 65;

Tipo int o Entero

Las variables int almacenan números enteros. Pueden ser short, long, o incluso long long, dependiendo del tamaño del valor que necesitemos almacenar. Los modificadores signed y unsigned también se aplican aquí.

Ejemplos:

int numero = 100;
unsigned long int cantidad = 1000000;
short int edad = 25;

Estas variables son ideales para almacenar valores enteros que no tienen decimales, como edades o cantidades.

Tipo float o Coma Flotante

Las variables float almacenan números reales con decimales. Utilizan un formato de mantisa y exponente para representar números muy grandes o muy pequeños. Sacrifican precisión para representar un mayor rango de valores.

Ejemplo:

float temperatura = 36.6;

Este tipo de variable es útil para representar valores con decimales, como temperaturas o tasas de cambio.

Tipo double o Coma Flotante de Doble Precisión

Las variables double también almacenan números reales, pero con mayor precisión que float. Utilizan más memoria y se prefieren cuando la precisión es importante.

Ejemplo:

double distancia = 1234567.89;

Tipo bool o Booleano

Las variables bool solo pueden tener dos valores: true o false. Se utilizan para almacenar respuestas lógicas o evaluar condiciones.

Ejemplo:

bool esMayor = true;

Este tipo es muy útil para manejar condiciones y lógica de control.

Tipo void o Sin Tipo

El tipo void indica ausencia de tipo. No se puede usar para declarar variables, pero se usa para funciones que no devuelven un valor.

Tipo enum o Enumerado

El tipo enum permite definir conjuntos de constantes enteras. Las variables de tipo enum solo pueden tomar valores predefinidos dentro de su dominio.

Ejemplo de Declaración:

enum Dia { Lunes, Martes, Miercoles, Jueves, Viernes };
Dia hoy = Miercoles;

3. Desafío Práctico 🚀

Declara una variable de cada tipo que hemos visto en este capítulo e inicialízala con un valor adecuado. ¿Podés hacerlo?

1. Curso C++: Un Pequeño Código para Comenzar

1. Curso C++: Un Pequeño Código para Comenzar

La forma más rápida e interesante de empezar, sin perder potenciales seguidores de este curso, es mediante un ejemplo. Veamos nuestro primer programa en C++ para establecer una base útil que nos ayudará en futuros ejemplos.

int main() {
    int numero;
    numero = 2 + 2;
    return 0;
}

No te preocupes demasiado si no captas todos los detalles de este pequeño programa. Aprovecharemos la ocasión para explicar algunas de las peculiaridades de C++. De hecho, este programa es casi un ejemplo de C puro, y eso es porque C++ incluye a C. En general, un programa escrito en C podrá compilarse utilizando un compilador de C++. Más adelante, veremos las diferencias en detalle.

Iremos repasando el programa, línea a línea:

1. Primera línea: int main()

Se trata de una línea muy especial y la encontrarás en todos los programas en C y C++. Define el comienzo de una función. Todas las funciones en C y C++ toman valores de entrada, llamados parámetros o argumentos, y devuelven un valor de salida o retorno.

  • int nos dice el tipo de valor de retorno de la función. En este caso, es un número entero (integer). La función main siempre devuelve un entero.

  • main es el nombre de la función, y es muy especial, ya que el sistema operativo la llama automáticamente para comenzar la ejecución del programa. Nunca encontraremos en el código una llamada explícita a main().

  • Los paréntesis () indican que main es una función. En este caso, la lista de argumentos está vacía, lo que significa que no tiene parámetros de entrada.

2. Segunda línea: {

Esta llave abre el cuerpo de la función main. Todo lo que está entre { y } forma parte de la definición de la función. Más adelante veremos que las llaves tienen otros usos, pero aquí simplemente indican el inicio del código de la función.

3. Tercera línea: int numero;

Esta es nuestra primera sentencia. Todas las sentencias terminan con un punto y coma (;). Esta en particular es una declaración de variable. Declara una variable llamada numero de tipo int (entero). Al declarar una variable, el compilador reserva un espacio en la memoria para ella, pero no se le asigna ningún valor inicial, lo que significa que puede contener cualquier cosa ("basura") hasta que se le asigne un valor.

4. Quinta línea: numero = 2 + 2;

Esta es una sentencia de asignación. Asigna a la variable numero el valor resultante de la expresión 2 + 2. Después de ejecutar esta línea, numero contendrá el valor 4.

5. Sexta línea: return 0;

return es una palabra reservada que indica que la función debe terminar y devolver un valor. En el caso de main, devolver 0 significa que el programa se ejecutó correctamente. Si el programa retorna un valor distinto de 0, suele indicar que ocurrió un error.

6. Séptima línea: }

Esta es la llave que cierra el cuerpo de la función main. Con esto, terminamos la definición de nuestra función.

Resumen

Aunque este programa suma 2 + 2 correctamente, no muestra ningún resultado ni acepta entradas externas. Es decir, es "inútil" desde una perspectiva práctica, pero es una excelente manera de empezar a familiarizarte con la estructura de un programa en C++.

En los siguientes capítulos, exploraremos conceptos básicos como variables, funciones, y operadores. Con estos conocimientos, podremos crear programas más complejos e interactivos. ¡Paciencia y sigamos aprendiendo! 😊

0. Introducción al Curso C++

0. Introducción al Curso C++

¡Hola lectores! Hoy les traigo un pequeño curso que espero sea de su agrado, especialmente para aquellos que se inician en este maravilloso lenguaje de programación.

He intentado que los ejemplos que ilustran cada capítulo sean compatibles con cualquier versión de compilador. Sin embargo, les cuento que yo he usado el compilador MinGW (Minimalist GNU for Windows), que es una versión para Windows del compilador GCC para Unix y Linux. Este compilador está adaptado para crear programas en Windows, pero cualquier programa que siga el estándar de C++ debería funcionar con este compilador en Windows y Linux.

Para hacer más cómodo el desarrollo de nuestros programas, recomiendo usar un IDE (Entorno de Desarrollo Integrado), como Dev-C++ de Bloodshed o Code::Blocks, ambos perfectos para crear programas en modo consola.

Vale aclarar que los programas de Windows tienen dos modos para interactuar con el usuario:

  • Modo consola: Simula el funcionamiento de una ventana MS-DOS y trabaja en modo de texto. En este modo, la ventana funciona como una especie de tabla donde cada casilla puede contener un solo carácter. No permite usar gráficos de alta resolución, pero esto no representa una gran pérdida para nosotros, ya que C y C++ no incluyen por defecto herramientas para trabajar con gráficos. Esto se logra mediante bibliotecas externas.

  • Modo GUI (Interfaz Gráfica de Usuario): Este es el modo tradicional de los programas de Windows, con ventanas, menús, íconos, etc. La creación de este tipo de programas se explica en otro curso, y requiere conocimientos sobre la biblioteca de funciones WinAPI32.

Para quienes trabajan en otros entornos, como Linux, Unix o Mac, el entorno Dev-C++ no será compatible, ya que está diseñado para Windows. Sin embargo, todos los sistemas operativos cuentan con compiladores de C++ que soportan la norma ANSI, que es el estándar que buscaremos seguir para garantizar la compatibilidad de nuestros programas en cualquier sistema operativo.

Compiladores y la Norma ANSI

El ANSI define un conjunto de reglas que cualquier compilador de C o C++ debe cumplir para ser considerado como tal. Estas reglas determinan cómo deben comportarse las palabras reservadas, los elementos del lenguaje y las funciones externas incluidas. Si un programa está escrito siguiendo el estándar ANSI, debería poder compilarse en cualquier compilador que cumpla con esta norma.

Aunque todos los compiladores suelen incluir características adicionales no estándar (como bibliotecas gráficas), mientras no usemos esas funcionalidades, nuestros programas serán portables, es decir, funcionarán en cualquier ordenador y sistema operativo.

Proceso de Obtención de un Programa Ejecutable

Probablemente sea un buen momento para explicar cómo se obtiene un fichero ejecutable a partir de un programa C++.

Código Fuente y Fichero Fuente

Los programas en C y C++ se escriben con la ayuda de un editor de textos, como si fuera un documento cualquiera. Estos ficheros que contienen el código del programa se conocen como ficheros fuente, y el texto en su interior es el código fuente. Nosotros siempre escribiremos programas fuente y los guardaremos en ficheros fuente.

Compiladores vs. Intérpretes

C y C++ son lenguajes compilados, no interpretados. La diferencia entre ambos enfoques es importante:

  • En un lenguaje interpretado, como BASIC o Java, el programa fuente es procesado por un intérprete que traduce y ejecuta el programa en tiempo real, línea a línea.

  • En los lenguajes compilados, el código fuente se traduce una sola vez, generando un fichero ejecutable que puede correr de forma autónoma sin necesidad del compilador.

Los lenguajes compilados tienden a ser más rápidos y requieren menos recursos que los lenguajes interpretados, ya que el proceso de traducción ocurre sólo una vez.

Ficheros Objeto y Bibliotecas

Cuando compilamos un programa, el compilador genera un fichero objeto, que es una traducción del código fuente en un formato comprensible para el ordenador. Para que el programa sea ejecutable, este fichero objeto debe ser combinado con otras bibliotecas (que contienen código reutilizable, como funciones para leer el teclado o escribir en pantalla) mediante un proceso conocido como enlazado.

El enlazador es el programa encargado de unir todos los ficheros objeto y las bibliotecas necesarias para crear un fichero ejecutable.

Errores Comunes en Programación C++

Durante el proceso de creación de programas, es normal cometer errores. Estos errores se dividen en varias categorías:

  • Errores de sintaxis: Ocurren cuando escribimos mal alguna parte del código fuente. Estos errores se detectan durante la fase de compilación.

  • Avisos (warnings): Son errores menores que no impiden la generación del código objeto, pero deben ser corregidos para evitar comportamientos inesperados.

  • Errores de enlazado: Suceden cuando faltan definiciones de funciones o variables que deberían estar en los ficheros objeto o bibliotecas.

  • Errores de ejecución: Se producen cuando el programa se ejecuta, a veces provocando que termine bruscamente. Estos errores son más difíciles de detectar y corregir.

  • Errores de diseño: Los más difíciles de evitar, ya que ocurren debido a fallos en el enfoque o la lógica del programa.