CS 100: Lecture L13
March 9
Roman Numerals Cont'd
import java.io.*;
public class L12
{
public static void main(String args[])
{
TokenReader in = new TokenReader(System.in);
RN.println("MCMXCIX");
RN.println("IIX");
RN.println("CCCXC");
RN.println("MDI");
RN.println("DCDIV");
RN.println("CVL");
RN.println("MMI");
RN.println("MIM");
RN.println("XIV");
RN.println("XVIV");
RN.println("IIII");
RN.println("IXC");
in.waitUntilEnter();
}
}
/* Output:
MCMXCIX = 1999
IIX evaluates to 10 and 10 evaluates to X
CCCXC = 390
MDI = 1501
DCDIV evaluates to 904 and 904 evaluates to CMIV
CVL evaluates to 155 and 155 evaluates to CLV
MMI = 2001
MIM evaluates to 2001 and 2001 evaluates to MMI
XIV = 14
XVIV evaluates to 19 and 19 evaluates to XIX
IIII evaluates to 4 and 4 evaluates to IV
IXC evaluates to 89 and 89 evaluates to LXXXIX
*/
// Methods for dealing with Roman numerals
public class RN
{
// Yields the value of the Roman numeral specified by the first character
// of r. It is assumed that r is a valid one or two character Roman numeral
public static int valueOfShort(String r)
{
String First = r.substring(0,1);
int s;
// Determine the first character and assign its value to s without regard
// to the second character.
if (First.equals("I"))
{s = 1;}
else if (First.equals("V"))
{s = 5;}
else if (First.equals("X"))
{s = 10;}
else if (First.equals("L"))
{s = 50;}
else if (First.equals("C"))
{s = 100;}
else if (First.equals("D"))
{s = 500;}
else
{s = 1000;}
// Identify those situations where the value is to be negated
boolean specialI = r.equals("IV") || r.equals("IX");
boolean specialX = r.equals("XL") || r.equals("XC");
boolean specialC = r.equals("CD") || r.equals("CM");
if (specialI || specialX || specialC )
{return -s;}
else
{return s;}
}
// Yields the value of r where it is assumed that r is a valid Roman numeral string
public static int valueOf(String r)
{
int sum = 0;
String s;
for(int k=0;k<r.length();k++)
{
// Determine the value of the kth character via valueOfShort.
// Hand over to this method the right length-1 or length-2 substring.
if(k==r.length()-1)
// End of string so just hand over the last character.
s = r.substring(k,k+1);
else
// Handover the length-2 string made up of this and the next character.
s = r.substring(k,k+2);
sum = sum + RN.valueOfShort(s);
}
return sum;
}
// Yields the Roman numeral equivalent of nVal.
public static String valueOf(int nVal)
{
int n = nVal;
String s = "";
while (n>0)
{
// Diminish n by the largest of 1000 900 500 400 100 90 50 40 10 9 5 4 or 1
// and concatenate to s the string M CM D CD C XC L XL X IX V IV or I
if (n>=1000)
{n=n-1000;s=s+"M";}
else if (n>=900)
{n=n-900;s=s+"CM";}
else if (n>=500)
{n=n-500;s=s+"D";}
else if (n>=400)
{n=n-400;s=s+"CD";}
else if (n>=100)
{n=n-100;s=s+"C";}
else if (n>=90)
{n=n-90;s=s+"XC";}
else if (n>=50)
{n=n-50;s=s+"L";}
else if (n>=40)
{n=n-40;s=s+"XL";}
else if (n>=10)
{n=n-10;s=s+"X";}
else if (n==9)
{n=n-9;s=s+"IX";}
else if (n>=5)
{n=n-5;s=s+"V";}
else if (n==4)
{n=n-4;s=s+"IV";}
else
{n=n-1;s=s+"I";}
}
return s;
}
// Prints r and its value if it is a legal Roman numeral and an "illegal" message otherwise
public static void println(String r)
{
int n = valueOf(r);
String s1 = valueOf(n);
if (s1.equals(r))
{
System.out.println(r + " = " + n);
}
else
{
System.out.println(r + " evaluates to " + n + " and " + n + " evaluates to " + s1 );
}
}
}
Drawing a Color Gradient
// Illustrate the building of colors
import java.awt.*;
public class DisplayColor extends Frame
{
// Color "gradient" is in the rectangle with up left corner (hL,vT),
// bottom edge at v = vB, and width w.
public static final int vT = 100;
public static final int vB = 500;
public static final int hL = 100;
public static final int w = 600;
// (r1,g1,b1) is the "left edge" color.
public static final int r1 = 0;
public static final int g1 = 255;
public static final int b1 = 255;
// (r2,g2,b2) is the "right edge" color.
public static final int r2 = 255;
public static final int g2 = 0;
public static final int b2 = 255;
public void paint(Graphics g)
{
int red,green,blue;
Color C;
double f1,f2;
for(int k=0;k<=w;k++)
{
f2 = (double)k/w;
f1 = 1-f2;
// Mix the left and right colors in proportion f1:f2
red = (int) (f1*r1 + f2*r2);
green = (int) (f1*g1 + f2*g2);
blue = (int) (f1*b1 + f2*b2);
C = new Color(red,green,blue);
g.setColor(C);
g.drawLine(hL+k,vB,hL+k,vT);
}
}
}
public class L13A
{
public static void main(String args[])
{
DisplayColor d = new DisplayColor();
d.resize(800,600);
d.move(0,75);
d.setTitle("Show Colors");
d.show();
d.toFront();
}
}
Drawing a Color Grid
// Illustrate the building of colors
import java.awt.*;
public class ShowColorGrid extends Frame
{
// The grid is 16-by-16 with s-by-s tiles. The upper left
// corner of the upper left tile is at (hL,vT).
public static final int vT = 50;
public static final int hL = 100;
public static final int s = 35;
// The rgb value of the upper left tile is (0,0,blue).
public static final int blue = 255;
// Draws a 16-by-16 color grid where the (r,g,b) value for the
// tile in row i and column j is given by (16*i,16*j,blue)
public void paint(Graphics g)
{
int red,green;
Color C;
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
// Display the tile that is in row i and column j of the grid.
// Build the right color.
red = 16*i;
green = 16*j;
C = new Color(red,green,blue);
g.setColor(C);
g.fillRect(hL+j*s,vT+i*s,s,s);
// Draw a black perimeter.
g.setColor(Color.black);
g.drawRect(hL+j*s,vT+i*s,s,s);
}
}
}
}
public class L13b
{
public static void main(String args[])
{
ShowColorGrid d = new ShowColorGrid();
d.resize(900,700);
d.move(0,75);
d.setTitle("Show Color Grid");
d.show();
d.toFront();
}
}