Student database

Error at line 520
 avatar
unknown
c_cpp
4 years ago
20 kB
4
Indexable
// 21132_Shreyash Halge
// Code for OOPCG Lab / Assignment 2 / Version 2

// comments, display all, copy constructor

#include <bits/stdc++.h>    //Using standard library instead of including many libraries
#include <limits>   //For exception handling
#include <ctime>    //For getting current time and date
using namespace std;    

// exception handling for roll number
int inputRollno(string s)   //string s is used as different output is required in different cases
{
    while (true)
    {
        cout<<"\nEnter the roll number "+s;
        //try and catch is used for exception handling. the statements expected to give errors are written in try block
        try
        {
            string temp;
            cin >> temp;
            // checking if roll number is a digit
            for (char i : temp)
            {
                    if (!isdigit(i))
                    {
                        throw "Roll number must be a digit\n";
                        break;
                    }
            }
            stringstream obj(temp);
            int strnum;
            obj>>strnum;
            cout<<endl;
            return strnum;
            break;
        }
        // message thrown by throw is catched here
        catch (const char *msg)
        {
            cout << msg;
        }
    }

}

//print list of roll numbers of student in database
void printRNList(vector<int>v, int n)
{
    cout<<"List of students already present in database: [";
            for(int rn=0; rn<n; rn++)
            {
                if(v[rn] != 0){cout<<v[rn]<<", ";}  //If the value of roll number is other than 0(which is default value), print the roll number
            }
            cout<<"]"<<endl;
}

// this function is used to get empty spot(where there is no student) in the vector, studentObject array and personalInfoObject array 
int searchEmptySpot(vector<int> v, int n)
{
    for(int i=0; i<n; i++){
        if(v[i]==0){return i;}
    }
    return -1;  //it returns -1 if there is no empty spot
}

// this function gives the index of the roll no passed as argument
int getIndex(vector<int> v, int K)
{
    //using built in function for finding position
    auto it = find(v.begin(), v.end(), K);
 
    // If element was found
    if (it != v.end())
    {
        // calculating the index of K
        int index = it - v.begin();
        return index;
    }
    else {
        // If the element is not present in the vector
        return -1;
    }
}

// class personalInfo
class personalInfo
{
    // private members of class personalInfo
private:
    string address;
    string dob;
    string bloodGroup;
    string licence;
public:
    // public members of class personal info
    personalInfo();
    personalInfo(personalInfo &);
    ~personalInfo();
    // Student is made friend class of class personalInfo, so that student can use private members of this class
    friend class Student;
};

// default constructor of class personalInfo is defined here
personalInfo::personalInfo()
{
    address="abc, xyz";
    dob="00/00/0000";
    bloodGroup="X+";
    licence="ABC00000";
}

// copy constructor of class personalInfo is defined here
personalInfo::personalInfo(personalInfo &obj)
{
    //this is a pointer points to the object which invokes it
    this->address=obj.address;
    this->dob=obj.dob;
    this->bloodGroup=obj.bloodGroup;
    this->licence=obj.licence;
}

// destructor of class personalInfo is defined
personalInfo::~personalInfo()
{
    cout<<"Successfully deleted personal information of a student"<<endl;
}

// class student
class Student
{
    //private members of class student
private:
    string name;
    int rollno;
    string year;
    string division;
    string mobile;
public:
    // public members of class student
    Student();
    Student(Student&);
    ~Student();
    // static class variable and static class functions are declared and defined
    static int count;
    inline static void incrementCount(){Student::count++;}; //to increment count
    inline static void decrementCount(){Student::count--;}; //to decrement count
    inline static void showCount(){cout<<"Total number of students: "<<Student::count;} //to show count

