CURSO C++ [Pt. 3]


Rodkaiser

Més que un nodero | Verdunchderechista
Noderador
Nodero
Noder
CURSO DE PROGRAMACION EN C++ [Pt. 3]

Bienvenidos chavales a la tercera parte del curso. En este caso hablaremos de condicionales, bucles y funciones.


Adelante:

Empezaremos con los condicionales.


En C++, los condicionales se escriben así:

C++:
if(condicion){
    bloque;
}
else if(condicion2){
    bloque2;
}
else{
    bloque3;
}

Es bastante sencillo, si se cumple la primera condición, se ejecuta ese bloque y se salta el resto. Si no, pasa la condición2 y se salta el resto. Si ninguna condición se ha cumplido, ejecuta el bloque3 que está dentro de else.

Hay que poner las llaves "{}" si debajo hay más de una línea y los paréntesis de la condición son obligatorios. Como condición podemos poner prácticamente cualquier cosa y podemos poner varias condiciones a la vez con los operadores and, "&&", y or "||". Ejemplo de un programa sencillo:

C++:
int main(){
    int numero;
    cout << "Introduce un número: "<<endl;
    cin >> numero;
 
    if(numero %% 2 == 0) //Si el número es divisible por 2, es par
        cout << "Es un número par\n"
    else
        cout << "Es un número impar\n"
}
También se pueden anidar. Es decir meter un if dentro de otro if. Esto se puede hacer cuántas veces quieras, pero no es muy recomendable y hay que tener cuidado para que el código sea legible. Ejemplo:
C++:
int main(){
    int tipo, precio;
    cout << "Qué tipo de cliente eres? (A o B)"<<endl;
    cin >> tipo;

 
    cout << "Introduce el precio del artículo:  "<<endl;
    cin >> precio;
 
    if(precio <50){
        if(tipo == 'A'){
            int descuento = 0,25;
        }
        else{
            int descuento = 0,1;
        }
    }
    else{
    
        if(tipo == 'A'){
            int descuento = 0,25;
        }
        else{
            int descuento = 0,1;
        }
    }

    cout << "El precio total es de " << precio-descuento << "€\n";
}

La inteligencia Artificial se basa en esto.

Otro tipo de controlador de flujo es el switch case:

C++:
int day;
cout << "Introduce un número del 1 al 7: ";
cin >> dia;
switch (day) {
  case 1:
    cout << "Lunes";
    break;
  case 2:
    cout << "Martes";
    break;
  case 3:
    cout << "Miércoles";
    break;
  case 4:
    cout << "Jueves";
    break;
  case 5:
    cout << "Viernes";
    break;
  case 6:
    cout << "Sábado";
    break;
  case 7:
    cout << "Domingo";
    break;
  default:
    cout << "Ese número no corresponde a un día de la semana" <<endl;

}

Siempre tienes que poner el break. La idea de este elemento es que cuando se cumpla una condición, acabe. Si no pones el break, el programa sigue haciendo las siguientes comprobaciones y podría hacer otro fragmento de código. Esto no es deseable. La cláusula default siempre se ejecuta. Se suele poner para que se ejecute cuando ninguna condición anterior se ha cumplido.
Si pones un case sin código, este ejecuta el código del case de arriba:

