Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Estudiante000000 en 16 Noviembre 2018, 22:37 pm



Título: Comentarios en este programa
Publicado por: Estudiante000000 en 16 Noviembre 2018, 22:37 pm
Buenas tardes , espero me puedan ayudar con los comentarios de este programa para entender mejor su funcionamiento muchas gracias el programa sirve para calcular el  maximo comun divisor y el minimo comun multiplo gracias , los comentarios donde se especifican porfavor muchas gracias al que pueda.





                       

#include<iostream>
#include<conio.h>

using namespace std;
int main()
{
 int num1=0, num2=0, num3=0, i, j, z;
 int div1;
 float div2;
 int base1[5], exp1[5];
 int base2[5], exp2[5];
 int base3[5], exp3[5];

 int aux[13], expaux[13];
 
 int mcm[13], expmcm[13];
 int mcd[13], expmcd[13];
 
 float aux1, aux2, aux3;
 
 // COMENTARIO NRO 1

 for (i = 0; i <= 4; i = i + 1)
 {
  base1 = 0;
  base2 = 0;
  base3 = 0;
  exp1 = 0;
  exp2 = 0;
  exp3 = 0;
 }

 for (i = 0; i <= 12; i = i + 1)
 {
  mcm = 0;
  expmcm = 0;
  mcd = 0;
  expmcd = 0;
  aux = 0;
  expaux = 0;
 }


 // COMENTARIO NRO 2

 while (num1<1 || num1>1000)
 {
  cout << "ingrese numero 1 = " ;
  cin >> num1;
  aux1 = num1;
 }



 while (num2<1 || num2>1000)
 {
  cout << "ingrese numero 2 = " ;
  cin >> num2;
  aux2 = num2;
 }



 while (num3<1 || num3>1000)
 {
  cout << "ingrese numero 3 = ";
  cin >> num3;
  aux3 = num3;
 }



 // COMENTARIO NRO 3

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

  if (div1 - div2 == 0)
  {
   aux1 = aux1 / i;
   j = 1;
   while (j <= 4)
   {
    if (base1[j] == i)
    {
     exp1[j] = exp1[j] + 1;
     j = 100;
    }


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

   i = 1;
  }

 }



 // COMENTARIO NRO 4


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

  if (div1 - div2 == 0)
  {
   aux2 = aux2 / i;
   j = 1;
   while (j <= 4)
   {
    if (base2[j] == i)
    {
     exp2[j] = exp2[j] + 1;
     j = 100;
    }


    if (base2[j] == 0)
    {
     base2[j] = i;
     exp2[j] = 1;
     j = 100;
    }
    j = j + 1;
   }

   i = 1;
  }

 }


 // COMENTARIO NRO 5

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

  if (div1 - div2 == 0)
  {
   aux3 = aux3 / i;
   j = 1;
   while (j <= 4)
   {
    if (base3[j] == i)
    {
     exp3[j] = exp3[j] + 1;
     j = 100;
    }


    if (base3[j] == 0)
    {
     base3[j] = i;
     exp3[j] = 1;
     j = 100;
    }
    j = j + 1;
   }

   i = 1;
  }

 }

 // COMENTARIO NRO 6

 for (i = 1; i <= 4; i = i + 1)
 {
  for (j = 1; j <= 4; j = j + 1)
  if (base1 == base2[j])
  {
   z = 1;
   while (mcd[z] != 0)
   {
    z = z + 1;
   }

   mcd[z] = base1;
   if (exp1 <= exp2[j])
   {
    expmcd[z] = exp1;
   }
   else
   {
    expmcd[z] = exp2[j];
   }
  }
 }


 // COMENTARIO NRO 7

 for (i = 1; i <= 4; i = i + 1)
 {
  for (j = 1; j <= 4; j = j + 1)
  if (base1 == base2[j])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }

   mcm[z] = base1;
   if (exp1 >= exp2[j])
   {
    expmcm[z] = exp1;
   }
   else
   {
    expmcm[z] = exp2[j];
   }
  }

  if (base1 != base2[1] && base1 != base2[2] && base1 != base2[3] && base1 != base2[4])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }
   mcm[z] = base1;
   expmcm[z] = exp1;
  }

  if (base2 != base1[1] && base2 != base1[2] && base2 != base1[3] && base2 != base1[4])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }
   mcm[z] = base2;
   expmcm[z] = exp2;
  }
 }


 // COMENTARIO NRO 8

 for (i = 0; i <= 12; i = i + 1)
 {
  aux = mcd;
  expaux = expmcd;
  mcd = 0;
  expmcd = 0;
 }

 // COMENTARIO NRO 9

 for (i = 1; i <= 4; i = i + 1)
 {
  for (j = 1; j <= 12; j = j + 1)
  if (base3 == aux[j])
  {
   z = 1;
   while (mcd[z] != 0)
   {
    z = z + 1;
   }

   mcd[z] = base3;
   
   if (exp3 <= expaux[j])
   {
    expmcd[z] = exp3;
   }
   else
   {
    expmcd[z] = expaux[j];
   }
  }
 }

 // COMENTARIO NRO 10

 for (i = 0; i <= 12; i = i + 1)
 {
  aux = mcm;
  expaux = expmcm;
  mcm = 0;
  expmcm = 0;
 }



 // COMENTARIO NRO 11


 for (i = 1; i <= 4; i = i + 1)
 {
  for (j = 1; j <= 12; j = j + 1)
  if (base3 == aux[j])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }

   mcm[z] = base3;
   if (exp3 >= expaux[j])
   {
    expmcm[z] = exp3;
   }
   else
   {
    expmcm[z] = expaux[j];
   }
  }

  if (base3 != aux[1] && base3 != aux[2] && base3 != aux[3] && base3 != aux[4] && base3 != aux[5] && base3 != aux[6] && base3 != aux[7] && base3 != aux[8])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }
   mcm[z] = base3;
   expmcm[z] = exp3;
  }

  if (aux != base3[1] && aux != base3[2] && aux != base3[3] && aux != base3[4] && aux != base3[5] && aux != base3[6] && aux != base3[7] && aux != base3[8])
  {
   z = 1;
   while (mcm[z] != 0)
   {
    z = z + 1;
   }
   mcm[z] = aux;
   expmcm[z] = expaux;
  }
 }
 

 // COMENTARIO NRO 12

 system("cls");
 cout << num1 << " = " << base1[1] << "^" << exp1[ 1 ];
 for (i = 2; i <= 4; i = i + 1)
 {
  if (base1 != 0)
  {
   cout << " * " << base1 << "^" << exp1;
  }
 }

 cout << endl;

 cout << num2 << " = " << base2[1] << "^" << exp2[1];
 for (i = 2; i <= 4; i = i + 1)
 {
  if (base2 != 0)
  {
   cout << " * " << base2 << "^" << exp2;
  }
 }

 cout << endl;

 cout << num3 << " = " << base3[1] << "^" << exp3[1];
 for (i = 2; i <= 4; i = i + 1)
 {
  if (base3 != 0)
  {
   cout << " * " << base3 << "^" << exp3;
  }
 }

 
 
 // COMENTARIO NRO 13
 
 cout << endl;
 

 if (mcd[1] == 0)
 {
  cout << "MCD (" << num1 << "," << num2 << "," << num3 << ")= 1";
 }
 else
 {
  cout << "MCD (" << num1 << "," << num2 << "," << num3 << ")= " << mcd[1] << "^" << expmcd[1];
  for (i = 2; i <= 12; i = i + 1)
  {
   if (mcd != 0)
   {
    cout << " * " << mcd << "^" << expmcd;
   }
  }
 }
 

 // COMENTARIO NRO 14

 cout << endl;

 cout << "mcm (" << num1 << "," << num2 << "," << num3 << ")= " << mcm[1] << "^" << expmcm[1];
 for (i = 2; i <= 12; i = i + 1)
 {
  if (mcm != 0)
  {
   cout << " * " << mcm << "^" << expmcm;
  }
 }


 cout << endl;
 getch();
 return 0;

 }