    //create method is used to create a student in database
    void create(personalInfo &obj, int rolno)
    {
        cout<<"---------------------------------"<<endl;
        rollno=rolno;
        cout<<"Enter the details of the new student:";
        cout<<"\nNAME : ";
        cin.ignore();
        getline(cin, name);     //inline function is used to get full name
        cout<<"YEAR : ";
        cin>>year;
        cout<<"DIVISION: ";
        cin>>division;

        // exception handling for mobile number
        while (true)
        {
            cout<<"PHONE NUMBER: ";
            // try throw catch is used
            try
            {
                string temp;
                cin >> temp;
                // telephone number should be 10 digits long
                if (temp.length() != 10)
                {
                    throw "Telephone number must be 10 characters long\n";
                }
                // it should be numeric
                for (char i : temp)
                {
                    if (!isdigit(i))
                    {
                        throw "Telephone no must be a digit\n";
                        break;
                    }
                }
                mobile = temp;
                break;
            }
            catch (const char *msg)
            {
                cout << msg;
            }
        }

        cout<<"ADDRESS : ";
        cin.ignore();
        getline(cin, obj.address);      //getline is used to get complete address
        
        // Code to find today's date
        time_t ttime = time(nullptr);
        tm *local_time = localtime(&ttime);
        int year = 1900 + local_time->tm_year;
        int month = 1 + local_time->tm_mon;
        int day = local_time->tm_mday;
        string todayDate = to_string(day) + '/' + to_string(month) + '/' + to_string(year);

        // exception handling for date of birth
        while (true)
        {
            // try throw catch is used for error handling
            try
            {
                cout << "DATE OF BIRTH: (dd/mm/yyyy): ";
                string temp;
                cin >> temp;
                int dayInt;
                int monthInt;
                int yearInt;
                stringstream dayStream, monthStream, yearStream; // used to convert string into an int
                dayStream << temp.substr(0, 2);
                dayStream >> dayInt;
                monthStream << temp.substr(3, 2);
                monthStream >> monthInt;
                yearStream << temp.substr(6, 4);
                yearStream >> yearInt;
                // throw statements in various situations
                if (temp[2] != '/' || temp[5] != '/')
                {
                    throw "Invalid birth date format";
                }
                else if (yearInt > year)
                {
                    throw "The date you entered has not came yet. ;p";
                }
                else if (yearInt == year && monthInt > month)
                {
                    throw "The date you entered has not came yet. ;p";
                }
                else if (monthInt == month && dayInt > day && yearInt == year)
                {
                    throw "The date you entered has not came yet. ;p";
                }
                obj.dob = temp;
                break;
            }
            catch (const char *msg)
            {
                cout << msg << endl;
            }
        }
    
        // exception handling for blood group
        while (true)
        {
            cout<<"BLOOD GROUP: ";
            try
            {
                string temp;
                cin >> temp;
                // it only accepts these blood groups
                if (temp=="A+" || temp=="B+" || temp=="O+" || temp=="A-" || temp=="B-" || temp=="O-"  || temp=="AB+" || temp=="AB-")
                {
                    obj.bloodGroup = temp;
                    break;
                }
                else
                {
                    throw "Enter a valid blood group. e.g. A+ or AB-\n";
                }
                break;
            }
            catch (const char *msg)
            {
                cout << msg;
            }
        }

        cout<<"LICENCE NUMBER : ";
        cin>>obj.licence;
        cout<<"---------------------------------"<<endl;
        incrementCount();
    }

    // display method is used to display the student with given roll number
    void display(personalInfo &obj)
    {
        cout<<"---------------------------------"<<endl;
        cout<<"NAME OF STUDENT : "<<name<<endl;
        cout<<"ROLL NO : "<<rollno<<endl;
        cout<<"YEAR : "<<year<<endl;
        cout<<"DIVISION : "<<division<<endl;
        cout<<"PHONE NUMBER : "<<mobile<<endl;
        cout<<"ADDRESS OF STUDENT : "<<obj.address<<endl;
        cout<<"DATE OF BIRTH : "<<obj.dob<<endl;
        cout<<"BLOOD GROUP : "<<obj.bloodGroup<<endl;
        cout<<"LICENCE NUMBER : "<<obj.licence<<endl;
        cout<<"---------------------------------"<<endl;
    }

