[2018][Julio][Problema 1]

[2018][Julio][Problema 1]

de Alexis Alfonso -
Número de respuestas: 2

Hola, no me queda claro cómo es la lógica que aplica la solución, específicamente en la parte que chequea si el auto ya fue multado o no y cómo guarda esa info.

Me surgen estas dudas:

1- por qué chequea el valor de "autos[i].ocupado" nuevamente dentro del if donde ya se chequeó eso más arriba.

2. cuando verifica el & entre "ocupado" y "CHK_VEL", cuál es el valor de verdad de eso? un and bit a bit entre [0|1] y el char 0x80? no es siempre cero eso?

3. Si el auto fue multado por velocidad, luego no puede multarse por luz roja? Según me parece, la lógica está hecha para que no, pero la letra dice que se le saca una foto por cada tipo de infracción (entiendo que si tuvo exceso de velocidad y cruzó con roja, se le sacarían 2 fotos).

Adjunto un par de capturas con las partes que me generaron estas dudas.





____________




En respuesta a Alexis Alfonso

Re: [Examen Julio 2018][Problema 1]

de Federico Rivero -
Estimado,

Creo que todas las dudas vienen por el mismo lado, así que voy a explicar un poquito lo que se hace en la solución con el campo 'ocupado'.  La idea es que un 0 en ese campo indique que está libre y cualquier otro valor indique que esa entrada se está usando. Adicionalmente, al ocupar esa posición se inicializa el campo con el OR de los bits que indican el tipo de multa en la foto (bits 7 y 6, 0x80 y 0x40), y la idea es que esos bits se van apagando una vez que el auto comete las infracciones. Si comete ambas infracciones se apagan ambos bits y la posición queda automáticamente libre porque la variable vale 0.

1- por qué chequea el valor de "autos[i].ocupado" nuevamente dentro del if donde ya se chequeó eso más arriba.

No se chequea nuevamente dentro del if, lo que se chequea es autos[i].ocupado & CHK_VEL . Al realizar el and bit a bit, se está viendo que específicamente el bit de la multa de velocidad esté encendido, o sea, que no haya sido multado ya por velocidad. Resumiendo:

autos[i].ocupado != 0 indica que a ese auto aún se le puede aplicar alguna multa
autos[i].ocupado & CHK_VEL != 0 indica que a ese auto aún se le puede aplicar la multa de velocidad
autos[i].ocupado & CHK_LUZ != 0 indica que a ese auto aún se le puede aplicar la multa de luz

2. cuando verifica el & entre "ocupado" y "CHK_VEL", cuál es el valor de verdad de eso? un and bit a bit entre [0|1] y el char 0x80? no es siempre cero eso?

Como se mencionó más arriba, la variable ocupado no se inicializa con 0 o 1, se inicializa con el OR de los bits de multa.

3. Si el auto fue multado por velocidad, luego no puede multarse por luz roja? Según me parece, la lógica está hecha para que no, pero la letra dice que se le saca una foto por cada tipo de infracción (entiendo que si tuvo exceso de velocidad y cruzó con roja, se le sacarían 2 fotos).

Sí puede aplicarse la doble multa. Cada multa aplicada apaga uno de los dos bits con los que se inicializa la variable posición, pero son independientes.

Espero que quede más claro!

Saludos,
Federico