Solved

Changing program execution - Algorithm Tweaks

Posted on 2011-03-06
34
661 Views
Last Modified: 2012-05-11
Hello,

I developed the program below with help from another thread.

http://www.experts-exchange.com/Programming/Languages/C/Q_26855857.html

Now, I only want the program to calculate the likelihood of a team winning the first game in THREE game series...AFTER another three game series.

In other words...I want the program to scan through the results and detect all instances of two back-to-back 3-game series, and calculate results ONLY for those events.

Please let me know if any further clarification is needed.
Thanks

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
   char str[1024],
        prevTeam[6] = "N/A";

   char *Date, *Team, *Score, *Line, *overUnder;

   int first = 1,
     second = 0,
     test = 0,
     column = 0,
     count = 0,
     wins = 0,
     losses = 0,
     winAfterSeries = 0, 
     lossAfterSeries = 0;

   FILE *fp;

   fp = fopen("c:\\odds.txt", "r");

   if(fp != NULL)
   {
     while(fgets(str, sizeof(str), fp) != NULL)
     {
       Date = strtok(str, ",");
       Team = strtok(NULL, ",");
       Score = strtok(NULL, ",");
       Line = strtok(NULL, ",");
       overUnder = strtok(NULL, ",");

       if(strcmp(Team, prevTeam) == 0)
         count++;   //team is the same as prev line
       else
       {
         if(count)
         {
           if(*Score == 'W')
             winAfterSeries++;
           else
             lossAfterSeries++;
           count = 0;
         }
         strcpy(prevTeam, Team);
       }
     }
   }
   printf(" First game of series won %d\n", winAfterSeries);
   printf(" First game of series lost %d\n", lossAfterSeries);

   scanf("Waiting %d", second);
   fclose(fp);

   return 0;
}

Open in new window

0
Comment
Question by:--TripWire--
  • 16
  • 16
  • 2
34 Comments
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Ok.  :)

1.  We're going to add two variables.  (Actually, we'll just add one and rename one so that the program reads easier.)

  int PreviousSeriesLength = 0;
  int SeriesLength = 0;

2.  Everywhere you have the variable "count", replace it with "SeriesLength".

3.  Line 40 will test SeriesLength (you should have already changed the name in step 2.)  
     But instead of testing for non-zero, test for it being equal to 3.  (perhaps great than or equal to 3 in case of a 4-game series?)

4.  After Line 41 (the bracket), test for PreviousSeriesLength > 3 (or >= 3).

5.  After Line 48, set PreviousSeriesLength to SeriesLength.