Título: Re: Comentarios en este programa
Publicado por: K-YreX en 16 Noviembre 2018, 23:05 pm
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.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 en 16 Noviembre 2018, 23:17 pm
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.

Si compila amigo.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 en 16 Noviembre 2018, 23:26 pm
Si compila amigo.

El programa lo ejecute y compila perfectamente y saca el mcd y el mcm sin ningun problema.


Título: Re: Comentarios en este programa
Publicado por: K-YreX en 16 Noviembre 2018, 23:31 pm
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.


Título: Re: Comentarios en este programa
Publicado por: MAFUS en 17 Noviembre 2018, 00:24 am
Eso es porqué copió tal cual el código sin envolverlo entre etiquetas code. De esta forma todo lo que sea un i entre corcheas se convierte en cursivas. Si te fijas dónde debería haber un subindice empiezan a haber letras en cursiva. Cómo no cierra esta etiqueta, este tipo de letras de duran hasta el final del mensaje.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 en 17 Noviembre 2018, 01:16 am
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.

Entiendo ya vi el problema de porque no lo puedes compilar , si puedes revisar este link esta el codigo y de ahi lo puedes copiar sin ningun problema para que pruebes que compile solo añade la libreria #include<windows.h> y quitale el system("pause") y  me dices.

http://usmtoday2018.blogspot.com/2018/11/programacion-ii-ejercicios-actividad_16.html


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 en 17 Noviembre 2018, 01:20 am
Eso es porqué copió tal cual el código sin envolverlo entre etiquetas code. De esta forma todo lo que sea un i entre corcheas se convierte en cursivas. Si te fijas dónde debería haber un subindice empiezan a haber letras en cursiva. Cómo no cierra esta etiqueta, este tipo de letras de duran hasta el final del mensaje.

Ese seria el problema es que  yo copio el codigo tal cual como esta y no lo envuelvo en etiquetas code seguro por eso no puedes compilar ninguno de los que he posteado pero en el link que puse  en ese blog estan los programas que he posteado la mayoria.


Título: Re: Comentarios en este programa
Publicado por: K-YreX en 17 Noviembre 2018, 01:27 am
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.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 en 17 Noviembre 2018, 04:22 am
Si gracias obviamente los primeros son sencillos , lo revisare mas a fondo y cualquier duda te la hare saber muchas gracias.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 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 :(


Título: Re: Comentarios en este programa
Publicado por: K-YreX 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.


Título: Re: Comentarios en este programa
Publicado por: Estudiante000000 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!


Título: Re: Comentarios en este programa
Publicado por: K-YreX 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.