Orientación con un problema

Iniciado por Caster, 16 Mayo 2013, 19:37 PM

0 Miembros y 2 Visitantes están viendo este tema.

Caster

Buenas, pues ya hace un par de meses que deje la programación por falta de tiempo y quiero retomarla para no perder la practica y que mejor forma de hacerlo que resolviendo algunos problemas, no son muy avanzados mis conocimientos, pero creo que me valdrán para hacer el siguiente problema:

CitarUna agencia de publicidad está diseñando un catálogo, organizado en capítulos. Para
hacer más atractivo el diseño gráfico, en cada página quiere poner un fondo en un color
suave que contenga una secuencia de letras que, sin ser el nombre completo del
capítulo, ni una letra aislada, lo identifique sin ambigüedad, cuando esto fuera posible.
Por ejemplo, si un capítulo fuera pincel y otro pipa, se podrían utilizar como fondo
secuencias como pin, pinc, pince, pip, ipa, etc. Por el contrario, no se
podrían utilizar secuencias como pi por ser ambiguas. Llamaremos identificadores de
las palabras a las secuencias más básicas que identifican sin ambigüedad a un capítulo.
En el ejemplo que dimos, pin, pip e ipa son identificadores. pinc y pince no lo
son, dado que se forman agregando letras a secuencias más cortas.
El problema consiste en encontrar tales identificadores. La lista de nombres de capítulos
está contenida en el archivo ident.in. Cada capítulo está identificado por una sola
palabra, de hasta 15 caracteres. Hay una línea en el archivo por cada capítulo, y el fin
está indicado por una línea en blanco. En total puede suponerse que hay 20 capítulos o
menos.
La salida se debe grabar en el archivo ident.out y debe contener los identificadores
válidos para cada capítulo, en un formato similar al del ejemplo. Los identificadores
válidos son los que tienen dos o más caracteres, están contenidos en el nombre de cada
capítulo pero no son el nombre completo, lo representan sin ambigüedad, y no hay
partes de éstos que también los representen. El orden de los identificadores no es
importante.
Ejemplo: Si ident.in contiene:
papel
pincel
cinc
pipa
cincel
El archivo ident.out podría contener:
papel:
ap
pe
pincel:
pin
cinc:
pipa:
ip
cincel:
cince

Lo de trabajar con archivos lo ignoro porque no tengo ni idea de como va eso, no estoy pidiendo para nada que me deis una solución, solo que me deis alguna idea, que me orientéis un poco, porque no se por donde empezar.
Por si a alguien le interesa, el problema está extraído de la pagina de la OIA (Olimpiada Informática Argentina) en la sección de problemas.

Edito: El lenguaje que voy a utilizar es C.

Saludos

leosansan

#1
Antes que nada un fuerte saludo otra vez y gracias por la alegría que me das al verte  por aquí.

Para que te hagas una idea de lo que te proponen, ya que no vas a usar ficheros pues aún no has llegado -tranqui!, todo es cuestión de tiempo- puedes imaginarte un capítulo como un array compuesto de diversas palabras. Por ejemplo suponiendo que ninguna palabra exceda de 20 caracteres:


Código (cpp) [Seleccionar]

char capitulo1[15][20]={"pincel","pipa","Cine","Teatro", ....-y así hasta quince....}
char capi1[15][20]={0};


Y lo que podrías hacer es recorrer el array capitulo1 y guardar en capi1 las palabras abreviadas. Ahí veo una pequeña laguna en cuanto al número de letras a tomar como abreviaturas de las originales. Por hacerlo de forma esquemática yo te propondría que tomaras la longitud de la palabra, que la obtienes con strlen, menos tres de forma que pincel sería pin, como ejemplo.

Se trataría en esencia de ir recorriendo con un for el array
Código (cpp) [Seleccionar]
capitulo1[i]
y en otro for interno al anterior de 0 a strlen-3 guardas
los caracteres. Vamos algo así:

Código (cpp) [Seleccionar]

for (i=0;i<15;i++)
   for (j=0;j<strlen(capitulo1[i])-3;j++)
       {
             capi1[i] [j]=capitulo1[i] [j];
       }


Se podría hacer con más capítulos pero en el formato array en lugar de fichero originaría arrays tridimensionales.

Se me ocurre que para dos capítulos fuera:


Código (cpp) [Seleccionar]

char capituloi[2][15][20]={{"pincel","pipa","Cine","Teatro", ....-y así hasta quince....},{"papel","tijera", ....-y así hasta quince....}}
char capi[2][15][20]={0};


Demasiado fuerte para empezar. Te aconsejaría el primero con un sólo capítulo.

Espero haberme explicado meridianamente bien y te sirva de orientación.......  y que yo no haya metido la gamba.

Saluditos!. ......  

P.D:Procura elegir mejor los ejercicios, éste es muy de fichero.

Caster

Buff...arrays, aun no he tocado ese tema en el libro que estoy leyendo, de hecho, terminé con las funciones y ese es el que me toca ahora, así que lo leeré y después continuo con el problema, muchas gracias, cuando lo retome miraré otra vez tus consejos.

Cita de: leosansan en 16 Mayo 2013, 21:56 PM

