Solved

While loop blues

Posted on 2001-09-18
9
206 Views
Last Modified: 2010-04-02
I must be missing something easy, here, but I can't see it offhand.

I'm building a scheduler for a sports select type website.  This scheduler will take a certain number of teams, and schedule them to play a set amount of games on various days throughout the season.  

I have a two dimensional array of type entry (contains three integer values).

entry Schedule[16][20];

Now when I find out the day the team is scheduled to play it's nth game, I want to check the rest of the array for this team to determine if the day has already been assigned.  (denoted by an integer)  Here is the code I used:

while (blnLegalDay == FALSE)
{
    tmpRand1 = rand();
    tmpDay = (tmpRand1 % NumberOfDays) + 1;
    Counter = 0;
                   
    for (b=0;b<NumberOfGames;b++)
    {
        if (tmpDay == Schedule[i][b].day)
     {
           Counter++;
        }
                             
    }
                   
    if (Counter > 0)
    {
         blnLegalDay = FALSE;
    }
    else
         blnLegalDay = TRUE;
                   
}


It never seems to check the array to make sure the tmpDay equals the day value in the array.  blnLegalDay always equates to TRUE, giving me more than one game scheduled on the same day.  Any ideas on what I might have missed?
0
Comment
Question by:Dave_Anderson
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 2
9 Comments
 
LVL 32

Expert Comment

by:jhance
ID: 6491817
Where do you initialize the value in bInLegalDay?
0
 
LVL 32

Expert Comment

by:jhance
ID: 6491832
I ask that because if bInLegalDat is TRUE the while loop will be bypassed entirely.
0
 

Author Comment

by:Dave_Anderson
ID: 6491893
It is initialized to FALSE before the loop is entered.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 32

Expert Comment

by:jhance
ID: 6491897
Have you run this in the DEBUGGER?

Sorry, but I don't believe you when you say it's FALSE.  Based on what you're saying, the loop is not getting run even once.
0
 
LVL 32

Expert Comment

by:jhance
ID: 6491900
Along those same lines, what is the initial value of NumberOfGames?

There is an awful lot going on here that you've chosen to keep to yourself....
0
 

Author Comment

by:Dave_Anderson
ID: 6491954
The loop is getting run, I can set a breakpoint in there, and it gets hit at least once.  Here is the code that I have:  (forgive sloppiness, I'm just trying to get it to work, and will clean it up after)

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
    int NumberOfGames = 16;
    int NumberOfDays = 20;
    int NumberOfTeams = 20;
    entry Schedule[20][16];

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL),  NULL, ::GetCommandLine(), 0))
     {
     // TODO: change error code to suit your needs
     cerr << _T("Fatal Error: MFC initialization failed") << endl;
     nRetCode = 1;
     }
     else
     {
     // TODO: code your application's behavior here.
     srand(GetTickCount());
     int i, j;
     int tmpOpponent, tmpDay;
     int tmpRand;
        int tmpRand1;
     BOOL blnLegalTeam = FALSE;
     BOOL blnLegalDay = FALSE;
        int TeamCounter;
     int a,b;
     int x,y;

     // initialize array
        for (x=0;x<NumberOfTeams;x++)
     {
          for (y=0;y<NumberOfGames;y++)
          {
               Schedule[x][y].day = -1;
               Schedule[x][y].opponent_number = -1;
               Schedule[x][y].team_number = -1;
          }
     }


     for (i = 0; i < NumberOfTeams; i++) {
          for (j = 0; j < NumberOfGames; j++)
          {
                blnLegalTeam = FALSE;
                blnLegalDay = FALSE;

          if (Schedule[i][j].day != -1)
               continue;

          while (blnLegalTeam == FALSE)
          {
               tmpRand = rand();
               tmpOpponent = (tmpRand % NumberOfTeams) + 1;
               TeamCounter = 0;
                   
                       if (tmpOpponent == i)
                       {
                        blnLegalTeam = FALSE;
                        continue;
                       }

                 for (a=1;a<NumberOfGames;a++)
                 {
               if (tmpOpponent == Schedule[i][a].opponent_number)
                 {
                 TeamCounter++;
                 }
                 }
                   
                    if (TeamCounter > (NumberOfGames/NumberOfTeams + 1))
                    {
                        blnLegalTeam = FALSE;
                    }
                    else
                        blnLegalTeam = TRUE;
           }
                   
                while (blnLegalDay == FALSE)
          {
                   tmpRand1 = rand();
             tmpDay = (tmpRand1 % NumberOfDays) + 1;
                    TeamCounter = 0;
                   
                    for (b=0;b<NumberOfGames;b++)
              {
                        if (tmpDay == Schedule[i][b].day)
                  {
                            TeamCounter++;
                  }
                             
              }
                   
                    if (TeamCounter > 0)
                    {
                        blnLegalDay = FALSE;
                    }
                    else
                        blnLegalDay = TRUE;
                   
             }
                   

          Schedule[i][j].team_number = i;
          Schedule[i][j].opponent_number = tmpOpponent;
          Schedule[i][j].day = tmpDay;
          Schedule[tmpOpponent][j].team_number = tmpOpponent;
          Schedule[tmpOpponent][j].opponent_number = i;
          Schedule[tmpOpponent][j].day = tmpDay;
     }
         
    }

        // display schedule to verify no duplicates
     for (x=1;x<=NumberOfTeams;x++)
     {
        for (y=1;y<=NumberOfGames;y++)
        {
          cout << "Day: " << Schedule[x][y].day << endl;
          cout << "Opponent: " << Schedule[x][y].opponent_number << endl;
          cout << "Team #" << Schedule[x][y].team_number << endl;
        }
     }
    }
    return nRetCode;
}
0
 
