2014-07-19 55 views
-1

打印時發生編譯器錯誤我的任務是使用結構體獲取員工信息輸入並輸出他們的薪水。試圖從struct

它似乎運行正常,直到我到底並嘗試printf()的計算結果。編譯器告訴我[Error] request for member '*' in something not a structure or union。 (用ID,名稱,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; 
} 
+2

ÿ你沒有數組或列表來存儲'員工'。 – McLovin

+0

爲什麼'fseek(stdin,0,SEEK_END);'? –

+1

'gets'是一個可怕的功能。切勿使用它。 – chris

回答

1

有問題的代碼的幾個問題...

1)

// Get data 
for (i = 0; i < employees; i++) 
{ 
    j = i; 
    struct employee j; 

變量j只有在聲明的範圍(即括號)內可見。通過將其移動到主`()'解決此問題的範圍:

int main() 
{ 
    int j, i = 0; 
    int employees; 
    struct employee j; 

當然,這會導致另一個問題,它已經存在一個`詮釋J」限定。擺脫的是:

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; 
    } 

然後,把一個「轉到標號「只是return語句之前:

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)獲取main()擺脫j = i;的:

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()應被使用(而不是得到())[由Chris & McLovin所指示]等

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指示痊癒,不需要該行:

fseek(stdin,0,SEEK_END); 

SPOILER

+0

我感謝您花時間解釋這一點。 我按照你的建議拿出了'fseek()',但它仍然跳過輸入的行,所以我把它們放回去了。 另外,打印輸出時,它在第一個'%s '拋出桌子。也許這是我的編譯器?似乎它仍然在某處記錄額外的回車。我會進一步調查。 – iMPose27

+0

明白了。取出'fseek()'命令並放入'strtok(j [i] .ID,「\ n」);',它就像一個魅力一樣。 – iMPose27

0

您已經使用了名稱「變量的名稱」兩次。

首先你說有一個int叫j,那麼你呆在那裏有一個叫jstruct employee。重命名一個或另一個。

int j, i = 0; 
    (and much later) 
    j = i; 
    struct employee j;