Bien, veamos, parece que tienes otro problema con las funciones, los parámetros.
Cuando a una función le pasamos parámetros es porque necesitamos variables que dependen de cada ejecución. Por ejemplo si queremos si un número es perfecto/abundante/defectivo pues debemos pasarle el número no? Lógico.
Para poder usar estas variables dentro de la función debemos darle un nombre. En el prototipo no es necesario, podemos dejarlo en <int Perfecto(int)> porque el prototipo solo necesita saber de qué tipo es cada parámetro y el valor que retorna. Pero en la implementación sí debemos poner un nombre por ejemplo <int Perfecto(int num)>.
Luego tenemos las variables locales a una función. Por ejemplo si necesitamos una variable como parece que ahora es <sum_div> que la vamos a usar dentro de la función para hacer cálculos pero fuera de esa función no tiene utilidad, la podemos crear de forma local en la función. Y quedaría algo así:
// cabeceras
int Perfecto(int);
// main
int Perfecto(int num){
int sum_div = 0; // num no lo declaramos aqui porque lo estamos pasando como parametro
for(int i = 1; i < num; ++i) // desde el 1 hasta num-1
if(num % i == 0) // si num es divisible por i
sum_div += i; // sum_div = sum_div + i acumulamos la i
if(sum_div > num) // si se cumple esto, num es abundante (me fio de tu definicion de abundante, no he comprobado que sea asi)
return 1; // devolvemos 1 y la funcion termina
if(sum_div < num) // si se cumple esto, num es defectivo
return -1; // devolvemos -1 y la funcion termina
return 0; // si num no es abundante ni defectivo, entonces tiene que ser perfecto, no queda otra. Devolvemos 0 y termina la funcion
}
Por pasos:
No sé la utilidad del <while()> supongo que es por si te preguntan por el 0, pero no funciona así. Piensa que un <while()> se ejecuta mientras se cumpla la condición por lo tanto si esa función recibe un número distinto a 0 NUNCA saldría del <while()>. En programación es importante diferenciar entre <while()> e <if()> ya que representan cosas distintas.
Como ves ya hemos reducido los parámetros a 1 porque <sum_div> la creamos dentro de la función ya que fuera no tiene utilidad y no varía su valor inicial, siempre la inicializaremos en 0.
También he quitado los <cout> por lo que te decía. Mejor que la función nos responda lo que queremos saber y ya veremos nosotros cómo usamos esa información. Imagina que el que creó la función suma, lo implementó de está forma:
int suma(int a, int b){
int suma = a + b;
cout << "La suma de " << a << " + " << b << " = " << suma << endl;
return suma;
}
Entonces cada vez que alguien hiciera <suma(a, b)> le saldría esa línea por pantalla. No siempre queremos mostrar el resultado de una suma ya que muchas veces son cálculos parciales, no la solución. Entonces se implementa la suma como:
int suma(int a, int b){
return a+b;
}
// Y si en alguna ocasion queremos ver el resultado pues hacemos
cout << "La suma de " << a << " + " << b << " = " << suma(a,b) << endl; // pero esto ya en el main o en otra funcion
Y por último, el <return> es como el final de la función. Si se ejecuta un <return> ya no se van a ejecutar las líneas que sigan porque un <return> "retorna" el control a la función que llama a la que acaba de terminar.
Espero no haberme dejado nada. Si tienes más dudas sobre funciones, ya sabes que puedes preguntar y siempre puedes probar a hacer funciones hasta que las manejes perfectamente. Suerte