Pascal/Turbo Pascal - secuencias ordenadas

 
Vista:

secuencias ordenadas

Publicado por Nipulid (159 intervenciones) el 13/12/2009 20:55:38
Hola por favor que alguien me ayude!! por mas que lo doy vueltas no soy capaz de hacerlo con tipos simples.

El enunciado completo es el siguiente:

Supongamos que tenemos una caja que contiene infinitas fichas, cada ficha tiene escrita un número del 1 al 9. Queremos evaluar el número de veces que podemos ordenar las fichas de las que disponemos para que los números que muestren sumen una cierta cantidad.
Por ejemplo, si queremos obtener 4 como valor de la suma, tenemos 8 maneras
diferentes de disponer las fichas.
1 1 1 1
1 1 2
1 2 1
1 3
2 1 1
2 2
3 1
4
En la solución mostrada hemos seguido una ordenación similar al diccionario, donde
todas las palabras que empiezan por la ‘a’ aparecen antes que las que empiezan por la ‘b’. y aquellas empezando por ‘aa’ comienza antes que aquellas empezando por ‘ab’.
Hemos mostrado primero todas las que empiezan por 1 antes de aquellas que empiezan por 2 y lo mismo con las que empiezan por 1 1 antes que las que empiezan por 1 2.
Práctica:
Escribe un programa, que podrá tener los subprogramas que estimes convenientes, para determinar la n-ésima forma de ordenar las fichas para hacer una suma fija. Tú
programa debería recibir un entero s (1 0 s 0 32) y otro n (1 0 n < 231) y mostrar la nésima forma de ordenar las fichas, en orden de diccionario, para hacer la suma s.
Supondremos que el programa no recibirá un valor de n mayor que el número de formas de ordenar los bloques.
Ejemplo:
Veamos un ejemplo en el que se nos muestra la quinta forma de sumar el número
cuatro.
s -->4
n -->5
2 1 1
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:secuencias ordenadas

Publicado por Nipulid (159 intervenciones) el 14/12/2009 01:05:28
pues la estructura general, es decir los subprogramas de introducir la suma, el n-esimo, menu general y de opciones e imprimir la suma pero no se como hacer la parte que saca la secuencia ordenada, lo hize con for con while con repeat pero no soy capaz, no lo saco, llevo con el mismo problema y no avanzo apenas!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por pichiotto (1 intervención) el 27/12/2009 00:17:04
Desde que introducistes el hilo en el foro no he dejado de darle vueltas a la cabeza pero tampoco veo la manera de hacerlo, habia pensado que tal vez con recursividad pero no veo claro el caso base. Creo que lo suyo es empezar con "n" e ir realizando restas sobre este (-1) y asi llegar hasta la última posibilidad (primera en tu ejemplo) 1111. De todas formas no lo veo pero sigo dandole vueltas al coco. Animo a los integrantes del foro a ver si lo sacamos entre todos aunque sea por orgullo personal de programador.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por picledo (6 intervenciones) el 30/12/2009 12:29:15
Alguien encuentra alguna solución?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por AlumnoURJC (1 intervención) el 07/01/2010 23:54:39
¬¬_

Ya podías haberle dado un poco más al coco.

Si sabes recursión, y lo que significa VAR, la sacas fácil. Lo único lo de no poder usar ARRAYS, ni STRINGS lo complica,... pero vamos, SACARSE SE SACA.

NO PIENSO ponerte código, ya que, YO TAMBIÉN HE TENIDO QUE DARLE VUELTAS a la cabeza.

Yo también soy alumno de la URJC. Práctica de MTP, o IS de la superior, si no me confundo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por alumno como tu (6 intervenciones) el 08/01/2010 19:10:15
Genial, si, ya supongo que se saca, sería una temeridad poner un ejercicio que no y obviamente con recursión, incluso backtracking, pero poco más, vamos que el algoritmo no lo tengo nada claro y como yo veo que estamos varios compañeros.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por otro alumno (1 intervención) el 09/01/2010 20:20:20
me parece genial compañero ole por ti, pero ya que estamos muchos asi no hace falta que nos digas lo bueno que eres tu, me parece muy bien que te hayas comido la cabeza pero creo que no cuesta tanto decirnos tu idea de como resolverlo, no pedimos tu codigo sino como lo has averiguado porque te aseguro que yo tambien me estoy comiendo la cabeza, no seré tan sumamente listo como tu pero soy un mortal, perdoname, pero no hace falta que nos pongas aqui en el foro lo bueno que eres, es un foro para ayudar no para ponerte galones