P.D:Procura elegir mejor los ejercicios, éste es muy de fichero.


Pues tengo muchísimos ejercicios que descargué en formato PDF de la web que nombré antes y casi todo son de archivos, aunque no me importa mucho porque puedo hacer el mismo ejercicio sin necesidad de manejar archivos (ya lo hice con otro problema de la misma web, de hecho pregunte aquí en el foro) y cuando aprenda a manejarlos me servirá de mucha práctica.

Saludos

leosansan

Cita de: Caster en 16 Mayo 2013, 22:19 PM
Buff...arrays, aun no he tocado ese tema en el libro que estoy leyendo, de hecho, terminé con las funciones y ese es el que me toca ahora, así que lo leeré y después continuo con el problema, muchas gracias, cuando lo retome miraré otra vez tus consejos.

Pues ánimos y a por el tema de arrays, es fundamental porque te abrirá las puertas a muchos ejercicios.

Y casi seguro que después tendras el tema de punteros. Desde ya te aconsejo tomarlo con calma y ganas ya que es "la otra gran puerta".

Saluditos .....,nuevamente".......

Caster

Me equivoque, viene ahora el tema de la variables globales y demás tipos de variables, después arrays, y si, estabas en lo cierto, a continuación viene el tema de punteros, cuando tenga tiempo me pongo y me los leo rápido.

Saludos.

Caster

Bueno leosansan, vuelvo a retomar el problema porque ya llegué al tema de los arrays, a ver, ya me encontré con algo que no entiendo en la solución que me das, tu me dices que almacene varias palabras en el mismo capítulo, pero creo que eso no estaría acorde con lo que pide el problema, que pide una palabra (20 palabras como límite y 15 caracteres por cada palabra) y sus abreviaturas (si no entendí mal) por capítulo, y si trato con varios capítulos no se tienen porque crear arrays multidimensionales, se usa un array bidimensional por cada capítulo y solucionado.

Saludos

leosansan

#6
Cita de: Caster en 18 Mayo 2013, 14:26 PM
..................................
y si trato con varios capítulos no se tienen porque crear arrays multidimensionales, se usa un array bidimensional por cada capítulo y solucionado.


Esa es una opción totalmente válida, aunque a mi entender poco eficiente por los múltiples arrays que habría que usar, uno por capítulo,ni te cuento los que tendrías si fuera una novela rusa.  :laugh:
Mientras en el array tridimensional podrías meter todos los capítulos y su manejo y referencia es más breve e inmediata.

Pero como te comente al principio no es mala idea empezar con arrays bidimensionales.

Saluditos!..... ..

Caster

Otra duda que me surge, tu declaras el array capitulo de la siguiente manera:

char capitulo1[15][20]

Donde 15 sería el número de filas y 20 el número de columnas, si es así, tendría que ser al reves creo:

char capitulo1[20][15]

20 sería el número máximo de palabras, y 15 el número máximo de carácteres por palabra.

Saludos


leosansan

Cita de: Caster en 18 Mayo 2013, 18:34 PM
Otra duda que me surge, tu declaras el array capitulo de la siguiente manera:

char capitulo1[15][20]

Donde 15 sería el número de filas y 20 el número de columnas, si es así, tendría que ser al reves creo:

char capitulo1[20][15]

20 sería el número máximo de palabras, y 15 el número máximo de carácteres por palabra.


Justo al revés de lo que dices y como yo te pongo en el ejemplo. El primer índice hace referencia al número de palabras y el segundo al de caracteres, que te recuerdo es uno más de la palabra más larga para tener en cuenta el caracter nulo.

Un ejemplo podría ser:

Código (cpp) [Seleccionar]
char oficina[3][5] = {"0210","0441","0462"};

donde como ves el primer índice igual a 3 cuenta las oficinas, en este caso determinadas por el número de sucursal, y el segundo 5 al tamaño, donde obsevaras que aunque todas las las oficinas son de cuatro caracteres, la dimensión es cinco por  lo que te comenté de tener en cuenta al caracter nulo.

Saluditos!. .....

Caster

Buf...no doy avanzado, ya terminé el tema de los arrays y me puso a ello, pero no se por donde avanzar, solo tengo hecho lo que me dijiste que es esto:

#include <stdio.h>
#include <string.h>

int main()
{
    char capitulo[15][20] = {"pincel", "cinc", "cincel", "pipa", "papel"};
    char cap[15][20];
   
   
    for (fil = 0; i<15; i++;)
        {

            for (col = 0; j<strlen-3; j++;)
                {
                    capi1[fil] [col] = capitulo1[fil] [col];
                }
        }
   
    return 0;
}


Estaba pensando en como imprimir las palabras abreviadas, se como escribir carácter a carácter con un for, pero no sabría como imprimir cada palabra en una linea diferente, y también me queda averiguar como hallar las abreviaturas de cada palabra, porque en este código vale para algunas palabras, pero no para todas, creo que la cosa iría porque quitar los 3 últimos caracteres en algunas palabras, y los 3 primeros en otras., o sacar la longitud de la palabra y según esta quitar mas o menos caracteres.

Saludos