This course introduces the fundamental mathematical models of computation. The course presents both inherent capabilities and limitations of these computational models as well as their relationships with formal languages. Topics to be covered include: Finite automata and regular languages, Deterministic and nondeterministic computations, Context-free grammars, languages, and pushdown automata, Turing machines, recursive and recursively enumerable sets, undesirability, introduction to computability and complexity theory. 

This course introduces students to the analysis and design of computer algorithms. Topics covered include problem types, algorithm performance analysis and limitations, algorithm design techniques such as: brute force, decrease and conquer, divide and conquer, Transform and conquer, dynamic programming, greedy techniques, and iterative techniques.

This course utilizes Java as a platform-independent object-oriented programming language and C as platform-based programming language. It introduces advanced programming features through applications. Among those advanced features: building user interface using swing, multi-threaded programming, database connectivity using JDBC, and distributed computing using Remote Method Invocation (RMI). The course also covers the basics of web programming using Java web technologies. Unix/Linux programming tools and environments are introduced. Scripting languages as another problem solving technique is introduced, such as python. 

This course introduces JAVA to students as an example of an object oriented programming language. The course starts with a briefing on Java history and the classifications of different Java editions.

The concepts of classes and objects are introduced followed by a description of various types of class members. The course describes the concepts of abstraction and encapsulation and how to apply these concepts when creating classes.

The course describes the object-oriented relationships: association, aggregation, composition, inheritance and implementation. Also the concept and role of polymorphism are introduced covering method overloading, method overriding, and dynamic method dispatching. Exception handling and the usage of Java API are presented with a concern to using javax.swing to build GUI applications.