Aprendiendo a programar con Haiku - Lección 4

Fuente original: https://github.com/pulkomandy/programming-with-haiku 


Sería increíblemente difícil escribir algo útil si no hubiera formas para que nuestros programas tomen decisiones o aceleren los procesos tediosos. En esta lección, vamos a examinar una forma de ejecutar el código basado en una condición y una forma de repetir un conjunto de instrucciones tantas veces como queramos.
Ejecución condicional: Ejecutar cierto código a veces

ncluso en la programación, nada es seguro. Una forma en que un programa puede manejar condiciones especiales es si la lógica, como en el caso de(if) que veamos a una persona morada voladora de un solo ojo, un cuerno, que venga en mi dirección, entonces/then voy por el otro lado. Con rapidez.
Una computadora puede hacer lo mismo, por ejemplo, si/if alguna variable es igual a 10, luego/then establece otra variable en falso. Si tuviéramos que escribir esto en código, este sería el aspecto:




if (someVariable == 10)
{
someOtherVariable = false;
}
La condición para esta declaración se coloca dentro de los paréntesis. Tenga en cuenta que, en lugar de utilizar solo un signo igual para verificar si las dos variables son iguales, tenemos dos. En C y C ++ se usa un solo signo igual para asignar un valor a una variable y dos signos iguales son para comparar dos valores. Si te olvidas, el compilador te avisará. Su programa aún se compilará, pero se le advertirá sobre este posible error de programación. Siguiendo la condición entre paréntesis, tenemos un bloque de instrucciones dentro de un par de llaves que se ejecutarán si la condición es verdadera. Si es falso, el bloque de instrucciones se omite y la ejecución del programa continúa después. También podemos especificar qué hacer si la condición es falsa con un bloque else.



// If the dragon breathes fire
if (dragonBreathesFire)
{
// Stop and break out the marshmallows. Yum!
SetSpeedMPH(0);
EquipMarshmallows(true);
}
else
{
// The dragon isn't of the fire-breathing variety, so get ready to fight.
DrawSword();
RaiseShield();
myVelocityMPH += 4;
}

Si las declaraciones se pueden utilizar de muchas maneras extravagantes. Se pueden encadenar o incluso anidar, es decir, colocarse uno dentro del otro, y si desea Trabajar de forma más inteligente, No más difícil (también conocido como programador perezoso), puede omitir las llaves si solo tiene una instrucción para ejecutar. Observar:


/ This is the shortcut way of using an if statement - there is only one
// instruction to possibly run.
if (someVariable == 10)
someOtherVariable = false;


if (PoliceVisible())
{
myStress++;
// Here we have a couple of if statements placed inside each other.
// Every time there is another level of nesting, we increase the
// indenting one level, as well.
if (GetSpeed() > GetSpeedLimit())
if (PoliceLightsFlashing())
SetSpeedMPH(0);
else
SetSpeedMPH(GetSpeedLimit());
else
  myStress--;
}

 Aquí comprobamos si hay policías visibles. Si es así, entonces nuestro estrés (naturalmente) aumenta un poco. Luego verificamos si nuestra velocidad está por encima del límite. Si no es así, nuestro estrés regresa a donde estaba antes. Si, por alguna razón, está por encima del límite, verificamos si las luces del vehículo de la policía parpadean y disminuyen la velocidad o se detienen, según corresponda.

Aumentar la sangría con cada nivel de anidamiento es una elección de estilo de codificación con un propósito: hace que la comprensión de la lógica de sus declaraciones if-then y le ayude a determinar rápidamente qué instrucciones pertenecen a qué instrucción if. Hay dos escuelas de pensamiento sobre cómo sangrar: una serie de espacios o el uso de la tecla Tab. Para los fines de estas lecciones, usaremos la tecla Tab: hace el mismo trabajo y requiere menos escritura. Una vez más, trabaja más inteligente, no más duro.

Para agregar un último truco a nuestra bolsa, también podemos usar operadores lógicos booleanos para modificar o encadenar las condiciones con AND, OR o NOT y establecer la precedencia con paréntesis. Para aquellos que no están familiarizados, la lógica booleana es solo una forma de encadenar condiciones, como SI alguna condición y otra condición.





