# Theory Of Computation : A Problem Solving Approach

This course introduces the fundamental concepts and processes of solving computational problems through the design, implementation, testing, and evaluation of basic computer programs. The concepts include basic computational constructs such as calculation, iteration, conditions, functions, and data types. These provide the basic building blocks found in virtually all programming languages. The processes include the step-by-step refinement of a problem description into individual components that can be implemented, tested, and integrated into an effective solution. As a general education course, the central theme to the course is computational thinking which includes a wide range of approaches to solving problems and designing systems that draw upon concepts fundamental to computer science. Computational thinking includes thinking about various types and sources of data, and the correctness, efficiency, elegance, and simplicity of various potential solutions. Computational thinking is applying principles of abstraction at multiple levels to focus on important details; it is applying problem decomposition to identify small problems that can be individually solved then combined to form a solution to the original problem. Upon completion of this course, the student will be able to conceptualize and implement computational solutions to problems; to utilize the imperative model of computation to solve problems; to reason about problems at multiple levels of abstraction; and to analyze code for its behavior, efficiency, and correctness. A student may receive credit for only one of the following courses: CMPSC 101, CMPSC 121, CMPSC 131, CMPSC 200, CMPSC 201

## Theory of Computation : A Problem Solving Approach

An introduction to logic and its application to problem solving and computer science. CMPSC 111S Logic for Computer Science (1)Computer Science provides the fundamental tools for analyzing problems and designing solutions to these problems which can be implemented on a computer. Logic plays an important role in this process, from a general-purpose tool for reasoning about knowledge to a special-purpose language for specifying the behavior of programs and designing hardware. This course examines the role of logic in problem solving and its application to computer science and computer engineering. Example problems will be drawn from a variety of sources, including brain teasers, puzzles, and mathematics. We will show how these problems and their solutions apply to real problems involving computers. We will also explore a number of the important areas of computer science and computer engineering including Boolean and Digital Logic, Designing Arithmetic Hardware, Cryptography and Security Programming Languages, Networking and Wireless Communication, Artificial Intelligence, and Computer Ethics.

This course introduces the fundamental concepts and processes of solving computational problems through the design, implementation, testing and evaluation of efficient and robust computer programs. The concepts include basic computational constructs found in imperative, object-oriented and functional programming languages such as iteration, conditionals, functions, recursion, and datatypes. These provide the basic building blocks found in virtually all programming languages. The processes include the stepwise refinement of a problem description into individual components that can be implemented, tested, and integrated into an effective solution. A central theme to the course is computational thinking which includes a wide range of approaches to solving problems and designing systems that draw upon concepts fundamental to computer science. Computational thinking includes thinking recursively, considering parallel processing, thinking about types and type checking, judging a program not just for correctness and efficiency but also for its esthetics, and judging a system design for its simplicity and elegance. Computational thinking is applying principles of abstraction at multiple levels to focus on important details; it is applying problem decomposition to identify small problems that can be individually solved then combined to form a solution to the original problem. Computational thinking uses program invariants to describe a system's behavior succinctly and declaratively. Computational thinking considers multiple models of computation when designing an effective solution to a problem.

This course builds upon the foundations of programming and computation by introducing and studying the data structures and programming language features that support the design and construction of large-scale software systems. It introduces the foundations of object-oriented programming, the design and analysis of efficient algorithms using important data structures, and programming techniques that support reusable and modular program components, including data abstraction, polymorphism, and higher-order functions. Topics from object-oriented programming include classes, objects, inheritance, methods, message passing, static and dynamic type checking. These topics form the core of most object-oriented languages and provide a foundation for learning more advanced language topics. Data structures capture the common organization of many kinds of data arising in the design of efficient solutions to computational problems. Specific data structures covered include stacks, queues, trees, graphs and linked lists. The design and analysis of efficient algorithms using these data structures provide a foundation for the study of computing, where understanding the complexity of a problem and the availability of efficient solutions are essential skills. Finally, topics including higher-order functional programming, data abstraction and parametric polymorphism, as well as principles from object-oriented programming, come together to support the design and implementation of modular, reusable and robust code.

This course introduces basic programming concepts including algorithm development, simple data types, number representation, control structures, functions, plotting, and basic numerical analysis techniques, all in the context of science and engineering. The course enables students to develop computer programs in a scientific programming language to solve simple engineering and science problems. The basic numerical analysis techniques covered in the course include matrix operations, systems of equations, solving equations, roots, curve fitting, interpolation, numerical integration, and numerical solutions of ordinary differential equations. Students analyze engineering and science problems, develop algorithms to solve those problems, implement their algorithms in an appropriate programming language, and produce informative output in both numerical and graphical form. The general programming concepts learned in the course are commonly found in most programming languages. The problem-solving skills learned in the course can then be utilized in upper-level engineering and science courses. This course includes an exploration of the conceptual and syntactical background needed for the successful completion of practical programming assignments. The course also includes an emphasis on the actual design and implementation of computer programs necessary for solving computational problems. This course satisfies University quantification requirements because it assists students in assessing and interpreting quantitative data and information. In addition, the course assists students with recognizing patterns, establishing relations, exercising conceptual thinking, developing problem-solving skills, and thinking logically and critically. Finally, the course supports students in their efforts to draw accurate and useful conclusions, to make informed decisions based on quantitative analysis, and to use mathematical skills to solve conceptual problems. A student may use only one of the following courses to satisfy degree requirements: CMPSC 101, 102, 121, 131, 200, 201.

This introductory programming course teaches the foundations of programming and computational problem solving for scientific and engineering domains. The emphasis of the course is on computation as a problem-solving tool for highly mathematical intensive applications. The course includes the study of core programming concepts, including data types, data structures, control structures, functions, and problem decomposition, and then continues with techniques applicable to modeling and visualizing scientific data. Students gain experience solving scientific and engineering problems by translating mathematical specifications into computational solutions, using a variety of mathematical and related libraries. They also gain experience developing solutions that provide visual representations of the results.

The course covers advanced object-oriented principles and their application to web-based, net-centric computing. Major topics include virtual machines, intermediate code generation (Java-specific), graphical user interfaces (GUI) design, event handling, server-side programming with database queries, and security, permissions and file management concepts for client/server systems. Extensive programming assignments provide an understanding of the entire process of client/server development including interface prototyping, program design, implementation of both client and server programs, unit testing, and documentation. This course prepares students to meet immediate demands in solving complex computational problems.

This course focuses on the development of event-driven applications for problems found in science and engineering disciplines using object-oriented programming concepts, application programming interfaces, and event-driven programming techniques. Additional topics include stream I/O, data visualization, and user-interface design. Students will gain experience in the design and construction of independent and deployable applications that leverage their mathematical and problem-solving skills.