Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#801
Programación C/C++ / Re: Consulta - Punteros
12 Diciembre 2018, 18:45 PM
Cita de: MAFUS en 12 Diciembre 2018, 17:27 PM
La firma de estas funciones auxiliares sería algo así:
int funcion(alumno *al_1, alumno *al_2);
Las funciones reciben punteros para no andar copiando estructuras enteras cada vez, por tanto dentro de la función tendrás que usar notación de punteros para acceder a los miembros.

Otra alternativa, ya que el programa es en C++ y no en C es pasar los parámetros por referencia.
Código (cpp) [Seleccionar]

int funcion(const alumno &al_1, const alumno &al_2)

Personalmente prefiero usar está opción y evitas usar la notación de punteros. Te lo dejo como alternativa. :-X
#802
Bueno, algunos de tus errores:
- En las líneas 9-10 accedes al array nuevo pero no reservas memoria en él hasta la línea 12.
- Al terminar no sabes cual es el tamaño del nuevo array para poder recorrerlo.

Recomendaciones:
- Pasa el puntero por referencia, cuando tienes el nuevo terminado se lo asignas al original (no sin antes haber liberado la memoria del primero).
- En el <for> de las líneas 4-8 en vez de contar los que son iguales, cuenta los que son distintos (cambiando el "==" por "!=" en el <if>).
- Haz que la función devuelva el nuevo tamaño del array porque sino no puedes recorrerlo (tambien puedes pasar el segundo parámetro por referencia para modifcarlo, pero tendrás que hacerlo al final de la función).

Suerte :-X
#803
Esto es porque cada nodo al tener dos punteros, la idea es que todos apunten a NULL. Si se usa la segunda función, el <pnodo ant> del primer nodo, no quedaría apuntando a NULL, ya que este no se modifica. Del segundo nodo hasta el penúltimo también obtienes el mismo resultado pero en el primero y en el último, no.
Para el último nodo, <lista.inicio> apunta al último nodo, haces que <borrado> apunte también a él, después <lista.inicio> apunta al siguiente (que es NULL). Si haces:
Código (cpp) [Seleccionar]

lista.inicio->ant = NULL;

Ese <ant> no existe, porque ya no estás apuntando a un nodo. :-X
#804
Personalmente no me funcionan ninguno de los dos correctamente. Quiero decir, ambos me compilan bien pero no se evalúa correctamente.
Esto es porque hay casos sin especificar:
- En ambos casos, si se cumplen todas las condiciones, devuelve <true>.
- En la primera función, si no se cumple la primera condición, devuelve <false>.
- En la segunda función, si se cumplen todas las condiciones menos la última, devuelve <false>.
Esos son los 3 casos que están especificados. El resto de casos no está explícito lo que va a ocurrir.

Lo he probado con una función que retorna un <int> en vez de un <bool> para ver los casos por defecto.
Código (cpp) [Seleccionar]

int funcion(int x){
    if(x == 0)
        if(x == 1)
            if(x == 2)
                return 20;
            else
                return 200;
}


(Ya sé que la función es absurda pero nos sirve :xD) Si provoco alguno de los casos en los que no está especificado el valor de retorno, la función retorna el mismo valor que he introducido (x). Usando tus funciones para cada uno de los casos que no está especificado, la función retorna automáticamente <true>. Esto que comento es de forma experimental, no de forma teórica. :-X
#805
Creo que el segundo código no funciona en una lista vacía porque si esta está vacía la inicialización del <for> sería <i = NULL> y en la condición del <for> (i->sig != NULL) te daría un problema ya que no existe un puntero a siguiente.
En cambio en el primer código con el <if> haces una excepción para cuando esto ocurra. :-X
#806
Si tienes el vector ordenado es más fácil. Piensa que al estar ordenado sólo tienes que comprobar que el nuevo valor que vas a meter no es igual al último elemento del array final.
Si no estuviese ordenado tendrías que revisar todo el array final para ver que el valor que vas a introducir no está ya en el array.
Si el array es dinámico tendrás que hacer algún cálculo para saber el nuevo tamaño.

Entonces recorres el array que tienes con los valores repetidos y para cada elemento, si el array final está vacío o este elemento es distinto al último que has introducido en el array final, entonces lo introduces, sino, pasas al siguiente elemento. Suerte :-X

Ver el código que tienes puede ayudar...
#807
Programación C/C++ / Re: Error al compilar
11 Diciembre 2018, 20:46 PM
Primero que tienes que cambiar todas las variables de <int> a <double> como ya te han comentado. Sino vas a perder los decimales de los cálculos.

El problema de compilación que te da puede ser por pasar ese tipo de dato así. Es una cosa que no te puedo decir seguro ya que nunca lo he usado.

Y el primer <for> tiene que empezar desde 0, la diferencia entre "variable" y "variable2" es que una tiene que tener el número de cartas de cada tipo por su valor y la otra tiene que acumular el número de cartas sólo. Por lo que lo puedes hacer todo en un mismo <for>.

Y por último, un código que sea:
Código (cpp) [Seleccionar]

bool variable;
if(condicion)
    variable = true;
else
    variable = false;

Es mejor suponer un valor inicial y solo lo cambias una vez:
Código (cpp) [Seleccionar]

bool variable = false;
if(condicion)
    variable = true;

