Autor Tema: Números perfectos Dev-C++

0 Usuarios y 1 Visitante están viendo este tema.

25 Marzo, 2012, 03:43 pm
Leído 2434 veces

Meghan

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 8
  • Karma: +0/-0
  • Sexo: Femenino
Hola, estoy haciendo un programa que me diga si dos números son perfectos y si son amigos entre sí.
La cuestión es que me compila, pero al ejecutarlo me pide que introduzca los dos números dos veces seguidas.
Aquí dejo el código:

#include <iostream>

using namespace std;

int LeerEnteroPositivoa (){
     int a;

           do{
               cout<<"Dame un numero entero positivo:"<<endl;
               cin>>a;
           }
            while(a<1);



     return a;
     }

int LeerEnteroPositivob (){

    int b;

            do{

             cout<<" Dame otro numero entero positivo:"<<endl;
              cin>>b;
            }
            while(b<1);




    return b;

}

bool Perfa () {
     bool perfectoa;
     int a=LeerEnteroPositivoa();
     int suma=0;

         for (int i=1;i<a;i++){

               if(a%i==0)
               {
                 suma+=i;
               }
         }

         if(suma==a)
            perfectoa=true;
         else
             perfectoa=false;

 return perfectoa;

}

bool Perfb () {
     bool perfectob;
     int b=LeerEnteroPositivob();
     int suma=0;

         for (int i=1;i<b;i++){

               if(b%i==0)
               {
                 suma+=i;
               }
         }

         if(suma==b)
            perfectob=true;
         else
             perfectob=false;

 return perfectob;

}

bool amigos()
     int a=LeerEnteroPositivoa();
     int b=LeerEnteroPositivob();
     int i=1;
     int j=1;
     int suma_div_b=0;
     int suma_div_a=0;
     bool sonamigos;




        for(i=1;i<=(a/2);i++){

            if((a%i)==0){
                 suma_div_a=suma_div_a+i;
                 }

        }

         for(j=1;j<=(b/2);j++){

             if((b%j)==0){
                 suma_div_b=suma_div_b+j;
                 }

         }

         if((suma_div_a==b)&&(suma_div_b==a)&&(a!=b)){
             sonamigos=true;
         }
         else
            sonamigos=false;

    return sonamigos;
}


int main(){


  int PerfectoA=Perfa();
  int PerfectoB=Perfb();
  int Amigos= amigos();

  cout << " Es perfecto el primer numero ? ( 0= Falso, 1=Verdadero)"<< PerfectoA << endl;
  cout << " ¿ Es perfecto el segundo numero ?( 0= Falso, 1=Verdadero) " << PerfectoB<< endl;
  cout << " ¿ son amigos ?( 0= Falso, 1=Verdadero) "<< Amigos << endl;

}




Creo que el problema está en el booleano Amigos

Aquí os dejo adjunto lo que me sale al ejecutar.
Seguro que es una tontería,pero no caigo.

Gracias :)

25 Marzo, 2012, 10:26 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
El problema está en tu estilo de programación.
No hay que repetir más de una vez funciones que hacen lo mismo.

Además, has usado varias funciones que en su interior piden datos al usuario.

Hay que separar la introducción de datos por una parte, y el uso o cálculo con los datos en otra parte.

Así no vas a tener redundancias de ningún tipo y tendrás un código mucho más breve y claro.

Ahí va mi versión, basada en la tuya (aunque no la he compilado para ver si está libre de errores de compilación, pero seguro captarás enseguida la idea):

________________

#include <iostream>

using namespace std;

int LeerEnteroPositivo_(){
     int a;

     do{               
               cin>>a;
     } while(a<1);

     return a;
}

int SumaDivisores(int a) {
     int suma=0;

     for (int i=1;i<a;i++){
         if(a%i==0) {
                 suma+=i;
         }
     }

    return suma;
}

bool Perf (int a) {
     bool perfecto; 
     int suma = SumaDivisores(a);

      if(suma==a)
            perfecto=true;
         else
             perfecto=false;

 return perfecto;
}

bool amigos(int a, int b)
     bool sonamigos;
     int suma_div_a=SumaDivisores(a);
     int suma_div_b=SumaDivisores(b);

     if((suma_div_a==b)&&(suma_div_b==a)&&(a!=b)){
             sonamigos=true;
         }
     else
            sonamigos=false;

    return sonamigos;
}


int main(){
  int numeroA, numeroB;
  int PerfectoA, PerfectoB;
  int Amigos;

  cout<<"Dame un numero entero positivo:"<<endl;
  numeroA = LeerEnteroPositivo_ ();

  cout<<"Dame otro numero entero positivo:"<<endl;
  numeroB = LeerEnteroPositivo_ ();

  PerfectoA=Perf(numeroA);
  PerfectoB=Perf(numeroB);
  Amigos= amigos(numeroA, numeroB);

  cout << " Es perfecto el primer numero ? ( 0= Falso, 1=Verdadero)"<< PerfectoA << endl;
  cout << " ¿ Es perfecto el segundo numero ?( 0= Falso, 1=Verdadero) " << PerfectoB<< endl;
  cout << " ¿ son amigos ?( 0= Falso, 1=Verdadero) "<< Amigos << endl;

}

25 Marzo, 2012, 10:37 pm
Respuesta #2

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Y ahora una forma aún más breve.
________________

#include <iostream>

using namespace std;

int LeerEnteroPositivo_(){
     int a=0;

     while(a<=0)           
        cin>>a;

     return a;
}

int SumaDivisores(int a) {
     int suma=0;

     for (int i=1;i<a;i++)
         if(a%i==0)
                 suma+=i;

   return suma;
}

bool Perf (int a) {
      return (SumaDivisores(a)==a);
}

bool amigos(int a, int b)
     return ((SumaDivisores(a)==b)&&(SumaDivisores(b)==a)&&(a!=b));
}


int main(){
  int numeroA, numeroB;

  cout<<"Dame un numero entero positivo:"<<endl;
  numeroA = LeerEnteroPositivo_ ();

  cout<<"Dame otro numero entero positivo:"<<endl;
  numeroB = LeerEnteroPositivo_ ();

  cout << " Es perfecto el primer numero ? ( 0= Falso, 1=Verdadero)"<< Perf(numeroA)  << endl;
  cout << " ¿ Es perfecto el segundo numero ?( 0= Falso, 1=Verdadero) " << Perf(numeroB) << endl;
  cout << " ¿ son amigos ?( 0= Falso, 1=Verdadero) "<< amigos(numeroA, numeroB) << endl;

}

27 Marzo, 2012, 06:00 pm
Respuesta #3

Meghan

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 8
  • Karma: +0/-0
  • Sexo: Femenino
Muchas gracias, Argentinator !!! El tuyo se ve de forma mucho más clara  :aplauso: