gpt4 book ai didi

c - 我是否正确传递参数并通过引用传递?

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:17 24 4
gpt4 key购买 nike

对于我正在编写的用于跟踪员工工资单的编程任务,我没有得到 grosspay 和 taxpaid 函数的输出。我只是想知道我是否正确传递参数并通过引用传递,这是我们应该使用的方法。我的类(class)不常见面,这本书也很烂,所以我很感激任何建议。

#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);

}

最佳答案

我讨厌成为坏消息的传递者,但是C 中没有传递引用。C 定义的唯一传递参数的方法是传递值,在6.5.2.2p4 中。 :

In preparing for the call to a function, the arguments are evaluated, and each parameter is assigned the value of the corresponding argument.

也许您打算询问有关 C++ 的问题,在这种情况下...不,您没有使用按引用传递。

否则,如果您想问 C 是如何模拟引用传递的,那是通过使用指针(即参数具有指针类型和指针)。

void userinput(char name[][20], int hoursworked[], float rate[]);中,例如name, hoursworked rate 都是指针类型。传递的值将是指针值指针值 指向要修改的对象,因此可能会出现相同的结果(也就是说,一旦函数返回,对数组所做的更改仍然可见)。

如果您想知道为什么这在技术上不符合引用传递的条件,那是因为一元 *pointerarray[subscript] (或者 pointer[subscript] 运算符需要更改指向的值,而当使用按引用传递时,您应该只能分配一个值而没有像这样的值: array = value;。如果您将其视为编写 swap 函数的测试,则更有意义:

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

如果您尝试调用此函数,您会注意到它尚未成功交换参数。如果您要使用按值传递,那三行将交换其参数。例如,在 C++ 中:

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

交换参数。我所要做的就是更改函数签名;我不必更改函数的使用方式或函数本身的代码...这就是按引用传递。

关于c - 我是否正确传递参数并通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com