That should just about do it.  (I suggest a couple of print statements along the way to make sure that it's doing what you want.)  :)


Good Luck,
Kent



 
0
 

Author Comment

by:--TripWire--
Comment Utility
Thanks Kent.  But I placed a print statement (that's not printing) shown below.

if(SeriesLength == 3)
         {
			 printf("Prev series: %d\tSeries: %d", PreviousSeriesLength, SeriesLength);
			if(PreviousSeriesLength == 3)
			{
				puts("if win");
				if(*Score == 'W')
					winAfterSeries++;
				else
					lossAfterSeries++;
           
				SeriesLength = 0;
			}
         }

Open in new window

0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Hi Trip,

Move the printf up above the if() statement so that you can see every line go past.  Oh, and the line probably needs a newline.

                     printf("Prev series: %d\tSeries: %d\n", PreviousSeriesLength, SeriesLength);


Kent

0
 

Author Comment

by:--TripWire--
Comment Utility
I had some print statements above that if condition. - Everything prints above that line.
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
That's a good sign that the if() statement is always false.  That is, the program never hits that if() statement when SeriesLength == 3.

Can you post the entire program?  


Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
Sure, no problem Kent.

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
   char str[1024],
        prevTeam[6] = "N/A";

   char *Date, *Team, *Score, *Line, *overUnder;

   int first = 1,
     second = 0,
     test = 0,
     column = 0,
     SeriesLength = 0,
     wins = 0,
     losses = 0,
     winAfterSeries = 0, 
     lossAfterSeries = 0,
	 PreviousSeriesLength = 0;

   FILE *fp;

   fp = fopen("c:\\odds.txt", "r");

   if(fp != NULL)
   {
     while(fgets(str, sizeof(str), fp) != NULL)
     {
       Date = strtok(str, ",");
       Team = strtok(NULL, ",");
       Score = strtok(NULL, ",");
       Line = strtok(NULL, ",");
       overUnder = strtok(NULL, ",");

       if(strcmp(Team, prevTeam) == 0)
         SeriesLength++;   //team is the same as prev line
       else
       {
         if(SeriesLength == 3)
         {
			 printf("Prev series: %d\tSeries: %d", PreviousSeriesLength, SeriesLength);
			if(PreviousSeriesLength == 3)
			{
				if(*Score == 'W')
					winAfterSeries++;
				else
					lossAfterSeries++;
           
				SeriesLength = 0;
			}
         }
         strcpy(prevTeam, Team);
		 PreviousSeriesLength = SeriesLength;
       }
     }
   }
   printf(" First game of series won %d\n", winAfterSeries);
   printf(" First game of series lost %d\n", lossAfterSeries);

   scanf("Waiting %d", second);
   fclose(fp);

   return 0;
}

Open in new window

0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Ok.

After line 55, we need to reset the SeriesLength variable.  Since we're now on the first line of a new series, setting it to 1 is appropriate.  It's being reset at line 51, which isn't correct --  either in that spot or value.  :)

  SeriesLength = 1;

If that doesn't do it, move the print statement at line 43 after line 40.


I've made the adjustment and reposted below.


Kent

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
   char str[1024],
        prevTeam[6] = "N/A";

   char *Date, *Team, *Score, *Line, *overUnder;

   int first = 1,
     second = 0,
     test = 0,
     column = 0,
     SeriesLength = 0,
     wins = 0,
     losses = 0,
     winAfterSeries = 0, 
     lossAfterSeries = 0,
	 PreviousSeriesLength = 0;

   FILE *fp;

   fp = fopen("c:\\odds.txt", "r");

   if(fp != NULL)
   {
     while(fgets(str, sizeof(str), fp) != NULL)
     {
       Date = strtok(str, ",");
       Team = strtok(NULL, ",");
       Score = strtok(NULL, ",");
       Line = strtok(NULL, ",");
       overUnder = strtok(NULL, ",");

       if(strcmp(Team, prevTeam) == 0)
         SeriesLength++;   //team is the same as prev line
       else
       {
         if(SeriesLength == 3)
         {
			printf("Prev series: %d\tSeries: %d", PreviousSeriesLength, SeriesLength);
			if(PreviousSeriesLength == 3)
			{
				if(*Score == 'W')
					winAfterSeries++;
				else
					lossAfterSeries++;
			}
         }
        strcpy(prevTeam, Team);
	PreviousSeriesLength = SeriesLength;
	SeriesLength = 1;
       }
     }
   }
   printf(" First game of series won %d\n", winAfterSeries);
   printf(" First game of series lost %d\n", lossAfterSeries);

   scanf("Waiting %d", second);
   fclose(fp);

   return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
Ok good stuff.  I'm now getting numbers coming up.  But, I don't think it's counting my results properly.
I'll show you an example.  I got 1 game won and 1 game lost for the data below.


10/03/2010,@ BOS,L 4-8,L 112,O 9.5 111
10/02/2010,@ BOS,L 6-7,L 102,O 9.5 -101
10/02/2010,@ BOS,W 6-5,W -134,O 9.5 111
09/29/10,@ TOR,L 4-8,L 105,O 9 -116
09/28/10,@ TOR,W 6-1,W -181,U 8.5 -105
09/27/10,@ TOR,L 5-7,L -124,O 9.5 -114
09/26/10,BOS,W 4-3,W -183,U 9.5 -108
09/25/10,BOS,L 3-7,L 109,O 9 -105
09/24/10,BOS,L 8-10,L -175,O 9.5 -105
09/23/10,TB,L 3-10,L -136,O 8 106
09/22/10,TB,L 2-7,L -137,U 10.5 -121
09/21/10,TB,W 8-3,W -133,O 9.5 -105
09/20/10,TB,W 8-6,W -119,O 9.5 -120
09/19/10,@ BAL,L 3-4,L -164,U 9 -111
09/18/10,@ BAL,W 11-3,W -184,O 8 110
09/17/10,@ BAL,W 4-3,W -149,U 9.5 -116
09/15/10,@ TB,L 3-4,L 107,U 9.5 -115
09/14/10,@ TB,W 8-7,W 123,O 8.5 -107
09/13/10,@ TB,L 0-1,L 115,U 7.5 -117
09/12/2010,@ TEX,L 1-4,L 161,U 9.5 -112
09/11/2010,@ TEX,L 6-7,L -103,O 10.5 101
09/10/2010,@ TEX,L 5-6,L 129,O 9.5 -105
09/08/2010,BAL,W 3-2,W -243,U 10 106
09/07/2010,BAL,L 2-6,L -385,U 9 -109
09/06/2010,BAL,L 3-4,L -195,U 9.5 -119
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
After line 40, insert this line:

  printf("Prev %d - %s \tseries: %s - %d\n", prevTeam, PreviousSeriesLength, Team, SeriesLength);


That should show us what we're missing.

Also, line 61 should pass &second.



Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
Thanks.  Almost there.  
There's a small mistake in your print line, you inverted the first two variables.

It's counting all the right results, except for the last series in the set.

Example
With this data it's saying Won: 1 / Lost: 2 - it should be Lost 3.

10/03/2010,@ BOS,L 4-8,L 112,O 9.5 111
10/02/2010,@ BOS,L 6-7,L 102,O 9.5 -101
10/02/2010,@ BOS,W 6-5,W -134,O 9.5 111
09/29/10,@ TOR,L 4-8,L 105,O 9 -116
09/28/10,@ TOR,W 6-1,W -181,U 8.5 -105
09/27/10,@ TOR,L 5-7,L -124,O 9.5 -114
09/26/10,BOS,W 4-3,W -183,U 9.5 -108
09/25/10,BOS,L 3-7,L 109,O 9 -105
09/24/10,BOS,L 8-10,L -175,O 9.5 -105
09/23/10,TB,L 3-10,L -136,O 8 106
09/22/10,TB,L 2-7,L -137,U 10.5 -121
09/21/10,TB,W 8-3,W -133,O 9.5 -105
09/20/10,TB,W 8-6,W -119,O 9.5 -120
09/19/10,@ BAL,L 3-4,L -164,U 9 -111
09/18/10,@ BAL,W 11-3,W -184,O 8 110
09/17/10,@ BAL,W 4-3,W -149,U 9.5 -116
09/15/10,@ TB,L 3-4,L 107,U 9.5 -115
09/14/10,@ TB,W 8-7,W 123,O 8.5 -107
09/13/10,@ TB,L 0-1,L 115,U 7.5 -117
09/12/2010,@ TEX,L 1-4,L 161,U 9.5 -112
09/11/2010,@ TEX,L 6-7,L -103,O 10.5 101
09/10/2010,@ TEX,L 5-6,L 129,O 9.5 -105

----

By the way.  You can ignore that print statement.  The value of second is irrelevant.  It's just there to stop the program from terminating before I get a chance to read the output.
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
The scanf() is fine for that purpose.  You're actually passing the value in second instead of the address of second.  Depending on this value, you might get a memory access violation.  :(


Note that the while loop exits as soon as it reaches EOF in the data file.  The program needs to perform the checks of SeriesLength and PreviousSeriesLength after reaching EOF to pick up the last series.

Three ways to do this.

  1.  Copy the test and put it after the while() loop.
  2.  Put the test in a function, then call the function from within the while loop and again after it.
  3.  Change the while loop to a do/while loop.  Depending on your compiler version/options, this may not be possible.

I've made the change for option 3 and posted it below.


Kent

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
  char str[1024],
       prevTeam[6] = "N/A";

  char *Date, *Team, *Score, *Line, *overUnder;

  int first = 1,
  second = 0,
  test = 0,
  column = 0,
  SeriesLength = 0,
  wins = 0,
  losses = 0,
  winAfterSeries = 0, 
  lossAfterSeries = 0,
  PreviousSeriesLength = 0;

  FILE *fp;

  fp = fopen("c:\\odds.txt", "r");

  if(fp != NULL)
  {
    do
    {
      Date = strtok(str, ",");
      Team = strtok(NULL, ",");
      Score = strtok(NULL, ",");
      Line = strtok(NULL, ",");
      overUnder = strtok(NULL, ",");

      if(strcmp(Team, prevTeam) == 0)
        SeriesLength++;   //team is the same as prev line
      else
      {
        if(SeriesLength == 3)
        {
          printf("Prev series: %d\tSeries: %d", PreviousSeriesLength, SeriesLength);
          if(PreviousSeriesLength == 3)
          {
            if(*Score == 'W')
              winAfterSeries++;
            else
              lossAfterSeries++;
          }
        }
        strcpy(prevTeam, Team);
        PreviousSeriesLength = SeriesLength;
        SeriesLength = 1;
      }
    } while(fgets(str, sizeof(str), fp) != NULL);
  }
  printf(" First game of series won %d\n", winAfterSeries);
  printf(" First game of series lost %d\n", lossAfterSeries);

  scanf("Waiting %d", &second);
  fclose(fp);

  return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
In fixes 1 and 2, I'm not really sure what you mean by test.  I only have test as a declared and unused variable.

With #3 I get this error:  Unhandled exception at 0x5f6fd440 (msvcr100d.dll) in OddsLaptopTest.exe: 0xC0000005: Access violation reading location 0x00000000.
0
 
LVL 32

Assisted Solution

by:sarabande
sarabande earned 30 total points
Comment Utility
you make a do while and get tokens from str where you didn't make a successful fgets before.

you also should test on null pointers after each strtok and before dereference of variables.

Sara
0
 
LVL 32

Expert Comment

by:sarabande
Comment Utility
so you crash at

if(*Score == 'W')

Open in new window


when Score is NULL what is very likely when you enter the loop initially with not-initialised str.

you also crash at

strcpy(prevTeam, Team);

Open in new window


when Team is NULL.

Sara

 
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Hi Trip,

Sarabande is essentially correct, though there is a bit more work to do....

winAfterSeries and lossAfterSeries can't be incremented until we know that both series are 3 game affairs.  The Won/Lost status of the first game of each series needs to be captured separately from these counters.  Only when the program has confirmed that both series are 3 games can the correct counter be incremented.  (After all, that's why we're making program changes.....)

And Sara's especially correct about testing for NULL.  Some of the C functions do that for you, others do not.  Any place that a pointer is dereferenced must be checked.  A blank line is also a potential issue, but we'll assume that the data file format isn't an issue for now.


Kent



#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
  char str[1024] = "",
       prevTeam[6] = "N/A",
       *SourceLine;

  char *Date, *Team, *Score, *Line, *overUnder;

  int first = 1,
      second = 0,
      test = 0,
      column = 0,
      SeriesLength = 0,
      wins = 0,
      losses = 0,
      winAfterSeries = 0,
      lossAfterSeries = 0,
      FirstGameIsWin = 0,
      PreviousSeriesLength = 0;

  FILE *fp;

  fp = fopen("c:\\odds.txt", "r");

  if(fp != NULL)
  {
    do
    {
      SourceLine = fgets(str, sizeof(str), fp);
      if (SourceLine)
      {
        Date = strtok(str, ",");
        Team = strtok(NULL, ",");
        Score = strtok(NULL, ",");
        Line = strtok(NULL, ",");
        overUnder = strtok(NULL, ",");
      }
      else
        Team = "n/a";  // Change "new" team

      if (Team && strcmp (Team, prevTeam) == 0)
        SeriesLength++;
      else
      {
        if (SeriesLength == 3)
        {
          printf ("Prev series: %d - %s\tSeries: %d - %s\n",
            PreviousSeriesLength, prevTeam, SeriesLength, Team);
          if (PreviousSeriesLength == 3)
          {
            if (FirstGameIsWin)
              winAfterSeries++;
            else
              lossAfterSeries++;
          }
        }
        FirstGameIsWin = (Score && *Score == 'W');
        strcpy (prevTeam, Team ? Team : "n/a");
        PreviousSeriesLength = SeriesLength;
        SeriesLength = 1;
      }
    } while(SourceLine);
  }
  printf(" First game of series won %d\n", winAfterSeries);
  printf(" First game of series lost %d\n", lossAfterSeries);

  scanf("Waiting %d", &second);
  fclose(fp);

  return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
Thanks to both of you.  But it's not counting the last loss with the sample data below.

10/03/2010,@ BOS,L 4-8,L 112,O 9.5 111
10/02/2010,@ BOS,L 6-7,L 102,O 9.5 -101
10/02/2010,@ BOS,W 6-5,W -134,O 9.5 111
09/29/10,@ TOR,L 4-8,L 105,O 9 -116
09/28/10,@ TOR,W 6-1,W -181,U 8.5 -105
09/27/10,@ TOR,L 5-7,L -124,O 9.5 -114
09/26/10,BOS,W 4-3,W -183,U 9.5 -108
09/25/10,BOS,L 3-7,L 109,O 9 -105
09/24/10,BOS,L 8-10,L -175,O 9.5 -105
09/23/10,TB,L 3-10,L -136,O 8 106
09/22/10,TB,L 2-7,L -137,U 10.5 -121
09/21/10,TB,W 8-3,W -133,O 9.5 -105
09/20/10,TB,W 8-6,W -119,O 9.5 -120
09/19/10,@ BAL,L 3-4,L -164,U 9 -111
09/18/10,@ BAL,W 11-3,W -184,O 8 110
09/17/10,@ BAL,W 4-3,W -149,U 9.5 -116
09/15/10,@ TB,L 3-4,L 107,U 9.5 -115
09/14/10,@ TB,W 8-7,W 123,O 8.5 -107
09/13/10,@ TB,L 0-1,L 115,U 7.5 -117
09/12/2010,@ TEX,L 1-4,L 161,U 9.5 -112
09/11/2010,@ TEX,L 6-7,L -103,O 10.5 101
09/10/2010,@ TEX,L 5-6,L 129,O 9.5 -105
09/08/2010,BAL,W 3-2,W -243,U 10 106
09/07/2010,BAL,L 2-6,L -385,U 9 -109
09/06/2010,BAL,L 3-4,L -195,U 9.5 -119
09/05/2010,TOR,L 3-7,L -164,O 9.5 111
09/04/2010,TOR,W 7-5,W -191,O 10 -102
09/03/2010,TOR,W 7-3,W -135,O 9 -109
09/02/2010,OAK,W 5-0,W -208,U 8 -114
09/01/2010,OAK,W 4-3,W -133,U 9.5 -119
08/31/10,OAK,W 9-3,W -203,O 9 -105
08/30/10,OAK,W 11-5,W -125,O 9.5 104
08/29/10,@ CHW,W 2-1,W 116,U 9.5 106
08/28/10,@ CHW,W 12-9,W -134,O 8.5 -104
08/27/10,@ CHW,L 4-9,L -137,O 10 -110
08/25/10,@ TOR,L 3-6,L -133,P 9 -
08/24/10,@ TOR,W 11-5,W -104,O 10 -101
08/23/10,@ TOR,L 2-3,L 120,U 9 -118
08/22/10,SEA,W 10-0,W -315,O 8.5 -108
08/21/10,SEA,W 9-5,W -203,O 9 -118
08/20/10,SEA,L 0-6,L -145,U 8 105
08/19/10,DET,W 11-5,W -235,O 9.5 -107
08/18/10,DET,W 9-5,W -173,O 9.5 -101
08/17/10,DET,W 6-2,W -177,O 7.5 -101
08/16/10,DET,L 1-3,L -174,U 9 109
08/15/10,@ KC,L 0-1,L -210,U 10 -115
08/14/10,@ KC,W 8-3,W -236,O 9.5 -109
08/13/10,@ KC,L 3-4,L -182,U 10 107
08/12/2010,@ KC,W 4-3,W -240,U 9 -105
0
 

Author Comment

by:--TripWire--
Comment Utility
Also, I probably should have asked this earlier, but I'll increase my points accordingly.  ;)
If I only want to pay attention to my result IF (and only if) the first 3 game series was a sweep.

Could I just tweak this code? or would that require major reconstruction of code?
I'm thinking just an adjustment of the condition on line 55, right?
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 45

Expert Comment

by:Kdo
Comment Utility
A small adjustment to handle the case of a sweep.  Actually, only a small adjustment could let you handle all of these cases simultaneously.  :)

