CS 2102 Homework Assignment #3 
[]
Assigned: Tuesday 
November 07, 2006, 10:00 
AM
Due: Tuesday November 14, 2006, 
10:00 AM
Guidelines: 
To become 
available. Now that we are moving away from rigid, manual test 
cases, we are introducing JUnit.
The context for this homework assignment is General 
Chemistry. For more details, read here.
This is the first homework assignment that is scheduled 
for a full week. Please pay attention to the order of the questions in this 
assignment, because I believe that you should attempt to solve these problems in 
the order that I have suggested.
Please note that during this week-long assignment, the 
readings for the course [pp. 164-238,251-268] will form the basis for each 
answer.
Clarifications [OPTIONAL]
These clarifications are presented 
here to point out things that are missing from the assignment specification. You 
could try to include these for the homework.
	- As several people have pointed out, it would be quite 
	useful for Element to also record the 'name' of the Element, rather than 
	just its Symbol. To do so, provide the extra instance variable and instance 
	accessor methods for this information. The toString() method for Element 
	would also change.
 
Description
  - [20 pts.] You are asked to design a Java class to 
	represent a Chemical Element. Call this class Element. An
	Element is 
	defined by (a) its 
	atomic number (currently an integer in the range 1 .. 118); (b) its
	
	atomic symbol, which is a String containing either one, two, or three 
	characters. Note that all three-character symbols start with a capital 'U'; 
	(c) its atomic mass, 
	represented as a float that may be accurate to up to 5 decimal 
	points. An element may be unstable, that is, it will spontaneously
	decay, making 
	it impossible to properly evaluate its atomic mass. In these cases, the 
	atomic mass is simply a positive integer that represents the "mass 
	number of the longest-lived isotope of the element"; (d) 
	You must represent as a boolean whether an element is unstable, since 
	that is needed to properly understand the atomic mass; (e) finally, you must 
	store the full name of the Element as a String.
	
	(a) Define instance variables to store these four pieces 
	of information (number, symbol, mass, stability).
	(b) Define constructor to properly construct an Element object.
	(c) Define read-only accessor [pp. 202-206] methods to retrieve information 
	about an element, without allowing any external changes. These include 
	getName(), getNumber(), getSymbol(), getMass(), and isUnstable().
	(d) Define the public String toString() method [pp. 194-197] to 
	return a String representation of an Element object as "Symbol 
	mass". If the element is unstable, then the String value must be "Symbol 
	[mass]" where mass is in brackets.
	(e) Define the public boolean equals (Object o) method [pp. 194-197] 
	to properly determine whether two Element objects are the same by 
	simply comparing the atomic symbols of the two Element objects.
	(f) Define the public int hashCode() method [described in class]. 
	Base your implementation on the
	
	requirements for this method.
  - [20 pts.] Design a set of JUnit test cases to 
	properly validate the design/implementation of the Element class.
  - [20 pts.] Design a class PeriodicTable 
	which loads up information from an elements.txt 
	file to populate an array of elements. You can assume that you are aware of 
	the total number of elements in advance, before you open the file. Note that 
	the format of each line of the elements.txt file is "atomicNumber 
	AtomicSymbol AtomicName AtomicMass"
	
	(a) Define a static array of Element objects [pp. 251-268].
	(b) Define a static method  public static void 
	initialize(File f) throws FileNotFoundException that properly instantiates this array with 
	Element objects. 
	
	You will likely find the
	
	Float.parseFloat(String s) method useful.
	
	(c) Define a static method public static Element getElement(String 
	symbol) that returns the Element object associated with the given atomic 
	symbol (or null if none exists).
	(d) Define a static method public void outputElements() that outputs 
	all elements, one per line, to the console.
	(e) Define a JUnit test case to properly validate the 
	design/implementation of PeriodicTable.
  - [20 pts.] Design a Molecule class 
	that can be used to represent basic
	molecular compounds, 
	such as Water (H2O), Methanol (CH3OH), salt (NaCl), 
	Sulphuric Acid (H2SO4). Your Molecule class 
	should be able to handle molecules constructed by the combination of up to 
	ten Element objects (with varying repetitions). For example, Methanol is constructed from: a 
	Carbon (C) Element, a Hydrogen (H) Element (repeated 
	three times), an Oxygen (O) and finally 
	one more Hydrogen (H). A Molecule object is uniquely identified by 
	the ordering (left-to-right) of its constituent Element objects.
	
	Unlike an Element, a Molecule object can be modified.
	
	(a) Define an instance array variable to store up to ten Element 
	objects. Define instance array variable to store up to ten int values 
	that represent the number of corresponding Elements. 
	
	The reason for defining TWO arrays is to enable you to 
	store a molecule with up to 10 elements. Note that in the model proposed for 
	this homework Sulphuric Acid (H2SO4) is viewed as a 
	molecule with three elements: H (repeated twice), Sulfur (only once), 
	and Oxygen (repeated four times).
	
	(b) Define constructor to properly construct a Molecule object.
	(c) Define the public String toString() method [pp. 194-197] to 
	return a String representation of a Molecule object as 
	"A#B#C#D#" where 'A' represents the atomic symbol of the relevant. Note that 
	it is not possible to represent 'subscript' information within simple text 
	strings, so the output for Sulphuric Acid would be "H2SO4". 
	(d) Define a public boolean add (Element e, int count) method that 
	adds to a Molecule object the given Element object with desired count. If 
	the Molecule is "full", then return false; otherwise return true.
	
	Assuming you had three element objects h (for 
	Hydrogen), o (for Oxygen), and s (for Sulfur), then you would construct a Sulphuric Acid (H2SO4) 
	molecule as follows:
	
	Molecule m = new Molecule (h, 2);     // Use constructor 
	to construct H2 molecule
	m.add (s, 1);                                  
	// Now H2S molecule
	m.add (o, 4);                                  
	// Now H2SO4 molecule
	
	(e) Define a public float getMass () method that returns the proper 
	mass of the molecule by summing the individual masses of its constituent 
	Element objects. Note that it is hard to agree on 
	masses for molecules because of the variability of the elements. For our 
	purposes, this returns a calculated mass, which is only meant as an 
	approximation to the mass.
	
	(f) Define the public boolean equals (Object o) method [pp. 194-197] 
	to properly determine whether two Molecule objects are the same by 
	simply comparing (left-to-right) the Elements (and their counts). Thus Water 
	(H20) is not the same as Hydrogen Peroxide (H202).
	
	Note that you must be careful with how you construct 
	molecules. The following will not be equal.
	
	Molecule m = new Molecule (h, 1);     // Use constructor 
	to construct H molecule
	m.add (s, 1);                                  
	// Now H2S molecule
	m.add (o, 4);                                  
	// Now H2SO4 molecule
	
	(f) Define the public int hashCode() method [described in class]. 
	Base your implementation on the
	
	requirements for this method. 
  - [20 pts.] Design a set of JUnit test cases 
	to properly validate the design/implementation of the Molecule class.
 
