elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Comentarios en este programa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Comentarios en este programa  (Leído 4,031 veces)
Estudiante000000

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Comentarios en este programa
« Respuesta #10 en: 17 Noviembre 2018, 04:26 am »

Pero realmente me quedo en el comentario 3 , y de ahi para arriba algunos son similares pero son demasiadas lineas de codigo que me pierdo y no se que estan haciendo :(


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Comentarios en este programa
« Respuesta #11 en: 17 Noviembre 2018, 05:32 am »

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
  1. for(i = 2; i <= aux1; i = i + 1){
  2. div1 = aux1 / i;
  3. 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
  1. 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
  1. aux1 = aux1 / i;
  2. j = 1;
  3. 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
  1. if (base1[j] == i){
  2.    exp1[j] = exp1[j] + 1;
  3.    j = 100;
  4. }
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
  1. if (base1[j] == 0){
  2.    base1[j] = i;
  3.    exp1[j] = 1;
  4.    j = 100;
  5. }
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
  1. 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.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Estudiante000000

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Comentarios en este programa
« Respuesta #12 en: 17 Noviembre 2018, 17:16 pm »

<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.



Muchisimas gracias tu explicacion es perfecta y me ayuda demasiado , seguire analizando el restante del codigo y te lo hare saber mi duda , ahora tengo una pequeña duda  cuando es el numero 9 divisible entre 3 entramos al <if> , y pones el 3 en el array base y en el array exp 1 correcto pero porque pusiste 1 no se si te habras equivocado hazmelo saber porfa en esta parte
 

"<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) "



Deberia ser base1[5] = {0,2,3,0,0} ?

y Bueno los comentarios del 3 al 5 son la misma descomposiciòn en factores primos seguire analizando el codigo y te hare saber lo que creo que se y mis dudas muchisimas gracias por tu ayuda eres genial!
« Última modificación: 17 Noviembre 2018, 17:40 pm por Estudiante000000 » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Comentarios en este programa
« Respuesta #13 en: 17 Noviembre 2018, 19:58 pm »

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.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines