Java Welcome to Java Class: Learn Java One Bit at a Time

Click For Summary
The discussion focuses on learning Java programming step by step, emphasizing the need for a compiler and a runtime environment. The Java compiler converts source code into bytecode, which is executed by a Java Virtual Machine (JVM), allowing Java programs to run on any platform. Participants are guided through the installation of the Java J2SE 1.4.2 SDK and the process of compiling and running a simple Java program. Clarifications are provided on terminology, such as the difference between source code and object code, and the function of convenience files for compiling and running programs. The conversation also addresses troubleshooting issues related to running Java applets and classpath configurations.
  • #61
gnome said:
I have improvised based on what I think a sentinel should do, but I'm not sure it's what you had in mind,

That's what I had in mind :) Here is an article "on sentinels":
http://www.topcoder.com/?&t=features&c=feat_090104

A nice discussion about implementing lists can be found here:
http://tinyurl.com/53tpe
Look especially at lecture notes 4, 5, and 6. If I remember correctly it includes the sentinel stuff.

Code:
	public Object deQueue() throws EmptyQueueException {
		if (last == sentinel)
			throw new EmptyQueueException();

		MyNode temp = sentinel.next;
		sentinel.next = temp.next;
		if (last == temp)
			last = sentinel;
		return temp.data;
	}

You can replace the second if with "sentinel = temp".

regards,
radu
 
Technology news on Phys.org
  • #62
Originally posted by rgrig
You can replace the second if with "sentinel = temp".
Thanks again. Actually, if I make that change, I can also eliminate the line (sentinel.next = temp.next;) above that second if so now deQueue is just:

Code:
	public Object deQueue() throws EmptyQueueException {
		if (last == sentinel)
			throw new EmptyQueueException();

		MyNode temp = sentinel.next;
		sentinel = temp;
		return temp.data;
	}

Very elegant!

Thanks also to Warren for explaining the exception constructors.
 
  • #63
Unexpected decimal results in java arithmetic

I'm working on a complex number class for homework. What I have so far seems to work correctly, but for some of the results
System.out.print()
gives unexpected decimal representations, such as
5.6i + 2.8i = 8.399999999999999i
yet others are "normal", such as
5.6i - 2.8i = 2.8i

It doesn't seem to be restricted to specific operations; for example when I put different values in the test program, I got
4.0i - 2.8i = 1.2000000000000002i

Is this just a normal consequence of using doubles?

If so, how should I change my
System.out.print()
commands to correct this?

Code:
//	Complex.java
//	implements a complex number type

public class Complex {
	public Complex() {
		_real = 0.0;
		_imag = 0.0;
	}

	public Complex (double re, double im) {
		_real = re;
		_imag = im;
	}

	public static Complex add (Complex x, Complex y) {
		return new Complex(x._real + y._real, x._imag + y._imag);
	}

	public static Complex subt (Complex x, Complex y) {
		return new Complex(x._real - y._real, x._imag - y._imag);
	}

	public static Complex mult (Complex x, Complex y) {
		return new Complex(x._real * y._real, x._imag * y._imag);
	}

	static public Complex div (Complex x, Complex y) {
		return new Complex(x._real / y._real, x._imag / y._imag);
	}

	public static double real(Complex x) {
		return x._real;
	}

	public static double imag(Complex x) {
		return x._imag;
	}

	public double real () {
		return _real;
	}

	public double imag () {
		return _imag;
	}

	private double _real, _imag;
}

with this test driver:
Code:
//	TestComplex.java
//	test driver for Complex class

class TestComplex {

