IT Program Design

Welcome Aboard

Welcome to the IT Program Design web site. The videos, web resources & exercises in this site are meant to be used in a full-semester offering on C Programming. While we devote significant efforts to impart good programming practices to students, this material is not intended as an introduction to programming. Students are expected to have already taken such an introductory offering prior to this one; e.g. COP2931 IT Programming Concepts.

Our modules are based on the C How To Program textbook from Paul & Harvey Deitel, published by Pearson.

If you are taking this offering at USF with Alessio Gaspar, you need to read this How To PDF which will explain how we will be working together this semester.

Feel free to get in touch with me to report broken links or any other issues you might be bumping into while using this web site. I'm always interested in hearing how the material works or does not work for both students & other instructors If you are using / adapting this material for an offering you are teaching, drop me a line to let me know how it is working for you.

The following are answers to questions students often have in this offering.

Why should I develop C Programming skills?

This specific language does a few thing for a future IT professional;

  • Allows you to understand how things work "under the hood". E.g. pointers enable parameter passing by-reference, program execution stacks allow to implement functions
  • Gets you exposure to languages relying on explicit memory management. While Java and other high level languages might have led many programmers to feel like no one will ever again manage memory without relying on the garbage collector, the predominance of Objective-C shows otherwise.
  • Enables you to work on programming project requiring performance. E.g. the gaming industry is an avid consumer of C / C++ programmers.
  • Enables you to work on operating systems internals, device drivers or projects involving programming tasks close to the hardware.
  • Enables you to work on compilers or generate code for a language you need to develop in C which is then compiled to native code.

Does this language allow programs to run faster?

One of the reasons programmers use this language is when performance - e.g. gaming, scientific computing - or size of programs - e.g. embedded systems - are primary concerns.

Take a look at this article from InRoads. It shows the performance boost between a Java vs. C version of the same program implementing the towers of Hanoi puzzle.

Is this language still used in industry?

It is also interesting to keep an eye on surveys measuring the popularity of programming languages. Sometimes ancient languages have such a base of legacy code in industry that they remain a necessity for IT professionals. Examples of such surveys may be found at LangPop or TIOBE Software Index

Where do I find out more about language standards?

Visit Open Std or the Wikipedia Entry

What is wrong with people asking for easy-to-read programs?

Take a look at the International Obfuscated C Code Contest. It will most likely teach you a lot about the language but also make you feel how others might feel when they try to decipher your "smart coding" ;p

Over the years, a few specific pedagogies emerged as being particularly useful to students in this offering. This tab summarizes the most essential ones in order to help you understand why we are doing things a specific way. Understanding the underlying objective of a teaching strategy helps engaging in it so as to maximize the benefits to your learning.

Pedagogy of Contents

You will find eight "modules" in the left navigation panel. Each is expected to take two weeks in a 16 weeks long semester. The first two modules will serve as a review of the fundamentals of programming while introducing a new programming language. You should only experience difficulties related to the new syntax along with learning a bit more about what is going on "under the hood". If you experience problems writing the programs from the apprenticeship exercises or the practice assignment, make sure to contact immediately your instructor to evaluate your programming skills from the pre-requisites & get help.

The next 3 modules are the most technical of this offering. We will delve deeper to understand the concept of pointer & how it underlines the implementation of constructs you have been already exposed to in your prior programming offerings; e.g. strings, passing parameters by reference, dynamical memory allocation...

The last 2 modules will introduce the idea of data types designed by the programmers & prepare you for your next offering; data structures.

Peer Learning Forums

Modules provide reading assignments & lecture videos which deliver the "raw" information to you. It is important for you to use the available discussion forums, emails, and request sessions with your instructor in order to ensure you understand this material.

In parallel with the readings & videos assigned in this part of our modules, you will be invited to participate to a graded, or non-grade, Peer Learning Forums. The idea here is for you to post questions about the material & attempt to respond to your classmates questions

This form of peer learning is not meant to let students teach students only. Instead, the instructor will monitor the posts all week long and provide, at the end of the forum duration;

  • Responses to the questions which are left unsolved
  • Corrections to the attempts at responses

This scheme benefits everyone;

  • If you read a peer question and think it it trivial, then post your response. If you misunderstood anything, the instructor will be able to see it & help you address a misconception
  • If you read a peer question and have no idea what it is about, there is a possibility you missed something in the material you studied. It is in your benefit to revisit it while seeking specifically a response. When you think you understand it, post your solution & get feedback.

Getting involved in such structured forums helps you not only learn the material but also implements a community of learning approach to teaching & learning which will go a long way to provide you with an enjoyable experience.

Cognitive Apprenticeship Videos

While the above will help you understand the fundamental aspects of programming, you also need to be shown how to apply this knowledge when writing programs. To this end, each module features many "apprenticeship videos". The name comes from the fact we are leveraging a way of teaching inspired by "cognitive apprenticeship" which, among other things, allows us to focus on imparting students programming skills instead of just knowledge about programming.

It is important to not only watch these apprenticeship videos but also attempt the exercises on your own. The step-by-step nature of these videos makes it very easy to watch the beginning, start working on your own version, take a peek on the next few minutes of the video if you hit a wall...

Practice Assignments

