C++ Trucos

Enviado por jvilella el Lun, 23/09/2019 - 04:32

Requisitos:

A continuación se describen algunos pequeños detalles adicionales del lenguaje C++ que de cara a concursar pueden ser útiles porque ahorran tiempo de escritura. Son trucos que dificultan la mantenibilidad del código (porque lo hacen más difícil de entender) pero que son muy habituales, cosa que vol quiere decir que para a un programador experimentado no suponen ninguna dificultad a la hora de entender un código.

CREACIÓN RÁPIDA DE VARIABLES

Podemos crear varias variables del mismo tipo de una tirada:

int a, b, c, d;

E incluso darle un valor inicial (a todas o a algunas):

int a = 3, b = 4, c, d = 2, e, f;

De la misma manera para cualquier otro tipo de variable:

vector<int> lista1(50), lista2(50);

También puedes asignar un valor a varias variables (ya declarades) a la vez:

int a, b, c, d;
a = b = c = d = 0;

Y en el caso de vectores (o arrays) puedes inicializar todos los valores de la siguiente manera:

vector<int> numeros = { 2, 6, 4, 8, 3, 8, 3 };

Esto creará un vector de tamaño 7. Fíjate que si inicializo los valores no necesito indicar qué tamaño tiene el vector, sino que lo deduce de la cantidad de valores que le paso. Pero también puedo usar esto más adelante para asignarle valores (comenzando desde la posición 0) aunque no sean todos los valores del vector (es decir, aunque queden posiciones del vector sin inicializar):

vector<int> fibonacci(100);
fibonacci = { 1, 1, 2, 3, 5, 8, 13, 21 };

MODIFICACIONES SOBRE UNA VARIABLE

"variable++;" es lo mismo que "variable = variable + 1;"
"variable--;" es lo mismo que "variable = variable - 1;"

"variable += valor;" es lo mismo que "variable = variable + valor;"
"variable -= valor;" es lo mismo que "variable = variable - valor;"
"variable *= valor;" es lo mismo que "variable = variable * valor;"
"variable /= valor;" es lo mismo que "variable = variable / valor;"
"variable %= valor;" es lo mismo que "variable = variable % valor;"

Verás por internet que alguna gente hace "++variable" en lugar de "variable++". NO ES LO MISMO. "variable++" usa el valor de la variable y después la incrementa, mientras que "++variable" la incrementa y después usa su valor. Por ejemplo:

int a = 0;
cout << a++ << endl; // Mostrara 0, y despues a pasara a ser 1
int b = 0;
cout << ++b << endl; // b pasara a ser 1 y despues mostrara por pantalla 1

SIMPLIFICAR ESTRUCTURAS LOGICAS

Cuando usamos if's y while's, si el contenido es únicamente una instrucción podemos ahorrarnos las llaves:

int num;
cin >> num;
while (num-- > 0)
    if (num % 2 != 0)
        cout << num << endl;

Incluso es habitual escribir la condición y su contenido en una única línea:

int num;
cin >> num;
while (num-- > 0) if (num % 2 != 0) cout << num << endl;

Atención, decimos"si el contenido es únicamente una instrucción" (hasta el primer punto-y-coma) no "una línea". ¡No es lo mismo! Este código será un bucle infinito:

int num = 10;
while (num > 0)
    cout << num; num--;     // La instruccion "cout << num;" esta dentro del while, pero la instruccion "num--;" esta fuera del while

De la misma manera podemos usarlo con un for:

int sumatorio = 0;
for (int num=10; num > 0; num--)
    sumatorio += num;
cout << sumatorio;

De hecho, tanto durante la inicialización del for (antes del primer punto-y-coma) com en el incremento del for (después del segundo punto-y-coma) podemos poner, separados por comas, más de una instrucción a ejecutar. El siguiente código es equivalente al anterior... ¡y no requiere que el for haga nada!

int num, sumatorio;
for (num=10, sumatorio=0; num > 0; num--, sumatorio+=num);
cout << sumatorio;

Otra simplificación que se puede hacer es hacer un if "inline", es decir, donde deberías poner un valor, poner un if. La estructura es muy extraña: "condición ? qué_hacer_cuando_true : qué_hacer_cuando_false;". Por ejemplo, en lugar de escribir:

int edad;
cin >> edad;
string tratamiento;
if (edad >= 18) tratamiento = "usted";
else tratamiento = "tu";

Puedes escribir:

int edad;
cin >> edad;
string tratamiento = (edad >= 18) ? "usted" : "tu"; // Fijate que la asignacion ( = ) tiene menos prioridad que la operacion "inline if" ( ?: ) Puedes repasar las precedencias entre operadores en el articulo https://aprende.olimpiada-informatica.org/cpp-precedencia-operadores

RESULTADOS COMO BOOLEANOS

¿Sabías que un bool en realidad internamente es un int? ¿Y que 0 es false y 1 es true? Comprobémoslo, el siguiente código funciona idéntico al anterior:

int num;
cin >> num;
while (num-- > 0) if (num % 2) cout << num << endl;

De la misma manera, si queremos obtener los valores pares podemos hacer:

int num;
cin >> num;
while (num-- > 0) if (!(num % 2)) cout << num << endl;

El motivo por el cual hemos de hacer "(!(num % 2))" y no simplemente "(!num % 2)" es que la operación "!" tiene más prioridad que la operación "%", por tanto "(!num % 2)" equivale a "((!num) % 2)".

Otro ejemplo, el último for de la sección “SIMPLIFICAR ESTRUCTURAS LOGICAS“ podría dejarse así:

int num, sumatorio;
for (num=10, sumatorio=0; num; num--, sumatorio+=num);
cout << sumatorio;

Porque cuando llegue a 0 será false.

UN EJEMPLO CON TODO (o casi)

El siguiente código calcula cuantos pasos tardamos en completar la "Conjetura de Collatz" (una hipótesis matemática nunca demostrada, desde hace casi 100 años, que dice que si cojemos cualquier número y si es par lo dividimos entre 2 y si es impar lo multiplicamos por 3 y le sumamos 1, y repetimos este proceso indefinidamente con los resultados, antes o después llegamos al valor 1), y también hace el sumatorio de todos los números que van saliendo en la serie:

int main() {
    int num;
    cin >> num;
    int pasos = 0;
    int sumatorio = 0;
    while (num > 1) {
        if (num % 2 == 0) {
            num = num / 2;
        } else {
            num = 3 * num + 1;
        }
        cout << num << " ";
        sumatorio = sumatorio + num;
        pasos = pasos + 1;
    }
    cout << "Pasos: " << pasos << ". Sumatorio: " << sumatorio << endl;
}

Es exactamente equivalente a este código:

int main() {
    int num, pasos, sumatorio;
    for (pasos=sumatorio=0, cin >> num; num > 1; pasos++, sumatorio += num, cout << num << " ") num = (num % 2) ? 3 * num + 1 : num / 2;
    cout << "Pasos: " << pasos << ". Sumatorio: " << sumatorio << endl;
}

 

Printer Friendly, PDF & Email

Añadir nuevo comentario

HTML Restringido

  • Etiquetas HTML permitidas: <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol type start> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Saltos automáticos de líneas y de párrafos.
15 + 1 =
Resuelva este simple problema matemático y escriba la solución; por ejemplo: Para 1+3, escriba 4.