	public static void main (String[] args) {
		double re,im;

		Complex c1, c2, c3, result;
		c1 = new Complex();
		c2 = new Complex();
		c3 = new Complex();
	
		System.out.println("Testing default constructor with instance methods:");
		System.out.println("c1 = " + c1.real() + " + " + c1.imag() + "i");


		System.out.println("Testing default constructor with static methods:");
		System.out.println("c1 = " + Complex.real(c1) + " + " + Complex.imag(c1) + "i");


		System.out.println("Testing set-value constructor:");
		c1 = new Complex(6.4,5.6);
		c2 = new Complex(2.0,2.8);
		System.out.println("c1 = " + c1.real() + " + " + c1.imag() + "i");

		System.out.println("c2 = " + c2.real() + " + " + c2.imag() + "i");


		System.out.println("\nTesting addition:");
		result = Complex.add(c1,c2);
		System.out.print("(" + c1.real() + " + " + c1.imag() + "i)");

		System.out.print(" + (" + c2.real() + " + " + c2.imag() + "i)");

		System.out.println(" = (" + result.real() + " + " + result.imag() + "i)");

		System.out.println("\nTesting subtraction:");
		result = Complex.subt(c1,c2);
		System.out.print("(" +c1.real() + " + " + c1.imag() + "i)");

		System.out.print(" - (" + c2.real() + " + " + c2.imag() + "i)");

		System.out.println(" = (" + result.real() + " + " + result.imag() + "i)");

		System.out.println("\nTesting multiplication:");
		result = Complex.mult(c1,c2);
		System.out.print("(" +c1.real() + " + " + c1.imag() + "i)");

		System.out.print(" * (" + c2.real() + " + " + c2.imag() + "i)");

		System.out.println(" = (" + result.real() + " + " + result.imag() + "i)");

		System.out.println("\nTesting division:");
		result = Complex.div(c1,c2);
		System.out.print("(" +c1.real() + " + " + c1.imag() + "i)");

		System.out.print(" / (" + c2.real() + " + " + c2.imag() + "i)");

		System.out.println(" = (" + result.real() + " + " + result.imag() + "i)");

		System.out.println("\nTesting division by zero:");
		result = Complex.div(c1,c3);
		System.out.print("(" +c1.real() + " + " + c1.imag() + "i)");

		System.out.print(" / (" + c2.real() + " + " + c2.imag() + "i)");

		System.out.println(" = (" + result.real() + " + " + result.imag() + "i)");

		System.out.println("\nFinished.");
	}
}
 
  • #64
Use this:
Code:
NumberFormat numberFormatter = new NumberFormat();
numberFormatter.setMaximumFractionDigits(2);
System.out.println(...numberFormatter.format(c1.real())...);
- Warren
 
  • #65
A Simple Program

Hello.

I have a java program where there is a falling cube. I am trying to make the cube fall, then bounce back up and fall again forever. I know i have to use a for loop.Can someone please guide me as to what to do?


Thanks!
 
  • #66
Does a thread just "go away" when it reaches the end of its run() method, or am I supposed to do something to clean up?
 
  • #67
ghome,

When a Thread's run() method returns, it no longer occupies any CPU resources. It will continue to take up some modest memory resources until there are no more references to it. Then it will be garbage-collected and its memory freed.

- Warren
 
  • #68
Ok, this place is as good as any to post and try and get an answer to this. This program is supposed to read a keyboard input of an integer 1-100 and output the change from a dollar that you get back.

For example: 27

2 Quarters
2 Dimes
3 Pennies

It won't work and I'm killing myself over this. This error comes up when compiling:

java:33: cannot resolve symbol variable Keyboard location: class evan3 amount = Keyboard.readInt ();

Here is the program:

public class evan3
{
public static void main (String[] args)
{

final int DOLLAR = 100;
final int QUARTER = 25;
final int DIME = 10;
final int NICKEL = 5;
final int PENNY = 1;

int amount = 0;
int change = 0;
int numQuarters = 0;
int remQuarters = 0;
int numDimes = 0;
int remDimes = 0;
int numNickels = 0;
int remNickels = 0;
int numPennies = 0;

while (true) // infinite loop
{
System.out.print ("Enter the purchase amount [1-100], enter 0 to exit : ");
amount = Keyboard.readInt ();

if (amount < 0 || amount > 100)
{
System.out.println ("Amount not in range [0 - 100]");
continue;
}

if (amount == 0)
{
System.out.println ("Bye");
break;
}

change = DOLLAR - amount;
numQuarters = change / QUARTER;
remQuarters = change % QUARTER;
numDimes = remQuarters / DIME;
remDimes = remQuarters % DIME;
numNickels = remDimes / NICKEL;
remNickels = remDimes % NICKEL;
numPennies = remNickels / PENNY;


if (numQuarters >1 || numQuarters == 0)
System.out.println ("Quarters");
else
System.out.println ("Quarter");

if (numDimes >1 || numDimes == 0)
System.out.println ("Dimes");
else
System.out.println ("Dime");

if (numNickels >1 || numNickels == 0)
System.out.println ("Nickels");
else
System.out.println ("Quarter");

if (numPennies >1 || numPennies == 0)
System.out.println ("Pennies");
else
System.out.println ("Penny");




} // while

} // main

} // Lab3

