2015-07-19 124 views
0

我正在撰寫這個編程任務以記錄員工工資單的毛支付和納稅支付功能。我只是想知道如果我正確地傳遞參數和通過引用傳遞,這是我們應該使用的方法。我的課不經常見面,書很爛,所以我會很感激任何建議。我是否正確傳遞參數並通過引用傳遞?

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


#define SIZE 5 

void userinput(char name[][20], int hoursworked[], float rate[]); 
void calculatepay(float rate[], int hoursworked[]); 
float tax(float grosspay[]); 
float totalpay(float grosspay[], float taxespaid[]); 
void print(char name[][20], float rate[], int hoursworked[], float grosspay[],  float sum, float taxespaid[]); 




int main(){ 

int hoursworked[]={}; 
float rate[]={}; 
char name[][20]={}; 
float grosspay[]={}; 
float taxespaid[]={}; 
float sum; 




userinput(name, hoursworked, rate); 
calculatepay(rate, hoursworked); 
sum = tax(grosspay); 
totalpay(grosspay, taxespaid); 
print(name, rate, hoursworked, grosspay, sum, taxespaid); 

return (0); 
} 





void userinput(char name[][20], int hoursworked[], float rate[]){ 

for(int i=0; i<SIZE; i++){ 

    printf("Enter name: "); 
    scanf("%s", &name[i] , 20); 

    if(name[i][0] == '-' && name[i][1] == '1'){ 
     break; 
    } 

    printf("Enter hours worked: "); 
    scanf("%d", &hoursworked[i]); 

    if(hoursworked[i] == -1){ 
     break; 
    } 

    printf("Enter hourly rate: "); 
    scanf("%f", &rate[i]); 

    if(rate[i] == -1){ 
     break; 
    } 
    puts("\n"); 



} 


} 

void calculatepay(float rate[], int hoursworked[]){ 





float grosspay[]={}; 


for(int i=0; i<SIZE; ++i){ 

    if(hoursworked[i]<=40){ 

     grosspay[i] = rate[i] * hoursworked[i]; 

    } 
    else{ 

     grosspay[i] = (40*rate[i])+((hoursworked[i] - 40)*1.5*rate[i]); 

    } 




} 
} 





float tax(float grosspay[]){ 



float taxespaid[]={}; 

for(int i=0; i<SIZE; ++i){ 
    taxespaid[i] = grosspay[i]*0.2; 
    return taxespaid[i]; 
} 



return 0; 


} 

float totalpay(float grosspay[], float taxespaid[]){ 


float sum = 0.0; 

for (int i=0; i<SIZE; i++) 
{ 
    sum=sum+(grosspay[i] - taxespaid[i]); 

} 

return sum; 

} 




void print(char name[][20], float rate[], int hoursworked[], float grosspay[], float sum, float taxespaid[]){ 

for(int i=0; i<SIZE; i++){ 

    printf("Pay to: %s\n", name[i] , 20); 
    if(name[i][0] == '-' && name[i][1] == '1'){ 
     break; 
    } 
    printf("Hours worked: %d\n", hoursworked[i]); 
    if(hoursworked[i] == -1){ 
     break; 
    } 
    printf("Hourly rate: %.2f\n", rate[i]); 
    if(rate[i] == -1){ 
     break; 
    } 

    if(hoursworked[i]<=40){ 

     printf("Gross Pay: %.2f\n", grosspay[i]); 

    } 
    else 
    { 

     printf("Gross Pay: %.2f\n", grosspay[i]); 
     printf("Base Pay: %.2f\n", rate[i]*40); 
     printf("Overtime Pay: %.2f\n", grosspay[i] - (rate[i]*40)); 
    } 
    printf("Taxes paid: %.2f\n", taxespaid[i]); 
    printf("Net pay: %.2f\n\n", grosspay[i] - taxespaid[i]); 
} 
printf("Total paid to all employees: %.2f\n", sum); 

} 
+3

把其中一個或多個陣列成'struct'它們組合一起的邏輯,然後將'struct *'傳遞給函數。 – trojanfoe

+1

'int hoursworked [] = {}; float rate [] = {}; char name [] [20] = {}; float grosspay [] = {}; float taxespaid [] = {};' - 在空的'['和']'之間添加'SIZE'。你還需要跟蹤大小,直到某處-1。 –

+0

請清理你的代碼。這幾乎不可能讀取。還有一個(可能是迂腐的)附註:C沒有引用傳遞的概念。 –

回答

1

我不喜歡做一個壞消息,但沒有通按引用在C.參數的傳遞一個C定義的唯一方法是通過按值,在6.5.2.2p4

在準備調用函數時,參數被評估,並且每個參數都被分配了相應參數的值。

也許你打算問一下關於C++的問題,在這種情況下......不,你沒有使用傳遞引用。否則,如果您打算詢問C模仿如何通過引用傳遞,它是通過使用指針(即,參數具有指針類型和指針)。

