2015-04-07 16 views
0

气泡排序应该基于工资数组。在工资按升序排序后,员工编号,工资率和工时应该改变。我能够对付费率进行排序,但我的员工ID信息保持不变。我需要另外做while循环吗?C++:如何使用气泡排序来重新排列我的数据

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
using namespace std; 

// Constant for the array size. 
const int ARRAY_SIZE = 4; 

// Function Prototypes 
void getEmployeeInfo(long [], int [], double [], double [], int); 

void bubbleSort(long empId[],int hours[],double payRate[],double wages[],int size); 

void displayWages(long empId[], double wages[], int size); 

int main() 
{ 
    // Array of employee ID numbers 
    long empId[ARRAY_SIZE] = { 5658845, 4520125, 7895122, 
           8777541}; 

    // Array to hold the hours worked for each employee 
    int hours[ARRAY_SIZE] = {0}; 

    // Array to hold the hourly pay rate for each employee 
    double payRate[ARRAY_SIZE] = {0}; 

    // Array to hold the gross wages for each employee 
    double wages[ARRAY_SIZE] = {0}; 

    // Get the employee payroll information and store 
    // it in the arrays. 
    getEmployeeInfo(empId, hours, payRate, wages, ARRAY_SIZE); 

    // Display the payroll information. 
    displayWages(empId, wages, ARRAY_SIZE); 

    // Sort the payroll information in ascending order with a bubble sort. 
    bubbleSort(empId, hours, payRate, wages, ARRAY_SIZE); 

    // Display the payroll information again. 
    displayWages (empId, wages, ARRAY_SIZE); 

    system("PAUSE"); 

    return 0; 
} 

// ******************************************************** 
// The getEmployeeInfo function receives four parallel * 
// arrays as arguments. The 1st array contains employee * 
// IDs to be displayed in prompts. It asks for input and * 
// stores hours worked and pay rate information in the * 
// 2nd and 3rd arrays. This information is used to  * 
// calculate gross pay, which it stores in the 4th array. * 
// ******************************************************** 
void getEmployeeInfo(long emp[], int hrs[], double rate[], 
        double pay[], int size) 
{ 
    cout << "Enter the requested information " 
     << "for each employee.\n"; 

    // Get the information for each employee. 
    for (int count = 0; count < size; count++) 
    { 
     cout << "\nEmployee #: " << emp[count] << "\t"; 

     // Get this employee's hours worked. 
     cout << "Hours worked: "; 
     cin >> hrs[count]; 

     // Validate hours worked. 
     while (hrs < 0) 
     { 
      cout << "\nHours worked must be 0 or more. " 
       << "Please re-enter: "; 
      cin >> hrs[count]; 
     } 

     // Get this employee's pay rate. 
     cout << "\tPay rate: $"; 
     cin >> rate[count]; 

     // Validate the pay rate. 
     while (rate[count] < 6.00) 
     { 
      cout << "\nPay rate must be 6.00 or more. " 
       << "Please re-enter: $"; 
      cin >> rate[count]; 
     } 

     // Calculate this employee's gross pay. 
     pay[count] = hrs[count]*rate[count]; 

     // ADD statement to calculate wages by multiplying 
       // hours with rate of pay; 
    } 
} 

// ******************************************************** 
// The bubbleSort function sorts the information based on * 
// the wages array.          * 
// ******************************************************** 
void bubbleSort(long empId[],int hours[],double payRate[],double wages[],int size) 
{ 
    bool swap; 
    int index; 

    do 
    { 
     swap = false; 
     for (int count = 0; count < (size - 1); count++) 
     { 
      if (wages[count] > wages [count + 1]) 
      { 
       index = wages[count]; 
       wages[count] = wages[count + 1]; 
       wages[count + 1] = index; 
       swap = true; 
      } 
     } 

    } while (swap); 
} 