    // update method is used to update the data of student already present in database
    void update(personalInfo &obj, int rolno)
    {
        create(obj, rolno);     //code of create function is reused
        cout<<"Student data updated successfully."<<endl;
    }

    // delete method is used to delete a student from the database
    void deleteStudent(personalInfo &obj)
    {
        obj.~personalInfo();    // student is friend class of personalInfo, therefore we can call destructor for personalInfo using the object of student class
        this->~Student();
    }
    

};

// when we write this, the memory is allocated to stati variable count and is set to 0 for default
int Student::count;

// default constructor of class student
Student::Student()
{
    name="Name";
    rollno=0;
    year="0";
    division="SE0";
    mobile="0000000000";
}

// copy constructor of class student
Student::Student(Student &obj)
{
    cout<<"here"<<endl;
    // this is a pointer points to the object which invokes it
    this->name=obj.name;
    this->year=obj.year;
    this->division=obj.division;
    this->rollno=obj.rollno;
    this->mobile=obj.mobile;
}

// destructor of class student
Student::~Student()
{
    cout<<"Succesfully deleted student."<<endl;
}


// driver code 
int main()
{
    //Welcome message for the user
    cout<<"Welcome to the student database portal!\nNow you can easily store and manage data of all your students.\n";

    // taking input for maximum number of students in database
    cout<<"Enter the maximum number of students in your database: ";
    int n;
    cin>>n;

    // new is dynamic memory allocation operator, studentObject is pointer of type student and it is a array of object of size n
    Student *studentObject=new Student[n];
    // new is dynamic memory allocation operator, personalInfoObject is pointer of type student and it is a array of object of size n
    personalInfo *personalInfoObject=new personalInfo[n];
    // vector rollNoList stores the roll numbers of students in the database
    vector <int> rollNoList(n);
        
    // while loop is used to perform operations till the user enters 'n'
    while(true)
    {
        // information of program
        cout<<"This program allows you to:\n1. Create a student\n2. Read the data previously stored.\n3. Show all students in database.\n4. Update data of existing student.\n5. Delete an existing student.\n6. Copy constructor.\n";

        cout<<"\nEnter the choice for respective operation which you want to perform(1 to 6): ";

        //error handling for choice
        string temp;
        cin>>temp;
        stringstream obj(temp); //used to convert string to int
        int choice;
        obj>>choice;
        
        //choice for creating student
        if(choice==1)
        {
            // Printing the list of students already present in database
            printRNList(rollNoList, n);

            // Taking roll number of student as input
            
            int rollno = inputRollno("of the student you want to add: ");
            
            // When getIndex returns -1, it means that the roll number is not present. So when getIndex!=-1, it means that roll number is already present in list
            if(getIndex(rollNoList, rollno) !=-1)
            {
                cout<<"This roll number is already present. Try other roll number of update the student."<<endl;
            }
            else
            {
                // Search empty spot returns the index in array such that there is no student on that index. It returns -1 if there is no empty spot
                int i = searchEmptySpot(rollNoList, n);
                
                if(i==-1){cout<<"Database is Full."<<endl;}
                else{
                    rollNoList[i]=rollno;
                    studentObject[i].create(personalInfoObject[i], rollno);
                    Student::incrementCount();  //inline static function is used to increment count of number of students in database
                }
            }
            
        }
        // choice for displaying student with given roll numbrer
        else if(choice==2)
        {
            // Printing the list of students already present in database
            printRNList(rollNoList, n);
            
            // Taking roll number of student as input
            int rollno = inputRollno("of the student you want to dispay: ");
                        
            // When getIndex returns -1, it means that the roll number is not present. So when getIndex!=-1, it means that roll number is already present in list
            int i=getIndex(rollNoList, rollno);
        
            if(i==-1)
            {
                cout<<"Student with the given roll number do not exist in database. Enter another roll number or add a new student with given roll number."<<endl;
            }
            else
            {
                studentObject[i].display(personalInfoObject[i]);
            }            
            
        }
        // choice to show all students in database
        else if(choice==3)
        {
            for(int i=0; i<n; i++)
            {
                //if the roll number of student is not zero then data of that student is printed
                if(rollNoList[i]!=0)
                {
                    studentObject[i].display(personalInfoObject[i]);
                }
            }
        }
        // choice for updating the student information
        else if(choice==4)
        {
            // Printing the list of students already present in database
            printRNList(rollNoList, n);
            
            // Taking roll number of student as input
            int rollno= inputRollno("of student you want to update: ");
                        
            // When getIndex returns -1, it means that the roll number is not present. So when getIndex!=-1, it means that roll number is already present in list
            int i=getIndex(rollNoList, rollno);

            if(i ==-1)
            // if roll number is not present in the list
            {
                cout<<"Student with the given roll number do not exist in database. Enter another roll number or add a new student with given roll number."<<endl;
            }
            else
            {
                // display the previous details
                cout<<"Here are the details you entered previously for this roll number:"<<endl;
                studentObject[i].display(personalInfoObject[i]);

                // input new roll number to be given
                int rollNo=inputRollno("you want to give to the student: ");
                
                // updating student
                studentObject[i].update(personalInfoObject[i], rollNo);
                rollNoList[i]=rollNo;
            }
            
        }
        // choice for deleting the student
        else if(choice==5)
        {
            // Printing the list of students already present in database
            printRNList(rollNoList, n);

            // Taking roll number of student as input
            int rollno= inputRollno("of student you want to delete: ");
            
            // When getIndex returns -1, it means that the roll number is not present. So when getIndex!=-1, it means that roll number is already present in list
            int i=getIndex(rollNoList, rollno);
            
            if(i ==-1)
            // if student is not present in database
            {
                cout<<"Student with the given roll number do not exist in database. Enter another roll number or add a new student with given roll number."<<endl;
            }
            else
            {
                studentObject[i].deleteStudent(personalInfoObject[i]);
                rollNoList[i]=0;
                Student::decrementCount();      //inline static function is used
            }
        }
        // choice for copying a student
        else if(choice==6) // Copy Constructor
		{
            // Student obj1;
            // personalInfo obj2;
            printRNList(rollNoList, n);
            int rn=inputRollno("of student you want to copy: ");
            int i= getIndex(rollNoList, rn);
            int empty=searchEmptySpot(rollNoList, n);
            cout<<empty<<endl;
            if(i==-1)
            // if student is not present in database
            {
                cout<<"Roll number you entered is not present in the database."<<endl;
            }
            else{
                int roln= inputRollno("you want to give to the copied student: "); 
                // studentObject[i].copy(personalInfoObject[i]);
			    Student studentObject[empty](studentObject[i]);                 //invoking copy constructor of student info to copy contents from object i to 1
                
                
			    personalInfo personalInfoObject[empty](personalInfoObject[i]);		 //invoking copy constructor of personal info to copy contents from object i to 2
                rollNoList[empty]=roln;
			    cout<<"\nCopy Constructor is called. The student is copied.\n";
                // studentObject[empty].display(personalInfoObject[empty]);
            }
            
        }
        // exception handling for choice
        else
        {
            cout<<"The choice you entered is invalid. Enter a choice 1 to 6."<<endl;
        }

            cout<<"\n---------------------------------";
            cout<<"\nDo you want to continue?(y/n): ";
            string contin;
            cin>>contin;
            cout<<"---------------------------------\n";
            if(contin=="n" || contin=="N")
            {
                // delete is used to delete arrays personalInfoObject and studentObject
                delete [] studentObject;
                delete [] personalInfoObject;
                break;
            }
            else{continue;}
    }

    
    cout<<"\nThank You for using the program.\n";
return 0;
}
Editor is loading...