1 Chapter 6 Looping Dale/Weems/Headington
2 2 Chapter 6 Topics l While Statement Syntax l Count-Controlled Loops l Event-Controlled Loops l Using the End-of-File Condition to Control Input Data l Using a While Statement for Summing and Counting l Nested While Loops l Loop Testing and Debugging
3 3 l Un “loop” es una estructura de control de repetición l Esto causa que un solo “statement” o bloque se ejecute varias veces. ¿Qué es un loop (ciclo)?
4 4 Dos Tipos de Loops(ciclos) count controlled loops (FOR) repite los “statements”una cantidad determinadad de ocurrencias (veces). event-controlled loops Existe una condición dentro del cuerpo del ciclo que causa que se termine la repetición de los “statements”.
5 5 While Statement SYNTAX while ( Expression ) {.. // loop body. } NOTA: El “Loop body” puede ser un solo “statement”, un “statement” nulo o un bloque.
6 6 Cuando se prueba la expresión y se determina que es falsa, se sale del ciclo y el control pasa al “statement”que sigue despues del “loop body”. WHILE LOOP FALSE TRUE body statement Expression
7 7 Una inicialisación de la variable que controla el ciclo una expresión que pruebe la continuidad del ciclo una actualización de la variable que controla el ciclo el cual se ejecuta en cada interación del cuerpo (“body”) del ciclo. “ Count-controlled loop” contiene
8 8 int count ; count = 4; // initialize loop variable while (count > 0) // test expression { cout
9 9 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
10 10 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
11 11 Count-controlled Loop int count ; count = 4; while (count > 0) TRUE { cout
12 12 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
13 13 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
14 14 Count-controlled Loop int count ; count = 4; while (count > 0) TRUE { cout
15 15 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
16 16 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
17 17 Count-controlled Loop int count ; count = 4; while (count > 0) TRUE { cout
18 18 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
19 19 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
20 20 Count-controlled Loop int count ; count = 4; while (count > 0) TRUE { cout
21 21 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
22 22 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
23 23 Count-controlled Loop int count ; count = 4; while (count > 0) FALSE { cout
24 24 Count-controlled Loop int count ; count = 4; while (count > 0) { cout
25 25 myInfile contiene 100 muestras de presión sangínea Utilize un ciclo while para leer las 100 muestras de presión sanguínea y busque la suma total Ejemplo de “Count-Controlled Loop”
26 26 ifstream myInfile ; int thisBP ; int total ; int count ; count = 0 ; // initialize while ( count < 100 ) // test expression { myInfile >> thisBP ; total = total + thisBP ; count++ ; // update } cout
27 27 Ciclos “Event-controlled” l Sentinel controlled Mantiene procesando data hasta que un valor especial, que no es un valor común, se entra para indicar que el procesamiento debe terminar. l End-of-file controlled Mantiene procesando data mientras encuentre datos en el archivo para leer. l Flag controlled Mantiene procesando data hasta que el valor de un flag cambia en el cuerpo del ciclo. 27
28 28 Ejemplo de los tipos de ciclos Count controlled loop Lee exáctamente 100 muestras de presión sanguínea de un archivo. End-of-file controlled loop Lee todas las muestras de presión sanguínea de un archivo sin importan cuantos hay. 28
29 29 Ejemplo de los tipos de ciclos Sentinel controlled loop Lee las muestras de presión sanguínea hasta que un valor especial (EJ. -1) seleccionado por el usuario, es leído. Flag controlled loop Lee las muestras de presión sanguínea hasta que se lee un valor peligrosamente alto (200 o más). 29
30 30 Un ciclo “Sentinel-controlled” l Requiere un “priming read” l “priming read” significa que debes leer un conjunto de datos antes de ejecutar el while.
31 31 // Sentinel controlled loop total = 0; cout > thisBP; while (thisBP != -1)// while not sentinel { total = total + thisBP; cout > thisBP; } cout
32 32 Ciclo “End-of-File” l Depende del hecho de que el archivo caiga en un “fail state” al tratar de leer otro dato cuando se llega al final del archivo.
33 33 total = 0; myInfile >> thisBP; // priming read while (myInfile) // while last read successful { total = total + thisBP; myInfile >> thisBP; // read another } cout
34 34 //End-of-file at keyboard total = 0; cout > thisBP; // priming read while (cin) // while last read successful { total = total + thisBP; cout > thisBP; // read another } cout
35 35 Ciclos controlados por “Flags” l Inicializas un flag (true o false) l Usas un nombre significativo para el flag l Una condición en el cuerpo del ciclo cambia el valor del “flag” l Probar el “flag” en la expresión que prueba el ciclo.
36 36 countGoodReadings = 0; isSafe = true; // initialize Boolean flag while (isSafe) { cin >> thisBP; if ( thisBP >= 200 ) isSafe = false; // change flag value else countGoodReadings++; } cout
37 37 Los ciclos se utilizan con frecuencia para… l Contar todos los valores de un dato l Contar valores especiales l Sumar (acumular) los valores de los datos l Mantener un seguimiento de valores previos y actuales
38 38 Valores anteriores y actuales l Escribir un programa que cuenta el número de los operadores != en un programa. l Lee un caracter en el archivo a la vez. l Mantener un seguimiento de los caracteres previos y actuales.
39 39 Mantener seguimiento de los valores (x != 3) { cout
40 40 int count; char previous; char current; count = 0 ; inFile.get (previous); // priming reads inFile.get(current); while (inFile) { if ( (current == ‘=‘) && (previous == ‘!’) ) count++; previous = current;// update inFile.get(current); // read another }
41 41 initialize outer loop while ( outer loop condition ) {... initialize inner loop while ( inner loop condition ) { inner loop processing and update }... } Patrones de un “Nested Loop” 41
42 42 Datos de Pacientes Este archivo contiene datos de presión sanguinea de diferentes pacientes. Cada linea tiene un ID, el número de lecturas para ese paciente, seguido de las distintas lecturas. ID howManyReadings 4567 5180 140 150 170 120 23182170 210 52323150 151 151
43 43 4567152 2318190 5232151.. There were 432 patients in file. Lee los datos y muestra los resultados Patient ID BP Average
44 44 Algoritmo usado para los “Nested Loops” l inicializar patientCount a 0 l Lee el primer ID y el howMany del archivo l while not end-of-file n incrementa patientCount n display ID n usar un “count-controlled loop”para leer y sumar la cantidad de lecturas del paciente n calcula y muestra el promedio del paciente n Lee next ID y howMany del archivo l display patientCount
45 45 Para diseñar un “nested loop” l Comenzar con el “outer loop” l Cuando se sabe donde va el “inner loop”, se hace un módulo por separado
46 46 #include #include using namespace std; int main ( ) { int patientCount; // declarations int thisID; int howMany; int thisBP; int totalForPatient; int count; float average; ifstream myInfile; 46
47 47 myInfile.open(“A:\\BP.dat”); if (!myInfile ) // opening failed { cout > thisID >> howMany; // priming read 47
48 48 while ( myInfile ) // last read successful { patientCount++; cout > thisBP; count ++; totalForPatient = totalForPatient + thisBP; } average = totalForPatient / float(howMany); cout thisID >> howMany; // another read } 48
49 49 cout
50 50 Información Sobre 20 Libros en un Archivo en Disco “A:\\myIn.dat” 3.98 P 7.41 H 8.79 P. Precio del Libro “Hardback” o “Paperback”? ESCRIBA UN PROGRAMA QUE SUME TODOS LOS PRECIOS DE LOS LIBROS
51 51 #include // for cout #include // for file I/O using namespace std; int main (void) { float price ; // declarations char kind ; ifstream myInfile ; float total = 0.0 ; int count = 1; Programa que lee sobre 20 Libros en un Archivo en Disco
52 52 Resto del Programa myInfile.open(“A:\\myIn.dat”) ; // count-controlled processing loop while ( count > price >> kind ; total = total + price ; count ++ ; } cout
53 53 Seguimiento de las Variables del Programa count price kind total 0.0 1 3.98 ‘P’ 3.98 2 7.41 ‘H’ 11.39 3 8.79 ‘P’ 20.18 4 etc. 20 21 so loop terminates
54 54 Complejidad Es una medida de la cantidad de trabajo envuelta al ejecutar un algoritmo relativo al tamaño del problema.
55 55 Polynomial Times N N 0 N 1 N 2 N 3 constant linear quadratic cubic 11 1 1 1 101 10 100 1,000 1001 100 10,000 1,000,000 1,0001 1,000 1,000,000 1,000,000,000 10,0001 10,000 100,000,000 1,000,000,000,000
56 56 Prueba y “Debugging”del “Loop” (ciclo) La data de prueba debe cubrir todas las secciones (módulos) del programa l Cuidado con los ciclos infinitos – el programa no se detiene l Verifica la condición de cotejo del ciclo y cotejar el problema de que se quede corto por uno l Usar la función “get” para los “loops” controlados para detectar el caracter ‘\n’ l Usar el algoritmo “walk-through” para verificar pre y post condiciones l Seguimiento a la ejecución del código de un ciclo a mano usando el “walk-through“ l Usar el “debugger” para correr programas en “slow motion” o utilizar “statements” que facilitan el “debug”