Program and Data Representation

Introduction | Repository contents | Contributing to this repository | Course description | Markdown | Source code | Canvas notes | License


This repository contains the materials for the course entitled "CS 2150: Program and Data Representation" in the Computer Science Department at the University of Virginia. It contains all of the slides, labs, exams, etc., used throughout the course. The course description is below. The github repository for this course is at

Students currently in the course should view the uva/index.html (md) file in the cloned repository (i.e., don't try to view it on; current students may also want to view the daily announcements. Note that many of the course materials are modified right before they are needed -- for example, this repository will be updated right before the semester starts.

Students who were previously in the course may want to view the current version, or you can view the version from your semester. All semester versions are tagged with an end-of-semester tag of the form "year-semester". For example, the spring 2014 semester was tagged as 2014-spring. To obtain a specific tag, you can enter git checkout tags/2014-spring in an already cloned repository.

The primary author is Aaron Bloomfield (, @bloomfieldaaron). The spring 2016 semester was be the 20th consecutive semester I have taught the course, and the 7th semester using this github repo.

Repository Contents

Note that the links below will not work correctly if you are viewing this online at -- you will need to clone (download) the repository first

Contributing to this Repository

Updates to the repository are restricted to approved individuals only, to prevent anybody from messing with the slides right before a lecture. However, others can still contribute to this repository -- to do so, take the following steps:

  1. Create a github account, if you do not have one
  2. Fork this repository: you can click on the "Fork" link in the upper right, or just click here
  3. Clone your forked repository on to your local machine
  4. Make any changes you want to your forked version, then commit and push your changes back to your forked repository
  5. Create a pull request, following the instructions here

At that point, I will receive a notice that a change has been submitted, and I'll look at it and hopefully accept it into the main repository.

When you want to bring in the updates from the main pdr github repository into your forked repository, you will need to follow the instructions here.

Course Description

This course is a second-year course for computer science majors. It is the primary data structures course in the University of Virginia's computer science curriculum. Unlike many other data structure courses at other institutions, it is intended as the third course in sequence, meaning that students are expected to have taken two semesters of Java (or equivalent, although some of the examples are specifically from Java). The course focuses on how programs and data are represented from the high level down to the low level. For programs, we examine (from high to low): abstract data types, Java code, C++ code, C code, assembly (x86) code, and a customized machine language. For data, we examine (also from high to low): abstract data types, objects, primitive types, and how numbers are encoded (both floats (IEEE 754) and integers (two's complement)). About two-thirds of this course is programming using C++. The remainder of this course uses other languages, including (in decreasing order): x86 assembly, IBCM (a machine language), C, Objective C, and shell scripting.

The ABET course objects are as follows:


The majority of the content in this repository was created using Markdown. Unfortunately, the only standardized Markdown is very old (2004), and has limited support for many HTML features, such as tables. In the past, there were custom utilities (which can still be found in the utils (md) directory) were used. However, pandoc is now used (which is installed via the "pandoc" package on Ubuntu). Typing make in the root repo directory will call pandoc on all the markdown files.

For all the Markdown files in this repository, both the original (.md) file and the HTML version (.html) are added to the repository, so that people who do not have Markdown installed can still view the contents of this repository.

Note that Github supports an enhanced version of Markdown, called Github Flavored Markdown, or GFM. This mostly pertains to this README file. In an effort to ensure compatibility with other Markdown programs (such as the one described here and what reveal.js uses), GFM specific features are generally avoided. One example is the use of anchors in this document -- the HTML tags are included instead of using GFM's version.

Source code

All source code is formatted via astyle and then highlighted via source-highlight. Both the original file (foo.cpp) and the highlighted version (foo.cpp.html) are included in the repository. All links to source code will like to the .html, with a "(src)" after it to link to the original source code.

Canvas notes

Some of the slides allow pen-based markup of the slides. To add a canvas to a slide (to allow drawing with a mouse or a stylus), you must do a few things:

  1. The slide can NOT be Markdown, it must be all pure HTML

  2. Include the js/canvas.js and css/dhtmlwindow.js scripts, as well as the dhtmlwindow.css CSS file (the two dhtmlwindow.* files are for the calibration feature):

<script type="text/javascript" src="js/dhtmlwindow.js"></script>
<script type="text/javascript" src="js/canvas.js"></script>
<link rel="stylesheet" href="css/dhtmlwindow.css" type="text/css">
  1. Add an onload="canvasinit()" to the <body> tag: <body onload="canvasinit()">

  2. Add the following immediately after the <body> tag (this is for the calibration feature):

<div id="dhtmlwindowholder"><span style="display:none"></span></div>
  1. Add the following code at the end of the .html file (just before the three script tags):
<div id="calibratediv" style="display:none">
  <div id="calibratecanvasdiv">
    <canvas id="calibratecanvas" width="300" height="300">Your
            browser does not support the canvas tag</canvas>
   <p style="text-align:center">Click the center of the target<br><a href="#" 
       onClick="calibratewin.close(); return false">Close window</a></p>
  1. Then, on each slide that you want a canvas on, you add the following:
<script type="text/javascript">insertCanvas();</script>

A few other notes:


The material in this repository is released under a Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA).

Copyright (c) 2013-2015 by Aaron Bloomfield.

Some parts of this repository are taken, with permission, from other sources. The full details are in the License (md) file. In particular, some parts of this repository that were obtained elsewhere can not be used for commercial purposes.