All classes must be fully documented, according to the 
JavaDoc standard introduced in class and used throughout all class examples.
Advanced
As ungraded extensions to these assignments, consider the following two 
possible functions.
	- Write a public static Molecule parse(String s) method for the 
	Molecule class that takes a String value such as "CH3CH2CH2CH2OH" 
	(the representation for the chemical n-butanol) and produces the 
	corresponding molecule. For sample compounds, there are numerous lists (such 
	as 
	this one).
 
	- Extend the add method for molecule so attempts to add the same 
	element at the end of the molecule (from left-to-right) results in 
	incrementing the count. Thus:
	
	Molecule m = new Molecule (h, 1);     
	// Use constructor to construct H molecule
	m.add (h, 1);                                  
	// Now H2 molecule
  
Deliverables
Your goal is to turnin the 
Project files by Tuesday November 14th at 10:00 AM  Further details will be 
posted HERE showing the preferred means of uploading your solution to the TAs. 
 
Please be aware that no late homeworks will be accepted. This means that we will 
grade as zero any homework not submitted by the above turnin means.
Notes
	- [11/12/06 10:24 PM] Added clarification to the 
	Homework. These are optional, given the lateness of their posting.
 
	- [11/08/06 12:03 AM] Clarified use of getMass() method in Molecule 
	as an approximation.
 
	- [11/07/06 10:55 PM] Clarified that Periodic Table must have its own 
	JUnit test cases.
 
	- [11/07/06 10:43 PM] Clarified name of method to use as PeriodicTable 
	initializer
 
	- [11/07/06 09:00 PM] Clarification: replaced inappropriate use of 'weight' with 'mass'.
 
	- [11/07/06 1:52 AM] Draft HW ready to go, pending final review.
 
	- [11/06/06 11:54 PM] Homework3 to be posted here.
 
©2006 George T. Heineman