#LinkedList #doubly #C++ Hi guys, I\'d appreciate if you can help me solve this
ID: 3783645 • Letter: #
Question
#LinkedList #doubly #C++
Hi guys, I'd appreciate if you can help me solve this question in C++ please!
In this assignment your task is to implement a special kind of doubly-linked lists inside a class called Exam_database.
Conceptually, an Exam_database stores (name, score) pairs, where name is the name of a person who wrote an exam, and score is the score they got on it. For simplicity, we’ll assume names are not empty and contain no spaces. Also, a given name occurs at most once in an Exam_database. A score can be any int (even negative!).
Internally, Exam_database should store (name, score) pairs in a private Node struct/class. Each Node should have at least these 4 pointers:
A pointer to the next node whose name occurs alphabetically after the current one.
A pointer to the previous node whose name occurs alphabetically before the current one.
A pointer to the next node with the next higher score after this one.
A pointer to the previous node with the next lower score before this one.
The idea is that the two alphabetical-order pointers form a doubly-linked list ordered by names, and the two score-order pointers form a different doubly- linked list ordered by scores. The (name, score) nodes should only occur once — don’t just implement two separate doubly-linked lists.
In addition to the a Node struct/class. Exam_database needs two head pointers and two tail pointers. One head points to the exam node whose name comes first alphabetically, and the other head points to the exam node with the lowest score. Similarly, one tail points to the alphabetically last node, and the other tail points to the node with the highest score.
With these nodes and pointers, it is now easy to print out the list in forward order, or reverse order, by name or by score: just follow the correct pointers. For example, if you start at the exam with the highest score and follow the next lowest exam pointers, you will traverse the exams from highest score to lowest score.
When add_exam is called, a Node should be created and inserted into the correct place according to both the name pointers and the score pointers. Do not use any kind of sorting routine anywhere in your code! Use only basic C++ features (such as raw pointers) in your solution.
What to Submit
Submit just the file Exam_database.h, and nothing else. It should have this format (please fill in the header at the top with your specific info):
Explanation / Answer
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;
struct StudentData
{
int studentID;
string first_name;
string last_name;
int exam1;
int exam2;
int exam3;
int total;
char ch;
};
const int SIZE = 9;
const int INFO = 4;
// Function prototypes
void openInputFile(ifstream &, string);
void getTotal(StudentData[]);
void getGrade(StudentData[]);
void calcLowest(StudentData[], int &, int &, int &, int &, int[]);
void calcHighest(StudentData[], int &, int &, int &, int &, int[]);
void getAverage(StudentData[], int, double &, double &, double &, double &, double[]);
void getStd(StudentData[], double &, double &, double &, double &, double &, double &, double &, double &, double[]);
void print(StudentData[], int[], int[], double[], double[]);
void sort(StudentData[]);
int main()
{
// Variables
StudentData arr[SIZE];
int lowest1, lowest2, lowest3, lowest4; // Stores lowest exam scores
int highest1, highest2, highest3, highest4; // Holds highest exam scores
double average1 = 0, average2 = 0, average3 = 0, average4 = 0; // Represents average of each exam
double std1 = 0, std2 = 0, std3 = 0, std4 = 0; // Holds standard deviation for Exams 1-3 and Total
int lowest[INFO] = {};
int highest[INFO] = {};
double average[INFO] = {};
double standardDeviation[INFO] = {};
ifstream inFile;
string inFileName = "C:\Users\Lisa\Desktop\scores.txt";
// Call function to read data in file
openInputFile(inFile, inFileName);
// Read data into an array of structs
for(int count = 0; count < SIZE; count++)
{
inFile >> arr[count].studentID >> arr[count].first_name >> arr[count].last_name >> arr[count].exam1 >> arr[count].exam2 >> arr[count].exam3;
}
// Close input file
inFile.close();
// Get score total for each student
getTotal(arr);
// Determine grade for each student
getGrade(arr);
// Calculate lowest scores in each exam and total scores
calcLowest(arr, lowest1, lowest2, lowest3, lowest4, lowest);
// Calculate highest scores in each exam and total scores
calcHighest(arr, highest1, highest2, highest3, highest4, highest);
// Calculate average of each exam and the average of the total scores
getAverage(arr, SIZE, average1, average2, average3, average4, average);
// Calculate standard deviation of each category
getStd(arr, std1, std2, std3, std4, average1, average2, average3, average4, standardDeviation);
cout << " ";
// Print unsorted data
print(arr, lowest, highest, average, standardDeviation);
cout << " ";
// Sort data
sort(arr);
// Print sorted data
print(arr, lowest, highest, average, standardDeviation);
system("PAUSE");
return 0;
}
/**
* Pre-condition:
* Post-condition:
*/
void openInputFile(ifstream &inFile, string inFileName)
{
//Open the file
inFile.open(inFileName);
//Input validation
if (!inFile)
{
cout << "Error to open file." << endl;
cout << endl;
return;
}
}
/**
* Pre-condition:
* Post-condition:
*/
void getTotal(StudentData arr[])
{
for(int i = 0; i < SIZE; i++)
{
arr[i].total = arr[i].exam1 + arr[i].exam2 + arr[i].exam3;
}
}
/**
* Pre-condition:
* Post-condition:
*/
void getGrade(StudentData arr[])
{
for(int i = 0; i < SIZE; i++)
{
if(arr[i].total >= 270)
arr[i].ch = 'A';
else if(arr[i].total >= 240)
arr[i].ch = 'B';
else if(arr[i].total >= 210)
arr[i].ch = 'C';
else if(arr[i].total >= 180)
arr[i].ch = 'D';
else
arr[i].ch = 'F';
}
}
/**
* Pre-condition:
* Post-condition:
*/
void calcLowest(StudentData arr[], int &lowest1, int &lowest2, int &lowest3, int &lowest4, int lowest[])
{
int smallest = 0;
lowest1 = arr[0].exam1;
lowest2 = arr[0].exam2;
lowest3 = arr[0].exam3;
lowest4 = arr[0].total;
// Loop to determine lowest score from Exam1, 2, 3, and Total
for (int i = 0; i < SIZE; i++)
{
if (lowest1 > arr[i].exam1)
{
lowest1 = arr[i].exam1;
smallest = i;
}
if (lowest2 > arr[i].exam2)
{
lowest2 = arr[i].exam2;
smallest = i;
}
if (lowest3 > arr[i].exam3)
{
lowest3 = arr[i].exam3;
smallest = i;
}
if (lowest4 > arr[i].total)
{
lowest4 = arr[i].total;
smallest = i;
}
}
// Loop lowest values into an array of size 4
for(int index = 0; index < INFO; index++)
{
if(index == 0)
lowest[0] = lowest1;
else if(index == 1)
lowest[1] = lowest2;
else if(index == 2)
lowest[2] = lowest3;
else if(index == 3)
lowest[3] = lowest4;
else
cout << "Fail!" << endl;
}
}
/**
* Pre-condition:
* Post-condition:
*/
void calcHighest(StudentData arr[], int &highest1, int &highest2, int &highest3, int &highest4, int highest[])
{
int biggest = 0;
highest1 = arr[0].exam1;
highest2 = arr[0].exam2;
highest3 = arr[0].exam3;
highest4 = arr[0].total;
// Loop to determine highest score from Exam1, 2, 3, and Total
for (int i = 0; i < SIZE; i++)
{
if (highest1 < arr[i].exam1)
{
highest1 = arr[i].exam1;
biggest = i;
}
if (highest2 < arr[i].exam2)
{
highest2 = arr[i].exam2;
biggest = i;
}
if (highest3 < arr[i].exam3)
{
highest3 = arr[i].exam3;
biggest = i;
}
if (highest4 < arr[i].total)
{
highest4 = arr[i].total;
biggest = i;
}
}
// Loop highest values into an array of size 4
for(int index = 0; index < INFO; index++)
{
if(index == 0)
highest[0] = highest1;
else if(index == 1)
highest[1] = highest2;
else if(index == 2)
highest[2] = highest3;
else if(index == 3)
highest[3] = highest4;
else
cout << "Fail!" << endl;
}
}
/**
* Pre-condition:
* Post-condition:
*/
void getAverage(StudentData arr[], int size, double &average1, double &average2, double &average3, double &average4, double average[])
{
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
// Get sum of each category (Exam1, 2, 3, and Total)
for(int i = 0; i < SIZE; i++)
{
sum1 += arr[i].exam1;
sum2 += arr[i].exam2;
sum3 += arr[i].exam3;
sum4 += arr[i].total;
}
// Calculate average for each category
average1 += static_cast<double>(sum1)/size;
average2 += static_cast<double>(sum2)/size;
average3 += static_cast<double>(sum3)/size;
average4 += static_cast<double>(sum4)/size;
// Loop average values into an array of size 4
for(int index = 0; index < INFO; index++)
{
if(index == 0)
average[0] = average1;
else if(index == 1)
average[1] = average2;
else if(index == 2)
average[2] = average3;
else if(index == 3)
average[3] = average4;
else
cout << "Fail!" << endl;
}
}
/**
* Pre-condition:
* Post-condition:
*/
void getStd(StudentData arr[], double &std1, double &std2, double &std3, double &std4, double &average1, double &average2, double &average3, double &average4, double standardDeviation[])
{
double deviationSum1 = 0, deviationSum2 = 0, deviationSum3 = 0, deviationSum4 = 0;
for(int i = 0; i < SIZE; i++)
{
deviationSum1 += pow((arr[i].exam1 - average1), 2);
deviationSum2 += pow((arr[i].exam2 - average2), 2);
deviationSum3 += pow((arr[i].exam3 - average3), 2);
deviationSum4 += pow((arr[i].total - average4), 2);
}
std1 = sqrt(deviationSum1 / ((SIZE) - 1));
std2 = sqrt(deviationSum2 / ((SIZE) - 1));
std3 = sqrt(deviationSum3 / ((SIZE) - 1));
std4 = sqrt(deviationSum4 / ((SIZE) - 1));
// Loop average values into an array of size
for(int index = 0; index < INFO; index++)
{
if(index == 0)
standardDeviation[0] = std1;
else if(index == 1)
standardDeviation[1] = std2;
else if(index == 2)
standardDeviation[2] = std3;
else if(index == 3)
standardDeviation[3] = std4;
else
cout << "Fail!" << endl;
}
}
cout << " ";
}
/**
* Pre-condition:
* Post-condition:
*/
void sort(StudentData arr[])
{
StudentData temp;
for (int i = 0; i < (SIZE - 1); i++)
{
for (int j = i + 1; j < SIZE; j++)
{
if (arr[i].last_name > arr[j].last_name)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.