Skip to main content

#Mastery01 - Ability to create C++ file and run from command line

2 min read

 

Crear y correr un archivo de C++

Una línea de comandos es un tipo de interfaz el cual se usa para manipular un programa o sistema operativo mediante instrucciones escritas.

En mi caso, por recomendacion, mi CLI es cygwin. Entonces, para correr un archivo de C++ debemos seguir los siguientes pasos:

Abrir el programa en el cual escribiremos el código ( sublime text 2 ).

Una vez que abrimos el programa empezaremos nuestro codigo con el usual , seguido por nuestro código.

Una vez terminado seleccionaremos la opcion "file" y "save".

Surgira una ventana donde le asignaremos el nombre y lugar donde lo guardaremos. 

Es importante que al final de nuestro nombre debemos ponerle la extencion ".cpp".

Ya teniendo el codigo hecho procederemos a ejecutarlo en la linea de codigo para ejecutarlo estos son los pasos:

1- Abriremos el programa cygwin.

2- Una vez que la ventana esta abierta debemos escribir los siguientes comandos:

 

  • cd cygdrive/
  • cd c/
  • cd users/
  • cd (nombre del usuario) /
  • Enseguida comenzaremos a escribir el mismo comando "cd" seguido de la carpeta donde guardamos nuestro archivo, por ejemplo cd desktop/  

 

3- Una vez que nos encontramos en la carpeta donde guardamos el programa debemos escribir g++ seguido del nombre de nuestro programa junto con ".cpp" y presionamos enter.

4- Esperaremos un par de segundos antes de que vuelva a aparecer los comandos que ya habiamos escrito antes. Si no existe ningun error debemos escribir "./a.out" y presionaremos enter.

5- Finalmente el programa comenzara a ejecutar nuestro código.

 

 

#Mastery17 - Use of “switch” as a conditional

2 min read

Uso del switch

En el caso de la sentencia switch, la expresión a evaluar será entera, por lo tanto, el número de opciones es mucho mayor, y en consecuencia, también es mayor el número de diferentes sentencias que se pueden ejecutar.

Sintaxis:

switch (<expresión entera>) 
{
   [case <expresión_constante1>: [<sentencias1>] break;]
   [case <expresión_constante2>: [<sentencias2>] break;]
   ...
   [case <expresión_constanten>: [<sentenciasn>] break;]
   [default : [<sentencia>] break;]
}

Cuando se usa la sentencia switch el control se transfiere al punto etiquetado con el case cuya expresión constante coincida con el valor de la expresión entera evaluada dentro del switch. A partir de ese punto todas las sentencias serán ejecutadas hasta el final del switch, es decir hasta llegar al "}".

Esto es así porque las etiquetas sólo marcan los puntos de entrada después de una ruptura de la secuencia de ejecución, pero no marcan los puntos de salida.

Esta estructura está diseñada para ejecutar cierta secuencia de instrucciones, empezando a partir de un punto diferente, en función de un valor entero y dejando sin ejecutar las anteriores a ese punto.

Ejemplo:

 

      main() {
        char ch;
          printf("Introduzca una vocal: "); 

 

          ch=getchar(); 

 

        switch(ch) {
          case 'a':
          cout << "Se ha pulsado una a." <<endl;
            break;
          case 'e':
                    cout << "Se ha pulsado una e." <<endl;
            break;
          case 'i': 
            cout << "Se ha pulsado una i." <<endl;
            break;
          case 'o': 
            cout << "Se ha pulsado una o." <<endl;
            break;
          case 'u': 
            cout << "Se ha pulsado una u." <<endl;
            break;
          default: puts("Error");
        }
    }

 

Referencia: http://c.conclase.net/curso/?cap=005c#Se_switch

#Mastery09 - Basic types and their use in C++

2 min read

Tipos de variables usados en C++

Existen varios tipos de variables, y cada uno corresponde a un tamaño máximo de un número, un carácter o incluso una verdad. Cuanto mayor sea el número que pueda admitir, mas espacio en memoria ocupará.

1. Los tipos de variables

Existen varios tipos de variables, y cada uno corresponde a un tamaño máximo de un número, un carácter o incluso una verdad. Cuanto mayor sea el número que pueda admitir, mas espacio en memoria ocupará. 

