Click here to Skip to main content
15,892,927 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Write a complete C program to calculate total pay which includes net salary and bonus.
Listed below are functions that need to be included in your program.:
void BasicSalary() – Ask user to enter basic salary.

void EPF(double) – To calculate the amount of employees evident fund (EPF)
deduction from basic salary.

void CalculateBonus(double) – To calculate the amount of bonus. Assume bonus
is half of basic salary.

double DisplayTotalPay(double,double,double)– To calculate the total pay after EPF
deduction and bonus reward.

Your program output should be like below:
Please enter your salary :
1200
Please enter the percentage of EPF deduction :
11
Your EPF deduction is RM132.00
Your bonus (half of salary) is RM600.00
Your total pay is RM1200.00 – RM132.00 + RM600.00 = RM1668.00

What I have tried:

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

void BasicSalary ();
double EPF (double);
double CalculateBonus (double);
double DisplayTotalPay (double, double, double);
double percentage, salary, deduction, half, total;

void
main ()
{
  BasicSalary ();
  EPF (deduction);
  CalculateBonus (half);
  DisplayTotalPay (salary, deduction, half);
}

void
BasicSalary ()
{
  printf ("Please enter your salary: ");
  scanf ("%lf", &salary);
}

double
EPF (double deduction)
{
  printf ("\nPlease enter the percentage of EPF deduction: ");
  scanf ("%lf", &percentage);
  deduction = salary * (percentage / 100);
  printf ("\nYour EPF deduction is RM%.2lf", deduction);
  return (deduction);
}

double
CalculateBonus (double half)
{
  half = salary / 2;
  printf ("\n\nYour bonus <half of="" salary=""> is RM%.2lf", half);
  return (half);
}

double
DisplayTotalPay (double salary, double deduction, double half)
{
  total = salary - deduction + half;
  printf ("\nYour total pay is RM%.2lf - RM%.2lf + RM%.2lf = RM%.2lf", salary,
	  deduction, half, total);
}
Posted
Updated 24-Dec-21 20:33pm
v2

To begin, it is a really bad idea to use so many global variables as you are. That, in itself, is not good but to then pass variables into functions with the same names as those global variables is seriously misguided.

This is very simple code. I see no good reason to have any global variables at all. To do so is just lazy programming. Think about it! You are passing three variables into the DisplayTotalPay function and that's OK but why are you changing a global variable in that function? It is not used anywhere else so it does NOT need to be global and it shouldn't be. Global variables should be used very, very sparingly and this program is so simple that it does not need any. The variable total, as it is used, does not need to be global and should be a local variable to the DisplayTotalPay function.

Look at the function CalculateBonus. It is passed a global variable but that variable is passed by value and then it is modified and returned but the return value is not used for anything. THIS is why you get the wrong answer. This is how that function should look :
C++
double CalculateBonus( double pay )
{
    double bonus = pay / 2;
    printf ("\nYour bonus <half of salary> is RM%.2lf\n", bonus );
    return bonus;
}
Look also at BasicSalary. There should not be a global variable used there so it should look like this :
C++
double BasicSalary()
{
   printf ("Please enter your salary: ");
   double sal = 0;
   scanf( "%lf", &sal );
   return sal;
}
Note that return is not a function so its argument does not to be enclosed in parenthesis.

To do this more correctly, all of your global variables: percentage, salary, deduction, and half, should be local to the main function and passed into the functions that need them and set from the return value of various functions.

This means your main function should look like this :
C++
void
main ()
{
  double salary, deduction, bonus;

  salary = BasicSalary();
  deduction = EPF( salary );
  bonus = CalculateBonus( salary );
  DisplayTotalPay( salary, deduction, bonus );
}
The function DisplayTotalPay should be of type void since it does not return anything and I already described how the variable total should be handled.

If you make these changes I think you have a very good chance of having a working program.
 
Share this answer
 
Comments
k5054 25-Dec-21 10:01am    
I've 5'd you, but I have to point out that the OP seems to have been given some function signatures to work with. Given that the requirement seems to be void EPF(double) and void CalculateBonus(double);, I'm not sure how to solve the problem without using global variables. Additionally the signature double DisplayTotalPay(double,double,double); seems particularly ridiculous, given that the purpose, extrapolated from the name of the function is to display something, there's no point in returning a value, and that other functions that should return a value don't. I wonder if the OP misstyped the assignment? If not, then I wonder about the qualifications of the instructor!
Compiling does not mean your code is right! :laugh:
Think of the development process as writing an email: compiling successfully means that you wrote the email in the right language - English, rather than German for example - not that the email contained the message you wanted to send.

So now you enter the second stage of development (in reality it's the fourth or fifth, but you'll come to the earlier stages later): Testing and Debugging.

Start by looking at what it does do, and how that differs from what you wanted. This is important, because it give you information as to why it's doing it. For example, if a program is intended to let the user enter a number and it doubles it and prints the answer, then if the input / output was like this:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Then it's fairly obvious that the problem is with the bit which doubles it - it's not adding itself to itself, or multiplying it by 2, it's multiplying it by itself and returning the square of the input.
So with that, you can look at the code and it's obvious that it's somewhere here:
C
int Double(int value)
   {
   return value * value;
   }

Once you have an idea what might be going wrong, start using the debugger to find out why. Put a breakpoint on the first line of the method, and run your app. When it reaches the breakpoint, the debugger will stop, and hand control over to you. You can now run your code line-by-line (called "single stepping") and look at (or even change) variable contents as necessary (heck, you can even change the code and try again if you need to).
Think about what each line in the code should do before you execute it, and compare that to what it actually did when you use the "Step over" button to execute each line in turn. Did it do what you expect? If so, move on to the next line.
If not, why not? How does it differ?
Hopefully, that should help you locate which part of that code has a problem, and what the problem is.
This is a skill, and it's one which is well worth developing as it helps you in the real world as well as in development. And like all skills, it only improves by use!
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900