Any help? I'm missing something here.
 
  • #69
Well, you're missing that Keyboard class/object you referenced. I have no idea where you heard of a Keyboard class -- perhaps it's something your instructor made up for you to use?

You can always just wrap the System.in stream in a DataInputStream and use its readInt method:

int amount = new DataInputStream(System.in).readInt();

- Warren
 
  • #70
The keyboard class file was something the teacher told us to put in. I downloaded the keyboard class into the same folder where the java file is located and it is supposed to work but it isn't working.

:confused:
 
  • #71
Does the Keyboard.class file have to exist within a package? Do you need to use the import statement to import it? Can you provide an example of a program which successfully uses this class?

- Warren
 
  • #72
We just did a coin java program like that in my computer science class.
 
  • #73
Ok, so it turns out that error message had to with the capitalization of the title of the keyboard.java document.

I really suck at java.

Ok so now the output just lists the denominations: Quarters, Dimes, Nickels, Pennies. How do I get the appropriate numbers to show up? Does it have something to do with the coding around this part...

change = DOLLAR - amount;
numQuarters = change / QUARTER;
remQuarters = change % QUARTER;
numDimes = remQuarters / DIME;
remDimes = remQuarters % DIME;
numNickels = remDimes / NICKEL;
remNickels = remDimes % NICKEL;
numPennies = remNickels / PENNY;

Do I need brackets or println's or something? Some sort of extra coding to get it to work?

How did you manage to get this done Entropy? Any pointers?

Edit: Fixed one problem. Getting there...
 
Last edited:
  • #74
For my first foray into threads, I wrote a readers/writers (shared resource) simulation. The main() method has an int variable "clock", and it just keeps looping and incrementing clock on each loop. While it loops it creates reader and writer threads, according to a randomly generated schedule; each reader & each writer is a separate thread, and when each one is created it is passed a parameter "duration" telling it the length of time it should be active.

I want each reader or writer thread to release the shared resource after it has been active for its alloted amount of time, so in each constructor I pass "clock" as a parameter, and I set a member int variable of the thread class = to that parameter. I thought that would work since I understood that in Java parameters are passed by reference. But it's not working: the readerthreads and writerthreads are not seeing the updating of the clock value that's occurring in main(). Instead each of those threads just sees a constant clock value -- the value that clock had when the thread was created.

How can I enable the child threads to see the updating of a variable that's occurring in the parent (main) thread?
 
  • #75
gnome said:
The main() method has an int variable "clock",
I understood that in Java parameters are passed by reference.
Objects are passed by reference. ints are not.

How can I enable the child threads to see the updating of a variable that's occurring in the parent (main) thread?
There are numerous ways, some more elegant than others. A simple way is not to pass the value at all. The child threads can access the clock value by ClassName.clock, assuming that the clock variable was declared:
public static int clock;
 
  • #76
ek:

you only asked it to print the words:
for example,
System.out.println ("Quarters");
just says to print exactly what's inside the quotes, in this case the word Quarters.

What you want is
System.out.println (String.valueOf(numQuarters) + " Quarters");
and so on...

(String.valueOf(int i) is a static method of the String class that converts an int to a string.)
 
  • #77
gnome said:
System.out.println (String.valueOf(numQuarters) + " Quarters");
I usually write this System.out.println (numQuarters + " Quarters");
 
  • #78
originally posted by prometheus:
There are numerous ways, some more elegant than others. A simple way is not to pass the value at all. The child threads can access the clock value by ClassName.clock, assuming that the clock variable was declared:
public static int clock;

