Starting from:

$30

ECSE 202– Assignment 6 Solved

Problem Description
 

The attached file, dbReader.c, contains most of the code for a simple program that builds a database of student records from data stored in two input files: NamesIDs.txt and marks.txt.  Once the database is built, a simple command interpreter is started that responds to the following list of commands:

 

LN List all the records in the database ordered by last name.

LI List all the records in the database ordered by student ID. FN Prompts for a name and lists the record of the student with the corresponding name.

FI Prompts for a name and lists the record of the student with the

Corresponding ID.

HELP Prints this list.

? Prints this list. Q Exits the program.

 

The input is case insensitive, e.g., ln, lN, and Ln will all be interpreted as LN.  

 

Examples
 

This program needs to be run from the command line (CMR, Terminal, Bourne shell, etc.).  Assume that the program resides in your eclipse workspace:

 

cd c:\Users\ferrie\eclipse\A6\Debug

C:\Users\ferrie\A6\Debug

 

Before running the program you need to copy NamesIDs.txt and marks.txt into this directory! To check, do a direectory listing:

 

C:\Users\ferrie\A6\Debugdir

 

Directory of C:\Users\ferrie\A6\Debug

 

2019-11-15  03:23 PM             1,064 NamesIDs.txt

2019-11-16  02:14 PM               392 sources.mk

2019-11-16  02:14 PM             1,009 makefile

2019-11-16  02:14 PM            14,444 A6-Fall-2019-Dev

2019-11-15  12:55 PM               231 objects.mk

2019-11-15  03:23 PM               150 marks.txt

2019-11-16  02:14 PM    <DIR          src

               6 File(s)         17,290 bytes

               1 Dir(s)  261,675,446,272 bytes free

 

To start the program:

 

C:\Users\ferrie\A6\DebugA6-Fall-2019-Dev NamesIDs.txt marks.txt

Building database…

Finished…

 

sdb: 

 

sdb: LN

 

Student Record Database sorted by Last Name

 

Dorethea Benes 
 
2583  
97
Teisha Britto  
 
2871  
68
Cristobal Butcher 
 
2969  
77
Billy Ennals  
 
2191  
82
Clarisa Freeze 
 
2135  
70
Dante Galentine 
 
1194  
89
Nia Stutes        
 
2872  
97
Suzi Tait          
 
2519  
82
Ciera Woolery 
 
1531  
81
 

sdb: LI

 

Student Record Database sorted by Student ID

 

Dante Galentine 
 
1194  
89
Ciera Woolery 
 
1531  
81
Clarisa Freeze 
 
2135  
70
Billy Ennals  
 
2191  
82
Suzi Tait          
 
2519  
82
Dorethea Benes 
 
2583  
97
Teisha Britto  
 
2871  
68
Nia Stutes        
 
2872  
97
Cristobal Butcher 
 
2969  
77
 

sdb: FN

Enter name to search:  Freeze

 

Student Name:            Clarisa Freeze

Student ID:                  2135

Total Grade:                70

 

sdb: FI

Enter ID to search: 2519

 

Student Name:
Suzi Tait
Student ID:      
2519
Total Grade: 
82
 

sdb: foo

Command not understood.

 

sdb: FN

Enter name to search: Fubar

There is no student with that name.

 

sdb: FI

Enter ID to search: 0

There is no student with that ID.

 

sdb: QUIT

Program terminated…

 

Approach:

 

To get the program to function, you need to implement the following functions:

 

bNode *addNode_Name(bNode *root, SRecord *Record); bNode *addNode_ID(bNode *root, SRecord *Record); bNode *makeNode(SRecord *data); void inorder(bNode *root); void search_Name(bNode *root, char *data);

void search_ID(bNode *root, int ID);

 

addNode_Name and addNode_ID are almost identical, the difference being in which quantity is used to order the B-Tree.  The same holds for search_Name and search_ID which implement a binary search on the B-Tree.  The remaining functions, inorder and makeNode, are identical in function to the Java code.  From the class notes and your prior experience with Java, you should be able to create the necessary B-Tree functions.  It is strongly suggested that you code and test these separately.  Once you have this worked out, you can add them to the main code and test each of the supported functions.  

 

The key difficulty in this assignment is understanding the function arguments and returns.  The key data structure is SRecord, which is the structure that holds the student record data.  Each time a new entry is read from the files, a new SRecord object is created and populated with data.  Looking more closely at the code, the SRecord object, Record, is a pointer to the object allocated

– exactly the same as is done in Java. Comparing the addNode functions to their Java counterparts, the root of the B-Tree is passed as an argument in the “C” version whereas it was an instance variable (global) in the Java code.  In “C” it’s usually advisable to avoid global variables is it makes the code less portable and error prone.  You will notice that addNode returns the root node.  When the B-Tree is empty, the first node allocated becomes the root node and is returned to the main program.  In all other instances, it simply returns the same value that it is called with.  In the Java makeNode, the single argument corresponds to the object being added to the tree (aBall); in the “C” version this corresponds to the second argument which is a pointer to SRecord, the structure holding the current record being added.   Aside from the function arguments and “C” pointer notation (the use of - in place or “.”), the “C” code is largely unchanged from the Java version.  The makeNode function is also similar (- in place of “.”)  and the use of malloc instead of new; inOrder is similarly straightforward - but must format the data as shown in the examples (hint: look at the printf statements in the FI and FN commands).

 

For this assignment you are to implement the non-recursive version of makeNode.

 

What is new here are the two search functions which must be implemented as binary search.  This ends up looking very similar to addNode with the exception that the matching node is returned instead of a new one added.  A few minutes with Google should provide any missing details.  There is one remaining detail, how to return a value from inside a recursion.  In Java we used an instance variable, essentially a global variable accessible from any instance of the recursion.  To avoid complications with pointer-pointers (which we will mostly avoid in this course), we define a static variable bNode *match (which is globally accessible like a Java instance variable) which is used to return a pointer to the matching record.

 

It is worth doing this assignment carefully, especially if this is your first time developing software.  This covers most of the key topics in Part II and is good preparation for your final exam.

 

More products