Learning Outcomes

After taking CS1010, students should

  • be familiar with fundamental programming concepts and methodology (variables, assignments, conditions, branches, loops, functions, recursions, structures);
  • be familiar with and appreciate good programming practice, and apply it to follow-up courses;
  • be able to apply problem-solving knowledge and skills to write small, well-documented, effective C programs;
  • be able to appreciate the use of simple data structure such as array, know their limitations to pave way for more complex data structures in the next course;
  • know the responsibilities of an ethical programmer;
  • be able to write simple programs in the corresponding programming language to solve a task, given the constraints on the inputs;
  • be able to manually trace through a program to identify logical errors;
  • be able to differentiate between logical errors, syntax errors, and run-time errors;
  • be exposed informally to the concept of code specification in the form of comments in the code, explaining what are the expected inputs and outputs and what are the assumptions;
  • know about what are some insecure functions to avoid;
  • be able to generate test cases on their own, with a focus on boundary/special cases;
  • be able to debug with printf or equivalent functions;
  • be aware of common strategies and good practices of debugging with printf or equivalent functions;
  • be able to identify opportunities to, and write, modularized code;
  • be exposed to a debugger;
  • be able to write code following good programming style (clear comments, naming convention, indentation, etc.);
  • understand the different data types and that there exists a representation of each in the memory, as well as the limitation of the representations due to the limited number of bits;
  • develop a simple mental model of how a program is executed (CPU runs the code on data that is stored in memory, function call leads to the creation of call frames, which can explain recursion and variable scoping, etc). For interpreted language, understand the role of virtual machine/interpreter;
  • be able to understand at a high level the compilation process (from pre-processing to compiling to linking), where applicable;
  • understand the concept of reusability and how a software application can be built on top of software libraries/packages (standard or third parties);
  • be able to implement bubble sort and insertion sort;
  • be able to implement linear search and binary search (both iterative and recursive versions);