Help with C++ perfect number program

  • Context: Comp Sci 
  • Thread starter Thread starter gbsboard
  • Start date Start date
  • Tags Tags
    C++ Program
Click For Summary

Discussion Overview

The discussion revolves around a C++ program intended to determine whether a given number is a perfect number, requiring the implementation of multiple functions including a main function, a function to sum divisors, and two void functions. Participants are addressing issues related to the program's structure, syntax errors, and logical flow.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant notes the need for four functions and describes the expected behavior of the program, including input and output examples.
  • Another participant points out various syntax issues, such as the use of a global variable 'num1' alongside a local variable, and missing semicolons in function calls.
  • Concerns are raised about an infinite loop caused by a semicolon at the end of a while loop, which prevents the program from progressing.
  • A participant expresses confusion about the term "SVR function," suggesting it might refer to the void sum_of_divisors function.
  • One user describes their experience with the program, indicating that they are unsure how to implement logic to check if the sum of divisors equals the input number.
  • Another participant emphasizes the importance of correcting the while loop to avoid infinite execution.

Areas of Agreement / Disagreement

Participants generally agree on the presence of syntax errors and logical issues in the code. However, there is no consensus on the resolution of these issues, and multiple competing views on how to correct the program remain.

Contextual Notes

Participants have identified several limitations in the code, including unresolved logical flow, unclear variable usage, and potential infinite loops. The discussion reflects ongoing attempts to refine the program without reaching a definitive solution.

Who May Find This Useful

Individuals interested in learning C++ programming, particularly those working on homework assignments related to functions and control structures.

gbsboard
Messages
4
Reaction score
0
Ok I've been having a lot of trouble with this program, I am also very new to C++. The program requires to have 4 functions 1 main, 1 svr, 2 void functions
any kind of loop (for loop preferred) in the main function so that a user can enter any number of positive integers in the main function. One function is called sum_of_divisors which accepts an integer and returns the sum of its perfect divisors.

The program also prints out the input value as well as a message indicating whether the number is perfect or not

Example

Enter Number you want to test: 12
Sum of Divisor = 16
12 is not a perfect number


Enter Number you want to test: 6
Sum of Divisor = 6
6 is a perfect number

So far I have as my code

Code:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//File Name: Perfect Numbers
//Author: ********
//Email Address: ***********
//Homework Number: 3
//Description: Tests input number to see whether or not they
//are perfect numbers.
//Last Changed: feb 2, 2011

#include <iostream>
using namespace std;

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: get_data
//* purpose: reads the value used 
//*
//* parameters: Num1 - the first number
//* calls:  None
//* * * * * * * * * * * * * * * * * * * * * * * * * * *

void get_data (int& num1);

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: Sum of Divisors
//* purpose:  Figures out whether what the divisors are
//* parameters: Divisor - gets the number
//*             
//* calls:  None
//* * * * * * * * * * * * * * * * * * * * * * * * * * *



void sum_of_divisors(int num1);

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: Results
//* purpose:  Shows the results of the function
//* parameters: Divisor - shows the perfect
//*             
//* calls:   get_data
//* * * * * * * * * * * * * * * * * * * * * * * * * * *

void show_results (int num1);

int num1;

int main()
{
	int num1;

	get_data(num1);
	while (num<=0);
	for(int divisor=1; divisor<=num1; divisor++)
	{
	show_results(num1)
	get_data(num1)
	}
	return(0);
}

void get_data(int& num1)
{
	using namespace std;
	cout <<"\n Enter number to test to see if it is a perfect number ";
  	cin >> num1;
}

void sum_of_divisors(int num1)
{
int sum=0;
   
    for(int divisor = 1; divisor <=(num1 / 2); divisor++)

    if(num1 % divisor == 0)
        sum += divisor;
return;

void show_results(int num1)
{
	sum_of_divisors();
	cout<<" \n\nThe perfect divisors for the input number \n\n"<<
	cout<<" Number being tested:   " << num1 <<" Divisors:   " << sum_of_divisors <<endl<<endl;	
}
 
Physics news on Phys.org
I'll just start out by pointing out that it's spelled "Function". :)

