Nxt3
Nxt3

Reputation: 2081

User defined values aren't honored in program at later points

In the code below, the user is supposed to be able to define what nurses won't be available for work that week. The user has a list of the names, and they are supposed to type a number that corresponds to the name. Once that value is stored into the slackers[4] array, it should be using those user supplied values to remove those nurses from being selected come making selections. It doesn't seem to be honoring those selected values, despite avail_nurses[9] having the correct values at any point in time (I tested using printf statements).

Everything seems to be in good shape except that essential piece of the puzzle. I would appreciate some constructive critique and useful suggestions. If you can avoid it, don't write the code for me--I gotta learn somehow. Thanks in advance!

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>

char *names[] = { "Denise", "Inja", "Jane", "Karen", "Maggie", "Margaret", "MJ", "Queen", "Sherri",  NULL }; //ptr for names, 9 nurses
/*0 = Denise, 1 = Inja, 2 = Jane, 3 = Karen, 4 = Maggie, 5 = Margaret, 6 = MJ, 7 = Queen, 8 = Sherri*/
const char days[5][10] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
int randomNurse();
#define total_nurses 9 //number of nurses on staff
#define days_in_week 5 //number of work days in a week


int main() {

srand(time(NULL));
int day, pos, rand_num, i, j;
int slackers[4] = { 0, 0, 0, 0 }; //array that holds the selections for who isn't working
int avail_nurses[total_nurses] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; //holds the status of each nurse, 0 = unavailable, 1 = available

/*this allows the user to repeat the program easily! flag determines if we run the program multiple times*/
while (char flag = 'y') {

    /*prints names */
    int temp_counter = 1; //counter
    char **name_ptr = names;
    while (*name_ptr) {
        printf("%i) %s\n", temp_counter, *name_ptr);
        name_ptr++;
        temp_counter++;
    }

    /*this assumes that no more than FOUR nurses will be away on any given week*/
    printf("\nEnter numbers that correspond to the nurses who won't be available for the week.\nType up to four numbers, each separated by a space.\n");
    printf("When you are done, press \"Enter\".\n");
    printf("If less than four nurses will be on leave, type a \"0\" in place of a selection.\n");
    printf("Example: 1 2 5 0\n\n\n");

    /*week selection of unavailable nurses*/
    do {
        printf("Who won't be here?  ");
    } while (scanf("%i %i %i %i", &slackers[0], &slackers[1], &slackers[2], &slackers[3]) != 4);

    /*checks the selections made, and sets the available nurses to the correct value, zero if they are slacking||vacationing*/
    for (int n = 0; n < 4; n++) {
        int slacker = slackers[n];
        if (slacker >= 1 && slacker <= 9)
            avail_nurses[slacker - 1] = -1;
    }


    /*-----WEEKLY_ASSIGNMENT-----*/
    int pos_per_day[days_in_week] = { 5, 9, 9, 8, 5 }; //number of nurses needed each day
    int selection[days_in_week][total_nurses]; //the selected nurses per day 

    for (i = 0; i < days_in_week; i++) {
        for (j = 0; j < total_nurses; j++) {
            selection[i][j] = -1; //initialize to -1 which means no nurse is selected
        }
    }

    //fill all the days of week 
    for (day = 0; day < days_in_week; day++) {
        for (pos = 0; pos < pos_per_day[day]; pos++) { //for every position needed that day
            do {
                rand_num = randomNurse();
            } while (!avail_nurses[rand_num]); //looks for available nurses (phrasing)
            avail_nurses[rand_num] = 0;  //change nurses status to not available
            selection[day][pos] = rand_num;  //fill the output array with appropriate nurse
        }
        for (i = 0; i < total_nurses; i++) {
            avail_nurses[i] = 1; //initialize the nurses status for next day use
        }
        for (int n = 0; n < 4; n++) { //make sure we shame the slackers...
            int slacker = slackers[n];
            if (slacker >= 1 && slacker <= 9)
                avail_nurses[slacker - 1] = -1;
        }

        /*DEBUGGING PRINTFs
        printf("\n\nSELECTION:\n");
        for (int x = 0; x < days_in_week; x++) {
            for (int y = 0; y < total_nurses; y++) {
                printf("%i\t", selection[x][y]);
            }
            printf("\n");
        }*/
    }
    printf("\n");

    /*-----PRINTS SCHEDULE FOR WEEK-----*/
    for (i = 0; i < days_in_week; i++) {
        printf("%-10s: ", days[i]);
        for (j = 0; j < total_nurses; j++) {
            if (selection[i][j] != -1)
                printf("%-10s ", names[selection[i][j]]);
        }
        printf("\n");
    }

    fflush(stdin);

    /*asks user if they want the program to run again*/
    printf("\n\nDo you want to run the program again? (y/n) ");
    scanf("%c", &flag);
    if (flag == 'n' || flag == 'N') {
        printf("\n");
        break;
    }
    else {
        printf("\n\n\n");
        continue;
    }
}
return 0;
}

/*function to generate random nurse*/
int randomNurse() {

return rand() % 9; //random number 0-8, to pick nurse
}

Upvotes: 0

Views: 43

Answers (1)

Ross Ridge
Ross Ridge

Reputation: 39601

Your avail_nurses array uses the value 1 to indicate a nurse that's available, the value 0 to indicate a nurse that's not available as that nurse has already been assigned, and -1 to indicate a nurse that's not available because that nurse is a slacker. You then test whether or not a nurse is available with !avail_nurses[rand_num]. This statement is true if avail_nurses[rand_num] is 0 and is false if it's any other value. The means when avail_nurses[rand_num] is -1 it will exit the loop just like it does when it's 1.

To fix this bug either change the test to avail_nurses[rand_num] <= 0 or use only 0 to indicate unavailable nurses regardless of the reason why.

Upvotes: 1

Related Questions