C++:
switch (day) {

  case 1:

    cout << "Lunes";

    break;

  case 2:
es lo mismo que

C++:
switch (day) {

  case 1:

    cout << "Lunes";

    break;

  case 2:
    cout << "Lunes";

    break;

BUCLES
Los bucles se utilizan para ejecutar tareas repetitivas, recorrer vectores, etc. En C++ hay 3 tipos de bucles: for, while y do while

Bucle for:
La sintaxis es:
C++:
for(variable_control;condición_control;incremento){
 
}

suma = 0;
for(i=0; i<5;++i){      // Esto calcula la sumatoria desde 1 a 4
    suma = suma + i;
}
cout << suma <<endl; //Esto imprime 10.

//Esto se lee: Desde 0 hasta 5 (sin incluir), súmalo en una variable.

En la condición de control puedes poner todo tipos de condicionales (como en el if). Normalmente se suelen poner condiciones de iteración, pero puedes poner condiciones de comparación o booleanos. En la parte del incremento puedes poner más de 1 cosa (separado por comas), aunque no es muy común.

Ejemplo de un programa que calcula si un número es primo o no:
C++:
int numero;
cout << "Introduce un número para saber si es primo o no: ";
cin >> numero;

bool esPrimo = false;
for(int i=2 i<=numero/2 && !esPrimo; ++i){
    if(numero % i == 0)
        esPrimo = true;
}

Programa que calcula el cuadrado de los elementos de un vector:
C++:
numeros[] = {1,2,3,4,5}

for(int i=0;i<;++i}
    cout<<i*i<<endl;

Bucle while
Este bucle solo tiene un parámetro. Con los 3 bucles puedes hacer exactamente lo mismo. Solo cambia la forma de entenderlo. Por ejemplo es más normal usar un for que un while para recorrer un vector.

La sintaxis es:
C++:
while(condicion){
    bloque de código. VIVA ESPAÑA
}

int i=2;
bool esPrimo=false;
while(i<=numero/2 && !esPrimo){
    if(numero%i == 0)
        esPrimo = true;
}
if(esPrimo)
    cout<<"El número es Primo"<<endl;
else
    cout<<"No es primo"<<endl;

Como veis, se puede hacer lo mismo, solo cambia un poco la forma.

Bucle do while
Este bucle suele utilizarse para hacer menús en la terminal. La peculiaridad de este bucle es que primero ejecuta, luego pregunta. Los otros dos bucles primero comprueban la condición y, si no se cumple, no hace nada. Este bucle primero ejecuta el código una vez y luego ya comprueba la condición, por lo que mínimo se ejecutará una vez.

Sintaxis y ejemplo:
C++:
int opcion;
do {
  cout<<"Introduce qué quiere hacer: ";
  cin >> opcion;
  switch(opcion){
      case 1:
        algo;
      case 2:
        algo;
  }

}
while (opcion != 5);

Bueno, mañana sigo haciendo el post. Pondré las funciones.
Día 2.

Funciones
Las funciones simplemente son fragmentos de código que extraes del programa principal y le das un nombre. Para utilizarlas solo tienes que llamarlas y pasarle los parámetros si lo necesitas. Esto mejora mucho la legibilidad del código y suelen utilizarse cuando necesitas hacer algo más de una vez.

Partes de una función:
  • Valor de vuelta. Puede ser cualquier cosa: int, string, objetos, estructuras, vectores... Para indicar que no devuelve nada se utiliza void.
  • Parámetros. Puedes pasar cualquier cosa: variables, punteros, objetos, arrays, etc. Puedes indicar un valor por defecto. De esta forma, si la llamas sin parámetro, utiliza ese por defecto. Cuando pasas un parámetro, lo que hace el compilador es crear una copia de esa variable y trabaja con ella y cuando acaba la función se destruye. Por esto, si modificas una variable dentro de una función, no se modifica fuera. Para poder modificarlo fuera tienes que pasarlo por referencia. Esto se hace poniendo un & antes del nombre de la variable.

Ejemplo de una función:
C++:
// Declaración y definición de una función
bool esPrimo(int n=17){
    bool esPrimo = false;
    for(int i=2;i<n/2 && !esPrimo;++i){
        if(n%i==0)
            esPrimo=true;
    }
    return esPrimo;
}

int main() {
    int n;
    cout<<"Introduce un número: ";cin>>n;
    bool primo = esPrimo(n);  // llamada a la función
    if(esPrimo)
        cout<<"Es primo\n";
    else
        cout<<"No es primo\n";
    return 0;
}

Normalmente los parámetros por referencia se utilizan cuando quieres devolver más de una cosa desde una sola función (o simplemente quieres modificar unas variables externas a la función). Ejemplo:
C++:
void cambiaNumeros(int &a, int &b) {
  int c = a; // Creamos una variable auxiliar
  a = b;
  b = c;
}

int main() {
  int primero = 10, segundo = 20;

  cout << "Valor del primero: "<< primero << "\n"; //Imprime 10
  cout << "Valor del segundo: "<< primero << "\n"; //Imprime 20
    
  cambiaNumeros(primero, segundo);

  cout << "Valor del primero: "<< primero << "\n"; //Imprime 20
  cout << "Valor del segundo: "<< primero << "\n"; //Imprime 10

  return 0;
}

Sobrecarga de operadores
La sobrecarga de operadores simplemente es nombrar igual a distintas funciones. Normalmente se hace con funciones que hacen lo mismo pero con distintos tipos de datos.

Ejemplo bastante tonto:

C++:
int cuadrado(int n){
    return n*n;
}

double cuadrado(double n){
    return n*n;
}

int main(){
    
    int n=5;
    int m=6.89;
    
    cout<<"Cuadrado de 5: "<<cuadrado(n)<<endl; //Aquí se invoca a la primera función
    cout<<"Cuadrado de 6.89: "<<cuadrado(m)<<endl; //Aquí a la segunda
    
    return 0;
}
Digo que es un ejemplo bastante tonto porque con crear la 2a función ya engloba a la primera, ya que un entero es un double, pero es para que se entienda. Para poder hacer la sobrecarga de una función, los parámetros tienen que ser distintos, ya sea en número o en tipo.


Addendum: Recursividad
Las funciones recursivas son funciones que se llaman a sí mismas. Esto es muy elegante, pero muy poco eficiente en algunos casos...
Las funciones recursivas se utilizan en el análisis de algoritmos (Sobre lo que haré un post). Algoritmos recursivos famosos son el MergeSort, el de cálculo de un factorial o el de la serie de fibonacci.
Para hacer una función recursiva se tiene que poner un caso base,
que es el caso en el que la recursividad para, si no se haría un bucle infinito.

Ejemplo de una función recursiva:


C++:
int factorial(int n) {
  if (n > 1) {
    return n * factorial(n - 1);
  } else {
    return n;
  }
}

int main(){
    int n = 6;
    
    cout<<"Factorial de "<<n<<": "<<factorial(6)<<endl; //Imprime 720

    return 0;
}


FIN
Bien, ya creo que lo he dicho todo sobre condicionales, bucles y funciones. Es bastante sencillo en general. Lo siguiente sería structs y clases. Dios sabe cuándo. También tengo pendiente un post de análisis de algoritmos y otro de scripting en bash. Este post lo he hecho porque obtuso me lo pidió, pero no da señales de vida el hijueputa.

Lo de siempre: Se agradece un like y enlaces a las primeras partes:
Curso C++ Pt 1

Curso C++ Pt 2
 
Última edición:

Anon

🏴‍☠️
Owner
Staff
Moderador
Paladín de Nodo
Jinete de Nodo
Burgués de Nodo
Noderador
Nodero
Noder
Directo a 313 Rewards de este mes
 
  • Like
Reacciones : Rodkaiser