Bool:  1 byte de memoria, valores: true o false

Char:  1 byte de memoria, permite almacenar un carácter, valores; 256 caracteres. 

Int: 4 bytes de memoria, valores: de -2 147 483 648 a 2 147 483 647

Double: 8 bytes de memoria, valores: de 2.2e-308 a 3.4e-38

Float: 4 bytes de memoria, valores: de 1.2e-308 a 3.4e-38

String: permite almacenar cadena de caracteres

 

2. Declaración y asignación de variables

Para declarar una variable, basta con indicar su tipo y su nombre. Existen ciertas convenciones en cuanto al nombre de las variables. Algunos prefieren separar las partes de un nombre con '_', otros prefieren escribir una mayúscula para separarlas. Ejemplo: 

int primerNumero;

int primer_numer

 

3. Asignar un valor

Es posible asignar un valor a una variable al momento de declararla: 

int numero =  20; 

También es posible declarar varias variables en una misma línea, pero en este caso, todas las variables de la línea tendrán el mismo tipo. 

int numero_uno = 23, numero_dos = 45;

 

Referencias:  http://es.kioskea.net/faq/3169-las-variables-en-c

#Mastery14 - Creating your own and using C++ libraries

1 min read

Creación y uso de librerias en C++ 

Una de las ventajas de C++ es la facilidad de poder crear tus propias librerias, estas se pueden crear para definir variables con un significado mas especifico.

El ultimo caso que use fue el de la libreria:, esta libreria te permite utilizar el nombre de una variable y darle algun uso segun nuestras necesidades.

Por ejemplo:

GREEN "\033[32m" 

PURPLE "\033[35m"

BLUE "\033[34m" 

 

Para aprender mas acerca de la creación de librerias pueden consultar los siguientes enlaces:

Libreria estatica   Libreria dinamica

 

#Mastery13 - Importing and using C++ libraries

2 min read

Uso de librerias en C++

Una librería es un conjunto de recursos (algoritmos) prefabricados, que pueden ser utilizados por el programador para realizar determinadas operaciones. Las declaraciones de las funciones utilizadas en estas librerías, junto con algunas macros y constantes predefinidas que facilitan su utilización, se agrupan en ficheros de nombres conocidos que suelen encontrarse en sitios predefinidos. 

Los compiladores C++ incluyen un amplio repertorio de clases, funciones y macros que permiten realizar una amplia variedad de tareas, incluyendo entradas/salidas de bajo y alto nivel; manipulación de cadenas alfanuméricas y ficheros; control de procesos (incluyendo multiproceso); manejo de memoria; cálculos matemáticos y un largo etcétera.

Este repertorio de recursos es denominado colectivamente como "Rutinas de librería" o simplemente "librerias". 
Puede decirse que el lenguaje aislado no tiene prácticamente ninguna utilidad sin la concurrencia de estas utilidades. El Estándar C++ las clasifica según su utilidad:

  • Soporte del lenguaje 
  • Diagnóstico
  • Utilidades generales
  • Cadenas alfanuméricas ("Strings")
  • Localización
  • Contenedores
  • Iteradores
  • Algoritmos
  • Cálculo numérico
  • Entrada/Salida

El proceso para importarlas es muy fácil solamente se debe seguir lo siguiente:

#nombre_de_la_libreria

Referencias: http://www.zator.com/Cpp/E5.htm

 

#Mastery21 - Use of recursion for repetitive algorithms

3 min read

Recursividad 

Una función es recursiva cuando se define en función de si misma, pero no todas la funciones pueden llamarse a si mismas. Deben estar diseñadas especialmente para que sean recursivas, de otro modo podrían conducir a bucles infinitos, o a que el programa termine inadecuadamente.

C++ permite la recursividad. Cada vez que se llama a una función, se crea un juego de variables locales, de este modo, si la función hace una llamada a si misma, se guardan sus variables y parámetros, usando la pila, y la nueva instancia de la función trabajará con su propia copia de las variables locales. Cuando esta segunda instancia de la función retorna, recupera las variables y los parámetros de la pila y continua la ejecución en el punto en que había sido llamada.

Por ejemplo:

