On the payroll pointers program, I am struggling with a few things on the program.
The data from the terminal uses malloc, for an employee node. Dynamic Memory Allocation is used in the program.
For the name of each employee I can put in the First Name or First and Last Name together as one word, but if I put them as separate words it just gives me the first name and doesn't let the user enter the rest of the information requested by the program. When I select, a option for would you like to add another employee (y/n) I get a error dialog box debug error, Run-Time Check Failure #3- The variable 'num_emp' is being used without being initialized. What do they mean by used with being initialized? I don't know what they mean by unreferenced local variable. Any solutions that would fix the errors in the program?
#include "stdio.h"
#include "stdlib.h"
#define CHAR_SIZE 20
#define STD_HOURS 40.0
#define MAX_HOURS 158.0
#define OT_RATE 1.5
struct employee
{
char name[CHAR_SIZE];
long id_number;
float wage;
float hours;
float overtime;
float ot_pay;
float gross_pay;
float Gross;
struct employee *next;
};
// Function gets hours for each employee
float CalcOT(float hours)
{
/* test to see if any overtime was worked */
if (hours > STD_HOURS)
return (hours - STD_HOURS);
else /* no overtime was worked */
return (0.0);
}
float CalcOverPay (wage, ot_hrs)
float wage, ot_hrs;
{
float ot_rate, /* ther rate the overtime is based on, such as */
/* time and a half */
ot_pay; /* The amount of pay that is from overtime */
/* calculate the overtime pay */
ot_pay = ot_hrs * (wage * OT_RATE);
/* return the overtime pay to the calling function */
return (ot_pay);
} /* end of function over_pay */
float CalcGross(float hours, float wage, float overtime)
{
float Gross;
/* check for overtime and calculate gross*/
if (overtime > 0) {
Gross = (STD_HOURS * wage) /* regular pay */
+ (overtime * OT_RATE * wage); /* ot pay */
} /* if */
else /* not ot */
{
Gross = wage * hours;
} /* else */
return (Gross);
} /* CalcGrossPay */
void print_list(emp1)
struct employee *emp1;
{
struct employee *tmp; /* tmp pointer value to current node */
int i = 0; /* counts the nodes printed */
printf ("\n------------------------------------------------------------\n");
printf (" Name Clock# Wage Hours OT Gross Pay\n");
printf ("--------------------------------------------------------------\n");
/* Start a beginning of list and print out each value */
/* loop until tmp points to null (remember null is 0 or false) */
for(tmp = emp1; tmp ; tmp = tmp->next)
{
i++;
printf("%-15s, %6d, $%6.2f %.1f %5.2f $%6.2f\n",tmp->name, tmp->id_number,
tmp->wage, tmp->hours, tmp->ot_pay, tmp->gross_pay);
}
printf("\n\nTotal Number of Employees = %d\n", i);
}
/* end declarations */
int main()
{
char answer[80];
int more_data = 1;
char value;
struct employee *emp_ptr; /* always pointer to the first node */
struct employee *temp_ptr; /* points to the current node */
float ot_pay; /* overtime pay */
int i, /* loop counter */
num_emp; /* total number of employees */
struct employee *current_ptr, /* pointer to current node */
*head_ptr; /* always points to first node */
/* Set up storage for first node */
head_ptr = (struct employee *) malloc (sizeof(struct employee));
current_ptr = head_ptr;
while (more_data)
{
printf("\nEnter employee name: ");
scanf("%s", & current_ptr -> name);
printf("\nEnter employee ID: ");
scanf("%d", & current_ptr -> id_number);
printf("\nEnter employee wage: ");
scanf("%f", & current_ptr -> wage);
printf("\nEnter hours worked for week: ");
scanf("%f", & current_ptr -> hours);
printf("Would you like to add another employee? (y/n): ");
scanf("%s", answer);
/* loop for each employee */
for(i=0; i < num_emp; ++i)
{
/* initialize the overtime pay */
ot_pay = 0.0;
/* test to see if the employee worked any overtime */
if(temp_ptr->hours > STD_HOURS)
{
/* call local function to calculate the overtime hours */
temp_ptr->overtime = CalcOT(temp_ptr->hours);
/* call local function to calculate the overtime pay */
ot_pay = CalcOverPay(temp_ptr->wage, temp_ptr->overtime);
}
else
{
temp_ptr->overtime = 0.0;
} /* end of if statement */
/* call local funcion to calculate the gross pay */
temp_ptr->Gross = CalcGross (temp_ptr->wage,temp_ptr->hours,ot_pay);
/* move temporary pointer to next node in the linked list */
temp_ptr = temp_ptr->next;
} /* end of for loop */
/* Ask user if they want to add another employee */
if (value = toupper(answer[0]) != 'Y')
{
current_ptr->next = (struct employee *) NULL;
more_data = 0;
}
else
{
/* set the next pointer of the current node to point to the new node */
current_ptr->next = (struct employee *) malloc (sizeof(struct employee));
/* move the current node pointer to the new node */
current_ptr = current_ptr->next;
}
}
/* print out listing of all employee id's and wages that were entered */
print_list(head_ptr);
printf("\n\nEnd of program\n");
return 0;
return 0;
} /* main */
1>------ Build started: Project: PayrollPointers, Configuration: Debug Win32 ------
1>Compiling...
1>payroll.c
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(46) : warning C4244: 'return' : conversion from 'double' to 'float', possible loss of data
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(61) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(56) : warning C4101: 'ot_rate' : unreferenced local variable
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(75) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(139) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(142) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(145) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(148) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(151) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(181) : warning C4013: 'toupper' undefined; assuming extern returning int
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(122) : warning C4101: 'emp_ptr' : unreferenced local variable
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(154) : warning C4700: uninitialized local variable 'num_emp' used
1>f:\c programming\payrollpointers\payrollpointers\payroll.c(160) : warning C4700: uninitialized local variable 'temp_ptr' used
1>Linking...
1>Embedding manifest...
1>Build log was saved at "file://f:\C Programming\PayrollPointers\PayrollPointers\Debug\BuildLog.htm"
1>PayrollPointers - 0 error(s), 13 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========