簡體   English   中英

if語句和for()在C中具有結構的函數中循環

[英]if statements and for() loops in a function with structs in C

我知道這是一個非常新手的問題,但是我在程序中的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");
}

如果在代碼中使用適當的縮進,您將能夠清楚地看到邏輯中的錯誤。

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

在函數initWorkerArray(workerT list[], int siz) ,啟動四個empID值為workerT對象。

現在,在main函數中,使用dismissWorker(roster, MAX_ROSTER, 10)調用dismissWorker

在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 俗稱防御性編程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM