User Tools

Site Tools


haas:fall2015:data:projects:dls0

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
haas:fall2015:data:projects:dls0 [2015/11/08 13:57] – [In inc/list.h] wedgehaas:fall2015:data:projects:dls0 [2015/11/16 15:55] (current) – [Errata] wedge
Line 11: Line 11:
 This section will document any updates applied to the project since original release: This section will document any updates applied to the project since original release:
  
-  * __revision #__<description> (DATESTRING)+  * __revision 1__unit-cpstack was reporting incorrect status codes (20151116) 
 +    * on test 7, a copy of a populated stack, the unit test was incorrectly expecting "DLS_EMPTY | DLS_SUCCESS | DLL_EMPTY | DLL_SUCCESS", instead of "DLS_SUCCESS | DLL_SUCCESS" (FIXED)
  
 =====Objective===== =====Objective=====
Line 135: Line 136:
  
 As indicated, with stacks, suddenly a lot of the underlying details start to be abstracted away. And the total number of unique functions being created also tends to decrease. As indicated, with stacks, suddenly a lot of the underlying details start to be abstracted away. And the total number of unique functions being created also tends to decrease.
 +
 +For our stack implementation, just as with our doubly-linked list implementation, we will make use of the double pointer in order to achieve passing parameters by address.
 +
 +This is necessary so that we can free up the return value of **push()** and **pop()** to be used for status (ie look out for stack overflows and underflows).
 +
 +**peek()** and **isempty()** are being implemented as an exercise to aid in your understanding of stacks. Again, avoid their use except is a means of convenience (or to further optimize your code). The general rule of thumb is that the use of **peek()** and **isempty()** should result in shortening your code in a clear or clever way.
 +
 +If you cannot think of how to solve a problem without the use of **peek()**/**isempty()**, that is a strong clue that you shouldn't be using them.
 +
 +Also, while nothing is stopping you from doing so, the idea here is that things like **size** and the underlying list **qty** in stack transactions will **NOT** be accessed outside of the **push()** and **pop()** functions. Just like my warnings about using **qty** in your list solutions-- do not consider **size** as a variable for your general use (**push()** will probably be the only place it is used).
 +
 +In object-oriented programming, both **size** and **qty** would be **private** member variables of their respective classes, unable to be used by anything other than their respective member functions.
 ====inc/data.h==== ====inc/data.h====
 With stacks, the following new information has been added to **data.h**: With stacks, the following new information has been added to **data.h**:
Line 154: Line 167:
 </code> </code>
  
-__**Technical note**__: Due to space constraints, you'll notice **DLS_DEFAULT_FAIL** is not a unique number, but a combination of two previous values. This is made possible by using two values that should never be regularly occurring, and especially not in combination: **DLN_DEFAULT_FAIL** and **DLL_DEFAULT_FAIL**. I had to employ a similar trick with queues, which you'll see in next week's project.+__**Technical note**__: Due to space constraints (there are 9 stack status codes), you'll notice **DLS_DEFAULT_FAIL** is not a unique number, but a combination of two previous values. This is made possible by using two values that should never be regularly occurring, and especially not in combination: **DLN_DEFAULT_FAIL** and **DLL_DEFAULT_FAIL**. I had to employ a similar trick with queues, which you'll see in next week's project.
  
-====In inc/stack.h==== 
  
-<code c 1> 
-#ifndef _STACK_H 
-#define _STACK_H 
- 
-#include "data.h"                    // helpful #defines 
-#include "list.h"                    // stack relies on list to work 
-                                     // (which relies on node) 
- 
-struct stack { 
-    List             *data;          // pointer to list containing data 
-    Node             *top;           // pointer to node at top of stack 
-    uli               size;          // maximum stack size (0 implies 
-};                                   // an unbounded stack) 
-typedef struct stack  Stack;         // because we deserve nice things 
- 
-code_t mkstack(Stack **, uli);       // create new stack (of max size) 
-code_t cpstack(Stack *, Stack **);   // create a copy of an existing stack 
-code_t rmstack(Stack **);            // clear and de-allocate an existing stack 
- 
-code_t push(Stack **, Node * );      // put new node on top of stack 
-code_t pop (Stack **, Node **);      // get (and disconnect) top node off stack 
- 
-code_t peek(Stack *,  Node **);      // get (don't disconnect) top node 
-code_t isempty(Stack *);             // determine if the stack is empty or not 
-#endif 
-</code> 
- 
-For our stack implementation, just as with our doubly-linked list implementation, we will make increased used of the double pointer in order to achieve passing parameters by address. 
- 
-This is necessary so that we can free up the return value of **push()** and **pop()** to be used for status (ie look out for stack overflows and underflows). You'll note the extensive deployment of the **code_t** type as the return value for all the stack functions (instead of lengthily having to type out "unsigned short int" in each case). 
- 
-**peek()** and **isempty()** are being implemented as an exercise to aid in your understanding of stacks. Again, avoid their use except is a means of convenience (or to further optimize your code). The general rule of thumb is that the use of **peek()** and **isempty()** should result in shortening your code in a clear or clever way. 
- 
-If you cannot think of how to solve a problem without the use of **peek()**/**isempty()**, that is a strong clue that you shouldn't be using them. 
- 
-Also, while nothing is stopping you from doing so, the idea here is that things like **size** and the underlying list **qty** in stack transactions will **NOT** be accessed outside of the **push()** and **pop()** functions. Just like my warnings about using **qty** in your list solutions-- do not consider **size** as a variable for your general use (**push()** will probably be the only place it is used). 
- 
-In object-oriented programming, both **size** and **qty** would be **private** member variables of their respective classes, unable to be used by anything other than their respective member functions. 
-====list library==== 
-Againt, in **src/list/**, you are to add support for **qty** so that, just as the list's **first** and **last** maintain an accurate positioning of their respective aspects of the list, **qty** maintains a count of the total number of nodes still in the list. 
- 
-===display() enhancements=== 
-You are also to implement 4 additional modes to the display() function.  
- 
-This means you'll need to expand the current modulus divide by 4 to one of 8. 
- 
-The current modes are as follows: 
- 
-<code c> 
-//       modes: 0 display the list forward, no positional values 
-//              1 display the list forward, with positional values 
-//              2 display the list backwards, no positional values 
-//              3 display the list backwards, with positional values 
-</code> 
- 
-The new modes are (you may want to add these comments to your **display.c** file): 
- 
-<code c> 
-//          4 display the list forward, no positional values, in ASCII 
-//          5 display the list forward, with positional values, in ASCII 
-//          6 display the list backwards, no positional values, in ASCII 
-//          7 display the list backwards, with positional values, in ASCII 
-</code> 
- 
-What has changed? In modes 4-7, instead of displaying the numeric value contained in the node's data element, you are instead to represent it as its ASCII character. 
- 
-For example, if there was a numeric 65 stored in the node , in the mode 4-7 representation, an 'A' should instead be displayed. 
- 
-==display() output examples based on mode== 
-Let's say we have a list with the following elements: 
- 
-  first -> 51 -> 49 -> 51 -> 51 -> 55 -> NULL 
- 
-==mode 0: forward, no positions, as numbers== 
-<cli> 
-51 -> 49 -> 51 -> 51 -> 55 -> NULL 
-</cli> 
- 
-==mode 1: forward, with positions, as numbers== 
-<cli> 
-[0] 51 -> [1] 49 -> [2] 51 -> [3] 51 -> [4] 55 -> NULL 
-</cli> 
- 
-==mode 4: forward, no positions, in ASCII== 
-<cli> 
-'3' -> '1' -> '3' -> '3' -> '7' -> NULL 
-</cli> 
- 
-==mode 5: forward, with positions, in ASCII== 
-<cli> 
-[0] '3' -> [1] '1' -> [2] '3' -> [3] '3' -> [4] '7' -> NULL 
-</cli> 
- 
- 
-====List Library unit tests==== 
-As a result of the required changes to **display()** and the incorporation of **qty**, pertinent list unit tests will be enhanced, so you can make use of them to ensure implementation compliance. 
- 
-The pertinent list unit tests have been updated. You only need to focus on the following for the list library (remaining list functions need no changes): 
- 
-  * unit-mklist.c 
-  * unit-append.c 
-  * unit-insert.c 
-  * unit-obtain.c 
-  * unit-display.c 
  
-The **verify-list.sh** script has been updated to display just these updated unit tests. 
  
 ====stack library==== ====stack library====
Line 280: Line 187:
   * **DLS_CREATE_FAIL** - memory allocation failed (considered in error)   * **DLS_CREATE_FAIL** - memory allocation failed (considered in error)
   * **DLS_NULL** - result is NULL (probably in error)   * **DLS_NULL** - result is NULL (probably in error)
-  * **DLS_EMPTY** - result is an empty list (may or may not be in error)+  * **DLS_EMPTY** - result is an empty list/stack (may or may not be in error)
   * **DLS_OVERFLOW** - operation exceeds allocated size of list (may be considered an error)   * **DLS_OVERFLOW** - operation exceeds allocated size of list (may be considered an error)
   * **DLS_UNDERFLOW** - operation cannot proceed due to lack of data (may be considered an error)   * **DLS_UNDERFLOW** - operation cannot proceed due to lack of data (may be considered an error)
   * **DLS_DEFAULT_FAIL** - default state of unimplemented functions (default error)   * **DLS_DEFAULT_FAIL** - default state of unimplemented functions (default error)
-  * **DLS_FAIL** - some error occurred+  * **DLS_ERROR** - some error occurred 
 +  * **DLS_INVALID** - invalid state (pointer to stack does not exist)
  
 For example, in the case of "DLS_CREATE_FAIL", there are actually a total of three states raised: For example, in the case of "DLS_CREATE_FAIL", there are actually a total of three states raised:
-  * DLS_FAIL (a problem has occurred)+  * DLS_ERROR (a problem has occurred)
   * DLS_CREATE_FAIL (a problem has occurred when using malloc())   * DLS_CREATE_FAIL (a problem has occurred when using malloc())
   * DLS_NULL (no memory allocated, so stack cannot be anything but NULL)   * DLS_NULL (no memory allocated, so stack cannot be anything but NULL)
  
-ALL THREE states must be returned from the function in question should such an occurrence take place+ALL THREE states must be returned from the function in question should such an occurrence take place (in additionvarious underlying list and node status codes may be present as well-- see the unit tests for more information).
- +
-It is also intended that when handling stack status codesany list status codes will also be present (that is why **code_t** is a short int, whereas the list status code was a char-- we have twice the amount of bytes for status code storage now-- lower 8-bits for list, upper 8-bits for stack). +
 ====Stack library unit tests==== ====Stack library unit tests====
 In **testing/stack/unit/**, you will find these files: In **testing/stack/unit/**, you will find these files:
Line 333: Line 238:
 It is also highly recommended to undertake as it will give you further experience working with these concepts. It is also highly recommended to undertake as it will give you further experience working with these concepts.
  
-Note this is a DIFFERENT approach than you would have taken in the program with sll2- you're to use stack functionality to aid you with the heavy lifting. While you will still make use of list functionality for grabbing the initial input, the actual palindrome comparison processing needs to heavily involve stacks.+Note this is a DIFFERENT approach than you would have taken in the program with sll2 and dll1- you're to use stack functionality to aid you with the heavy lifting. You should not be directly using any list functions in the implementation of this solution, except perhaps in the initial building of the input string (otherwise use the stackand let the stack use the list functions).
  
 =====Expected Results===== =====Expected Results=====
-To assist you in verifying a correct implementation, a fully working implementation of the node, list, and stack libraries should resemble the following (when running the respective verify script): +To assist you in verifying a correct implementation, you can check your implementation against the results of my implementation:
- +
-====node library==== +
-Here is what you should get for node: +
- +
-<cli> +
-lab46:~/src/data/dls0$ bin/verify-node.sh  +
-==================================================== +
-=    Verifying Doubly-Linked Node Functionality    = +
-==================================================== +
-  [mknode] Total:   5, Matches:   5, Mismatches:   0 +
-  [cpnode] Total:   6, Matches:   6, Mismatches:   0 +
-  [rmnode] Total:   2, Matches:   2, Mismatches:   0 +
-==================================================== +
- [RESULTS] Total:  13, Matches:  13, Mismatches:   0 +
-==================================================== +
-lab46:~/src/data/dls0$  +
-</cli> +
- +
-As no coding changes were needed in the node library, these results should be identical to that of a fully functioning node implementation from the **dll0** project. +
- +
-====list library==== +
-Here is what you should get for list: +
- +
-<cli> +
-lab46:~/src/data/dls0$ bin/verify-list.sh  +
-==================================================== +
-=    Verifying Doubly-Linked List Functionality    = +
-==================================================== +
-  [mklist] Total:  15, Matches:  15, Mismatches:   0 +
-  [append] Total:  40, Matches:  40, Mismatches:   0 +
-  [insert] Total:  41, Matches:  41, Mismatches:   0 +
-  [obtain] Total:  70, Matches:  70, Mismatches:   0 +
- [display] Total:  28, Matches:  28, Mismatches:   0 +
-==================================================== +
- [RESULTS] Total: 194, Matches: 194, Mismatches:   0 +
-==================================================== +
-lab46:~/src/data/dls0$  +
-</cli> +
- +
-Due to the re-introduction of **qty** into list (impacting actions performed by **mklist()**, **append()**, **insert()**, and **obtain()**), along with feature additions to **display()**, those functions saw additional tests performed, so our original max total of **102** from **dll0** has now changed to **140** (ie various **qty** and **display()**-related tests adding to the previous total). +
- +
-Remember though- aside from the minor change of adding **qty** and enhancing **display()**, all remaining list functions need no change (and **mklist()/append()/insert()/obtain()** remained largely unchanged).+
  
 ====stack library==== ====stack library====
Line 384: Line 247:
  
 <cli> <cli>
-lab46:~/src/data/dls0$ bin/verify-stack.sh +lab46:~/src/data/dls0$ make check 
-=================================================== +====================================================== 
-  Verifying Doubly-Linked Stack Functionality   +   Verifying Doubly-Linked Stack Functionality     
-=================================================== +====================================================== 
-[mkstack] Total:   6, Matches:   6, Mismatches:   0 +   [mkstack] Total:   9, Matches:   9, Mismatches:   0 
-[cpstack] Total:  12, Matches:  12, Mismatches:   0 +      [push] Total:  18, Matches:  18, Mismatches:   0 
-[rmstack] Total:   6, Matches:   6, Mismatches:   0 +       [pop] Total:  19, Matches:  19, Mismatches:   0 
-   [push] Total:  30, Matches:  30, Mismatches:   0 +   [cpstack] Total:  11, Matches:  11, Mismatches:   0 
-    [pop] Total:  25, Matches:  25, Mismatches:   0 +      [peek] Total:  20, Matches:  20, Mismatches:   0 
-   [peek] Total:  37, Matches:  37, Mismatches:   0 +   [isempty] Total:   5, Matches:   5, Mismatches:   0 
-[isempty] Total:  13, Matches:  13, Mismatches:   0 +   [rmstack] Total:  10, Matches:  10, Mismatches:   0 
-=================================================== +====================================================== 
-[RESULTS] Total: 129, Matches: 129, Mismatches:   0 +   [RESULTS] Total:  92, Matches:  92, Mismatches:   0 
-=================================================== +====================================================== 
 lab46:~/src/data/dls0$  lab46:~/src/data/dls0$ 
 </cli> </cli>
-=====Submission Criteria===== +=====Submission===== 
-To be successful in this project, the following criteria must be met:+{{page>haas:fall2015:common:submitblurb#DATA&noheader&nofooter}}
  
-  * Project must be submit on time, by the posted deadline. 
-    * Late submissions will lose 25% credit per day, with the submission window closing on the 4th day following the deadline. 
-  * All code must compile cleanly (no warnings or errors) 
-    * all requested functions must be implemented in the related library 
-    * all requested functionality must conform to stated requirements (either on this project page or in comment banner in source code files themselves). 
-  * Executed programs must display in a manner similar to provided output 
-    * output formatted, where applicable, must match that of project requirements 
-  * Processing must be correct based on input given and output requested 
-  * Output, if applicable, must be correct based on values input 
-  * Code must be nicely and consistently indented (you may use the **indent** tool) 
-  * Code must be commented 
-    * Any "to be implemented" comments **MUST** be removed 
-      * these "to be implemented" comments, if still present at evaluation time, will result in points being deducted. 
-    * Sufficient comments explaining the point of provided logic **MUST** be present 
-  * Track/version the source code in a repository 
-  * Submit a copy of your source code to me using the **submit** tool (**make submit** will do this) by the deadline. 
haas/fall2015/data/projects/dls0.1446991040.txt.gz · Last modified: 2015/11/08 13:57 by wedge