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

#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

#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

#Mastery 28 - Reading and writing of files in C++

8 min read

Manejo de archivos en c++

Para manejar archivos dentro de c++ tenemos que utilizar el archivo de cabecera fstream.h. Este define las clases ifstream, ostream y fstream para poder realizar operaciones de lectura, escritura y lectura/escritura en archivos respectivamente. Para trabajar con archivos se tienen que crear objetos de éstas clases, según las operaciones que deseamos efectuar. Iniciaremos con las operaciones de escritura, para esto tenemos que declarar un objeto de la clase ofstream, después utilizaremos la función miembro open para abrir el archivo, escribimos en el archivo los datos que sean necesarios utilizando el operador de inserción y por último cerramos el archivo por medio de la función miembro close, como podemos ver en el siguiente ejemplo:

 <fstream.h>

int main()
{
    
ofstream archivo;  // objeto de la clase ofstream

    
archivo.open("datos.txt");

    
archivo << "Primera línea de texto" << endl;
    
archivo << "Segunda línea de texto" << endl;
    
archivo << "Última línea de texto" << endl;

    
archivo.close();
    return 
0;

En el programa se ha creado un objeto de la clase ofstream llamado archivo, posteriormente se utiliza la función miembro open para abrir el arcivo especificado en la cadena de texto que se encuentra dentro del paréntesis de la función. Podemos invocar a la función constructora de clase de tal manera que el archivo también se puede abrir utilizando la siguiente instrucción:

 
ofstream archivo("datos.txt");  // constructora de ofstream 



Al utilizar la función constructora no es necesario utilizar la función miembro open. De la misma forma que se utilizan manipuladores de salida para modificar la presentación en pantalla de los datos del programa,es posible utilizar éstos manipuladores al escribir datos en un archivo como lo demuestra el programa archiv02.cpp, observe que se utiliza un constructor para crear y abrir el archivo llamado Datos.txt:

 <iostream.h>
 <fstream.h>
 <iomanip.h>

int main()
{
    
ofstream archivo("Datos.txt");  // constructor de ofstream
    
int numero;
    
    
cout << "Introduzca un numero:" << endl;
    
cin >> numero;
    
archivo << "El valor introducido en base 10 es: " << numero << endl;
    
    
archivo << resetiosflags(ios::dec);
    
archivo << setiosflags(ios::oct);
    
archivo << "en base octal es: " << numero << endl;
    
    
archivo << resetiosflags(ios::oct);
    
archivo << setiosflags(ios::hex);
    
archivo << "y en base hexadecimal es: " << numero << endl;
    
archivo << setiosflags(ios::uppercase|ios::showbase);
    
archivo << "utilizando los manipuladores uppercase y showbase" 
<< 
" el valor es: " << numero << endl;
    
    
archivo << resetiosflags(ios::uppercase|ios::showbase);
    
archivo << resetiosflags(ios::hex);
    
archivo << setiosflags(ios::showpos|ios::showpoint|ios::fixed);
    
archivo << "Utilizando los manipuladores showpos," << " showpoint y fixed: " << (float)numero << endl;
    
    
archivo << resetiosflags(ios::showpos|ios::showpoint|ios::fixed);
    
archivo << "Finalmente el valor es " << numero << endl;
    
    
archivo.close();

    return 
0;

 

Operaciones de lectura de archivos 
Para abrir un archivo y realizar operaciones de lectura se crea un objeto de la clase ifstream y se procede prácticamente de la misma forma que lo expuesto en el apartado anterior. Después de abrir el archivo se puede leer su contenido utilizando las funciones miembro de la clase ifstream o bién el operador de extracción. Cuando se lee un archivo, por lo general se empieza al principio del mismo y se leerá su contenido hasta que se encuentre el final del archivo. Para determinar si se ha llegado al final del archivo se puede utilizar la función miembro eof como condición de un bucle while. Además se puede utilizar la función miembro fail para detectar un error al abrir el archivo, esto se demuestra en el siguiente programa, archiv03.cpp:

 <fstream.h>

int main()
{
    
ifstream archivo("Pruebas.txt"ios::noreplace);
    
char linea[128];
    
long contador 0L;

    if(
archivo.fail())
    
cerr << "Error al abrir el archivo Pruebas.txt" << endl;
    else
    while(!
archivo.eof())
    {
        
archivo.getline(lineasizeof(linea));
        
cout << linea << endl;
        if((++
contador 24)==0)
        {
            
cout << "CONTINUA...";
            
cin.get();
        }
    }
    
archivo.close();
    return 
0;

El programa crea un objeto de la clase ifstream para abrir el archivo llamado Pruebas.txt utilizando el constructor de clase y especificando la bandera ios::noreplace que evita que el archivo sea sobreescrito. Si por algún motivo ocurre un error al abrir el archivo se genera el mensaje de error especificado en la línea 16. En ausencia de errores el programa entra en un bucle while el cual está evaluado por efecto de la función miembro eof( ) de tal manera que el bucle se ejecuta hasta encontrar el final del archivo. Utlizando la función miembro getline( ) se obtiene una línea de texto y se exhibe en pantalla, línea 21, luego utilizamos una instrucción condicional if con el operador de módulo (%) para determinar si se han leído 24 líneas de texto. Cada vez que el contador de líneas dividido entre 24 dé como resultado un resíduo de cero el programa se detiene permitiendo leer las 24 líneas de texto previas. Para continuar se debe presionar la tecla enter y entonces el programa leerá y mostrará en pantalla las siguientes 24 líneas de texto, líneas 22 a la 26.

 

 

Referencias:

http://www.programacionenc.net/index.php?option=com_content&view=article&id=69:manejo-de-arc...

Creation and use of arrays in C++ #Mastery24

2 min read

Arreglos 

Podemos relacionas los arreglos con cajas, estas cajas a la vez pueden tener dentro mas cajas chicas y en cada caja se guarda un dato. 

Esa es la utilidad que tienen los arreglos, supongamos que tenemos cierto numero de estudiantes, por ejemplo 20, y queremos crear una variable para la calificacion de cada uno, tardariamos demasiado en crear 20 variables diferentes para cada uno; por lo que la solucion mas practica seria crear un arreglo para las 20 variables. Como antes explicamos la caja grande seria el arreglo, las cajas mas chicas estan representadas por la variable de la calificacion y dentro de esta  variable podemos ingresar un dato.

Ahora que entendimos que es un arreglo y cuando podemos usarlos, veremos como crear uno:

1- Elegir el tipo de variables a guardar en nuestro arreglo.

2- Definir el numero de datos que necesitamos guardar.

3- Ahora tenemos que comenzar a programar el codigo, esto es sencillo, muy parecido a crear variables.

4- Cuando ya tengamos los datos necesarios de los pasos anteriores debemos tomar en cuenta que el numero de espacios siempre tiene que estar entre corchetes "[ ]".

5- Hay que tomar en cuenta que a la hora de ingresar el numero de espacios, estos se cuentan desde el 0, por lo que si queremos ingresar los 20 espacios, dentro de los corchetes tenemos que escribir 19.

Ejemplo:


using namespace std
int main ( )
{
int arreglo [19];         // En este arregloe las variables son tipo int y cuenta con 20 espacios

arreglo[0]=80;          // Aqui le estamos asignando a la casilla numero 0 el valor de 80

arreglo[19]=100;        //Finalmente asignamos el valor del espacio 19, ultimo espacio dentro de                                                        nuestro arreglo 

return 0;

 

De esta forma podemos crear arreglos, y para hacer mas eficiente la manera de ingresar los datos se recomienda usar algun loop. Ya que dentro de los corchetes del arreglo se pueden ingresar variables como en el siguiente ejemplo: arreglo[alumnos]

 

Use of loops with “while” - Mastery 19

2 min read

Como usar un loop con "while"

Antes de empezar tenemos que saber que es un loop; es una serie de acciones que se repiten en este caso, con ayuda del while, las instrucciones dentro del loop van a repetirse mientras algo este pasando, como en el siguiente ejemplo:

<iostream>
  <cstdlib>
  <time.h>
   
  using namespace std;
   
  int main()
  {
  int sec, num, cont =0;
  srand(time(NULL));
  sec = rand()%100+1;
   
  while(num != sec){
  cout <<"Please guess a number between 1 and 100: " << endl;
  cin >> num;
   
  if (num > sec){
  cout <<"I am sorry but "<<num<<" is too high, try again: " << endl;
  }
  if (num < sec){
  cout <<"I am sorry but "<<num<<" is too low, try again: "<< endl;
  }
  cont++;
  }
   
  cout <<"You got it! The right answer is indeed "<<num<< endl;
  cout <<"You made "<<cont<<" guesses to get the right number" <<endl;
   
  return 0;

 

En el ejempo anterior existe un loop con while, este nos indica que mientras la condicional sea false, todo el loop va a repetirse, pero si el usuario ingresa un numero correcto que para nuestro codigo seria el 42, la variable num seria true, por lo que la condicion del while ya no se cumple y el loop se saldria y el programa continuaria corriendo.


Creating C++ functions - Mastery12

1 min read

*Crear una funcion es facil. El proceso para crear una es el siguiente:

1- Se programa la unción

2- Se define la función

3- Se utiliza la función en el programa principal.

 

*Su estructura es la siguiente:

 

Por ejemplo:

<iostream>

using namespace std;

int factorial(int a){

int cont, act = 1;

for (cont =1; cont <=a; cont ++)

{

fact = fact*cont;

}

return fact;

}

 

int main(){

int num1;

int resultado = factorial (num1);

cout << "dame un numero";

cin num1;

cout<< "El factorial es: " << resuldado;

return 0;

}

 

 

Si tienen dudas pueden consultar el siguiente enlace: http://aprendecpp.com/blog/programacion-en-c-como-crear-funciones-i.html