Staff | ADMINISTRADORES: DAN Admin(recheni) Mod Generales:Prof_Carballo Mod Soft Libre:Pablon_3°1ªbys ProfeLaura Mod EntretenimientoBute3º1ªByS |
|
| Ejercicio nivel 1 OIA: Descrubriendo el refrán | |
| | Autor | Mensaje |
---|
Prof_Carballo
Cantidad de envíos : 25 Puntos : 47 Fecha de inscripción : 12/08/2009
| Tema: Ejercicio nivel 1 OIA: Descrubriendo el refrán Vie Ago 14, 2009 11:27 am | |
| Hola chicos...iniciemos la actividad con el trabajo que dejamos en el camino:
Descubriendo el refrán Contribución de Laura Rivero
Descripción del problema Datos de entrada Un maestro muy creativo intenta que sus alum- nos aprendan refranes y dichos populares. Para esto les asigna juegos de palabras en los que tienen que aplicar intercambios de letras, para luego descubrir el refrán que se forma con las palabras resultantes. Para que el ejercicio sea más atrayente, el maestro ha utilizado distintas formas de inter- cambio de letras en las palabras: a) las palabras con un número par de letras están invertidas. Por ejemplo: sarbalap es palabras b) Las palabras con un número impar de letras tienen intercambiados los conjuntos de letras de los extremos, sin alterarse las tres letras del medio de la palabra. cosmpioli sería olimpicos c) Las palabras de 1 y de 3 letras, no se alteran. Por ejemplo: uno seguiría siendo uno Una vez que las palabras han sido descubiertas, se obtiene el refrán colocándolas una detrás de la otra, en el orden de entrada y separadas por blanco, finalizando con un punto luego de la última palabra. Para ayudar al maestro con esta ejercitación, se te pide que escribas un programa refran.cpp, refran.c o refran.pas que permita descubrir la cadena de palabras que representa el refrán. Datos de entrada Se recibe un archivo refran.in del directorio actual, que contiene: • Primera línea: La cantidad p de palabras ( 2 ≤ p ≤ 1.000 ). • Un conjunto de p líneas, cada una con una hilera de c caracteres ( 1 ≤ c ≤ 100 ) corres- pondiente a una palabra. Las letras serán minúsculas, sin acento, pertenecientes al alfabeto internacional: “abcdefghijklmnopqrstuvwxyz” Datos de salida El programa debe generar el archivo refran.out, en el directorio actual con: • Una línea, conteniendo el refrán, es decir las p palabras separadas por blanco seguidas de un punto. Puntuación Una solución correcta recibirá 100 puntos. Ejemplo Si el archivo refran.in contiene: 7 on por ouchm ragurdam ceaneam mas onarpmet El archivo refran.out debe contener: no por mucho madrugar amanece mas temprano.
Saludos.
Prof. Gonzalo | |
| | | Prof_Ivana
Cantidad de envíos : 6 Puntos : 6 Fecha de inscripción : 14/08/2009 Edad : 36 Localización : Trelew
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Vie Ago 14, 2009 6:28 pm | |
| Bueno, si necesitan ayuda con esto avisen =)
Saludos | |
| | | ProfeLaura
Cantidad de envíos : 17 Puntos : 18 Fecha de inscripción : 12/08/2009
| Tema: Aporte para Ejercicio OIA Mar Ago 18, 2009 9:08 am | |
| Esta un poco ambiguo esta parte de las condiciones ...
Primera línea: La cantidad p de palabras ( 2 ≤ p ≤ 1.000 ). • Un conjunto de p líneas, cada una con una hilera de c caracteres ( 1 ≤ c ≤ 100 ) corres- pondiente a una palabra.
Mi interpretacion seria. Corrijanme si me equivoco . El archivo de entrada tiene : 1) No menos de dos palabras y no mas de 1000. 2) Cada palabra esta representada en una linea. 3) Cada palabra tiene un tamaño de 1 a 100 caracteres.
P.Laura | |
| | | Prof_Ivana
Cantidad de envíos : 6 Puntos : 6 Fecha de inscripción : 14/08/2009 Edad : 36 Localización : Trelew
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Mar Ago 18, 2009 11:06 am | |
| Yo entendi lo mismo que Laura, y ademas no te olvides que en la primer linea del archivo se encuentra la cantidad de palabras (2, 3... ). | |
| | | Prof_Ivana
Cantidad de envíos : 6 Puntos : 6 Fecha de inscripción : 14/08/2009 Edad : 36 Localización : Trelew
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Mar Ago 25, 2009 10:20 pm | |
| Bueno voy a intentar hacer una explicacion un poco "simple" del problema, espero que me salga! Si no van a terminar mas mareado, de lo que ya estan.
Igualmente, si no llegan a entenderme, me preguntan alla en la escuela, o mandan pm, o por msn, o unas señales de humo tambien =P
El problema (en otras palabras): Se nos da un archivo que tiene en un principio un numero X (este numero X representa la cantidad de palabras que contiene el archivo), seguido de este numero X, por cada renglon hay una palabra. Esas palabras, tienen la particularidad de estar "codificada". Lo que hay que hacer, es "decodificar" estas palabras y armar un archivo con las mismas, donde el archivo tengas las palabras de corrido y no por renglon, separadas por un espacio y cuando termina, con un punto; es decir: arman una oracion con las palabritas. Ese es el problema principal, obviamente hay muchisimos otros detalles y esta tambien el COMO esta codificada cada palabra, pero vamos a ir por partes; porque es un error super comun que lean todo y quieran primero, a tirarse de una al codigo, y que encima vayan haciendolo todo junto y despues queda un despelote barbaro.
Empecemos, a hacer todo a lo "grande" y despues vamos a ir detallando.
El problema, consta de tres problemas o modulos principales :
* Abrir el archivo * Procesar palabras * Crear archivo nuevo
Mi recomendacion, es que a medida que vayan procesando las palabras (decodificando) vayan actualizando el archivo nuevo, es decir, le van agregando las palabras nuevas asi el trabajo es mucho mas simple.
Vamos a encargarnos de procesar palabras, porque crear el archivo nuevo y abrir el archivo son cosas que no deberian comerle la cabeza, o digamos que es algo dentro de todo "simple", incluso Laura creo que puso el codigo (si lo hacen en C, si lo hacen en pascal despues lo hacemos).
Espero que esten familiarizados con los conceptos de funciones y procedimientos, asi tambien como los parametros: entrada, salida, o entada/salida. Si no lo tienen claro =P Vuelvan a leer la carpeta de 2º año porque Claudio lo dio! Y tengo pruebas: Mi carpeta de cuando iba a la escuela (una reliquia por cierto). Bueno, si no se acuerdan entonces avisan y les hago un pequeñisimo resumen en el foro, o lo hablamos en el aula o taller.
La consigna dice que existen 3 tipos de palabras: Palabras con cantidad de letras par, palabras con cantidad de letras impar y palabras que poseen entre 1 y 3 letras. Cada una de estas palabras, tiene una manera de ser procesada de manera diferente: Las palabras que poseen entre 1 y 3 letras, quedan tal cual: “uno” es “uno”, “en” sigue siendo “en”. Las palabras que poseen numero de letras par, están en el orden invero: ACAV es VACA, SARBALAP es PALABRAS. Las palabras que poseen numero de letras impar, tienen intercambiados los conjuntos de letrasde los extremos, sin alterarse las tres letras del medio de la palabra. cosmpioli sería olímpicos.
Entonces, sabiendo eso empecemos, para decodificar la palabra hay que hacer varias cosas
1º Conseguir palabra 2º Obtener el numero de letras, que contiene la palabra 3º Segun el numero de letras, tratarla como dijimos arriba. 4º Tenemos la palabra decodificada! 5º Agregar la palabra al archivo.
Esto hay que hacerlo, tantas veces como diga la letra X, o hasta que sea fin de archivo. Con esto les estoy dando ya una pista, de que ese pedazo de pseudocodigo va a estar adentro de un bucle hasta que se traten, todas las palabras.
p <- Palabra (aca obtenemos la palabra de alguna manera, y la asigamos a la variable p) cp <- Cantidad De Letras de p (de alguna manera obtenemos la cantidad de letras de P, y la asignamos a la variable cp) Si cp> 3 y cp es par entonces PalabraLetraPar (....) (aca, por cuestion de claridad en el codigo y ahora tambien, para que no se maten la cabeza, dejamos una llamada a funcion o procedimiento -notese que no defini ni los parametros que envio- donde dentro de esa, decodificamos la palabra: ya sabemos que tiene mas de 3 letras y ademas la cantidad de letras es par, por lo tanto sabemos como hay que tratarla) Si no Si cp>3 y cp es impar entonces PalabraLetraImpar (....) (Idem anterior) Fin Si Fin Si
¿Porque hacemos un fin si, y no analizamos si es la tercera opcion? Es simple, ya con las condiciones del si cp>3 estamos averiguando si tiene mas de 3 letras (Es decir, tiene un minimo de 4 letras), si no entra a ninguno de esos procedimientos/funciones, entonces es porque tiene 1, 2 o 3 letras, en tal caso la palabra queda igual, es decir p = Palabra, que asigamos anteriormente y queda ya resuelto (se entendio? =P si no lo explico en otras palabras).
Bueno, no quiero llenarles mucho la cabeza con todo esto de golpe, vean que entienden, intenten avanzar un poco sobre esto y luego seguimos avanzando con el ejercicio.
Si no entienden algo, pregunten =) | |
| | | Admin Admin
Cantidad de envíos : 27 Puntos : 47 Fecha de inscripción : 11/08/2009 Edad : 32 Localización : Isla tortuga
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Sáb Ago 29, 2009 8:27 pm | |
| Gracias Ivana Esa parte ya la habia deducido Mi problema es con las funciones, ya que no se cuales utilizar... tanto para leer palabras del archivo, como para grabar y separar estas palabras en letras. | |
| | | Admin Admin
Cantidad de envíos : 27 Puntos : 47 Fecha de inscripción : 11/08/2009 Edad : 32 Localización : Isla tortuga
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Sáb Ago 29, 2009 8:35 pm | |
| Pd: en la ayuda q me paso Carballo me tira un error : 13 syntax error before "canf" Ayuuuuuuuudaaa no entieeendo ese codigooo Pd: Como distingo pares de impares? porque en pascal usaba el comando "mod", pero en C no funciona..
Última edición por Admin el Sáb Ago 29, 2009 8:52 pm, editado 1 vez | |
| | | Prof_Ivana
Cantidad de envíos : 6 Puntos : 6 Fecha de inscripción : 14/08/2009 Edad : 36 Localización : Trelew
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Sáb Ago 29, 2009 8:43 pm | |
| - Admin escribió:
- no entieeendo ese codigooo
O.o cual codigo?? En pascal es muy facil leer archivos, ahora les escribo un pedacito ed codigo y se los explico XP | |
| | | Admin Admin
Cantidad de envíos : 27 Puntos : 47 Fecha de inscripción : 11/08/2009 Edad : 32 Localización : Isla tortuga
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Sáb Ago 29, 2009 10:20 pm | |
| el codigo que mando carballo sobre como leer archivos en C | |
| | | Prof_Ivana
Cantidad de envíos : 6 Puntos : 6 Fecha de inscripción : 14/08/2009 Edad : 36 Localización : Trelew
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Sáb Ago 29, 2009 10:39 pm | |
| - Admin escribió:
- el codigo que mando carballo sobre como leer archivos en C
=P Ahhh vos lo estas haciendo en C, tenia entendido que habia un chico que estaba haciendolo en Pascal y acabo de terminarle los ejemplos de leer archivos, escribir archivos en Pascal =( A vos no te va a servir mucho entonces. Respecto a lo que decias de manejo de cadenas, que no sabias que usar; aca te dejo un link que tiene un "resumen" con codigos y ejemplos de las funciones que tiene C para el mismo: - Citación :
Todas las funciones para manejo de cadenas tienen su prototipo en:
#include
Las funciones más comunes son descritas a continuación:
- char *strcpy(const char *dest, const char *orig) -- Copia la cadena
de caracteres apuntada por orig (incluyendo el carácter terminador '\0') al vector apuntado por dest. Las cadenas no deben solaparse, y la de destino, debe ser suficientemente grande como para alojar la copia.
- int strcmp(const char *s1, const char *s2) -- Compara las dos cadenas
de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a, o mayor que s2.
- char *strerror(int errnum) -- Devuelve un mensaje de error que
corresponde a un número de error.
- int strlen(const char *s) -- Calcula la longitud de la cadena de
caracteres.
- char *strncat(char *s1, const char *s2, size_t n) -- Agrega n
caracteres de s2 a s1.
- int strncmp(const char *s1, char *s2, size_t n) -- Compara los
primeros n caracteres de dos cadenas.
- char *strncpy(const char *s1, const char *s2, size_t n) -- Copia los
primeros n caracteres de s2 a s1.
- strcasecmp(const char *s1, const char *s2) -- versión que ignora si
son mayúsculas o minúsculas de strcmp().
- strncasecmp(const char *s1, const char *s2, size_t n) -- versión insensible a mayúsculas o minúsculas de strncmp() que compara los primeros
n caracteres de s1.
Link: http://www.fismat.umich.mx/mn1/manual/node18.htmlAhora, una recomendacion y a la vez consulta: en las olimpiadas le van a dar ejercicios como este, y deberian resolverlos en codigo, no? (esa era la duda). Ahora, la recomendacion: si es asi el caso, deberían hacerlo o prepararse en un lenguaje que conozcan bien, que entiendan. Si van a hacerlo en C, entonces agarren un manualcito y lean el manejo de cadenas en C, las funciones que tienen ahi, etc; si es Pascal en pascal; pero vayan preparandose. La verdad desconozco como es el tema de las olimpiadas, pero fue una recomendacion (ya veo que pense cualquiera Perdon). Volviendo al tema, lo que podes hacer para recorrer la cadena es algo asi, despues veras que funciones trae C para hacerlo, o incluso si podes hacerlo de otra manera mas rapido. Ejemplo (pseudocodigo, asi les sirve a los chicos que van a trabajar en C y en pascal): Desde i= 1 hasta Longitud_palabra hacer Extraer caracter I de la palabra Insertar caracter I en la palabra nueva donde corresponda Fin Desde O sea, tanto en C como en Pascal pueden obtener la longitud de la cadena, entonces lo recomendable es un Desde en vez de un repetir o un mientras; entonces comienzan aprobechando el contador del desde a recorrer la cadena: desde 1 hasta n, donde n es la longitud: extraen el caracter, y lo van agregando en una palabra nueva (es decir, una variable nueva), en una posicion que corresponda. Es algo muy generico lo que dije U.U asi que si no lo entienden, sepan disculpar. Mi idea, tirandoles el pseudocodigo y no el codigo directamente, es que sepan adaptarse a trabajar tanto en un lenguaje como en otro, y que no se aten al mismo; con ese pedacito de pseudocodigo ya saben o tienen una idea de como ir recorriendo, ahora intenten asociar ese pseudocodigo al codigo mismo. =) Ahora subo el ejemplo en Pascal explicado... | |
| | | Admin Admin
Cantidad de envíos : 27 Puntos : 47 Fecha de inscripción : 11/08/2009 Edad : 32 Localización : Isla tortuga
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Dom Ago 30, 2009 12:04 am | |
| gracias por las ayudas ivana ^^
con respecto a tu duda, este ejercicio es de las olimpiadas de años anteriores. Nos darian un ejercicio de este estilo y una pc con una distribucion de linux diseñana para las olipiadas | |
| | | Prof_Carballo
Cantidad de envíos : 25 Puntos : 47 Fecha de inscripción : 12/08/2009
| Tema: A no desesperar...tenemos tiempo Dom Ago 30, 2009 9:12 am | |
| Hola chicos...David, no te preocupes, que tenemos tiempo y resolviendo uno, el resto es similar (con respecto al manejo de archivos), lo importante es saber pararse ante el problema, el resto es un problema técnico que lo resolvemos en breve...por otro lado, coincido con Ivana, con respecto al manual de "C"...ya te recomiendo uno, que justo en este tema esta un poquito flojo, pero nos puede ayudar a entender el fragmento de código que nos pasó Laura... en PDF..."Aprenda lenguaje ANSI C como si estuviera en primero", de la universidad de Navarra (esta libre en internet... para usos personales y no comerciales)...en el capítulo "Funciones de entrada /salida, pag 59", en la página N°62 tienes el trabajo con funciones para trabajar con "ARCHIVOS DE DISCO"(fprintf(), fscanf(), fopen()...y más) ...por otro lado de estoy preparando algo del libro "Programación y algoritmos", de PC USERS... que también trabajan un poco este tema "... y con respecto a los números pares, no existe la función mod...así que va la versión "C" ...
//------------------------------------------------------------------- función esPar(num:Number):Boolean{ return ! (num%2); }
//------------------------------------------------------------------- var num:Number = 159; var par:Boolean = esPar(num); trace(par); // false
//------------------------------------------------------------------- var num:Number = 2; var par:Boolean = esPar(num); trace(par); // true
Dejo estas consideraciones..y como sabrás estoy peleando con mi GEANY...aunque por la emergencia ya tengo instaladas otras alternativas libres...pero en este punto tenemos que ser cuidadosos...como vez decís David, hay que trabajar con las herramientas específicas que nos facilitaron desde la organización de la OIA...o sea con el OIAX de Xubuntu...
Saludos.
Prof. Carballo. | |
| | | ProfeLaura
Cantidad de envíos : 17 Puntos : 18 Fecha de inscripción : 12/08/2009
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Lun Ago 31, 2009 9:24 am | |
| David, por lo que entiendo, no sabes que funcion usar para leer desde un archivo. ... En esta pagina esta muy claro y da ejemplos, http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivosahora... en el caso del ejercicio que se esta analizando, hay que ver que conviene usar. Aca va uno de los ejemplo explicados. #include <stdio.h> #include <stdlib.h> int main() { // Declarar un puntero al archivo que vas a abrir asi : FILE *archivo; // Declarar un buffer para leer el contenido del archivo : char caracteres[100]; // abrir el archivo para escritura (esto te busca el archivo prueba txt en el directorio donde estas parado) : archivo = fopen("prueba.txt","r"); // r significa escritura // En el caso que no pueda abrirlo el puntero va a ser NULL por lo tanto hay que chequear que lo //haya abierto sino el programa no va a saber que hacer : if (archivo == NULL) exit(1); // me voy porque hubo error. // Una vez que esta todo bien y tenemos el archivo abrierto lo leemos : // Comenzamos el ciclo leyendo de a 100 caracteres ... while (feof(archivo) == 0) // mientras no sea fin de archivo continuo con el ciclo feof retorna 0 cuando llegue al fin de archivo, por // eso la comparacion con 0. { fgets(caracteres,100,archivo); // leo 100 caracteres del archivo y los dejo en el buffer printf("%s",caracteres); // imprimo los caracteres que lei ... } // listo .... return 0; } Espero que sirva, ahora mando otro ejemplo con otra funcion que lee linea a linea Saludos Laura | |
| | | ProfeLaura
Cantidad de envíos : 17 Puntos : 18 Fecha de inscripción : 12/08/2009
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Lun Ago 31, 2009 9:32 am | |
| Importante :
fgets
Esta función está diseñada para leer cadenas de caracteres. Leerá hasta n-1 caracteres o hasta que lea un retorno de línea. En este último caso, el carácter de retorno de línea también es leído.
Laura | |
| | | ProfeLaura
Cantidad de envíos : 17 Puntos : 18 Fecha de inscripción : 12/08/2009
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Lun Ago 31, 2009 10:52 am | |
| Escribiendo en un archivo y usando la funcion fputs
La función fputs escribe una cadena en un fichero. No se añade el carácter de retorno de línea ni el carácter nulo final. El valor de retorno es un número no negativo o EOF en caso de error. Los parámetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde se realizará la escritura.
#include <stdio.h>
int main ( int argc, char **argv ) { FILE *fp; // declaro el puntero al archivo char cadena[] = "Mostrando el uso de fputs en un fichero.\n"; // creo un buffer con carateres que quiero poner en el arcivo // podrian ser los caracteres que lei en el archivo de entrada // del otro ejemplo fp = fopen ( "fichero.txt", "r+" ); // abro un archivo para leer y escribir fputs( cadena, fp ); // escribo mi cadena en el archivo fclose ( fp ); // no olvidarse de cerrar el archivo sino nunca se encontrara finde archivo!!!! return 0; /// me voy } | |
| | | ProfeLaura
Cantidad de envíos : 17 Puntos : 18 Fecha de inscripción : 12/08/2009
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán Lun Ago 31, 2009 11:24 am | |
| #include <stdio.h> // Guarda en un buffer que se llame mensaje un string formateardo en este caso armandolo con los strings // que toma por pantalla.
int main() {
// declara dos strings uno para leer (nombre) y el otro para escribir(mensaje) el resultado. char nombre[20], mensaje[81]; // entero donde va a escribir la edad unsigned int edad=0;
// Pide un string por teclado con %s dice que es string y lo guarda en "nombre"
printf( "Escriba su nombre: " ); scanf( "%s", nombre );
// Pide la edad , con %u le dice que va a leer un unsigned int y lo guarda en "edad" // OJO CON el & en este caso como edad no es un arreglo sino un entero se le da la direccion de la variable // no la variable en si porque el scanf necesita un puntero no una variable. En el caso anterior // todos los arreglos son punteros ..... (cosas del C)
printf( "Escriba su edad: " ); scanf( "%u", &edad );
// Ahora es muy sencillo Escribo lo que quiero escribir entre comillas y los parametros con %, los cuales // se reemplazaran por las variables que pongo al final en el mismo orden que las pongo, // OJO tiene que haber la misma cantidad de parametros % que de variables sino habra error. // Todo quedara guardado en el string "mensaje" en este caso lo imprime en pantalla pero .. // podria mandarlo a un archivo con fputs ...
sprintf( mensaje, "\nHola %s. Tienes %d anyos.\n", nombre, edad ); puts( mensaje );
// me voy ..... return 0; } | |
| | | Contenido patrocinado
| Tema: Re: Ejercicio nivel 1 OIA: Descrubriendo el refrán | |
| |
| | | | Ejercicio nivel 1 OIA: Descrubriendo el refrán | |
|
| Permisos de este foro: | No puedes responder a temas en este foro.
| |
| |
| |