Introductory Computer Science
This page is intended to help students navigate the new introductory sequence in computer science. The first section gives a brief description of the courses in our introductory sequence. The second section describes the placement exam we will be offering for students who have prior experience in computer science.
In addition to the sequence described below, students may want to consider the introductory data science sequence (Introduction to Data Science I and II (DATA 11800 and DATA 11900). Students who are interested in the visual arts or design should consider Creative Coding (CMSC 11111), which will be offered next in academic year 2023-24. You can learn more about these courses in the Course Catalog.
Current students who have completed part of the previous introductory sequence should consult our introductory sequence FAQ.
Introductory Sequence in Computer Science
Starting in Autumn 2022, Computer Science will be offering a four course introductory sequence. The sequence will begin with two courses on programming in Python and transition into systems programming in C.
Introduction to Computer Science I (CMSC 14100) is the first of a pair of courses that are designed to introduce students to computer science and will help them build computational skills, such as abstraction and decomposition, and will cover basic algorithms and data structures. Students will also be introduced to the basics of programming in Python including designing and calling functions, designing and using classes and objects, writing recursive functions, and building and traversing recursive data structures. Students will also gain basic facility with the Linux command-line and version control. Students without prior experience in computer science should plan to start in this course. This course will be offered in Autumn 2022 and Winter 2023.
In Introduction to Computer Science II (CMSC 14200), students will explore more advanced concepts in computer science and Python programming, with an emphasis on skills required to build complex software, such as object-oriented programming, advanced data structures, functions as first-class objects, testing, and debugging. The class will also introduce students to basic aspects of the software development lifecycle, with an emphasis on software design. Students will also gain further fluency in working with the Linux command-line, including some basic operating system concepts, as well as the use of version control systems for collaborative software development. This course will be offered in Winter 2023 and Spring 2023.
Systems Programming I (CMSC 14300) is the first in a pair of courses designed to teach students about systems programming. In this course, students will develop a deeper understanding of what a computer does when executing a program. In order to make the operations of the computer more transparent, students will study the C programming language, with special attention devoted to bit-level programming, pointers, allocation, file input and output, and memory layout. In the context of the C language, the course will revisit fundamental data structures by way of programming exercises, including strings, arrays, lists, trees, and dictionaries. Furthermore, the course will examine how memory is organized and structured in a modern machine. Students will gain basic fluency with debugging tools such as LLDB and Valgrind and build systems such as make. This course will be offered for the first time in Spring 2023.
Systems Programming II (CMSC 14400) covers the basics of computer systems from a programmer’s perspective. Topics include machine language programming, exceptions, code optimization, performance measurement, system-level I/O, and concurrency. Students will gain further fluency with debugging tools and build systems. This course will be offered for the first time in Autumn 2023.
Which courses and how many courses you will need to take will depend on your intended major and the extent of your prior experience in computer science. Computer Science majors complete the full sequence through Systems Programming II. Some majors, such as Statistics and the Economics Data Science Track, require students to complete through Introduction to Computer Science II (CMSC 14200)*. Students who are interested in gaining programming skills for use in their own field of interest will benefit from taking Introduction to Computer Science I and, likely, Introduction to Computer Science II. Students who are simply looking to get exposure to programming are encouraged to consider either Introduction to Computer Science I (CMSC 14100) or Creative Coding (CMSC 11111).
* For students in these majors, placing out of Introduction to Computer Science II (CMSC 14200) is not sufficient to fulfill the requirement. See below for more details.
Students without prior experience in computer science should plan to start in Introduction to Computer Science I (CMSC 14100).
For students with prior experience, the Department of Computer Science, in collaboration with the College, will offer two placement exams to help students identify the correct starting point for their computer science education at The University of Chicago. The first exam will test the material covered in Introduction to Computer Science I and II (CMSC 14100 and CMSC 14200). The second exam will test the material covered in Systems Programming I and II (CMSC 14300 and CMSC 14400). This section describes the first exam. Information about the second exam will be available in July.
Specifically, the first exam will cover the following topics
- Programming Basics (e.g., values, types, expressions, and control flow)
- Functions and Recursive Functions
- Object Oriented Programming (classes, inheritance, etc.)
- Data Structures (e.g., lists, sets, dictionaries) and Recursive Data Structures (e.g., trees, graphs)
- Software Development (e.g., design, testing)
This exam will be offered online in C++, Java, Python, and Ruby. It is intended to evaluate students’ grasp of concepts, not their fluency with any specific programming language.
Solely based on this exam, students may be placed into:
- CMSC 14100: Introduction to Computer Science I
- CMSC 14200: Introduction to Computer Science II
- CMSC 14300: Systems Programming I
Students who are placed into CMSC 14300 will be invited to take the second exam.
Students who are placed into CMSC 14200 and successfully complete it will get course credit for CMSC 14100. Students who are placed into CMSC 14300 (or CMSC 14400) and successfully complete it will get course credit for CMSC 14100 and CMSC 14200.
For students in majors that require Introduction to Computer Science II (CMSC 14200), such as Statistics or the Economics Data Science track, completing one of the later courses in the sequence is sufficient to fulfill the requirement.
The exam will be available through the HackerRank online platform on July 13th from 8am CDT until July 14th at 8pm CDT. Once a student starts the exam, they will have 120 minutes to write programs that solve a series of programming problems of varying difficulty. We will be offering a practice exam starting on July 6th until July 12th. Please note that the practice exam is not necessarily representative of the type of questions and level of difficulty of the questions you will encounter in the actual exam, and that it is being provided to allow you to (1) familiarize themselves with the HackerRank platform and, (2) get practice solving some non-trivial problems.
The exam will have six problems. Students will need to solve at least four (with, at most, only minor issues or errors) to be placed into CMSC 14200. Students who wish to be placed into CMSC 14300 (and be invited to take the second placement exam) must complete all six problems. We will provide information about the exam platform closer to the date of the exam.
Partial credit may be awarded for partial solutions. Please note that, regardless of any partial credit awarded, students will automatically be placed into CMSC 14100 if they are unable to submit at least three problems during the exam, where the solution compiles, runs, and passes at least one sample test case.
The exam will be open-book and open-Internet. Students will be allowed to consult any online documentation, but must cite any resources used by including the relevant information in a comment in their code.
During the exam, you will submit your solutions through HackerRank, a web-based platform that will run your solution with a series of test cases, and will tell you whether your solution passed the test cases or not. Although the results of the test cases will be a factor in evaluating your solution, your code will also be stored in a database for further evaluation by a human grader. You will need to create a HackerRank account to access the test. We encourage you to create one with your @uchicago.edu address. You can sign up at this link below:
HackerRank has a public website that you can access at any time before the exam. This website provides the exact same interface you will encounter during the exam. We recommend taking a look at their sample practice exam to get familiar with the testing environment.
Before the start of the exam, you will receive an email from us with a link to the exam. Once you click on the link, fill out all required information and agree to the terms in the “Confirmation Form” section then you will begin the 120 minute exam by clicking on the “Agree & Start” button. The following sections describe the problem structure and information you should know while taking the exam.
As you will see in the sample problems, all the exam problems require you to write a program that will read some input, which you must then process in a way specified in the problem statement, and produce an output in a specific format. You must write your solution in a single file (Java programmers, note that you can include additional top-level classes in a single source file as long as they are unqualified: just “class”, without “public”)
The format of the input and output is described in each exercise, and you must follow them rigorously. Each problem includes some sample input/output data that you can use to test your solution. Take into account that we will also test your solution with larger test cases and more varied input.
All input is read from standard input (i.e., it is read from the terminal, not from a file). You can assume that all input is correct and meets the specifications given in the problem statement; do not waste time validating the input. All output should be printed to standard output (i.e., it is printed to the terminal, not written to a file).
As you work through the sample problems, you’ll notice that the input/output requirements are very similar across problems. In particular, it is useful to think of the input as a stream of tokens (with each value, or token, separated by a space or a newline). All modern programming languages include libraries to easily read in this kind of data, without having to read in the file byte by byte or doing any complicated parsing. In particular, you may want to look at:
- C++: The iostream library, including the << and >> operators.
- Python: file.read().split()
- Java: StreamTokenizer
- Ruby: STDIN.read.split()
Note: You are not limited to using just the above mechanisms. They are just suggestions; if you have another preferred method of reading tokenized input in your programming language of choice, you are welcome to use it (as long as it doesn’t require using external libraries not included with the language’s standard library).
During The Exam
We need to see evidence that you know how to write code that compiles and runs correctly. We suggest you follow this strategy during the exam:
1. Select a problem that you feel you can solve easily, and write a solution in your text editor/IDE.
2. Manually test the solution with the sample input provided. Since all programs must read from standard input, when your program runs it will be waiting for input to be entered on the console. You can just copy-paste the sample input and press Control-D to signal the end of input. Check whether it produced the exact same output shown in the problem statement. If it does not, your solution is incorrect.
3. If your output matches the output shown in the problem statement, submit to HackerRank by copying over your code into the code window for the problem. Clicking the “Run” button and then clicking the “Test Results” tab will show you whether you passed all test cases for a problem.
If you get an “All available test cases passed” message, you’re done with this problem. Move on to the next one.If you get anything other than “All available test cases passed”, it’s likely that your solution is substantially correct, but is failing on a corner case.
Don’t obsess over this! If your solution (1) compiles, (2) runs, and (3) solves the problem correctly for the sample test cases, then your solution is very likely 95% correct. Move on to the next problem, and revisit any non-Accepted problems if you have time at the end.
Please note that you can write and test your code directly into the code window for any problem. If you feel more comfortable working in a text editor/IDE on your personal computer then we recommend that you work within that environment and then copy over your solution. However, there is no file uploading on HackerRank so you must copy over your solution once you feel it’s ready to be fully tested on HackerRank.
4. Pay close attention to the instructions for each problem. A problem may require you to write your solution using a specific approach/paradigm (e.g., object-oriented approach, recursive style). Your solution to this problem must be implemented using the specified approach. Any other solution will receive zero points, even if HackerRank judges it correctly (i.e., you pass all the test cases).
5. Make sure to click the “Submit Test” button on the main exam page once you have completed the test.
It is your responsibility to complete the items on this checklist before the exam. If you do not, it will very likely impact your performance in the exam. Please read this list carefully.
❏ You have read and understand the instructions in this page.
If anything is unclear, do not wait until the day of the exam! Contact us at email@example.com.
❏ You understand and are aware that the exam will be carried out on HackerRank.
You will be able to work on the exam problems from your own computer. You are not required nor expected to use a specific OS environment, nor are we mandating the use of any specific tools. You may use any tools (editors, IDEs, compilers, etc.) available on your personal computer and copy over your solution into the exam window or code directly into the online editor provided by HackerRank.
❏ You have familiarized yourself with the input/output requirements of the exam problems, using your programming language of choice.
❏ You have familiarized yourself with the online HackerRank platform which is used to administer the exam. HackerRank provides a Sample Test you can complete to familiarize yourself with their platform. Please note that you will need to create a HackerRank account to access the test. We encourage you to create one with your @uchicago.edu address.
❏ You have worked through the practice exam (once provided) on HackerRank (unlike the “sample test” provided by HackerRank, these practice exams use problems that will be similar in structure to the problems on the actual exam. As a reminder, the practice exam allows you to (1) familiarize yourself with the HackerRank platform and, (2) get practice solving some non-trivial problems.
❏ You have filled out the placement’s exam registration form. We will use the information you provided in that form to send you a private link to take the practice exam and the actual exam. We will send a link to the registration form to everyone who completed our introductory course survey. If you do not receive a link to the form by June 28th or you did not complete the survey (and wish to take the exam), please contact us at firstname.lastname@example.org using your UChicago email address.
❏ You understand that you must do the exam in the supported language you are most proficient in. As a reminder, this exam will be offered online in C++, Java, Python, and Ruby. Please do not learn one of these languages just for this exam. From those options, use the language you are most comfortable with.
It is important that you complete all these items! You should not wait until the day of the exam to familiarize yourself with HackerRank.
What to do if a problem arises during the exam
Follow these steps if you encounter any problems (e.g., internet connection fails) during the exam:
1. Don’t panic. Continue working on the exam problems locally; your Internet issues may resolve themselves before the exam ends.
2. If possible, notify us via email at email@example.com to alert us of the issue.
3. If the issue does not resolve itself by the end of the exam, e-mail us your solutions as soon as you are able to do so.
We have put together a collection of sample problems covering a variety of topics. The problems provided do not cover all of the topics above; however, they provide a realistic picture of the types of questions students will encounter on the exam. Please check back in a few weeks for more problems.
Problem A: It’s Hot! It’s Cold!
Problem B: Cold-puter Science
Problem C: Raindrops Keep Falling on our Sensors
Problem D: Snowed In
Functions and Recursive Functions
Problem E: Dijkstra’s Other Algorithm
Problem F: Watch Out For Those Hailstones!
Problem G: A Full-fill-ing Problem
Problem H: Let’s Make Some Subsets!
Problem I: A Tricky Problem
Problem J: Verify This, Your Majesty
Problem K: What’s in an (Apaxian) Name?
Problem L: The Game of Life
Problem M: C’mon K-mers!
Problem N: Staying Connected
Problem O: It’s All About the Miles
Problem P: Can I Graduate?
Problem Q: Can We Make a Reservation?
Problem R: Movie Collaborators
Problem S: Not Another Committee!
Problem T: Particle Simulations
Problem U: The nycsubmit System
Problem V: Did You Pay Your Taxes?