Here's some of the problems I see, without getting into the logic.
gbsboard said:
Code:
int num1;

int main()
{
	int num1;
You have a global 'num1' there, but also one in your main. You probably shouldn't have the global variable there.
gbsboard said:
Code:
	get_data(num1);
	while (num<=0);
That while loop will go on forever if num is <= 0, and will do absolutely nothing. However, you didn't declare a variable called 'num'. I'm guessing you meant for that get_data() to be inside the while loop, and to use num1.
gbsboard said:
Code:
	for(int divisor=1; divisor<=num1; divisor++)
	{
	show_results(num1)
	get_data(num1)
	}
	return(0);
}
You're missing semi-colons on both function calls in that for loop. Also, return isn't a function, so you don't need the parentheses. Doesn't hurt, but really serves no purpose here.
gbsboard said:
Code:
void get_data(int& num1)
{
	using namespace std;
	cout <<"\n Enter number to test to see if it is a perfect number ";
  	cin >> num1;
}
You don't need that using namespace std in there. It's already at the top of the program. Wouldn't think that would even compile, but maybe. Never tried putting it in the middle of a function.
gbsboard said:
Code:
void sum_of_divisors(int num1)
{
int sum=0;
   
    for(int divisor = 1; divisor <=(num1 / 2); divisor++)

    if(num1 % divisor == 0)
        sum += divisor;
return;
You're missing a curly brace after the return statement.
gbsboard said:
Code:
void show_results(int num1)
{
	sum_of_divisors();
	cout<<" \n\nThe perfect divisors for the input number \n\n"<<
	cout<<" Number being tested:   " << num1 <<" Divisors:   " << sum_of_divisors <<endl<<endl;	
}
Those two cout lines are pretty off. You either need to replace that last << on the first cout line with a semi-colon or make it into this (assuming I didn't make a syntax mistake or something):
Code:
	cout<<" \n\nThe perfect divisors for the input number \n\n"
	      <<" Number being tested:   " << num1 <<" Divisors:   "
              << sum_of_divisors <<endl<<endl;
Anyways, that's a quick pass through to find the errors that jump out at me. Hopefully enough to get you rolling.
 
If you want help, help us out by telling us what problems you are having with your code.

What's an svr function?
 
ok the problem i keep getting now is that it will prompt me to get a number so i'll type in 6 and then it stops and won't run any more of the program but will let me keep typing in numbers/letters and I am still figuring out where cout so that it will say "if the sum of the divisor = num1" such as 6 because 1+2+3=6 then cout<<"6 is a perfect number" but if the sum of the divisor doesn't = num1 then 6 is not a perfect number. I have updated the source code with the corrections suggested but i still am not sure what i am supposed to do with

get_data(num1);
while (num1>=1);

I know that the highest number I could need for the program would be 8128.

Updated code
Code:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//File Name: Perfect Numbers
//Author: xxxxxx
//Email Address: xxxxxxxx
//Homework Number: 3
//Description: Tests input number to see whether or not they
//are perfect numbers.
//Last Changed: Feb 2, 2011

#include <iostream>
using namespace std;

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: get_data
//* purpose: reads the value used 
//*
//* parameters: Num1 - the first number
//* calls:  None
//* * * * * * * * * * * * * * * * * * * * * * * * * * *

void get_data (int& num1);

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: Sum of Divisors
//* purpose:  Figures out whether what the divisors are
//* parameters: Divisor - gets the number
//*             
//* calls:  None
//* * * * * * * * * * * * * * * * * * * * * * * * * * *
void sum_of_divisors(int num1);

//* * * * * * * * * * * * * * * * * * * * * * * * * *
//* Funtion: Results
//* purpose:  Shows the results of the function
//* parameters: Divisor - shows the perfect
//*             
//* calls:   get_data
//* * * * * * * * * * * * * * * * * * * * * * * * * * *

void show_results (int num1);

int main()
{
	int num1;

	get_data(num1);
	while (num1>=1);
	for(int divisor=1; divisor<=num1; divisor++)
	{
	show_results(num1);
	get_data(num1);
	}

	return(0);
}

void get_data(int& num1)
{
	cout <<"\n Enter number to test to see if it is a perfect number ";
  	cin >> num1;
}

void sum_of_divisors(int num1)
{
int sum=0;
   
    for(int divisor = 1; divisor <=(num1 / 2); divisor++)

    if(num1 % divisor == 0)
        sum += divisor;
return;
}

void show_results(int num1)
{
		
	cout<<" \n\nThe perfect divisors for the input number \n\n"
	      <<" Number being tested:   " << num1 <<" Divisors:   "
              << sum_of_divisors <<endl<<endl;	
	

}

My professor never really told us what a SVR function was 90% of the class figured it ment the void sum_of_divisor

and thank you for all the help I have been trying to figure out this program for a little over 8 hours and it's just making me a lot less interested in computer programming than I was.
 
Last edited:
That semicolon at the end of your while loop makes it an infinite loop.

while(num1 >= 1);

If you have entered a value for num1 that is 1 or larger, your loop runs forever, and never goes to the statements following the loop.

You need to think more about what your main function should do, and specifically, what should be going on in main versus what should be going on in show_results() and sum_of_divisors().

One possible organization would be this:
Code:
// in main()
int num = 1;

  while (num >= 1)
  {
     show_results(num1);
     get_data(num1);
  }
  return 0;
The code for show_results calls the sum_of_divisors function, but you are not calling this function correctly - you need to have sum_of_divisors(num1), which you don't.

Also, you really should change "Funtion" to "Function" as grep suggested.
 
In addition to what Mark said, you need to return a value from this function:
Code:
int sum_of_divisors(int num1)
{
    int sum=0;
   
    for(int divisor = 1; divisor <=(num1 / 2); divisor++)
        if(num1 % divisor == 0)
            sum += divisor;

    return sum;
}
Right now, that sum is stuck in the function and ceases to exist once it exits. Also, note that I fixed the indentation. It makes it clear that the if statement is inside the for loop, which is very important. I would just use curly braces for clarity, myself, but that's up to you. At minimum, make sure to indent it correctly.

This also means you need to pass that sum value into show_results, which should have a signature such as:

void show_results (int num1, int sum);
 
Last edited:
Alright i was able to get the program to function 100% perfectly need to thank you for all the help it is very much appreciated.
 
Code:
int sum(int n){
        int s=1,d;
        for(d=2; d*d<n; d++)
                if (n%d==0)
                        s+= d + n/d;
        if (d*d==n)
                s+=d;
        return s;
}

but...
http://en.wikipedia.org/wiki/Perfect_number#Even_perfect_numbers"
Code:
#include <stdio.h>
unsigned long long int s,n1;
unsigned int p,i,n;
 
int main(){
        p =2; 
        n =3;  // n== 2^p - 1
        n1=2;  // n1*n perfect number if n is prime
        do{
                s=4;                     // 1  Lucas-Lehmer test
                for(i=3; i<=p; i++)      // 2
                        s=(s*s-2) % n;   // 3
                if (s==0 || p==2)        // 4
                        printf("Mersenne prime=2^%2d-1=%10d, perfect number %20llu\n", p, n, n1*n);
                p++;
                n1=n+1;
                n=2*n+1;
        }while (p<32);
        return(0);
}
Output
Code:
Mersenne prime=2^ 2-1=         3, perfect number                    6
Mersenne prime=2^ 3-1=         7, perfect number                   28
Mersenne prime=2^ 5-1=        31, perfect number                  496
Mersenne prime=2^ 7-1=       127, perfect number                 8128
Mersenne prime=2^13-1=      8191, perfect number             33550336
Mersenne prime=2^17-1=    131071, perfect number           8589869056
Mersenne prime=2^19-1=    524287, perfect number         137438691328
Mersenne prime=2^31-1=2147483647, perfect number  2305843008139952128
 
Last edited by a moderator:

Similar threads

  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 6 ·
Replies
6
Views
4K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 1 ·
Replies
1
Views
11K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 12 ·
Replies
12
Views
2K