un saludo y suerte en los examenes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por otro alumno (1 intervención) el 11/01/2010 16:12:41
para q escribes?? para poner lo maravilloso que eres?? enhorabuena!!
pero como dice otro compañero.. si no quieres ayudar alla tu.. nadie te ha pedido tu codigo.. lee el post inicial.. NADIE te ha pedido nada..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 11/01/2010 19:10:37
Bactracking es para el sudoku, esto "creo" que es más sencillo. Además no sé hasta que punto podría funcionar correctamente.

Haces un procedimiento o una función, como te venga en gana.

La repites mientras que no sea forma=0, también tienes que comprobar que cuando la suma del numero ACTUAL + un sumador no se pase del número que el usuario ha metido.

Es decir si queremos la forma 1 del número 3:
Empieza con el 1, lo comprueba(1), lo almacena (1) y sigue por RECURSIÓN al siguiente.
El segundo 1, lo comprueba(2) y lo almacenan ((1)1).
El tercero 1, lo comprueba(3) (FORMA = 0) y lo almacena ((1)1 1).
Finaliza mostrando el numero. 1 1 1

CUANDO SE TERMINE EL BUCLE:
- Cuando el número siguiente es mayor que el numero del usuario.
- Cuando es un acierto, que pasa al siguiente.
- Cuando la forma es 0.

CUANDO SE TERMINA LA EJECUCIÓN:
- Forma = 0.

POSIBLES PROBLEMAS:
- Los bucles: NO USÉIS UN "FOR", ¡¡¡NI SE OS OCURRA!!!, a no ser que lo tengáis muy claro.
- FUNCIONES, COMO PONGÁIS UN "VAR" EN UNA FUNCIÓN, ESTÁIS SUSPENSOS.
- TOPE DE RANGO DE INTEGER o de LONGINT.
- USAR BIEN LOS "VAR".

Pensar que es un algoritmo, y cómo tal, están creados para tocarnos las pelotas y luego ni corregirlos.

Tomarlo como un reto nada más. Y acordaos de una cosa... andamos jodidos con Bolonia, o sea, apretaros la tuercas con estas cosas, ESTUDIAR RECURSIVIDAD con "FETUCCINI" (dígase Fibonacci), "Euclides" ,...

Vamos... si necesitáis más pistas... ponerlo en el foro de campus virtual y dejaros de la ayuda exterior. Porque si no nos ayudamos entre nosotros mismos, no esperéis que un "especialista" os saque las castañas del fuego con las limitaciones de temario del 1er cuatrimestre.

Aún así, yo estoy con el primer "alumnoUrjc", lo que no se te haya ocurrido en 2 meses... no creo que se te ocurra en 2 horas. Y código... cada uno tenemos nuestra manera de programar y yo soy, creo, el más reacio a poner código, y el que la mayor paranoia se le puede ocurrir.

@Otro alumno : tu tampoco es que aportes muchas soluciones que vea yo. Sólo te has quejado de que uno ha tenido la suerte o la desgracia de sacarlo.
Pienso, que deberías pensar en bien, o pedir una tutoría o ayuda a algún compañero tuyo.

Saludos y espero que este si os haya servido de ayuda. Suerte en los examenes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por picledo (6 intervenciones) el 12/01/2010 18:34:11
Hola,

Muchas gracias por el aporte, pero no entiendo que ocurre en el caso de que la solución planteada sea la 2, es decir, numero 3, solución 2.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 12/01/2010 19:32:42
Es sencillo.

Entrarías en tu procedimiento. Y harías primero el numero 3 forma 1 y cuando terminase, seguirias con las siguientes formas del 3, entonces, cuando lo encuentre, finalizarias.

TRAZA: voy a intentar hacer una traza sencilla. Sin algoritmos, sólo números.
El acumulador se actualiza con el numero actual metido.

Inicio programa:
Primera vez que entras en el procedimiento o función:
Forma: 2, Numero Usuario: 3, Numero actual: 1, Acumulador: 1. LVL1
Siguiente llamada:
Forma: 2, Numero Usuario: 3, Numero actual: 1, Acumulador: 11. LVL2
Siguiente llamada:
Forma: 2, Numero Usuario: 3, Numero actual: 1, Acumulador: 111=3. LVL3
ACIERTO--> Acumulador = Numero usuario, entonces:
Forma: 1, Numero Usuario: 3, Numero actual: 1, Acumulador: 1.LVL2

Forma: 1, Numero Usuario: 3, Numero actual: 2, Acumulador: 112>3.LVL3 - ME PASO, NO SIGO. Acumulador + Numero actual > Numero Usuario.

