我的任务是,使用结构,获取员工信息输入,并输出他们的工资。
它似乎运行正常,直到我结束并尝试printf()
计算结果。编译器告诉我[Error] request for member '*' in something not a structure or union
。 (将*替换为ID,name,grossPay,netPay。)
对不起,如果被问到;我还是结构/指针/等新手,所以我怀疑这是一个简单的错误。它只是没有跳出来对我说。我查看了之前的一些问题,但很多都是针对具体情况的。
// Matt Posey - PP #20
#include <stdio.h>
struct employee
{
char ID[6];
char name[20];
float hours;
float payRate;
float grossPay;
float netPay;
};
int main()
{
int j, i = 0;
int employees;
printf("This program computes pay.\n");
printf("\nNumber of employees: ");
scanf("%d", &employees);
fseek(stdin,0,SEEK_END);
// Get data
for (i = 0; i < employees; i++)
{
j = i;
struct employee j;
printf("\nFor employee %d:", i+1);
printf("\nID: ");
gets(j.ID);
fseek(stdin,0,SEEK_END);
printf("Name: ");
gets(j.name);
fseek(stdin,0,SEEK_END);
printf("Pay rate: ");
scanf("%f", &j.payRate);
fseek(stdin,0,SEEK_END);
printf("Hours worked: ");
scanf("%f", &j.hours);
fseek(stdin,0,SEEK_END);
j.grossPay = j.hours * j.payRate;
if (j.hours > 40)
{
printf("Overtime!");
float OT = (j.hours - 40) * (j.payRate * 0.5);
j.grossPay += OT;
}
j.netPay = j.grossPay * 0.75;
}
// Output data
printf("\n\nID | Name | Gross Pay | Net Pay");
printf("\n------ | -------------------- | --------- | -------");
for (i = 0; i < employees; i++)
{
j = i;
printf("\n%c | %c | $%7.2f | $%7.2f", j.ID, j.name, j.grossPay, j.netPay);
}
return 0;
}
答案 0 :(得分:1)
问题代码的几个问题......
1)
// Get data
for (i = 0; i < employees; i++)
{
j = i;
struct employee j;
变量j
仅在声明它的范围(即大括号)内可见。通过将其移至“main()&#39;”范围来解决此问题:
int main()
{
int j, i = 0;
int employees;
struct employee j;
当然,这会导致另一个问题,那就是已经有了一个`int j&#39;定义。摆脱它:
int main()
{
int i = 0;
int employees;
struct employee j;
2)接下来,您需要j
成为可以容纳所有员工的阵列。不幸的是,您(在编译时)不知道用户需要多少员工。所以,只需创建一个指针,以便稍后分配一些内存:
int main()
{
int i = 0;
int employees;
struct employee *j=NULL;
让用户指出有多少员工,然后为阵列分配足够的内存:
printf("\nNumber of employees: ");
scanf("%d", &employees);
fseek(stdin,0,SEEK_END);
j = malloc(employees * sizeof(*j));
if(NULL == j)
{
fprintf(stdout, "malloc() failed.\n");
goto CLEANUP;
}
然后,添加一个&#39; goto标签&#39;就在退货声明之前:
CLEANUP:
return 0;
}
要使用malloc()
功能,您必须包含另一个标头:
#include <stdio.h>
#include <stdlib.h> /* Added for 'malloc()' */
3)现在摆脱j=i;
的事情:
// Get data
for (i = 0; i < employees; i++)
{
printf("\nFor employee %d:", i+1);
4)现在,在引用j
的地方,引用它就像一个数组:
printf("\nID: ");
gets(j[i].ID);
fseek(stdin,0,SEEK_END);
printf("Name: ");
gets(j[i].name);
fseek(stdin,0,SEEK_END);
printf("Pay rate: ");
scanf("%f", &j[i].payRate);
fseek(stdin,0,SEEK_END);
printf("Hours worked: ");
scanf("%f", &j[i].hours);
fseek(stdin,0,SEEK_END);
j[i].grossPay = j[i].hours * j[i].payRate;
if (j[i].hours > 40)
{
printf("Overtime!");
float OT = (j[i].hours - 40) * (j[i].payRate * 0.5);
j[i].grossPay += OT;
}
j[i].netPay = j[i].grossPay * 0.75;
在这里:
printf("\n%c | %c | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);
5)摆脱j = i;
中的main()
:
for (i = 0; i < employees; i++)
{
printf("\n%c | %c | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);
}
6)修复printf()格式字符串。它应该是打印字符串,而不是字符:
printf("\n%s | %s | $%7.2f | $%7.2f", j[i].ID, j[i].name, j[i].grossPay, j[i].netPay);
现在代码正常运行。
但是,仍有一些代码存在风险。例如,应该使用fgets()(而不是gets())[如chris&amp;麦克劳文等等。
printf("\nID: ");
fgets(j[i].ID, sizeof(j[i].ID), stdin);
fseek(stdin,0,SEEK_END);
printf("Name: ");
fgets(j[i].name, sizeof(j[i].name), stdin);
如果有一个结尾换行符,报告会更清晰:
printf("\n");
CLEANUP:
return 0;
}
如Ed Heal所示,不需要这条线:
fseek(stdin,0,SEEK_END);
答案 1 :(得分:0)
您使用了名称&#34;变量的名称&#34;两次。
首先你说那里有一个名为j
的int,然后你留下一个名为struct employee
的{{1}}。重命名其中一个。
j