C problem, likely simple but I can't see it!

Discussion in 'C++' started by sam, May 7, 2004.

  1. sam

    sam Guest

    hi, i am new to C/C++ and have just finished a program based on the UK
    national lottery, where you enter 6 numbers, six are generated by the
    computer and there are appropriate messages and a compare function to decide
    your winnings. I am using Microsoft's C++ version 6 standard, the program
    is as follows:

    /* * * * * * * * * * * * * * * * * * * *
    * *
    * Lottery Simulation By Sam Halston *
    * *
    * * * * * * * * * * * * * * * * * * * * */




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



    #define NMAX 6


    int a[NMAX];
    int b[NMAX];
    void getIntArray(int x[]);
    void bubbleSort(int x[]);
    void printArrays(int x[], int y[]);
    void getrandomarray(int x[]);
    void winnings();
    int wins = 0;

    int main(void) {


    //welcome
    printf("\t Welcome To The National Lottery!\n");
    printf("\tPlease Enter Six Whole Numbers Between 1 And 49\n\n");

    getIntArray(a);
    getrandomarray(b);
    bubbleSort(a);
    bubbleSort(b);
    printf("Your Numbers In Numerical Order Are: \n");
    printArrays(a, b);
    winnings();
    return 0;
    }






    void getIntArray(int x[])

    {
    int n = 0;
    int temp;

    here://I know goto loops are not liked in C, but this is the best way to
    achieve this feature in my opinion!


    ;

    do {
    printf("Choose A Number\n");
    scanf("%d", &temp);
    if (temp==0) break;


    if (n==5)
    {
    printf("All Six Numbers Have Been Entered, Press Zero To Confirm\n");

    }

    if ((temp<01) || (temp>49))
    {
    printf("%s\n", "Sorry, That Is An Unacceptable Number. Please Re Enter");
    goto here;
    }

    if (temp==a[0])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }
    if (temp==a[1])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }
    if (temp==a[2])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }
    if (temp==a[3])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }
    if (temp==a[4])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }
    if (temp==a[5])
    {
    printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    Another Choice");
    goto here;
    }

    else
    a[n++] = temp;
    }while (1);
    }


    void bubbleSort(int x[])
    /* It sorts in non-decreasing order the six positions of a. It uses
    * a technique called the bubble sort method.
    */
    {
    int lcv;
    int limit = NMAX-1;
    int temp;
    int lastChange;

    while (limit) {
    lastChange = 0;
    for (lcv=0;lcv<limit;lcv++)

    if (x[lcv]>x[lcv+1]) {
    temp = x[lcv];
    x[lcv] = x[lcv+1];
    x[lcv+1] = temp;
    lastChange = lcv;
    }
    limit = lastChange;
    }
    }


    void printArrays(int x[], int y[])

    /* These values are printed out, six per line. */
    {


    //print user array
    for (int i=0; i<NMAX;)
    {
    printf("\t%d ", x[i++]);
    if (i%6==0)
    printf("\n");
    }
    printf("\n");





    printf("The Drawn Numbers In Numerical Order Are: \n");
    //print random array





    for (i=0; i<NMAX;){
    printf("\t%d ", y[i++]);
    if (i%6==0)
    printf("\n");
    }
    printf("\n");

    }



    void getrandomarray(int x[])
    {

    //make random numbers
    srand((unsigned int)time((time_t *)NULL));

    for (int i=0; i<NMAX; i++)
    {
    x = (rand()%49)+1; //This safety feature makes the
    generator regenerate should any
    for(int j=0; j<i; j++) //of its numbers be the same as previous
    numbers.
    {
    if(x == x[j])
    i--;
    }
    }

    }


    void bubblesort(int x[])
    /* It sorts in non-decreasing order the first 6 positions of b. It uses
    * the bubble sort method.
    */
    {
    int lcv;
    int limit = NMAX-1;
    int temp;
    int lastChange;

    while (limit)
    {
    lastChange = 0;
    for (lcv=0;lcv<limit;lcv++)
    {
    /* Notice that the values in positions LIMIT+1 .. in
    * their final position, i.e. they are sorted right */
    if (a[lcv]>a[lcv+1])
    {
    temp = x[lcv];
    x[lcv] = x[lcv+1];
    x[lcv+1] = temp;
    lastChange = lcv;
    }
    limit = lastChange;
    }

    }
    }


    void winnings()
    {

    for(int i=0; i<6; i++)
    {
    for(int j=0; j<6; j++)
    {
    if(a==b[j])
    {
    wins++;
    }
    }

    if(wins==0)
    {
    printf("You Haven't Matched Any Numbers, Sorry\n");
    return;
    }
    if(wins==1)
    {
    printf("You Have Matched One Number, Sorry\n");
    return;
    }

    }
    if(wins==2)
    {
    printf("You Have Matched Two Numbers, Sorry\n");
    return;
    }
    if(wins==3)
    {
    printf("You Have Matched 3 Numbers. Well Done, You Have Won £10\n");
    return;
    }
    if(wins==4)
    {
    printf("You Have Matched 4 Numbers. Well Done, You Have Won £500\n");
    return;
    }
    if(wins==5)
    {
    printf("You Have Matched 5 Numbers. Well Done, You Have Won £300,000!\n");
    return;
    }
    if(wins==6)
    {
    printf("You Have Matched 3 Numbers. Congratulations, You Have Won
    £5,000,000!!\n");
    return;
    }

    }


    ok-so i guess its a mess to most of you, it compiles and runs no bother,
    just doesnt give a correct readout at the end of how many numbers have
    matched! iv looed at this for 4 days now, seems to me that only one or no
    numbers are being matched almost as if its doing a true and false as to
    whether any numbers match. trouble is, the lottery rules are 0, 1 or 2
    numbers matched = £0, 3 =£10, 4=£500, 5=£300,000, 6= £5,000,000. any quick
    fixes or suggestions as to an alternative end will be greatly appreciated,
    but if i could stick to this structure it would be good as i am trying hard
    to understand even what i've written! did anyone find this or am i just
    doomed to not be a programmer!?

    thanks in advance

    sam
     
    sam, May 7, 2004
    #1
    1. Advertising

  2. sam

    Allan Bruce Guest

    "sam" <sam@home> wrote in message
    news:...
    > hi, i am new to C/C++ and have just finished a program based on the UK
    > national lottery, where you enter 6 numbers, six are generated by the
    > computer and there are appropriate messages and a compare function to

    decide
    > your winnings. I am using Microsoft's C++ version 6 standard, the program
    > is as follows:
    >
    > /* * * * * * * * * * * * * * * * * * * *
    > * *
    > * Lottery Simulation By Sam Halston *
    > * *
    > * * * * * * * * * * * * * * * * * * * * */
    >
    >
    >
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <time.h>


    in C++, these should be

    #include <cstdio>
    #include <cstdlib>
    #include <ctime>

    >
    >
    >
    > #define NMAX 6
    >
    >
    > int a[NMAX];
    > int b[NMAX];
    > void getIntArray(int x[]);
    > void bubbleSort(int x[]);
    > void printArrays(int x[], int y[]);
    > void getrandomarray(int x[]);
    > void winnings();
    > int wins = 0;
    >
    > int main(void) {
    >
    >
    > //welcome
    > printf("\t Welcome To The National Lottery!\n");
    > printf("\tPlease Enter Six Whole Numbers Between 1 And 49\n\n");
    >
    > getIntArray(a);
    > getrandomarray(b);
    > bubbleSort(a);
    > bubbleSort(b);
    > printf("Your Numbers In Numerical Order Are: \n");
    > printArrays(a, b);
    > winnings();
    > return 0;
    > }


    good short program. Often newcomers make hidiously long programs, good one!

    >
    >
    >
    >
    >
    >
    > void getIntArray(int x[])
    >
    > {
    > int n = 0;
    > int temp;
    >
    > here://I know goto loops are not liked in C, but this is the best way to
    > achieve this feature in my opinion!
    >
    >
    > ;
    >
    > do {
    > printf("Choose A Number\n");
    > scanf("%d", &temp);
    > if (temp==0) break;
    >
    >
    > if (n==5)
    > {
    > printf("All Six Numbers Have Been Entered, Press Zero To

    Confirm\n");

    if the last number is entered invalid, then you are asking them to press
    zero, which is invalid, infinite loop!

    >
    > }
    >
    > if ((temp<01) || (temp>49))
    > {
    > printf("%s\n", "Sorry, That Is An Unacceptable Number. Please Re Enter");
    > goto here;
    > }
    >
    > if (temp==a[0])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[1])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }


    why didnt you do:
    for (int loop=0; loop<NMAX; ++loop)
    if (temp==a[loop])
    // ...

    For two reasons. One its easier to read as its far shorter. Two, its more
    maintainable. What would you do if you wanted to do a lottery with 8
    numbers? Or consider 1000, what would you do then? (i know its extreme, bit
    its meant to make a point)


    > if (temp==a[2])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[3])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[4])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[5])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    >
    > else
    > a[n++] = temp;
    > }while (1);
    > }
    >
    >
    > void bubbleSort(int x[])
    > /* It sorts in non-decreasing order the six positions of a. It uses
    > * a technique called the bubble sort method.
    > */
    > {
    > int lcv;
    > int limit = NMAX-1;
    > int temp;
    > int lastChange;
    >
    > while (limit) {
    > lastChange = 0;
    > for (lcv=0;lcv<limit;lcv++)
    >
    > if (x[lcv]>x[lcv+1]) {
    > temp = x[lcv];
    > x[lcv] = x[lcv+1];
    > x[lcv+1] = temp;
    > lastChange = lcv;
    > }
    > limit = lastChange;
    > }
    > }


    there are shorter ways of doing this, e.g.

    for (int i=0; i<NMAX; ++i)
    for (int j=i; j<NMAX; ++j)
    {
    // compare and swap items
    }


    >
    >
    > void printArrays(int x[], int y[])
    >
    > /* These values are printed out, six per line. */
    > {
    >
    >
    > //print user array
    > for (int i=0; i<NMAX;)
    > {
    > printf("\t%d ", x[i++]);
    > if (i%6==0)


    this prints a newline after the first number only, why? Again, you should
    use NMAX for maintainability

    > printf("\n");
    > }
    > printf("\n");
    >
    >
    >
    >
    >
    > printf("The Drawn Numbers In Numerical Order Are: \n");
    > //print random array
    >
    >
    >
    >
    >
    > for (i=0; i<NMAX;){
    > printf("\t%d ", y[i++]);
    > if (i%6==0)
    > printf("\n");
    > }
    > printf("\n");
    >
    > }
    >
    >
    >
    > void getrandomarray(int x[])
    > {
    >
    > //make random numbers
    > srand((unsigned int)time((time_t *)NULL));
    >
    > for (int i=0; i<NMAX; i++)
    > {
    > x = (rand()%49)+1; //This safety feature makes the
    > generator regenerate should any


    the rand() function requires you to seed the random number generator, do
    something like
    srand(time(NULL)); // seed rand gen based on time

    also, the lower bits returned by rand() are not very random, consider using
    something like:
    rand() / (RAND_MAX / 49);


    > for(int j=0; j<i; j++) //of its numbers be the same as previous
    > numbers.
    > {
    > if(x == x[j])
    > i--;
    > }
    > }
    >
    > }
    >
    >
    > void bubblesort(int x[])


    this has already been declared!

    > /* It sorts in non-decreasing order the first 6 positions of b. It uses
    > * the bubble sort method.
    > */
    > {
    > int lcv;
    > int limit = NMAX-1;
    > int temp;
    > int lastChange;
    >
    > while (limit)
    > {
    > lastChange = 0;
    > for (lcv=0;lcv<limit;lcv++)
    > {
    > /* Notice that the values in positions LIMIT+1 .. in
    > * their final position, i.e. they are sorted right */
    > if (a[lcv]>a[lcv+1])
    > {
    > temp = x[lcv];
    > x[lcv] = x[lcv+1];
    > x[lcv+1] = temp;
    > lastChange = lcv;
    > }
    > limit = lastChange;
    > }
    >
    > }
    > }
    >
    >
    > void winnings()
    > {
    >
    > for(int i=0; i<6; i++)
    > {
    > for(int j=0; j<6; j++)
    > {
    > if(a==b[j])
    > {
    > wins++;
    > }
    > }


    this will only work if the numbers are in the same index of the array, e.g.
    if you have
    1,2,3,4,5,6
    and
    2,3,4,5,6,7

    then this will report no numbers the same! Even though 5 are the same

    you need to use two loops to do this.

    >
    > if(wins==0)
    > {
    > printf("You Haven't Matched Any Numbers, Sorry\n");
    > return;
    > }
    > if(wins==1)
    > {
    > printf("You Have Matched One Number, Sorry\n");
    > return;
    > }
    >
    > }
    > if(wins==2)
    > {
    > printf("You Have Matched Two Numbers, Sorry\n");
    > return;
    > }
    > if(wins==3)
    > {
    > printf("You Have Matched 3 Numbers. Well Done, You Have Won £10\n");
    > return;
    > }
    > if(wins==4)
    > {
    > printf("You Have Matched 4 Numbers. Well Done, You Have Won £500\n");
    > return;
    > }
    > if(wins==5)
    > {
    > printf("You Have Matched 5 Numbers. Well Done, You Have Won

    £300,000!\n");
    > return;
    > }
    > if(wins==6)
    > {
    > printf("You Have Matched 3 Numbers. Congratulations, You Have Won
    > £5,000,000!!\n");
    > return;
    > }


    i would use something like:
    static char[NMAX][]sWins = {"£0", "£0", "£10", "£300,000", "£5,000,000"};
    printf("You have won %s", sWins[wins]);

    which I am sure you agree, is far neater

    >
    > }
    >
    >
    > ok-so i guess its a mess to most of you, it compiles and runs no bother,
    > just doesnt give a correct readout at the end of how many numbers have
    > matched! iv looed at this for 4 days now, seems to me that only one or no
    > numbers are being matched almost as if its doing a true and false as to
    > whether any numbers match. trouble is, the lottery rules are 0, 1 or 2
    > numbers matched = £0, 3 =£10, 4=£500, 5=£300,000, 6= £5,000,000. any

    quick
    > fixes or suggestions as to an alternative end will be greatly appreciated,
    > but if i could stick to this structure it would be good as i am trying

    hard
    > to understand even what i've written! did anyone find this or am i just
    > doomed to not be a programmer!?
    >
    > thanks in advance
    >
    > sam
    >
    >


    you have made a good attempt. The program seems well structured apart from
    your 'goto'. Instead of the goto have your structure do something like:

    int ValidNums=0;
    while(1)
    {
    // get a number
    // check valid, if valid then ValidNums++
    if (ValidNums == NMAX-1)
    break;
    }

    but consider a quit option to allow the user to quit gracefully.
    Also, scanf is not brilliant for getting numbers, try typing a letter and
    find out! In C, I used to do scanf("%s"); and then use strtol() to
    check/convert it to a number. However there are better C++ solutions that
    somebody may point out.

    Hope this helps
    Allan
     
    Allan Bruce, May 7, 2004
    #2
    1. Advertising

  3. sam

    osmium Guest

    sam writes:

    > hi, i am new to C/C++ and have just finished a program based on the UK
    > national lottery, where you enter 6 numbers, six are generated by the
    > computer and there are appropriate messages and a compare function to

    decide
    > your winnings. I am using Microsoft's C++ version 6 standard, the program
    > is as follows:
    >
    > /* * * * * * * * * * * * * * * * * * * *
    > * *
    > * Lottery Simulation By Sam Halston *
    > * *
    > * * * * * * * * * * * * * * * * * * * * */
    >
    >
    >
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <time.h>
    >
    >
    >
    > #define NMAX 6
    >
    >
    > int a[NMAX];
    > int b[NMAX];

    <snip>

    Try to use more descriptive names than a and b. One is a client and the
    other is the government, is it not? It would be easier to help if these had
    some meaning.

    > void getIntArray(int x[]);
    > void bubbleSort(int x[]);
    > void printArrays(int x[], int y[]);
    > void getrandomarray(int x[]);
    > void winnings();
    > int wins = 0;
    >
    > int main(void) {
    >
    >
    > // welcome
    > printf("\t Welcome To The National Lottery!\n");
    > printf("\tPlease Enter Six Whole Numbers Between 1 And 49\n\n");
    >
    > getIntArray(a);
    > getrandomarray(b);
    > bubbleSort(a);
    > bubbleSort(b);
    > printf("Your Numbers In Numerical Order Are: \n");
    > printArrays(a, b);


    Are you happy with the results of that print? Knowing the answer to that
    divides the problem into two major "hunks".

    I scanned around but didn't spot anything noteworthy. I suppose there may
    well be an answer by the time I post this.

    <snip>
     
    osmium, May 7, 2004
    #3
  4. sam

    Andreas Guest

    I've added som comments to your code, hope that helps.

    /Andreas


    "sam" <sam@home> skrev i meddelandet
    news:...
    > hi, i am new to C/C++ and have just finished a program based on the UK
    > national lottery, where you enter 6 numbers, six are generated by the
    > computer and there are appropriate messages and a compare function to

    decide
    > your winnings. I am using Microsoft's C++ version 6 standard, the program
    > is as follows:
    >
    > /* * * * * * * * * * * * * * * * * * * *
    > * *
    > * Lottery Simulation By Sam Halston *
    > * *
    > * * * * * * * * * * * * * * * * * * * * */
    >
    >
    >
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <time.h>
    >
    >
    >
    > #define NMAX 6
    >
    >
    > int a[NMAX];
    > int b[NMAX];


    You definately should initiate these, like
    init a[NMAX] = null;
    or so.

    > void getIntArray(int x[]);
    > void bubbleSort(int x[]);
    > void printArrays(int x[], int y[]);
    > void getrandomarray(int x[]);
    > void winnings();
    > int wins = 0;
    >
    > int main(void) {
    >
    >
    > //welcome
    > printf("\t Welcome To The National Lottery!\n");
    > printf("\tPlease Enter Six Whole Numbers Between 1 And 49\n\n");
    >
    > getIntArray(a);
    > getrandomarray(b);
    > bubbleSort(a);
    > bubbleSort(b);
    > printf("Your Numbers In Numerical Order Are: \n");
    > printArrays(a, b);
    > winnings();
    > return 0;
    > }
    >
    >
    >
    >
    >
    >
    > void getIntArray(int x[])
    >
    > {
    > int n = 0;
    > int temp;
    >
    > here://I know goto loops are not liked in C, but this is the best way to
    > achieve this feature in my opinion!
    >
    >
    > ;
    >
    > do {
    > printf("Choose A Number\n");
    > scanf("%d", &temp);
    > if (temp==0) break;
    >
    >
    > if (n==5)
    > {
    > printf("All Six Numbers Have Been Entered, Press Zero To

    Confirm\n");
    >
    > }
    >
    > if ((temp<01) || (temp>49))
    > {
    > printf("%s\n", "Sorry, That Is An Unacceptable Number. Please Re Enter");
    > goto here;
    > }
    >
    > if (temp==a[0])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[1])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[2])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[3])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[4])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    > if (temp==a[5])
    > {
    > printf("%s\n", "Sorry, You Have Already Selected That Number. Please Make
    > Another Choice");
    > goto here;
    > }
    >
    > else
    > a[n++] = temp;
    > }while (1);
    > }
    >
    >
    > void bubbleSort(int x[])
    > /* It sorts in non-decreasing order the six positions of a. It uses
    > * a technique called the bubble sort method.
    > */
    > {
    > int lcv;
    > int limit = NMAX-1;
    > int temp;
    > int lastChange;
    >
    > while (limit) {
    > lastChange = 0;
    > for (lcv=0;lcv<limit;lcv++)
    >
    > if (x[lcv]>x[lcv+1]) {
    > temp = x[lcv];
    > x[lcv] = x[lcv+1];
    > x[lcv+1] = temp;
    > lastChange = lcv;
    > }
    > limit = lastChange;
    > }
    > }
    >
    >
    > void printArrays(int x[], int y[])
    >
    > /* These values are printed out, six per line. */
    > {
    >
    >
    > //print user array
    > for (int i=0; i<NMAX;)
    > {
    > printf("\t%d ", x[i++]);
    > if (i%6==0)
    > printf("\n");
    > }
    > printf("\n");
    >
    >
    >
    >
    >
    > printf("The Drawn Numbers In Numerical Order Are: \n");
    > //print random array
    >
    >
    >
    >
    >
    > for (i=0; i<NMAX;){
    > printf("\t%d ", y[i++]);
    > if (i%6==0)
    > printf("\n");
    > }
    > printf("\n");
    >
    > }
    >
    >
    >
    > void getrandomarray(int x[])
    > {
    >
    > //make random numbers
    > srand((unsigned int)time((time_t *)NULL));
    >
    > for (int i=0; i<NMAX; i++)
    > {
    > x = (rand()%49)+1; //This safety feature makes the
    > generator regenerate should any
    > for(int j=0; j<i; j++) //of its numbers be the same as previous
    > numbers.
    > {
    > if(x == x[j])
    > i--;
    > }
    > }
    >
    > }
    >
    >
    > void bubblesort(int x[])
    > /* It sorts in non-decreasing order the first 6 positions of b. It uses
    > * the bubble sort method.
    > */
    > {
    > int lcv;
    > int limit = NMAX-1;
    > int temp;
    > int lastChange;
    >
    > while (limit)
    > {
    > lastChange = 0;
    > for (lcv=0;lcv<limit;lcv++)
    > {
    > /* Notice that the values in positions LIMIT+1 .. in
    > * their final position, i.e. they are sorted right */
    > if (a[lcv]>a[lcv+1])
    > {
    > temp = x[lcv];
    > x[lcv] = x[lcv+1];
    > x[lcv+1] = temp;
    > lastChange = lcv;
    > }
    > limit = lastChange;
    > }
    >
    > }
    > }
    >
    >
    > void winnings()
    > {
    >
    > for(int i=0; i<6; i++)
    > {
    > for(int j=0; j<6; j++)
    > {
    > if(a==b[j])
    > {
    > wins++;
    > }
    > }
    >




    You forgot to end the first for-loop! Add one '}'!



    > if(wins==0)
    > {
    > printf("You Haven't Matched Any Numbers, Sorry\n");
    > return;
    > }
    > if(wins==1)
    > {
    > printf("You Have Matched One Number, Sorry\n");
    > return;
    > }
    >
    > }




    The above '}' shouldn't be there!



    > if(wins==2)
    > {
    > printf("You Have Matched Two Numbers, Sorry\n");
    > return;
    > }
    > if(wins==3)
    > {
    > printf("You Have Matched 3 Numbers. Well Done, You Have Won £10\n");
    > return;
    > }
    > if(wins==4)
    > {
    > printf("You Have Matched 4 Numbers. Well Done, You Have Won £500\n");
    > return;
    > }
    > if(wins==5)
    > {
    > printf("You Have Matched 5 Numbers. Well Done, You Have Won

    £300,000!\n");
    > return;
    > }
    > if(wins==6)
    > {
    > printf("You Have Matched 3 Numbers. Congratulations, You Have Won
    > £5,000,000!!\n");
    > return;
    > }
    >
    > }
    >
    >
    > ok-so i guess its a mess to most of you, it compiles and runs no bother,
    > just doesnt give a correct readout at the end of how many numbers have
    > matched! iv looed at this for 4 days now, seems to me that only one or no
    > numbers are being matched almost as if its doing a true and false as to
    > whether any numbers match. trouble is, the lottery rules are 0, 1 or 2
    > numbers matched = £0, 3 =£10, 4=£500, 5=£300,000, 6= £5,000,000. any

    quick
    > fixes or suggestions as to an alternative end will be greatly appreciated,
    > but if i could stick to this structure it would be good as i am trying

    hard
    > to understand even what i've written! did anyone find this or am i just
    > doomed to not be a programmer!?
    >
    > thanks in advance
    >
    > sam
    >
    >
     
    Andreas, May 7, 2004
    #4
  5. sam

    Xenos Guest


    > You definately should initiate these, like
    > init a[NMAX] = null;
    > or so.
    >

    If you mean initialize, they are by default. What is

    init a[NMAX] = null;

    Suppose to mean? Do you mean:

    int a[NMAX] = {0};

    ?
     
    Xenos, May 7, 2004
    #5
  6. sam

    Andreas Guest

    "Xenos" <> skrev i meddelandet
    news:c7glr7$...
    >
    > > You definately should initiate these, like
    > > init a[NMAX] = null;
    > > or so.
    > >

    > If you mean initialize, they are by default. What is
    >
    > init a[NMAX] = null;
    >
    > Suppose to mean? Do you mean:
    >
    > int a[NMAX] = {0};
    >
    > ?


    Yes, i'm sorry. It was a long time ago since i coded C.

    /Andreas
     
    Andreas, May 7, 2004
    #6
  7. sam

    Leor Zolman Guest

    On Fri, 7 May 2004 18:55:04 +0100, "sam" <sam@home> wrote:

    >hi, i am new to C/C++ and have just finished a program based on the UK
    >national lottery, where you enter 6 numbers, six are generated by the
    >computer and there are appropriate messages and a compare function to decide
    >your winnings. I am using Microsoft's C++ version 6 standard, the program
    >is as follows:
    >


    "Before":

    >void winnings()
    >{
    >
    > for(int i=0; i<6; i++)
    > {
    > for(int j=0; j<6; j++)
    > {
    > if(a==b[j])
    > {
    > wins++;
    > }
    > }
    >
    > if(wins==0)
    > {
    > printf("You Haven't Matched Any Numbers, Sorry\n");
    > return;
    > }
    > if(wins==1)
    > {
    > printf("You Have Matched One Number, Sorry\n");
    > return;
    > }
    >
    > }
    > if(wins==2)
    > {
    > printf("You Have Matched Two Numbers, Sorry\n");
    > return;
    > }

    ...


    "After":

    void winnings()
    {
    printf("a: ");
    for (int i = 0; i < 6; i++)
    printf("%d ", a);
    printf("\nb: ");
    for (int i = 0; i < 6; i++)
    printf("%d ", b);

    for(int i=0; i<6; i++)
    {
    for(int j=0; j<6; j++)
    {
    if(a==b[j])
    {
    wins++;
    }
    }

    if(wins==0)
    {
    printf("You Haven't Matched Any Numbers, Sorry\n");
    return;
    }
    if(wins==1)
    {
    printf("You Have Matched One Number, Sorry\n");
    return;
    }

    }
    if(wins==2)
    {
    printf("You Have Matched Two Numbers, Sorry\n");
    return;
    }
    // ....

    Notice anything different? ;-)
    -leor


    --
    Leor Zolman --- BD Software --- www.bdsoft.com
    On-Site Training in C/C++, Java, Perl and Unix
    C++ users: download BD Software's free STL Error Message Decryptor at:
    www.bdsoft.com/tools/stlfilt.html
     
    Leor Zolman, May 7, 2004
    #7
  8. sam

    Mabden Guest

    "sam" <sam@home> wrote in message
    news:...
    > hi, i am new to C/C++ and have just finished a program based on the UK
    > national lottery, where you enter 6 numbers, six are generated by the
    > computer and there are appropriate messages and a compare function to

    decide
    > your winnings. I am using Microsoft's C++ version 6 standard, the program
    > is as follows:



    <snip>

    >
    > void winnings()
    > {
    >
    > for(int i=0; i<6; i++)
    > {
    > for(int j=0; j<6; j++)
    > {
    > if(a==b[j])
    > {
    > wins++;


    A "break;" would work well here, as you are done processing once you find
    the match, since they are sorted.


    > }
    > }



    You need a } HERE, it was moved down below the following...

    > if(wins==1)
    > {
    > printf("You Have Matched One Number, Sorry\n");
    > return;
    > }
    >
    > }


    ....to HERE. So fix that.

    Also:

    > if(wins==6)
    > {
    > printf("You Have Matched 3 Numbers. Congratulations, You Have Won
    > £5,000,000!!\n");
    > return;
    > }


    wins == 6, but the message says 3.


    > any quick
    > fixes or suggestions as to an alternative end will be greatly appreciated,
    > but if i could stick to this structure it would be good as i am trying

    hard
    > to understand even what i've written! did anyone find this or am i just
    > doomed to not be a programmer!?


    Well.... the code, in general, sucks, but then we all start somewhere. ;-)

    --
    Mabden
     
    Mabden, May 8, 2004
    #8
  9. sam

    sam Guest

    thanks for the help, it's looking a lot tidier now! i still cant get the
    numbers to compare properly at the end though, only 0 and 1 numbers works,
    as if im still doing a true or false comparison, why is it so hard to
    compare numbers!? im trying to get at:

    if the first number from the user inputted array equals or is equivalent to
    any of the numbers from the random generator, add 1.

    if the second.. etc

    then we should have up to 5 (6) matches

    i thought of covering all possible matches one at a time, ie if a[0] = b[0],
    b[1] etc, but that would take ages and won't look so good!
     
    sam, May 8, 2004
    #9
  10. sam wrote:
    >
    > thanks for the help, it's looking a lot tidier now! i still cant get the
    > numbers to compare properly at the end though, only 0 and 1 numbers works,
    > as if im still doing a true or false comparison, why is it so hard to
    > compare numbers!?


    It isn't.
    Let me show you something. The beauty of consistent code indentation and how
    it helps to identify some type of bugs.

    Lets look at your winnings function(), but this time reformatted such
    that the indentation is consistent, correct and stands out a little bit more
    by using 2 spaces instead of just 1

    void winnings()
    {

    for(int i=0; i<6; i++)
    {
    for(int j=0; j<6; j++)
    {
    if(a==b[j])
    {
    wins++;
    }
    }

    if(wins==0)
    {
    printf("You Haven't Matched Any Numbers, Sorry\n");
    return;
    }
    if(wins==1)
    {
    printf("You Have Matched One Number, Sorry\n");
    return;
    }
    }

    if(wins==2)
    {
    printf("You Have Matched Two Numbers, Sorry\n");
    return;
    }
    if(wins==3)
    {
    printf("You Have Matched 3 Numbers. Well Done, You Have Won £10\n");
    return;
    }
    if(wins==4)
    {
    printf("You Have Matched 4 Numbers. Well Done, You Have Won £500\n");
    return;
    }
    if(wins==5)
    {
    printf("You Have Matched 5 Numbers. Well Done, You Have Won £300,000!\n");
    return;
    }
    if(wins==6)
    {
    printf("You Have Matched 3 Numbers. Congratulations, You Have Won £5,000,000!!\n");
    return;
    }
    }

    Do you notice something?
    The if-s handling the case for 0 and 1 are not at the same indentation level
    then the other cases! Also the if-s for cases 0 and 1 are at the complete
    wrong indentation level. You need to compare *all* numbers, not just a[0] with
    all b[j] to decide if there are 0 or 1 matches.

    --
    Karl Heinz Buchegger
     
    Karl Heinz Buchegger, May 10, 2004
    #10
  11. sam

    Mabden Guest

    "Karl Heinz Buchegger" <> wrote in message
    news:...
    > sam wrote:
    > >
    > > thanks for the help, it's looking a lot tidier now! i still cant get the
    > > numbers to compare properly at the end though, only 0 and 1 numbers

    works,
    > > as if im still doing a true or false comparison, why is it so hard to
    > > compare numbers!?

    >
    > It isn't.
    > Let me show you something. The beauty of consistent code indentation and

    how
    > it helps to identify some type of bugs.
    >
    > Lets look at your winnings function(), but this time reformatted such
    > that the indentation is consistent, correct and stands out a little bit

    more
    > by using 2 spaces instead of just 1
    >
    > void winnings()
    > {
    >
    > for(int i=0; i<6; i++)
    > {
    > for(int j=0; j<6; j++)
    > {
    > if(a==b[j])
    > {
    > wins++;
    > }
    > }
    >
    > if(wins==0)
    > {
    > printf("You Haven't Matched Any Numbers, Sorry\n");
    > return;
    > }
    > if(wins==1)
    > {
    > printf("You Have Matched One Number, Sorry\n");
    > return;
    > }
    > }
    >
    > if(wins==2)
    > {
    > printf("You Have Matched Two Numbers, Sorry\n");
    > return;
    > }
    > if(wins==3)
    > {
    > printf("You Have Matched 3 Numbers. Well Done, You Have Won £10\n");
    > return;
    > }
    > if(wins==4)
    > {
    > printf("You Have Matched 4 Numbers. Well Done, You Have Won £500\n");
    > return;
    > }
    > if(wins==5)
    > {
    > printf("You Have Matched 5 Numbers. Well Done, You Have Won

    £300,000!\n");
    > return;
    > }
    > if(wins==6)
    > {
    > printf("You Have Matched 3 Numbers. Congratulations, You Have Won

    £5,000,000!!\n");
    > return;
    > }
    > }
    >
    > Do you notice something?
    > The if-s handling the case for 0 and 1 are not at the same indentation

    level
    > then the other cases! Also the if-s for cases 0 and 1 are at the complete
    > wrong indentation level. You need to compare *all* numbers, not just a[0]

    with
    > all b[j] to decide if there are 0 or 1 matches.
    >


    <Uncle voice>"And one more thing..."

    Am I the only one who notices case 6: "You Have Matched 3 Numbers"?

    --
    Mabden
     
    Mabden, May 13, 2004
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Julian McMaster

    likely a simple request

    Julian McMaster, Jul 26, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    351
    Kevin Spencer
    Jul 26, 2005
  2. Flip
    Replies:
    3
    Views:
    985
    Tony Morris
    Feb 9, 2004
  3. Steve Kershaw
    Replies:
    1
    Views:
    373
    Brennan Stehling
    Sep 26, 2006
  4. Sune
    Replies:
    10
    Views:
    589
    Martin Ambuhl
    Oct 7, 2005
  5. Replies:
    4
    Views:
    308
    James Kanze
    Oct 3, 2008
Loading...

Share This Page