Ayuda progrma numeros amigos

Iniciado por skatres, 25 Noviembre 2011, 19:50 PM

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

skatres

Hola, pues siguiendo con mi intento de adentrarme en este mundo de la programacion, esta vez me ha tocado con los llamados subprogramas o funciones, bueno el caso esque he estado intentando realizar el siguiente ejercicio, no está terminado, pero esque el programa me ignora toda la parte de las funciones unsigned

/* Se piden dos numeros naturales m y n. El progrma mostrará
todas las parejas de numeros amigos que hay en el intervalo [m,n].
Dos numeros son amigos si la suma de los divisores del primero
(sin contarse el mismo) coincide con el segundo y viceversa.Nota:
usa una funcion que, dado un numero, devuelva la suma de sus divisores
(sin contarse el mismo)*/

# include <stdio.h>
# include <stdlib.h>

unsigned amigos (unsigned am, unsigned an, unsigned m, unsigned n);
int main()
{ int m,n,amigos;

  printf("\nIntroduce m:");
  scanf("%d",&m);
 
  printf("\nIntroduce n:");
  scanf("%d",&n);
   
   
system("pause");
return 0;   
   
}


unsigned amigos (unsigned am, unsigned an, unsigned m, unsigned n)
{
for(am=0;am<m;am++)

{ if(m%am==0)
  m+=am;
}
  if(am==n)
  printf("Son numeros amigos");

}


¿Como puedo solucionarlo?, gracias.

DickGumshoe

Me parece que es porque "unsigned amigos" (y el resto), va dentro de int main().

RyogiShiki

#2
Y los tipos? Donde están los tipos de la variables? y la del prototipo?:

unsigned amigos (unsigned am, unsigned an, unsigned m, unsigned n);

Más bien sería:

void amigos (unsigned int am, unsigned int an, unsigned int m, unsigned int n);

Lo mismo cuando implementas la función, pone los tipos que faltan. O le cambias el tipo de la función a otra cosa que no sea void si es que piensas retornar un entero o algo.

Saludos


skatres

El caso esque cambio la funcion usnsigned por la que no retorna nada es decir, la funcion void, pero sigue ignorandome todo la funcion, no entiendo

RyogiShiki

Cita de: skatres en 25 Noviembre 2011, 20:46 PM
El caso esque cambio la funcion usnsigned por la que no retorna nada es decir, la funcion void, pero sigue ignorandome todo la funcion, no entiendo
Jejej. no me habia fijado en eso. El caso es que tienes que llamar a la función desde main(); en alguna parte en el main después de que pides los datos debes llamar a la función, te doy un ejemplo:

#include <stdio.h>

void print_number(int);

int main() {
  int num = 0;
  printf("Dame un numero: ");
  scanf("%d", &num);
  print_number(num);
 
  return 0;
}

void print_number(int n) {
  printf("Imprimiendo numero: %d desde la funcion print_number\n", n);
}


Saludos


skatres

Ok, creo que mas o menos lo he pillado, osea sería declarar una funcion(la del void) dentro de la funcion int main(), lo he probado pero ahora el programa me lo compila, pero me sale un mensaje de error y se cierra. Algo así me ha quedado:

/* Se piden dos numeros naturales m y n. El progrma mostrará
todas las parejas de numeros amigos que hay en el intervalo [m,n].
Dos numeros son amigos si la suma de los divisores del primero
(sin contarse el mismo) coincide con el segundo y viceversa.Nota:
usa una funcion que, dado un numero, devuelva la suma de sus divisores
(sin contarse el mismo)*/

# include <stdio.h>
# include <stdlib.h>

void amigos (int am, int n , int m);

int main()
{ int m,n,am;

  printf("\nIntroduce m:");
  scanf("%d",&m);
 
  printf("\nIntroduce n:");
  scanf("%d",&n);
 
  amigos(am,n,m);
   
   
system("pause");
return 0;   
   
}


void amigos (int am, int n, int m)
{
for(am=0;am<m;am++)

{ if(m%am==0)
  m+=am;
}
  if(am==n)
  printf("Son numeros amigos");

}

RyogiShiki

Fíjate muy bien lo que estas haciendo, analisa el ciclo for de la función:


for(am=0;am<m;am++)
{
   if(m%am==0)

Cuando el primer ciclo se ejecute el estado de las variable am es am = 0, momentos después haces m% am, lo que implica hacer una división, en este caso sería m/0 lo que es un error, no puedes dividir por 0.

Mi sugerencia es que te replantees el problema de los números amigos, soluciónalo primero en el papel, observa los pasos que tienes que dar para solucionarlo y cuando tengas eso entonces pásalo al computador.

Saludos


skatres

Cita de: RyogiShiki en 25 Noviembre 2011, 21:33 PM
Fíjate muy bien lo que estas haciendo, analisa el ciclo for de la función:


for(am=0;am<m;am++)
{
   if(m%am==0)

Cuando el primer ciclo se ejecute el estado de las variable am es am = 0, momentos después haces m% am, lo que implica hacer una división, en este caso sería m/0 lo que es un error, no puedes dividir por 0.

Mi sugerencia es que te replantees el problema de los números amigos, soluciónalo primero en el papel, observa los pasos que tienes que dar para solucionarlo y cuando tengas eso entonces pásalo al computador.

Saludos

Madre mia!!! tengo que estar ciego, porque es verdad que no me habia dado cuenta de ese error, bueno voy a replantearlo en papel y haber que sale.


Muchas gracias compi!!

skatres

#8
Hola, bueno sigo intentando que me salga este programa, lo volví a empezar en papel, y ahora lo paso al compilador pero me da estos dos errores:
Practicas Programacion\Ensayo numeros amigos.cpp In function `unsigned int son_amigos(unsigned int, unsigned int, unsigned int, unsigned int)':

29 Practicas Programacion\Ensayo numeros amigos.cpp invalid conversion from `unsigned int (*)(unsigned int, unsigned int, unsigned int, unsigned int)' to `unsigned int'



En teoria el programa me ha quedado así:
/* Se piden dos numeros naturales m y n. El progrma mostrará
todas las parejas de numeros amigos que hay en el intervalo [m,n].
Dos numeros son amigos si la suma de los divisores del primero
(sin contarse el mismo) coincide con el segundo y viceversa.Nota:
usa una funcion que, dado un numero, devuelva la suma de sus divisores
(sin contarse el mismo)*/


# include <stdio.h>
# include <stdlib.h>

unsigned son_amigos(unsigned a , unsigned b , unsigned num1 , unsigned num2);

int main()

{   int num1,num2;
    printf("\nIntroduce el pimer numero:");
    scanf("%d",&num1);
   
    printf("\nIntroduce el segundo numero:");
    scanf("%d",&num2);
   
    system("pause");
    return 0;
}

unsigned son_amigos(unsigned a , unsigned b , unsigned num1 , unsigned num2)
{ for(a==1;a<num1;a++)
  if(num1%a==0)
  num1+=a;
  { for(b==1;b<num2;b++)
    if(num2%b==0)
    num2+=b;
  }
  if(a=b)
  printf("Son numeros amigos");
  else
  printf("No son numeros amigos");
  return son_amigos;