Amession
Amession

Reputation: 249

C++ program to display votes in percentage not showing correct result

I'm solving some C++ problems from ebooks. I made this C++ program but it isn't working properly. I've 2 problems:

  1. Even after applying the forumla (votePercentage = firstAnswer/totalVotes*100;) it isn't showing the output, but only 0.

  2. The program should display the bar chart, how am I suppose to do that? Any hints, reference or solution will be appreciated.

Here is my code:

/*
 * Write a program that provides the option of tallying up the
 * results of a poll with 3 possible values.
 * The first input to the program is the poll question;
 * the next three inputs are the possible answers.
 * The first answer is indicated by 1, the second by 2, the third by 3.
 * The answers are tallied until a 0 is entered.
 * The program should then show the results of the poll—try making
 * a bar graph that shows the results properly scaled to fit on
 * your screen no matter how many results were entered.
 */

#include <iostream>
#include <string>

void startPoll (void);
void showPoll (void);
void pollCheck (void);

std::string pollQuestion, answer1, answer2, answer3;
int       pollChoice, firstAnswer, secondAnswer, thirdAnswer;


int main (void)
{
    int totalVotes = 1;
    float votePercentage;

    startPoll();
    showPoll();

    for(;;totalVotes++)
    {
        if      (pollChoice == 1)
        {
            firstAnswer = firstAnswer + 1;
        }
        else if (pollChoice == 2)
        {
            secondAnswer++;
        }
        else if (pollChoice == 3)
        {
            thirdAnswer++;
        }
        else
        {
            std::cout << "==============*======*======*==============\n"
                      << "                   RESULT                  \n"
                      << "==============*======*======*==============\n"
                      << "Question: " << pollQuestion << "\n"
                      << "Total Votes: " << totalVotes << "\n";
            votePercentage = (firstAnswer/totalVotes)*100;
            std::cout << answer1 << ": " << firstAnswer  << " votes.       | " << votePercentage << "\n";

            votePercentage = secondAnswer/totalVotes*100;
            std::cout << answer2 << ": " << secondAnswer << " votes.       | " << votePercentage << "\n";

            votePercentage = thirdAnswer/totalVotes*100;
            std::cout << answer3 << ": " << thirdAnswer  << " votes.       | " << votePercentage << "\n";

            return 0;
        }
        std::cout << "\nEnter your vote again\nOR\nuse 0 to show the results.\n";
        std::cin >> pollChoice;

    }

    std::cout << "Error: Something went wrong!\n";
}

void startPoll (void)
{
    std::cout << "Enter your poll question:\n";
    getline (std::cin, pollQuestion, '\n');

    std::cout << "Enter answer 1:\n";
    getline (std::cin, answer1, '\n');
    std::cout << "Enter answer 2:\n";
    getline (std::cin, answer2, '\n');
    std::cout << "Enter answer 3:\n";
    getline (std::cin, answer3, '\n');

}

void showPoll (void)
{
    std::cout << "==============|======|======|==============\n"
              << "                    POLL                   \n"
              << "==============|======|======|==============\n"
              << pollQuestion << "\n"
              << "1. " << answer1 << "\n"
              << "2. " << answer2 << "\n"
              << "3. " << answer3 << "\n\n"
              << "Enter 1,2 or 3:\n\n";
    std::cin  >> pollChoice;
    pollCheck();
}

void pollCheck (void)
{
    if (pollChoice != 1  &&  pollChoice != 2  &&  pollChoice != 3)
    {
        std::cout << "Wrong choice entered! Please try again.\n\n";
                return showPoll();
    }
}

Upvotes: 0

Views: 1286

Answers (3)

Here is my solution, you can see how I made the bars work by reading the comments.

#include <iostream>
using namespace std;

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;

    cout << "What is your favorite animal? 1 Cat, ";
    cout <<"2 Dog, 3 Fish, 0 Count votes" << endl;

    //Choice counter
    while (true)
    {
        int choice;
        cout << "Choice: ";
        cin >> choice;

        if(choice == 1)
            a++;
        else if(choice == 2)
            b++;
        else if(choice == 3)
            c++;
        else if(choice == 0)
            break;
        else
            continue;
    }

    cout << endl << "  1: " << a << endl;
    cout << "  2: " << b << endl;
    cout << "  3: " << c << endl;
    cout << endl << "1\t" << "2\t" << "3\t" << endl;

    //Finds the max voted option
    int max = 0;
    if(a > b && a > c)
        max = a;
    else if(b > c && b > a)
        max = b;
    else if(c > a && c > b)
        max = c;

/*  If the max voted option is bigger than 10, find by how much
    we have to divide to scale the graph, also making 10 bar
    units the max a bar can reach before scaling the others too  */
    int div =2;
    if(max > 10)
    {
        do
        {
            max = max/div;
            if(max < 10)
                break;
            div++;
        }while(true);
    }else
        div = 1;

    //Sets the final number for the bars
    a=a/div;
    b=b/div;
    c=c/div;
    if(a==0)
        a++;
    if(b==0)
        b++;
    if(c==0)
        c++;

    //Creates the bars
    while(true)
    {
        if(a>0)
        {
            cout << "[]" << "\t";
            a--;
        }else
            cout << "  ";
        if(b>0)
        {
            cout << "[]" << "\t";
            b--;
        }else
            cout << "  ";
        if(c>0)
        {
            cout << "[]" << "\t";
            c--;
        }else
            cout << "  ";
        cout << endl;
        if(a==0 && b==0 && c==0)
            break;
    }

}

Upvotes: 1

martin
martin

Reputation: 3239

You need to take care that integer/integer = integer. In your case, changing

(firstAnswer/totalVotes)*100

to

(1.0*firstAnswer/totalVotes)*100

or

(firstAnswer*100.0/totalVotes)

should work. They all give a floating point result.

Upvotes: 1

Horius
Horius

Reputation: 129

Well, the solution for the Bar Chart could be the following:(Not written by me) I think thats very self explaining because its really basic

void line (int n, char c)
{
  // this is the loop for n
  for (int i = 0; i < n; i++)
    cout << c << endl;
}

Upvotes: 1

Related Questions