The last loss "that counts" is 8/25 @Toronto.


Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
I'm sorry - I mean to say that it's counting one too many losses.
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Hi Trip.

I don't see it.....

I changed the code slightly so that messages could be better displayed.  It's posted below.

Note last column (wins, losses).  It changes on the first game of a series and only when both the series just checked and the previous series are 3 gamers.

It looks right to me, or am I missing something?

Kent

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
  char str[1024] = "",
       prevTeam[6] = "N/A",
       currTeam[6] = "N/A",
       *SourceLine;

  char *Date, *Team, *Score, *Line, *overUnder;

  int first = 1,
      second = 0,
      test = 0,
      column = 0,
      SeriesLength = 0,
      wins = 0,
      losses = 0,
      winAfterSeries = 0,
      lossAfterSeries = 0,
      FirstGameIsWin = 0,
      PreviousSeriesLength = 0;

  FILE *fp;

  fp = fopen("c:\\odds.txt", "r");

  if(fp != NULL)
  {
    do
    {
      SourceLine = fgets(str, sizeof(str), fp);
      if (SourceLine)
      {
        Date = strtok(str, ",");
        Team = strtok(NULL, ",");
        Score = strtok(NULL, ",");
        Line = strtok(NULL, ",");
        overUnder = strtok(NULL, ",");
      }
      else
        Team = "n/a";  // Change "new" team

      if (Team && strcmp (Team, currTeam) == 0)
        SeriesLength++;
      else
      {
        if (SeriesLength == 3)
        {
          if (PreviousSeriesLength == 3)
          {
            if (FirstGameIsWin)
              winAfterSeries++;
            else
              lossAfterSeries++;
          }
        }
        FirstGameIsWin = (Score && *Score == 'W');
        strcpy (prevTeam, currTeam ? currTeam : "n/a");
        PreviousSeriesLength = SeriesLength;
        SeriesLength = 1;
        if (Team)
          strcpy (currTeam, Team);
      }
      printf ("%c %s\tPrev: %d - %s\tCurr: %d - %s\t%d,%d\n",
        Score ? *Score : '-', Team,
        PreviousSeriesLength, prevTeam, SeriesLength, currTeam,
        winAfterSeries, lossAfterSeries);
    } while(SourceLine);
  }
  printf(" First game of series won %d\n", winAfterSeries);
  printf(" First game of series lost %d\n", lossAfterSeries);

  scanf("Waiting %d", &second);
  fclose(fp);

  return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
