Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

#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;

            }

        }

    }

}