The objective of this module is to enable students to understand the benefits of organizing and manipulating data in tabular form. Through the relational model and its underlying relational algebra,students should understand the importance of structuring data, and data integrity and consistency.

After studying this material, students should demonstrate the following skills:

i. The ability to design a normalized relational schema.

ii. The ability to manipulate a database using a Data Description Language (DDL).

iii. The ability to extract specific data from the database by manipulating SQL queries.

Graph theory constitutes an essential theoretical and practical foundation in the modeling of problems across various fields. The contribution of graphs to problem-solving lies in their graphical simplicity, their similarity to distributed structures, and the notions of traversal and path searching.

This course aims to help the student to:

  • Understand the fundamental concepts of graph theory and their importance in various domains.

  • Learn how to model real-world problems using graphs.

  • Master the main properties of graphs and their applications.

  • Know how to analyze and design efficient graph algorithms


This course aims to provide students with a solid theoretical and practical understanding of computer networks. By the end of the course, students should be able to explain the fundamental principles of computer networks, understand layered communication models (OSI and TCP/IP), describe the roles of the physical, data link, network, transport, and application layers, and explain how data is transmitted from one system to another. Students should also be able to identify and describe transmission media, network topologies, addressing and routing mechanisms, and understand the basic operation of common network protocols in both wired and wireless environments.


Through this unit, the student must know and master the concepts derived from the theory of languages, specifically algebraic languages, grammar, and pushdown automata. These are the foundation of all syntax analysis algorithms (used by programming language compilers).

This module comprises six chapters on language-generating systems (grammars) and language-recognizing systems (automata). The corresponding automaton for most languages derived from Chomsky's classification will be described in detail.


Students are offered a set of exercises for each type of automata (finite state automata (FSA), pushdown automata (PDA), linear bounded automata (LBA), or Turing machines (TM)), allowing them to understand its operation thoroughly. Particular attention will be given to finite states automata used by lexical analyzers and pushdown automata used by syntax analyzers (two phases of a compiler).

All the acquired knowledge will be used to thoroughly understand the different phases of implementing compilers for programming languages.


This course provides an in-depth exploration of advanced Object-Oriented Programming (OOP) in Java, emphasizing practical skills for modern software development. Building on the foundations covered in Object-Oriented Programming I, it revisits core OOP principles before guiding students through more sophisticated concepts, including SOLID design principles, design patterns, and event-driven programming. The course also focuses on real-world applications such as developing graphical user interfaces, integrating with databases, and building distributed systems, equipping students with the tools to design robust, maintainable, and scalable software.