Hmm.  It looks like it is right.  I'm sorry about that.  Perhaps my eyes are getting impatient.  :)


Ok - Just one more issue.  Any ideas on how to make it calculate only when the first series is a sweep?
(And by first series - I mean the first series in every comparison)

i.e. - I only care about the result of the 1st game in the 2nd series....when the 1st series is a sweep.
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Yeah.  Just a couple of lines of code should do.

There's enough "stuff" going on that it may be time to consider changing the program to keep all of the rows in a table and just scan the table.


Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
An array of char pointers then?
0
 
LVL 45

Accepted Solution

by:
Kdo earned 370 total points
Comment Utility
There were no sweeps (3 games all wins) in the data, but here's the code anyway.  Dummy up some test data and try it.

We can build this into tables later.  :)

Kent

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main()
{
  char str[1024] = "",
       prevTeam[6] = "N/A",
       currTeam[6] = "N/A",
       *SourceLine;

  char *Date, *Team, *Score, *Line, *overUnder;

  int first = 1,
      second = 0,
      test = 0,
      column = 0,
      SeriesLength = 0,
      wins = 0,
      losses = 0,
      winAfterSeries = 0,
      lossAfterSeries = 0,
      FirstGameIsWin = 0,
      Sweep = 0,
      PreviousSweep = 0,
      PreviousSeriesLength = 0;

  FILE *fp;

  fp = fopen("c:\\odds.txt", "r");

  if(fp != NULL)
  {
    do
    {
      SourceLine = fgets(str, sizeof(str), fp);
      if (SourceLine)
      {
        Date = strtok(str, ",");
        Team = strtok(NULL, ",");
        Score = strtok(NULL, ",");
        Line = strtok(NULL, ",");
        overUnder = strtok(NULL, ",");
      }
      else
        Team = "n/a";  // Change "new" team

      if (Team && strcmp (Team, currTeam) == 0)
      {
        SeriesLength++;
        Sweep += (Score && *Score == 'W' ? 1 : -1);
      }
      else
      {
        if (SeriesLength == 3)
        {
          if (PreviousSeriesLength == 3 && PreviousSeriesLength == PreviousSweep)
          {
            if (FirstGameIsWin)
              winAfterSeries++;
            else
              lossAfterSeries++;
          }
        }
        FirstGameIsWin = (Score && *Score == 'W');
        PreviousSweep = Sweep;
        Sweep = FirstGameIsWin ? 1 : -1;
        strcpy (prevTeam, currTeam ? currTeam : "n/a");
        PreviousSeriesLength = SeriesLength;
        SeriesLength = 1;
        if (Team)
          strcpy (currTeam, Team);
      }
      printf ("%c %s\tPrev: %d - %s\tCurr: %d - %s\t%d,%d\n",
        Score ? *Score : '-', Team,
        PreviousSeriesLength, prevTeam, SeriesLength, currTeam,
        winAfterSeries, lossAfterSeries);
    } while(SourceLine);
  }
  printf(" First game of series won %d\n", winAfterSeries);
  printf(" First game of series lost %d\n", lossAfterSeries);

  scanf("Waiting %d", &second);
  fclose(fp);

  return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
I'm still getting zeros.  In lines 48 and 65 (where you're using the AND operator)
are you sure that the return value is going to be the same as their comparatives?
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility

Testing any variable (without a condition or comparator) tests the value for zero/non-zero.

  if (intvar)
    // value is non-zero
  else
    // value is zero


  if (pointervar)
    //  value is non-NULL
  else
    //  value is NULL


I got all zero on the last data that you posted, but the trace suggested that it should work fine when there is a sweep in a 3 game series.


Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
Yeah, I know about non-conditional evaluations, I was just checking whether those particular lines were working properly.

I changed some of the series to sweeps, but still nothing.

10/03/2010,@ BOS,W 4-8,L 112,O 9.5 111
10/02/2010,@ BOS,W 6-7,L 102,O 9.5 -101
10/02/2010,@ BOS,W 6-5,W -134,O 9.5 111
09/29/10,@ TOR,W 4-8,L 105,O 9 -116
09/28/10,@ TOR,W 6-1,W -181,U 8.5 -105
09/27/10,@ TOR,W 5-7,L -124,O 9.5 -114
09/26/10,BOS,W 4-3,W -183,U 9.5 -108
09/25/10,BOS,L 3-7,L 109,O 9 -105
09/24/10,BOS,L 8-10,L -175,O 9.5 -105
09/23/10,TB,L 3-10,L -136,O 8 106
09/22/10,TB,L 2-7,L -137,U 10.5 -121
09/21/10,TB,W 8-3,W -133,O 9.5 -105
09/20/10,TB,W 8-6,W -119,O 9.5 -120
09/19/10,@ BAL,W 3-4,L -164,U 9 -111
09/18/10,@ BAL,W 11-3,W -184,O 8 110
09/17/10,@ BAL,W 4-3,W -149,U 9.5 -116
09/15/10,@ TB,L 3-4,L 107,U 9.5 -115
09/14/10,@ TB,W 8-7,W 123,O 8.5 -107
09/13/10,@ TB,L 0-1,L 115,U 7.5 -117
09/12/2010,@ TEX,W 1-4,L 161,U 9.5 -112
09/11/2010,@ TEX,L 6-7,L -103,O 10.5 101
09/10/2010,@ TEX,L 5-6,L 129,O 9.5 -105
09/08/2010,BAL,W 3-2,W -243,U 10 106
09/07/2010,BAL,L 2-6,L -385,U 9 -109
09/06/2010,BAL,L 3-4,L -195,U 9.5 -119
09/05/2010,TOR,L 3-7,L -164,O 9.5 111
09/04/2010,TOR,W 7-5,W -191,O 10 -102
09/03/2010,TOR,W 7-3,W -135,O 9 -109
09/02/2010,OAK,W 5-0,W -208,U 8 -114
09/01/2010,OAK,W 4-3,W -133,U 9.5 -119
08/31/10,OAK,W 9-3,W -203,O 9 -105
08/30/10,OAK,W 11-5,W -125,O 9.5 104
08/29/10,@ CHW,W 2-1,W 116,U 9.5 106
08/28/10,@ CHW,W 12-9,W -134,O 8.5 -104
08/27/10,@ CHW,L 4-9,L -137,O 10 -110
08/25/10,@ TOR,L 3-6,L -133,P 9 -
08/24/10,@ TOR,W 11-5,W -104,O 10 -101
08/23/10,@ TOR,L 2-3,L 120,U 9 -118
08/22/10,SEA,W 10-0,W -315,O 8.5 -108
08/21/10,SEA,W 9-5,W -203,O 9 -118
08/20/10,SEA,W 0-6,L -145,U 8 105
08/19/10,DET,W 11-5,W -235,O 9.5 -107
08/18/10,DET,W 9-5,W -173,O 9.5 -101
08/17/10,DET,W 6-2,W -177,O 7.5 -101
08/16/10,DET,L 1-3,L -174,U 9 109
08/15/10,@ KC,L 0-1,L -210,U 10 -115
08/14/10,@ KC,W 8-3,W -236,O 9.5 -109
08/13/10,@ KC,L 3-4,L -182,U 10 107
08/12/2010,@ KC,W 4-3,W -240,U 9 -105
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility
Hi Trip,