void userinput(char name[][20], int hoursworked[], float rate[]);中,例如,name,hoursworkedrate都是指針類型。傳遞的值將是指針值指針值指向要修改的對象,因此可能會得到相同的結果(也就是說,一旦函數返回,對數組所做的更改仍然可見)。

萬一你,爲什麼這在技術上不符合如通過按引用很好奇,這是因爲一元*pointerarray[subscript](或pointer[subscript]經營者必須改變價值指向,其中,當傳址參考使用,你應該只能夠分配沒有那些像一個值:array = value;它更有意義,如果你把它看作一個測試,編寫swap功能:

void swap(int x, int y) { 
    int temp = x; 
    x = y; 
    y = temp; 
} 

如果你嘗試調用這個函數,你會注意到它沒有成功地交換它的參數,如果你使用按值傳遞,那三條線會有sw應對了它的論點。例如,在C++:

void swap(int& x, int& y) { 
    int temp = x; 
    x = y; 
    y = temp; 
} 

交換的參數。我不得不改變的是函數簽名;我不必改變函數的使用方式或函數本身的代碼......這是通過引用傳遞的。

1

當我聲明的變量之前main()和與SIZE初始化數組那麼它工作得很好:)

#define SIZE 5 
void userinput(char name[][20], int hoursworked[], float rate[]); 
void calculatepay(float rate[], int hoursworked[]); 
float tax(float grosspay[]); 
float totalpay(float grosspay[], float taxespaid[]); 
void print(char name[][20], float rate[], int hoursworked[], float grosspay[],  float sum, float taxespaid[]); 

int hoursworked[SIZE]; 
float rate[SIZE]; 
char name[SIZE][20]; 
float grosspay[SIZE]; 
float taxespaid[SIZE]; 
float sum; 


int main(){ 

userinput(name, hoursworked, rate); 
calculatepay(rate, hoursworked); 
sum = tax(grosspay); 
totalpay(grosspay, taxespaid); 
print(name, rate, hoursworked, grosspay, sum, taxespaid); 

return (0); 
} 

void userinput(char name[][20], int hoursworked[], float rate[]){ 
int i; 
for(i=0; i<SIZE; i++){ 

    printf("Enter name: "); 
    scanf("%s", &name[i] , 20); 

    if(name[i][0] == '-' && name[i][1] == '1'){ 
     break; 
    } 

    printf("Enter hours worked: "); 
    scanf("%d", &hoursworked[i]); 

    if(hoursworked[i] == -1){ 
     break; 
    } 

    printf("Enter hourly rate: "); 
    scanf("%f", &rate[i]); 

    if(rate[i] == -1){ 
     break; 
    } 
    puts("\n"); 

} 

} 

void calculatepay(float rate[], int hoursworked[]){ 

float grosspay[SIZE]; 

int i; 
for(i=0; i<SIZE; ++i){ 

    if(hoursworked[i]<=40){ 

     grosspay[i] = rate[i] * hoursworked[i]; 

    } 
    else{ 

     grosspay[i] = (40*rate[i])+((hoursworked[i] - 40)*1.5*rate[i]); 

    } 


} 
} 

float tax(float grosspay[]){ 


int i; 
float taxespaid[SIZE]; 

for(i=0; i<SIZE; ++i){ 
    taxespaid[i] = grosspay[i]*0.2; 
    return taxespaid[i]; 
} 

return 0; 

} 

float totalpay(float grosspay[], float taxespaid[]){ 

float sum = 0.0; 
int i; 
for (i=0; i<SIZE; i++) 
{ 
    sum=sum+(grosspay[i] - taxespaid[i]); 

} 

return sum; 

} 

void print(char name[][20], float rate[], int hoursworked[], float   grosspay[], float sum, float taxespaid[]){ 
int i; 
for(i=0; i<SIZE; i++){ 

    printf("Pay to: %s\n", name[i] , 20); 
    if(name[i][0] == '-' && name[i][1] == '1'){ 
     break; 
    } 
    printf("Hours worked: %d\n", hoursworked[i]); 
    if(hoursworked[i] == -1){ 
     break; 
    } 
    printf("Hourly rate: %.2f\n", rate[i]); 
    if(rate[i] == -1){ 
     break; 
    } 

    if(hoursworked[i]<=40){ 

     printf("Gross Pay: %.2f\n", grosspay[i]); 

    } 
    else 
    { 

     printf("Gross Pay: %.2f\n", grosspay[i]); 
     printf("Base Pay: %.2f\n", rate[i]*40); 
     printf("Overtime Pay: %.2f\n", grosspay[i] - (rate[i]*40)); 
    } 
    printf("Taxes paid: %.2f\n", taxespaid[i]); 
    printf("Net pay: %.2f\n\n", grosspay[i] - taxespaid[i]); 
} 
printf("Total paid to all employees: %.2f\n", sum); 

} 
+0

引用我很高興你得到它的工作。正如其他人所觀察到的,C沒有通過引用。然而,它具有指針,並且將指針(通過值)傳遞給函數可以使該函數修改指向的對象。這實際上是自動發生的,這就是爲什麼你的數組很重的程序工作。 –