Autor
|
Tema: Orientación con un problema (Leído 4,174 veces)
|
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: Una 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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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: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 capitulo1[i]
y en otro for interno al anterior de 0 a strlen-3 guardas los caracteres. Vamos algo así:
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: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.
|
|
« Última modificación: 19 Mayo 2013, 20:47 pm por leosansan »
|
En línea
|
|
|
|
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. 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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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".......
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:
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!. .....
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Orientaciòn con Guitar pro 4
Ingeniería Inversa
|
ju77
|
0
|
1,898
|
21 Julio 2004, 03:49 am
por ju77
|
|
|
algo de orientacion ........
Software
|
Badcode
|
0
|
1,240
|
5 Noviembre 2004, 10:41 am
por Badcode
|
|
|
Orientación...
Programación Visual Basic
|
BADBYTE-K
|
1
|
2,173
|
31 Mayo 2005, 12:42 pm
por DaSystem
|
|
|
Orientación?
Hacking Mobile
|
Samy4ever
|
4
|
3,747
|
19 Abril 2010, 08:22 am
por SirGraham
|
|
|
Orientacion c/c++
« 1 2 »
Programación C/C++
|
Pirat3net
|
11
|
8,236
|
23 Mayo 2011, 14:17 pm
por D4RIO
|
|