Last but not least, programming is not something one learns solely by reading about or watching others. Even if you understand the lecture material and are able to follow the apprenticeship material, you have not yet shown that you are able to write a program from scratch by yourself. This is where our "Practice Assignments" come into play.

While you have solutions to all the exercises used in the above-material, these PAs do not come with solutions. Instead, you are expected to work on them with help from your instructor to succeed in developing your own solution. Think about it; you already have solutions to many exercises, if you are struggling with the TA, you need more help than just another solution to memorize.

The benefits are manyfold;

  • While working on the PA, you to hone the very skills you are expected to learn; programming. Not just talking about programming
  • Because you work "live" with the instructor & ask questions to help you succeed, you are getting help to overcome all of the miconceptions / misunderstanding / problems remaining after the lecture & apprenticeship material. If you hadn't tried your hand on an exercise without solution, you might have just looked at the solution / memorised it without actually fixing any of your problems
This is why every module devotes one week to the lecture / apprenticeship material but also an entire week for you to work on the PAs. This boils down to having 50% of our learning time devoted to hands-on / applied learning.

Keep in mind, many students think that being able to follow the lectures / videos means they are good programmers. You are not a good programmer until you are able to write good programs, so make sure you spend enough time honing these skills hands-on with our PAs & make sure you ask for all the help you need to succeed in developing your own solutions.

Peer Testing

More information available soon about this one.

Over the years, I have developed a few software tools to support specific pedagogies with my students. Some of them are listed below alongside the IDE we have been using for years now. This tab lists useful software you may want to use while you study the material herein. However, your instructor will let you know exactly what he or she wants you to use. These announcements take precedence over the information presented below.

Please note that our videos illustrate "live programming" in various environments ranging from Linux to Windows. This will give you an idea of the diversity of the development ecosystem but, be reassured, the fundamentals taught in the videos are the same; how to think your way through programming tasks.

Code::Blocks IDE

If you are taking this offering at USF with Alessio Gaspar, we will be using this method.

Each of the practice assignments we are using provides a file which is a simply a zip of an entire Code::Blocks IDE project. These project folders have everything you need to get started on your assignment and took care of the grunt work so you may instead focus your efforts on implementing the parts allowing you to practice & develop your skills.

You may work on these practice assignments, along with any of the other exercises, simply by downloading the Code::Blocks IDE; Code::Block IDE .

Here is a simple Student Guide PDF to help you get started with Code::Blocks and ensure it is working on your system.

This IDE is simple enough to not require you to spent hours just learning how to use it, while providing many of the features found in professional IDEs. It is also available on Linux, Windows & MacOS, thus allowing students to work on the platform with which they are most familiar.

SLB - Students Linux Box

The Student Linux Box, or SLB for short, is a Linux virtual appliance students may deploy on a Virtual Box hypervisor. As Virtual Box is also available on all platforms, this allows students to boot a Linux development environment regardless of the operating system they are using on their machine. The Code::Blocks IDE is integrated tightly in this environment and the PAs in order to allow students to leverage the other tools presented on this page straight from withint the IDE.

In addition, since the student have a Linux development environment, we loaded it with useful tools instructors may have them explore in order to help them further in their development efforts.

You may download the Students Linux Box software at

NED - Novice Errors Detection

NED is web app available at It allows you to upload source files, for example the ones from one of our PAs, and get them analyzed by static code analysis tools configured to help you find mistakes novice programmers traditionally fall for.

Besides obviously helping you improve your programs as your practice, or before you submit them, NED also hyperlinks the warning messages issues by these tools which have proven to be the most confusing for students in the past. These links lead you to tutorials which will explain what these warnings are about & help you figure out whether you program suffers from the problems the analysers detected.

Use this tool frequently to help you gain experience with these errors so you do not fall for them

If you are using SLB, the NED web app is just one click away. If you are using Code::Blocks on your OS of predilection, you will be able to open a browser, select the files you're working with one time, then upload them every time you need to get them analysed.

WebPT - Web-based Peer Testing

As you work on the PAs, you will be able to take part in a pedagogy named Peer Testing. See the Pedagogies tab for more information about it.

We have a web app, which URL will be given to you by your instructor, which implements a tool facilitating the anonymous exchange of tests between students. You will be able to register an account then login on this app to upload your work at regular deadlines throughout the assignment. Each time one of these intermediary deadlines is past, you will then be able to see the tests your peers submitted for this deadline & use them to improve your own tests along with your own programs.

As of Summer2014 the WebPT app is very much an alpha release still. We have an IT senior project planned to further develop it in order to have it available for public release soon. In the meantime, you may refer to its Sourceforge Project Page.

This material has been developed and taught to both USF Information Technology & Computer Science students at the University of South Florida by Alessio Gaspar.

Over the past decade, it has undergone many revisions - the revision you see here is the 6th major revision. During this time, my research in programming pedagogy and, more specifically, the CLUE grant have been instrumental in helping me improve the material herein.

The many students who have taken this offering in its various revisions have been equally instrumental in identifying shortcomings and improving it to address their needs.

I will be glad to see it useful to other students, instructors or just about anyone who is interested in learning this specific language or extend their programming horizons. Feel free to get in touch if you have questions.