Forma: 1, Numero Usuario: 3, Numero actual: 2, Acumulador: 12.LVL2
ACIERTO--> Acumulador = Numero usuario, entonces:
Forma: 0, Numero Usuario: 3, Numero actual: 2, Acumulador: 12.LVL2

Muestra por pantalla: 1 2.
-------------------------------------------------------------------------------------------------------

Por eso, como dice @AlumnoURJC, es saber utilizar "VAR", porque es lo único que te deja "actualizar" TOOOOOOOOOODAS las variables anteriores.

**Recuerdo**
En un procedimiento, si lleva VAR, SE MODIFICA TODA LA VARIABLE.
Si no lleva VAR es una copia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por picledo (6 intervenciones) el 12/01/2010 19:41:22
Es decir, decrementas forma hasta llegar a la que necesitas, no? que siempre es la última, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por picledo (6 intervenciones) el 12/01/2010 19:51:55
Disculpa, el punto que no me cuadra es en el que dices:

Forma: 1, Numero Usuario: 3, Numero actual: 1, Acumulador: 1.LVL2

Forma: 1, Numero Usuario: 3, Numero actual: 2, Acumulador: 112>3.LVL3 - ME PASO, NO SIGO. Acumulador + Numero actual > Numero Usuario.

Como ha aumentado al 2, con que condición¿
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 12/01/2010 22:45:11
Vamos a ver...

Creo que es algo sencillo y a la vez complicado.

Esta recursividad no es de un IF y ale.. caso base, y recursividad y FIN.

No no... esta práctica es una putada ejemplar.

Es la estructura de un "árbol".
Imagínate un árbol, cuando se abre la copa desde el tronco, hay pocas ramas grandes y gordas, bastantes ramas de tamaño medio y hay miles de ramas, y en cada rama hay hojas.

Bien.

Ahora piensa que cada nodo que vayas a hacer son realmente 9, que llama a otros 9 y así hasta que cumplas los 32 dígitos. (mi práctica no lo hace, pero he puesto unos buenos "PRE" y "POST"). Siempre va a llamar del 1 al 9 exceptuando que se pase.

Buah! te estoy contando la paranoia mongólica que se me ocurrió el primer día. Y que he ido llevando a cabo con mucha paciencia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por picledo (6 intervenciones) el 12/01/2010 22:50:01
Gracias compañero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Nipulid (5 intervenciones) el 12/01/2010 23:11:54
pues yo tengo pensado otra manera y consulte al profesor y me dijo que iva bien encaminado.... os cuento

para sacar la secuencia ordenada de una
determinada suma voy recorriendo todos los numeros desde un maximo
hasta el numero de la suma y hago un procedimiento que calcula la
suma de las cifras de cada numero recorrido ej:

suma=5 numero= 11.111

pero al hacerlo de esta manera si el numero es muy grande pasa del
rango de los integer,

el profesor me dijo almacénalo en un real. Luego, cuando el algoritmo para encontrar la solución ya haya acabado, haces un procedimiento que vaya obteniendo cada dígito de ése real y lo muestre correctamente en pantalla.

a dia de hoy estoy aun bloqueado puesto que sale del rango y no veo otra manera de hacerlo..

haber si entre todos lo conseguimos sacar!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 13/01/2010 10:30:48
@Picledo: Vamos a ver...

Yo lo he hecho con un BUCLE con una sentencia IF dentro.

Este bucle hace 9 "POSIBLES" llamadas recursivas y finaliza cuando la forma es 0.
Este bucle no llamará de nuevo a la función si el siguiente número es mayor que el número introducido por el usuario.

Creo que es importante tener claro el concepto de VAR.
Si tú pones VAR en una variable, esta variable en la recursividad se irá actualizando a cada momento en todoooooooos los lados. Si no la pones, sólo generará una variable "copia" de la que se ha introducido en la llamada y sólo tendrá validez en ese procedimiento.

@Nipulid:
El mío, hace lo mismo pero desde el principio, y también tiene problemas de rango.

En el pre y post del procedimiento recursivo, le he puesto que un "longing" tiene posibilidad de "CASI" almacenar 10 números.
Como no podemos usar "cadenas de caracteres", dígase, Strings... pues es lo más cercano a una solución válida.

De todas formas, si os dais cuenta, el mayor número sale siempre con la primera forma.
P.E:
forma 1 del numero 10 : 1 1 1 1 1 1 1 1 1 1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por alumno (3 intervenciones) el 14/01/2010 11:54:13
hola, como vais? la entrega es mañana y yo sigo bloqueadisima, alguien me puede echar una mano? gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 14/01/2010 12:36:41
pfff...