Prodríamos crear una función recursiva para calcular el factorial de un número entero.

El factorial se simboliza como n!, se lee como "n factorial", y la definición es:

n! = n * (n-1) * (n-2) * ... * 1

Para este ejemplo no es posible calcular el factorial de números negativos, no está definido.

Debemos de tomar en cuenta que el factorial de cero es 1. De modo que una función bien hecha para cálculo de factoriales debería incluir un control para esos casos:

/* Función recursiva para cálculo de factoriales */
int factorial(int n) {
   if(n < 0) return 0;
   else if(n > 1) return n*factorial(n-1); /* Recursividad */
   return 1; /* Condición de terminación, n == 1 */
}

La recursividad consume muchos recursos de memoria y tiempo de ejecución, y se debe aplicar a funciones que realmente le saquen partido.

También existen otras formas de implementar algoritmos recursivos, por lo que no es necesario que una función se invoque a si misma.

Ejemplo: un par de funciones A y B pueden crear un algoritmo recursivo si la función A invoca a la función B, y esta a su vez invoca a la función A.

Veamos un ejemplo. Partamos de la siguiente serie:

1 - 1/2 + 1/3 - 1/4 + 1/5 - ... - 1/2*n + 1/2*n+1 - ...

Aqui tenemos otro ejemplo aun mas complejo:

<iostream>

using namespace std;

double par(int);

double impar(int);

double suma(int);

int main() {

    cout << suma(3) << endl;

    cout << suma(13) << endl;

    cout << suma(23) << endl;

    cout << suma(87) << endl;

    cout << suma(250) << endl;

    cout << suma(450) << endl;

    return 0;

}

double suma(int n) {

    if(n % 2) return impar(n);

    else return par(n);

}

double par(int n) {

    return impar(n-1)-1/double(n);

}

double impar(int n) {

    if(n == 1) return 1;

    return par(n-1)+1/double(n);

}

 

Referencias: http://c.conclase.net/curso/?cap=024

#Mastery23 - Creation and use of vectors in C++

4 min read

Creación y uso de vectores en C++

Un vector, también llamado array(arreglo) unidimensional, es una estructura de datos que permite agrupar elementos del mismo tipo y almacenarlos en un solo bloque de memoria juntos, uno despues de otro. A este grupo de elementos se les identifica por un mismo nombre y la posición en la que se encuentran. La primera posición del array es la posición 0.

Podríamos agrupar en un array una serie de elementos de tipo enteros, flotantes, caracteres, objetos, etc.

Crear un vector en C++ es sencillo, seguimos la siguiente sintaxix: Tipo nombre[tamanyo];

Aqui tenemos varios ejemplos:

inta[5]; // Vector de 5 enteros
floatb[5]; // vector de 5 flotantes
Producto product[5]; // vector de 5 objetos de tipo Producto

Otra manera para inicializar el vector en la declaración es la siguiente:

1
2
3
int a[] = {5, 15, 20, 25, 30};
float b[] = {10.5, 20.5, 30.5, 12.5, 50.5}
Producto product[] = {celular, calculadora, camara, ipod, usb}

Debido a que tenemos 5 elementos en cada array, automáticamente se le asignará 5 espacios de memoria a cada vector, pero si trato de crear el vector de la forma int a[] , el compilador mostrará un error, porque no tiene indicado el tamaño del vector ni tampoco sus elementos.

Tambien podemos asignarle valores a los elementos de un vector indicando su posición:

inta[4] = 30; // le asigno el valor 30 a la posición 4 del vector.
product[2].setPrecio(300) // le asigno un precio de 300 al producto en la posición 2.

Algo muy útil para llenar, recorrer e imprimir un vector es el uso de el bucle for:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<iostream>
using namespace std;
 
int main()
{
  int dim;
  cout << "Ingresa la dimension del vector" << endl;
  cin >> dim; // Supongamos que ingrese 10
  int vector[dim]; // mi vector es de tamanyo 10
 
  for(int i = 0; i < dim; i++){
    vector[i] = i * 10;
    cout << vector[i] << endl;
  }
 
  return 0;
}

La salida de este programa nos mostrará: 0 10 20 30 40 50 60 70 80 90.

