Lab 2: Strings, Input and Output

Today, you'll continue with some more word games. You'll also be introduced to Mercurial, a tool for managing the different versions that you make of files. Take a few minutes to read the page about Mercurial; what is there will make more sense as you work through the lab.

I. Setting up

For a starting point, clone the repository I have provided. The cloning process will create a new directory, so change into the directory where you want it to be created. Then

$ hg clone /cslab/class/csci235/lab2 

That will make a lab2 directory, which will include both a working copy and a directory. Change into that directory.

The presence of the repository is normally invisible. If you do ls, you won't see anything but one Java source file. However, if you give the -a (for all) option to ls, it will show you the filenames that start with dots. You should see a couple that start with .hg.

You can check the status of your working copy with

$ hg status

That won't tell you much right now, because you haven't done anything. But fire up your editor and make an awful mess of Palindrome.java, being sure you save the results. If you try the status command again, the file will be flagged as "modified". Now try

$ hg revert Palindrome.java
That will cause the file Palindrome.java to revert to the last version committed to the repository. You'll need to re-load it in the editor to see that, but it should look better than your mess.

The code you have right now is what you started with last time; you probably want to start instead withe the (working) version you wrote last time; so you need to copy Palindrome.java from your account to this directory. (Do you remember how?) Then, since you want that to be in the repository, commit it with

$ hg commit -m "Palindrome.java from my lab 1"
The message on the end is what you'll be able to see in repository logs.

II. Improved Palindromes

Your program from last time may not have printed a very clear message. Fix it so that it prints the input string, in quotes, and says whether it is a palindrome.

Right now, the program distinguishes based on case, so that, for example, "Pop" is not correctly recognized as a palindrome. Fix it so that it ignores case. Test it; make sure that it prints the input string as the user typed it.

This should be very simple. Pages 38-41 of the textbook list some of the methods available for strings. (You could look at the online documentation for class String, but that is a lot longer and contains a lot of clutter that we don't yet understand; there is also an abbreviated version of this reachaable from "Simplified documentation" on the class page.)

Once you have it working, commit it to your repository with

$ hg commit -m "Palindrome.java ignores case"

Now it is time to make your program ignore any spaces and punctuation in the input. Once you've done this, you should get something like

'A man, a plan, a canal: Panama!' is a palindrome.

Note: there are methods in class Character to help you classify characters. Look for methods with names that start with 'is' that take a parameter that is of type char.

You'll notice that these methods have the word static in front of them, as does the digit() method that you used in the last lab. When a method is not static, you name it relative to an object, as when substring() is called in the second line of

String s = "1234";
String t = s.substring(2,3);
When you call a static method, though, you name it relative to the class, as in the use of digit() here:
int i = Character.digit('3', 10);

III. Pangrams

Your previous program tests whether a string is a palindrome. Now you'll tackle another word game.

A sentence is a pangram if it contains every letter of the alphabet at least once. Examples include

Write a program which prompts the user for a string and determines whether or not that string is a pangram. Ignore spaces, punctuation, and capitalization. Your program should also include an opening documentation block (following the style we've seen in class) and a comment on every variable you declare.

Note: a good way to start would be to copy your palindrome program. You can do that with

$ hg copy Palindrome.java Pangram.java

You use the "hg copy" command (instead of plain cp) so that the repository will know that your new file is derived from the old one.

If you create a new file (Silly.java, say) that you want the repository to track, you use the command

$ hg add Silly.java
to tell the repository about it. The contents of the file won't actually go into the repository, though, until you do a commit.

Hint: Think about how you would do this using pencil and paper. You can do this using the methods listed in the textbook, which are also in the simplified online documentation. Need a hint? Another?

Feel free to commit your changes at any time that you have something you might want to go back to. To commit, think of a brief description/label for the state you are about to commit. Then the command

$ hg commit -m "message"
with your message substituted.

You can revert the state of a file to its last committed state with

$ hg revert filename

(It is also possible to revert to an earlier committed state, but that is a bit more complicated.)

When you are satsified that you have completed part III, commit with the message "finished part III".

IV. Anagrams

Two words or phrases are anagrams of each other if they contain all the same letters (with the same frequency). Examples include

Write a program Anagrams.java that prompts the user for two strings. Test whether the two strings are anagrams of each other. Ignore spaces, punctuation, and capitalization. Your program should also include an opening documentation block (following the style we've seen in class) and a comment on every variable you declare.

Again, you might want to copy one of your other programs to get a starting point. Don't forget to add your file to the repository and commit (at least) the final version.

Turning it in

Make a script file that shows you compiling your programs and running them with inputs that make it clear that they work correctly. (See how to script.)

Print your two .java files and the script. (See how to print.)

Use handin to hand in the files as lab2, too. (See how to do that, too.)

Copying a repository

There are special ways to copy a directory with a Mercurial repository. If user msnerd wants to copy from the lab account to directory csci235/lab2 under his home directory, the command would be

$ hg clone . ssh://msnerd@cslab25/csci235/lab2

You'll be prompted for your password, perhaps twice.

When you have logged in to your account and changed into your csci235/lab2 directory, all that will be there is the repository. To set up the working copy, you use

$ hg update
which makes the working copy match the last committed version from the repository.
Updated by Cary Gray,
original by Thomas VanDrunen
Last modified: Tue Jan 24 08:15:59 CST 2012