Resumen
Esta clase abre la segunda unidad del curso, dedicada a los datos y sus tipos. Explica para qué sirve la unidad: enseñar que todo dato de un programa vive en la memoria con un tipo que fija qué valores puede tomar, cuánto ocupa y qué operaciones admite, y que esos límites tienen consecuencias observables; presenta sus cuatro clases y el hilo que las une, desde la variable como casilla con nombre y valor hasta las conversiones entre tipos y las constantes; recuerda lo que la unidad da por sabido de la primera, que es escribir, compilar y ejecutar un programa que lee y escribe; formula el problema que la unidad resuelve, el de un programa correcto en apariencia cuyas cuentas no coinciden con las de la matemática, empezando por la suma , que en un computador no da exactamente ; y muestra adónde conduce, en las unidades siguientes y en el curso Programación en C++ II.
Objetivos de aprendizaje
- Describir la secuencia de contenidos de la unidad y explicar qué aporta cada clase a la siguiente.
- Recordar lo necesario de la unidad 1 (el ciclo de compilar y ejecutar, la salida con formato, la lectura con
std::ciny la lectura de los mensajes del compilador) y repasarlo si hace falta. - Explicar, con un ejemplo, por qué un número de un programa no es un número de la matemática, y anticipar por qué no es exactamente en un computador.
- Reconocer qué se espera saber hacer al terminar la unidad, y distinguirlo de lo que se aprenderá en las unidades siguientes.
Evaluación de entrada
Antes de recorrer la unidad conviene medir el punto de partida. Esta evaluación es una autoevaluación: no se califica, y su único propósito es orientar el estudio. Las cuatro primeras preguntas comprueban lo que la unidad da por sabido de la primera: el seguimiento de un procedimiento paso a paso, la escritura de un número con dos decimales, el redondeo y la lectura de un mensaje de error. Las seis siguientes tocan, en el orden de las clases, las ideas centrales de la unidad. Nadie está obligado a acertarlas todavía, y en una de ellas «todavía no lo sé» es una respuesta honesta: cada respuesta, acertada o no, explica el punto y nombra la clase que lo trata. Las mismas destrezas se vuelven a medir al final, en la clase de síntesis.
Antes de comenzar la unidad, mide tu punto de partida. Es una autoevaluación breve: no se califica y su resultado se guarda solo en tu navegador.
Pregunta 1De unidades anterioresUn procedimiento dice: «1. toma el valor 17. 2. toma el valor . 3. toma el valor ». ¿Cuánto vale al terminar?
Supone que cada paso parte del valor inicial; el segundo parte del valor que dejó el primero.Lee «toma el valor» como una igualdad matemática; es una orden que reemplaza el valor de .Confunde una variable con una constante: el valor de una variable cambia cada vez que se le asigna otro.Cada paso parte del valor que tiene en ese momento, no del inicial. Seguir el procedimiento a mano, con el valor de cada variable después de cada paso, es la tabla de traza de la unidad 1, y la clase 2.1 la convierte en el instrumento para razonar sobre el estado de un programa.Repasar: Del problema al algoritmo
Pregunta 2De unidades anteriores¿Qué escribe la sentencia
std::println("{:.2f}", 2.0 / 3);?Cree que el campo de formato trunca; redondea al decimal más próximo.Ignora el campo de formato: esa es la escritura sin.2f.Cree que la división es entera; con2.0, que tiene decimales, la división es real.El campo.2fescribe el número con dos decimales, redondeando: se escribe0.67. El valor guardado no cambia; solo su escritura.Repasar: Entrada, salida y errores
Pregunta 3De unidades anterioresSe quiere escribir con dos decimales, redondeando. ¿Qué se obtiene?
Trunca en lugar de redondear: descarta la tercera cifra sin mirarla.Redondea a un decimal, no a dos.Aumenta la segunda cifra decimal en más de lo debido: está entre y , y el redondeo elige uno de esos dos.Redondear a dos decimales es elegir el número de dos decimales más próximo: está más cerca de que de . La clase 2.3 mostrará que el computador redondea de la misma manera, pero en base 2, y que por eso casi ningún número con decimales se guarda exactamente.Repasar: Entrada, salida y errores
Pregunta 4De unidades anterioresUn programa tiene en la línea 5
const int pages{12}y en la línea 6std::println("{}", pages);. El compilador escribe6:5: error: expected ',' or ';' before 'std'. ¿Dónde está el defecto?La línea 6 es correcta; el compilador la señala porque allí advirtió la falta.stdse reconoce; el mensaje dice que esperaba un punto y coma antes de él.El mensaje diceerror, nowarning: no hay ejecutable.El compilador descubre la falta cuando encuentra algo que no puede seguir a la declaración, al comienzo de la línea 6, y señala ese lugar. Si la línea señalada está bien, el defecto suele estar al final de la anterior.Repasar: Anatomía de un programa
Pregunta 5Un programa declara
int a{2};yint b{7};, y después ejecutaa = b;yb = 10;. ¿Cuánto valeaal final?Cree que la asignación liga las dos variables, como siafuera otro nombre deb; solo copia el valor.Leea = bal revés, como si copiaraaenb; el valor va de la derecha a la izquierda.Suma los dos valores; la asignación reemplaza, no acumula.La asignacióna = bcopia enael valor quebtiene en ese momento; después,aybson casillas independientes, y cambiarbno cambiaa.Repasar: Variables y memoria
Pregunta 6¿Cómo se escribe el número 13 en base 2?
Es una respuesta honesta: la clase 2.2 enseña a escribir un número en base 2 y a leerlo, y la evaluación de salida volverá a preguntarlo.Lee los restos de las divisiones sucesivas en el orden en que aparecen; se leen del último al primero.Suma mal los pesos: .En base 2 cada posición pesa el doble que la de su derecha, y las cifras solo son 0 y 1. La clase 2.2 lo enseña, porque todo entero de un programa se guarda así.Repasar: Los enteros y su representación
Pregunta 7Un
intde 4 bytes guarda , su valor máximo, y el programa le suma 1. ¿Qué se puede afirmar?Ignora el límite de la representación: ese número no cabe en unintde 4 bytes.Así se comportan los enteros sin signo, cuya aritmética es modular; para los enteros con signo, la norma no lo garantiza.El compilador no conoce los valores que el programa tendrá al ejecutarse, salvo que sean constantes; casi siempre compila sin decir nada.Un entero de un programa tiene un número fijo de bits y, con ellos, un rango finito. Salir del rango de un entero con signo viola la precondición de la suma; el detector del curso lo detiene, y sin él el programa puede escribir cualquier cosa. La clase 2.2 lo estudia.Repasar: Los enteros y su representación
Pregunta 8¿Tiene una expresión decimal finita?
es una aproximación: , no 1.Por muchos que se escriban, sobra siempre un resto; el desarrollo es periódico, no finito.Es una propiedad del número y de la base, no del instrumento; la calculadora solo muestra una aproximación.Una fracción irreducible tiene expresión decimal finita si y solo si su denominador no tiene más factores primos que 2 y 5, los de la base 10. En base 2 la condición es más exigente: el denominador debe ser una potencia de 2, y por eso no tiene expresión binaria finita. La clase 2.3 extrae de ello sus consecuencias.Repasar: Los números de coma flotante
Pregunta 9¿Qué escribe
std::println("{}", 0.1 + 0.2);?Supone que el computador suma decimales exactos; suma aproximaciones binarias.Confunde la escritura por omisión con el campo{:.2f}, que redondea a dos decimales.La suma de dosdoublees legítima; lo sorprendente es su resultado, no su escritura.Ni ni se guardan exactamente en binario, y la suma de sus aproximaciones no es la aproximación de .std::printlnescribe la expresión más corta que identifica el valor guardado, y esa expresión revela la diferencia. La clase 2.3 explica cifra por cifra de dónde sale.Repasar: Los números de coma flotante
Pregunta 10Un programa declara
const double ratio{7 / 2};y escriberatio. ¿Qué aparece?Cree que el tipo de la variable decide cómo se divide; lo decide el tipo de los operandos.Cree que la división entera redondea; descarta la parte decimal.El valor 3 es constante y se representa exactamente en undouble: no hay pérdida, y las llaves lo admiten.La división7 / 2es entre enteros, y da el cociente entero, 3; solo después ese 3 se convierte endouble. La conversión ocurre dentro de la operación, según el tipo de los operandos, y no al guardar el resultado. La clase 2.4 enseña dónde poner la conversión para obtener 3.5.
Cargando el contenido…