Enseguida tenemos una función simple para sumar 2 vectores a y b y poner el resultado en un tercer vector c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<iostream>
using namespace std;
 
void sumar(int a[], int b[], int c[],int dim) {
    for (int i = 0; i < dim; i++) {
        c[i] = a[i] + b[i];
    }
}
 
void imprimir(int v[], int dim)
{
   for(int i = 0; i < dim; i++) {
        cout << v[i] << endl;
   }
   cout << endl << endl;
}
 
int main()
{
    int dim;
    cout << "Ingresa la dimensión" << endl;
    cin >> dim;
 
    int a[dim];
    int b[dim];
    int c[dim];
 
    for(int i = 0; i < dim; i++) {
        a[i] = i * 10;
        b[i] = i * 5;
    }
 
    cout << "Vector A " << endl;
    imprimir(a, dim);
 
    cout << "Vector B " << endl;
    imprimir(b, dim);
 
    sumar(a, b, c, dim);
    cout << "Vector C " << endl;
 
    imprimir(c, dim);
    return 0;
}

En resumen:

  • Todo vector debe tener definido un tipo de dato.
  • Todo vector necesita de una dimensión o tamaño.

 

Referencias: https://ronnyml.wordpress.com/2009/07/04/vectores-matrices-y-punteros-en-c/

#Mastery25 - Creation and use of strings in C++

3 min read

Creación y uso de strings en C++

Una de las utiliidades de C++ es la existencia de "strings" (cadenas de texto) como parte del lenguaje.

A continuación veremos su manejo primero con un ejemplo sencillo:

 <string> 
<iostream>
using namespace std
;

main
()
{
string mensaje
;
mensaje
= "Hola";
cout
<< mensaje;
}

 

El manejo básico de las cadenas no presenta alguna dificultad:

  • Se declaran como cualquier otra variable( string cadena )
  • Se les asigna valor con el signo = , como se hace con los números enteros.
  • Su valor se muestra en pantalla con "cout", igual que para las demás variables.

Así que veamos otro ejemplo un poco más complejo: 

 <string> 
15:
<iostream>
16: using namespace std
;
17:
18:
main()
19:
{
20: string texto1
, texto2 = "Hola ", texto3("Que tal");
21:
22: texto1
= texto2 + texto3 + " estas? ";
23: cout
<< texto1 << "\n";
24: string subcadena
(texto1, 2, 6); // 6 letras de texto1, desde la tercera
25:
cout << subcadena << "\n";
26: string subcadena2
;
27: subcadena2
= texto1.substr(0, 5); // 5 letras de texto1, desde el comienzo
28:
texto1.insert(5, "Juan "); // Inserto un texto en la posicion 6
29:
cout << texto1 << "\n";
30: texto2.replace
(1, 2, "ad"); // Cambio 2 letras en la posicion 2
31:
cout << texto2 << "\n";
32: cout
<< "La longitud de texto1 es " << texto1.size() << "\n";
33: cout
<< "La tercera letra de texto1 es " << texto1[2]
34:
<< " o bien " << texto1.at(2) << "\n";
35:
if (texto2 == "Hada ")
36: cout
<< "Texto 2 es Hada\n";
37:
}

La explicación para el código seria la siguiente:

  • Se puede crear una cadena sin valor inicial haciendo string texto1;
  • Se le puede dar una valor inicial a la vez que se declara, haciendo string texto2 = "Hola "; o bien string texto3("Que tal");
  • Se puede crear una cadena formada por varias, concateándolas (sumándolas), usando el signo +, así: texto1 = texto2 + texto3 + " estas? ";
  • Se puede crear una subcadena a partir de un trozo de otra, la vez que se declara, así: string subcadena (texto1, 2, 6);
  • O bien se puede extraer un fragmento posteriormente: texto1.substr(0, 5);
  • Se puede insertar texto en el interior de una cadena: texto1.insert(5, "Juan ");
  • O reemplazar ciertas letras por otras: texto2.replace(1, 2, "ad");
  • Se puede saber el tamaño (cantidad de letras) de la cadena: texto1.size()
  • Se puede acceder a una posición siguiendo el estándar de C: texto1[2]
  • O bien usando la función "at": texto1.at(2)
  • Se puede comprobar el valor de una cadena (el texto almacenado) con ==, así: if (texto2 == "Hada ") ...

 

