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

#931
Cita de: CalgaryCorpus en 17 Noviembre 2018, 19:00 PM
Elimina la invocacion del destructor explicita. Deja que el objeto se destruya solo al morir el programa.
Exacto como bien te han explicado ahí no debes escribir:
Código (cpp) [Seleccionar]

perro1.~doggo();

Ya que el destructor de una clase se invoca automáticamente al terminar el programa. Además en los casos en que no usas memoria dinámica no es necesario definir el destructor ya que la clase proporciona uno por defecto (como ocurre con el constructor). En cambio si utilizas memoria dinámica, en el destructor tendrías que liberar esa memoria ya que sino el programa correrá aparentemente sin problemas pero estarás dejando memoria sin liberar.

¿Entonces si quieres aplicar el destructor explícitamente durante el programa? Muy sencillo, creas un método auxiliar con las instrucciones del destructor y en el destructor sólo llamas a ese método auxiliar. Así si quieres usarlo en otro punto del programa sólo deberás invocar al método auxiliar. Pero recuerda, si invocas el método auxiliar por ejemplo para liberar memoria dinámica, tendrás que volver a reservar memoria antes de llegar al final y de que se llame al destructor; sino estarás liberando dos veces la memoria y la segunda vez te producirá un error.

Código (cpp) [Seleccionar]

Doggo::miDestructor(){
    // instrucciones del destructor
}

Doggo::~Doggo(){
    miDestructor;
}

int main(){
    Doggo perro1;
    // otras instrucciones del programa
    perro1.miDestructor();
    // otras instrucciones del programa
    return 0;  // se llama automaticamente a ~Doggo()
}


Aunque estás empezando ya llegarás a trabajar con memoria dinámica por lo que ten presente esto. Ánimo.
#932
Sí, en el array <base1> me he confundido es un 3 como bien dices, no un 1. Por eso es bueno que revises mi explicación detalladamente porque al ser tan largas me puedo equivocar en algún sitio y no darme cuenta.
#933
Para que veas como resolver este código te muestro un ejemplo con el comentario 3.
Imagina que tienes el número 18. 18 = 2 * 3 ^ 2 descompuesto en factores primos. Entonces supongamos que <aux1 = 18> (recuerda que <aux1> es tipo <float>):

Código (C++) [Seleccionar]