Boolean Value Operator Example Means
AND
&&
if (a == 1 && b == 2)
if a is 1 and b is 2
OR
||
if (a == 1 || b == 2)
if a is 1 or b is 2
NOT
!
if ( !(a == 1 || b == 2) )
if the opposite of a equaling 1 and b equaling 2



Tenga en cuenta que si tiene más de una condición en una declaración if, puede ser una buena idea incluirlas entre paréntesis para que su código sea un poco más claro a menos que las condiciones sean bastante breves.




if ( (a == 1 && b == 2) || c )
 DoSomething();



Este ejemplo se traduce como "Llame a DoSomething () si a es uno y b es 2 o el valor de c es distinto de cero". Los enteros se pueden usar para la lógica, como en este ejemplo. El cero se trata como falso y todo lo demás se trata como verdadero, por lo que en este ejemplo, la condición c será verdadera si c es algo distinto de cero.

Ahora, si bien todo esto puede parecer mucho para manejar al mismo tiempo, lo que hemos aprendido a trabajar con las sentencias if es la base para otras formas de controlar la ejecución del programa C ++. En la práctica, no es muy complicado.

Bucles

Un bucle es una característica de C y C ++ en donde el programa ejecuta repetidamente un conjunto de instrucciones mientras cierta condición es verdadera. C ++ tiene varios tipos de bucles, pero para hoy veremos solo uno: el bucle for. Veamos uno y luego examinemos los detalles.


#include <stdio.h>

int main(void)
{
int number = 0;
// This is our for loop
for (int i = 1; i < 10; i++)
{
number += i;
printf("At step %d, the number is now %d\n",i,number);
}
}


Cuando ejecutamos este programa, esto es lo que imprime:

At step 1, the number is now 1
At step 2, the number is now 3
At step 3, the number is now 6
At step 4, the number is now 10
At step 5, the number is now 15
At step 6, the number is now 21
At step 7, the number is now 28
At step 8, the number is now 36
At step 9, the number is now 45 



Nuestro bucle for tiene dos partes: la sección de control, que está dentro de los paréntesis, y el bloque de instrucciones repetidas. La sección de control para el bucle for tiene tres partes: la inicialización, la condición del bucle y el valor del paso. Cada parte está separada por un punto y coma.

La inicialización establece una variable para el valor de inicio para el bucle. Podemos declararlo en esta parte del bucle for o usar uno que ya haya sido declarado. Es una práctica común declarar nuestra variable de índice en esta parte del bucle, y muchas veces los programadores usarán la i minúscula (como en resumen para el índice) para la variable de índice en muchos bucles simples.

La condición de bucle es una expresión que debe ser verdadera para que el bucle se repita. En este caso, el bucle se repetirá mientras i sea menor que 10. El valor del paso es una expresión que cambia la variable de índice. La mayoría de las veces, como en este ejemplo, solo agregamos uno al índice, pero es posible usar cualquier operación matemática que queramos. Podríamos cambiar esto a i + = 2 si quisiéramos incrementar i en dos. Al igual que muchos otros aspectos de C y C ++, hay mucha flexibilidad en lo que se permite cuando se construye un bucle for, pero por ahora lo mantendremos simple.

Aplicando conceptos

Vamos a tratar de tomar los conceptos que hemos aprendido en esta lección y juntarlos para algo más que un poco útil. Cuando saca un préstamo de un automóvil, es bueno saber cuáles serán los pagos, así que armemos una función que calcule el pago. La ecuación que se usa para esto es la siguiente:



A = the payment amount
P = the initial principal
r = the loan's interest rate
n = the number of months

Con lo complicado que parece, este es definitivamente un trabajo para una función dedicada. Vamos a traducir este lío matemático en algo un poco más fácil para envolver nuestras mentes.



#include <math.h>

float Payment(float principal, float rate, int months)
{
float top, bottom;
// This line calculates the top half of the right side
top = principal * (rate / 12.0);
// This line calculates the bottom half of the right side
bottom = 1 - pow(1 + (rate / 12.0),-months);
return (top / bottom);
}