Does it need to be static? Clock is declared in the main function of the project.
 
  • #79
Originally posted by Prometheus:
I usually write this System.out.println (numQuarters + " Quarters");

Thanks. I didn't realize println() was that smart. :smile:
 
  • #80
gnome said:
Does it need to be static? Clock is declared in the main function of the project.
You mean the main method, not main function.

No, of course not. I said that there are many solutions. This is not a solution that I would use.

However, you are writing your code inside the main method. I suspect, although I may be wrong, that you are new to Java. Otherwise, why write your code in the main method? Since you are writing your code in the main method, you have no objects. By the way, I would declare this variable outside of the main method, at class scope.

TYpically, if I have a variable that I want other objects to see, I pass in the constructor a this reference. The constructed object can then call an accessor method in the creating object to determine the value of the variable. In order to do this, however, the creator must be an object. Your program in the main method does not qualify. Unless you have good reason, I recommend that you do not write Java programs inside of the main method.
 
  • #81
Yes I am definitely new to Java: I wrote hello, world in Java 2 weeks ago for the 1st time.

In this case my main method is just a test driver that instantiates the various ReaderThread and WriterThread objects, and "ticks" the clock. Everything else is in 5 separate class files:
ReaderThread
WriterThread
ReaderCounter
WriterCounter
BinarySemaphore

I tried changing the declaration of clock but I keep getting an "illegal start of expression" error, whether I call it public static int clock; or public int clock; or static int clock;
It only let's me do int clock;
Why?


edit: Got it. I had to move the declaration outside of the main method.
 
Last edited:
  • #82
Thanks Prometheus. It looks like it's running correctly now, but it'll take a while to analyze all the starting and finishing messages from the threads to make sure they're all behaving nicely.
 
  • #83
gnome said:
I tried changing the declaration of clock but I keep getting an "illegal start of expression" error, whether I call it public static int clock; or public int clock; or static int clock;
It only let's me do int clock;
Why?

edit: Got it. I had to move the declaration outside of the main method.
The main method is static, so that all variables declared inside of it are static by context: hence, static is invalid. The main method is a method, so that all variables inside of it are local; hence, public is invalid.

If you have a question, it helps to post your code if it is not too large.
 
  • #84
I believe it's now working the way I intended, but if you don't mind wading through it, I'd welcome any comments, criticisms or suggestions you may offer. Anyway, thanks for your help.


Code:
//	test driver for readers/writers problem
//	There can be multiple readers, or a single writer, active at any time.
//		This solution gives priority to writers: active readers are allowed to
//		finish, but no new readers can start if there is a waiting writer.

import java.util.Random;
import java.util.Arrays;

public class testReadWrite{

	public static int clock;

	public static void main(String[] args){

		final int trial_len = 200;
		final int num_readers = 10;
		final int num_writers = 10;
		final int max_read_time = 10;
		final int max_write_time = 4;

		Random randnum = new Random();
		ReaderCounter rc = new ReaderCounter();
		WriterCounter wc = new WriterCounter();
		BinarySemaphore writing = new BinarySemaphore();
		ReaderThread r;
		WriterThread w;

//		int clock;	//	used to count iterations of the while loop (below)
		clock = 0;
		String s = new String();

		int[] read_arrive = new int[num_readers];
		int[] read_len = new int [num_readers];
		int[] write_arrive = new int [num_writers];
		int[] write_len = new int [num_writers];

		for (int i = 0; i < num_readers; i++){
			read_arrive[i] = randnum.nextInt(100);
			read_len[i] = randnum.nextInt(30) + 5;	//	don't want any 0 durations
		}
		for (int i = 0; i < num_writers; i++){
			write_arrive[i] = randnum.nextInt(100);
			write_len[i] = randnum.nextInt(5) + 5;	//	don't want any 0 durations
		}

		Arrays.sort(read_arrive);
		Arrays.sort(write_arrive);

// next 10 lines are just for evaluating the results
		for (int i = 0; i<num_readers; i++){
			System.out.print("reader" + String.valueOf(i) + " ");
			System.out.println("arr: " + String.valueOf(read_arrive[i]) + " len: "
											+ String.valueOf(read_len[i]));
		}
		for (int i = 0; i<num_writers; i++){
			System.out.print("writer" + String.valueOf(i) + " ");
			System.out.println("arr: " + String.valueOf(write_arrive[i]) + " len: "
											+ String.valueOf(write_len[i]));
		}

		while (clock<trial_len){
			System.out.println("clock = " + String.valueOf(clock));
			for (int i = 0; i < num_readers; i++){
				if (read_arrive[i]==clock){
						// form name of new reader
					s = "reader";
					s = s.concat(String.valueOf(i));
						// create new reader, specifying its read duration
					r = new ReaderThread(s,read_len[i],rc,wc,clock);					
					r.start();
				}
			}
			for (int i = 0; i < num_writers; i++){
				if (write_arrive[i]==clock){
						// form name of new writer
					s = "writer";
					s = s.concat(String.valueOf(i));
						// create new reader, specifying its read duration
					w = new WriterThread(s,write_len[i],rc,wc,writing,clock);					
					w.start();
				}
			}
			
			try{
				Thread.sleep(0,50);
			} catch(InterruptedException e){
			}
			clock++;
		}
	}
}
Code:
//	writer class for readers/writers problem
//	test driver must instantiate ReaderCounter rc, WriterCounter wc
//		BinarySemaphore writing, int clock


public class WriterThread extends Thread{
	 public WriterThread(String s, int d, ReaderCounter rctr, WriterCounter wctr,
														BinarySemaphore bs, int clk){
		super(s);
		name = s;
		duration = d;
		rc = rctr;
		wc = wctr;
		writing = bs;
		clock = clk;
		System.out.println(s + "created.");
	}

	public void run(){
//	reversed the order of the following 2 lines 
		wc.addWriter(); // add to count of waiting writers
		rc.writerPass(); // check ReaderCounter for any active readers
		writing.acquire(); // wait for semaphore to start writing
		finish_time = testReadWrite.clock + duration;
		while(finish_time > testReadWrite.clock)	//	changed from <
{
			try{
				System.out.println(name + ": clock = " + testReadWrite.clock +
							"; finish_time = " + finish_time);
				sleep(0,10); // writer is writing
			} catch(InterruptedException e){
			}
		}
		writing.release(); // finished writing
		wc.delWriter();
	}


	private String name;

	private int clock;
	private int duration;
	private int finish_time;
	private ReaderCounter rc;
	private WriterCounter wc;
	private BinarySemaphore writing;
}
Code:
//	reader class for readers/writers problem
//	test driver must instantiate ReaderCounter rc, WriterCounter wc
//		BinarySemaphore writing, int clock

public class ReaderThread extends Thread{
	public ReaderThread(String s, int d, ReaderCounter rctr,
											 WriterCounter wctr, int clk){
		super(s);
		name = s;
		duration = d;
		rc = rctr;
		wc = wctr;
		clock = clk;
		System.out.println(s + "created.");
	}

	public void run(){
		wc.readerPass(); // readers not allowed to start if a writer is waiting
		rc.addReader(); // makes writers wait while any readers are reading
		finish_time = testReadWrite.clock + duration;
		while(finish_time > testReadWrite.clock)	//	changed from <
{
			try{
				System.out.println(name + ": clock = " + testReadWrite.clock +
										"; finish_time = " + finish_time);
				sleep(0,10);	//	reader is reading
			} catch(InterruptedException e) {
			}
		}
		rc.delReader();		// finished
	}


	private String name;

//	duration  and finish_time will be used by test driver to determine when
//		this thread finishes reading
	private int clock;
	private int duration;
	private int finish_time;
	private ReaderCounter rc;
	private WriterCounter wc;

}
Code:
//	utility class for reader/writers problem
//	test driver will instantiate one ReaderCounter named "rc"

public class ReaderCounter{

	public ReaderCounter(){
		count = 0;
	}

//	used by reader starting to read
	public synchronized void addReader(){
		count++;
		System.out.println(Thread.currentThread().getName() + " starting to read.");
		notifyAll();	//in case another reader tried to start at same time
	}


//	used by reader finished reading
	 public synchronized void delReader(){
		count--;
		System.out.println(Thread.currentThread().getName() + " finished reading.");
		notifyAll();	//in case a writer is waiting
	}

//	used by writer wanting to write
	public synchronized void writerPass(){
		while(count > 0){
			try{
				wait();
			} catch (InterruptedException e){
			}
		}
	System.out.println(Thread.currentThread().getName() + " checking for active readers.");
	}

//	unsynchronized: used by main test loop to see when to terminate
	public int getCount(){
		return count;
	}

	private int count;

}
Code:
//	utility class for reader/writers problem
//	test driver will instantiate one WriterCounter named "wc"

public class WriterCounter{

	public WriterCounter(){
		count = 0;
	}

//	used by writer waiting to write
	public synchronized void addWriter(){
		count++;
		System.out.println(Thread.currentThread().getName() + " added to WriterCounter.");
		notifyAll();	//in case another writer is trying
	}


//	used by writer finished writing
	 public synchronized void delWriter(){
		count--;
		System.out.println(Thread.currentThread().getName() + " removed from WriterCounter.");
		notifyAll();	//in case other writers or readers are waiting
	}

//	used by reader wanting to read
	public synchronized void readerPass(){
		while(count > 0){
			try{
				wait();
			} catch (InterruptedException e){
			}
		}
	}

//	unsynchronized: used by main test loop to see when to terminate
	public int getCount(){
		return count;
	}


	private int count;

}
Code:
//	semaphore class for reader/writers problem

public class BinarySemaphore{

	public BinarySemaphore(){
		value = 1;
	}

	public synchronized void acquire(){
		while (value == 0){
			try{
				wait();
			} catch(InterruptedException e){
			}
 		}
		value = 0;
		System.out.println(Thread.currentThread().getName() + " now writing.");
	}

	 public synchronized void release(){
		System.out.println(Thread.currentThread().getName() + " finished writing.");
		value = 1;
		notifyAll();
	}

	private int value;

}
 
  • #85
Thanks a lot guys, I really appreciate it. After the time I spent on this, it was pretty satisfying to finally get it to work.

Thanks for the help!

:biggrin:
 
  • #86
gnome said:
I believe it's now working the way I intended, but if you don't mind wading through it, I'd welcome any comments, criticisms or suggestions you may offer. Anyway, thanks for your help.
Looks pretty good for someone new to Java. I don't have my Java JVM on this machine to load and test it, so I won't comment on it absent a question.

Note that your String.valueOf() are not necessary, and I prefer to omit them.
This method is called automatically when a primitive is concatenated to a string.
 
  • #87
gnome said:
I believe it's now working the way I intended, but if you don't mind wading through it, I'd welcome any comments, criticisms or suggestions you may offer.
I noticed that your ReaderCounter and WriterCounter classes are 100% identical, except for slight differences in method names. I recommend that you just use the same class for both. If you were to have differences in behavior, an interface or an abstract superclass would be better than two classes that are basically identical. In this case, however, I see no difference in functionality at all.
 
  • #88
Point well taken. Thanks again.
 
  • #89
I'm supposed to write an applet to draw a chessboard using two nested "if" statements. How would I even go about starting this?

Something like attaching numerical values to each square and write "if int=even color black else color white"?

What would the other if statement be? How would you even get the chessboard to look like a chessboard?

This java class is getting to me. It's just getting harder and harder.

Any hints?
 
  • #90
the simplest way to draw a chessboard use
fillRect(int,int,int,int) along with setColor(Color)

choose any start position x,y
choose a neat size for the square as squareSize
run a for loop and change the x as x+squareSize
and at each x,y draw a square (change color as a mod 2 operation)
and once u have drawn 8 squares then change y as y+squareSize

Thus, draw Squares row wise till 8 rows ... and u have a chess board ...

-- AI
 

Similar threads

Replies
1
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 33 ·
2
Replies
33
Views
8K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 13 ·
Replies
13
Views
3K