내 임무는 구조체를 사용하여 직원에 대한 정보를 입력하고 급여를 출력하는 것입니다.
끝까지 printf()
계산 된 결과를 시도 할 때까지 제대로 실행되는 것 같습니다 . 컴파일러는 나에게 말한다 [Error] request for member '*' in something not a structure or union
. (*를 ID, 이름, grossPay, netPay로 대체하십시오.)
질문을 받으면 죄송합니다. 나는 여전히 structs / pointers / etc에 익숙하지 않기 때문에 간단한 실수라고 생각합니다. 그것은 나에게 튀어 나오는 것이 아닙니다. 이전 질문 중 일부를 살펴 보았지만 대부분은 상황에 따라 다릅니다.
// 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;
}
질문 코드와 관련된 몇 가지 문제 ...
1)
// Get data
for (i = 0; i < employees; i++)
{
j = i;
struct employee j;
변수 j
는 선언 된 범위 (예 : 중괄호) 내에서만 볼 수 있습니다. `main () '의 범위로 이동하여이 문제를 해결합니다.
int main()
{
int j, i = 0;
int employees;
struct employee j;
물론 이것은 이미`int 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 문 바로 앞에 'goto label'을 추가합니다.
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 & 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 Heal이 지적했듯이이 라인은 필요하지 않습니다.
fseek(stdin,0,SEEK_END);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다