// ******************************************************** 
// The displayWages function displays employee ID numbers * 
// and their wages.          * 
// ******************************************************** 
void displayWages(long empId[], double wages[], int size) 
{ 
    // Set up the numeric output formatting. 
    cout << fixed << showpoint << setprecision(2) << endl; 

    // Display the header. 
    cout << "----------------------------\n"; 
    cout << "Employee    Wages\n"; 
    cout << "----------------------------\n\n"; 

    // Display each employee's pay. 
    for (int count = 0; count < ARRAY_SIZE; count++) 
    { 
     cout << "Employee #" << empId[count] << " $"; 
     cout << setw(7) << wages[count] << endl << endl; 
    } 

} 
+0

里面,你换了工资阵列的两个元素的冒泡功能,您还需要交换EMPID,时间的相应元素和payRate阵列 – samgak

+0

那么这是否意味着我应该再添加2个if语句,但它是否符合empId和hours? – Duck

+0

不,因为你是根据工资排序的,所以if语句只应该比较工资。我会添加一个答案来显示我的意思 – samgak

回答

0

里面,你换了工资阵列的两个元素的冒泡功能,您还需要交换EMPID,时间和payRate阵列的相应元素。此外,您需要为临时交换变量使用与交换值相同的类型,否则转换为int时会失去准确性。

void bubbleSort(long empId[],int hours[],double payRate[],double wages[],int size) 
{ 
    bool swap; 
    double temp1; 
    int temp2; 
    long temp3; 

    do 
    { 
     swap = false; 
     for (int count = 0; count < (size - 1); count++) 
     { 
      // compare the wages, because that is what you are sorting on 
      if (wages[count] > wages [count + 1]) 
      { 
       // swap all the data between the two array positions: 
       temp1 = wages[count]; 
       wages[count] = wages[count + 1]; 
       wages[count + 1] = temp1; 

       temp1 = payRate[count]; 
       payRate[count] = payRate[count + 1]; 
       payRate[count + 1] = temp1; 

       temp2 = hours[count]; 
       hours[count] = hours[count + 1]; 
       hours[count + 1] = temp2; 

       temp3 = empId[count]; 
       empId[count] = empId[count + 1]; 
       empId[count + 1] = temp3; 

       swap = true; 
      } 
     } 

    } while (swap); 
} 
+0

好吧。谢谢。这很简单。我没有想到只是在循环中添加语句,并且认为要为循环添加更多内容。 – Duck

+0

不客气。请记住,将员工ID与特定工资关联的唯一方法是,他们在两个数组中处于相同位置。所以如果你改变了一个而不是另一个,他们将会失去同步并且不再匹配。由于这个原因,把所有的信息(id,wage等)放到一个结构或类中,并且有一个结构数组而不是4个独立的数组可能会更好。 – samgak

0

创建一个辅助函数来交换

void swaphelper(long (&emp)[] , doubles(&wages)[] ,doubles(&payrate)[] , int(&hours)[], int fromIndex , int toIndex) 
{ 

    emp[fromIndex] = emp[fromIndex]^emp[toIndex]; 
    emp[toIndex] = emp[toIndex]^emp[fromIndex]; 

    wages[fromIndex] = wages[fromIndex]^wages[toIndex]; 
    wages[toIndex] = wages[toIndex]^wages[fromIndex]; 

    payrate[fromIndex] = payrate[fromIndex]^payrate[toIndex]; 
    payrate[toIndex] = payrate[toIndex]^payrate[fromIndex]; 

    hours[fromIndex] = hours[fromIndex]^hours[toIndex]; 
    hours[toIndex] = hours[toIndex]^hours[fromIndex]; 

} 


void bubbleSort(long empId[],int hours[],double payRate[],double wages[],int size) 
{ 
bool swap; 
int index; 

do 
{ 
    swap = false; 
    for (int count = 0; count < (size - 1); count++) 
    { 
     if (wages[count] > wages [count + 1]) 
     { 
      swaphelper(emp , wages , pirate , hours , count , count+1); // can be abstracted to a struct 
      swap = true; 
     } 
    } 

} while (swap); 
}