I saved your data file and ran the program against it.  It shows 2 wins and 1 loss after sweeps.

I haven't change the program since last posting it.  Are you sure that you saved the data file to the correct place?


Kent
0
 
LVL 45

Assisted Solution

by:Kdo
Kdo earned 370 total points
Comment Utility
Hi Trip,

Remember the suggestion to load the games into an array (tables)?  

Here's the program to do that.  Now it's a lot easier to compute the things that you want, and the things that you're likely to add.


Kent

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define  MAX_GAME 170
#define  MAX_SERIES 170

typedef struct
{
  char  *Source,
        *Date,
        *Opponent,
        *Score,
        *Line,
        *OverUnder;
  int   Home,
        Win;
} game_t;

typedef struct
{
  char  *Opponent;
  int   GameStart,
        GameEnd,
        FirstWin,
        Wins,
        Losses;
} series_t;

game_t   GameList[MAX_GAME];
series_t SeriesList[MAX_SERIES];

int      GameCount;
int      SeriesCount;
//----------------------------------------------------------------------------
  char str[1024] = "",
       prevTeam[6] = "N/A",
       currTeam[6] = "N/A",
       *SourceLine;

  char *Date, *Team, *Score, *Line, *overUnder;

  int second = 0,
      SeriesLength = 0,
      winAfterSeries = 0,
      lossAfterSeries = 0,
      FirstGameIsWin = 0,
      Sweep = 0,
      PreviousSweep = 0,
      PreviousSeriesLength = 0;
