Clan x86

Technical (Development, Security, etc.) => General Programming => Tutorials, References, and Examples => Topic started by: Joe on April 09, 2006, 01:56:18 PM

Title: Fahrenheit <=> Celsius Converter
Post by: Joe on April 09, 2006, 01:56:18 PM
http://www.javaop.com/uploads/guest/FCConverter.tar.gz

It's more of an example of how to do this than anything. Plus it shows how to use the Java tool line to create javadocs (and cut them down to only what you need), run the java disassembler (and stick it in a file), and of course, compile. Shell script included to do that stuff.

EDIT -
Replaced assembler with disassembler (hehe, oops).
Title: Re: F<=>C Converter
Post by: rabbit on April 09, 2006, 01:59:13 PM
F?
Title: Re: F<=>C Converter
Post by: Joe on April 09, 2006, 02:01:13 PM
Fahrenheit
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Sidoh on April 09, 2006, 02:26:37 PM
No Kelvins? :(
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Ergot on April 09, 2006, 02:43:36 PM
Quote from: Sidoh on April 09, 2006, 02:26:37 PM
No Kelvins? :(
Just add 273 to Celcius :\
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Sidoh on April 09, 2006, 03:10:54 PM
Quote from: Ergot on April 09, 2006, 02:43:36 PM
Just add 273 to Celcius :\

I know. : - P

I want his program to do it for me.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Joe on April 09, 2006, 03:20:38 PM
It's open source for a reason! <3.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: MyndFyre on April 09, 2006, 04:06:12 PM
Quote from: Ergot on April 09, 2006, 02:43:36 PM
Quote from: Sidoh on April 09, 2006, 02:26:37 PM
No Kelvins? :(
Just add 273 to Celcius :\
273.15

Quote from: Joe on April 09, 2006, 03:20:38 PM
It's open source for a reason! <3.
And that reason is?
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Joe on April 09, 2006, 04:21:23 PM
QuoteAnd that reason is?
You're kidding, right? To show others how I did it, and for Sigh-dough to add his nice modification. ^_^
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Sidoh on April 09, 2006, 04:21:39 PM
Quote from: MyndFyrex86] link=topic=5504.msg64307#msg64307 date=1144613172]
273.15

Depends on significant digits and desired accuracy. ;)
Title: Re: Fahrenheit <=> Celsius Converter
Post by: deadly7 on April 09, 2006, 06:24:18 PM
Is it me or does this seem like a really basic thing to make?
Title: Re: Fahrenheit <=> Celsius Converter
Post by: MyndFyre on April 09, 2006, 06:26:26 PM
Quote from: deadly7 on April 09, 2006, 06:24:18 PM
Is it me or does this seem like a really basic thing to make?
z0mG N00es!  J00 gotta get teh 1nput, m4ke 1t a num|3er, times and add teh numb3rz, n put 1t on t3h scr33nz.  c0mp|_icated!!!!!!1!1!11!1!one11!
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Quik on April 09, 2006, 06:36:20 PM
Quote from: deadly7 on April 09, 2006, 06:24:18 PM
Is it me or does this seem like a really basic thing to make?

In most "learn to program" books, this is the 2nd or 3rd program it has you make. Complexity is not the point here, not even usefulness (though I can see a situation where someone might find it handy). The point is that he's practicing programming and (supposedly) learning new things.

From your comment, I take it you can make this same program in a quick 5 minutes? Thought so.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: MyndFyre on April 09, 2006, 06:55:10 PM
Quote from: Quik on April 09, 2006, 06:36:20 PM
The point is that he's practicing programming and (supposedly) learning new things.

I might say that he's not.  He's still doing typical Joe things.  For instance:

if ((args.length == 0) || (args.length == 1))

How about:

if (args.length < 2)

so that we only need one runtime check if args.length == 1?

Then he's got this:

System.out.println(args[1] + " F = " + fToC(Double.parseDouble(args[1])) + " C.");

...which is not the most readable thing ever.  Not exactly the most beneficial for him learning or someone else learning.

Then he has inconsistent accessibility which is shown in his JavaDoc:

public static double fToC(double temp)
private static double cToF(double temp)

An external user trying to convert Celsius to Fahrenheit will get a compile-time error because cToF is private.

Finally, his algorithms are just wrong:

/**
Converts a temperature from fahrenheit to celsius
@param temp Temperature to convert (fahrenheit)
@return Converted temperature (celsius)
*/
public static double fToC(double temp)
{
return 100.0 / 212 * (temp - 32.0);
}

/**
Converts a temperature from celsius to fahrenheit
@param temp Temperature to convert (celsius)
@return Converted temperature (fahrenheit)
*/
private static double cToF(double temp)
{
return 212.0 / 100 * temp + 32.0;
}

It's well-known that the appropriate formulae for converting between Celsius and Fahrenheit are the following:
C to F: degreesC * 9 / 5 + 32
F to C: (degreesF - 32) * 5 / 9

For example, when converting 10 C to Fahrenheit, Joe's program would return 53.2 F, where the correct value is actually 50 F. 

Also, it is commonly known that the Fahrenheit and Celsius scales intersect at -40 degrees.  Joe's algorithms, however, return the following:
-40 C to F: -52.8
-40 F to C: -33.96

Ultimately this is a completely and utterly worthless "tutorial," with the exception that it shows that you should use .equalsIgnoreCase when you're parsing command-line arguments.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: deadly7 on April 09, 2006, 07:00:28 PM
Quote from: Quik on April 09, 2006, 06:36:20 PM
Quote from: deadly7 on April 09, 2006, 06:24:18 PM
Is it me or does this seem like a really basic thing to make?

In most "learn to program" books, this is the 2nd or 3rd program it has you make. Complexity is not the point here, not even usefulness (though I can see a situation where someone might find it handy). The point is that he's practicing programming and (supposedly) learning new things.

From your comment, I take it you can make this same program in a quick 5 minutes? Thought so.
Uh.  Joe boasts about his programming knowledge, and unless he picked up a new language I doubt this is learning something new for him.

I don't program.  Programming bores me.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Joe on April 09, 2006, 07:05:54 PM
I got annoyed at Blaze for correcting me, saying Winnipeg was 9 degrees, when I said it was 48 (same thing). So, I wrote this~
Title: Re: Fahrenheit <=> Celsius Converter
Post by: deadly7 on April 09, 2006, 07:18:41 PM
(9^2)/5 = 16.2
16.2+32 = 48.2
You both lose.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: Sidoh on April 09, 2006, 09:30:46 PM
Quote from: deadly7 on April 09, 2006, 07:00:28 PM
Programming bores me.

BLASPHEMER!
Title: Re: Fahrenheit <=> Celsius Converter
Post by: iago on April 10, 2006, 12:07:12 PM
Quote from: MyndFyrex86] link=topic=5504.msg64352#msg64352 date=1144623310]
Quote from: Quik on April 09, 2006, 06:36:20 PM
The point is that he's practicing programming and (supposedly) learning new things.

