我知道这是一个非常新手的问题,但是我在程序中的if和for()循环遇到了麻烦。我试图指定问题的出处,但基本上是在main()中询问用户是否要解雇一名雇员,然后询问该雇员ID。然后在dismissWorker函数中,应该扫描工作者ID的数组,找到与要解雇的雇员匹配的ID(badID),然后更改该数组。在我的dismissWorker函数中,我打印了“ HI”,只是为了查看我是否在main中正确调用了它(确实如此),但它没有通过for()循环运行。我确定我做错了很简单,但这到底是什么呢?另外,我不知道在dismissWorker结束时应该返回什么内容,因此一些建议会有所帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_ROSTER 10 //roster of employees
typedef struct workerT_struct {
char name[81]; //employee name
char title[81]; //employee title
int empID; //unique ID for employee
int empStatus; //
int year100_salary; //before-tax salary, in cents
int year100_401k; //annual contribution to retirement, in cents
double taxRate; //fraction used to determine payroll taxes
int month100_paycheck; //monthly paycheck, in cents
} workerT;
typedef struct companyT_struct {
char dbaName[81]; //company name
int EmpActiveTot; //number of active employees
int EmpOnLeaveTot; //number of employees on unpaid leave
int year100_salaryTot; //total annual before-tax salaries, in cents
int year100_401kTot;
double year100_taxTot; //total annual payroll tax, in cents
int month100_paycheckTot; //total of all monthly paychecks for employees
} companyT;
void initWorkerArray(workerT list[], int siz);
void prntWorker(workerT list[], int siz, int indx);
void payWorker (workerT list[], int siz, int indx);
int dismissWorker (workerT list[], int siz, int badID);
void initCo(companyT hubCo[], workerT roll [], int sizRoll);
void doCoBooks(companyT hubCo[], workerT roll[], int sizRoll);
void printCoBooks(companyT hubCo[]);
int main()
{
workerT roster[MAX_ROSTER];
initWorkerArray(roster, MAX_ROSTER);
payWorker(roster, MAX_ROSTER, 0);
companyT myCo[1];
initCo(myCo, roster, 0);
doCoBooks(myCo, roster, MAX_ROSTER);
printCoBooks(myCo);
printf("Would you like to dismiss an existing employee? (yes/no)\n\n");
//FIXME FIXME FIXME
char defaultAnswer[4] = "yes";
char answer[4];
int badID = 0;
scanf(" %s", answer);
while (strcmp(answer,defaultAnswer) == 0) {
printf("Please give the employee ID:\n");
scanf(" %d", &badID);
printf("The employee ID you chose was %d.\n", badID);
dismissWorker(roster, MAX_ROSTER, 10); //FIXME
printf("Do you want to dismiss another employee?\n\n");
scanf(" %s", answer);
}
printf("Goodbye!");
return 0;
}
void initWorkerArray(workerT list[], int siz) {
int i = 0;
for (i = 0; i < 4; ++i) {
strcpy(list[0].name, "Buggy, Orson");
strcpy(list[0].title, "Director/President");
list[0].empID = 1;
list[0].empStatus = 1;
list[0].year100_salary = 12015000;
list[0].year100_401k = 950000;
list[0].month100_paycheck = 0;
list[0].taxRate = 0.45;
strcpy(list[1].name, "Czechs, Imelda");
strcpy(list[1].title, "Chief Financial Officer");
list[1].empID = 2;
list[1].empStatus = 1;
list[1].year100_salary = 8020000;
list[1].year100_401k = 960000;
list[1].month100_paycheck = 0;
list[1].taxRate = 0.39;
strcpy(list[2].name, "Hold, Levon");
strcpy(list[2].title, "Customer Service");
list[2].empID = 6;
list[2].empStatus = -1;
list[2].year100_salary = 8575000;
list[2].year100_401k = 1133000;
list[2].month100_paycheck = 0;
list[2].taxRate = 0.39;
strcpy(list[3].name, "Andropov, Picov");
strcpy(list[3].title, "Shipping Coordinator");
list[3].empID = 7;
list[3].empStatus = 1;
list[3].year100_salary = 4450000;
list[3].year100_401k = 375000;
list[3].month100_paycheck = 0;
list[3].taxRate = 0.31;
}
for (i = 4; i < siz; ++i) {
strcpy(list[i].name, "none");
strcpy(list[i].title, "none");
list[i].empID = -1;
list[i].empStatus = -1;
list[i].year100_salary = 0;
list[i].year100_401k = 0;
list[i].month100_paycheck = 0;
list[i].taxRate = 0.0;
}
return;
}
void prntWorker(workerT list[], int siz, int indx) {
int i = 0;
for (i = 0; i < siz; ++i) {
printf("%s, ", list[i].name);
printf("%s, ", list[i].title);
printf("%d, ", list[i].empID);
printf("%d, ", list[i].empStatus);
printf("%d, ", list[i].year100_salary);
printf("%d, ", list[i].year100_401k);
printf("%lf, ", list[i].taxRate);
printf("%d ", list[i].month100_paycheck);
printf("\n\n");
}
return;
}
void payWorker(workerT list[], int siz, int indx) {
int i;
for (i = 0; i < siz; ++i) {
list[i].month100_paycheck = (list[i].year100_salary / 12);
}
prntWorker(list, MAX_ROSTER,0);
return;
}
//FIXME FIXME FIXME
int dismissWorker (workerT list[], int siz, int badID) {
int i;
printf("HI");
for (i = 0; i < siz; ++i) { //FIXME
if (list[i].empID == badID) {
printf("HIHIHI");
list[i].empStatus = -1;
list[i].month100_paycheck = 0;
list[i].year100_salary = 0;
return 1;
}
else {
printf("\nWARNING! empID not found! Cannot dismiss "
"a non-employee!\n\n");
return 1;
}
}
return siz;
}
void initCo(companyT hubCo[], workerT roll [], int sizRoll) {
initWorkerArray(roll, sizRoll);
strcpy(hubCo[0].dbaName, "Dewey, Cheatham, and Howe, Consultants");
hubCo[0].EmpActiveTot = 3;
hubCo[0].EmpOnLeaveTot = 0;
hubCo[0].year100_salaryTot = 0;
hubCo[0].year100_401kTot = 0;
hubCo[0].year100_taxTot = 0.0;
hubCo[0].month100_paycheckTot = 0;
}
void doCoBooks(companyT hubCo[], workerT roll[], int sizRoll) {
int i = 0;
for (i = 0; i < sizRoll; ++i) {
if (roll[i].empStatus == 1) {
payWorker(roll, MAX_ROSTER, i);
hubCo[0].year100_salaryTot += roll[i].year100_salary;
hubCo[0].year100_401kTot += roll[i].year100_401k;
hubCo[0].year100_taxTot += roll[i].taxRate;
hubCo[0].month100_paycheckTot += roll[i].month100_paycheck;
}
}
}
void printCoBooks(companyT hubCo[]) {
printf("Name: %s\n", hubCo[0].dbaName);
printf("Active: %d\n", hubCo[0].EmpActiveTot);
printf("Leave: %d\n", hubCo[0].EmpOnLeaveTot);
printf("Salary: %d\n", hubCo[0].year100_salaryTot);
printf("401k: %d\n", hubCo[0].year100_401kTot);
printf("Monthly: %d\n", hubCo[0].month100_paycheckTot);
printf("Tax: %lf\n", hubCo[0].year100_taxTot);
printf("\n\n");
}
最佳答案
在函数initWorkerArray(workerT list[], int siz)
中,启动四个workerT
对象,这些对象的empID
值为1、2、6、7。
现在,在main
函数中,用dismissWorker
调用dismissWorker(roster, MAX_ROSTER, 10)
在for循环中:
for (i = 0; i < siz; ++i) { //FIXME
if (list[i].empID == badID) {
printf("HIHIHI");
list[i].empStatus = -1;
list[i].month100_paycheck = 0;
list[i].year100_salary = 0;
return 1;
}
}
据我所知,代码确实在for循环中运行,但是找不到
badID
并退出。您应该打印警告或错误消息以捕获诸如此类的错误。尝试
dismissWorker(roster, MAX_ROSTER, 7)
进行测试。它应该可以工作,并使用错误/警告消息来捕获代码中无法预料的情况,例如在这种情况下不存在的empID
。俗称Defensive Programming