2 Conceptos Basicos CPP
2 Conceptos Basicos CPP
#include <iostream>
#include <iostream>
using namespace std;
int main(){
int main(){
std::cout << "Hello, World!" << std::endl;
cout << "Hello, World!" << endl;
return 0;
return 0;
} 3
}
Entrada y Salida de Datos (cont’d)
La entrada de información por el #include <iostream>
usuario se hace por medio de cin y el #include <string>
controlador de flujo >>. using namespace std;
variable name que es tipo string. cout << "Ingrese su nombre: ";
cin >> name;
Al ingresar el nombre y presionar cout << "Ingrese su nombre completo: ";
enter, este queda en el buffer de cin >> ws; // Elimina los whitespaces del buffer
lectura y cuando se usa nuevamente getline(cin, fullName);
cin, este leerá el enter como fin de los cout << "Hola, " << name << "!" << endl;
datos ingresados en getline. cout << "Tu nombre completo es: " << fullName << endl;
127. b es +, c es +, d es +, e es +, f es +
El tamaño del char es: 1 7
La variable tipo char (cont’d)
• Existen los denominados “caracteres no gráficos”, los cuales son utilizados
para interpretar caracteres especiales, por ejemplo:
Carácter Representación en ASCII Valor en ASCII Secuencia de Escape
Nueva línea NL 10 \n
Tab horizontal HT 9 \t
Retroceso BS 8 \b
Retornar CR 13 \r
Signo de pregunta ? 63 \?
Comillas simples ‘ 39 \’
Comillas dobles “ 34 \”
Número octal ooo --- \ooo
Número hexadecimal hhh --- \xhhh
Carácter NULL NUL 0 \0
variable signada, hará std::cout << "b es " << b << ", c es " << c << ", d es " << d <<
overflow (ver variable “d”). std::endl;
std::cout << "El tamaño del long long es: " << sizeof(long
long) << std::endl;
• Las variables __intxx son de
Microsoft, no son return 0;
}
reconocidas en todos los
sistema operativo. Utilizar b es 2.084.799, c es 10, d es -32768
sus equivalentes para Linux. El tamaño del long long es: 8
10
Las variables de punto flotante
• Las variables de punto flotante tratan de interpretar los números reales.
• En C++ existen:
o float: precisión simple con 32 bits, 8 bits en exponente y 23 bits en mantisa.
o double: precisión doble con 64 bits, 11 bits en exponente y 52 bits en
mantisa.
o long double: precisión cuádruple con 128 bits, 15 en exponente y 112 en
mantisa.
int main(){
long double value = 3.1415926535897932384626433832795;
cout << "El valor es: " << setprecision(30) << value << endl;
// El valor es: 3.14159265358979311599796346854
return 0;
}
𝑖=1
donde:
o S es el valor del bit de signo (1 o 0)
o e es el número de bits en el exponente (8, 11 o 15)
o 𝐸𝑖 es el valor de cada bit en el exponente (1 o 0)
o m es el número de bits en la mantisa (23, 52 o 112)
o 𝑀𝑖 es el valor de cada bit en la mantisa (1 o 0)
• Esto implica que hay ciertos números que no se podrán obtener exactamente.
13
Las variables de punto flotante (cont’d)
En el simple caso de utilizar #include <iostream>
una variable tipo float: #include <iomanip>
using namespace std;
int main(){
float x = 1.0;
x = x - 0.9; // Es “x” igual a 0.1?
cout << "El valor de x es: " << x << endl;
cout << "El valor de x es: " << setprecision(30) << x << endl;
Este casting es más seguro dado que tiene verificación de tipo de dato.
#include <iostream>
int main() {
int n = 10; // En hexa es: 0xA
// Con el cast tradicional, compila y muestra 0xa
void* ptr = (void*)n; // Define posiciones de memoria con valores int
std::cout << ptr << std::endl;
return 0;
} 17
Múltiples Entradas de Datos
• Anteriormente se vió que los datos pueden ser ingresados de a uno.
• Tener en cuenta que se aceptan distintos tipos de datos que pueden producir
comportamiento no esperado si no se considera su tipo.
#include <iostream>
#include <typeinfo>
int main(){
char c = ‘a’; int i = 0; double d = 0.0;
std::cout << "Ingrese un carácter, un entero y una variable tipo double (separados por espacios): ";
std::cin >> c >> i >> d;
std::cout << "Usted ingreso: " << c << ", " << i << ", " << "y " << d << std::endl;
std::cout << "Tipo de dato de c: " << std::typeid(c).name() << std::endl;
std::cout << "Tipo de dato de i: " << std::typeid(i).name() << std::endl;
std::cout << "Tipo de dato de d: " << std::typeid(d).name() << std::endl;
return 0;
} 18
Arrays
• Se trata de un conjunto de datos ordenados por un índice que posee una
cantidad de elementos fija y no puede ser cambiada en tiempo de ejecución.
• Al igual que en C, el índice indica el desplazamiento de la posición inicial, es
decir, el índice inicia en cero.
• Hay distintas formas de declarar un array:
int myArr[4] = {2, 3, 6, 1};
int myArr2[4] = {2};
int myArr3[] = {10, -8, 13, 17};
19
Arrays (cont’d)
• Otra forma de declarar un array es definiendo su longitud pero sin hacerle una
asignación:
char myStr[20];
• Es importante tener en cuenta que cin, por default, solo lee datos hasta el
primer dato tipo whitecharacter (espacio, tab, enter, etc).
20
Matrices y Arrays Multidimensionales
• Son estructuras de tamaño fijo y su asignación es similar a la de los arrays.
• Tener en cuenta que los índices comienzan desde cero.
#include <iostream>
int main(){
int myMtx[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
std::cout << myMtx[2][0] << std::endl; // Imprime el valor 7
std::cout << myMtx[1][1] << std::endl; // Imprime el valor 5
std::cout << myMtx[3][2] << std::endl; // Imprime el valor 12
return 0;
}
int main(){
std::string s;
std::string s1 = "Hello "; El código imprime:
std::string s2 = "World";
char c = '!';
s = s1;
s += s2; // Lo mismo que hacer s = s1 + s2
Hello World!
s += c; // También permite concatenar chars
std::cout << s << std::endl;
return 0;
} 22
std::string (cont’d)
• Esta clase posee distintas funciones que le permiten realizar distintas tareas:
o s.at(i): permite acceder el carácter i-esimo del string ‘s’
o s1 == s2: compara el contenido de los dos strings ‘s1’ y ‘s2’.
o s.c_str(): retorna un puntero a su primer elemento. Esta este puntero
permite utilizar el string ‘s’ como un array de chars, es útil cuando una
función requiere que se le pase un puntero a char y no un string.
o s.substr(x, y): retorna un std:string de ‘s’ que comienza en la posición x y
tiene una longitud y.
o s.find(): busca un substring en ‘s’. Si se encuentra, retorna la primer
posición de la primer ocurrencia de la substring. Si no encuentra la
substring, se retorna el valor std::string::npos.
23
Enum y class Enum
• Los enum funcionan en forma similar al lenguaje C.
• Con class, se evitan conflictos con los nombres al utilizar la referencia.
• El siguiente código imprime los valores 8 (mes de julio) y 2 (nombre Julio).
#include <iostream>
int main(){
enum class Meses {ENERO=2, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO,
AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE};
// Si Nombres no fuera class, habria conflicto por JULIO
enum class Nombres {CERGIO, JUAN, JULIO};
#include <iostream> cout << "La variable a es tipo: " << typeid(a).name() << endl;
using namespace std; cout << "La variable f es tipo: " << typeid(f).name() << endl;
cout << "La variable g es tipo: " << typeid(g).name() << endl;
int func1 (){return 1;} cout << "El valor de g es: " << g << endl;
Ejemplo:
#include <iostream>
Int main(){
int x = 1, y = 1;
std::cout << x++ * y++ << std::endl; // imprime 1, pero serán x = 2 e y = 2 (1*1)
std::cout << x++ * ++y << std::endl; // imprime 6, pero serán x = 3 e y = 3 (2*3)
std::cout << --x * y++ << std::endl; // imprime 6, pero serán x = 2 e y = 4 (2*3)
std::cout << x-- * --y << std::endl; // imprime 6, pero serán x = 1 e y = 3 (2*3)
std::cout << x * y << std::endl; // imprime 3, con serán x = 1 e y = 3 (1*3)
return 0;
} 27
Sentencia Condicional
• El operador ternario: Condición ? Expresión 1 : Expresión 2
Si la condición es verdadera, la expresión 1 es ejecutada, sino, la expresión 2.
• La condición a verificar se escribe mediante los operadores lógicos.
Operador Asociatividad
Operador Operación
() Izquierda a derecha
&& AND
++, --, !, +, -, (cast), sizeof Derecha a izquierda
|| OR
*, /, % Izquierda a derecha
! Negación
+, - Izquierda a derecha
< Menor que
<, <=, >, >= Izquierda a derecha
> Mayor que
==, != Izquierda a derecha
== Igual a
&& Izquierda a derecha
<= Menor o igual a
|| Izquierda a derecha
>= Mayor o igual a
?: Derecha a izquierda
!= No es igual a
=, +=, -=, *=, /= Derecha a izquierda 28
Sentencia Condicional – if / else
• Las sentencias if/else se utilizan como en el caso de C.
• Los casos de if/else pueden ser apilados y anidados:
if/else apilados: If/else anidados:
if (condicion1){ if (condicion1){
...; if (condicion2){
} else { ...;
...; } else
if (condicion2){ ...;
...; }
} else { else {
...; ...;
} } 29
La sentencia switch
• El switch también es utilizado #include <iostream>
using namespace std;
en forma similar a C, solo que enum class COLORES : unit8_t { ROJO, VERDE, AZUL };
en C++ se pueden utilizar
int main() {
también los enum class. COLORES colorAuto = COLORES::ROJO;
sentancia1 ; sentancia1 ;
sentancia2 ; sentancia2 ;
while (condición){ do {
sentencia3; sentencia3;
⋮ ⋮
sentenciaN; sentenciaN;
} } while (condición)
31
Sentencias de Iteración - for
• El for funciona en forma similar a como funciona en el leguaje C.
• Las expresiones 1 a 2 permiten definir y modificar una variable que se puede
evaluar en la condición para continuar la iteración.
sentancia1 ;
sentancia2 ;
int N = 10;
for (expresión1; condición; expresión3){
for (int i=0; i<N; i++){
sentencia3;
std::cout << i << std::endl;
⋮
}
sentenciaN;
}
32
El for basado en rango
• Este for permite iterar sobre rangos de variables como ser un array, un
std::vector, o algún otro container.
• Usualmente el tipo de elemento se define como auto y lo que recorre es el
contenido del contenedor.
<definición de container>
for (tipo de elemento : container){
sentencia1;
⋮
sentenciaN;
}
33
El for basado en rango - Ejemplos
#include <iostream>
#include <array>
int main(){
std::array<int, 6> v = { 0, 1, 2, 3, 4, 5 }; // definición de std::array
int a[] = {0, 1, 2, 3, 4, 5};
return 0;
}
34
Las sentencias break y continue
• La sentencia break interrumpe la iteración saliendo del ciclo de iteraciones.
• La sentencia continue interrumpe la iteración actual, pero continua con el ciclo
de iteraciones.
#include <iostream> Resultado con continue Resultado con break
La excepción por throw mensaje, es un tipo std::cout << "El program continua..." << std::endl;
texto dado por una cadena de caracteres. return 0;
}
36
Try / Catch y Throw
• Se pueden esperar distintos tipos de errores en una parte del código.
39
Funciones - Recursión
• Funciones recursivas son funciones que se llaman a si mismas.
#include <iostream>
• El concepto es reducir un problema en
problemas más pequeños y similares al int nPower(int base, int exponent);
problema original.
int main() {
int x = 3, exp = 4;
• Cada llamada a la función utiliza std::cout << nPower(x, exp) << std::endl;
recursos, pudiendo generar problemas return 0;
de performance. }
46
El calificador constexpr y consteval
return 0; return 0;
} }
Libraries
Temp.
.cpp Preprocessing Compiler .o
file
Executable
Linker
.cpp File
Temp.
Preprocessing Compiler .o
file
.h Runtime
Libraries
51
#include
Este comando permite incluir el contenido del archivo indicado, el cual puede ser
un standard de C/C++ o un archivo definido por el usuario. Prácticamente se
puede considerar que el comando es reemplazado con el contenido del archivo.
#include <file>
Cuando se utilizan los símbolos “<>”, el preprocesador buscará los archivos en un
directorio predeterminado (standard include directories) para acceder los header
solicitados.
#include “file.h”
Cuando se utilizan comillas, el preprocesador buscará el archivo header a incluir
en el directorio del proyecto. No obstante, se puede cambiar la ubicación del
archivo agregándole el path.
52
#define
Este comando permite definir macros y constante que son reemplazados en
tiempo de compilación:
Ejemplos:
53
#undef
• Este comando se utiliza para cancelar la definición de una macro previamente
definida mediante #define.
• En caso de que el comando #undef se utilice con una macro que no exista,
este será ignorado y no se observará un error.
#include <iostream>
#define PI 3.14159
#undef PI
return 0;
}
54
Instrucciones Condicionales
• #if, #elif, #else y #endif - Permite incluir o excluir código basado en la
condición provista:
#define FEATURE_1 1 // El feature 1 fue implementado
#define TESTS_FEATURE_1 1 // El feature 1 paso las pruebas
#define FEATURE_2 1 // El feature 2 fue implementado
#define TESTS_FEATURE_2 0 // El feature 2 no paso las pruebas
#if !TESTS_FEATURE_2
std::cout << “El feature 2 no pasó las pruebas " << std::endl;
#elif FEATURE_2
std::cout << “Feature 2 esta habilitado para su instalación" << std::endl;
#endif 55
Instrucciones Condicionales (cont’d)
• #ifdef, #ifndef, #elifdef (C++23) y #elifndef (C++23) - Permite incluir o excluir
código basado en que un macro esté (#ifdef) o no esté (#ifndef – if not defined)
definido:
#define MIN_VELOC 100
#define MAX_VELOC 200
#define MIN_VELOC 100
#ifndef MAX_VELOC
#define MAX_VELOC 200
#define MAX_VELOC 150
#elifdef MIN_VELOC
#ifdef MIN_VELOC
#undef MIN_VELOC
std::cout << “Hay una velocidad mínima" << std::endl;
#def MIN_VELOC 120
#elifndef MAX_VELOC
std::cout << “No hay limites de velocidad" << std::endl;
#enfif
#endif
// Si no está definida MAX_VELOC definirla. Si
está definida eliminar definición de MIN_VEL y
definirla nuevamente como 120.
56
#error
Este comando se utiliza para generar un error de compilación con un mensaje
definido por el programador.
#define MAIN_FEATURE 1
#if MAIN_FEATURE
std::cout << “El feature principal esta habilitado" << std::endl;
#else
#error “El feature principal no esta habilitado para las pruebas”
#endif
57
#line
Se utiliza para modifica el número de linear y el nombre del archivo que reporta el
preprocesador y el compilador.
Se utiliza con código generado automáticamente para poder facilitar su
debugging.
void my_funct() {
⋮ // líneas de código generado automáticamente
int main() {
my_funct();
return 0;
}
58
#pragma
Esta es una directiva que se usa para proveer instrucciones especiales al
compilador, las cuales suelen ser especificas del compilador.
Se utiliza para asegurar que un determinado archivo header sea incluido una
única vez en la compilación.
Este comando evita que ocurran problemas por multiples inclusiones del mismo
header file.
59
Los Operadores # y ##
• El operador # remplaza el texto con el mismo texto pero entre comillas.
#include <iostream>
#include <iostream>
#define concat(a, b) a ## b
#define QUOTMRK( x ) #x
int main() {
int main () {
int xy = 100;
std::cout << QUOTMRK(HOLA C++) << std::endl;
std::cout << concat(x, y) << std::endl;
return 0;
return 0;
}
}
61