CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Page 1 of 2 12 LastLast
Results 1 to 15 of 20
  1. #1
    Join Date
    Apr 2013
    Posts
    45

    Problem output of function

    void find_winner(int array[]){
    int i,questions[3],j=0;
    for (i=0; i<3; i++){
    questions[i]=1;
    }
    for (i=0; i<3; i++){
    while (array[j+1]!=1){
    questions[i]++;
    j++;
    }
    }
    for (i=0; i<3; i++){
    printf("%d",questions[i]);
    }
    }

    This function should find the winner of a game,that is the one that answered at the most questions.For example,if there is an array
    [1]
    [2]
    [3]
    [1]
    [2]
    [1]
    [2]
    [3]
    the first player answered three questions,the second one answered 2 questions and the third one three.so,there are two winners,the player one and the player three.
    My problem is that it just prints the number of questions that the first two players answered.What have I done wrong?
    I hope someone can help me!!!

  2. #2
    Join Date
    Aug 2009
    Location
    Finally back in Alaska
    Posts
    141

    Re: Problem output of function

    not to sound like a smart a$$ but thats what your code should do with the way you have it coded. One way to get it to do what you want it to do would be to have a variable in the second for loop (declared before entering the loop so it is accessible from the third for loop also) that kept track of the most questions answered, then on the third for loop you could have it only print the elements in the array that equaled the variable.

  3. #3
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    I have tried it with a variable,but it also wasn't accessible from the third loop.Although the last player answered just three questions,the variable I used got the number 22,and it shoulb be 3,at this case

  4. #4
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    Shouldn't it be that player 1 answered 3, player 2 answered 3 and player 3 answered 2?

    First initialise questions to 0. Loop through array (using i?) and do questions[array[i] - 1]++; This will then give you the scores for the players (assuming array contains values in the range 1 - 3 (you should check). Then just iterate through questions to find the element(s) with the highest score and its index + 1 is(are) the winners. When I get access to my MSVS again I'll knock you up some code. In the meantime I hope this helps.
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  5. #5
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    Try this

    Code:
    #include <iostream>
    using namespace std;
    
    #define NO_PLAYER	3
    
    void find_winner(int ans[]) {
    int	players[NO_PLAYER] = {0},
    	j = 0,
    	max = 0;
    
    	while (ans[j] >= 1 && ans[j] <= NO_PLAYER) {
    		int pl = ans[j] - 1;
    		players[pl]++;
    
    		if (players[pl] > max)
    			max = players[pl];
    
    		j++;
    	}
    
    	for (int i = 0; i < NO_PLAYER; i++)
    		if (players[i] == max)
    			cout << "player " << i + 1 << " is a winner!" << endl;
    } 
    
    int main()
    {
    int answers[] = {1, 2, 3, 1, 2, 1, 2, 3, 0};
    
    	find_winner(answers);
    	return 0;
    }
    The end of the answers is indicated by a 0.
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  6. #6
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    Nice,but the numbers of the array answers do not correspond to the players that answer each time a question...
    They correspond to the question each player has to answer...For example,if we have the array
    answers[] = {1, 2, 3, 4, 5, 6, 1, 1, 2, 0};
    the first player answers at 6 question,the second at 1,the third at 2...How can I do this????

  7. #7
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    Sorry - I misunderstood your question. Do the number sequence always start at 1 and do they increment by 1 until they are reset to 1? So the first 1 corresponds to player 1 and the second 1 corresponds to player 2 etc?
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  8. #8
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    Yes!!!!

  9. #9
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    OK. Try this.

    Code:
    #include <iostream>
    using namespace std;
    
    void find_winner(int ans[]) {
    int noplay = 0,
        i = 0,
        pl = -1,
        max = 0;
    
    	while (ans[i] > 0)
    		if (ans[i++] == 1)
    			noplay++;
    
    int *play = new int[noplay];
    
    	for (int j = 0; j < noplay; j++)
    		play[j] = 0;
    
    	i = 0;
    	while (ans[i] > 0) {
    		if (ans[i++] == 1)
    			pl++;
    
    		play[pl]++;
    		if (play[pl] > max)
    			max = play[pl];
    	}
    
    	for (int j = 0; j < noplay; j++)
    		if (play[j] == max)
    			cout << "player " << j + 1 << " winner" << endl;
    
    	delete [] play;
    } 
    
    int main()
    {
    int answers[] = {1, 2, 3, 1, 2, 1, 2, 3, 0};
    //int answers[] = {1, 2, 3, 4, 5, 6, 1, 1, 2, 0};
    	find_winner(answers);
    	return 0;
    }
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  10. #10
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    I have runned the program,using this function:
    Code:
    void find_winner(int ans[]) {
    int noplay=0,i=0,pl=-1,max=0,*play,j;
         while (ans[i] > 0){
    		if (ans[i++] == 1) noplay++;
         }
         printf("%d\n",noplay);
    		for (j = 0; j < noplay; j++)
    		     play[j] = 0;
    
    	 i=0;
    	 while (ans[i] > 0) {
    		   if (ans[i++] == 1)
    			   pl++;
    
    		play[pl]++;
    		if (play[pl] > max)
    			max = play[pl];
    	}
    
    	for (j = 0; j < noplay; j++)
    		if (play[j]==max)
    			printf("player %d  winner",j+1);
    
    }
    but I get a segmentation fault...Why does it happen???

  11. #11
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    Now I runned it using this code:
    Code:
    void find_winner(int ans[]) {
    int noplay=0,i=0,pl=-1,max=0,play[3],j;
    		for (j = 0; j <3; j++)
    		     play[j] = 0;
    
    	 i=0;
    	 while (ans[i] > 0) {
    		   if (ans[i++] == 1)
    			   pl++;
    
    		play[pl]++;
    		if (play[pl] > max)
    			max = play[pl];
    	}
    
    	for (j = 0; j <3; j++)
    		if (play[j]==max)
    			printf("player %d  winner",j+1);
    
    }
    I gave at all the players the same number of questions,but the output is just : player 3 winner
    How can I change this code so that if all the players are winners that they will all be printed???

  12. #12
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    You are not using the code I posted! Your code in post #10 fails because play is a pointer to an integer and hasn't been initialised. That's what the new did in my original code.

    Your code in post #11 when run on my system produces the output
    player 1 winnerplayer 3 winner

    Try changing the printf statement to

    Code:
    printf("player %d  winner\n",j+1);
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  13. #13
    Join Date
    Apr 2013
    Posts
    45

    Re: Problem output of function

    Yes,it has a right result if there are two winners,but not if there are 3 :/

  14. #14
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    If you want to use an array in the function, then the code can be shorted to

    Code:
    void find_winner(int ans[]) {
    int	noplay = 0,
    	i = 0,
    	pl = -1,
    	max = 0,
    	play[3] = {0},
    	j;
    
    	while (ans[i] > 0) {
    		if (ans[i++] == 1)
    			 pl++;
    
    		play[pl]++;
    		if (play[pl] > max)
    			max = play[pl];
    	}
    
    	for (j = 0; j < 3; j++)
    		if (play[j] == max)
    			printf("player %d  winner\n", j + 1);
    }
    On my system with the input 1, 2, 3, 1, 2, 1, 2, 3, 0 this gives as output

    player 1 winner
    player 3 winner

    Note that if there are more than 3 players, this program will crash! My code in post #9 dealt with an unknown number of players.
    Last edited by 2kaud; May 24th, 2013 at 06:00 PM.
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

  15. #15
    2kaud's Avatar
    2kaud is offline Super Moderator Power Poster
    Join Date
    Dec 2012
    Location
    England
    Posts
    7,822

    Re: Problem output of function

    Quote Originally Posted by mathmari View Post
    Yes,it has a right result if there are two winners,but not if there are 3 :/
    With the input of {1, 2, 3, 1, 2, 3, 1, 2, 3, 0}, my program produces

    player 1 winner
    player 2 winner
    player 3 winner

    What input data are you using for which the program produces incorrect output?
    All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!

    C++23 Compiler: Microsoft VS2022 (17.6.5)

Page 1 of 2 12 LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured