Hola Sergio, comentarte varias cuestiones. La primera es que un problema de programación puede tener varias soluciones y varias de ellas ser igual de buenas. Por tanto no tienes que obsesionarte con buscar soluciones perfectas porque no las hay, simplemente se buscan soluciones lo más efectivas posibles gastando el menor tiempo posible, no se busca la solución perfecta.
Vamos ahora al ejercicio que comentas. Quizás es enunciado no está del todo claro, voy a tratar de aclararlo. Cuando dice que se extraen datos en paquetes de 100 unidades significa que el programa comienza y extrae Dato(1), Dato(2), ... Dato(98), Dato(99), Dato(100). Cuando llega a 100, ya ha completado un paquete. Para cada dato se evalúa si cumple las condiciones (que sea mayor que 600 y menor que 700). Si ocurre esto, se añade una unidad a un contador que controla cuántos datos que cumplen la condición han existido.
Al terminar la extracción del primer paquete el número de datos que se han extraído es 100 y el número máximo de datos que puede cumplir la condición es 100. La condición para que termine el programa es que haya más de 100 datos que cumplan la condición. Si hemos leído 100 datos exactos y para terminar el programa se requiere que haya más de 100 que cumplan la condición, es imposible que con el primer paquete de datos termine el programa.
Obligatoriamente se pasará al segundo paquete de datos que comprende Dato(101), Dato(102), ... , Dato(199), Dato(200), es decir, obligatoriamente tendrá lugar una segunda pasada por el bucle Mientras
Una vez terminado este segundo paquete de datos ya habremos leído 200 datos, de los cuales cierto número cumplirán la condición de ser mayores de 600 y menores de 700. Supongamos que los datos que cumplen son 30: el programa no termina, se seguirán extrayendo datos. Supongamos que los datos que cumplen son 116: entonces la condición para que termine el programa ya se cumple y esto lo reflejamos en una variable booleana esperado = Verdadero que dará lugar a que ya no se extraigan más datos. (Es decir, que no se vuelva a repetir el bucle).
Ahora veamos lo que tú comentas:
No entiendo por qué es necesario manipular el contador de este modo, pues a mi entender, n ya se encuentra en el valor necesario en el caso de retomar el bucle o en caso de mostrar el mensaje
Si te fijas, hay dos contadores: i y j. i cuenta desde el primer dato del paquete de datos hasta el último en un bucle desde ... siguiente. j es un acumulador que va acumulando el número de datos que cumplen la condición.
¿Qué es n? n no es un contador. No siempre que veamos una letra como i, j, k, n... tienen que ser contadores. Hay que fijarse específicamente qué es lo que hacen o significan. n es un índice que nos dice cuál es el primer valor del paquete de datos, así n inicialmente vale 1. i cuenta de 1 a 100. Luego se hace n=n+100 lo cual significa que n=101 que es el índice para el primer elemento del segundo paquete. i contará de 101 a 200. Si hubiera otra repetición de bucle, n sería n=201 e i contaría de 201 a 300...
Durante el primer bucle n vale siempre 1, lo que va cambiando es i. Si no cambiáramos el valor de n, este seguiría siendo 1 al final. Hemos de cambiarlo.
Por tanto: no hay manipulación de contador, lo que se hace es ir estableciendo los índices iniciales que van siendo necesarios.
¿Cuál es la necesidad de poner Mostrar “Se cumple lo previsto habiendo extraído”, j, “datos de un total de”, n + 99, “datos”?
Me parece que esto no es adecuado, porque de este modo se está sumando 99 al último valor de n en el bucle...
La necesidad de mostrar eso: el enunciado dice "indicar el número de datos que se extrajeron frente al total extraído". Lo que se hace es, una vez ha terminado la extracción de un paquete de datos, se evalúa lo que ha ocurrido. Si se verifica la condición de terminación del programa, el valor de n que tenemos es el correspondiente al primer dato del último paquete que se extrajo. ¿Cuál es el índice del último dato del último paquete extraído? n+99, por ejemplo, si es el segundo paquete el primer dato es n=101 y el último dato es n+99, es decir, 200. Lo que nos dice ese mensaje es cuántos valores cumplieron y cuántos fueron leídos en total.
Con la instrucción Mostrar no se está sumando 99 al último valor de n: mostrar es mostrar, no modifica el valor de la variable. Para realizar una modificación tendríamos que escribir n = n+99. El simple hecho de escribir una operación dentro de un mostrar no modifica el valor de la variable. Para modificar el valor de la variable hay que hacerlo con una operación de asignación (usando el =).
Otra cosa que comentas:
Si se vuelve a ingresar al bucle porque esperado=falso al finalizar el primer paquete, sin esta aclaración el bucle empezaría en n=101, con la instrucción n=n+100 se empezaría en 201...
Correcto: si lees la explicación anterior verás que esto es exactamente lo que se pretende.
Me he extendido un poco, espero que al menos te sirva de ayuda