Article View: es.comp.lenguajes
Article #69Solucion en lenguaje SIMPLON. Era->[Re: Muy importante]
From: Ignacio Arenaza
Date: Wed, 28 Jul 1999 00:00
Date: Wed, 28 Jul 1999 00:00
155 lines
5768 bytes
5768 bytes
>>>>> "Jose" == Jose Luis Trivino <trivino@lcc.uma.es> writes:
Jose> Supongo que si habeis leido este mensaje hasta aqui ya
Jose> tendreis algo de curiosidad por saber quien solucion� mejor
Jose> este problema, pero eso lo guardo para cuando alguien
Jose> encuentre la soluci�n. Asi podr� crear un poco m�s de
Jose> polemica. Animo y a demostrar quien es el mejor programador.
----[Aviso, mensaje largo y denso, por si quieres deja de leer]---
Bueno, hemos recogido el guante tanto el se�or Javier Cantero como un
servidor, y ayer estuvimos los dos durante una hora mas o menos
"estrujandonos" el coco y llegamos a la siguiente solucion.
Hay que tener en cuenta que usamos una propiedad "no documentada" del
lenguaje propuesto. La construccion
REPETIR n VECES
sentencias
FIN REPETIR
no indica que ocurre en el caso de que "n" sea negativo. Al igual que
#55, hemos presupuesto que en este caso el bucle se repite 0 (cero)
veces.
El proceso que nos llevo a la solucion fue el siguiente:
1.- Realizar el pseudo-codigo del algoritmo (teniendo en cuenta en la
medida de lo posible las limitaciones del lenguaje)
leer dividendo
leer divisor
cociente <- 0
repetir dividendo veces
si dividendo > divisor entonces
restar divisor a dividendo
incrementar cociente
fin repetir
resto <- dividendo
imprimir cociente
imprimir resto
2.- Buscar las construcciones en el lenguaje propuesto que nos
permitan realizar las operaciones no triviales:
a) cociente <- 0
Esta es sencilla. Basta con asignar un valor cualquiera a
cociente y despues repetir la operacion de asignarle a
cociente su valor menos uno, un numero "cociente" de veces.
Como vamos a necesitar el valor 0 en la solucion del caso
b), nos vamos a crear una variable llamada "cero" que
contenga precisamente su valor.
cero := dividendo // un valor cualquiera
repetir cero veces
cero := cero - 1
fin repetir
cociente := cero
b) si a > b entonces
Este caso es un poco mas complicado. La unica forma de
ejecutar algo de forma condicional en el lenguaje dado es
usar la construccion repetir n veces, haciendo que n sea o
bien 1 (TRUE) o bien 0 (FALSE). Por tanto, hay que generar
en una variable intermedia un valor 1 si la condicion es
cierta o 0 si es falsa y luego usar la construccion repetir
con el valor de esa variable.
Para obtener un valor 0 o 1 a partir de una condicion del
tipo a > b, podemos ver si (a-b) es mayor que 0 o no (que
es mas sencilla de realizar)
// c := a - b
c := a
repetir b veces
c := c - 1
fin repetir.
// ver si c > 0
Por tanto, el nuevo problema se reduce a obtener un valor 1
si a > 0, o un valor 0 si a < 0. Usando la premisa
mencionada al comienzo sobre los valores negativos en la
construccion repetir, obtener 1 si el valor es positivo o 0
si es negativo se reduce a:
condicion := cero
repetir a veces
condicion := cero // Esto es,
condicion := condicion + 1 // condicion = 1
fin repetir
Por tanto, uniendo todo el conjunto obtenemos:
c : = a
repetir b veces
c := c -1
fin repetir
condicion := cero
repetir c veces
condicion := cero
condicion := condicion + 1
fin repetir
repetir condicion veces
sentencias condicionales ....
fin repetir
c) restar divisor a dividendo.
Este caso es sencillo. Basta con repetir "divisor" veces la
operacion de asignar a dividendo el valor dividendo - 1
repetir divisor veces
dividendo := dividendo - 1
fin repetir
3.- Reunir todo el codigo en el programa final:
leer dividendo
leer divisor
cero := dividendo
repetir cero veces
cero := cero - 1
fin repetir
cociente := cero
repetir dividendo veces
temp := dividendo
repetir divisor veces
temp := temp -1
fin repetir
condicion := cero
repetir temp veces
condicion := cero
condicion := condicion + 1
fin repetir
repetir condicion veces
repetir divisor veces
dividendo := dividendo - 1
fin repetir
cociente := cociente + 1
fin repetir
fin repetir
resto := dividendo
imprimir cociente
imprimir resto
Un poco largo, eh?
Saludos de I�aki y Javier.
--
PGP Key available at http://personales.jet.es/inaki.arenaza/pgpkey.html
Linux Registered User #44369
Technical Details
Message-ID:
<87g12865yb.fsf_-_@eb2ebu.ampr.org>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<7midgc$13n@telerad.teleline.es> <7mj1oq$7jb@telerad.teleline.es> <378DCE0C.1433597D@interactivebureau.com> <Pine.LNX.4.10.9907160956530.3269-100000@golum.inforg.uniovi.es> <3792E452.5FC9ABE2@lcc.uma.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 14987f,db0404b60281900f,start X-Google-Attributes: gid14987f,public X-Google-Thread: 1116f3,7f2767b4c9fc7a53 X-Google-Attributes: gid1116f3,public X-Google-Thread: f59de,7f2767b4c9fc7a53 X-Google-Attributes: gidf59de,public X-Google-Thread: f877f,7f2767b4c9fc7a53 X-Google-Attributes: gidf877f,public X-Google-Thread: f53ec,7f2767b4c9fc7a53 X-Google-Attributes: gidf53ec,public X-Google-Thread: 10f58f,7f2767b4c9fc7a53 X-Google-Attributes: gid10f58f,public X-Google-Thread: 105378,7f2767b4c9fc7a53 X-Google-Attributes: gid105378,public From: Ignacio Arenaza <inaki.arenaza@jet.es> Subject: Solucion en lenguaje SIMPLON. Era->[Re: Muy importante] Date: 1999/07/28 Message-ID: <87g12865yb.fsf_-_@eb2ebu.ampr.org> X-Deja-AN: 506272992 References: <7midgc$13n@telerad.teleline.es> <7mj1oq$7jb@telerad.teleline.es> <378DCE0C.1433597D@interactivebureau.com> <Pine.LNX.4.10.9907160956530.3269-100000@golum.inforg.uniovi.es> <3792E452.5FC9ABE2@lcc.uma.es> To: Jose Luis Trivino <trivino@lcc.uma.es> Organization: Servidor NNTP de eb2ebu.ampr.org Newsgroups: es.comp.lenguajes,es.comp.lenguajes.c,es.comp.lenguajes.c++,es.comp.lenguajes.java,es.comp.lenguajes.misc,es.comp.lenguajes.tex,es.comp.lenguajes.visual-basicS