//----------------------------------------------------------------------------

int main()
{
  int idx;
  FILE *fp;
  game_t *G;
  series_t *S;

//  Load all of the games from the data file

  fp = fopen("c:\\odds.txt", "r");
  if (fp != NULL)
  {
    while (fgets (str, sizeof (str), fp))
    {
      G = &GameList[GameCount];
      G->Source = strdup (str);
      G->Date = strtok (GameList[GameCount].Source, ",\n");
      G->Opponent = strtok (NULL, ",\n");
      G->Score = strtok (NULL, ",\n");
      G->Line = strtok (NULL, ",\n");
      G->OverUnder = strtok (NULL, ",\n");
      G->Home = G->Opponent[0] != '@';
      G->Win = G->Score[0] == 'W';
      GameCount++;
    }
    fclose (fp);
  }

//  Compute series information

  idx = 0;
  while (idx < GameCount)
  {
    G = &GameList[idx];
    S = &SeriesList[SeriesCount];
    S->GameStart = idx;
    S->GameEnd = idx;
    S->FirstWin = G->Win;
    S->Opponent = G->Opponent;
    while (idx < GameCount && strcmp (G->Opponent, GameList[idx].Opponent) == 0)
    {
      G = &GameList[idx];
      if (G->Win)
        S->Wins++;
      else
        S->Losses++;
      S->GameEnd = idx;
      idx++;
    }
    printf ("Series:  %s\t First Win: %c\tWins = %d\t Losses = %d\n",
      S->Opponent, S->FirstWin ? 'Y' : 'n', S->Wins, S->Losses);
    SeriesCount++;
  }

//  Compute Statistics

//  printf(" First game of series won %d\n", winAfterSeries);
//  printf(" First game of series lost %d\n", lossAfterSeries);

  scanf("Waiting %d", &second);

  return 0;
}

