ICS 32 Winter 2022
Project #0: Square One

Due date and time: Friday, January 7, 11:59pm


Introduction

In this course, you will continue to develop the programming skills you began building in ICS 31, with an ever-sharpening focus on solving larger, more complex problems at a level of quality that edges closer to work done by professionals. While the projects we'll work on this quarter might be simple for someone who has years of prior experience, we will nonetheless attack these problems with the same approach that a professional software engineer might. We'll consider each problem in its full depth, think about how to work on it incrementally, spend some time testing our solution to ensure that it works correctly, and make sure that we've got the little details correct and not just the big ideas. Larger programs that solve real-world problems succeed or fail on being completely correct, and even a one-character mistake in input or output can sometimes make all the difference, so we need to get accustomed to that level of scrunity, so that we can apply it when it is warranted.

This project asks you to do two things:

  1. Set up your development environment, so you will be ready to work on your projects this quarter.
  2. Write a short program and submit it, to ensure that you're aware of the mechanisms of the course — how to write short Python programs, how to submit your work — and so you can become acclimated to how automated testing will be used to grade at least some of your work this quarter.

Setting up your development environment

It is very common in real-world software development jobs to be given, at the outset of a new job, a list of tools that you will be required to use. Flexibility is great, and it's nice to be able to choose one's own toolset, but, unfortunately, many software tools introduce constraints on how a program can be written, how its components can be arranged, what functions can be called, what documentation can be written and how, what additional software it can be combined with, how it can be "built" to be distributed to end users, and so on. So, like it or not, real-world software development usually requires at least some of the tools to be set in stone and used by all members of a team, even if not all members have the same preferences; this is simply a reality that software developers have to face.

Since we will be poking our heads into a fair number of darker "real-world" corners in this course, it becomes necessary for us to agree on the set of development tools that we'll use. Not only will it be important to agree on the right tools, but it will be important to agree to use the right versions of those tools, as each differs in not-insignificant ways. One goal of this project is to introduce you to those tools, provide instructions on how to install and configure them on your own machines, and get you ready to use them for your work this quarter.

Writing a short program

This project will also require you to write and submit a short program. Unlike most of our projects, we're less concerned about how you solve the problem than we normally will be. There are no points for what we call "quality of solution," meaning that issues like style, organization of your program, and so on, are not relevant on this project. All that matters is that the program works, but that is a very precise requirement: The output of your program has to be correct to the character to receive full credit. Paying attention to the exact requirements, then, will be paramount.


The ICS 32 development environment

The development environment for this course will be the IDLE environment that is included within Python. However, we will be using a particular version of Python (3.10.1) and certain configuration that was less important previously will become more important to us this quarter. So rather than installing the tools yourself, I'd like each of you to follow these instructions, even if you think there is a better way to do it; this way, everyone is on an equal footing, and later needs you may not be aware of — if, for example, we start installing and using third-party libraries — will be met.

Note that Python 3.10.1 was released in December 2021, and that's the version you'll want to obtain for your use this quarter. It's fine, in principle, to use 3.10.0 instead, if you've already got it installed — I wouldn't expect there to be any differences that are all that meaningful to us, though it is possible that 3.10.1 will have fixed a bug or two that affects us, so you might still consider upgrading. If you have a version older than 3.10.0, you'll definitely need to upgrade, though, as there are some differences that will potentially affect your work this quarter (e.g., some code I will write in class won't run on versions earlier than 3.10).

What do I do to get things set up?

If you will be doing your work solely using machines in the ICS labs, you're done! The software you need is already installed and configured properly, so there's nothing you'll need to do for this project. Note, though, that some of our labs are "laptop-only" sections, so there may not always be a machine available to you that has Python installed on it.

So, assuming that you will be wanting to do at least some of your work on your own machine, what you do next depends on what operating system you're running on your machine.

Once you're done following the installation instructions for your chosen operating system, you're ready to proceed with your work in this course, beginning with this project.


The program

Your program is required to read a single line of input from the user (without printing any input prompt), which is expected to be a positive integer n (i.e., n will be neither zero nor negative). You can freely assume that your program will be given a positive integer, and it's not important what you do in any other case; we'll only test your program with positive integer input. You can also freely assume that n will not be greater than 999.

After reading the input, your program will print a downward block diagonal of size n. The precise format of a downward block diagonal is best demonstrated with an example. If the input to the program was 4, the output would look like this:

+-+
| |
+-+-+
  | |
  +-+-+
    | |
    +-+-+
      | |
      +-+

A few additional requirements apply:

This is a complete specification of the structure of a downward block diagonal; the description is enough to solve the problem, so we will not be answering any additional questions about its structure. However, we are providing a tool that will give you a basic understanding of whether your program is reading the correct input and generating output in the correct format.

Naming and organizational requirements

How you organize your program is, for the most part, up to you, with a couple of requirements that you'll need to follow.

Other than that, anything goes; you can organize your solution in any way you'd like. Note that future projects will take what we call "quality of solution" a lot more seriously, but the name of the game in this warm-up project is simply to submit a program that works.

Sanity-checking your output

We are also providing a tool that you can use to sanity-check whether you've followed the basic requirements above. It will only give you a "passing" result in these circumstances:

Note that additional test inputs will be used when we grade your project. The way to understand the sanity checker's output is to think of it this way: Just because the sanity checker says your program passes doesn't mean it's perfect, but if you cannot get the sanity checker to report that your program passes, it surely will not pass all of our automated tests.

Running the sanity checker is simple. First, download the Python module linked below:

Put that file into the same directory as your project0.py file, but don't copy this code into your project0.py file or submit it. Running the project0_sanitycheck.py module — for example, by loading it in IDLE and pressing F5 (or selecting Run Module from the Run menu) — will run the sanity checker and report a result, which will be printed to the Python shell.

How we will grade your submission

Unlike other projects, this project will be graded on a 2-point scale, with the 2 points being allocated completely to whether or not you submitted something that meets all of the above requirements. The following rubric will be used:


Deliverables

Submit your project0.py (and no others) to Canvas. Be aware that I'll be holding you to all of the rules specified in that document, including the one that says that you're responsible for submitting the version of the project that you want graded. We won't regrade a project simply because you submitted the wrong version accidentally.

Can I submit after the deadline?

This project is not included in the late work policy for this course. The objective is not just that you do this one, but that you do it early enough to be of benefit, so it needs to be completed during the initial days of the course and submitted before the due date above. Submissions beyond that deadline will not be considered.

The late work policy for this course — which does not apply to this project, but applies to all of the others — is described in the section titled Late work at this link.

What do I do if Canvas slightly adjusts my filename?

Canvas will sometimes modify your filenames when you submit them (e.g., when you submit the same file twice, it will change the name of your second submission to end in -1.py instead of just .py). In general, this is fine; as long as the file you submitted has the correct name, we'll be able to obtain it with that same name, even if Canvas adjusts it.