2015-11-06 57 views
0

我知道这是一个非常新手的问题,但我在这个程序中遇到了if和for()循环的问题。我试图指定问题出在哪里,但基本上在main()中询问用户是否想要解雇员工,然后是该员工ID。然后在dismissWorker函数中,它应该扫描工号的数组,找到与要被触发的员工相匹配的ID(badID),然后更改该数组。在我的dismissWorker函数中,我打印出“HI”只是为了看看我在main(和它的)中调用它是否正确,但它并没有通过for()循环运行。我确信这很简单,我做错了,但究竟是什么?另外,我不知道我应该在解雇工人结束时返回什么,所以有些建议会有帮助。if语句和函数中的()循环结构C

#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"); 
} 
+1

TL; DR!发布[mcve]!并正确格式/缩进。 – Olaf

回答

0

在你的函数initWorkerArray(workerT list[], int siz)你开始与empID值1,2,6 4个workerT对象,7

现在,在main功能,你叫dismissWorkerdismissWorker(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; 
    } 
} 

至于我可以发ee,代码通过for循环运行,但它找不到badID并退出。您应该打印警告或错误消息来捕获错误,例如这些。

尝试dismissWorker(roster, MAX_ROSTER, 7)来测试它。它应该可以工作,并使用错误/警告消息捕获代码中不可预见的情况,例如empID,在这种情况下不存在。俗称Defensive Programming

+0

谢谢,这个作品!但是,你会介意给出一个关于为什么从7改为10的问题吗?我不太清楚 – peo965

+0

关键是看'initWorkerArray'函数,在这里你初始化了四个参数为'list [0] .empID = 1','list [1] .empID = 2','list [2] .empID = 6','list [3] .empID = 7'。要解雇工人,你在'dismissWorker(名册,MAX_ROSTER,10)'中传递了10的ID。当'dismissWorker'函数循环遍历四个'workerT'对象时,它根据你的检查'if(list [i] .empID == badID')找不到'empID'为10,所以跳过代码块在括号内。当发现ID时,传递有效值1,2,6或7将通过if块 – ccoder83

0

如果在代码中使用正确的缩进,您将能够清楚地看到逻辑中的错误。

int dismissWorker (workerT list[], int siz, int badID) { 
    int i; 
    printf("HI"); 
    for (i = 0; i < siz; ++i) { 
     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; 
} 

正如你可以看到,如果第一个雇员的ID不匹配给定badID,该功能将与警告返回。您需要使用:

// Return 1 for success and 0 for failure, maybe. 
int dismissWorker (workerT list[], int siz, int badID) { 
    int i; 
    printf("HI"); 
    for (i = 0; i < siz; ++i) { 
     if (list[i].empID == badID) { 
     printf("HIHIHI"); 
     list[i].empStatus = -1; 
     list[i].month100_paycheck = 0; 
     list[i].year100_salary = 0; 
     return 1; 
     } 
    } 

    printf("\nWARNING! empID not found! Cannot dismiss " 
      "a non-employee!\n\n"); 

    return 0; 
}