LVL 49

Accepted Solution

by:
DanRollins earned 100 total points
ID: 6491955
What's all this rand() stuff?  

It looks like you are trying to do two things with one loop.  Tip: break the problem into steps and write fns to do each step.

1) See if a particular day is available

2) Check all days to find one that is available

2a) you could write a fn to pick a random day from the avaialable days, but that complicates the question slightly.  Do the lower-level stuff first.

bool IsDayAvailForTeam( int nTeamNum, int nDay )
{
     bool bDayIsAvail= true;
     for ( nGameNum=0; nGameNum < NumberOfGames; nGameNum++ ) {
          if ( Schedule[nTeamNum][nGameNum].day == nTestDay ) {
          bDayIsAvail= false;
          break;
          }
     }
     return( bDayIsAvail );
}

int FindFirstAvailDayForTeam( int nTeamNum )
{
     for (int j=0; j < MaxDays; j++ ) {
          if ( IsDayAvailForTeam( nTeamNum, j ) {
               cout << "day "<< j << " is available for team " << nTeamNum << endl
               return j;
          }
     }
}

-- Dan
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 6491958
I didnt' see your post.  Also I see that I forgot to insert:

   return(-1); // no days avail for team
before the final curly brace to indicate no days avail.

-- Dan
0
 

Author Comment

by:Dave_Anderson
ID: 6493886
It's sloppy, but it now works.  I used DanRollins' suggestion and created a function.  I then changed the while loop to read:

while (blnLegalDay == FALSE)
{
  blnLegalDay = IsDayAvailForTeam(i, tmpDay);
}

I also created a second struct:

typedef struct taken
{
  int day;
  bool istaken;
} taken;

and created an array DateChecker[NumberOfTeams][365];

and in IsDayAvailForTeam() I checked the team and date, and it now works.  So thank you all for helping, I really appreciate it.

Dave
0

Featured Post

[Webinar] Code, Load, and Grow

Managing multiple websites, servers, applications, and security on a daily basis? Join us for a webinar on May 25th to learn how to simplify administration and management of virtual hosts for IT admins, create a secure environment, and deploy code more effectively and frequently.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to convert MFC APP to Win32 APP. 19 131
Unresolved External Symbols 3 154
Precision Problem in C++ 7 67
Autosar OS Multicore Share Resources confusion ? 2 195
What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question