2015-07-19 125 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没有通过引用。然而,它具有指针,并且将指针(通过值)传递给函数可以使该函数修改指向的对象。这实际上是自动发生的,这就是为什么你的数组很重的程序工作。 –