This is my work on Harvard's cs50 course via edX in 2017, taught by the delightful David J. Malan.
It is a copy of the "submit50" repository that is created by the course tools to automatically submit and unit test your code. For that reason, it has an unusual structure to it - each week's work is contained in a different branch. If the repo looks empty, make sure you're not looking at the master branch.
I completed the entire course except for the final project. The final project was effectively any personal project of your choosing, of which I have several, but I never felt the need to submit any for a pass/fail mark.
I did this course a few years ago, so this is a broad overview only:
- Basic concepts: binary data, different ways of representing data, basic introduction to algorithms, example of binary search and starting to think about efficiency. Using Scratch to demonstrate basic concepts of algorithms and programming.
- Introduction to C: basic examples, compiling and dealing with compile-time errors, control structures, getting user input. Different data types, floating point imprecision and integer overflows.
- Arrays: more on compiling and debugging. Data types and sizes in memory. Arrays and strings, ASCII representation and zero-termination. Taking arguments from the command line.
- Algorithms: linear vs. binary search, different methods of sorting integers, and big O notation. Structs in C. Recursion and merge sort.
- Memory: introduction to hexadecimal. Pointer dereferencing and arithmetic in C. Using this to iterate over and copy strings, and open and traverse through files. Allocating and deallocating memory with malloc() and free(). Introduction to the heap and the stack.
- Data structures: creating, traversing and freeing linked lists, trees and hash tables in C.
- Python: introduction to Python syntax and comparing to C.
- SQL: introduction to databases, database design and SQL.
- Web development: using Flask (Python), HTML/CSS and an SQL database via SQLAlchemy.