09.05.2013 Views

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

112 Capítulo 6. Instrucciones estructuradas<br />

3. La terminación del bucle la t<strong>en</strong>emos asegurada, ya que <strong>en</strong> el cuerpo del bucle<br />

se va disminuy<strong>en</strong>do el valor deresto, con lo que la condición de <strong>en</strong>trada<br />

resto < dsor siempre se va a alcanzar tras un número finito de iteraciones.<br />

La corrección del bucle se deduce del invariante y de la condición de<br />

<strong>en</strong>trada del bucle: tras la última iteración, según el invariante, t<strong>en</strong>emos<br />

ddo = dsor * coc + resto y además, según la condición del bucle, se<br />

ti<strong>en</strong>e que resto < dsor con lo cual el bucle es correcto.<br />

Dep<strong>en</strong>di<strong>en</strong>do del programa <strong>en</strong> particular, aparec<strong>en</strong> distintos tipos de bucles;<br />

no todos los invariantes ti<strong>en</strong><strong>en</strong> por qué ser expresables como relaciones numéricas<br />

<strong>en</strong>tre variables.<br />

En el sigui<strong>en</strong>te ejemplo t<strong>en</strong>emos que localizar la posición del primer carácter<br />

blanco (un espacio) que aparece <strong>en</strong> una frase terminada por un punto.<br />

La idea consiste <strong>en</strong> recorrer la frase carácter por carácter t<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta<br />

la posición del carácter rastreado. Las variables necesarias son dos: car y pos,<br />

para almac<strong>en</strong>ar el carácter leído y su posición. El cuerpo del bucle, <strong>en</strong> cada<br />

iteración, debe leer el sigui<strong>en</strong>te carácter y actualizar la posición; y se volverá a<br />

ejecutar a m<strong>en</strong>os que se haya leído un blanco o un punto, con lo cual, el invariante<br />

ha de ser que Pos conti<strong>en</strong>e la posición del último carácter leído.<br />

El recorrido se va a realizar ley<strong>en</strong>do caracteres delinput, y se supone que éste<br />

conti<strong>en</strong>e algún carácter blanco o algún punto. En estas condiciones t<strong>en</strong>dremos<br />

el sigui<strong>en</strong>te bucle:<br />

var<br />

car: char;<br />

pos: integer;<br />

...<br />

pos:= 0;<br />

{Inv.: pos indica la posición del último carácter rastreado}<br />

repeat<br />

Read(car);<br />

pos:= pos + 1<br />

until (car = ’ ’) or (car = ’.’)<br />

...<br />

La corrección de este bucle se deja como ejercicio para el lector.<br />

❡❡<br />

Se acaba de introducir, de manera informal, el concepto de invariante de<br />

un bucle para analizar su corrección. Sin embargo, no debe p<strong>en</strong>sarse que<br />

los invariantes son herrami<strong>en</strong>tas para verificar bucles a posteriori, esto es,<br />

después de haberlos escrito: es conv<strong>en</strong>i<strong>en</strong>te extraer el invariante “antes” de<br />

escribir nada, pues de esta manera la tarea de programación del bucle se<br />

facilita <strong>en</strong>ormem<strong>en</strong>te.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!