Extended Case Study for maintaining the record order while insertion:
Program plan:
- Include the required header files in your program.
- Define a class “Personal” with the following functions.
- Define the default constructor “Personal()” that initializes the member variables.
- Define the constructor “Personal()” with arguments that initializes the member variables.
- Define the function “writeToFile()” to write a record to the output stream.
- Define the function “readFromFile()” to read a record from the input stream.
- Define the function “readKey()” to read SSN from console.
- Define the function “size()” to get the size of a record.
- Define the function “operator==()” to check the equality of the two records.
- Define the function “operator<()” to check the current record is less than passed record.
- Define the function “writeLegibly()” to write a record to the output stream.
- Define the function “operator<<()” to write a record to the output stream.
- Define the function “readFromConsole()” to read a record from the input stream.
- Define the function “operator>>()” to read a record from the output stream.
- Define a class “Student” with the following functions.
- Define the default constructor “Student()” that initializes the member variables.
- Define the constructor “Student()” with arguments that initializes the member variables.
- Define the function “writeToFile()” to write a record to the output stream.
- Define the function “readFromFile()” to read a record from the input stream.
- Define the function “size()” to get the size of a record.
- Define the function “writeLegibly()” to write a record to the output stream.
- Define the function “operator<<()” to write a record to the output stream.
- Define the function “readFromConsole()” to read a record from the input stream.
- Define the function “operator>>()” to read a record from the output stream.
- Define a class “
Database ” with the following functions.- Define the default constructor “Database()” that initializes the member variables.
- Define the function “run()” that processes the user wishes.
- Define the function “add()” to add a record to the database.
- Define the function “find()” to find a record in the database.
- Define the function “modify()” to modify the existing record.
- Define the function “operator<<()” to write the database to the output stream.
- Define the function “print()” to display the database.
- Define the function “main()”.
- Create a database for “Personal” and call the function “run()”.
This program Extends the case study for inserting records in sorted order.
Explanation of Solution
Program:
//personal.h.
#ifndef PERSONAL
#define PERSONAL
// Include the required header files
#include<iostream>
#include <fstream>
#include <cstring>
using namespace std;
//Personal class declaration.
class Personal
{
//Access Specifier.
public:
//constructor.
Personal();
//Argumented constructor.
Personal(char*,char*,char*,int,long);
//Function to write Person data to file.
void writeToFile(fstream&) const;
//Function to read Person data from file.
void readFromFile(fstream&);
//Function read SSN
void readKey();
//Function that returns the size of a record.
int size() const
{
//Sum all the fields length and return it.
return 9 + nameLen + cityLen + sizeof(year) + sizeof(salary);
}
/*Function to check the passed the record is equal to the current record.*/
bool operator==(const Personal& pr) const
{
//Compare the SSN's of current record and pr.
/*If they equal the function return true. otherwise it return false.*/
return strncmp(pr.SSN,SSN,9) == 0;
}
/*Function to check the passed record's SSN is less than the current record.*/
bool operator<(const Personal& pr) const
{
//Compare the SSN's of current record and pr.
/*If SSN's of current record less than pr.SSN then the function return true, otherwise return false*/
return strncmp(SSN,pr.SSN,9)<0;
}
//Access specifier.
protected:
//Declare variables.
const int nameLen, cityLen;
char SSN[10], *name, *city;
int year;
long salary;
//Function to write the record to the output stream.
ostream& writeLegibly(ostream&);
/*Overload the operator << to write to the output stream.*/
friend ostream& operator<<(ostream& out, Personal& pr)
{
//Call the member function to write.
return pr.writeLegibly(out);
}
//Function to read a record from the input stream.
istream& readFromConsole(istream&);
/*Overload the operator >> to read fromo the input stream.*/
friend istream& operator>>(istream& in, Personal& pr)
{
//Call the member function to read.
return pr.readFromConsole(in);
}
};
#endif
//personal.cpp
//Include the header files.
#include "personal.h"
//Constructor that fixes the length for name and city.
Personal::Personal() : nameLen(10), cityLen(10)
{
/*Create the character array for name and city with specified size.*/
name = new char[nameLen+1];
city = new char[cityLen+1];
}
//Constructor with input arguments.
Personal::Personal(char *ssn, char *n, char *c, int y, long s) :
nameLen(10), cityLen(10)
{
/*Create the character array for name and city with specified size.*/
name = new char[nameLen+1];
city = new char[cityLen+1];
//Copy the passed SSN
strcpy(SSN,ssn);
//Copy the name.
strcpy(name,n);
//Copy the city.
strcpy(city,c);
//store the year.
year = y;
//Store the salary.
salary = s;
}
//Function to write the record into the output stream.
void Personal::writeToFile(fstream& out) const
{
//Write the SSN.
out.write(SSN,9);
//Write the name.
out.write(name,nameLen);
//Write the city.
out.write(city,cityLen);
/*Convert the year into char* and write it on the output.*/
out.write(reinterpret_cast<const char*>(&year),sizeof(int));
/*Convert the salary into char* and write it on the output.*/
out.write(reinterpret_cast<const char*>(&salary),sizeof(int));
}
//Function to read a record from the input stream.
void Personal::readFromFile(fstream& in)
{
//Read the SSN
in.read(SSN,9);
//Read the name.
in.read(name,nameLen);
//Read the city.
in.read(city,cityLen);
//Convert the char* to int and store it in year.
in.read(reinterpret_cast<char*>(&year),sizeof(int));
//Convert the char* to int and store it in salary.
in.read(reinterpret_cast<char*>(&salary),sizeof(int));
}
//Function to read the SSN from the user.
void Personal::readKey()
{
//Declare the variables.
char s[80];
//Prompt the user.
cout << "Enter SSN: ";
//Read the SSN
cin.getline(s,80);
//copy the SSN.
strncpy(SSN,s,9);
}
//Function to write the record to the console.
ostream& Personal::writeLegibly(ostream& out)
{
//Terminate the strings.
SSN[9] = name[nameLen] = city[cityLen] = '\0';
//Write SSN, name, year, city, salary to the console.
out << "SSN = " << SSN << ", name = " << name<< ", city = " << city << ", year = " << year<< ", salary = " << salary;
//Return the output stream.
return out;
}
//Function to read a record from the console.
istream& Personal::readFromConsole(istream& in)
{
//Terminate the strings.
SSN[9] = name[nameLen] = city[cityLen] = '\0';
char s[80];
//Read SSN in variable 's'.
cout << "SSN: ";
in.getline(s,80);
//Copy the SSN from 's'.
strncpy(SSN,s,9);
//Read name in variable 's'.
cout << "Name: ";
in.getline(s,80);
//Copy the name from 's'.
strncpy(name,s,nameLen);
//Read the city in 's'.
cout << "City: ";
in.getline(s,80);
//Copy the city from 's'.
strncpy(city,s,cityLen);
//Read the year.
cout << "Birthyear: ";
in >> year;
//Read the salary.
cout << "Salary: ";
in >> salary;
in.ignore();
//Return the input stream.
return in;
}
//student.h
//Defining the header file.
#ifndef STUDENT
#define STUDENT
//Include the header file
#include "personal.h"
//Derive the class Student from Personal
class Student : public Personal
{
//Access specifier.
public:
//Constructor
Student();
//Constructor with arguments*/
Student(char*,char*,char*,int,long,char*);
//Function to write record to the output stream.
void writeToFile(fstream&) const;
//Function to read a Student record from input stream.
void readFromFile(fstream&);
//Function to get the size of the Student record.
int size() const
{
/*Call the base call method to find the record size.*/
return Personal::size() + majorLen;
}
//Access specifier.
protected:
//Declare variables.
char *major;
const int majorLen;
//Function to write the record to the output stream.
ostream& writeLegibly(ostream&);
/*Overaloaded operator << to write to the output stream.*/
friend ostream& operator<<(ostream& out, Student& sr)
{
//Call member function to write the record.
return sr.writeLegibly(out);
}
//Function to read a record from the input stream.
istream& readFromConsole(istream&);
//Overload the operator >> to read fromo the input stream.
friend istream& operator>>(istream& in, Student& sr)
{
//Call the member function to read.
return sr.readFromConsole(in);
}
};
#endif
//student.cpp
//Include the header files.
#include "student.h"
//Constructor to initialize the variables.
Student::Student() : majorLen(10)
{
//Call base call constructor for initialization.
Personal();
//Create the character array for the major.
major = new char[majorLen+1];
}
//Constructor to initialize all the variables. This constructor takes arguments*/
Student::Student(char *ssn, char *n, char *c, int y, long s, char *m) :
majorLen(11)
{
//Call baseclass constructor.
Personal(ssn,n,c,y,s);
//Create the character array for the major.
major = new char[majorLen+1];
//Copy the major.
strcpy(major,m);
}
//Function to write the record to the output stream.
void Student::writeToFile(fstream& out) const
{
/*Call base class method to write the name, city, SSN, year, salary.*/
Personal::writeToFile(out);
//Write the major.
out.write(major,majorLen);
}
//Function to read a record from the input stream.
void Student::readFromFile(fstream& in)
{
/*Call baseclass method to read the name,city, SSN, year,salary.*/
Personal::readFromFile(in);
//Read the major.
in.read(major,majorLen);
}
/*Function to write the student record to the output stream.*/
ostream& Student::writeLegibly(ostream& out)
{
/*Call baseclass method to write the name,city, SSN, year,salary.*/
Personal::writeLegibly(out);
major[majorLen] = '\0';
//Write the major.
out << ", major = " << major;
//Return the output stream.
return out;
}
//Function to read a record from the input stream console.
istream& Student::readFromConsole(istream& in)
{
/*Call base class method to read name, city, year, SSN, salary from console.*/
Personal::readFromConsole(in);
char s[80];
//Prompt the user to enter the major.
cout << "Major: ";
//read the major in variable 's'.
in.getline(s,80);
//Copy the major from 's'.
strncpy(major,s,9);
//Return the input stream.
return in;
}
//database.h
//Define the header file.
#ifndef DATABASE
#define DATABASE
//Create the template class.
template<class T>
//Create the class Database
class Database
{
//Access Specifier.
public:
//Construtor.
Database();
/*Function that displays the menu and proceeds as per user wish.*/
void run();
//Access Specifier.
private:
/* Declare variables*/
fstream database;
char fName[20];
//Function to display the database
ostream& print(ostream&);
//Function to add a record into the database.
void add(T&);
/*Function to find a particular record in the database.*/
bool find(const T&);
//Function to modify the record in the database.
void modify(const T&);
/*Overloaded operator << to print the given database to the output stream.*/
friend ostream& operator<<(ostream& out, Database& db)
{
//Call the method to print the database.
return db.print(out);
}
};
#endif
//database.cpp
#include <iostream>
#include <
#include "student.h"
#include "personal.h"
#include "database.h"
//No argumented constructor.
template<class T>
Database<T>::Database()
{
}
//Function to add a record into the database.
template<class T>
void Database<T>::add(T& d)
{
//Declare the variables.
T tmp;
int rCnt=0;
/*Create a vector to store the records after 'd' record.*/
vector<Personal> per;
//Declare the flag to indicate the record inserted.
int flag=0;
//Open the database.
database.open(fName,ios::in|ios::out|ios::binary);
/*Inifinite loop that runs until record is inserted in the database.*/
while (true)
{
//Read a record from the file.
tmp.readFromFile(database);
//Increment the record count.
rCnt++;
/*Check database is null. If so exit from the loop.*/
if (database.eof())
break;
//Check tmp exists the 'd'
if ((d<tmp))
{
//Go back to the start of the tmp.
database.seekp(-d.size(),ios::cur);
/*Infinite loop to read the record from tmp to database end.*/
while(true)
{
//Read a record.
tmp.readFromFile(database);
/*Check database is null. If so, return. */
if (database.eof())
break;
//Push the tmp into per.
per.push_back(tmp);
}
//Clear the pointers.
database.clear();
//Move to the file beginning.
database.seekg(0);
//Goto the violating record position.
database.seekp((rCnt-1)*d.size(),ios::beg);
//Write d in that position.
d.writeToFile(database);
/*Loop to write back the vector of records into database. */
for(int kk=0;kk<per.size();kk++)
{
//Write kkth record into database.
per.at(kk).writeToFile(database);
}
//Close the database.
database.close();
//Return statement.
return;
}
}
//If record is not inserted.
if(flag==0)
{
//Open the database.
database.open(fName,ios::in|ios::out|ios::binary);
//Clear the file pointers.
database.clear();
//Goto the file end.
database.seekp(0,ios::end);
//Write 'd' to the database.
d.writeToFile(database);
}
//Close the database.
database.close();
}
//Function to modify the existing record in the database.
template<class T>
void Database<T>::modify(const T& d)
{
//Declare the variable.
T tmp;
//Open the database.
database.open(fName,ios::in|ios::out|ios::binary);
//Read a record from the file.
tmp.readFromFile(database);
//Check database is null. If so exit from the loop.
if (database.eof())
{
//Close the database.
database.close();
//Return statement.
return;
}
//Read until tmp less than d.
while (tmp<d)
{
//Read the record from the database.
tmp.readFromFile(database);
}
//Check tmp matches d.
if (tmp == d)
{
//Read the record
cin >> tmp;
//Seek to the record's position.
database.seekp(-d.size(),ios::cur);
//Write the record to the file.
tmp.writeToFile(database);
//Close the database.
database.close();
//Exit from the function.
return;
}
//Close the database.
database.close();
//Print the message indicating record not found.
cout << "The record to be modified is not in the database\n";
}
//Function to find the given record in the database.
template<class T>
bool Database<T>::find(const T& d)
{
//Declare the variable.
T tmp;
//Open the database.
database.open(fName,ios::in|ios::binary);
//Read a record from the file.
tmp.readFromFile(database);
//Check database is null. If so exit from the loop.
if (database.eof())
{
//Close the database.
database.close();
//Record not found, so return false.
return false;
}
//Read until tmp less than d.
while (tmp<d)
{
//Read the record from the database.
tmp.readFromFile(database);
}
//Check tmp matches d.
if (tmp == d)
{
//Close the database.
database.close();
//Record found, so return true.
return true;
}
//Close the database.
database.close();
//Record not found, so return false.
return false;
}
template<class T>
ostream& Database<T>::print(ostream& out)
{
//Declare the variable.
T tmp;
//Open the database.
database.open(fName,ios::in|ios::binary);
//Infinite loop.
while (true)
{
//Read a record from the file.
tmp.readFromFile(database);
/*Check database is null. If so exit from the loop.*/
if (database.eof())
//Exit from the loop.
break;
//Write the record tmp to the output stream.
out << tmp << endl;
}
//Close the database.
database.close();
//Return the output stream.
return out;
}
//Function to process the user wish.
template<class T>
void Database<T>::run()
{
//Get the database filename.
cout << "File name: ";
cin >> fName;
//Declare variables.
char option[5];
T rec;
//Display menu.
cout << "1. Add 2. Find 3. Modify a record; 4. Exit\n";
//Get option.
cout << "Enter an option: ";
cin.getline(option,4);
//Infinite loop ends until user wishes to exit.
while (cin.getline(option,4))
{
//If user wants to add a record.
if (*option == '1')
{
//Get the record.
cin >> rec;
//Write the record into the database.
add(rec);
}
//If user wants to find a record,
else if (*option == '2')
{
//Read the SSN
rec.readKey();
//Display record is found or not.
cout << "The record is ";
//Check finding record returns false.
if (find(rec) == false)
cout << "not ";
cout << "in the database\n";
}
/*If user wants to modify a record in the database,*/
else if (*option == '3')
{
//Read the SSN of the record to be modified.
rec.readKey();
//Call the method modify()
modify(rec);
}
//If user enters wrong option.
else if (*option != '4')
//Print wrong input.
cout << "Wrong option\n";
//Otherwise exit from the loop.
else
//Return to the main function.
return;
//Display the database.
cout << *this;
//Ask the user for an option.
cout << "Enter an option: ";
}
}
//main() method.
int main()
{
/*Creating the database with Personal objects and call the function run().*/
Database<Personal>().run();
//To pause the console window.
system("pause");
return 0;
}
Output:
File name: student.txt
1. Add 2. Find 3. Modify a record; 4. Exit
Enter an option: 1
SSN: 456
Name: Mullen
City: Bangalore
Birthyear: 2015
Salary: 1000
SSN = 456, name = Mullen, city = Bangalore, year = 2015, salary = 1000
Enter an option: 1
SSN: 123
Name: Arlen
City: Delhi
Birthyear: 2000
Salary: 40000
SSN = 123, name = Arlen, city = Delhi, year = 2000, salary = 40000
SSN = 456, name = Mullen, city = Bangalore, year = 2015, salary = 1000
Enter an option: 2
Enter SSN: 456
The record is in the database
SSN = 123, name = Arlen, city = Delhi, year = 2000, salary = 40000
SSN = 456, name = Mullen, city = Bangalore, year = 2015, salary = 1000
Enter an option: 3
Enter SSN: 456
SSN: 456
Name: Mullen
City: Bangalore
Birthyear: 2005
Salary: 10000
SSN = 123, name = Arlen, city = Delhi, year = 2000, salary = 40000
SSN = 456, name = Mullen, city = Bangalore, year = 2005, salary = 10000
Enter an option: 4
Press any key to continue . . .
After running of the program, the file has been changed as follows,
student.txt:
Want to see more full solutions like this?
Chapter 1 Solutions
EBK DATA STRUCTURES AND ALGORITHMS IN C
- Function Implementation with Data Abstraction in C Programming 1. Create a new file and SAVE as MATHV1.H Define and Implement the following functions: int sum(int x, int y); - returns the computed sum of two numbers x and y int diff(int x, int y); - returns the computed difference of two numbers x and y. Make sure that the larger number is deducted by the smaller number to avoid a negative answer long int prod(int x, int y); - returns the computed product of two number x and y float quot(int x, int y); - returns the computed quotient of two numbers x and y. Make sure that the larger number is always the numerator and divided by the smaller number to avoid division by zero error. int mod(int x, int y); - returns the computed remainder of two numbers x and y using the modulo operator %2. Create another new file and save as MYTOOLS.H void center(int row, char str[]); /*centers text across the screen -calculate here for the center col using the formula col=(80-strlen(str))/2; -then use…arrow_forwardGive an example of how calling an inline function is different from calling a normal function in the background, and explain how the difference came to be. Also, give a specific example of how the change came about.arrow_forwardWrite a recursive function, displayFiles, that expects a pathname as an argument. The path name can be either the name of a file or the name of a directory. If the pathname refers to a file, its filepath is displayed, followed by its contents, like so: File name: file_path Lorem ipsum dolor sit amet, consectetur adipiscing elit... Otherwise, if the pathname refers to a directory, the function is applied to each name in the directory, like so: Directory name: directory_path File name: file_path1 Lorem ipsum dolor sit amet... File name: file_path2 Lorem ipsum dolor sit amet... ... # Put your code here import os #module used to interact with operating system def displayFiles(pathname): #recursive function that takes a pathname as argument if (os.path.isdir(pathname)): #checks if specified path (argument) is an existing directory #for item in os.listdir(pathname): for content in os.listdir(pathname): #gets the list of all files and directories in the directory and…arrow_forward
- Python only** define the following function: 1. This function must add a task to a checklist, setting its initial value to False. It will accept two parameters: the checklist object to add to, and the task name to add. In addition to adding the task, it must return the (now modified) checklist object that it was given. There is one issue, however: a task cannot be added to a checklist if the name requested is already being used by another task in that checklist. In that case, this function must print a specific message and must return None Define addTask with 2 parameters Use def to define addTask with 2 parameters Use a return statement Within the definition of addTask with 2 parameters, use return _ in at least one place. Do not use any kind of loop Within the definition of addTask with 2 parameters, do not use any kind of loop.arrow_forwardSUBJECT: OOPPROGRAMMING LANGUAGE: C++ ADD SS OF OUTPUT TOO. Create a class Student with attributes StudentName, Enrollment, semester, section, course MarksObtained and Grade. Write appropriate constructors, get and set functions for data members. Read data from file and print number of Grade occurrences in the following format: A grade: 2 B grade: 1 C grade: 3 D grade: 2 F grade: 3arrow_forwardQuestions P17 and P18 are related to the code skeleton of the function below. The function readPeople() below takes a string fname as an argument, which is the name of a file containing information about people on each line. The function returns a dictionary containing all of the information contained in the file. Each line of the file contains three items of information about a person: ID number, name, and age. The information stored in each dictionary entry should be the name and age of a person, and it should be associated with a key which is the ID number of that person. def readPeople(fname): infile = open(fname, "r") pDict = {} _______[P17]_______ ldat = l.split() _______[P18]_______ return(pDict) An example file is shown below.example.txt1234 Joe 242345 Jane 353456 Pete 22Assume that the ID numbers are unique for each person. Assume that the names contain only alpha-numeric characters and do not contain spaces. The value of [P17] Group of answer…arrow_forward
- Give an example of how the background process of invoking inline functions is different from that of calling a standard function, and explain how the difference came to exist. In addition, give an example of how the difference was brought about.arrow_forwardBuild a database of predefined function presets.arrow_forwardImplement a function writeEmpToFile that takes two arguments: a struct Employee pointer and a FILE *. It should write each field in order as an appropriate type. Note that you will probably want to write a length of the name before you write the characters of the name. By doing this, when you write the load function below, you can read the length of the string and use it to malloc a buffer of the proper size to hold the name. Because of the embedded name pointer, you CAN NOT write the Employee struct as a single struct. You will need to write it out field by field. You will want to write this as a binary file, not as a text file. Implement a SAVE command in your main loop that will save all the employees out to a file. The SAVE command should ask for a file name, similar to the way your FIND command asked for a name. Below is the work I have done so far that is required from the image but I have not been able to finish it and I need assistance with making the final changes that…arrow_forward
- create a c++ struct student which has student id, name and cgpa as members. create a static array of size 05 of type struct student. write a function input_record for taking record of 05 students. write a function display to print contents of array on output screen.arrow_forwardGiven a function uint16_t func(int16_t x) write a function callPassedFunc() that takes two arguments: • a pointer to func • a int16_t and returns a uint16_t. A call to callPassed Func() should have the same effect and return value as a call to func(), as in the example. Note that it should not matter what func() does. To test this question, write a few random function bodies for func(). For example: Test uint16_t func(int16_t x) { return x/2; //Only an example could be anything. } int16_t arg = 10; uint16_t directRetVal= func(arg); uint16_t indirect RetVal = callPassed Func(&func, arg); printf("%d\n", directRetVal == indirectRetVal); Result 1arrow_forwardGiven a list of parent-child relationships represented as a list of structs, where each struct contains a string field for the name of the parent and a string field for the name of the child, write a function in C that takes in a child's name as a parameter and returns an array of strings containing the names of all the ancestors of that child. The function should also return the number of ancestors found through an integer pointer.arrow_forward
- Database System ConceptsComputer ScienceISBN:9780078022159Author:Abraham Silberschatz Professor, Henry F. Korth, S. SudarshanPublisher:McGraw-Hill EducationStarting Out with Python (4th Edition)Computer ScienceISBN:9780134444321Author:Tony GaddisPublisher:PEARSONDigital Fundamentals (11th Edition)Computer ScienceISBN:9780132737968Author:Thomas L. FloydPublisher:PEARSON
- C How to Program (8th Edition)Computer ScienceISBN:9780133976892Author:Paul J. Deitel, Harvey DeitelPublisher:PEARSONDatabase Systems: Design, Implementation, & Manag...Computer ScienceISBN:9781337627900Author:Carlos Coronel, Steven MorrisPublisher:Cengage LearningProgrammable Logic ControllersComputer ScienceISBN:9780073373843Author:Frank D. PetruzellaPublisher:McGraw-Hill Education