967 words
5 minutes
CS50 Problem Set 3
CS50 Problem Set 3
Here’s my answer for the CS50 Problem Set 3. Hope that will help you a bit.
Problem 1: Sort
sort1 uses: bubble sort
How do you know?: When sorting the sorted numbers, bubble sort's time complexity is omega(n); while sorting the random numbers, bubble sort's time complexity is O(n^2).
sort2 uses: merge sort
How do you know?: the time sort2 uses to sort every kind of txt is the least between the three sorts.
sort3 uses: selection sort
How do you know?: the time it uses to sort three kinds of txt is almost the same, but it cost more time than sort2.Problem 2: Plurality
#include <cs50.h>#include <stdio.h>#include <string.h>
// Max number of candidates#define MAX 9
// Candidates have name and vote counttypedef struct{ string name; int votes;} candidate;
// Array of candidatescandidate candidates[MAX];
// Number of candidatesint candidate_count;
// Function prototypesbool vote(string name);void print_winner(void);
int main(int argc, string argv[]){ // Check for invalid usage if (argc < 2) { printf("Usage: plurality [candidate ...]\n"); return 1; }
// Populate array of candidates candidate_count = argc - 1; if (candidate_count > MAX) { printf("Maximum number of candidates is %i\n", MAX); return 2; } for (int i = 0; i < candidate_count; i++) { candidates[i].name = argv[i + 1]; candidates[i].votes = 0; }
int voter_count = get_int("Number of voters: ");
// Loop over all voters for (int i = 0; i < voter_count; i++) { string name = get_string("Vote: ");
// Check for invalid vote if (!vote(name)) { printf("Invalid vote.\n"); } }
// Display winner of election print_winner();}
// Update vote totals given a new votebool vote(string name){ for (int i = 0; i < candidate_count; i++) { if (strcmp(candidates[i].name, name) == 0) { candidates[i].votes += 1; return true; } } return false;}
// Print the winner (or winners) of the electionvoid print_winner(void){ int highest = 0; string name; for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes > highest) { highest = candidates[i].votes; } } for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes == highest) { printf("%s\n", candidates[i].name); } } return;}Problem 3: Runoff
#include <cs50.h>#include <stdio.h>#include <string.h>
// Max voters and candidates#define MAX_VOTERS 100#define MAX_CANDIDATES 9
// preferences[i][j] is jth preference for voter iint preferences[MAX_VOTERS][MAX_CANDIDATES];
// Candidates have name, vote count, eliminated statustypedef struct{ string name; int votes; bool eliminated;} candidate;
// Array of candidatescandidate candidates[MAX_CANDIDATES];
// Numbers of voters and candidatesint voter_count;int candidate_count;
// Function prototypesbool 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[i].name = argv[i + 1]; candidates[i].votes = 0; candidates[i].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("\n"); }
// 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[i].eliminated) { printf("%s\n", candidates[i].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[i].votes = 0; } } return 0;}
// Record preference if vote is validbool vote(int voter, int rank, string name){ for (int i = 0; i < candidate_count; i++) { if (strcmp(candidates[i].name, name) == 0) { preferences[voter][rank] = i; return true; } } return false;}
// Tabulate votes for non-eliminated candidatesvoid tabulate(void){ for (int i = 0; i < voter_count; i++) { for (int j = 0; j < candidate_count; j++) { if (!candidates[preferences[i][j]].eliminated == true) { candidates[preferences[i][j]].votes += 1; break; } } } return;}
// Print the winner of the election, if there is onebool print_winner(void){ int limit = voter_count / 2; for (int i = 0; i < candidate_count; i++) { if (!candidates[i].eliminated && (candidates[i].votes > limit)) { printf("%s\n", candidates[i].name); return true; } } return false;}
// Return the minimum number of votes any remaining candidate hasint find_min(void){ int min = 0; for (int i = 0; i < candidate_count; i++) { if (!candidates[i].eliminated) { if (i == 0) { min = candidates[i].votes; } if (candidates[i].votes < min) { min = candidates[i].votes; } } } return min;}
// Return true if the election is tied between all candidates, false otherwisebool is_tie(int min){ for (int i = 0; i < candidate_count; i++) { if (!candidates[i].eliminated && candidates[i].votes != min) { return false; } } return true;}
// Eliminate the candidate (or candidates) in last placevoid eliminate(int min){ for (int i = 0; i < candidate_count; i++) { if (!candidates[i].eliminated && candidates[i].votes == min) { candidates[i].eliminated = true; } } return;} CS50 Problem Set 3
https://tech.kinghua0629.com/posts/cs50-problem-set-3/