|
|
Announcements
6/28 - As a part of my patriotic duty, I have rescheduled the July
5th class to Wednesday, July 7th. Class will still start at 5:30PM in
Ryerson 251 (room is still unconfirmed.)
7/19 - Note that assignment 4's due date has been moved to next
week (7/26), and if you turned in something today, that homework will
receive a 20 point bonus.
Vital Information
Before saying anything further, I'd like to note that this is the
website for the Summer 2004 incarnation of CSPP 50101, and is not
to be confused with prior
courses.
Meeting time and place: Mondays, 5:30PM - 8:30PM, Ryerson 251.
Instructor: Jonathan Riehl Office: Hinds
B-024A Phone: Maybe one day the department will blow their budget
and get me a tin can and string... Email: jriehl@cs.uchicago.edu
Teaching assistant: Zhimin (Jim)
Xie
Office hours: Thursdays from 5:00 PM to 7:00 PM in the
4th floor lab in Ryerson.
Email: zxie@cs.uchicago.edu
Textbooks
There is one required text:
Stephen Prata, C Primer Plus (4th ed.) IBSN 0-672-32222-6.
I also recommend just about anything on Andrew
Siegel's page. Of course, the definitive text on C programming is:
Brian Kernighan and Dennis Ritchie, The C Programming Language (2nd
ed.) IBSN 0-131-10362-8.
Grading
Grades will be determined using a careful mixture of in class
quizzes, homework assignments, and a final examination:
| 50% | Homework |
| 20% (10%/ea) | Quizzes |
| 30% | Final examination |
Programming Assignments
Homework will be more or less weekly, for a total of about 10
assignments. Unless otherwise noted, homework will be due by the
start of class that follows the class the homework was assigned.
Late homework will be graded at a penalty of 10% a day.
| Date | Assignment |
| 6/21 |
Part 1: Get an account on the Linux cluster.
Part 2: Send me email with an address you want to be subscribed to the
class mailing list.
Part 3.1: Prata, Ch.2, Exercise 3: Write a program that converts your
age in years to days and displays both values. Don't worry about leap
years or fractional years. You are more than welcome to make up an age if
you are self conscious about your age.
Part 3.2: Prata, Ch.2, Exercise 7: Write a program that calls a
function one_three(). This function should display the word
"one" on one line, call another function called two(),
and display the word "three" on one line. The two()
function should in turn display the word "two" on a single line.
The main() function should display an opening line saying
"Starting now:", call one_three(), and then output a
closing line saying "All done." The output should look like:
Starting now:
one
two
three
All done.
If you have the book, you may notice I embellished the output text
a little. Your program may output either text.
|
| 6/28 | Prata: Chapter 3, exercises 2 and
6. |
| 7/5 | Prata: Chapter 4, exercises 2 and 7.
Chapter 5, exercise 1. |
| 7/12 |
Program 1: Prata, Chapter 6, exercise 4.
Program 2:
Part 1: Write a function that has the following interface:
double average (int size, double values []);
The function should return the average of the first size values in
the array values.
Part 2: Write a function that has the following interface:
double promptForData (int index);
The function should read a double precision floating point number
from the console after printing: "Enter item %d : ". Where %d is
the index number.
Part 3: Write a program that asks for a number of numbers to be
input. Read up to that number, but no more than 50, double precision
floating point numbers into an array. After each number is input,
print a running average, calculated with the average() function
described above. If the average is the last average to be displayed,
indicate it is the final average.
Examples:
Enter number of values to be input : 5
Enter item 1 : 22.3
Current average is 22.3.
Enter item 2 : 54.2
Current average is 38.25.
Enter item 3 : 74
Current average is 50.1667.
Enter item 4 : 83.1
Current average is 58.4.
Enter item 5 : -90.
Final average is 28.72.
Number of values : 500
Too many values, only reading first 50.
Enter item 1 : 0.9
Current average is 0.9.
Enter item 2 : 1.8
Current average is 1.35.
...
Enter item 50: 92.3
Final average is 50.0.
Enter number of values to be input : -234
Final average is 0.
Include in your printout some example output of both programs.
|
| 7/19 |
Read: "man putchar", "man getchar", and Prata, chapter 8.
Code: Prata, Ch. 7, Ex. 10. The loop should also report the current
average taxable income and the number of filers in each category.
See ch7ex8.c. |
| 7/26 |
Part 1: Do chapter 9, exercises 7 and 8 as one program. Name the
iterative function power(), and the recursive function either
r_power() or rPower(). Show the results of both functions side by
side.
Part 2 (BONUS 50%): Redo assignment 5's coding assignment using the
following main function (you may reformat where necessary):
int main (void)
{
char incomeCategory;
int totalFilers = 0;
int filerCounts [4];
double income = 0.0;
double tax = 0.0;
double totalIncomes = 0.0;
initializeCounts(filerCounts);
incomeCategory = doMenu();
while (incomeCategory != 'q')
{
income = getIncome();
tax = calculateTax(incomeCategory, income);
updateStats(incomeCategory, income, &totalFilers, filerCounts,
&totalIncomes);
doReport(incomeCategory, income, tax, totalFilers, filerCounts,
totalIncomes);
incomeCategory = doMenu();
}
return 0;
}
If you chose not to do this, read this code carefully and be sure you
could write function prototypes for the functions called.
|
| 8/2 |
Reading assignment: Prata, Chapter 11.
Programming assignment (part 1 of 2, Both parts will be due till Monday, August 16th, and count for two homeworks total):
Part 1.1: Write a function with the following prototype:
void clearBoard (int rows, int columns, int * boardPtr);
The function should write a zero value to each element in the passed
2-D array.
Part 1.2: Write a function with the following prototype:
void showBoard (int rows, int columns, int * boardPtr);
The function should display the array. If the value of a board location is 0 to 9, print that value, otherwise print "x". Example:
int board [3][3] = { {0, 0, 1}, {99, -2, 7}, {-1, 6, 0} };
/* ... */
showBoard(3, 3, board);
/* ... */
Should display:
0 0 1
x x 7
x 6 0
Part 1.3: Write a function that reads board coordinates, with the following prototype:
int getCoords (int maxRow, int maxCol, int * row, int * col);
The function should read a character followed by a number, and convert these
into a row, column pair that is output through the row, col
parameters. The function should return 0 if an invalid entry was
made, or a 1 if a valid entry was made. Example:
...
printf("Enter coordinates : ");
while (0 == getCoords(3, 3, &myRow, &myCol))
{
printf("Bad coordinates!\nEnter coordinates : ");
}
printf("myRow = %d, myCol = %d\n", myRow, myCol);
...
Example output:
Enter coordinates: yy zz
Bad coordinates!
Enter coordinates : 0 0
Bad coordinates!
Enter coordinates : A10
Bad coordinates!
Enter coordinates : A 9
Bad coordinates!
Enter coordinates : B 2
myRow = 1, myCol = 1
The following chart might help illustrate how this coordinate system works:
1 2 3 4 ...
A (0,0) (0,1) (0,2) (0,3) ...
B (1,0) (1,1) (1,2) (1,3) ...
C (2,0) (2,1) (2,2) (2,3) ...
D (3,0) (3,1) (3,2) (3,3) ...
...
Where the output row and column numbers are given as (row, column).
Part 1.4: Write a function with the following prototype:
void paintSpace (int rows, int cols, int * boardPtr);
The function should read a "Battleship" coordinate using the
getCoords() and an integer value from the console. The integer value should
be written to the board array corresponding to the input coordinate.
Part 1.5:
Write a menu loop (in main(), for now) that asks the following:
************************************************************
0 - Clear the board.
1 - Paint a space.
2 - Show board.
3 - Play game.
4 - Quit
************************************************************
Your choice? _
If they select 0, zero all the values of the board.
If they select 1, ask for coordinates and an integer value to write to
the board. Then write that value to the board.
If they select 2, display the board using the showBoard() function.
If they select 3, tell the user that the game isn't ready yet.
If they select 4, exit the program.
Otherwise, tell the user their input was invalid.
Use a 10x10 board.
|
| 8/10 |
This programming assignment (part 2 of 2) is due (along with part
1) via electronic submission. Attach your code to an email that has
in the subject line: "CSPP 50101 - Assignments 7 and 8". Send the
email to zxie@cs.uchicago.edu
by 11:59 P.M. on Tuesday, August 17, 2004.
Part 2.1: Write a function with the following prototype:
int countPieces (int rows, int columns, int * boardPtr, int counts [9]);
The function should build a histogram (counts of values, indexed by
value) of the "pieces" on the board, where a
"piece" is represented by a value between 1 and 9.
Therefore if there are two 4's on the board, then counts[3] ==
2 when the function is finished. Be sure to initialize the
counts array to zero counts at the beginning. The
countPieces() function should return the total number of pieces
it counted. Zero (0) values or invalid values (anything other than 0
to 9) should not be counted.
Part 2.2.: Write a function with the following prototype:
int fire (int row, int column, int rows, int columns, int * boardPtr,
int * firePtr);
This function will accept a (row, column) input. If a
"piece" (a value between 1 and 9) is detected at that
coordinate on the board (input as boardPtr), then the
function should (1) set that space on the board to a 0 value, (2) set
that space on the firePtr input to a -1 value, and (3) return the old value
found on the board. If the space is blank, the function should (1)
set that space on the firePtr board to a 1 value, and (2) return
0. For example:
int boardPtr [3][3] = {{0, 1, 0}, {0, 0, 0}, {0, 2, 2}};
int fireData [3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
if (fire(0, 1, 3, 3, boardPtr, fireData) != 0) {
printf("Hit!\n");
} else {
printf("Miss.\n");
}
printf("_____\n");
showBoard(3, 3, boardPtr);
printf("_____\n");
showBoard(3, 3, fireData);
printf("_____\n");
if (fire(1, 1, 3, 3, boardPtr, fireData) != 0) {
printf("Hit!\n");
} else {
printf("Miss.\n");
}
printf("_____\n");
showBoard(3, 3, boardPtr);
printf("_____\n");
showBoard(3, 3, fireData);
printf("_____\n");
Will output:
Hit!
_____
0 0 0
0 0 0
0 3 3
_____
0 x 0
0 0 0
0 0 0
_____
Miss.
_____
0 0 0
0 0 0
0 3 3
_____
0 x 0
0 1 0
0 0 0
_____
Part 2.3: Write a function with the following prototype:
int gameMenu (void);
The function should display the following menu, and return the menu
selection as an integer. If an invalid entry is made, inform the user
and continue to prompt for an entry.
************************************************************
0 - Quit the game.
1 - Show hits.
2 - Fire!!!
************************************************************
Your orders? -9
Invalid option.
Your orders? aaaaa
Invalid option.
Your orders? 2
In this example, gameMenu() would return 2.
Part 2.4: Write a function with the following prototype:
void playGame (int rows, int columns, int * boardPtr);
The playGame() function will need to do several things:
- Declare an array to keep track of piece counts.
- Initialize another board to keep track of hits and misses. You
can do this using something like "fireData = calloc(rows *
columns, sizeof(int));" and then "clearBoard(rows,
columns, fireData);"
- Enter into a loop that begins by calling gameMenu().
Based on the return value of gameMenu(), do the following:
- On 0, break out of the loop.
- On 1, use showBoard() to only show the fire data.
- On 2, do the following (you may define your own function here to
do all this, if you want):
- Get target coordinates using getCoords().
- Once valid coordinates are given, use fire() to update
the board and the fire data.
- If fire() returned 0, tell the user they missed.
- Otherwise, tell the user they hit. Then use
countPieces() to recompute the count of pieces. If the
count of the pieces for the return value of fire() is 0, also
print "You sank my %d's!\n", where %d is the piece number.
If the return value of countPieces() was 0, tell the user
they have destroyed everything, and break out of the game.
- Clean up any memory allocated for the fire data.
Part 2.5: Modify your original main() definition so that
the 3 menu option calls the playGame() function for the
current board. When playGame() exits, it should return to
the top level menu.
An example input/output session is available here. Remember to knock off objectives
listed here one objective at a time, and not let the whole scope of
the assignment overwhelm you! If you get stuck on something be sure
to ask for help, and work on other objectives you know you can get.
You may also find it useful to use functions like showBoard()
to output debug data that will be removed before you turn in your
assignment.
BONUS: 20 bonus points will be awarded if you modify your main()
routine to handle variable size boards. For this, you will need to
use either malloc() or calloc(), and ask the user to input the board
size at the begining of the program. Board sizes should not exceed
26x26, nor be smaller than 2x2.
|
| 8/19 | Part 1 of the final assignment is available on its own page. |
| 8/25 | The final assignment page has been updated
with the rest of the assignment information. |
While I don't believe in wasting paper, I feel it is important that
detailed feedback be made available to students. For this reason, initial
assignments should be submitted as printouts. This may change shortly, so
keep a lookout for changes in submission policy.
Readability counts just as much as program correctness. For this
reason, I require each program to have a comment header and a comment
footer. The comment header should have the file name, your name, the
course, the date the file was last edited, the date the file is due, and a
description of the program. The footer should contain the name of the
file. Every function must also have a comment block that explains the
function name, its inputs, outputs and what the function's purpose is.
For example:
/* ______________________________________________________________________
File: example.c
Name: Jonathan Riehl
Course: CSPP 50101
Date: June 21, 2004
Due: June 21, 2004
Description:
This is an example. Yep.
I did this all by myself, but if I didn't, I'd note so here.
______________________________________________________________________
*/
/* ______________________________________________________________________
Include files
______________________________________________________________________
*/
#include <stdio.h>
/* ______________________________________________________________________
Function: main
Inputs: None
Outputs: Return code for program.
Description: Main routine for the program.
______________________________________________________________________
*/
int main (void)
{
printf("Boy, this is a lot of garbage for a simple hello world program!\n");
return 0;
}
/* ______________________________________________________________________
End of example.c
______________________________________________________________________
*/
Style penalties are listed below:
| Problem | Penalty |
| Missing or improper header/footer. | -10 pts. |
| Missing or improper comment block | -5 pts. each |
| Indentation mismatch | -3 pts. each |
| Curly brace style mismatch | -3 pts. each |
| Improper variable name | -3 pts. each |
The style notes I did for
operating systems may also help illustrate just how much of a jerk I am.
These notes will transition into doctrine when we move to programs with
more than one file.
Academic, Honestly
Please note: The following was copied and adapted from an
original I think came from Stuart Kurtz.
The University of Chicago is a scholarly academic community. You
need to both understand and internalize the ethics of our community.
A good place to start is with the Cadet's Honor Code of the US
Military Academy: "A Cadet will not lie, cheat, or
steal, or tolerate those who do." It is important to
understand that the notion of property that matters most to
academics is ideas, and that to pass someone else's ideas off as
your own is to lie, cheat, and steal.
The University has a formal policy on
Academic Honesty, which is somewhat more verbose than West Point's.
Even so, you should read and understand it.
I believe that student interactions are an important and useful
means to mastery of the material. I recommend that you discuss the
material in this class with other students, and that includes the
homework assignments. So what is the boundary between acceptable
collaboration and academic misconduct? First, while it is
acceptable to discuss homework, it is not acceptable to
turn in someone else's work as your own. When the time comes to
actually code your solution, you should type it yourself from your
own memory. Moreover, you should cite any material discussions, or
written sources, e.g.,
Note: I discussed this program with Jane Smith.
The University's policy, for its relative length, says less than it
should regarding the culpability of those who know of misconduct by
others, but do not report it. An all too common case has been where
one student has decided to "help" another student by
giving them a copy of their assignment, only to have that other
student copy it and turn it in. In such cases, I will view both
students as culpable and pursue disciplinary sanctions against
both.
For the student collaborations, it can be a slippery slope that leads
from sanctioned collaboration to outright misconduct. But for all the
slipperiness, there is a clear line: present only your ideas as yours
and attribute all others.
If you have any questions about what is or is not proper academic
conduct, please ask me.
|