-
voting function()
Hey all,
I need your help in order to write a helper function for one of the classes I developed a c+ programming course. This function enables me to output who the winner of an election is. The parameters a,b,c,d stand for the total number of votes received for 'bush', 'gore', 'buchanan', and 'other'.
I am creating two arrays, loading them both with the parameters, sorting one of them so I could tell which one the highest number is. After I decided which one the highest number is, I go back and look in the original array for that same highest number. Whichever array element that highest number falls in is the winner. Wait, it gets better!
I have to also account for ties also. Theoretically, they can all be ties.
In the end, if its a tie the function should return something like "The winner is a tie between " .....(however many tied for 1st place). If there is a clear winner, output something like, "The winner is Bush". Here's what I have so far.
Code:
void Tally::Winner(int a, int b, int c, int d)
// This function should determine who the winner(s) is(are)
{
// Create two arrays
int vote[5];
int vote_sort[5];
// place bush tally in first element
vote[0] = a;
vote_sort[0] = a;
// place gore tally in second element
vote[1] = b;
vote_sort[1] = b;
// place buchanan tally in third element
vote[2] = c;
vote_sort[2] = c;
// place other tally in fourth element
vote[3] = d;
vote_sort[3] = d;
vote[4] = '\0';
vote_sort[4] = '\0';
// Next we sort the elements in descending
// order(highest to lowest) into vote_sort[]
int high = a;
int temp; // temp variable
for (int i = 1; i < 4; i++){
if (vote_sort[i] > high){ // if next element is less than or equal to the current high variable
// move on
temp = vote_sort[i];
vote_sort[i] = vote_sort[(i-1)];
vote_sort[i] = temp;
}
}
// At this point we are assuming we have an descending ordered list
// We now go ahead and check if there are any 'ties' in the highest votes
// by checking if the vote_sort array has any duplicates of the highest votes
// (which is element 0). If there are no ties in the votes, there should only
// be one highest number. We have to go back to our original array vote[] and check
// which element number the highest number is residing in.
// For example if the highest number in vote_sort[] is 15 and the number 15 appears
// in array element number 1, this means that gore wins the vote and had a total vote of 15.
}
I know that this code is kind of convoluted but this is the last leg of my humongoid program and my brain is fritzed. Any and all feedback is greatly appreciated.
-
Re: voting function()
Code:
Tally::Winner( type array[], type size )
{
int x = 0, tie = 0, winner = -1, highcell = -1, highvalue = -1;
for( x = 0; x < size; x++ )
if( array[x] > highvalue )
{
highvalue = array[x];
highcell = x;
}
else
if( array[x] == highvalue )
{
tie = 1;
}
if( tie )
{
for( x = 0; x < size; x++ )
{
if( array[x] == highvalue )
// so and so is tied...
}
}
else
// array[highcell] is the winner with highvalue votes
}
Something like that is probably what I'd do.
Quzah.
-
Thanks quzah for the tip but I must pass in the four parameters into the function. The function prototype must remain the same. Thanks anyway.
-
Ok, slight modification then:
type array[4] = { a, b, c, d };
const type size 4;
There you go. Add those two variables to your declarations, and keep your prototype the same. Change type to whatever you need.
Quzah.
-
supaben34
You completely lost me now Quzah. Could you please explain it a bit more clearly?
-
Code:
Tally::Winner( int a, int b, int c, int d )
{
int x = 0, tie = 0, winner = -1, highcell = -1, highvalue = -1;
int array[4] = { a, b, c, d };
const int size = 4;
for( x = 0; x < size; x++ )
... the rest of the code here ...
A simple modification to the code I showed the first time gives it your original prototype, and still makes use of the array method.
Quzah.
-
Hey all,
quzah, if you're there I was hoping you could help me out on more little thing. The function you gave me works great. The thing is when you are tied a person, the program requirements demand that you output a comma seperating each one of them. Where do I put this? This is basically the code you have given me tqeaked just a bit:
Code:
void Tally::Winner(int a, int b, int c, int d)
{
// This function is developed with help from user: 'quzah' of cprogramming.com
int x = 0, tie = 0, winner = -1, highcell = -1, highvalue = -1;
int array[4] = { a, b, c, d };
const int size = 4;
for( x = 0; x < size; x++ ){
if( array[x] > highvalue )
{
highvalue = array[x];
highcell = x;
}
else
if( array[x] == highvalue )
{
tie = 1;
}
}
if( tie )
{
cout << "The winner for district " << district_num << " is a tie between: ";
for( x = 0; x < size; x++ )
{
// where would I put the comma ???
if( array[x] == highvalue ){
switch (x){
case 0:
cout << "Bush ";
break;
case 1:
cout << "Gore ";
break;
case 2:
cout << "Buchanan ";
break;
case 3:
cout << "Other ";
break;
}
}
}
cout << "\n";
}
else
{
cout << "The winner for district " << district_num << " is ";
switch (array[highcell]){
case 1:
cout << "Bush";
break;
case 2:
cout << "Gore";
break;
case 3:
cout << "Buchanan";
break;
case 4:
cout << "Other";
break;
}
cout << "\n";
}
}
-
You could make another slight modification. Instead of setting "tie" to 1, increment it every time.
Then do something like:
Code:
if( tie == 1 )
//two way tie, output a line of text with both names, formatted however you like
else
if( tie == 2 )
//three way tie, see above
else
//everyone tied
Personally, I'd make a quick lookup table to use for their names. A simple static array in your class would work:
Code:
static char *names[] = "Bush", "Gore", "Buchanan", "Other";
Then you may use it something like:
Code:
switch( tie )
{
case 0:
cout << names[highcell] << " has won the election!" << endl;
break;
case 1:
cout << names[highcell] << " and ";
for( x = 0; x < size; x++ )
if( x != highcell && array[x] == highvalue )
cout << names[x] << " have tied!" << endl;
break;
...other cases...
There are many many ways to do this. Above are a few.
Quzah.