Traducir una ecuación en una función es cuestión de dividirla en partes más manejables. Hemos hecho esto calculando el valor de las dos mitades de la división por separado y ubicándolas en dos variables diferentes. Esto hará que nuestro código sea más fácil de leer y depurar.

Tenga en cuenta que utilizamos 12.0 y no 12 para forzar al compilador a tratar los 12 como números de punto flotante y no como enteros. Siempre que hagamos matemáticas con números enteros, el compilador eliminará los resultados fraccionarios, por lo que, por ejemplo, 10/4 sería igual a 2, pero 10.0 / 4.0 devolvería 2.5. Queremos evitar errores de redondeo en este caso, por lo que usamos 12.0 y no 12.

Podríamos haberlo hecho todo de una vez, pero habría sido más difícil de leer y un verdadero rascador para depurar. Se vería así:


return (principal * rate / 12.0) / ( 1 - pow(1 + (rate / 12.0),-months) );


Puaj Si bien algunos codificadores expertos pueden preferir esto porque es más compacto, tener un código legible y mantenible es mucho más importante. Ahora que tenemos la función de calcular el pago, hagamos un buen uso haciéndolo calcular los pagos mensuales para préstamos de automóvil que duran de uno a cinco años.

#include <stdio.h>
#include <math.h>

float Payment(float principal, float rate, int months)
{
float top, bottom;
top = principal * (rate / 12.0);
bottom = 1 - pow(1 + (rate / 12.0),-months);
return (top / bottom);
}


int main(void)
{
float principal, rate;
int months;
principal = 10000.0;
rate = .05;
for (int months = 12; months <= 60; months += 12)
{
// Because whitespace doesn't matter to the compiler, it makes
// sense to break up long lines of code into multiple smaller ones
// to make your code more readable.
printf("The monthly payment for a %d month, $%f car loan "
"at %f%% is $%f\n", months, principal, rate * 100,
Payment(principal,rate,months));
}
}


¡Funciona! Cuando se ejecuta, nos muestra que tener un préstamo de 1 año es realmente caro, pero un préstamo de 4 o 5 años es mucho más manejable.


Ir más lejos

Intente jugar con los números y vea qué sucede, por ejemplo, si el 60 en la condición de bucle se cambia a 72 o si el principal es $ 20000 en lugar de $ 10000.



Bug Hunt

Hunt #1

Code

#include <stdio.h>

int main(void)
{
// Print the times tables for the 2's family that has odd-numbered factors

for (int i = 1; i < 13; i++)
printf("2 x %d = %d\n",i,2 * i);
}

Errors

It's supposed to print only 2 times the odd numbers (1,3,5,etc.) but it prints all of them.

Hunt #2

Code

#include <stdio.h>

int main(void)
{
float pi = 3.141592;
printf("pi equals %d\n",pi);
printf("2 * pi equals %d\n",pi * 2.0);
return 0;
}

Errors

foo.cpp: In function ‘int main()’:
foo.cpp:6: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
foo.cpp:7: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’

And when it runs, it prints this:
pi equals 0
2 * pi equals 0

Lesson 3 Bug Hunt Answers

  1. The variable c was not declared. Add a line int c = 5; after the one for b and this will compile (and work) properly.
  2. The include for math.h has been forgotten. Add #include <math.h> to the top of the example.

Lesson 3 Project Review

Nuestro trabajo consistía en utilizar la ecuación Interés = Principal * tasa * tiempo para calcular e imprimir el interés simple incurrido en un principal de $ 20000 a una tasa del 5% por mes durante 24 meses y tuvimos que crear una función para realizar el interés real cálculos Aquí hay una forma de hacerlo:

#include <stdio.h>

float SimpleInterest(float principal, float rate, int months)
{
return principal * rate * months;
}

int main(void)
{
// Our $20000 principal
float p = 20000.00;
// 5% interest is .05
float r = .05;
int m = 24;
float interest = SimpleInterest(p,r,m);
printf("The interest on %f at %f%% interest for %d months is $%f\n",
p,r * 100, m, interest);
}





Hora de Libertad

Post a Comment

Previous Post Next Post