In: Computer Science
INPUT FILE INTO ARRAY. CHECKING FOR COMMAS AND SUCH. HOW TO DO?
void readFile(Candidate candidates[]) – reads the elections.txt file, fills the candidates[] array. Hint: use substr() and find() functions. Set Score to 0.
void List(Candidate candidates[]) – prints the array of Candidate
structs. One candidate per one line, include all fields. Use setw()
to display nice looking list.
void displayCandidate(Candidate candidates[]) – prints the complete
information about the candidate
.
Candidate First(Candidate candidates[]) – returns single struct
element: candidate with highest score
Candidate Last(Candidate candidates[]) – returns single struct
element: candidate with lowest score
void Votes(Candidate candidates[]) – function sorts the
candidates[] array by number of votes, the order in candidates[]
array is replaced
void Scores(Candidate candidates[]) – calculates the percentage
score for each candidate. Use the following formula:
??????=(CandidateVotes)/(sum of votes)*100%
Correct line for the reference: F=John,L=Smith,V=3342
The line errors that your program needs to detect, are as follows:
incorrect token / separator, example in line 5: F=Steven,L=JohnV=4429 --- (comma missing) – lines with this error need to be ignored
space in token, example in line 3: F=Hillary,X=Clinton, V=1622 --- lines with this error need to be read, error fixed, data included in your dataset
empty line, example in line 6 – empty lines need to be ignored
Example Textfile
F=Michael,L=John,V=3342
F=Danny,L=Red,V=2003
F=Hillary,L=Clinton, V=1588
F=Albert,L=Lee,V=5332
F=Steven,L=JohnV=4429
*IMPORTANT* How would I do the readFile function? It says to check if the commas are present, and that the program will correct the line if there is white spaces. How do i use the find() function? Please be DETAILED in explanations of each part of code. Beginner Coder. *IMPORTANT*
Code Skeleton We HAVE to follow:
#include
#include
#include
#include
#include
using namespace std;
struct Candidate {
string Fname;
string Lname;
int votes;
double Score;
};
const int MAX_SIZE = 100;
void readFile(Candidate[]);
void List(Candidate[]);
void Votes(Candidate[]);
void displayCandidate(Candidate);
Candidate First(Candidate[]);
Candidate Last(Candidate[]);
void Scores(Candidate[]);
int main() {
}
void readFile(Candidate candidates[]) {
string line;
ifstream infile;
infile.open("elections.txt");
while (!infile.eof()) {
getline(infile,line);
// your code here
}
infile.close();
}
void List(Candidate candidates[]) {
}
void Votes(Candidate candidates[]) {
}
void displayCandidate(Candidate candidates) {
}
Candidate First(Candidate candidates[]) {
}
Candidate Last(Candidate candidates[]) {
}
void Scores(Candidate candidates[]) {
}
TO ANUNAGA: I don't know what you want, this is the code we HAVE TO go by and code by and figure out. I can't give you anymore information. Please, either help me solve this or just don't.
#include <iostream> #include <iomanip> #include <stdlib.h> #include <fstream> #include <string> using namespace std; struct Candidate { string Fname; string Lname; int votes; double Score; }; const int MAX_SIZE = 100; void readFile(Candidate[]); void List(Candidate[]); void Votes(Candidate[]); void displayCandidate(Candidate); Candidate First(Candidate[]); Candidate Last(Candidate[]); void Scores(Candidate[]); int main() { Candidate candidates[MAX_SIZE]; readFile(candidates); Scores(candidates); Votes(candidates); cout << endl; List(candidates); } // trim a string, it removes any spaces at end and start of the string string trim(string& str) { str.erase(0, str.find_first_not_of(' ')); //prefixing spaces str.erase(str.find_last_not_of(' ')+1); //surfixing spaces return str; } // this method counts the occurrences of a character in string. int countCharacter(string s, char c) { int count = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == c) { count++; } } return count; } // this method parses the token which is in format: // F=<firstName> // L=<lastName> // V=<Votes> void parseToken(string s, Candidate &c) { if(s[0] == 'F') { c.Fname = s.substr(2); } else if(s[0] == 'L') { c.Lname = s.substr(2); } else if(s[0] == 'V') { c.votes = atoi(s.substr(2).c_str()); } } // this method converts a comma separated string to tokens // it returns all tokens in form of a vector void tokens(string s, Candidate &c) { // while string has a comma while(s.find(",") != string::npos) { // find index of comma in string int index = s.find(","); // break token till comma string token = s.substr(0, index); // remove the token from original string s = s.substr(index + 1); // remove space from start of token, and push to vector of tokens parseToken(trim(token), c); } // if last token is now not empty, push that too on vector if(!s.empty()) { parseToken(trim(s), c); } } void readFile(Candidate candidates[]) { string line; ifstream infile; infile.open("elections.txt"); if(infile.fail()) { cout << "unable to open file elections.txt" << endl; return; } int i = 0; while (!infile.eof()) { // read a line from the file getline(infile,line); // Here comes the main logic to parse the line int commaCount = countCharacter(line, ','); if(commaCount != 2) { // Ignore line, cout << "Incorrect token separator: " << line << endl; } else if(line.empty()) { // ignore empty line. } else { // We now have a line which does contain correct commas // and is not empty line. tokens(line, candidates[i++]); } } infile.close(); } void List(Candidate candidates[]) { for(int i=0; i<MAX_SIZE; i++) { if(!candidates[i].Fname.empty()) { displayCandidate(candidates[i]); } } } void Votes(Candidate candidates[]) { int size = MAX_SIZE; for(int i=0; i<MAX_SIZE; i++) { if(candidates[i].Fname.empty()) { size = i; break; } } for(int i=0; i<size-1; i++) { int minIndex = i; for(int j=i+1; j<size; j++) { if(candidates[j].Score < candidates[minIndex].Score) { minIndex = j; } } Candidate tmp = candidates[i]; candidates[i] = candidates[minIndex]; candidates[minIndex] = tmp; } } void displayCandidate(Candidate candidate) { cout << candidate.Fname << " " << candidate.Lname << " " << candidate.Score << endl; } Candidate First(Candidate candidates[]) { double max = 0; Candidate result; for(int i=0; i<MAX_SIZE; i++) { if(!candidates[i].Fname.empty() && candidates[i].Score > max) { max = candidates[i].Score; result = candidates[i]; } } return result; } Candidate Last(Candidate candidates[]) { double min = 100; Candidate result; for(int i=0; i<MAX_SIZE; i++) { if(!candidates[i].Fname.empty() && candidates[i].Score < min) { min = candidates[i].Score; result = candidates[i]; } } return result; } void Scores(Candidate candidates[]) { int total = 0; for(int i=0; i<MAX_SIZE; i++) { if(!candidates[i].Fname.empty()) { total += candidates[i].votes; } } for(int i=0; i<MAX_SIZE; i++) { if(!candidates[i].Fname.empty()) { candidates[i].Score = candidates[i].votes * 100.0/total; } } }
************************************************** Thanks for your question. We try our best to help you with detailed answers, But in any case, if you need any modification or have a query/issue with respect to above answer, Please ask that in the comment section. We will surely try to address your query ASAP and resolve the issue.
Please consider providing a thumbs up to this question if it helps you. by Doing that, You will help other students, who are facing similar issue.