CS 221
Learning Objectives
At the end of this course you should know how to:
Software Engineering
-
List and discuss the 5 steps in software development.
-
Demonstrate your ability to plan, organize, and write a Software Requirements Specification,
a Software Design Description, and a Software Test Plan.
-
Define algorithm, modularity, information hiding, encapsulation, and data abstraction
and explain
why they are important in program development.
-
Compare and contrast top down program design and bottom up program design.
-
Define unit testing, integration testing, acceptance testing, and
regression testing and explain why each is important in the process of
software development.
-
Define Verification and Validation and explain what role it plays in software development.
-
List and briefly define the five steps in the Software Engineering Institute's (SEI)
Capability Maturity Model (CMM).
-
What is Analysis of Algorithms?
Explain what is meant by Big O Notation in algorithm analysis and
list the 8 most frequently used O notation measures.
-
Define and contrast iterative and recursive programming and give examples of each.
-
Define Abstract Data Type and give examples.
-
List and briefly define the 4 categories of operations (functions) used in C++ classes.
Pointers
-
Declare pointers to each of the six basic C data types.
-
Declare pointers to data structures.
-
Assign address values to pointers.
-
Pass pointers to functions as arguments.
-
Use, manipulate and modify pointers in functions.
-
Return values from functions using pointers.
-
Dynamically allocate memory and set pointers to the new memory blocks.
-
Use pointer arithmetic.
-
Define heap and explain how it is used in dynamic memory allocation, and what is
meant by first-fit allocation and best-fit allocation.
Data Structures
-
Define data structures.
-
Use typedef in defining data structures.
-
Access fields of a data structure given the name of a data structure
variable and a pointer to the data structure.
Arrays
-
Declare and use arrays of characters and arrays of data structures.
-
Use both array notation and pointer notation to access elements of an array
Object Oriented Programming
-
Define terms related to object oriented programming including: object oriented programming,
class, instantiation, class library, instance or member variables, instance or member
methods, public, protected, private, super class, parent class, base class, subclass.
-
Show how to create a class interface (header) file.
-
Show how to create a class implementation (.cpp) file.
Lists
-
Define the following terms related to the List Abstract Data Type:
List, Linear Relationship, Sorted List, Unsorted List, Key, Linked List
-
Demonstrate how to declare structures to be used in simple linked lists,
double linked lists, and circular linked lists.
-
Explain, with code examples, the algorithms for inserting, deleting, and
searching in a simple linked list.
-
Define and discuss the following dangers in linked lists: dangling pointers,
failure to provide for garbage collection, dereferencing the NULL pointer,
forgetting to mark the end of a list, and problems with boundary cases.
Stacks and Queues
-
Define and contrast stacks and queues as abstract data types.
-
Demonstrate how to implement stacks and queues as arrays and linked data structures.
-
Explain, with code examples, the algorithms for initializing, pushing,
popping, and checking for a full/empty stack.
-
Explain, with code examples, the algorithms for initializing, enqueueing,
dequeuing, and checking for a full/empty queue.
Trees
-
Demonstrate how to declare structures to be used in binary trees.
-
Explain, with code examples, the algorithms for inserting, deleting,
and searching for nodes in a binary tree.
-
Explain what is meant by a balanced binary tree and why it is important.
-
Describe what a heap is when referring to a tree structure.
-
Describe AVL trees, what the definition of AVL property is and demonstrate
the ability to identify diagrams of trees as to whether they have the AVL property.
-
Discuss, with diagrams, the algorithms for a single left rotation, single
right rotation, double left rotation, and double right rotation in AVL trees.
-
Define, with diagrams, the structure of a 2-3 tree.
-
Define, with diagrams, the structure of a B tree.
-
Define, with diagrams, the structure of a Trie tree.
Graphs
-
Define terms related to graphs including: vertices, edges, weighted graph,
directed graph, undirected graph, adjacent vertices, path, length of a path,
cycle, simple cycle, connected vertices, connected components, adjacency set,
degree of a vertex, predecessors, successors.
-
Describe and explain standard graph symbolic representations.
-
Demonstrate how to represent graphs in code using an adjacency matrix and an adjacency set.
-
Discuss a basic search algorithm for graphs and contrast this search when the
list of nodes to be searched is stored as a stack or a queue.
-
Define minimal spanning tree and discuss, with diagrams, Prim's algorithm for
finding the minimal spanning tree of a graph.
-
Define shortest path and discuss, with diagrams, Dijkstra's algorithm for
finding the shortest path from node x to node y of a graph.
Hashing
-
Define terms related to hashing including: hash function, double hashing, collision,
collision resolution, mapping, perfect hash function, load factor, cluster.
-
Define how the following hashing techniques work: open addressing with linear probing,
open addressing with double hashing, chaining, hashing with buckets.
-
List and discuss 5 different techniques for calculating a hash function.
-
Discuss some of the considerations when selecting a hash table size.
Sorting
-
List the categories and examples of sorting techniques which the author groups into the
two sorting themes Comparison-Based Sorting and Address Calculation Sorting.
-
Discuss the algorithm for implementing each of 10 sorting techniques and give the
O notation measure of the algorithm's speed.