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

      Although not required to be submitted for the Runoff project, my objective is to display choices entered by voters in tabular form.

      Like if there are 3 candidates (a, b, c) and 2 voters , the screen finally should display:

      1,1,c

      1,2,b

      1,3,a

      2,1,c

      2,2,b

      2,2,a

      Right now, the code below is not showing finally the above result. Instead, it is showing one by one as ranks are entered.

       

      
      
      #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("%i, %i, %s\n", i + 1, j + 1, candidates[preferences[j]].name);
              }
              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;
      }
      */

       

      Here is the tentative 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("%i, %i, %s\n", i + 1, j + 1, candidates[preferences[j]].name);
      
              }
              printf("\n");
          int y = i * j
              for (int x = 0; x < y; x++)
              {
                  int z [0] = output from line 81//needs revision
              }
          }
      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;
      }
      */

       

      The task apparently is to store output from line 81 each time the loop passes into an array and then print the final result. Even though int z [] will store 3 integer values ( if j = 3), stuck on how to make sure that int z[0] = output from line 81, int z[1] once again output from line 81 as loop runs in the above screenshot.

       


      Reply


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

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