Topic: | Making a booklet |
Source Code: | booklet.cpp |
Test files: | Sample input file Sample output file |
Live Archive Ref#: | na |
In-Class Day: |
Tuesday, March 22, 2009 |
Submission Deadline: | Friday, March 25, 11:59pm |
Techniques: |
Recursion! |
Please review the general information about lab assignments.
When printing out a document, normally the first page is printed first, then the second, then the third, and so on until the end. However, when creating a fold-over booklet, the order of printing must be altered. A fold-over booklet has four pages per sheet, with two on the front and two on the back. When you stack all the sheets in order, then fold the booklet in half, the pages appear in the correct order as in a regular book. For example, a 4-page booklet would print on 1 sheet of paper: the front will contain page 4 then page 1, and the back will contain page 2 then page 3.
Front Back ------------- ------------- | | | | | | | 4 | 1 | | 2 | 3 | | | | | | | ------------- -------------
Your task is to write a program that takes as input the number of pages to be printed, then generates the printing order.
The input file contains one or more test cases, followed by a line containing the number 0 that indicates the end of the file. Each test case consists of a positive integer n on a line by itself, where n is the number of pages to be printed; n will not exceed 100.
For each test case, output a report indicating which pages should be printed on each sheet, exactly as shown in the example. If the desired number of pages does not completely fill up a sheet, then print the word Blank in place of a number. If the front or back of a sheet is entirely blank, do not generate output for that side of the sheet. Output must be in ascending order by sheet, front first, then back.
Example input:
1 14 4 0
Example output:
Printing order for 1 pages: Sheet 1, front: Blank, 1 Printing order for 14 pages: Sheet 1, front: Blank, 1 Sheet 1, back : 2, Blank Sheet 2, front: 14, 3 Sheet 2, back : 4, 13 Sheet 3, front: 12, 5 Sheet 3, back : 6, 11 Sheet 4, front: 10, 7 Sheet 4, back : 8, 9 Printing order for 4 pages: Sheet 1, front: 4, 1 Sheet 1, back : 2, 3
Listing the entire sequence of pages in the prescribed order is a bit unnatural at first glance, but it turns out to be very easy to produce with recursion. If you can determine what should happen on the front and back of the first sheet, the rest of the pages can be computed using a similar process. The only issue is that the remainder of the booklet will be starting on a different sheet number, and will include a different range of original pages. For this reason, we recommend a recursive signature of the form:
void print(int firstPage, int lastPage, int firstSheet);where this call is responsible for printing pages for the range [firstPage, lastPage], starting on a sheet numbered firstSheet.
As for the first sheet, consider carefully the cases that arise depending on the remainder when dividing the total number of pages by 4 (since there are potentially four to a sheet).
Formatting warning:
Please note that there is a space after the word back but
before the colon.