Referencias: http://www.aprendeaprogramar.com/mod/resource/view.php?id=172

#Mastery26 - Creation and use of matrixes in C++

2 min read

Creación y uso de matrices en C++

La sintaxis de una matriz es C++ es la siguiente:

1
int matrix[rows][cols];

En este ejemplo int es el tipo de dato, matrix es el nombre del todo el conjunto de datos y debo de especificar el numero de filas (rows) y columnas (cols).

Las matrices también pueden ser de distintos tipos de datos como char, float, double, etc. Las matrices en C++ se almacenan al igual que los vectores en posiciones consecutivas de memoria.

Podriamos imaginarnos que una matriz es como un tablero, pero en realidad el manejo es como su definición lo indica, un vector de vectores, es decir, los vectores están uno detrás del otro juntos.

Para acceder a los elementos de la matriz es utilizando su nombre e indicando los 2 subíndices que van en los corchetes.

Si coloco int matriz[2][3] = 10; estoy asignando al cuarto elemento de la tercera fila el valor 10.

Es importante tener en cuenta que tanto filas como columnas se enumeran a partir de 0. Para recorrer una matriz es buena idea hacer uso de un bucle. En este caso usando 2 for:

2
3
4
5
for(int i = 0; i < rows; i++) {
  for(int j = 0; j < cols; j++) {
    matrix[i][j] = i % j;
  }
}

 

 

Para mas información acerca de matrices dinamicas pueden consultar el siguiente enlace: https://ronnyml.wordpress.com/2009/07/04/vectores-matrices-y-punteros-en-c/

 

#Mastery27 - Validated user input in C++

2 min read

Validar inputs de usuario en c++

En C++ tenemos la opcion de validar datos alfanumericos o los llamados strings. Estos inputs se comportan como cualquier número, por lo que su uso no es muy dificil. Primero debemos conocer las reglas básicas:

Reglas basicas:

  • No deje pasar los datos no válidos en adelante
  • Validar los datos en el momento de entrada.
  • Siempre dar la retroalimentación significativa usuario
  • Dígale al usuario lo que usted espera de leer como entrada

Ejemplos:

/* example one, a simple continue statement */
 <stdio.h>
 <ctype.h>

main()
{
	int     valid_input;    /* when 1, data is valid and loop is exited */
	char    user_input;     /* handles user input, single character menu choice */

	valid_input = 0;
	while( valid_input == 0 ) {
		printf("Continue (Y/N)?\n");
		scanf("  %c", &user_input );
		user_input = toupper( user_input );
		if((user_input == 'Y') || (user_input == 'N') )  valid_input = 1;
		else  printf("\007Error: Invalid choice\n");
	}
}
Salida del programa:
Continuar (Y / N) ?
b
Error: eleccion no válida
Continuar (Y / N) ?
N


 

Aqui otro ejemplo:

/* example two, getting and validating choices */
 <stdio.h>
 <ctype.h>

main()
{
	int     exit_flag = 0, valid_choice;
	char    menu_choice;
	
	while( exit_flag == 0 ) {
		valid_choice = 0;
		while( valid_choice == 0 ) {
			printf("\nC = Copy File\nE = Exit\nM = Move File\n");
			printf("Enter choice:\n");
			scanf("   %c", &menu_choice );
			if((menu_choice=='C') || (menu_choice=='E') || (menu_choice=='M'))
				valid_choice = 1;
			else
				printf("\007Error. Invalid menu choice selected.\n");
		}
		switch( menu_choice ) {
			case 'C' : ....................();    break;
			case 'E' : exit_flag = 1;  break;
			case 'M' : ....................();  break;
			default : printf("Error--- Should not occur.\n"); break;
		}
	}
}

Salida del programa 
C = Copiar archivo
E = Salir
M = Mover archivo
Introduzca elección :
x
Error . Opción de menú seleccionada no válida 
C = Copiar archivo
E = Salir
M = Mover archivo
Introduzca elección :
E

 

Referencias: http://ftp.tuwien.ac.at/languages/c/programming-bbrown/c_032.htm