Pero esto último es simplemente como recomendación, de la otra forma funciona igual. Suerte. :-X
PD: No cites un mensaje para responder, dale arriba del todo o abajo del todo donde pone "responder" y no agregues citas a no ser que sea para comentar algo específico de lo que ha dicho otra persona.
#808
Línea 8: Declaras un puntero. Un puntero simplemente apunta, no es más.
Línea 11: Reservas memoria dinámica para n elementos del array. Ese espacio de memoria está apuntado por x. Cuando tienes memoria dinámica siempre tienes que tener un puntero apuntando ahí. Si el puntero apunta a otro sitio, pierdes esa memoria.
Línea 12-14: Guardas n valores aleatorios [0,199] en el array.

La función <Redimensionar()> coge el puntero que tenías reserva memoria adicional y añade 0 a ese espacio adicional. Antes de eso copias los valores de <x> (<p> en la función) en <aux> (el nuevo puntero) esto se hace en líneas 35-37. Si antes de llamar a la función borras la memoria de <x> cuando llegas a la función, <p> apunta a basura porque has borrado a lo que apuntaba originalmente.

Sin embargo aunque el programa ya funciona no estás liberando la memoria. Tienes que liberar la memoria en dos ocasiones:
- Primero, en la función. <x> apunta a un espacio de memoria pero después de llamar a la función va a apuntar a otro, va a apuntar al mismo sitio que <aux>. Entonces donde apuntaba <x> tienes que liberarlo antes de que acabe la función, pero después de que se ejecuten las líneas 35-37 para que no se copie basura.
- Segundo, al finalizar el programa. En la función has reservado memoria para <aux>. Luego has hecho que <x> apunte a ese espacio de memoria. Pero antes de que acabe el programa tienes que liberar el espacio a donde apunta <x>.

PD: Un array unidimensional se libera sin bucle <for>:
Código (cpp) [Seleccionar]

delete [] array;


#809
Programación C/C++ / Re: Ayuda con programa
10 Diciembre 2018, 21:25 PM
Primero si no es para citar algo concreto de otro mensaje no incluyas una cita a cada respuesta porque cada mensaje se hace larguísimo. Además de eso un tema se crea para resolver una duda específica, no para hacer un programa entero. Ya sé que es mucho más cómodo abrir un tema y que esté activo hasta que tu programa funcione completamente pero no es así. Ese programa cada vez es más largo y no vamos a estar revisándolo entero. Cuando tengas una duda, específica la duda y manda el código necesario para resolverla, a veces será el programa entero, otras veces sólo será necesario mandar una función o un bloque. Si hace falta más código ya te lo diremos.

Segundo tu función de generar un número aleatorio en un sitio tiene una definición y en otro sitio otra. Te recomiendo que si la función se encarga de generar números aleatorios, tenga dos parámetros que indiquen el mínimo y el máximo para determinar el rango.Así la función será más polivalente que si simplemente cogemos un trozo del <main> lo metemos en una función y lo dejamos igual, hay que aprovechar las ventajas de las funciones.

Un prototipo que yo creo que estaría bastante bien para generar números aleatorios puede ser:
Código (cpp) [Seleccionar]

int generarNumeroAleatorio(int minimo, int maximo);

Si no quieres que tu función sea así y tenga otra definición, es tu decisión pero fíjate en lo que le pasas como parámetros ya que primero has puesto un código donde le pasas un entero y luego en el programa entero tiene otro prototipo sin parámetros.

Precisamente ahí si te da un problema al usar la función eso es lo que tienes que mandar para que te ayudemos, la función y explicar el error que te da, no decir que te da algún error y soltar 357 líneas de código.
Hay que tener un poco de consideración en lo que se pide, no estamos aquí para salvarte de cada problema que tengas. Aquí el que más tiene que poner de su parte eres tú, no nosotros.

En otro tema posterior a este he comentado como usar <typedef>, me había confundido así que ahora voy a modificar ese mensaje y de momento te dejo la respuesta correcta por aquí:
Código (cpp) [Seleccionar]

typedef int array10[10];
int main(){
   array10 miArray;
   for(int i = 0; i < 10; i++)
       miArray[i] = i;
}

Ahí tienes como se usa el <typedef> para lo que tú querías hacer y un ejemplo de uso para que veas como se usan los índices, no tiene mucha complicación eso.

Por mi parte si tienes una duda concreta en un trozo de código concreto igual puedo ayudarte, revisar 357 líneas de código para solucionar todos tus problemas es algo que no voy a hacer. Suerte. :-X

PD: Tampoco recortes el programa y mandes lo mismo con menos código. Dudas concretas es preguntar por qué te sale un error o cómo puedes hacer tal cosa y te podremos dar una idea ya sea un ejemplo de código o una explicación en pseudocódigo para que tú después te encargues de implementarlo.
#810
Programación C/C++ / Re: Como hacer array
10 Diciembre 2018, 20:14 PM
Nunca lo he probado con un array pero por similitud diría que es así:
Código (cpp) [Seleccionar]

typedef int[5] array5;
int main(){
   array5 miArray;
}





Me he dado cuenta de que ese código no es correcto. Dejo de momento los dos códigos para que se vea la diferencia por si alguien se ha quedado con el primero que he puesto. Mañana si eso lo modifico para dejar sólo el correcto :-X El código correcto es este:
Código (cpp) [Seleccionar]

typedef int array5[5];
int main(){
    array5 miArray;
}

Para indexar se hace normal, es decir, miArray[num] con num = {0,1,2,3,4}. Suerte :-X