• This topic is empty.
Viewing 1 post (of 1 total)
  • Author
    Posts
  • #949
    admin
    Keymaster

      Though not required for the project submission purpose, still I am trying to find (if at all possible) how to print the name of candidate selected by a voter for a particular rank from the main function (instead of vote function).

      Here is the code:

      
      
      #include <cs50.h>
      #include <stdio.h>
      #include <string.h>
      
      // Max voters and candidates
      #define MAX_VOTERS 100
      #define MAX_CANDIDATES 9
      
      // preferences[j] is jth preference for voter i
      int preferences[MAX_VOTERS][MAX_CANDIDATES];
      
      // Candidates have name, vote count, eliminated status
      typedef struct
      {
          string name;
          int votes;
          bool eliminated;
      }
      candidate;
      
      // Array of candidates
      candidate candidates[MAX_CANDIDATES];
      
      // Numbers of voters and candidates
      int voter_count;
      int candidate_count;
      
      // Function prototypes
      bool vote(int voter, int rank, string name);
      void tabulate(void);
      bool print_winner(void);
      int find_min(void);
      bool is_tie(int min);
      void eliminate(int min);
      
      int main(int argc, string argv[])
      {
          // Check for invalid usage
          if (argc < 2)
          {
              printf("Usage: runoff [candidate ...]\n");
              return 1;
          }
      
          // Populate array of candidates
          candidate_count = argc - 1;
          if (candidate_count > MAX_CANDIDATES)
          {
              printf("Maximum number of candidates is %i\n", MAX_CANDIDATES);
              return 2;
          }
          for (int i = 0; i < candidate_count; i++)
          {
              candidates.name = argv;
              candidates.votes = 0;
              candidates.eliminated = false;
          }
      
          voter_count = get_int("Number of voters: ");
          if (voter_count > MAX_VOTERS)
          {
              printf("Maximum number of voters is %i\n", MAX_VOTERS);
              return 3;
          }
      
          // Keep querying for votes
          for (int i = 0; i < voter_count; i++)
          {
      
              // Query for each rank
              for (int j = 0; j < candidate_count; j++)
              {
                  string name = get_string("Rank %i: ", j + 1);
      
                  // Record vote, unless it's invalid
                  if (!vote(i, j, name))
                  {
                      printf("Invalid vote.\n");
                      return 4;
                  }
      
                  printf("voter no. (via main function taking value of i) %i, rank selected (via main function taking value of j) %i\n, preference of voter no. %i for rank %i is ??? (via main function)\n", i + 1, j + 1, i + 1, j + 1);
      
              }
      
              printf("\n");
          }
      printf("complete");
      return 0;
          //*
      
          // Keep holding runoffs until winner exists
          while (true)
          {
              // Calculate votes given remaining candidates
              tabulate();
      
              // Check if election has been won
              bool won = print_winner();
              if (won)
              {
                  break;
              }
      
              // Eliminate last-place candidates
              int min = find_min();
              bool tie = is_tie(min);
      
              // If tie, everyone wins
              if (tie)
              {
                  for (int i = 0; i < candidate_count; i++)
                  {
                      if (!candidates.eliminated)
                      {
                          printf("%s\n", candidates.name);
                      }
                  }
                  break;
              }
      
              // Eliminate anyone with minimum number of votes
              eliminate(min);
      
              // Reset vote counts back to zero
              for (int i = 0; i < candidate_count; i++)
              {
                  candidates.votes = 0;
              }
          }
          return 0;
      }
      
      //*/
      
      // Record preference if vote is valid
      bool vote(int voter, int rank, string name)
      {
          printf("voter no (via local function taking value of voter as argument).: %i, rank selected (via local function taking value of rank as argument) %i\n", voter + 1, rank + 1);
          for (int t = 0; t < candidate_count; t++)
              {
                  if(strcmp(name, candidates[t].name) == 0)
                  {
                  preferences[voter][rank] = t;
                  printf("preference of voter no. %i for rank %i is %s\n", voter + 1, rank + 1, candidates[t].name);
                  return 4;
                  }
              }
          return 0;
      
      }
      
      //*
      
      // Tabulate votes for non-eliminated candidates
      void tabulate(void)
      {
      
          // TODO
          return;
      }
      
      // Print the winner of the election, if there is one
      bool print_winner(void)
      {
          // TODO
          return false;
      }
      
      // Return the minimum number of votes any remaining candidate has
      int find_min(void)
      {
          // TODO
          return 0;
      }
      
      // Return true if the election is tied between all candidates, false otherwise
      bool is_tie(int min)
      {
          // TODO
          return false;
      }
      
      // Eliminate the candidate (or candidates) in last place
      void eliminate(int min)
      {
          // TODO
          return;
      }
      //*/

       

      Not sure if by introducing if else condition before line 82, the goal can be achieved.

      My thought is that since vote function returns boolean type value (true/false), it can be relevant for only line 76. Beyond that, there is no way. If the vote is valid, the value of i and j gets incremented. But j in the main function and rank in the vote function differs on the ground that j value is derived sequentially but rank value after matching with the candidate’s name.


      Reply


      https://edstem.org/us/courses/176/discussion/2275125?comment=5215166[learn_press_profile]

    Viewing 1 post (of 1 total)
    • You must be logged in to reply to this topic.
    Scroll to Top