I might say that he's not.  He's still doing typical Joe things.  For instance:
He's still learning.  He'll especially learn from criticisms that you provide, but it helps if you don't phrase it in such a negative way.  Is it really necessary to have a "you're an idiot" tone when a "this would be better" tone would suffice?

Quote from: MyndFyrex86] link=topic=5504.msg64352#msg64352 date=1144623310]

if ((args.length == 0) || (args.length == 1))

How about:

if (args.length < 2)

so that we only need one runtime check if args.length == 1?
I like Joes way better.  The code will end up the same after being compiled, but Joe's way is more clear to people reading it. 
Title: Re: Fahrenheit <=> Celsius Converter
Post by: MyndFyre on April 10, 2006, 01:23:20 PM
Quote from: iago on April 10, 2006, 12:07:12 PM
Quote from: MyndFyrex86] link=topic=5504.msg64352#msg64352 date=1144623310]

if ((args.length == 0) || (args.length == 1))

How about:

if (args.length < 2)

so that we only need one runtime check if args.length == 1?
I like Joes way better.  The code will end up the same after being compiled, but Joe's way is more clear to people reading it. 
Uhh, wha-?

That might be the case in Java, but *only* for the length property.  The thing about some languages such as Java, C, C#, etc. is that by calling methods you could inadvertantly change the class.

For example, if (instead of saying .length), you had to use a function like .getLength(), Java would have no way of knowing that the array object didn't change state and that it could optimize it out.  C fortunately offers that option to intelligent programmers:

class CArray {
  public:
    int getLength() const;
}

with the const modifier on class methods.

The problem is that what the assembler will produce is something like this:

mov    eax, [edx+08h]   ; current
cmp    eax, 0
jz       conditional_okay
cmp    eax, 1
jnz      conditional_false
conditional_okay:
  ; do stuff inside the conditional scope

conditional_false:
  ; ...

Whereas with my way, there's only one conditional evaluation:

mov    eax, [edx+08h]
cmp    eax, 2
jge     conditional_false
; do stuff inside the conditional scope
conditional_false:
; else --

Now, let's say that we're calling a method (non-virtual) from a class that's not marked const:

mov    edx, [ebx+08h]
call     edx
cmp    eax, 0
jz       conditional_okay
mov    edx, [ebx+08h] ; depending on whether edx was overwritten, this instruction may be unnecessary.  The linker knows.
call     edx
cmp    eax, 1
jnz      conditional_false
conditional_okay:
  ; do stuff inside the conditional scope

conditional_false:
  ; ...


Hopefully you see the problem.

Plus, what if Joe made a "debuffer" in Java?  Then, using this line of coding would be something like:

if (pck.getInt32() == 0 || pck.getInt32() == 1)

which would DEFINITELY lead to runtime errors as he read too quickly through a packet where this value did not initially equal zero.

The other nice thing about my method, besides what I've already given you, is that it guards you from some exceptional cases.  For example, the .indexOf function returns -1 when it cannot find an instance of the specified string within another string.  This is an exceptional case -- it shouldn't require an Exception object, but it should be able to be handled.
Title: Re: Fahrenheit <=> Celsius Converter
Post by: iago on April 10, 2006, 05:05:08 PM
Uhh, what?  Aren't we talking about commandline parameters?

He wants to know if there are 0 or 1 commandline parameters.  Anybody who views his source will instantly see that he is looking for 0 or 1 commandline paremeters.  If he uses <2, then I stop and think, "Less than 2, that's 1 and 0 and negatives.  But negatives can't be here, so just 1 and 0."  Whereas if he uses 0||1, I think "Ah, he needs 0 or 1 parameters".  That's it! 

In other cases, it really depends on the situation.  But in this case, I prefer to spell out the exact number of parameters I want, not use a < or > comparison. 

The main point is, you're complaining about his coding style there.  He does it one way, you do it another.  That doesn't make you right and him wrong, or vice versa. 

Title: Re: Fahrenheit <=> Celsius Converter
Post by: Blaze on April 17, 2006, 12:38:24 AM
I knew that his formula wasn't the one I used, but was too lazy to see if it worked out.  :)