Título: Ayuda con estos códigos (Actualizado 22/06/2012) Publicado por: LoLo2207 en 26 Marzo 2012, 20:26 pm Hola, estoy intentando hacer un ejercicio sobre aritmética racional (sumar, restar, multiplicar y dividir fracciones). Al mostrar los resultados hay que simplificarlos, pero según veo en el depurador, no se pasan correctamente los valores a simplificar a la función. Qué debo cambiar? Seguramente sea muy obvio, pero soy malísimo con punteros y estructuras xD
Gracias. Código
EDIT: Para evitar abrir más hilos, pongo en este todas mis dudas personales. Nuevo programa añadido el 22/06/2012. Título: Re: Ayuda con una función de este código Publicado por: durasno en 26 Marzo 2012, 22:02 pm Hola LoLo2207! el problema es cuando llamas a la funcion SimplificaRacional. Vos le pasas la direccion del puntero r, (&r), lo que estas haciendo aca es pasarle a la funcion un puntero a puntero.
Solamente deberias pasarle el puntero, osea SimplificaRacional(r); Saludos PD: el programa tambien funcionaria con puntero a puntero solo que tendrias que saber como se utiliza Título: Re: Ayuda con una función de este código Publicado por: LoLo2207 en 27 Marzo 2012, 08:02 am Gracias, ya funciona perfectamente :D
A ver si he entendido bien, al llamar a la función, como en el prototipo ya sabe que recibirá un puntero, sólo tengo que poner el nombre del puntero, no la dirección, porque si no sería la direccion de un puntero, que a su vez sería la dirección de una direccíon, no? Y lo de usar dobles punteros pues como que no, que además los prototipos me los da el profesor y nosotros sólo tenermos que rellenar el "esqueleto". Título: Re: Ayuda con una función de este código Publicado por: durasno en 27 Marzo 2012, 19:52 pm A ver si he entendido bien, al llamar a la función, como en el prototipo ya sabe que recibirá un puntero, sólo tengo que poner el nombre del puntero, no la dirección, porque si no sería la direccion de un puntero, que a su vez sería la dirección de una direccíon, no? SI, es como vos decis :)
Saludos Título: Re: Ayuda con estos códigos (Actualizado 13/04/2012) Publicado por: LoLo2207 en 13 Abril 2012, 16:42 pm Nuevo programa: se supone que tiene que leer una ficha de un alumno creada mediante estructuras, y luego imprimirla. No me acaba de salir :( Qué lío de punteros, estructuras, typedef y la madre que lo trajo...
Código
Por cierto, a ver si me aclaro con las estructuras. En mi libro vienen varias formas de declarar tipos y crear variables mediante el typedef Código
El tipo_alumno es opcional si no quieres ponerle una etiqueta al tipo no? Pero si no se la pones no puedes crear por ejemplo una var3 después, o sí porque está puesto el typedef? Qué forma me recomendáis para definir un tipo de dato fuera del main? :huh: Título: Re: Ayuda con estos códigos (Actualizado 13/04/2012) Publicado por: durasno en 13 Abril 2012, 20:58 pm Hola! el programa te anda?? porque a mi me funciona bien...
Código Lo que estas haciendo aca es declarar tipos de datos no variables; var1 y var2 no son variables, esto es por el typedef. Para crear una variable vas a tener que declarar, ej: Código
No es lo mismo hacer lo anterior q hacer: Código Aca si var1 y var2 son variables declaradas de forma global Otra forma es no declarando variable globales: Código Para declarar una variable en este caso seria: Código
Ahora cual es la forma mas conveniente depende de cada uno, en mi caso no trabajo con variables globales y tampoco uso el typedef. Es por eso q prefiero el tercer ejemplo, me parece mas facil de entender Espero te sirva, Saludos Título: Re: Ayuda con estos códigos (Actualizado 13/04/2012) Publicado por: LoLo2207 en 13 Abril 2012, 23:12 pm Gracias por responder. He estado haciendo mientras tanto otros ejercicios, y para todos ellos he utilizado lo siguiente (siempre tras los #include y los #define, y fuera del main o de cualquier otra función):
Código
Y luego en el main: Código
Y me funciona bien. Lo que quiero saber es si es muy redundante o no, y qué diferencia hay enter los dos tipo_jugador, el de antes y después de las llaves. De todas formas, me he dado cuenta de que una función puede devolver una estructura por valor, ya que creía que como esa un tipo de dato compuesto pues se tenía que hacer sí o sí por referencia. Probaré a empezar de 0 con el programa anterior, ya que aunque me compilaba, no se guardaban bien los valores en las variables (y obviamente se imprimían cosas aleatorias). Título: Re: Ayuda con estos códigos (Actualizado 13/04/2012) Publicado por: durasno en 14 Abril 2012, 00:56 am Practicamente no hay ninguna diferencia, el tipo_jugador antes de la llave es el nombre de la estructura y el tipo_jugador despues de la llave es el nuevo tipo de dato definido por vos, en este caso lleva el mismo nombre
Saludos Título: Re: Ayuda con estos códigos (Actualizado 13/04/2012) Publicado por: LoLo2207 en 22 Junio 2012, 02:43 am Otra dudilla. Esta vez estoy con listas simplemente enlazadas.
Tengo que hacer un programa que cree una lista enlazada, que en su interior tenga un num. aleatorio >0 y que la muestre, junto con el nº de nodos. (hasta aquí todo bien) El problema es que también tengo que pedir un nº por teclado y eliminar todos los nodos que contengan un nº igual o mayor al introducido, y me falla esta última función. Os pongo sólo la función para ahorrar espacio. Si fuera necesario, luego pondría el programa completo. Código
A ver si véis en qué me falla. Porque también tengo que hacer otro prog. muy parecido al anterior, pero en vez de eliminar nodos con el nº mayor, tengo que ordenar la lista y quitar los repetidos. Pero eso ya para luego, que si me sale este a lo mejor entendiendo lo que tenía mal puede que me salga el otro. Saludos y gracias. Título: Re: Ayuda con estos códigos (Actualizado 22/06/2012) Publicado por: durasno en 22 Junio 2012, 08:24 am Hola! lo que subiste no funciona xq anterior siempre es igual a NULL, nunca entra al else; pero no esta del todo mal...
De todas formas el error principal esta en que no tenes claro el concepto de pasaje por valor y por pseudoreferencia. A la funcion vos le pasas el puntero lst, es decir en la llamada haces Código El problema es que si vos tratas asi a lst cualquier modificacion que hagas en la funcion(es decir haces q apunte a otro lado) cuando retornes al main no va a tener efecto... Para resolver esto tenes q pasar a lst por pseudoreferencia Código y en la funcion: Código
Entonces, el codigo seria mas o menos asi: Código Fijate q solo agregue un par de cosas a lo q tenias(ya q no estaba tan mal). Te falto considerar que pasa cuando indice->num>=maximo es falso, el bucle se vuelve infinito ya que no cambias de nodo, te falto agregar indice=anterior->sig; pero para q esto funcione bien agregue un flag. Cuando flag=0 es porque no se cumplio que num>=maximo(nose borran nodos) entonces se ejecuta Código de lo contrario flag=1 nose ejecuta lo anterior mencionada... Si funciona lo que puse, analiza porque lo hice asi teniendo en cuenta todas las consideraciones. Saludos Título: Re: Ayuda con estos códigos (Actualizado 22/06/2012) Publicado por: 0xDani en 22 Junio 2012, 12:19 pm Un numero racional se caracteriza por estar expresado con un denominador y un numerador.
Saludos ;D Título: Re: Ayuda con estos códigos (Actualizado 22/06/2012) Publicado por: LoLo2207 en 22 Junio 2012, 15:22 pm Te falto considerar que pasa cuando indice->num>=maximo es falso, el bucle se vuelve infinito ya que no cambias de nodo Ostras es verdad, se me olvidaba pasar de nodos. Creo que tras tantos cambios que hice dejé sin ponerlo.Y gracias, porque ya funciona. Usaba la función sin dobles punteros porque en un ejercicio muy parecido que ya tengo hecho (en vez de eliminar los mayores al nº introducido, tengo que eliminar ese nº todas las veces que aparezca) lo hice sin dobles punteros y como funcionó, pues pensé "digo yo que si funiona así, simplemente cambio el interior de la función un poco para que elimine los mayores y ya". Pero nanai jajaja Finalmente, no se suponía que yo pasaba por referencia la lista? porque usaba un puntero *lst al principio de ella y luego la iba recorriendo. Y cuándo debería usar una función que llame a **lst y no *lst? Según lo que veo, la única que hace uso de **lst es InsertarNodoFinal(NODO **lst, int num) y es porque modifica la lista en sí, insertando nodos. Las de MostrarLista(NODO *lst) y NumeroNodos(NODO *lst) como solo la recorren no necesitan modificar los nodos y sólo necesitan un puntero simple no? Qué lio xD Pero menos mal que sois unos máquinas. PD: Un numero racional se caracteriza por estar expresado con un denominador y un numerador. Lol wut? Creo que has mirado una respuesta antigua y no la última XDSaludos ;D Título: Re: Ayuda con estos códigos (Actualizado 22/06/2012) Publicado por: 0xDani en 22 Junio 2012, 15:57 pm Es que empece a leer el post y en el primer comentario del primer codigo vi eso xD, pone que se caracteriza por estar expresado por un denominador y un denominador.
|