Parcialito 3 - 2024a - Tema 2#
Ejercicio 1: “123456”#
Para robustecer la seguridad de los datos de los estudiantes, la Oficina de Alumnos ha decidido implementar un sistema de contraseñas más seguro. A partir de ahora, cada contraseña de acceso al Sistema de Gestión deberá cumplir con los siguientes criterios:
- La contraseña debe tener al menos 8 caracteres.
- La contraseña debe contener al menos algún dígito entre 0 y 9.
- La contraseña debe contener al menos una letra mayúscula (entre A y Z).
- Todos los caracteres de la contraseña deberán estar comprendidos entre el 33 y el 126 de la tabla ASCII.
Se pide:
-
(3 puntos) Escriba una función int verificar_password_udesa(char password[ ], int longitud) que reciba como parámetros el password propuesto (que es un string, o array de caracteres) y un número entero indicando la longitud de dicho array. La función deberá analizar si el password recibido cumple con las reglas impuestas por la Oficina de Alumnos, y en dicho caso devolver 1. En caso de que el password no cumpla con alguna condición, la función deberá devolver 0.
-
(3 puntos) Escriba un programa principal int main() que solicite al usuario el ingreso de un password y lo verifique, reiterando el pedido hasta que el password ingresado sea satisfactorio. Esta función deberá hacer uso de la función definida en el punto a.
Te mostramos cómo debería verse la interfaz de este programa principal:
Ingrese password: 1234 > Tu password no cumple las condiciones. Leé bien y volvé a intentar Ingrese password: pirulo123 > Tu password no cumple las condiciones. Leé bien y volvé a intentar Ingrese password: metenesharto123 > Tu password no cumple las condiciones. Leé bien y volvé a intentar Ingrese password: MeTenesHarto123 > Excelente! Tu password ha sido modificado.
A continuación imprimimos la tabla de caracteres ASCII indicando cuál es el mapeo entre números y caracteres en esta codificación.
Dec Char Dec Char Dec Char Dec Char 0 NUL 32 SPACE 64 @ 96 ` 1 SOH 33 ! 65 A 97 a 2 STX 34 “ 66 B 98 b 3 ETX 35 # 67 C 99 c 4 EOT 36 $ 68 D 100 d 5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL 39 ‘ 71 G 103 g 8 BS 40 ( 72 H 104 h 9 HT 41 ) 73 I 105 i 10 LF 42 * 74 J 106 j 11 VT 43 + 75 K 107 k 12 FF 44 , 76 L 108 l 13 CR 45 - 77 M 109 m 14 SO 46 . 78 N 110 n 15 SI 47 / 79 O 111 o 16 DLE 48 0 80 P 112 p 17 DC1 49 1 81 Q 113 q 18 DC2 50 2 82 R 114 r 19 DC3 51 3 83 S 115 s 20 DC4 52 4 84 T 116 t 21 NAK 53 5 85 U 117 u 22 SYN 54 6 86 V 118 v 23 ETB 55 7 87 W 119 w 24 CAN 56 8 88 X 120 x 25 EM 57 9 89 Y 121 y 26 SUB 58 : 90 Z 122 z 27 ESC 59 ; 91 [ 123 { 28 FS 60 < 92 \ 124 | 29 GS 61 = 93 ] 125 } 30 RS 62 > 94 ^ 126 ~ 31 US 63 ? 95 _ 127 DEL
Ejercicio 2: Nissan-GTR#
(2 puntos) Débora acaba de comprarse un Nissan-GTR y quiere chequear cuál es la aceleración que alcanza su vehículo. Para ello le instaló un odómetro digital, que permite medir la distancia recorrida acumulada por el vehículo a lo largo del tiempo, tomando muestras cada 1 milisegundo.
Cuando este dispositivo se activa, realiza mediciones durante 10 segundos y nos devuelve un array de 10.000 floats, que representan la distancia recorrida acumulada (en metros) en cada milisegundo. Dado que en 10 segundos hay 10.000 milisegundos, el dispositivo nos devuelve un array con 10.000 mediciones.
A partir de estos datos de distancia recorrida acumulada en metros, es posible calcular la aceleración del vehículo en \(m/s^2\) en cada paso utilizando la siguiente aproximación numérica:
en donde \(\Delta\) es el tiempo que transcurre entre dos muestras, que en nuestro caso es de 0.001 segundos.
Escriba una función void calcular aceleración(float distancias[], float aceleraciones[]) que reciba el array de las distancias y calcule la aceleración del vehículo (en \(m/s^2\)) en cada milisegundo a partir de la fórmula anterior, guardándola en el array de aceleraciones que recibe por parámetro.
Dado que en la primera y la última posición del array de aceleraciones no podremos calcular la fórmula porque no disponemos de los valores vecinos de la distancia, en esos casos la aceleración quedará indicada como 0.0.
Ejercicio 3: Sistemas de representación numéricos#
Para cada uno de los siguientes 3 items muestre los cálculos o el razonamiento involucrados para justificar su respuesta:
- (0,5 puntos) Convierta el número 108 del sistema de numeración decimal al sistema binario.
- (0,5 puntos) Convierta el número 1001100001 del sistema de numeración binario al sistema hexadecimal.
- (0,5 puntos) Represente el número entero -16 en código binario de 8 bits utilizando la representación de complemento a la base.
Para la siguiente afirmación, indique si la misma es verdadera o falsa, justificando su respuesta:
- (0,5 puntos) “La representación de punto flotante de 32 bits, a diferencia de la de punto fijo de 32 bits, permite representar todos los números de la recta real.”
Bonus track: Decodificando passwords#
(1 punto) Con nuestras habilidades hackers hemos descubierto que en determinada sección de un programa compilado en C se almacena una password que necesitamos recuperar. Dado que el programa compilado posee instrucciones de máquina, no podemos abrirlo con un editor de texto. Pero observando el programa con un editor hexadecimal, observamos los siguientes valores hexa en el lugar en donde debería estar el password (se indica resaltado):
13 0A 40 27 30 05 00 A0 F5 D3 AA 05 6A
80 03 9A FA 50 69 6B 61 63 68 75 03 18
18 20 04 70 A0 D5 13 03 F0 B3 FF D0 7A
Ayudado por la tabla de conversión ASCII, descifre el password contenido en el programa.