Fundamentals of Computational Thinking

Fundamentals of Computational Thinking introduces students to programming and builds a foundation for computational thinking and problem solving. It serves as the basis for more advanced courses in algorithms and programming, while also providing a programming foundation for students pursuing other majors.

The course introduces several fundamental programming approaches, including conditional branching, iteration, recursion and exhaustive search, and demonstrates how these constructs can be used to solve problems. Through illustrative examples such as checking whether a given string is a palindrome, students learn various programming techniques and problem-solving logic. The course is taught using the C programming language and provides in-depth coverage of the language.

Course Overview

Computational thinking is a systematic way of arriving at a solution to a problem. The course opens by unpacking that idea through examples that range from the history of computing to recent developments, before moving into the basic elements of programming, such as branching, loops, and divide and conquer, and how each is put to work on a rich set of problems. Lectures introduce each approach to problem solving, and the accompanying lab lets students design, build, and test their own solutions hands-on.

The course covers four paradigms for building computational solutions:

  • Conditional branching: many problems resolve one way or another depending on a condition, from checking whether a number is even or odd to finding the maximum of two or three numbers.
  • Iteration: many problems call for the same set of instructions to be repeated until a condition is met, from summing a list of numbers to searching, sorting, and testing primality. This section also introduces divide and conquer, a technique for breaking a problem into smaller parts, exemplified through binary search and merge sort.
  • Recursion: a function that calls itself can solve many of the same problems as iteration, such as factorials, Fibonacci numbers, and sorting. This part contrasts recursive and iterative solutions to the same problem.
  • Exhaustive search: some problems can only be solved by working through every possibility. This section looks at where that is necessary and how to do it well.

Learning Objectives

By the end of this course, students will have had the opportunity to:

  • Understand the elements of programming, the various programming paradigms, and how they can be applied to problem solving.
  • Apply programming concepts to solving problems.
  • Synthesize programs that combine the various programming concepts.

By the end of the lab component, each student will have had the opportunity to:

  • Apply different programming paradigms to solve problems.
  • Synthesize programs using a programming language such as Python.
  • Build and test robust programs.

Learning Outcomes

After completing this course, students should be able to:

  • Describe and explain how programming can be used to solve problems in domains appropriate for a first course on programming | Know/Knowledge Outcome
  • Describe and explain the various elements and paradigms of programming | Know/Knowledge Outcome
  • Describe and explain how to synthesize programs for solving problems appropriate for a first course on programming | Know/Knowledge Outcome
  • Demonstrate problem solving through programming | Comprehend Outcome
  • Design programs that combine the various elements and paradigms of programming | Create/Synthesize Outcome

By the end of the lab component, each student will have had the opportunity to:

  • Describe and explain how to use a major programming language such as Python | Know/Knowledge Outcome
  • Demonstrate programming using Python | Comprehend Outcome
  • Synthesize solutions using a programming language such as Python | Create/Synthesize Outcome
  • Al Kelley and Ira Pohl, A Book on C, 4th Edition.

Additional Reading

  • Paul Deitel and Harvey Deitel, C How to Program, 8th Edition.
  • G. Venkatesh and Madhavan Mukund, Computational Thinking: A Primer for Programmers and Data Scientists.
  • Peter J. Denning and Matti Tedre, Computational Thinking.

Assessments and Grading

Grading is relative. Final marks are made up as follows:

  • Final Comprehensive Exam: 30% (date to be announced)
  • Assignments: 30%, split across Programming Assignment 1 (15%, due end of Week 11) and Programming Assignment 2 (15%, due end of Week 16)
  • Quizzes: 21%, split evenly across three theory quizzes at the end of Weeks 5, 9, and 14
  • Attendance: 10%, on a sliding scale — full marks above 80% attendance, 8 marks for 70–80%, 6 marks for 60–70%, and 0 marks below 60%
  • Lab Participation: 9%

Both programming assignments are hands-on coding assignments; Assignment 1 covers material taught up to the mid-term point in the course.