Manual PDF
Manual PDF
Manual PDF
Programming
Shanti Bruyn
Contents
Syllabus
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
9
9
9
10
11
11
11
12
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
13
14
14
14
16
18
18
22
23
23
23
23
24
24
24
25
25
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduction to Programming
9
10
3
Collatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SecondSmallest . . . . . . . . . . . . . . . . . . . . . . . .
25
26
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
27
27
28
28
31
32
32
32
32
32
33
34
34
Parsing input
Goals . . . . . . . . . . . . . . . . .
Theory . . . . . . . . . . . . . . . .
Layout . . . . . . . . . . . . .
Switch . . . . . . . . . . . . .
Comments . . . . . . . . . . .
Advanced use of the Scanner
Assignments . . . . . . . . . . . . .
1
Replay 2 . . . . . . . .
2
Replay 3 . . . . . . . .
Graded Assignment . . . . . . . . .
3
Statistics . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
36
37
37
38
39
40
43
43
43
44
44
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
46
46
47
47
51
51
51
51
52
52
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
53
54
54
55
55
60
60
.
.
.
.
.
.
.
Introduction to Programming
2
Animation . . . . . . . . . . . . . . . . . . . . . . . . . . .
Graded Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Snake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
61
61
Recursion
Goals . . . . . . . . . . . . . . .
Assignments . . . . . . . . . . .
1
Numbers . . . . . .
2
Reversed Number
3
Droste . . . . . . .
Graded Assignment . . . . . . .
4
LongestPath . . . .
.
.
.
.
.
.
.
63
63
64
64
64
64
67
67
Bonus
Graded Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
Life . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
70
70
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
This manual is a translation of the thirtieth edition of the Dutch Practicumhandleiding Inleiding Programmeren, mainly written by Klaas Sikkel, Pieter Hijma,
Atze van der Ploeg and Richard van Heuven van Staereling. A more detailed
history of this manual can be found in the Dutch version of this manual. The
manual has been translated by Jan Stienstra in co-operation with a second
reader, Bram Veenboer.
Jan Stienstra, July 2011
For the second edition of this manual, a lot of minor, but important, changes
have been made. Special thanks to Wouter Hielckert and Rick de Leeuw for a
lot feedback on the first edition of this manual.
Jan Stienstra, December 2011
The third edition of this manual contains an extra section of theory on setting the default Locale. Next to this some more minor changes have been made.
Starting from this third edition, an additional manual is available containing
supplementary excercises.
Jan Stienstra, March 2012
The fourth edition of this manual is adapted to reflect the use of a translated
UserInterface library. Next to this, some more minor changes have again been
made.
Jan Stienstra, September 2012
0
Syllabus
Course format
This course features a series of lectures and parallel lab sessions. During the
lectures the theory of programming is taught, during the lab sessions programming is practiced by making assignments using Java. Assignments should be
prepared in advance, at home. Students will be assigned to groups. Every
group will have a teaching assistant, who will help with the assignments and
grade the graded assignments.
Introduction to Programming
Module
1
2
3
4
5
6
7
Module 0: Syllabus
Introduction to Programming
Module
1
2
3
4
5
6
7
8
Graded Assignment
HelloWorld2
All
Replay1
Statistics
Pirate
Snake
LongestPath
Life
Module 0: Syllabus
Weight
slipday
slipday
1x
1x
2x
3x
3x
see below*
* If you pass the bonus assingment, one tenth of your mark will be added to your lab grade
Slipdays The first two modules do not include graded assignments. There
are regular assignments to be made, so there is also a deadline in the first two
modules. You can earn a slipday if all the assignments have been approved
before the deadline (you can earn at most 2 slipdays). The first module, in
order to receive the slipday, attendance is mandatory. Slipdays can be used in
the following modules. An assignment can be turned in a day late, without
point deduction, using a slipday. Two slipdays can be used to submit a single
assignment two days late, or two assignments one day late.
Final Grade You have passed the lab when:
1. all assignments have been approved
2. every graded assignment has been graded
3. the average grade of all the graded assignments is sufficient ( 5, 5).
You passed the Introduction to Programming course if both the exam and lab
are passed (both 5, 5). The final grade for this course is calculated using
the following formula: E = M AX(T, (2 T + P )/3). Thus the lab can never
influence your final grade negatively.
1
Editing, Compiling and Executing
Abstract
This module will introduce the IDE (Integrated Development Environment) Eclipse and explain how to organize Java files and execute programs.
Goals
The use of Eclipse to open, edit, save and organize Java-files
Compile and execute Java files
Print source code
Introduction to Programming
Introduction to Eclipse
Instaling and starting Eclipse
VU Eclipse has already been installed on all the computers that will be used
during the lab sessions. Using Windows, it can be started from the Start
Menu. Using Linux, it can be started by typing eclipse in a terminal window.
At home, using Windows To use Eclipse at home, it is neccessary to install
the Java Development Kit (JDK) and Eclipse itself. It is likely that Java
has already been installed on your computer, in the form of a Java Runtime Environment (JRE). Whilst Java programs can be executed using this
JRE, they cannot be compiled. To compile programs, a JDK is needed.
The JDK can be downloaded from Oracles website: http://www.oracle.
com/technetwork/java/javase/downloads/.
This site provides a number of different versions of the JDK: Java SE
(Standard Edition), Java EE (Enterprise Edition), Java ME (Micro Edition)
and more. For this course, Java SE will be used. Click Download JDK
and download the Java SE Development Kit.
To download Eclipse, browse to http://www.eclipse.org/downloads/
and download Eclipse IDE for Java Developers.
At home, using Linux or Mac OS X Java is installed in different ways, depending on the distribution. In a Debian-based distribution, Java can be downloaded from the repository. For example, using Ubuntu: open a terminal window and type sudo apt-get install sun-java6-jdk. To install
Java on a different distribution, visit their support site. The JDK is already
installed on Mac OS X.
To download Eclipse, browse to http://www.eclipse.org/downloads/
and download Eclipse IDE for Java Developers.
Selecting a workspace The workspace is a folder in which all created files are
saved. The workspace only has to be defined once. When Eclipse is started
for the first time, it will automatically prompt for a location for the workspace.
If, for whatever reason, this does not happen, it can be done manually: File
Switch Workspace. The home directory is usually a good place for the
workspace /home/vunet-id/eclipse/yearone.
Arranging files
After selecting the workspace, a welcome screen will be shown. Click on Workbench. On the left of the current window, the Package Explorer is shown. This
frame will hold all files, sorted on Project. Every Project consists of Source Folders, whilst Source Folders consist of Packages. This may sound complicated on
first glance, but the next few steps will explain everything.
1. Create a new Java Project. To do this right-click in the Package Explorer
and select New Project. Select Java Project and click Next. The name
of this project will be Introduction to Programming. Click Finish.
9
Introduction to Programming
2. Create a new Source Folder. All Source Files used in one assignment will
be logically grouped together in a Source Folder. In this course, every
module will have its own Source Folder. Right-click on the project in the
Package Explorer and select New Source Folder. Name it module1
and click Finish.
3. Every assignment will have its own Package. Right-click on the Source
Folder that was just created and select New Package. The name of the
Package will be the same as the name of the assignment.
4. Create a new Class. Right-click on the current package and select New
Class. There are loads of options, but for now, only Name is relevant.
Select public static void main everytime you create a new program. The
first class in this course will be HelloWorld1.
{
: ...
: HelloWorld1
: ...
PrintStream out;
HelloWorld1() {
out = new PrintStream(System.out);
}
void start() {
out.printf("Hello world!! ");
out.printf("written by: %s\n", "...");
}
Programs are compiled automatically in Eclipse. Make sure that the file is
saved (Ctrl+s). Right-click on the file to be executed and select Run As Java
Application. To execute the same program again, use Ctrl+F11. The output of
the program will be printed in the Console, at the bottom of the screen. If the
program expects input, it can be typed into the Console as well.
Programs can only be executed if they are syntactically correct. If there are
any errors, these are underlined in red. Hover the mouse over the underlined
words to show an error message. Eclipse can automatically solve problems,
10
Introduction to Programming
but be aware: Eclipse tends to do things you do not want it to do. Only use this
feature, if you understand what the error is, and how it can be solved.
Printing a program
Printing using Windows or Linux To print a program, select File Print or
use Ctrl+P. Print two pages on one page.
Submitting Assignments
A graded assignment needs to be submitted to Practool. How to do this is
explained in the following steps:
1. Export all the files of the assignment to a .jar-file. Right-click on the Package in the Package Explorer to be exported and select Export. Select Java
JAR file and click Next. Make sure the name of the file starts with the
11
Introduction to Programming
Trial Submission
Create a new class HelloWorld2 with a new Package HelloWorld2 and copy HelloWorld1 to the Package HelloWorld2 and edit the code in the following way:
Hint: Copying files using Eclipse can be done easily using the refactor functionality provided by Eclipse. For more information about refactoring, visit:
http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.
doc.user%2Fconcepts%2Fconcept-refactoring.htm
Add a second import-statement:
import java.util.Scanner;
Edit the start-method in such way that it will ask for your name:
void start() {
Scanner in = new Scanner(System.in);
out.printf("Enter your name: ");
String name = in.nextLine();
Test the program. Does it work as expected? Print the program, hand-in the
print to your Teaching Assistent and submit the program to Practool.
This program is not graded like the other assignments that have to be submitted, however it is possible to earn a slipday if the program is submitted on
time. The syllabus provides more details on slipdays. The goal of this program
is to make sure that you can print and submit programs. These are essential
skills required during the rest of this course.
12
2
If statements and loops
Abstract
The first few programs in this module will read from standard input and
write output to standard output. These programs will be very simple. The
focus in the first part of this module will be on writing programs with
a clear layout using well chosen names. The second part of this module
will introduce if statements and loops.
Warning
This module contains ten assignments of variable size. Make sure to utilize the time given to you during the lab sessions. The lab sessions only
provide sufficient time if you write your programs in advance. This way,
any problems you encounter whilst writing your programs can be resolved during the lab sessions.
Goals
The use of clear identifiers.
Familiarize with if, else and else-if statements and recognize situations in
which to apply these.
Familiarize with for, while and do-while loops and recognize situations in
which to apply these.
Instructions
Read the theory about Efficient programming and Constants. With this
information in mind, make the assignments VAT, Plumber 1, Plumber 2
and Othello 1.
Read the theory about Identifiers and If-statements. With this information in mind, make the assingments Electronics and Othello 2.
13
Introduction to Programming
Study your lecture note on Loops. With this information in mind, make
the assignments Manny, Alphabet, Collatz and SecondSmallest.
Theory
Efficient programming
Once upon a time, running a computer was so expensive that any running
time that could be saved was worthwile. Programs had to contain as few lines
of code as possible and programs were designed to run fast; clear code was
not a priority. Such a programming style is nowadays called machine-friendly.
Luckily for us, that is no longer necessary.
Programs that have been written in the past often need altering in one way or
another. If a program was written in a machine-friendly, but incomprehensible
programming style, it is almost impossible to edit it. After half a year, one
easily forgets how the program works. Imagine the problems that could occur,
if the programmer that wrote the code no longer works for the company that
wants to change it.
The direct result of this programming style is that programs are not changed
at all. Everyone has to work with the, well-intentioned, features that are no
longer changeable.
Running programs is becoming increasingly less expensive. Programmers, on
the other hand, are only getting more expensive. Efficient programming therefore does not mean:
writing programs that work as fast as possible.
but
writing programs that require as little effort and time possible to be
comprehensible
reliable
easily maintained.
This will be one of the major themes during this course. The Assignments that
youll make during this course will not be marked sufficient unless they do
what the assignment requiers them to do and meet the requirements mentioned
above.
Theory provided in this Instruction Manual is an addition to the lectures and
the book. The book contains a thorough introduction into Java mechanics, this
instruction manual will teach you how to write Java, taking the standards described above into account.
Constants
Imagine a program that reads a number of addresses from a file and prints
them on labels - thirty characters wide, six lines high. All of the sudden, the
wholesale company changes the size of the labels to thirty-six characters wide
and five lines high.
Fortunately, the program looks like this:
14
Introduction to Programming
class Labels {
// Name
: ...
// Assignment : Labels
// Date
: ...
/* This program reads adresses from input,
* and prints them in a specific format.
*/
static final int LABEL_WIDTH = 30;
LABEL_HEIGHT = 6;
}
// characters
// lines
// etc...
The only thing that needs to be done, is to change the two constants and recompile.
Errors that can occur when a program does not incorporate constants are:
The code contains a 6 on 12 different places and is only replaced
on 11 places by a 5
Derived values like 5 (= LABEL_HEIGHT - 1) are not changed to
4 (= LABEL_HEIGHT - 1)!
Constants cannot only ease the maintenance of a program, but can increase the
comprehensibility of the code as well. When a constant, like LABEL_HEIGHT, is
used, it is imediately clear what this number represents, instead of only knowing its numerical value. For this reason, the usage of constants is very valuable.
Therefore, it is advisable to use constants in programs, even if the value of the
constant will never change.
Rule of Thumb
All numbers used in a program are constants, except 0 and 1.
Example The following example program will read a number of miles from
the standard input and prints the equivalent number of kilometers on the output. Take special notice to the use of identifiers, constants and layout.
import java.util.Scanner;
import java.io.PrintStream;
class MileInKilometers {
static final double MILE_IN_KILOMETERS = 1.609344;
PrintStream out;
MileInKilometers() {
out = new PrintStream(System.out);
}
void start() {
15
Introduction to Programming
Identifiers
All constants, types, variables, methods and classes have to be assigned a
name. This name is called the identifier. This identifier has to be unique within
the class it is defined in. This might seem easier than it is. In this practical you
will learn to link the correct identifier to an object.
The importance of the right name The identifier that is assigned to an object
should reflect the information it contains. When a variable is needed to maintain a record of the number of patients in a hospital, n would not suffice as
the identifier for this variable. The identifier n does not give any information
about this variable. When the identifier number is chosen, the problem seems to
be resolved, but is not: it is still unclear to which number the identifier refers.
Is it the number of doctors? Is it the number of beds? No, it is the number
of patients. That is why this variable should be called numberOfPatients. It
might take some time to find an appropriate identifier in some cases, but it is
certainly worth the effort. This ensures that everyone will understand your
program, including the teaching assistant.
Example A long time ago, the maximum length of identifiers was limited in
some programming languages. All information about the contents of the variable had to be contained in six or seven characters. This meant that it was very
difficult to find clear and understandable identifiers. As a result, programs
were often hard to read. A program that had to find travel times in a timetable
would contain identifiers like:
int ott, // outward travel time, in minutes
rtt; // return travel time, in minutes
Introduction to Programming
Abbreviated identifiers Uncommon abbreviations should not be used as identifiers, as the example above illustrates. Identifiers do not necessarily have to
be long to be understandable. In mathematics for example, characters are often used to denote variables in equations. Lets have a look at the quadratic
equation:
ax2 + bx + c = 0
A quadratic equation has at most two solutions if the discriminant is larger
than zero:
b b2 4ac
2a
A program to solve a quadratic equation would contain the following code:
discriminant = (b * b) - (4.0 * a * c);
if (discriminant >= 0) {
x1 = (-b + Math.sqrt(discriminant)) / (2.0 * a);
x2 = (-b - Math.sqrt(discriminant)) / (2.0 * a);
}
Note that this implementation uses the identifiers a, b and c in the same way as
the mathematical definition. Readability would not improve if these identifiers
would be replaced by quadraticCoefficient, linearCoefficient and constantTerm. It is
clear that using a, b and c is the better choice. The identifier discriminant is used
as no specific mathematical character is defined for it. The class Math identifies
the method to calculate a square root with sqrt(), it also identifies a number
of other methods with equally well known abbreviations. For example: cos(),
ln() and max().
Exceptions There are some conventions for identifiers. An example for calculating the factorial of n > 0:
int factorial = n;
for(int i = n-1; i > 0; i--){
factorial *= i;
}
The identifier for the variable n is not changed into argument. Numerical arguments are by convention often identified as n. Variables that are used for
iterations are similarly not identified as counter, but as i. When more than one
iterator is used, it is common practice to use j and k as identifiers for next iterators.
Lets look at another example. When programming a game of chess, the pieces
on the board can be identified by ki (king), qu (queen), ro (rook), bi (bishop), kn
(knight) and pa (pawn). Anyone a elemental knowledge of chess will surely
understand these abbreviations. However, if someone else reads this program
kn might be interpreted as king and ki as knight. This example shows the
17
Introduction to Programming
need of psychological distance between two identifiers. The psychological distance between identifiers cannot be measured exactly. Psychological distance
is roughly defined as large when the chance of confusion between identifiers
is nearly non-existing, and as small when it is almost inevitable. Two identifiers with a very small psychological distance are the identifiers in the first
timetable example.
Rule of Thumb
Identifiers which are used a lot in the same context, need to have a large
psychological distance.
Conventions
One important restriction for choosing identifiers is that they cannot contain
whitespace. It is common practice to write identifiers consisting of multiple
words by capitalising each word, except the first. In this practical the following
guidelines are in place:
Names of variables, methods and functions begin with a lower case letter.
All following words are capitalised. No whitespace is used.
Example: int numberOfStudents;
Example: void start() { ... }
Example: X readX(Scanner xScanner);
Identifiers identifying constants are written in upper case. If an identifier
for a constant consists of multiple words they are separated by underscores.
Example: static final int MAXIMUM_NUMBER_OF_STUDENTS = ...;
Identifiers identifying a class are written in the same way as variables
except for the first letter, which is capitalised.
Example: class CollegeTimetable { ... }
Self test
Expressions 1
The following questions are on expressions. These questions do not need to be
turned in. Do make sure you are able to answer all the questions, as similar
questions will be asked during the exam. For all questions give the generated
output, or indicate an error. In addition write down every expression in a
question and denote the type and value of the result of the expression.
Question 1
void start() {
int result = 2 + 3;
}
18
Introduction to Programming
Question 2
void start() {
double result = 1.2 * 2 + 3;
}
Question 3
void start() {
String result = "ab" + "cd";
}
Question 4
void start() {
char result = 'c' - 'a' + 'A';
}
Question 5
void start() {
boolean result = true || false;
}
Question 6
void start() {
int result = 17 / 4;
}
Question 7
void start() {
int result = 17 % 4;
}
Question 8
void start() {
if (true) {
out.printf("not not true");
}
}
Question 9
void start() {
if (false) {
out.printf("really not true");
}
}
Question 10
19
Introduction to Programming
void start() {
if (2 < 3) {
out.printf("2 is not larger or equal to 3");
}
}
Question 11
void start() {
if ((3 < 2 && 4 < 2 && (5 == 6 || 6 != 5)) || true) {
out.printf("too much work");
}
}
Question 12
void start() {
char number = '7';
}
out.printf("%c", number);
Question 13
void start() {
if (false && (3 > 2 || 7 < 14 || (5 != 6))) {
out.printf("finished quickly");
}
}
Expressions 2
The following questions are about expressions. For all questions give the generated output, or indicate an error. In addition write down every expression in
a question and denote the type and value of the result of the expression.
Question 1
double function() {
int number = 2;
return number / 3;
}
void start() {
double result = function() * 3;
}
Question 2
boolean worldUpsideDown() {
boolean numbersUpsideDown = 2 > 3;
boolean booleansUpsideDown = true == false;
}
20
Introduction to Programming
void start() {
if (worldUpsideDown()) {
out.printf("The world is upside down!\n");
} else {
out.printf("The world is not upside down.\n");
}
}
Question 3
int awkwardNumber() {
char character = 'y';
return 'z' - character;
}
void start() {
out.printf("The result is awkward result: %s\n",
awkwardNumber() );
}
Question 4
void start() {
if ('a' < 'b') {
out.printf("smaller\n");
}
}
Question 5
void start() {
if ('a' > 'B') {
out.printf("hmmm\n");
}
}
Question 6
void start() {
char number = '7';
out.printf("%d\n", number - 1);
}
21
Introduction to Programming
If-statements
Study your lecture notes on if-statements. Section 3.1 of the book will
provide additional information on if-statements.
Example This example program will read an exam grade and prints whether
this student has passed.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Scanner;
import java.io.PrintStream;
class Passed {
static final double PASS_MINIMUM = 5.5;
PrintStream out;
Passed() {
out = new PrintStream(System.out);
}
void start() {
Scanner in = new Scanner(System.in);
out.printf("Enter a grade: ");
double grade = in.nextDouble();
22
Introduction to Programming
Assignments
1.
Before starting
with this assignment,
read
the
theory about Efficient programming
en Constants.
2.
VAT
Write a program that takes the price of an article including VAT and prints the
price of the article without VAT. The VAT is currently 21.00%.
Example Using an input of 121 the output will be:1
Enter the price of an article including VAT: 121
This article will cost 100.00 euro without 21.00% VAT.
Plumber 1
The employees at plumbery The Maverick Monkey are notorious bad mathmaticians. Therefore the boss has decided to use a computer program to calculate the costs of a repair. The costs of a repair can be obtained with the following
calculation: the hourly wages multiplied by the number of billable hours plus
the call-out cost. The number of billable hours is always rounded. Plumbing
laws fix the call-out cost at e16,00.
Write a program that calculates the costs of a repair. Take the hourly wages
and number of billable hours as input for this program.
Example A plumber earning e31,50 an hour working for 5 hours should get
the following output.
Enter the hourly wages: 31.50
Enter the number of billable hours: 5
The total cost of this repair is: e173.50
3.
Plumber 2
After careful assessment of the new program it turns out that the employees of
The Maverick Monkey are as bad at rounding numbers as they are at making
calculations. Therefore the boss decides to alter the program in such a way that
the program only needs the number of hours an employee has actually worked.
The program will determine the number of billable hours based on this input.
Make a copy of the previous assignment and edit the code to implement this
new feature. The number of billable hours is the number of hours worked
rounded to an integer.
Example A plumber earning e31.50 an hour, working for 4.5 hours should
get the following output.
Enter the hourly wages: 31.50
Enter the number of hours worked: 4.5
The total cost of this repair is: e173.50
23
Introduction to Programming
4.
Othello 1
During this course there will be multiple assignments concerning the game of
Othello, also known as Reversi. More about Othello can be found at: http:
//en.wikipedia.org/wiki/Reversi.
The goal of this assignment is to give some information about the outcome
once a game has finished. This information is obtained by two measurements:
The percentage of black pieces of all the pieces on the board.
The percentage of the board covered in black pieces.
The Othello board measures eight squares by eight squares, making the total
number of squares sixty-four.
Write a program that takes the number of white pieces followed by the number
of black pieces as input. Print the two percentages as output.
Example
Enter the number of white pieces on the board: 34
Enter the number of black pieces on the board: 23
The percentage of black pieces on the board is: 35.94%
The percentage of black pieces of all the pieces on the board is: 40.35%
5.
Before starting
this
assignment,
read
the
theory
about
Identifiers
and If-statements.
Electronics
The electrics company The Battered Battery is nearly bankrupt. To avoid total
disaster, the marketing branch has come up with a special sale to attract more
customers. Whenever a customer buys three products, he or she receives a 15%
reduction on the most expensive product. Write a program that takes the prices
of three products as input and prints the discount and final price as output.
Example Determine the reduction and final price if the three products cost
e200, e50 and e25 respectively.
Enter the price of the first article: 200
Enter the price of the second article: 50
Enter the price of the third article: 25
Discount: 30.00
Total: 245.00
6.
Othello 2
During a game of Othello the time a player spends thinking about his moves
is recorded. Write a program that takes the total time that two players have
thought, one human, one computer, in milliseconds as input. The program
determines which of the two players is human and prints the thinking time
of the human in the following format: hh:mm:ss. It may be assumed that a
computer does not require more than a thousand milliseconds to contemplate
its moves.
24
Introduction to Programming
Example
Enter the time the black player thought: 234432
Enter the time the white player thought: 36
The time the human player has spent thinking is: 00:03:54.
7.
The following
four
assignments
use loops. Use the
right loop for the
right
assignment,
using all the following loops: for, while
without hasNext(),
while with hasNext()
and do-while.
Manny
Mobster Manny thinks he has found the perfect way to part money from their
rightful owners, using a computer program. Mobster Manny secretly installs
the program on someones computer and remains hidden in a corner, waiting
for the program to finish. The program will ask the user how much he or she
wants to donate to charity: the thirsty toads in the Sahara (Mannys Wallet).
If the unsuspecting victim wants to donate less than e50, the program will
ask again. The program will continue to ask for an amount until the user has
agreed to donate e50 or more, after which Mobster Manny will show up to
collect the money.
Write this malicious program, but make sure it does not fall in the wrong
hands.
Example An example of a correct execution of the program is shown below:
Enter
0
Enter
10
Enter
52.20
Thank
8.
Alphabet
Write a program that prints the alphabet on a single line.
9.
Collatz
One of the most renowned unsolved problems is known as the Collatz conjecture. The problem is stated as follows:
Start out with a random number n.
if n is even, the next number is n/2
is n is odd, the next number is 3n + 1.
This next number is treated exactly as the first. This process is repeated.
An example starting with 11: 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 4 2 1 4
2 1 ...
Once the sequence has reached 1, the values repeat indefinitely. The conjecture is that every sequence ends with 4 2 1 4 2 1 . . .
25
Introduction to Programming
10.
SecondSmallest
Take an unknown number of positive integers as input. Assume that the first
number is always smaller than the second, all numbers are unique and the
input consists of at least three integers. Print the second smallest integer.
Example
10 12 2 5 15
The second smallest number is:5
To denote the end of the input, press enter followed by Ctrl-Z (Windows) or
Ctrl-D (Linux and OSX).
26
3
Methods and functions
Abstract
The programs written in the previous module use if-statements and
loops. Writing complicated programs with these statements will quickly
result in confusing code. Introducing methods and functions to the code
can solve this problem. This module will provide the neccesary knowledge on how to use these and more importantly, on how to structure the
code.
Goals
Familiarize with methods, functions and parameters.
Use methods and functions to structure programs.
Instructions
Read the theory about Methods and functions. With this knowledge
in mind, make the assignments NuclearPowerPlant, RepeatCharacter 1,
RepeatCharacter 2, Pyramid and Pizza.
Make sure to import the library libUI.jar into Eclipse as described in Importing the libUI.jar. Now make the graded assignment Replay 1.
27
Introduction to Programming
Theory
Methods and functions
The theory on how methods work, what they are used for and how to call them
has been explained in the lectures. A method call is just another statement.
The execution of this statement is slightly more complicated than the execution
of a normal Java statement; instead of executing a single statement, a whole
method, possibly calling other methods, has to be executed. The great thing
about using methods is that at the moment that a method is called, it does not
matter how the method is executed. The only thing that matters is what the
method does, and not how the method does this.
An example. A program that translates Dutch text into flawless English will
no doubt feature a piece of code like this:
class TranslateDutchToEnglish {
void start() {
while (in.hasNext()) {
String dutchSentence = readSentence();
String englishSentence = translateSentence(dutchSentence);
writeSentence(englishSentence);
}
}
}
// etc
It is very unlikely that someone will doubt the correct execution of this piece
of code. Whilst writing a part of the program, it is assumed that the methods
readSentence(), translateSentence() and writeSentence() exist. How these methods work, does not matter. Without knowing how these methods work, it cn
be concluded that this piece of code is correct.
The method readSentence() is not that difficult to write. A sketch of this method:
String readSentence() {
/* Returns a Dutch sentence. */
String sentence = readWord();
while (!endOfSentence()) {
sentence += " " + readWord();
}
}
return sentence;
Methods are used to split the program in smaller parts, that have a clear and
defined function. This can all be done without knowing how other methods
do what they are supposed to do. When writing a part of the program, it is
important not to be distracted by a detailed implementation somewhere else in
the program. This also works the other way around. When writing a method,
it is not important what it is used for in the part of the program that calls it. The
only thing that matters, is that the method does exactly what it is supposed to
do according to the method name.
28
Introduction to Programming
Small pieces of code can easily be understood and can be checked easily whether
they do what they are supposed to do.
Rule of Thumb
A method consists of no more than 15 lines.
import java.io.PrintStream;
import java.util.Scanner;
class Hatzelklatzer {
// Name
: Heinz Humpelstrumpf
// Assignment: Hatzelklatzer
// Date
: 9-29-1997
static final int STARTING_YEAR = 1950,
FINAL_YEAR = 2050;
PrintStream out;
Hatzelklatzer() {
out = new PrintStream(System.out);
}
void printPercentageOfCases(double percentage) {
out.printf("The percentage of illnesses that match " +
"the hypothesis is: %.2f\n", percentage);
}
/* Reads a number from the input. If the number is not
29
Introduction to Programming
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
return month % 2 != 0;
if (oddMonth(dateScanner)) {
numberInOddMonths += 1;
}
totalNumberOfSeizures += 1;
30
Introduction to Programming
78
The Replay 1
assignment is the
first assignment that
requires the libUI.
Complete all previous assignments
before starting on
this assignment.
During the remaining part of this course, some of the assignments require the
UserInterface. The UserInterface is a collection of classes that enables the use
of a graphical interface instead of the console as input and output. Such a
collection of classes, providing additional features, is called a library.
To use this library, the Java compiler and the Java interpreter have to know
where to find the UserInterface-library. Right-click on Introduction to Programming in the Package Explorer and select Build Path Add External
Archives. Select the file /home/ip/lib/libUI.jar1 . Click OK.
Import-statements can now enable the use of specific elements of the UI-library.
This works similarly to import-statements for the Scanner and PrintStream classes.
For example, the program requires the UserInterfaceFactory from the libUI.jar. To
enable this class to be used, add the following line to the top of the program:
import ui.UserInterfaceFactory;
Selecting input using the UserInterface Using the libUI.jar library, Eclipse
can use files as input instead of the standard input, the keyboard. To select a file
as input, the askUserForInput() method is used. This method can be found in
the UIAuxiliaryMethods class. Add the following line to the top of the program:
import ui.UIAuxiliaryMethods;
When a program is executed that includes the above mentioned statement, the
program will open a browser to select the input file. Clicking Cancel will reenable standard input. Browse to the location of the file and press Enter. The
program will now use the file instead of the keyboard as input.
Using the UserInterface on laptops Using the UserInterface on a laptop with
a small screen resolution may cause a part of the UserInterface to disappear off
screen. To prevent this, add the following statement to the constructor:
UserInterfaceFactory.enableLowResolution(true);
1 On
31
Introduction to Programming
Assignments
1.
Before starting
this
assignment,
read
the
theory
on Methods and
functions.
NuclearPowerPlant
The nuclear powerplant at Threeyedfish will automatically run a program to
print a warning message when the reactor core becomes unstable. The warning
message reads:
NUCLEAR CORE UNSTABLE!!!
Quarantine is in effect.
Surrounding hamlets will be evacuated.
Anti-radiationsuits and iodine pills are mandatory.
Since the message contains crucial information, it should be printed three times.
Write a program that prints this message three times using a single method. Do
not use duplicate code. Seperate every warning message by a blank line.
2.
RepeatCharacter 1
Write a program that will:
read a number from standard input
print that number of exclamation marks
Use methods with parameters for this assignment.
3.
RepeatCharacter 2
This assignment takes of where RepeatCharacter1 has finished. Make a copy of
RepeatCharacter1 and edit the code so that the program will:
read a number from standard input
print that number of exclamation marks
read another number from standard input
print that number of commas
Solve this problem with as little change to the previous program as possible.
One method should suffice.
4.
Pyramid
Write a program that prints a pyramid made of letters in the middle of the
screen. Use methods with parameters for this assignment. The example shows
the expected output, a pyramid of 15 levels. It can be assumed that the screen
width is 80 characters.
32
Introduction to Programming
Example
a
bbb
ccccc
ddddddd
eeeeeeeee
fffffffffff
ggggggggggggg
hhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkk
lllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnn
ooooooooooooooooooooooooooooo
5.
Pizza
Mario owns a pizzaria. Mario makes all of his pizzas with 10 different ingredients, using 3 ingredients on each pizza. Marios cousin Luigi owns a pizzaria
as well. Luigi makes all his pizzas with 9 ingredients, using 4 ingredients on
each pizza. Mario and Luigi made a bet: Mario believes that customers can
order more pizzas in his pizzaria than they can order in Luigis pizzaria.
Write a program that calculates the winner of this bet. Use functions for this
assignment.
Hint When choosing k items from n possible items, the number of possibilities can be obtained using the following formula:
n
n!
=
k
k!(n k)!
33
Introduction to Programming
Graded Assignment
6.
Starting whith
this assignment, a lot
of assignments will
be using the library
libUI.jar and read input from a file. Instruction on how to
do this in Eclipse can
be found in Importing the libUI.jar.
Replay 1
The goal of this assignment is to write a program that can replay a game of
Othello. The input file contains all the changes that have been made to the
board in every turn. All the changes that are made during a turn are to be
visualized on screen.
Read and process one line of the input file at a time, letting the changes take
place on the board. After each turn, the game halts as long as it has been
instructed to by the input file. When the end of the file is reached, the game
has finished.
The game starts with four stones in the center of the screen. Two white stones
at d 4 and e 5 and two black stones at d 5 and e 4. Make sure that these stones
are present before processing any turns.
Input specification A number of games of Othello can be found on Blackboard. A part of the input file could looks like this:
white
white
black
black
white
white
black
black
etc...
4198
0
0
0
1383
0
4
0
move
move
move
move
move
move
move
move
c
d
c
c
b
c
a
b
3
4
2
3
2
3
2
2
The line starts with indicating which player played this turn. The next number
indicates the thinking time in milliseconds. After this there is either the word
"move" or "pass". Stones are only being placed when a turn is not passsed. The
coordinate following a waiting time > 0 is the stone placed by the player currently playing. All other coordinates by the same player are captured stones.
Specification OthelloReplayUserInterface This assignment uses the OthelloReplayUserInterface to show the othello board. After declaring and initializing
it, like any other variable, it is ready to use:
1
2
OthelloReplayUserInterface ui;
ui = UserInterfaceFactory.getOthelloReplayUI();
34
Introduction to Programming
import ui.OthelloReplayUserInterface;
import ui.UserInterfaceFactory;
class UIExample {
static final int WAITING_TIME = 5000; // in milliseconds
OthelloReplayUserInterface ui;
UIExample() {
ui = UserInterfaceFactory.getOthelloReplayUI();
}
void start() {
ui.place(0, 0, ui.WHITE);
ui.place(ui.NUMBER_OF_COLUMNS - 1, ui.NUMBER_OF_ROWS - 1,
ui.BLACK);
ui.showChanges();
ui.wait(WAITING_TIME);
ui.place(0, 0, ui.BLACK);
ui.place(ui.NUMBER_OF_COLUMNS - 1, ui.NUMBER_OF_ROWS - 1,
ui.EMPTY);
ui.showChanges();
35
4
Parsing input
Abstract
A lot of programs depend on some sort of input. In previous modules
the Scanner was used to read numbers. This module will introduce structured reading of structured input to parse complex input and write structured programs.
Goals
Use next(), nextLine() and useDelimiter() from the Scanner class to read
structured input.
Write well structured code that reflects the way the input is parsed.
36
Introduction to Programming
Theory
Layout
A good layout is essential to make comprehensible programs. There are many
different layouts that will result in clear programs. There is no single best
layout, it is important though to maintain the same layout throughout the
whole program. Examples of a good layout can be found in all the examples in
the book and in this instruction manual. A couple of rules of thumb:
Rule of Thumb
A } is always aligned vertically below the corresponding method, for,
while, if or switch statements. The keyword itself is not indented. All code
in the body of these control statements is indented by four or eight spaces,
usually the width of one or two tabs.
Rule of Thumb
Methods are separated by at least one white line. The declaration of variables and assignments are also separated by a white line. White lines can
be added anywhere, if this increases clarity.
37
Introduction to Programming
if (boolean expression 1) {
statement 1;
}
else if (boolean expression 2) {
statement 2;
}
else if (boolean expression 3) {
statement 3;
}
else { // explanation on the remaining cases
statement 4;
}
Switch
The switch-statement can be used when a choice between different pieces of
code is made, based on a value.
int a = ...;
switch (a) {
case 1:
statement 1;
break;
case 2:
statement 2;
break;
case 3:
statement 3;
break;
default:
explain all remaining cases
statement 4;
}
The switch-statement can only be used in combination with primitive types like
integers and characters. Using the switch-statement in combination with strings
will not work as expected. In addition to this restriction, the switch-statement
can only be used when checking the value for equality (==); this example uses
(a == 1), (a == 2) and (a == 3). Other expressions, like < or >, can only be
achieved by using if-statements.
38
Introduction to Programming
Comments
"Comments make sure a program is readable. Everyone knows this. In the
past, when only very few could program, sometimes someone would write a
program without comments. Now this is often considered as old-fashioned,
maybe even offensive. Better safe than sorry and add some extra comments."
Wrong!
Comments are not meant to explain dodgy programs to readers. A program
that can be understood without comments, is better than a program that cannot be understood without comments. Comments may never replace clear programming!
Comments should not be written wherever possible, but only on those occasions where they are neccesary. An example of unneccesary commenting:
// the sum of all values is assigned to sum.
sum = 0;
for (input.hasNext()){
sum += input.nextInt();
}
It can be assumed the reader can understand Java. A clear piece of code does
not need additional explanation.
However, there are some cases in which it is advisable to add comments, in the
middle of a method (for example, the previous if-statements). Though usually
comments are placed at the top of the method. These comments are usually
placed to explain a complex method, describing:
what the method does
(if neccessary) how it does this
(if neccessary) how the method changes external values. If, for example, a
global variable is changed within the method, it might be useful to write
this in a comment.
A well written program contains a lot of methods without any comments. Usually, the name of a method will indicate precisely what will happen and the
code will be readable. For example:
void print(int[] row);
does not require explanation telling the reader that a row is printed. However,
the method
/* Sorts the list using "rapidsort";
* see Instruction Manual.
*/
void sort(int[] row) {
39
Introduction to Programming
Rule of Thumb
If the name of the method explains what it does and it is trivial how it does
this, no comments are neccessary.
If one or both of the prerequisites are not met, a comment is needed.
There are very little or no comments within a method.
40
Introduction to Programming
numberScanner.useDelimiter("#");
// read all the numbers, and print the sum of all the numbers.
int sum = 0;
while (numberScanner.hasNext()) {
sum += numberScanner.nextInt();
}
out.printf("%d\n", sum);
Example Input is often structured, this means that the input is made up of
different parts, often again divided in seperate parts, and so on and so forth.
Such input can be read in a structured way by first reading the large parts and
forwarding these parts to a different method that will read the sub-parts.
The example uses the following structured input:
Melissa White-Admiral Nelsonway;12;2345 AP;Seaty
Richard of Hughes-Green Lawn;1;2342 SS;Seaty
Godwyn Large-Calferstreet;101;2341 NG;Seaty
Petronella Diesel-The Mall;1102;2342 MW;Seaty
enz...
The input is made up of an unknown number of students and is read with the
Scanner in. Every line states the name and address of a single student. The
name is separated from the address by a '-'. The address consists of a street,
house number, postal code and city. The components are separated by a ';'.
One of the most important skills is to recognize such structures. Study the
example and the explanation below. The program will read the input defined
above and print the addresses in format suitable for letters.
class ExampleProgram {
PrintStream out;
ExampleProgram() {
out = new PrintStream(System.out);
}
void printAddress(Scanner addressScanner) {
addressScanner.useDelimiter(";");
String street = addressScanner.next();
int houseNumber = addressScanner.nextInt();
String postalCode = addressScanner.next();
String city = addressScanner.next();
41
Introduction to Programming
printAddress(addressScanner);
void start() {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String student = in.nextLine();
Scanner studentScanner = new Scanner(student);
printStudent(studentScanner);
printStudent(Scanner studentScanner) reads the name and address seperately and creates a new Scanner for the address to forward to the printAddress method.
Melissa White - Admiral Nelsonway;12;2345 AP;Seaty
42
Introduction to Programming
Assignments
1.
Before starting
this
assignment,
read
the
theory
about Advanced use
of the Scanner.
Replay 2
The input of Replay1 was structured like this:
black
black
black
etc...
1035
0
0
move b 3
move c 3
move d 3
1035
4058
24423
8494
move b 3 c 3 d 3
move h 1 g 2 f 3 e 4
pass
move a 6
In this arrangement, every line consists of a turn, and every turn consists of
multiple coordinates. Make a copy of Replay1 and edit the code such that it
can handle this new arrangement. In addition, print the number of pieces that
have been conquered during each turn. The Javadoc describes how to print in
the status bar of the OthelloReplayUserInterface.
Example
black:
white:
black:
white:
2.
conquered 2 pieces
conquered 3 pieces
passed
conquered 0 pieces
Replay 3
For this assignment, multiple games of Othello have been combined into a single file, separated by a '='. This file can be found on Blackboard. Make a copy
of Replay2 and edit the code in such a way that it can handle this input file.
Games should be played one after another, waiting five secconds between the
end of one game and the start of another. Before starting a new game, make
sure to erase the board and status bar. Information on how to achieve this can
be found in the Javadoc.
43
Introduction to Programming
Graded Assignment
3.
Statistics
University The Blossoming Brain is home to an annual Othello tournament
between artificial intelligent programs, made by bta students. As one can
imagine, it is important for each student to know how well his program fared
against others. The goal of this assignment is to write a program that provides
this information.
A number of files with statistics about the matches can be found on Blackboard.
These files are structured in the following way:
2000
I
Achraf Belmokadem
Richard van Heuven van Staereling
Shan Shan
=W
Wartie Zeggen
Melissa de Wit
Enes Goktas
2001
I
etc...
2355 22
1355 95
2315 100
4311 19
2041 99
1195 74
The file holds information on how well a program fared against other programs
of other students of different academic years. Each academic year is separated
by a '-'. Each year starts off with a number, declaring which year the statistics
concern. After this, the file shows how well the program fared against students
of different studies. Each study is separated by a '='. Next, each individual
match is declared. First, the name of the student is shown followed by a TAB
('\t'). The next number shows how long the program had to think against
this player. The last number is the percentage of pieces that the program has
conquered.
Write a program that makes a bar chart showing how often the program has
ended with 0-9%, 10-19%, . . . , 90-100% of the pieces.
This assignment uses the BarChartUserInterface. The declaration and initialization of the BarChartUserInterface is quite similar to declaration and initialization
of the OthelloReplayUserInterface:
static final int NUMBER_OF_BARS = 10;
BarChartUserInterface barChart;
barChart = UserInterfaceFactory.getBarChartUI(NUMBER_OF_BARS);
44
Introduction to Programming
Bonus The current program is using 10 bars. The number of bars, 10, is a
constant, no doubt. Try to make sure the program still works well when this
constant is changed. Test your program with different numbers of bars, such
as 7 and 99 for instance.
45
5
Arrays and classes
Abstract
In the previous modules methods and functions were used to structure
a program. For the more advanced programms another way to structure a program is by using classes. Classes are used to join a number of
relating methods and variables. With classes it is possible to represent
real-world objects. Because classes can be used for this, Java is called an
object-oriented programming language. This module shows how to use
classes.
Goals
Using arrays to save a(n) (un)known number of values.
Using more classes and recognising when to use extra classes.
Recognising the right class for the right method, variable or constant.
46
Introduction to Programming
Theory
Classes
Complex programs almost always require the use of two or more classes. Each
class contains a number of logically connected data and/or methods. Two
types of classes can be distinguished:
1. Firstly, classes that contain several logically connected methods. An example of such a class is the Scanner class. This class contains all methods
used to read input from various sources. All resulting programs from the
previous assignments belong to this set of classes as well.
2. Secondly, classes that define an object from the real world. An example of
such a class is the class Person. This class could contain data like: name,
address, date of birth, etc. In addition, this class could contain a function
int age(), which returns the age of this person by using the date of birth
and the current date. Another example of such a class is Circle. This class
contains a center and a radius. Methods that are logically connected to
this class are for example double surfaceArea() and double circumference().
In the first four modules, only classes of the first category were required. Assignments from this module onwards will also use classes from the second
category. An example will show how to create and use such a second class. It
is good practice to use separate files for different classes.
Example This example will feature a program used by airline FlyLo to calculate the profit of a flight to London. The airline uses four different fares:
1. Toddlers, aged 0 to 4 years old are charged 10% of the regular fare.
2. Children, aged 5 to 12 years old are charged half the regular fare.
3. Adults are charged the regular fare.
4. Elderly peoply, aged 65 years or more pay an extra 10% on top of the
regular fare, as they have more money anyway.
The regular fare for a single ticket to London is e99. A Boeing 747, the largest
plane in the airlines fleet, will accomodate 400 passengers.
The airline wants to know what consequences a change in the maximum age of
a toddler may have. The airline wants to know what the new profit of a flight
will be, and if there is an increase or decrease in the profit.
The program uses a two-line input. The first line contains all the passengers
ages. The second line contains the new maximum toddler age. The program
will print the two profits and the difference between these two. It is useful to
save all the ages in a row. This way, the row can simply be asked how many
passengers will fit each category. This data will allow the program to calculate
the total profit. A row, such as the one proposed above is a good example of
a second class. The class holds data, the ages of all the passengers and the
number of passengers. Apart from the constructor, the class has a method to
47
Introduction to Programming
add an age to the row and a method to calculate how many passengers fit into
a certain category.
This row can be implemented using an array, which does not necessarily have
to be completely filled. This means that the number of ages currently saved in
the array has to be maintained. The method add() will add a new age to the
back of the row. The function int numberInRange(int startingAge, int endingAge)
calculates the number of passengers that fit this range. The methods AgeRow
readAgeRow() and double calculateTotalProt() are self-explanatory.
class AgeRow {
static final int MAX_NUMBER_OF_PASSENGERS = 400;
int[] ageRow;
int numberOfPassengers;
AgeRow() {
ageRow = new int[MAX_NUMBER_OF_PASSENGERS];
numberOfPassengers = 0;
}
void add(int age) {
ageRow[numberOfPassengers] = age;
numberOfPassengers += 1;
}
int numberInRange(int startingAge, int finalAge) {
// Calculates how many passengers are in the range
// bounded by startingAge and finalAge
int result = 0;
48
Introduction to Programming
import java.io.PrintStream;
import java.util.Scanner;
class Airplane {
// Name
: Martijn Bot
// Assignment: Airplane
// Date
: August 6th 1997
static final int MAX_TODDLER_AGE
MAX_CHILD_AGE
MAX_ADULT_AGE
MAX_AGE
= 4, // year
= 12, // year
= 64, // year
= 135; // year
=
=
=
=
99.0,
//
ADULT_FARE * 0.1, //
ADULT_FARE * 0.5, //
ADULT_FARE * 1.1; //
euro
euro
euro
euro
PrintStream out;
Airplane() {
out = new PrintStream(System.out);
}
int readInRange(Scanner input, int start, int end) {
int result = input.nextInt();
if (result < start || result > end) {
out.printf("ERROR: %d is not in range (%d, %d)\n",
result, start, end);
System.exit(1);
}
return result;
}
int readAge(Scanner input) {
return readInRange(input, 0, MAX_AGE);
}
AgeRow readAgeRow(Scanner input) {
AgeRow result = new AgeRow();
while (input.hasNext()) {
result.add(readAge(input));
}
return result;
}
double calculateProfit(int start, int end,
double fare, AgeRow row) {
return row.numberInRange(start, end) * fare;
}
double calculateTotalProfit(int maxToddlerAge, AgeRow row) {
double toddlerProfit = calculateProfit(
0, maxToddlerAge, TODDLER_FARE, row);
49
Introduction to Programming
printChangeInProfit(normalProfit, newProfit);
50
Introduction to Programming
Assignments
1.
Array
Read exactly twenty numbers from standard input and print them in reversed
order. Do not use a second class yet.
2.
BodyMassIndex
Professor Hatzelklatzer has researched the extremely rare Hatzelklatzer-sydrome.
There seem to be fewer cases of the sydrome in odd months than in even
months. Further research should reveal if the syndrome affects people more
often if they are too heavy.
A way of determining whether someone is too heavy is the body-mass index
(BMI). This is a measure of a persons weight taking into account their height.
The BMI is defined as weight/length2 . The World Health Organization (WHO)
considers a BMI between 18,5 and 25 as ideal and considers people with such
a BMI healthy.
The program receives input consisting of two persons with their name, sex,
length and weight.
Dean Johnson
Sophia Miller
M
V
1.78
1.69
83
60
Process this input into structured data. To achieve this, use an useful extra class
with useful methods to enhance the structure of the program. Use this structured data to print for each person: an appropriate style of address, surname,
the BMI and a statement whether this is considered healthy or not.
Example
Mr. Johnson's BMI is 26.2 and is unhealthy.
Mrs. Miller's BMI is 21.0 and is healthy.
3.
Row
The input for this assignment consists of two rows of an unknown number of
numbers, at most 20, at least 1. A row is printed on a single line, with the
numbers separated by spaces.
Reverse the rows and print them on standard output. Next, print the largest
number of each row and print which row has the largest number.
Example
5821
-100 100 200
1 2 8 5
200 100 -100
Largest number of row 1: 8
Largest number of row 2: 200
The largest number is in row 2.
51
Introduction to Programming
Graded Assignment
4.
Pirate
During his completely miserable life, pirate Abraham Blaufelt has been in search
of the lost treasure of Atlantis. On a very fortunate day in the year of the Lord
1642 he enters an abandoned cathedral of a long gone sect in the ancient forests
of Poland. Inside he finds a mysterious ancient parchment. The parchment
reads:
Traveler, if you want to reach thine goal,
trace the path through seas by making the broken, whole.
5,4 4,5 8,7
Add behind 6,3 3,2 9,6 4,3
Add in front 7,6
Add behind 9,8
Add in front 5,5 7,8 6,5 6,4
Abraham Blaufelt immediately knew what he was dealing with. A puzzle of
which the result is a safe route to the treasure. This route was essential, the
sea was crawling with monsters in those days. Since this most fortunate day,
almost four hundred years ago, the european tectonic plate has shifted significantly. As a result all coordinates have to be shifted by (1, 0).
Write a program that solves this puzzle. This has to be done in the following
way: Start with the coordinates on the first row, add the coordinates of the
second row at the back, then add the coordinates of the third row in front etc.
Make a new Coordinate and CoordinateRow class for this assignment. The
latter class has methods to add a CoordinateRow in front or at the back and
methods to add a single Coordinate at the front or at the back.
The coordinates of the puzzle are in a file on Blackboard. Every CoordinateRow
is separated from another by an '='. Every coordinate in a row is separated by
a space. The x and y values of a coordinate are separated by a comma.
After all data has been read, the program will print the treasure route on the
standard output. The correct route can also be found on Blackboard.
52
6
Events and animations
Abstract
This module introduces events and animations. These notions are essential for programming interactive programs. The graded assignment
of this module will involve programming the game Snake. A game such
as Snake is quite complex and therefore it requires a careful approach.
Using stepwise refinement one begins with a rough sketch of a program,
which is developed with increasing detail. Before starting with programming the graded assignment it is compulsary to make such a sketch
of the program, which has to be approved before being allowed to continue.
Goals
Familiarize with events.
Use events to program an animated program.
Use events to program an interactive program.
Use stepwise refinement to program complex programs.
53
Introduction to Programming
Theory
Events
The Replay assignment introduced the Graphical User Interface (GUI). This
program was not interactive, it did not react to input provided by the user.
To make a program interact with the user, this course uses events. An event is
for example a mouse-click, a keystroke or even the fact that it is 2 oclock.
Using the following functions from the GUI will allow the program to work
with events.
Event getEvent();
Calling this function will make the program halt and wait for an event to arise.
After an event has risen, the function returns an Event-object containing information on the event. The Event class looks like this:
class Event {
String name;
String data;
}
Pressing the letter 'a' will generate an Event-object containing the name "letter"
and the data "a". Clicking field 4,3 will return an Event-object containing the
name "click" and the data "4 3".
An interactive program, a program that reacts to input generated by the user,
works as follows:
1. wait for an event to arise
2. process event
3. repeat.
In Java this can be implemented like this:
while (true) { // infinite loop
Event event = ui.getEvent();
processEvent(event);
}
The method processEvent needs to determine what has happened, and what
should happen as a result. Such a method, that calls different methods according to a specific condition is called a dispatch-method.
void processEvent(Event event) {
if (event.name.equals("click")) {
processClick(event.data);
} else if (event1) {
processEvent1(event.data);
} else if (event2) {
processEvent2(event.data);
} else {
....
} else {
54
Introduction to Programming
....
Animations
The way events have been used so far, only allows the program to react to
input given by the user. It is not possible for the program to change anything
on the screen on its own account. In order to program an animated program, a
program has to be able to do something without requiring input from the user.
A program is animated when it does not require events produced by the user
to make changes to the screen. This means a program is not animated if the
screen changes very rapidly because of a lot of events produced by the user.
The first animated program during this course was the Replay assignment. A
game of Othello was replayed without any input from the user.
Computer games like snake are called interactive animations. In these programs, the user can influence an animation. In the Replay assignment, the wait()
method was used to regulate the speed of the animation. This approach is not
useable for interactive animation, as the whole program halts when the wait()
method is executed. The program cannot react to events, not even those generated by the user. Waiting for ten seconds, will cause a mouse-click for example
to be processed with a ten seccond delay. To solve this issue, the SnakeUserInterface contains the following method:
void setFramesPerSecond(double framesPerSecond);
When this method is called with, for example 24.0 frames per second, the
program will generate 24 events per second. These events all have the name
"alarm" and data "refresh". The program can now be made to react to these
events by refreshing the screen. This way, the wait() method does not have to
be used, and events generated by the user can be processed instantly.
Stepwise Refinement
An important part of writing structured programs is stepwise refinement. This
can be roughly defined in the following way:
Write down exactly what the program should do, in English or in another
natural language.
Next, step by step elaborate on the description of the program. Again,
write in a natural language, or, when it is trivial, directly in Java.
This process is repeated until the whole program is written in Java.
When the algorithm is correctly executed, the result will be a flawless structured program.
55
Introduction to Programming
Example Write a program that reads a date in the format: day month year,
separated by spaces. The program prints whether the date is correct. This
program will be made using stepwise refinement. Important to note is that all
programs execute precisely the same assignment. The only difference is the
amount of English replaced by Java.
Program 1
class CheckDate {
CheckDate() {
}
void start() {
// read the date
// check the date
// print output
}
Program 2
import java.util.Scanner;
import java.io.PrintStream;
class CheckDate {
PrintStream out;
CheckDate() {
out = new PrintStream(System.out);
}
boolean isCorrect(int day, int month, int year) {
// return true if date is correct,
// return false otherwise
}
int readInRange(Scanner input, int start, int end) {
// read an int and return this int if
// it is between start and end. Print
// an error message otherwise and
// terminate.
}
void start() {
Scanner in = new Scanner(System.in);
int day
= readInRange(in, 1, 31);
56
Introduction to Programming
Program 3
import java.io.PrintStream;
import java.util.Scanner;
class CheckDate {
PrintStream out;
static
//
//
//
};
CheckDate() {
out = new PrintStream(System.out);
}
boolean isLeapYear(int year) {
// return true if the year is a leap year
// return false, otherwise
}
boolean isCorrect(int day, int month, int year) {
if (day == 29 && month == 2) {
return isLeapYear(year);
} else {
return day <= NUMBER_OF_DAYS_IN_A_MONTH[month];
}
}
int readInRange(Scanner input, int start, int end) {
int result = input.nextInt();
if (result < start || result > end) {
out.printf("ERROR: %d is not in range (%d, %d)\n",
result, start, end);
System.exit(1);
}
57
Introduction to Programming
return result;
void start() {
Scanner in = new Scanner(System.in);
int day = readInRange(in, 1, 31);
int month = readInRange(in, 1, 12);
int year = readInRange(in, 0, 2500);
Program 4
import java.io.PrintStream;
import java.util.Scanner;
class CheckDate {
PrintStream out;
static final int[] NUMBER_OF_DAYS_IN_A_MONTH = {
0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
CheckDate() {
out = new PrintStream(System.out);
}
boolean isLeapYear(int year) {
return year % 400 == 0 ||
(year % 4 == 0 && year % 100 != 0);
}
boolean isCorrect(int day, int month, int year) {
if (day == 29 && month == 2) {
return isLeapYear(year);
} else {
return day <= NUMBER_OF_DAYS_IN_A_MONTH[month];
}
}
int readInRange(Scanner input, int start, int end) {
int result = input.nextInt();
if (result < start || result > end) {
out.printf("ERROR: %d is not in range (%d, %d)\n",
result, start, end);
System.exit(1);
}
58
Introduction to Programming
return result;
void start() {
Scanner in = new Scanner(System.in);
int day = readInRange(in, 1, 31);
int month = readInRange(in, 1, 12);
int year = readInRange(in, 0, 2500);
59
Introduction to Programming
Assignments
1.
Before starting
this
assignment,
read
the
theory
about Events.
Events
Write a program using a SnakeUserInterface of 40 30 which has the following
features:
Clicking on a square results in a piece of wall to be placed on that square.
Pressing the space bar erases all the walls.
The program prints the name and data of all events that occur.
2.
Before starting
this
assignment,
read
the
theory
about Animations
Animation
The goal of this assignment is to make an animated program in which a piece
of wall moves across the screen. The piece of wall starts out on (0,0) and moves
right a square at a time. Upon reaching the end of a row, the piece of wall will
move to the first square of the next row. When the piece off wall reaches the
end of the last row, it is transferred back to the initial (0,0) position.
On top of this make sure the program implements the following features:
The animation should slow down 0.5 frames per second when (left
arrow) is pressed.
The animation should speed up 0.5 frames per second when (right
arrow) is pressed.
The piece of wall should change into a green sphere (a part of a snake)
when g is pressed. Pressing g again will revert the change.
Use the SnakeUserInterface for this assignment.
Example
10
60
Introduction to Programming
Graded Assignment
3.
Before starting
this
assignment,
read
the
theory
about
Stepwise
Refinement.
In
addition,
before
starting with programming, a draft of
the program has to
be approved.
Snake
A logical step forward from interactive animated programs is games. The goal
of this assignment is to program the classic computer game, Snake.
The goal of Snake is to create a snake as long as possible. This is achieved by
guiding the snake to apples, lying about on the field. The snake cannot stop
moving, and dies whenever it hits something. Because the snake is growing
longer and longer as the game progresses, it is increasingly difficult to avoid
collisions with the snake itself.
At the start of the game, the snake consists of two pieces at the coordinates (0,0)
and (0,1). As said before, the snake is always moving. At the start of the game,
it moves to the right. When the user presses one of the arrow keys, the snake
changes direction.
At every moment in the game, there is always an apple somewhere in the field.
If the snake hits an apple, the snake becomes one piece longer at the next screen
refresh. A new apple is placed on a random location, excluding all places covered by the snake.
When the snake reaches the end of the screen, it will re-emerge at the other
end.
Note that if the snake goes into a certain direction, it cant move in the opposite
direction within one refresh (so for instance, if the snake goes right, and you
click left, nothing should happen). Also within one refresh the snake cant
change direction more than once.
Example The example below shows a short game of snake, played on a 4x3
field. The game to be designed in this assignment will have a field measuring
32x24. The arrow indicates in which direction the snake is travelling. The
numbers on the snake indicate its position in the row.
startingposition
This assignment uses the SnakeUserInterface. Information about the SnakeUserInterface can be found on www.few.vu.nl/~ip/javadoc/. To generate a random location for the apple use methods provided in the UIAuxiliaryMethods
class.
61
Introduction to Programming
Bonus Edit the program in such a way that it accepts a level as input. A level
defines a number of walls, which the player has to avoid. Levels can be found
on Blackboard. The structure of these files is as follows: <the coordinates at
which the snake starts, starting with the head of the snake>=<the initial direction of the snake>=<the coordinates of the walls>.
Coordinates are formatted in the following way: one coordinate per line, in
the format: <x><space><y>. The initial direction is one of four strings: "L"
(Left), "R" (Right), "U" (Up) of "D" (Down).
An example of a piece of such a file:
1 0
0 0=R=3 3
4 3
5 3
6 3
7 3
8 3
etc...
62
7
Recursion
Abstract
When a method or function makes a call to the same method or function,
it is called recursion. In some cases a complex problem can be solved by
recursively solving similar subproblems. The graded assignment of this
module uses recursion to solve the problem of finding the longest track
in a labyrinth in an elegant way.
Goals
Understand the notion of recursion
Recognize situations in which to apply recursion
63
Introduction to Programming
Module 7: Recursion
Assignments
1.
Numbers
Print the numbers 10 to 1 in a recursive way. Next, adapt the recursive function
to print the numbers 1 to 10. Using this knowledge, write a combined recursive
function that prints the numbers 10 to 1 followed by the numbers 1 to 10. One
method should suffice to solve this problem.
What happens when the base case is removed?
Example The output of the final program should look like this:
10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10
2.
Reversed Number
Take a large number as input and print it in reverse on the output. Zeros at the
end of a number should also be visible at the start of the reversed number.
Example
123456780
087654321
3.
Droste
The picture above shows a box of droste cacao with a woman holding the same
box of droste cacao. The woman on this box is again holding a box of droste
64
Introduction to Programming
Module 7: Recursion
cacao etc. This effect, images containing smaller versions of the same image, is
called the droste effect.
The goal of this assignment is to make another image with the droste effect.
The starting point is a wood carving of the renowned Dutch graphic artist M.C.
Escher, Other World 1947 (figure 1). The image shows the inside of a cube.
When the image of the cube is placed on the back of the cube, with the back of
that cube being an even smaller version of the same cube, a droste effect has
been achieved. The result is shown in figure 2.
Write a program that creates the image (figure 2) in a recursive way. Continue
the recursion until the image has a width of only one pixel, and adding another image would not change the image anymore. Use the DrosteUserInterface
for this assignment. This is not an interactive user interface, but has got the
functions showChanges() and wait(). It has got an alternative function place(),
which allows the user to place an image on the screen:
void place(BufferedImage image,
int x,
// in pixels
int y,
// in pixels
int width, // in pixels
int height) // in pixels
The image of Other World 1947 has been created in advance and can be used
by referring to the constant DrosteUserInterface.ESCHER_IMAGE.
To place the image in such a way that it fills the entire screen use:
ui.place(DrosteUserInterface.ESCHER\_IMAGE, 0, 0, 611, 740);
The dimensions, in pixels, of various components of the image that are essential to be able to create the droste effect, are given in the following diagram:
65
Introduction to Programming
Module 7: Recursion
66
Introduction to Programming
Module 7: Recursion
Graded Assignment
4.
LongestPath
One of the uses of recursive programming is searching the best solution by trying all possible solutions. Examples include searching for a solution of a Rubiks Cube or the best possible next move in a game of Othello. The goal of this
assignment is to find the longest path that can be traced through a labyrinth
without visiting the same place twice.
A number of labyrinths can be found on Blackboard. This is an example of
such a file:
1 1=30 22=31 23
31 4
31 3
31 2
31 1
31 0
30 0
29 0
67
Introduction to Programming
Module 7: Recursion
10
11
12
13
14
15
68
Introduction to Programming
Module 7: Recursion
The LabyrinthUserInterface has the same methods as the OthelloReplayUserInterface and those used in the Replay assignment.
69
8
Bonus
Abstract
Warning
As this is a bonus assignment, there is no time reserved for this assignment
during the lab sessions. This assignment is solely meant for those students
who have finished all other assignments. Students are only allowed to
start on this assignment if all other assignments have been submitted.
Graded Assignment
1.
Life
The Game of Life was invented by J.H. Conway. Two publications in the Scientific American by Martin Gardner saw the game introduced to the public.
Life is played on a board of n x n squares, representing a population of dead
and living cells. A living cell can either die or continue to live, based on a set
of rules. A dead cell can either become alive again, or remain dead. Every cell
has eight neighbours, except the cells on the edge of the board:
1
4
6
2
*
7
3
5
8
Introduction to Programming
Module 8: Bonus
10
11
12
13
14
71
Introduction to Programming
Module 8: Bonus
It is possible for a figure to die (an empty board) or become an oscillator, i.e.
generation n = generation n + p, for any n above a certain value. If the period
equals 1 (p=1), it is called a still figure.
Write a program that takes a starting configuration from a file and generates
generations as long as the figure has not died, become an oscillator with a certain p, or exceeds the maximum number of generations. When the program
terminates, print a message stating why the program has terminated and if the
figure has become an oscillator, its period. If the period of the oscillator is 1,
the message should read Still figure instead of Oscillator. The input files
on Blackboard have the following structure:
On the first line, the maximum number of generations, ranging from 1 to
100.
On the second line, the largest period for which the figure should be
tested to oscillate, ranging from 2 to 15.
After this, a starting configuration for a 9 x 9 board, made up from 9
line of 9 characters. A living cell is represented by an x, a dead cell is
represented by
This assignment uses the LifeUserInterface. This works exactly like the ReplayUserInterface. The only difference are the constants declaring the images:
LifeUserInterface.DEAD and LifeUserInterface.ALIVE. The LifeUserInterface
can be intialized with UserInterfaceFactory.getLifeUI(width,height).
72