Open in new window

0
 

Author Comment

by:--TripWire--
Comment Utility
Thanks so much Kent!  You were right about your previous code.
The newer version however, still gives me zeroes.
0
 
LVL 45

Assisted Solution

by:Kdo
Kdo earned 370 total points
Comment Utility
Hi Trip,

That last code doesn't do any computations.  It simply builds the Game and Series records (which do contain quite a bit of useful values!)

After line 107, insert this:

    for (idx = 1; idx < SeriesCount; SeriesCount++)
      if (SeriesList[idx].Wins + SeriesList[idx].Losses == 3
        && SeriesList[idx-1].Wins == 3
        && SeriesList[idx-1].Losses = 0
        && SeriesList[idx].FirstWin != 0)
        printf ('Game 1 win after series sweep:  %s -> %s\n",
          SeriesList[idx-1].Opponent, SeriesList[idx].Opponent);
0
 

Author Comment

by:--TripWire--
Comment Utility
Oh duh!  How could I miss that??? lol
I was so concerned with checking the changes, I forgot about functionality!

Anyways, I don't think SeriesList[..] is a modifiable value.  Wasn't it defined as const?
0
 
LVL 45

Expert Comment

by:Kdo
Comment Utility

MAX_SERIES is a constant.  That's that maximum number of series that the program will track.  That could always be made dynamic, but that adds complexity to the program that I'll leave to you.  :)

SeriesList is just a list of pointers to series_t structures.


Kent
0
 

Author Comment

by:--TripWire--
Comment Utility
Thanks for all your help Kent, you're a life saver!
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
logging Access violation 6 18
On hold status for Issues in Github 1 113
maxMirror challenge 10 87
Math question 3 53
The greatest common divisor (gcd) of two positive integers is their largest common divisor. Let's consider two numbers 12 and 20. The divisors of 12 are 1, 2, 3, 4, 6, 12 The divisors of 20 are 1, 2, 4, 5, 10 20 The highest number among the c…
Introduction This article explores the design of a cache system that can improve the performance of a web site or web application.  The assumption is that the web site has many more “read” operations than “write” operations (this is commonly the ca…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

763 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

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now