Computer Science Department
A grade of 'C' or better in CS 301.
The course is about learning and practicing principles for organizing your thinking when solving programming problems, and not about memorizing details and facts. You must practice ways of establishing that an algorithm is correct and anlyzing its time bound. Getting good at these skills will allow you to come up with efficient algorithms of your own, by figuring out what steps are needed in the pseudocode or program code to get the proof of correctness to go through, or to reduce the running time. You will also learn to recognize what kinds of optimizations on a program are a waste of time, as they will have little or no impact on the running time of the program as a whole.
You are expected to do the readings before the corresponding class and come to class with questions that you've gotten stuck on. Bring your textbook to each class. Learning how to read texts and other literature of our field fluently is one of the skills that we want you to develop in the course. It takes practice, but once you get good at it, it's surprisingly easy. During each lecture, ask questions. An important step is then to re-read the corresponding reading and figure out, with the benefit of hindsight, how you could have gotten un-stuck without the help of the lecture.
Another reason you are expected to do the readings before class is that classroom time is a scarce resource that must be shared by your classmates. We don't want to wast some of it repeating trivial issues, such as definitions of terms that everybody is capable of understanding by looking in the text.
Revisit the same material many times over many days, refining and simplifying your understanding of it each time, asking yourself questions about it.
Each homework assignment will consist of written work and/or programs. On the programs, we usually supply a menu and a program body that gets you out of mundane programming chores. The menu allows me to test different modules that need to be completed, so that we can award partial credit for working modules. (Non-working modules don't count.) Don't change the I/O interface that we supply, since we will use an I/O script to test it. Generally, the code that you will have to write in a module is not lengthy, but some of the modules require you to solve a clever algorithms problem.
Each of your two midterm exam grades will contribute twenty percent to your final grade. Your final exam will contribute another twenty percent. Your quizzes will contribute another ten percent, and your homeworks will contribute the remaining thirty percent. We will sometimes give a homework quiz on the homework on the due date, and, when we do, this will be a significant part of the grade for that homework. (This is to ensure that people are making responsible use of the permission to talk with other students about the homeworks.)
We don't accept late homeworks, since we often post solutions right after they're due. To get you out of any unforeseen mishaps, we will throw out your lowest homework grade in computing your semester average. Even if you give me a legitimate reason for turning it in late, we will tell you to use this "freebie."
Homework and exam grades are curved to give a distribution of grades that is consistent with those in other senior-level undergraduate classes at CSU.
Each assignment or exam is assigned a letter grade from A+ to F. In computing grade averages, we use the following scale: A+ is a 12, A is 11, A- is 10, B+ is 9, B is 8, ..., D+ is 3, D is 2, D- is 1, F is 0. Your semester grade is the numerical average of the homeworks, quizzes, and exams when they are weighted as described above, and rounded to the nearest integer. For instance, if your weighted numerical average for the semester is 7.6, this rounds to 8, which is a B. If it is 10.4, this rounds to 10, which is an A-.
The problems we give on homeworks range from extremely easy to extremely hard. A common misconception is that we expect you to solve all of them successfully. You should view each problem as an opportunity to explore a topic, try to come up with your own ideas, and score some points if you're successful at finding a solution. They are not intended to be stressful, and you should try to have fun with them. If you can engage your curiosity, you will be more likely to ask yourself questions that will lead you to a solution and anticipate questions that we might ask about on the exams.
Remember that the grades are curved, and that if you find a problem hard, it is likely that many of your classmates won't get solutions to it either. This will allow you to skip a problem if it is taking too long, but be sure to attempt all of the homework problems, since the posted solutions will be a lot more instructive if you have attempted the problems first. This will help you anticipate exam questions, which are often variants of problems you've seen on homeworks.
Because answers will require detailed study to critique and grade effectively, we will choose a subset of assigned homework problems to grade on each assignment. We will announce the subset after they are turned in. The subset will always consist of a mixture of easy, medium, and hard problems. All exam problems will be graded except when there is a widespread misunderstanding or other reason to toss a problem out.
We encourage you to talk with other students about your assignments and questions, but make sure you write up your actual homework assignments independently, and never copy program code from your classmates. Grades are curved in the class, cheating creates a threatening environment for your classmates, and it is taken quite seriously by me and by the department. Any fraud will result in an F in the course that you will not be allowed to remove from your transcript by dropping the course. Ross has followed through on this threat a number of times in undergraduate courses at other schools, but most of the students he has had since he came to CSU have used good judgment, and this has helped to maintain a friendly, trusting atmosphere in his courses.