我正在尝试编写一个跟踪员工工资单的程序,我似乎可以通过引用正确传递参数。执行程序时,由于断点自动出现,我无法通过用户输入功能。
#include <stdio.h>
#define size 5
void userinput(int *hoursworked[size], float *rate[size], char *name[size]);
float calculatepay(float *rate[size], int *hoursworked[size]);
float tax(float *grosspay[size]);
float totalpay(float *grosspay[size]);
void print(char *name[size][20], float *rate[size], int *hoursworked[size], float *grosspay[size], float sum[size], float taxespaid[size]);
int main()
{
int hoursworked[size];
float rate[size];
char name[size];
float grosspay[size];
float taxespaid[size];
float sum[size];
userinput(&hoursworked[size], &rate[size], &name[size]);
calculatepay(&rate[size], &hoursworked[size]);
tax(&grosspay[size]);
totalpay(&grosspay[size]);
print(&name[size], &rate[size], &hoursworked[size], &grosspay[size], &sum[size], &taxespaid[size]);
return 0;
}
void userinput(int *hoursworked[size], float *rate[size], char *name[size])
{
for(int i=0; i<size; i++){
printf("Enter name: ");
scanf("%s", name[i] , 20);
printf("Enter hours worked: ");
scanf("%d", hoursworked[i]);
printf("Enter hourly rate: ");
scanf("%f", rate[i]);
}
}
float calculatepay(float *rate[size], int *hoursworked[size])
{
float grosspay[size];
for(int i=0; i<size; i++){
grosspay[size] = *rate[size] * *hoursworked[size];
}
return grosspay[size];
}
float tax(float *grosspay[size])
{
float taxespaid[size];
for(int i=0; i<size; i++){
taxespaid[size] = *grosspay[size]*0.2;
}
return taxespaid[size];
}
float totalpay(float *grosspay[size])
{
float sum;
int i;
for (i=0; i<size; i++) {
sum = sum + *grosspay[i];
}
return(sum);
}
void print(char *name[size][20], float *rate[size], int *hoursworked[size], float *grosspay[size], float sum[size], float taxespaid[size])
{
for(int i=0; i<size; i++){
printf("Pay to: %s", name[i][20]);
printf("Hours worked: %d", hoursworked[i]);
printf("Hourly rate: %f", rate[i]);
printf("Gross Pay: %f", grosspay[i]);
printf("Taxes paid: %f", taxespaid[i]);
printf("Net pay: %f", *grosspay[i] - taxespaid[i]);
printf("Total paid to all employees: %f", sum[i]);
}
}
答案 0 :(得分:1)
看起来,指针概念并不适合你。将数组传递给函数时,只需传递变量即可。它指向数组的地址。所以
userinput(variableName);
功能定义应该是,
(Void)userinput( int variableName[size])
{
//code here
}
答案 1 :(得分:1)
将数组传递给函数时,该函数会自动接收数组的地址。所以你的声明不需要指向数组的指针,只需要一个数组。所以不要这样:
float totalpay(float *grosspay[size]);
你这样做:
float totalpay(float grosspay[size]);
此外,您对此功能的调用不正确:
totalpay(&grosspay[size])
这不会传递整个数组,而是传递给一个元素 - 指向数组的末尾。你反而想要这个:
totalpay(grosspay);
需要对您的其他功能进行类似的修复。
calculatepay
使用本地grosspay
数组。您可能希望从grosspay
传递main
数组。与tax
和taxedpaid
类似。在这两种情况下,这些函数都不需要返回任何内容。
同样在calculatepay
和tax
中,在您的for
循环中,您正在访问数组的索引size
,而不是i
。
您scanf
致电阅读名称应为:
scanf("%19s", name[i]);
这会将输入限制为19个字符加上空终止符。此外,由于name
是一个二维数组,您需要在userinput
的函数声明中将其指定为name[size][20]
。
同样在userinput
中,修复参数声明后,需要更新scanf
hoursworked
rate
调用以传递数组元素的地址你对以下内容感兴趣:
printf("Enter hours worked: ");
scanf("%d", &hoursworked[i]);
printf("Enter hourly rate: ");
scanf("%f", &rate[i]);
在main
中,sum
不应该是一个数组,因为它是所有人的工资总额。您应该为其指定totalpay
的返回值:
sum = totalpay(grosspay);
这应该涵盖大部分内容。
答案 2 :(得分:0)
在您的主体中,您定义了几个不同数据类型的数组:
int hoursworked[size];
float rate[size];
char name[size];
float grosspay[size];
float taxespaid[size];
float sum[size];
然后你将它们传递给你的函数:
void userinput(int *hoursworked[size], float *rate[size], char *name[size]);
当您将变量从main传递给函数时,它们与声明的类型不匹配。您试图将一系列各种数据类型从main传递给只接受指针数组的函数。
你应该传递变量:
int hoursworked[size];
float rate[size];
char name[size];
float grosspay[size];
float taxespaid[size];
float sum[size];
userinput(&hoursworked, &rate, &name);
宣布你的职能:
void userinput(int *hoursworked, float *rate, char *name);
这将匹配main中的数组。为了进一步阅读,我建议:http://www.tutorialspoint.com/cprogramming/c_arrays.htm。在对第一个函数进行更改后,您需要相应地更改其他函数 - &gt;这是我第一眼看到你的程序时注意到的其他事情。请尽可能调试。