Define and implement a **template class ListNode** in a namespace solutions


###Task 1: Template

Define and implement a **template class ListNode** in a namespace **MYLIB** in a file ¡¤OrderedList.h¡¤, which has **a template data member** and **two pointers** that point to the previous ListNode object and next ListNode object. Define and implement necessary constructor(s) and other member functions in the file `OrderedList.h`.

Define and implement **a template class OrderedList** as a **container** in a file
`OrderedList.h` that can be used to store template data in a Doubly Linked List (DLL)
with nodes ordered by the data values from the smallest one to the biggest one.
Define two data members **head** and **tail** as pointers of **ListNode type**. They point to the
head and tail of a DLL.

Define a **nested class iterator** in the template class **OrderedList that can be used to
traversal the DLL**. It contains a data member of a ListNode pointer points to a node in
the DLL. Define **constructors**, overloading operators, such as ++ (pre-fix and post-fix
increment operator) that change an **iterator** points to the next node, * (dereference
operator) returns the data that the iterator points to, and != (not equal) to compare two
**iterators** in the class **iterator**.

Define a ***constructor, destructor** for the template class **OrderedList**.

Define a member function **begin()** for the template class **OrderedList** that returns an
iterator object points to the beginning of the DLL.

Define a member function **end()** for the template class **OrderedList** that returns an
iterator object points to the end of the DLL.

Define a member function **insert(const T &)** for the template class **OrderedList** that
take a template data as a parameter, insert a new node with the data value into the correct
location in the DLL.

Implement member functions for the template class **OrderedList** and nested class
**iterator** in the file `OrderedList.cpp`.

Define a class **Student** in a file `Student.h`, which contains student number, name and
email.

Define overloading insertion operator (<<) to print out data members of a Student object.
Define overloading extraction operator () to get input data to a Student object.
Define overloading comparison operator <= (or <) that compare two Students¡¯ objects by
their emails.

Define necessary member functions, such as constructors, etc., for the class Student.

Implement member functions, friend input operator, output operator for the class **Student**
in a file `Student.cpp`.

Download a file `task1Main.cpp` to test the DLL by different data (integers, doubles and
Student objects). You will get data from the keyboard, add them into the ordered DLL,
then print out results.

####Testing:

You can compile the task 1 by

CC ¨Co task1 task1Main.cpp Student.cpp

Then run the program like following (input data in Italics):

./task1

How many integers? *5*

Input an integer: *18*

Input an integer: *2*

Input an integer: *13*

Input an integer: *9*

Input an integer: *7*

Output integers:

2 7 9 13 18

How many doubles? *8*

Input a double: *17.5*

Input a double: *12.5*

Input a double: *11.3*

Input a double: *19.8*

Input a double: *18.4*

Input a double: *10.2*

Input a double: *21.4*

Input a double: *22.2*

Output doubles:

10.2 11.3 12.5 17.5 18.4 19.8 22.2 31.4

How many student records? *4*

Input number: *1234567*

Input name: *Cart Dong*

Input email: *[email protected]*

Input number: *1234568*

Input name: *Bob Smith*

Input email: *[email protected]*

Input number: *1234570*

Input name: *Mark Twain*

Input email: *[email protected]*

Input number: *1234571*

Input name: *Alice Montage*

Input email: *[email protected]*

Output students:
1234571, Alice Montage, [email protected]
1234568, Bob Smith, [email protected]
1234567, Cart Dong, [email protected]
1234570, Mark Twain, [email protected]

./task1 < input1.txt

**Note: Your program of task 1 should work on different testing data.**

###Task 2: file I/O and manipulations

Define a class **Account** in a file `Account.h` that contains data members **account number,
name, sex, date of birth (Date type), address and account balance**. Define
**constructor(s)**, overloading operators, include assignment operator (=), less than and
equals to operator (<=), insertion operator (<<), and extraction operator () for the class
**Account**. Define other necessary member functions.

Implement member functions and overloading operators for the class **Account** in a file
`Account.cpp`.

Define you own manipulator **Currency** that takes two integers as **width and precision**
for the output of currency in the file `Account.h`. Implement the manipulator **Currency** in
the file `Account.cpp`. The manipulator Currency will be used in the insertion operator for
Account balance. The manipulator Currency will set output currency symbol as ¡°$¡±, the
width of output currency, the precision of currency and filled by zeros (¡®0¡¯s) if the width
of currency is not long enough.

**Hint: Define fixed size char arrays instead of strings for some data members defined
in the class Account (such as name, address)**.

**Hint: Use iomanip and Currency that defined to generate formatted outputs for the
account records**.

Define a class **AccountManagement** in a file `AccountManagement.h` that contains a
data member of a container **OrderedList**, which will be used to store account records.
Define member functions:
+ loadData(const char *) will load Account record from a given text file and store
the records in the container of OrderedList.
+ displayData() will use iterator of OrderedList object to traversal the DLL and
display formatted output data of accounts.
+ saveData(const char *) will save the accounts from DLL to a given binary file.

####Testing:

Use CC to compile the source files by

CC ¨Co task2 task2main.cpp Account.cpp Date.cpp AccountManagement.cpp

and run the program by

./task2 accounts.txt accounts.dat

The output records on the screen can be found in a text file **output2.txt**.

**Note: Your solutions of task 2 should work on different testing data / files.**

###Task3: STL map and iterator

Use the source code files Date.h, Date.cpp, Account.h, and Account.cpp that used in task
2.

Define a class **AccountMap** in a file `AccountMap.h`. It contains a data member, which
is a **multimap** container that can be used to store Account records. The key of the
container is a char pointer of account¡¯s name. You will define a **comparison function
CompareCharArrays** to compare two char arrays in the file `AccountMap.h` for the
multimap object. For example:
```cpp
multimap<char *, Account, CompareCharArrays accounts;
```
Define a **destructor** for the class AccountMap to release dynamic memory allocated for
the container to avoid memory leaks.

Define a member function **loadData(const char *)** for the class AccountMap that load
account records from a given binary file (created in task 2), insert the records into the
multimap container.

Define a member function **displayData()** for the class AccountMap that use iterator of the
container to display all records.

Implement the member functions in a file `AccountMap.cpp`.

####Testing:

Use CC to compile the source files by

CC ¨Co task3 task3Main.cpp Account.cpp Date.cpp AccountMap.cpp

and run the program by

./task3 accounts.dat

The binary file `accounts.dat` is generated by your task 2. The outputs of this task look
like the results in a text file `output3.txt`.

**Note: Your solutions should work on different testing data / files.**
Powered by