Yo la entregué,.. me funciona con 10 números, nada de 32 como dice la práctica

Encima la profesora no contesta por Campus Virtual, ni correos, ni nada por el estilo así que.... Ahí se queda entregada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por alumnos (3 intervenciones) el 14/01/2010 14:25:03
Yo tengo un cacao con la práctica... se mas o menos lo que hay que hacer, que en definitiva es usando la recursividad pero tengo un lio en el caso base... pos na a entregarla como se pueda :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por todos= (3 intervenciones) el 14/01/2010 16:46:48
es que el profesor nos dijo de tomar el numero maximo y de ahi ir restando.. pero lgo que el caso base fuera el 1.. asique no encuentro una manera de que me cuadren las 2 ideas..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por alumnoenapuros (3 intervenciones) el 14/01/2010 16:50:41
una pregunta, a la idea esa que poneis ahi, yo tuve una idea parecida pero mi problema es donde dice ahi almacena la variable osea, primero saco el primer 1, leugo otro 1, como hago para que la variable me saque 1 1 y no me sume 1+1? gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Nipulid (5 intervenciones) el 14/01/2010 17:09:07
alumnoenapuros, si puedes explica un poco mas tu idea pq no me queda clara, yo lo que veo para almacenarlo como dices tu es poner una variable tipo char de manera que sumandole un 1 seria 11 y no 2, pero como vas sacando uno a uno los numeros?? ya que para el caso de 1 si es sencillo pero para por ejemplo sacar la 3 o 4 forma de otro numero que no tenga todos 1...

haber si lo sacamos entre todos!! animo a todos a participar que aunque quede poco aun no son las 23:59 de mañana!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por alumnoenapuros (1 intervención) el 15/01/2010 17:32:15
'1'+'1' es un tipo string, sigo aqui dando vueltas al coco.. esto no tiene solucion.. alguien me echa una mano??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 17/01/2010 14:40:21
Joé...

Lo siento por decirlo así, pero... MIRA QUE SOIS DIFíCILES.
1+1 = 11

Por cierto han aumentado la fecha de entrega, así que voy a descargarmela para darle otra vuelta de tuerca.

acumulador := 0:

numero:= 1 ;
acumulador := (0 + 1) *10 = 10;

numero:= 1 ;
acumulador := 1
acumulador := (10+1)*10 = 110 ;

haces un DIV 10 cuando lo vayas a usar. Además, como tienes que usar varios acumuladores, si terminan en 0 y no se pasan de tope, lo puedes meter ahí, si se pasan de tope... pasas al siguiente.

Eso sí:
integer = 5 cifras (32 numeros = 7 variables acumuladoras de este tipo=
longint = 10 cifras (32 numeros = 4 acumuladores)

mejor solución??
4 longint + 1 integer como acumuladores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Nipulid (5 intervenciones) el 17/01/2010 20:06:02
donde pone eso de que han aumentado la fecha de entrega?? en el portal no lo veo!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:secuencias ordenadas

Publicado por Kenjo (9 intervenciones) el 18/01/2010 09:44:22
PORTAL SERVICIOS DE I. T. I. G. (Gestión):
---------------------------------------------------------------------------------
Fecha: Viernes, Enero 15, 2010 12:36

Hola a todos

He comprobado que muchos de vosotros no habéis entregado la práctica obligatoria...
Aprovecho para comunicaros un par de cosas que pueden resultaros de interés:

1. Voy a ampliar la entrega hasta el 24 de enero (23 horas). ¿Qué significa esto? Que
quienes la hayan entregado ya, podrán obtener hasta un 10. Y quienes necesiten algo
más de tiempo, podrán obtener un máximo de un 9.

2. Quienes no entreguen la práctica ahora (primer parcial) deberán entregar la misma
práctica (más la/s que se habiliten para el segundo parcial) en la convocatoria de mayo
y/o junio. Es decir, que no os libráis, hay que hacerla de todas todas.

3. Para "hacer la foto" de quienes han entregado la práctica en plazo, necesito un poco
de tiempo, así es que hasta esta noche no podréis volver a entregar las prácticas por
TRABAJOS, que es la ÚNICA vía para hacerlo.

---------------------------------------------------------------------------------
OMITO nombre de la profesora, pero vamos, NO estoy muy contento con ella.

Eso sí, me ha dado tiempo suficiente para hacer una práctica nueva y que funcione al 100% y no tan limitada como la que le entregué. Y ayudar a una compañera a entregarla.

Mirar en vuestros "campus Virtuales" si sois de la superior o de sistemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar