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

In summary, in this conversation, the speaker introduces the concept of Java and explains that to make use of Java programs, a compiler and a runtime environment are needed. The compiler converts human-readable source code into machine-readable object code, while the runtime environment executes the bytecode. The speaker recommends downloading the Java J2SE 1.4.2 SDK and explains how to compile and run a simple Java program using the command line. The terms "program," "object code," and "machine code" are discussed, as well as the purpose of a compiler and the limitations of a physical processor.
  • #36
No, the java.exe program has an envrionment variable called CLASSPATH that includes all the locations where JFrame.class is likely to live. When your program references JFrame, the runtime environment scans the CLASSPATH variable and finds the appropriate code. Unless you've changed the CLASSPATH variable somehow, you don't need to worry about finding it yourself. Just let the runtime environment find it.

- Warren
 
Technology news on Phys.org
  • #37
I'm beginning to think that java is not what I want. I want to write programs that I can give to people to run on their computers. I don't want to have to give them an entire 50Meg java package.

Incidently, I got the lesson2 window to work. What's next? Here are some other things that I thought of besides animation:
- write a screen saver
- make a font for MS Word
- general file manipulation such as automatically moving/altering text in a *.txt file
 
  • #38
Java is not a suitable language for either making a screensaver or a font.

And yes, your users will need to have a Java runtime environment installed in order to run your Java programs. If I'm not mistaken, all versions of Windows from 98 on include one. It may be out of date, however, so you'd need to write your code to the lowest-common-denominator API.

You can also write your programs as applets and let the user run them within a web browser. Web browsers typically have up-to-date runtime environments, but getting around browser security can be a pain. If you want to manipulate the user's hard drive, for example, it will be tough to do from an applet -- web browsers try to keep applets from doing exactly those kinds of things.

- Warren
 
  • #39
OK. So, back to the animation applet. Lesson3 ...
 
  • #40
Are the lines
import java.awt.*;
and
import javax.swing.*;
analogous to "#include" preprocessor directives in c/c++ (although it looks like in Java they are actually compiled along with the rest of the commands)?

What's special about the "toplevel class"? Is it simply that main() resides there? What considerations are there as to what else does or does not belong in that file?

In "main(String[] argv)" is the argument required by Java syntax even though no command line parameters are being used by this program? I tried it with just "main(){" and it seemed to compile OK but it gave an error when i tried to run it?

And finally...
do you plan to continue this thread?

Thanks Warren.
 
  • #41
More questions:

where can I find a class that contains lines, arrows and circles?

what must be done to place a java program on a web page so it can be executed on-line?

(I'd like to try translating an animation that I wrote from c++ to java.)
 
  • #42
chroot said:
And yes, your users will need to have a Java runtime environment installed in order to run your Java programs. If I'm not mistaken, all versions of Windows from 98 on include one. It may be out of date, however, so you'd need to write your code to the lowest-common-denominator API.

You can't really expect a Java runtime to be installed on any Windows machine. A lot of them have it installed, but a lot of them don't. Because of the legal wrangling between Microsoft and Sun, there have been long periods of time where Microsoft wasn't distributing the runtime along with Windows.
 
  • #43
True, but I suspect that most people do have it anyway. The jre pretty much begs to be installed as soon as a web page containing an applet is loaded, and all it takes for most people to install sun's plugin is a couple of clicks, right?
 
  • #44
gnome said:
True, but I suspect that most people do have it anyway. The jre pretty much begs to be installed as soon as a web page containing an applet is loaded, and all it takes for most people to install sun's plugin is a couple of clicks, right?

Actually, that doesn't happen anymore either. On Windows XP with no Java installed, if you go to a web page with an applet you'll just get nothing.

Depending on the version of Windows and the browser you're using, you may already have the runtime installed, or it may be really easy to install it, or you may just be left wondering why certain web pages don't work on your computer. And even when the runtime is installed, it's anybodys guess which version it is.
 
  • #45
What's your point? Don't bother writing applets anymore? (Or in my case, don't bother learning how in the first place?)
 
  • #46
The import statements just make it easier to type the names of classes by importing packages of classes into the default namespace. Thus, after importing javax.swing.JFrame, you can just call it JFrame. In C/C++, the #include directive actually inserts a file into the current file. That's not true in Java.

The toplevel class contains a main method. Perhaps "toplevel class" is not an official term for it, but it gets the job done. The toplevel class contains the entry point of the program.

And yes, the (String argv[]) is indeed required. If you leave out the arguments, you get a different method, still perfectly valid, but without any arguments. The Java runtime environment is looking for one with arguments.

- Warren
 
  • #47
gnome said:
What's your point? Don't bother writing applets anymore? (Or in my case, don't bother learning how in the first place?)

No, of course not. Lots of great languages require a runtime to be distributed with programs written in them. It's just that Warren said that any version of Windows >= Win98 included a Java runtime, and I wanted to point out that you can't assume that.

If the fact that people may have to download a large runtime to use your program is a problem, then don't use Java to write that program. But there are lots of times when that isn't problem - so you can use Java then.

Normally I wouldn't just jump into a thread like this. But someone specifically mentioned that downloading a large runtime might be a problem, and I just wanted to give them all the facts.
 
  • #48
I have a question. What type of attitude should someone go into this with? I tried to learn java before, and i just got too bored of it. I found that i could never get a program to actually work because the debugger was too general. Any suggestions?
 
  • #49
A good programmer doesn't need a debugger. And no, I'm really not being condescending -- it's true.

What exactly were you having trouble with?

- Warren
 
  • #50
And chroot is sooo right!

Usually the best way to debug is by placing checkpoints.Checkpoints are nothing but placing print statements at some places in the program and see if the program behaves the way we want to...

In java, u can use System.out.println() to print values to the console.

A very useful function in c has always been getch() , so that the execution can be stopped at some point and the values can be carefully monitored...
Unfortunately there is not an equivalent in Java, but u can always make one ...

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class tri
{
public static void main(String args[])
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int i;
try
{
i=br.read();
}
catch(Exception e){}
}
}

-- AI
 
  • #51
A good programmer doesn't need a debugger. And no, I'm really not being condescending -- it's true.
Strange statement.

Given some C code that's a couple of thousand lines that compiles fine without any errors at all, yet still gets a segmentation fault at run-time.
What would you do? How would you find that "of by 1" bounds error in some char*? Or that non null-terminated string you are expecting to be null terminated?

Using printf()-statements to check your code is fine, but are you sure you are handling all possible scenarios?

I'd say a debugger is a pretty important and powerfull tool for a programmer.
 
  • #52
It's a matter of philosophy, I suppose. I tend to use a variant of cleanroom software engineering techniques, and have not actually written an off-by-one error or an array bounds error in many years. I would actually be quite happy to accept your challenge in regards to a 1kloc piece of code that segfaults. In fact, I would even be willing to bet money on my ability to find the problem in just a few minutes.

I consider off-by-one errors and array bounds errors to be, well... novice mistakes. A debugger can certainly help a new programmer catch these kinds of mistakes, but, as the programmer gains experience, the debugger really just becomes less and less useful.

Once you throw threads and asynchronous data access into things, debuggers really become just about useless. The only way to write zero-defect code is to truly understand the code as you write it, and that takes experience.

- Warren
 
  • #53
A very useful function in c has always been getch() , so that the execution can be stopped at some point and the values can be carefully monitored...
Checking the backtrace is usually a lot faster. You can only guess where the problems are happening, the backtrace tells you where.

I'd say it would be far more superior just using breakpoints in your debugger and checking variables from there. As opposed to opening your file and commenting/uncommenting a debug-line somewhere in your source-code, recompiling and running again.
 
  • #54
I consider off-by-one errors and array bounds errors to be, well... novice mistakes.
They are done by professional programmers all the time. We are only humans.

I'm really not talking about ability here. Very few people will be able to write something huge that just compiles and works perfectly straight away.

It's more about finding the error or how to debug your code.

I'd say a debugger is far superior to any "insert various print-statements in your code" variants.

Once you throw threads and asynchronous data access into things, debuggers really become just about useless
The more complex code, the more complex datastructures etc. the more complex debugging becomes. Using a debugger with threaded code can tell you what thread is causing problems. I don't understand why this would be useless.

I'd actually say it the other way around:
Using a debugger when you are learning programming is dumb. It has only negative effects on your learning experience, but once you get more experienced a debugger is IMO a good thing.
 
  • #55
Dr-NiKoN said:
They are done by professional programmers all the time. We are only humans.
All programmers make mistakes. Few truly professional programmers make the same mistakes that students would make. The type of mistakes a programmer makes is certainly related to his/her experience. The effectiveness of a debugger is related to the type of errors being made, and thus is also related to the programmers experience.
I'm really not talking about ability here. Very few people will be able to write something huge that just compiles and works perfectly straight away.
I never said that. I said that experienced programmers don't make the kind of mistakes that debuggers are good at exposing.
I'd say a debugger is far superior to any "insert various print-statements in your code" variants.
Once again, it's a matter of philosophy. Many experienced programmers, myself included, think quite poorly of overuse of a debugger.
The more complex code, the more complex datastructures etc. the more complex debugging becomes. Using a debugger with threaded code can tell you what thread is causing problems. I don't understand why this would be useless.
What if the problem does not exist in one thread, but exists in the interdependence or cooperation of more than one thread?
Using a debugger when you are learning programming is dumb. It has only negative effects on your learning experience, but once you get more experienced a debugger is IMO a good thing.
You are welcome to your opinion. I have watched many students cling to the debugger far too long. Using a debugger forces a sort of "tunnel vision," in which students will make a change to their code, observe its behavior in the debugger, edit their code again, and so on. They freely add +1, for example, anytime they're off by one, without really considering the larger reason why their loop wasn't initialized properly in the first place. They place bandaids on open wounds without curing the underlying disease.

In my opinion, weaning oneself from a debugger is one of the first steps one can take to really being able to program. Learning strong, systematic software engineering techniques is the second.

- Warren
 
  • #56
Debuggers tend to be a crutch; they make it easier to avoid thinking about the code you are trying to fix, just using trial-and-error instead. Of course, doing trial-and-error programming by inserting prints or logging everywhere isn't any better.

I do agree that a debugger usually isn't harmful to someone who's already a good programmer. But it usually isn't useful, either. Even if you have to fix a really big chunk of spagetti code written by someone else who isn't a good programmer, you're still better off simplifying the code first and then trying to fix it. And debuggers just aren't very useful for simple code.

Debuggers are only useful if you have code that you can't trace through in your head. This generally means that either the code jumps around alot, or has a large number of variables. Both of those things generally only occur in badly written code. Don't write such code yourself. If the code wasn't written by you, make it into good code before you try and debug it. If that is beyond your abilities, then you are not a good programmer.
 
  • #57
My first Java class

Here's my first stab at Java. No fancy graphics, just a simple queue implemented as a linked list. It actually seems to work :approve: but I'd appreciate any constructive criticism you might offer.

In particular, I'm wondering about my implementation of Empty(). In C or C++ I'd never just "dump" the nodes the way I did here, but I get the impression that this is OK in Java. Yes?

Also, should my deQueue() method provide some protection against the user attempting to remove an object from an empty queue, or is the normal practice to leave that for the main program to deal with (as I did here)?

(It's homework, so please offer criticisms/suggestions, but don't rewrite it for me.)

Thanks.


Here's MyQueue.java:
Code:
//	MyQueue.java

public class MyQueue {
	MyNode first;
	MyNode last;
	int size;

	public MyQueue() {
		first = null;
		last = null;
		size = 0;
	}

	public boolean isEmpty() {
		if (size == 0)
			return true;
		else
			return false;
	}

	public void enQueue(Object o) {
		MyNode nextNode = new MyNode(o);
		if (isEmpty()) {
			first = nextNode;
			last = nextNode;
		}
		else {
			last.next = nextNode;
			last = nextNode;
		}
		size++;
	}

	public Object deQueue() {
		MyNode temp = first;
		if (size == 1) {
			first = null;	
			last = null;
			size --;
		}
		else if (size > 1) {
			first = first.next;
			size --;
		}
		return temp.data;
	}

	public void Empty() {
		first = last = null;
		size = 0;
	}
}
			
	


class MyNode {
	Object data;
	MyNode next;

	MyNode (Object o) {
		data = o;
		next = null;
	}

}

and here's a test driver, testMyQueue.java:
Code:
//	testMyQueue.java
//	test driver for MyQueue class

class testMyQueue {
	public static void main(String[] args) {
		MyQueue q = new MyQueue();
		Integer n;

		for(int j=0; j<4; j++) {
			System.out.println("\nTesting five entries to the queue.");
			for(int i=0; i<5; i++) {
				n = new Integer(2*i*j);
				q.enQueue(n);
			}

			while(!q.isEmpty()){
				n = (Integer) q.deQueue();
				System.out.println(n);
			}
		}

		q.Empty();

		if(q.isEmpty()) {
			System.out.println("The queue is now empty.\n");
			System.out.println("One last trial...");
		}

		for(int i=0; i<5; i++) {
			n = new Integer(10*i);
			q.enQueue(n);
		}

		while(!q.isEmpty()){
			n = (Integer) q.deQueue();
			System.out.println(n);
		}


		System.out.println("Goodbye.");
	}
}
 
Last edited:
  • #58
gnome said:
Here's my first stab at Java. No fancy graphics, just a simple queue implemented as a linked list. It actually seems to work :approve: but I'd appreciate any constructive criticism you might offer.

For a first stab it looks pretty good!
No,you don't need to concern yourself with deallocating memory. This is a job for the garbage collector.

A few things:

1. Trying to dequeue an element from an empty queue should throw an exception. This is the usual practice in Java and it is good practice IMO. The client deals with the exception at whatever level it wants.

2. The Java coding convention is to use camel case names for methods (i.e. use "empty" instead of "Empty").

3. Using a sentinel node would simplify a lot of code. For example the empty check becomes "return first == last" and the enque function doesn't need case-by-case analysis. If you don't need a getSize() method then you could discard the size field.

4. The Node class should probably be nested in the Queue class. It can safely be made private. The user shouldn't know or concern himself with such details.

5. The member variables first, last and size should be private.

I hope that helps.

regards,
radu
 
Last edited:
  • #59
Thanks for the suggestions, Radu. I vaguely remember being briefly introduced to sentinels in my Data Structures class a couple of years ago, but I've never used one since then. I have improvised based on what I think a sentinel should do, but I'm not sure it's what you had in mind, unless you're using first as a reference to the sentinel, so please let me know if there's a better (or more generally accepted) way of implementing it.

Regarding the exception class, I haven't found any explanation of the purpose of the line
Code:
super();
Can you shed any light on that?
Also, I see that the "String s" exception constructor is optional, and I can't figure out what purpose it would serve. What can you tell me about that?

Here's my revised code.

MyQueue.java:
Code:
public class MyQueue {
	private class MyNode {
		Object data;
		MyNode next;

		MyNode () {				//	constructor for sentinel node
			data = null;
			next = null;
		}
		MyNode (Object o) {		//	constructor for other nodes
			data = o;
			next = null;
		}
	};

	private MyNode sentinel, last;

	public MyQueue() {
		last = sentinel = new MyNode();
	}

	public boolean isEmpty() {
		return sentinel == last;
	}

	public void enQueue(Object o) {
		MyNode nextNode = new MyNode(o);
		last.next = nextNode;
		last = nextNode;
	}

	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;
	}

	public void empty() {
		last = sentinel;
		last.next = null;
	}
}

EmptyQueueException.java:
Code:
public class EmptyQueueException extends java.lang.Exception {
	EmptyQueueException() {
		super();
	}

	EmptyQueueException(String s) {
		super(s);
	}
}


testMyQueue.java
Code:
class testMyQueue {
	public static void main(String[] args) {
		MyQueue q = new MyQueue();
		Integer n;

		for(int j=0; j<4; j++) {
			System.out.println("\nTesting five entries to the queue.");
			for(int i=0; i<5; i++) {
				n = new Integer(2*i*j);
				q.enQueue(n);
			}

			while(true){
				try {
					n = (Integer) q.deQueue();
					System.out.println(n);
				} catch (EmptyQueueException e) {
					System.out.println("Queue is empty");
					break;
				}
			}
		}

		for(int i=0; i<5; i++) {
			n = new Integer(2*i);
			q.enQueue(n);
		}

		q.empty();

		if(q.isEmpty()) {
			System.out.println("The queue is now empty.\n");
			System.out.println("One last trial...");
		}

		for(int i=0; i<5; i++) {
			n = new Integer(10*i);
			q.enQueue(n);
		}

		while(!q.isEmpty()){
			try {
				n = (Integer) q.deQueue();
				System.out.println(n);
			} catch (EmptyQueueException e) {
				System.out.println("We should never get caught here.");
			}
		}

		System.out.println("Goodbye.");
	}
}
 
  • #60
The line "super()" simply invokes the superclass constructor. In this case, it runs the java.lang.Exception constuctor. It is not necessary to explicitly call the superclass constructor, as it will be called automatically anyway, but it's never a bad idea.

The constructor that takes a String argument allows you to provide a message that might be helpful to the user of your class. In this case, the name of the exception is self-explanatory, so the String argument is not very useful. In some cases though, it's nice to provide a bit more detail as to exactly why the exception was thrown.

- Warren
 
  • #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
 
  • #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:
 

Similar threads

Replies
1
Views
1K
Replies
3
Views
1K
Replies
33
Views
8K
Replies
7
Views
2K
Replies
5
Views
2K
Replies
13
Views
2K
Back
Top