for(i = 2; i <= aux1; i = i + 1){
div1 = aux1 / i;
div2 = aux1 / i;

Empezamos con el 2 y dividimos <aux> (18 en nuestro caso) entre 2 y guardamos el resultado sin decimales en <div1>  porque es tipo <int> y el resultado con decimales en <div2> porque es tipo <float>. En nuestro caso <div1 = 9> y <div2 = 9.0>.

Código (C++) [Seleccionar]

if (div1 - div2 == 0)

Aquí comparamos que sean iguales, es decir que si el resultado sin decimales es igual al resultado con decimales significa que <aux> es divisible por <i>. En nuestro caso sí que lo es entonces analizamos el bloque del if.

Código (C++) [Seleccionar]

aux1 = aux1 / i;
j = 1;
while (j <= 4)

Con esto asignamos el valor de la división a aux1. En nuestro ejemplo <aux1 = 9> y empezamos a contar desde <j = 1> hasta <j = 4> incluido porque vamos a recorrer el array base1[5] que como su nombre indica almacena los números que dividen a <aux1>.

Código (C++) [Seleccionar]

if (base1[j] == i){
    exp1[j] = exp1[j] + 1;
    j = 100;
}

Para cada j en rango [1,4] comprobamos si ya hemos introducido antes ese divisor (recordemos <i = 2>). En el caso de que sí, se cumpliría el if y entonces aumentaríamos el exponente en esa posición. No es nuestro caso, pero si lo fuera se asignaría <j = 100> simplemente para que sea > 4 y así terminar el <while>.

Código (C++) [Seleccionar]

if (base1[j] == 0){
    base1[j] = i;
    exp1[j] = 1;
    j = 100;
}

En cambio si hay un 0 en el array base1 entonces metemos el divisor en esa posición y ponemos el exponente a 1. Se pone <j = 100> para salir del <while>.
Como es nuestro caso nuestros arrays quedarían así:
base1[5] = {0,2,0,0,0}
exp1[5] = {0,1,0,0,0}
Es decir que <aux1 = 18> es divisible por 2^1.

Código (C++) [Seleccionar]

j = j + 1;

Se reinicia el contador i a 1 ya que al terminar el <for> se ejecuta el incremento <i = i + 1> y entonces <i = 2>. ¿Por qué otra vez 2? Porque puede ser divisible por 2, más de 1 vez. Y se repite todo, ahora más rápido ya que te he explicado con detalle la primera iteración del <for>.

<i = 2> <aux1 = 9> -> 9 no es divisible por 2, entonces nos saltamos todo el <if> y hacemos otra iteración con <i = 3> (ahora no se ha hecho <i = 1> porque no hemos entrado en el <if>).
<i = 3> <aux1 = 9> -> 9 sí es divisible por 3, entonces <aux1 = 3> y entramos al if. ¿Existe ya el 3 en <base1>? No. Vamos al siguiente <if>, buscamos el primer 0 y metemos el 3 y ponemos a 1 el array <exp1> en esa posición. Resultado:
base1[5] = {0,2,1,0,0}
exp1[5] = {0,1,1,0,0}
Es decir que <aux1 = 18> es divisible por (2^1 * 3^1).

Ahora sí, reiniciamos i <i = 1> y otra iteración pero ahora <aux1 = 3>.
<i = 2> <aux1 = 3> -> 3 no es divisible por 2. No hacemos nada.
<i = 3> <aux1 = 3> -> 3 sí es divisible por 3, entonces <aux1 = 1> y entramos al <if>. ¿Existe ya el 3 en <base1>? Sí, entonces incrementamos el exponente y salimos del while. Resultado:
base1[5] = {0,2,3,0,0}
exp1[5] = {0,1,2,0,0}
Es decir que <aux1 = 18> es divisible por (2^1 * 3^2).

Ahora reiniciamos <i = 1> y <aux1 = 1>. Se ejecuta el incremento del <for> entonces <i = 2> y como no se cumple la condición del <for> ya que 2 > 1 entonces termina aquí este bloque.

Y ya tendríamos el número <aux1> descompuesto en factores primos, necesario para calcular el mcm y el mcd. Te recuerdo que aunque estoy escribiendo la posición 0 de los arrays en tus programas no se hace uso de ella (tus programas empiezan a contar en la posición 1).

Revisa la explicación, vete paso a paso comprendiendo lo que hace y porqué lo hace e intenta entender algún comentario más. La próxima duda que tengas espero que sea más específica ya que no puedo estar explicando un programa línea a línea. Por lo menos comenta hasta donde has entendido (o lo que te parezca que hace el programa) o que cosas entiendes para ahorrarme esas explicaciones.

Y recuerda que siempre puedes ir paso a paso como he hecho yo aquí poniendo cuanto vale cada variable en cada momento.
#934
Es cierto, madre mía. Y yo que me había quedado buscando información a ver si encontraba algo sobre ese uso de los arrays y era todo por no haber usado la etiqueta para el código. No había caído en eso. Muchas gracias MAFUS, ahora ya sabré a que se debe esto.

Estudiante000000, para evitar más problemas de estos podrías meter todos tus códigos entre etiquetas de código. Si no sabes como se hace puedes:
- O bien cuando estás escribiendo un mensaje buscar encima un botón con el signo (< >) que pone "insertar código".
- O bien teclear tú mismo los [ ] donde pues escribir "code" para que aparezca la etiqueta de código o poner "code=<lenguaje>" para que resalte la sintaxis de ese lenguaje por ejemplo en tu caso ["code=C++"] <codigo> ["/code"] sin las comillas.

Si no estás seguro puedes probar a previsualizar el mensaje antes de publicarlo para que se vea todo bien.

En cuanto a la explicación del código, los primeros comentarios no deberías tener problemas para entenderlos, el primero es una simple inicialización y el segundo son filtros. El resto son bucles con operaciones aritmético-lógicas que para comprender su funcionamiento lo mejor es depurar paso a paso el programa para ir viendo lo que hace y si no sabes usar herramientas de depuración, entonces papel y boli.
Y si tienes dudas de una instrucción en concreto que no entiendas, entonces puedes dejar otro mensaje con tu duda, pero no con el ejercicio completo copiado tal cual sin muestras de haber dedicado mucho esfuerzo en comprenderlo.
#935
Me he confundido antes de post y te he contestado en el otro que te explique. Pero bueno así si lo ve alguien que me lo explique... Lo pongo también aquí para que se entienda mi comentario.

En ese caso me gustaría que alguien me explicase cómo pueden compilar esos códigos. Porque hasta donde yo llego no puedes acceder a cada elemento de un array n-dimensional sin usar algún tipo de indexación y en este programa se modifican los valores de los arrays sin hacer uso de los índices.

La única explicación que se me ocurre es que el propio IDE (Visual Basic C++ si no me equivoco) sea capaz de añadir internamente los índices en cada uno de los bucles. Ya que yo compilo todo desde la terminal de Ubuntu 18 sin ningún tipo de IDE y por lo tanto no sé cómo funciona VIsual Basic C++.

Me he quedado realmente intrigado. Si pudieras preguntar esto a tu profesor de la universidad o algún otro usuario que me saque de esta intriga.
#936
En ese caso me gustaría que alguien me explicase cómo pueden compilar esos códigos. Porque hasta donde yo llego no puedes acceder a cada elemento de un array n-dimensional sin usar algún tipo de indexación y en este programa se modifican los valores de los arrays sin hacer uso de los índices.

Duda resuelta: No aparece la indexación porque al no utilizar etiquetas de código la indexación de la variable i, es decir entre corchetes [ ], se traduce como letra cursiva y no se ve tal cual en el texto.
#937
Antes de la explicación me gustaría saber si estos códigos llegáis a ejecutarlos o simplemente los veis escritos pero no los compiláis. Porque después de ver este y tus otros códigos me quería asegurar de que ese código tal y como está ahí escrito es imposible que compile.
#938
Programación C/C++ / Re: programacion
16 Noviembre 2018, 22:28 PM
El método congruencial mixto consiste en generar un número a partir del número generado anterior. Su expresión es X(n+1) = (a * X(n) + c) mod m; donde:
X(0) > 0: es la semilla, es decir, el primer elemento.
a > 0: es el multiplicador.
c > 0: es la constante aditiva.
m > X(0), m > a, m > c es el módulo.
Es decir que si empezamos con <X(0) = x>, el siguiente número <X(1) = (a * x + c) mod m> donde <mod m> significa el resto de dividir <a * x + c> entre <m>.

Con esta explicación tú debes definir esas variables que te he comentado antes y pensar el algoritmo para ir generando los siguientes elementos (pista: bucle for).
#939
El código tiene los siguientes errores, todos en <promedio_V>:
- En primer lugar estás declarando dos veces la i. Dentro del bucle for se puede declarar el contador (i en este caso) usando <int i = 0> pero si ya está declarado de antes dentro del for solo debe aparecer    <i = 0>. Es decir, tienes que eliminar una de las dos declaraciones.
- Dentro del for no estás accediendo a cada posición del vector. Para ello tienes que usar el operador de indexación [ ] de esta forma <vector[posicion]>.
- El for solo debe repetir la instrucción <suma += vector>, no el return también. El return va fuera del for.

Con todo esto el código quedaría así:
Código (C++) [Seleccionar]

float promedio_V(int vector[], int tamx) {
   float suma=0;
   
   for (int i = 0; i < tamx; i++){
      suma += vector[i];
   }
  return suma/tamx;
}


Además comentarte que cuando tienes un bloque de sentencias (if, while, for,...) que sólo repite una instrucción, esta no es necesario ponerla entre { }. Es decir que el for se puede hacer así (esto ya depende de gustos):

Código (C++) [Seleccionar]

for(int i = 0; i < tamx; i++)
    suma += vector[i];
return suma/tamx;


También en el for de la función <main> para mostrar cada elemento del vector; debes usar el [ ] para referirte a cada posición del vector (tanto para guardar un valor en él como para mostrarlo). El código quedaría así:

Código (C++) [Seleccionar]

for(int i=0; i<5400; i++){   
    vector[i] = 1+ rand() % 100;
    printf("\n%i", vector[i]);
}
#940
Dudo mucho que a un nivel de universidad se cometan errores de indexación como estos. No sé que nivel tendréis ahora mismo ya que si estáis empezando igual lo pone para que os deis cuenta de los errores que contiene dicho código. Pero me parece un poco extraño que haga eso, igual depende del país o de la universidad, o del propio profesor...
Dicho esto vamos a ver que se puede hacer con el código.

Código (C++) [Seleccionar]

for (i = 1; i <= 3; i = i + 1){
  for (j = 1; j <= 3; j = j + 1){
   system("cls");
   cout << "Ingrese valor (" << i << "," << j << ")= ";
   cin >> matriz[j];
  }
}


Lo primero es que este bloque tiene toda la pinta de ser para introducir los valores a la matriz pero en ese caso la línea 5 debería ser:
Código (C++) [Seleccionar]

cin >> matriz[i][j];


Observando el segundo bloque en el que tienes dudas, donde aparecen los auxiliares creo entender que cuando sólo se pone un índice a la matriz es porque es igual el primero que el segundo; es decir, que matriz[1] creo que se refiere a matriz[1][1]. Dando esto por supuesto en todo el programa:

Código (C++) [Seleccionar]

for (i = 4; i <= 5; i = i + 1) {
   matriz[1] = matriz[i - 3][1]; 
   matriz[2] = matriz[i - 3][2];
   matriz[3] = matriz[i - 3][3];
}


En este bucle se haría una primera iteración en la que:
matriz[1][1] = matriz[1][1]
matriz[2][2] = matriz[1][2]
matriz[3][3] = matriz[1][3]
Es decir se copiarían los valores de la primera fila en la diagonal principal de la matriz y en la segunda iteración con i = 5 quedaría:
matriz[1][1] = matriz[2][1]
matriz[2][2] = matriz[2][2]
matriz[3][3] = matriz[2][3]
Por lo que se copiarían los valores de la segunda fila en la diagonal (unas operaciones un tanto absurdas creo yo pero eso es lo que hace literalmente).

Finalmente el segundo bucle for asigna un valor indeterminado a las variables ya que se cuando la i vale más de 1 se accede a posiciones de la matriz que no han sido escritas por lo que pueden contener basura (dudo si en tal caso siempre valdrían 0 esas posiciones pero creo que no, que pueden tener cualquier valor basura ya que la matriz no ha sido inicializada entera a 0).

Conclusión: Si estos códigos son de un profesor de universidad, estoy entre dudar de mis conocimientos adquiridos hasta ahora en C++ o dudar de los conocimientos de ese profesor. Si al final le encuentras sentido a estos códigos me gustaría que me lo hicieras saber por si he pasado algo por alto.