Está en la página 1de 21

Lenguaje C

Semana 4

Clase 08
Agenda
Introducción math.h
1 2
Pset1
★ Intentemos mostrar por pantalla algunos bloques, como esos del
videojuego antiguo Super Mario Bros. Comenzaremos mostrando
por pantalla 4 signos de interrogación simulando bloques.
mario.c

1 #include <stdio.h>
2
3 int main(void)
4 {
5 printf("????\n");
6 return 0;
7 }
★ Con un bucle “for”, podemos mostrar por pantalla cualquier
cantidad de signos de interrogación con un mejor diseño:

mario.c

1 #include <stdio.h>
2
3 int main(void)
4 {
5 for (int i = 0; i < 4; i++)
6 {
7 printf("?");
8 }
9 printf("\n");
10 return 0;
11 }
★ Ahora, vamos a conseguir un entero positivo del usuario y sacar por
pantalla esa cantidad de signos de interrogación.
mario.c
1 #include <cs50.h>
2 #include <stdio.h>
3
4 int main(void)
5 {
6 int n;
7 do
8 {
9 n = get_int("Width: ");
10 } while (n < 1);
11 for (int i = 0; i < n; i++)
12 {
13 printf("?");
14 }
15 printf("\n");
16 }
★ Un bucle “do while” realiza algo primero y luego verifica si la
condición es verdadera. Si la condición sigue siendo verdadera,
entonces se repetirá.
★ Podemos mostrar por pantalla un conjunto bidimensional de
bloques con bucles anidados, o bucles dentro de otros bucles:
mario.c

13 //Para cada fila


14 for (int i = 0; i < n; i++)
15 {
16 //Para cada columna
17 for (int j = 0; j < n; j++)
18 {
19 //Imprimir bloque
20 printf("#");
21 }
22 //Movemos a la siguiente fila
23 printf("\n");
24 }
★ Tenemos dos bucles anidados, el bucle exterior usa “i” para hacer
un conjunto de cosas “n” veces. El bucle interior usa “j” (otra
variable conveniente para contar), una variable diferente para
hacer “n” veces para cada una de esas veces.

★ En otras palabras, el bucle exterior muestra por pantalla 3 filas,


terminando cada una de las filas con una nueva línea y el bucle
interno muestra por pantalla 3 caracteres “#” para cada línea.
★ Para validar “n”, en vez del bucle “do while” de antes, podemos
usar un bucle “while”, intentalo tu mismo✨✨
Imprecisión y
desbordamiento
★ Echemos un vistazo a calcular valores de nuevo, esta vez con
flotantes y divisiones:
calculator.c
1 #include <cs50.h>
2 #include <stdio.h>
3
4 int main(void)
5 {
6 float x = get_float("x: ");
7 float y = get_float("y: ");
8 float z = x / y ;
9
10 printf("%f\n", z);
11 return 0;
12 }
★ Podemos compilar y ejecutar nuestro programa:

★ Resulta que, con formatos de códigos como “%.2f”, podemos


especificar el número de posiciones decimales mostradas.
★ Cambiemos nuestro programa para mostrar cincuenta decimales
con “printf(“%.50f\n”, z)”. Compilamos y ejecutamos nuestro
programa de nuevo:

★ Ahora, los valores no se ven como esperábamos.


★ Resulta que esto es llamado imprecisión de punto flotante, la
incapacidad de las computadoras para representar todos los
números reales posibles con un número finito de bits, como los 32
bits de un flotante. Por lo que, nuestra computadora tiene que
guardar el valor más cercano posible, lo que conlleva a la
imprecisión.
★ Similar a la primera semana, cuando teníamos 3 bits y
necesitábamos contar hasta 7 (111), añadimos otro para
representar 8 con “1000”. Pero si nosotros solo tenemos 3 bits
disponibles, el “próximo” número podría ser “000”, ya que no
tendríamos lugar para ese 1 extra. Este problema es llamado
desbordamiento de enteros, donde un entero solo puede ser tan
grande dado un número finito de bits.
★ Vamos a mirar un último ejemplo:
calculator.c
1 #include <cs50.h>
2 #include <stdio.h>
3
4 int main(void)
5 {
6 float amount = get_float("Dollar amount: ");
7 int pennies = amount * 100;
8
9 printf("Pennies: %i\n", pennies);
10 return 0;
11 }
★ Resulta que, hay una imprecisión al almacenar el “float” que
obtenemos del usuario (4.20 podría ser almacenado como
4.199999…), por lo que cuando lo multiplicamos y mostramos como
un número entero, miramos “419”
★ Podemos intentar resolver esto redondeando:
calculator.c
1 #include <cs50.h>
2 #include <stdio.h>
3 #include <math.h>
4
5 int main(void)
6 {
7 float amount = get_float("Dollar amount: ");
8 int pennies = round(amount * 100);
9
10 printf("Pennies: %i\n", pennies);
11 return 0;
}
★ “math.h” es otra librería que nos permite calcular operaciones y
realizar transformaciones matemáticas.

★ En él encontraremos funciones como pow(), sqrt(), round() y


muchas más.
¿Preguntas?

También podría gustarte