Integer comparison: Difference between revisions
m moved Comparing two integers to Integer comparison |
|||
(No difference)
|
Revision as of 12:48, 6 February 2010
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
Basic Data Operation
This is a basic data operation. It represents a fundamental action on a basic data type.
You may see other such operations in the Basic Data Operations category, or:
Integer Operations
Arithmetic |
Comparison
Boolean Operations
Bitwise |
Logical
String Operations
Concatenation |
Interpolation |
Comparison |
Matching
Memory Operations
Pointers & references |
Addresses
Get two integers from the user, and then output if the first one is less, equal or greater than the other. Test the condition for each case separately, so that all three comparison operators are used in the code.
Ada
<lang ada>with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_Io;
procedure Compare_Ints is
A, B : Integer;
begin
Get(Item => A); Get(Item => B);
-- Test for equality if A = B then Put_Line("A equals B"); end if;
-- Test For Less Than if A < B then Put_Line("A is less than B"); end if;
-- Test For Greater Than if A > B then Put_Line("A is greater than B"); end if;
end Compare_Ints;</lang>
ALGOL 68
Note: the standard includes the characters "≤", "≥" and "≠". These appear in the character sets wp:GOST 10859, ISOtech and IBM's wp:EBCDIC e.g. code page 293, and in extended ASCII code pages 910 & 910
The current distribution of both ALGOL 68G and ELLA ALGOL 68 compilers only allow wp:ASCII characters (ASCII has neither "≤", "≥" nor "≠" characters). <lang algol68>main: (
INT a, b; read((a, space, b, new line));
IF a <= b OR a LE b # OR a ≤ b # THEN print((a," is less or equal to ", b, new line)) FI; IF a < b OR a LT b THEN print((a," is less than ", b, new line)) ELIF a = b OR a EQ b THEN print((a," is equal to ", b, new line)) ELIF a > b OR a GT b THEN print((a," is greater than ", b, new line)) FI; IF a /= b OR a NE b # OR a ≠ b # THEN print((a," is not equal to ", b, new line)) FI; IF a >= b OR a GE b # OR a ≥ b # THEN print((a," is greater or equal to ", b, new line)) FI
)</lang> Example output: <lang algol68>+3 is less or equal to +4
+3 is less than +4 +3 is not equal to +4</lang>
AutoHotkey
Error checking is performed automatically by attaching UpDowns to each of the Edit controls. UpDown controls always yield an in-range number, even when the user has typed something non-numeric or out-of-range in the Edit control. The default range is 0 to 100. <lang autohotkey>Gui, Add, Edit Gui, Add, UpDown, vVar1 Gui, Add, Edit Gui, Add, UpDown, vVar2 Gui, Add, Button, Default, Submit Gui, Show Return
ButtonSubmit:
Gui, Submit, NoHide If (Var1 = Var2) MsgBox, % Var1 "=" Var2 Else If (Var1 < Var2) MsgBox, % Var1 "<" Var2 Else If (Var1 > Var2) MsgBox, % Var1 ">" Var2
Return
GuiClose:
ExitApp</lang>
AWK
<lang awk>/[0-9]* [0-9]*/{ if ($1 == $2) print $1, "is equal to", $2 if ($1 < $2) print $1, "is less than", $2 if ($1 > $2) print $1, "is greater than", $2 }</lang>
BASIC
<lang qbasic>CLS INPUT "a, b"; a, b 'remember to type the comma when you give the numbers PRINT "a is "; IF a < b THEN PRINT "less than "; IF a = b THEN PRINT "equal to "; IF a > b THEN PRINT "greater than "; PRINT "b"</lang>
Befunge
Befunge only has the greater-than operator (backtick `). The branch commands (underline _ and pipe |) test for zero.
<lang befunge>v v ">" $< >&&"=A",,\:."=B ",,,\: .55+,-:0`|
v "<" _v#< @,+55,," B",,,"A " < "=" <</lang>
Common Lisp
You can type this directly into a REPL:
<lang lisp>(let ((a (read *standard-input*))
(b (read *standard-input*))) (cond ((not (numberp a)) (format t "~A is not a number." a)) ((not (numberp b)) (format t "~A is not a number." b)) ((< a b) (format t "~A is less than ~A." a b)) ((> a b) (format t "~A is greater than ~A." a b)) ((= a b) (format t "~A is equal to ~A." a b)) (t (format t "Cannot determine relevance between ~A and ~B!" a b)))))</lang>
After hitting enter, the REPL is expecting the two numbers right away. You can enter the two numbers, and the result will print immediately. Alternatively, you can wrap this code in a function definition:
<lang lisp>(defun compare-integers ()
(let ((a (read *standard-input*)) (b (read *standard-input*))) (cond ((not (numberp a)) (format t "~A is not a number." a)) ((not (numberp b)) (format t "~A is not a number." b)) ((< a b) (format t "~A is less than ~A." a b)) ((> a b) (format t "~A is greater than ~A." a b)) ((= a b) (format t "~A is equal to ~A." a b)) (t (format t "Cannot determine relevance between ~A and ~B!" a b)))))</lang>
Then, execute the function for better control:
(compare-integers)
C
<lang c>#include <stdio.h>
int main() {
int a, b; scanf("%d %d", &a, &b);
if (a < b) printf("%d is less than %d\n", a, b);
if (a == b) printf("%d is equal to %d\n", a, b);
if (a > b) printf("%d is greater than %d\n", a, b);
return 0;
}</lang>
C++
<lang cpp>#include <iostream> using namespace std;
int main() {
int a, b; cin >> a >> b;
// test for less-than if (a < b) cout << a << " is less than " << b << endl;
// test for equality if (a == b) cout << a << " is equal to " << b << endl;
// test for greater-than if (a > b) cout << a << " is greater than " << b << endl;
}</lang>
C#
<lang csharp>using System;
class Program {
static void Main() { int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); if (a < b) Console.WriteLine("{0} is less than {1}", a, b); if (a == b) Console.WriteLine("{0} equals {1}", a, b); if (a > b) Console.WriteLine("{0} is greater than {1}", a, b); }
}</lang>
Clean
<lang clean>import StdEnv
compare a b
| a < b = "A is less than B" | a > b = "A is more than B" | a == b = "A equals B"
Start world
# (console, world) = stdio world (_, a, console) = freadi console (_, b, console) = freadi console = compare a b</lang>
D
<lang d>import std.stdio, std.string;
void main() {
auto a = readln().atoi(), b = readln().atoi(); if (a < b) writefln(a, " is less than ", b);
if (a == b) writefln(a, " is equal to ", b);
if (a > b) writefln(a, " is greater than ", b);
}</lang>
E
<lang e>def compare(a :int, b :int) {
println(if (a < b) { `$a < $b` } \ else if (a <=> b) { `$a = $b` } \ else if (a > b) { `$a > $b` } \ else { `You're calling that an integer?` })
}</lang>
Factor
<lang factor>: example ( -- ) readln readln [ string>number ] bi@ [ > [ "A > B" print ] when ] [ < [ "A < B" print ] when ] [ = [ "A = B" print ] when ] 2tri ; </lang>
FALSE
Only equals and greater than are available. <lang false>^^ \$@$@$@$@\ >[\$," is greater than "\$,]? \>[\$," is less than "\$,]? =["characters are equal"]?</lang>
Forth
To keep the example simple, the word takes the two numbers from the stack. <lang forth>: compare-integers ( a b -- )
2dup < if ." a is less than b" then 2dup > if ." a is greater than b" then = if ." a is equal to b" then ;</lang>
Fortran
In ALL Fortran versions (including original 1950's era) you could use an "arithmetic IF" statement to compare using subtraction: <lang fortran>program arithif integer a, b
c fortran 77 I/O statements, for simplicity read(*,*) a, b
if ( a - b ) 10, 20, 30 10 write(*,*) a, ' is less than ', b
goto 40
20 write(*,*) a, ' is equal to ', b
goto 40
30 write(*,*) a, ' is greater than ', b 40 continue
end</lang>
In ANSI FORTRAN 66 or later you could use relational operators (.lt., .gt., .eq., etc.) and unstructured IF statements: <lang fortran>program compare integer a, b c fortran 77 I/O statements, for simplicity read(*,*) a, b
if (a .lt. b) write(*, *) a, ' is less than ', b if (a .eq. b) write(*, *) a, ' is equal to ', b if (a .gt. b) write(*, *) a, ' is greater than ', b end</lang>
In ANSI FORTRAN 77 or later you can use relational operators and structured IF statements: <lang fortran>program compare integer a, b read(*,*) a, b
if (a .lt. b) then
write(*, *) a, ' is less than ', b
else if (a .eq. b) then
write(*, *) a, ' is equal to ', b
else if (a .gt. b) then
write(*, *) a, ' is greater than ', b
end if
end</lang>
In ISO Fortran 90 or later you can use symbolic relational operators (<, >, ==, etc.) <lang fortran>program compare integer :: a, b read(*,*) a, b
if (a < b) then
write(*, *) a, ' is less than ', b
else if (a == b) then
write(*, *) a, ' is equal to ', b
else if (a > b) then
write(*, *) a, ' is greater than ', b
end if
end program compare</lang>
F#
<lang fsharp>let compare_ints a b =
let r = match a with | x when x < b -> -1, printfn "%d is less than %d" x b | x when x = b -> 0, printfn "%d is equal to %d" x b | x when x > b -> 1, printfn "%d is greater than %d" x b | x -> 0, printf "default condition (not reached)" fst r</lang>
Groovy
Relational Operators
<lang groovy>def comparison = { a, b ->
println "a ? b = ${a} ? ${b} = a ${a < b ? '<' : a > b ? '>' : a == b ? '==' : '?'} b"
}</lang>
Program: <lang groovy>comparison(2000,3) comparison(2000,300000) comparison(2000,2000)</lang>
Output:
a ? b = 2000 ? 3 = a > b a ? b = 2000 ? 300000 = a < b a ? b = 2000 ? 2000 = a == b
"Spaceship" (compareTo) Operator
Using spaceship operator and a lookup table: <lang groovy>def comparison = { a, b ->
def rels = [ (-1) : '<', 0 : '==', 1 : '>' ] println "a ? b = ${a} ? ${b} = a ${rels[a <=> b]} b"
}</lang>
Program: <lang groovy>comparison(2000,3) comparison(2000,300000) comparison(2000,2000)</lang>
Output:
a ? b = 2000 ? 3 = a > b a ? b = 2000 ? 300000 = a < b a ? b = 2000 ? 2000 = a == b
Haskell
<lang haskell>myCompare a b
| a < b = "A is less than B" | a > b = "A is greater than B" | a == b = "A equals B"
main = do
a' <- getLine b' <- getLine let { a :: Integer; a = read a' } let { b :: Integer; b = read b' } putStrLn $ myCompare a b</lang>
However, the more idiomatic and less error-prone way to do it in Haskell would be to use a compare function that returns type Ordering, which is either LT, GT, or EQ: <lang haskell>myCompare a b = case compare a b of
LT -> "A is less than B" GT -> "A is greater than B" EQ -> "A equals B"</lang>
J
Comparison is accomplished by the verb compare
, which provides logical-numeric output.
Text elaborating the output of compare
is provided by cti
:
<lang j>compare=: < , = , >
cti=: dyad define
select =. ;@# English =. ' is less than ';' is equal to ';' is greater than ' x (":@[, (compare select English"_), ":@]) y
)</lang> Examples of use: <lang j> 4 compare 4 0 1 0
4 cti 3
4 is greater than 3</lang>
Java
<lang java>import java.io.*;
public class compInt {
public static void main(String[] args) { try { BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int nbr1 = Integer.parseInt(in.readLine()); int nbr2 = Integer.parseInt(in.readLine());
if(nbr1<nbr2) System.out.println(nbr1 + " is less than " + nbr2);
if(nbr1>nbr2) System.out.println(nbr1 + " is greater than " + nbr2);
if(nbr1==nbr2) System.out.println(nbr1 + " is equal to " + nbr2); } catch(IOException e) { } }
}</lang>
JavaScript
<lang javascript>function compare(a,b) {
if (a==b) print(a + " equals " + b); if (a < b) print(a + " is less than " + b); if (a > b) print(a + " is greater than " + b);
}</lang>
Joy
<lang joy>#!/usr/local/bin/joy.exe DEFINE prompt == "Please enter a number and <Enter>: " putchars; newline == '\n putch; putln == put newline.
stdin # F prompt fgets # S F 10 strtol # A F swap # F A dupd # F A A prompt fgets # S F A A 10 strtol # B F A A popd # B A A dup # B B A A rollup # B A B A [<] [swap put "is less than " putchars putln] [] ifte [=] [swap put "is equal to " putchars putln] [] ifte [>] [swap put "is greater than " putchars putln] [] ifte # B A quit.</lang>
Korn Shell
<lang korn>#!/bin/ksh
- tested with ksh93s+
builtin printf
integer a=0 integer b=0
read a?"Enter value of a: " || { print -u2 "Input of a aborted." ; exit 1 ; } read b?"Enter value of b: " || { print -u2 "Input of b aborted." ; exit 1 ; }
if (( a < b )) ; then
printf "%d is less than %d\n" a b
fi if (( a == b )) ; then
printf "%d is equal to %d\n" a b
fi if (( a > b )) ; then
printf "%d is greater than %d\n" a b
fi
exit 0</lang>
Logo
<lang logo>to compare :a :b
if :a = :b [(print :a [equals] :b)] if :a < :b [(print :a [is less than] :b)] if :a > :b [(print :a [is greater than] :b)]
end</lang> Each infix operator has prefix synonyms (equalp, equal?, lessp, less?, greaterp, greater?), where the 'p' stands for "predicate" as in Lisp.
Lua
<lang lua>print('Enter the first number: ') a = tonumber(io.stdin:read()) print('Enter the second number: ') b = tonumber(io.stdin:read())
if a < b then print(a .. " is less than " .. b) end if a > b then print(a .. " is greater than " .. b) end if a == b then print(a .. " is equal to " .. b) end</lang>
LSE64
<lang lse64>over : 2 pick 2dup : over over
compare : 2dup = then " equals" compare : 2dup < then " is less than" compare : 2dup > then " is more than"
show : compare rot , sp ,t sp , nl</lang>
Mathematica
<lang Mathematica>a=Input["Give me the value for a please!"]; b=Input["Give me the value for b please!"]; If[a==b,Print["a equals b"]] If[a>b,Print["a is bigger than b"]] If[a<b,Print["b is bigger than a"]]</lang>
MAXScript
<lang maxscript>a = getKBValue prompt:"Enter value of a:" b = getKBValue prompt:"Enter value of b:" if a < b then print "a is less then b" else if a > b then print "a is greater then b" else if a == b then print "a is equal to b"</lang>
Metafont
<lang metafont>message "integer 1: "; a1 := scantokens readstring; message "integer 2: "; a2 := scantokens readstring; if a1 < a2:
message decimal a1 & " is less than " & decimal a2
elseif a1 > a2:
message decimal a1 & " is greater than " & decimal a2
elseif a1 = a2:
message decimal a1 & " is equal to " & decimal a2
fi; end</lang>
MMIX
Some simple error checking is included. <lang mmix>// main registers p IS $255 % pointer pp GREG % backup for p A GREG % first int B GREG % second int
// arg registers argc IS $0 argv IS $1
LOC Data_Segment GREG @ ERR BYTE "Wrong number of arguments",#a,0 ILLH BYTE "Argument -> ",0 ILLT BYTE " <- contains an illegal character",#a,0 LT BYTE "A is less than B",#a,0 EQ BYTE "A equals B",#a,0 GT BYTE "A is greater than B",#a,0
LOC #1000 GREG @ // call: p points to the start of a 0-terminated numeric string // leading chars + and - are allowed // reg $72 0 if negative int // reg $73 gen. purpose // return: reg $70 contains integer value readInt XOR $70,$70,$70 % reset result reg: N=0. LDA pp,p % remember &p LDBU $72,p CMP $73,$72,'+' % ignore '+' BZ $73,2F CMP $72,$72,'-' BNZ $72,1F 2H INCL p,1 JMP 1F % repeat 3H CMP $73,$71,'0' % if c < '0' or c > '9' BN $73,4F % then print err and halt program CMP $73,$71,'9' BP $73,4F SUB $71,$71,'0' % 'extract' number MUL $70,$70,10 ADD $70,$70,$71 % N = 10 * N + digit INCL p,1 1H LDBU $71,p % get next digit PBNZ $71,3B % until end of string CMP $72,$72,0 BNZ $72,2F % if marked negative NEG $70,$70 % then make negative 2H GO $127,$127,0 % return (N)
4H LDA p,ILLH TRAP 0,Fputs,StdErr LDA p,pp TRAP 0,Fputs,StdErr LDA p,ILLT TRAP 0,Fputs,StdErr TRAP 0,Halt,0
// entrance of program // e.g. ~> mmix compare2ints A B // Main CMP p,argc,3 % main (argc, argv) { BZ p,1F % if argc == 3 then continue LDA p,ERR % else print wrong number of args TRAP 0,Fputs,StdErr TRAP 0,Halt,0 // get ints A and B 1H LDOU p,argv,8 % fetch addres of first int GO $127,readInt % read int A ADD A,$70,0
LDOU p,argv,16 GO $127,readInt % read int B ADD B,$70,0
// perform comparison CMP A,A,B % case compare A B LDA p,LT BN A,2F % LT: print 'LT' LDA p,EQ BZ A,2F % EQ: print 'EQ' LDA p,GT % _ : print 'GT' 2H TRAP 0,Fputs,StdOut % print result TRAP 0,Halt,0</lang> Example of use:
~/MIX/MMIX/Progs> mmix compare2ints 121 122 A is less than B ~/MIX/MMIX/Progs> mmix compare2ints 121 121 A equals B ~/MIX/MMIX/Progs> mmix compare2ints 121 120 A is greater than B ~/MIX/MMIX/Progs> mmix compare2ints -121 -122 A is greater than B ~/MIX/MMIX/Progs> mmix compare2ints -121 -121 A equals B ~/MIX/MMIX/Progs> mmix compare2ints -121 -120 A is less than B
Modula-3
<lang modula3>MODULE Main;
FROM IO IMPORT Put, GetInt; FROM Fmt IMPORT Int;
VAR a,b: INTEGER;
BEGIN
a := GetInt(); b := GetInt(); IF a < b THEN Put(Int(a) & " is less than " & Int(b) & "\n"); ELSIF a = b THEN Put(Int(a) & " is equal to " & Int(b) & "\n"); ELSIF a > b THEN Put(Int(a) & " is greater than " & Int(b) & "\n"); END;
END Main.</lang>
Oberon-2
<lang oberon2>MODULE Compare;
IMPORT In, Out;
VAR a,b: INTEGER;
BEGIN
In.Int(a); In.Int(b); IF a < b THEN Out.Int(a,0); Out.String(" is less than "); Out.Int(b,0); Out.Ln; ELSIF a = b THEN Out.Int(a,0); Out.String(" is equal to "); Out.Int(b,0); Out.Ln; ELSIF a > b THEN Out.Int(a,0); Out.String(" is greater than "); Out.Int(b,0); Out.Ln; END;
END Compare.</lang>
OCaml
<lang ocaml>let my_compare a b =
if a < b then "A is less than B" else if a > b then "A is greater than B" else if a = b then "A equals B" else "cannot compare NANs"
let () =
let a = read_int () and b = read_int () in print_endline (my_compare a b)</lang>
Octave
<lang octave>printf("Enter a: "); a = scanf("%d", "C"); printf("Enter b: "); b = scanf("%d", "C"); if (a > b)
disp("a greater than b");
elseif (a == b)
disp("a equal to b");
elseif (a < b)
disp("a less than b");
endif</lang>
Oz
<lang oz>functor import
Application(exit) Open(text file)
define
Txt = class from Open.file Open.text end Stdout = {New Open.file init(name:stdout)} Stdin = {New Txt init(name:stdin)}
proc{Print Msg}
{Stdout write(vs:Msg)}
end
fun{GetInt Prompt}
{Print Prompt} {StringToInt {Stdin getS($)}}
end
Int1 = {GetInt "Enter 1st Integer:"} Int2 = {GetInt "Enter 2nd Integer:"}
if(Int1 < Int2) then {Print Int1#" less than "#Int2} end if(Int1 > Int2) then {Print Int1#" greater than "#Int2} end if(Int1 == Int2) then {Print Int1#" equal to "#Int2} end
{Application.exit 0} end</lang>
Pascal
<lang pascal>program compare(input, output)
var
a, b: integer;
begin
if (a < b) then writeln(a, ' is less than ', b); if (a = b) then writeln(a, ' is equal to ', b); if (a > b) then writeln(a, ' is greater than ', b);
end.</lang>
Perl
Separate tests for less than, greater than, and equals
<lang perl>sub test_num {
my $f = shift; my $s = shift; if ($f < $s){ return -1; # returns -1 if $f is less than $s } elsif ($f > $s) { return 1; # returns 1 if $f is greater than $s } elsif ($f == $s) {
- = operator is an assignment
- == operator is a numeric comparison
return 0; # returns 0 $f is equal to $s };
};</lang>
All three tests in one. If $f is less than $s return -1, greater than return 1, equal to return 0
<lang perl>sub test_num {
return $_[0] <=> $_[1];
};</lang> Note: In Perl, $a and $b are (kind of) reserved identifiers for the built-in sort function. It's good style to use more meaningful names, anyway.
Perl 6
<lang perl6>my Int $a = floor $*IN.get; my Int $b = floor $*IN.get;
if $a < $b {
say 'Less';
} elsif $a > $b {
say 'Greater';
} elsif $a == $b {
say 'Equal';
}</lang>
With cmp
:
<lang perl6>say <Less Equal Greater>[($a cmp $b) + 1];</lang>
PHP
<lang php><?php
echo "Enter an integer [int1]: "; fscanf(STDIN, "%d\n", $int1); if(!is_numeric($int1)) {
echo "Invalid input; terminating.\n"; exit(1); // return w/ general error
}
echo "Enter an integer [int2]: "; fscanf(STDIN, "%d\n", $int2); if(!is_numeric($int2)) {
echo "Invalid input; terminating.\n"; exit(1); // return w/ general error
}
// now $int1 and $int2 are numbers. // for simplicity, this does not explicitly examine types
if($int1 < $int2)
echo "int1 < int2\n";
if($int1 == $int2)
echo "int1 = int2\n";
if($int1 > $int2)
echo "int1 > int2\n";
?></lang> Note that this works from the command-line interface only, whereas PHP is usually executed as CGI.
Pike
<lang pike>int main(int argc, array(int) argv){
if(argc != 3){ write("usage: `pike compare-two-ints.pike <x> <y>` where x and y are integers.\n"); return 0; } int a = argv[1]; int b = argv[2];
if(a > b) { write(a + " is greater than " + b + "\n"); } else if (a < b) { write(a + " is less than " + b + "\n"); } else { write(a + " is equal to " + b + "\n"); }
}</lang>
Pop11
<lang pop11>;;; Comparison procedure define compare_integers(x, y); if x > y then
printf('x is greater than y\n');
elseif x < y then
printf('x is less than y\n');
elseif x = y then
printf('x equals y\n');
endif; enddefine;
- Setup token reader
vars itemrep; incharitem(charin) -> itemrep;
- Read numbers and call comparison procedure
compare_integers(itemrep(), itemrep());</lang>
PowerShell
<lang powershell>$a = [int] (Read-Host a) $b = [int] (Read-Host b)
if ($a -lt $b) {
Write-Host $a is less than $b`.
} elseif ($a -eq $b) {
Write-Host $a is equal to $b`.
} elseif ($a -gt $b) {
Write-Host $a is greater than $b`.
}</lang>
Python
<lang Python>#!/usr/bin/env python a = int(raw_input('Enter value of a: ')) b = int(raw_input('Enter value of b: '))
if a < b:
print 'a is less than b'
elif a > b:
print 'a is greater than b'
elif a == b:
print 'a is equal to b'</lang>
(Note: in Python3 raw_input() will become input().).
An alternative implementation could use a Python dictionary to house a small dispatch table to be indexed by the results of the built-in cmp() function. cmp() returns a value suitable for use as a comparison function in a sorting algorithm: -1, 0 or 1 for <, = or > respectively. Thus we could use:
<lang Python>#!/usr/bin/env python import sys try:
a = int(raw_input('Enter value of a: ')) b = int(raw_input('Enter value of b: '))
except (ValueError, EnvironmentError), err:
print sys.stderr, "Erroneous input:", err sys.exit(1)
dispatch = {
-1: 'is less than', 0: 'is equal to', 1: 'is greater than' } print a, dispatch[cmp(a,b)], b</lang>
In this case the use of a dispatch table is silly. However, more generally in Python the use of dispatch dictionaries or tables is often preferable to long chains of elif' clauses in a condition statement. Python's support of classes and functions (including currying, partial function support, and lambda expressions) as first class objects obviates the need for a "case" or "switch" statement.
R
<lang R>print("insert number a") a <- scan(what=numeric(0), nmax=1) print("insert number b") b <- scan(what=numeric(0), nmax=1) if ( a < b ) {
print("a is less than b")
} else if ( a > b ) {
print("a is greater than b")
} else if ( a == b ) { # could be simply else of course...
print("a and b are the same")
}</lang>
REBOL
<lang REBOL> REBOL [ Title: "Comparing Two Integers" Author: oofoe Date: 2009-12-04 URL: http://rosettacode.org/wiki/Comparing_two_integers ]
a: ask "First integer? " b: ask "Second integer? "
relation: [ a < b "less than" a = b "equal to" a > b "greater than" ] print [a "is" case relation b] </lang>
Ruby
Gets is used to get input from the STDIN and 'to_i' is used to convert the string into an integer. This is not explicitly necessary, since strings will be compared correctly too. If two strings are entered they will be considered equal using this method. <lang ruby>a = gets( "enter a value for a: ").to_i b = gets( "enter a value for b: ").to_i
print "a is less than b" if a < b print "a is greater than b" if a > b print "a is equal to b" if a == b</lang>
An alternative method, which is similar to the python version mentioned above (at the time of writing this) is: <lang ruby># Function to make prompts nice and simple to abuse def prompt str
print str, ": " gets.chomp
end
- Get value of a
a = prompt('Enter value of a').to_i
- Get value of b
b = prompt('Enter value of b').to_i
- The dispatch hash uses the <=> operator
- When doing x<=>y:
- -1 means x is less than y
- 0 means x is equal to y
- 1 means x is greater than y
dispatch = {
-1 => "less than", 0 => "equal to", 1 => "greater than"
}
- I hope you can figure this out
puts "#{a} is #{dispatch[a<=>b]} #{b}"</lang>
Scheme
<lang scheme>(define (my-compare a b)
(cond ((< a b) "A is less than B") ((> a b) "A is greater than B") ((= a b) "A equals B")))
(my-compare (read) (read))</lang>
Slate
<lang slate>[ |:a :b |
( a > b ) ifTrue: [ inform: 'a greater than b\n' ]. ( a < b ) ifTrue: [ inform: 'a less than b\n' ]. ( a = b ) ifTrue: [ inform: 'a is equal to b\n' ].
] applyTo: {Integer readFrom: (query: 'Enter a: '). Integer readFrom: (query: 'Enter b: ')}.</lang>
Smalltalk
<lang smalltalk>| a b | 'a = ' display. a := (stdin nextLine asInteger). 'b = ' display. b := (stdin nextLine asInteger). ( a > b ) ifTrue: [ 'a greater than b' displayNl ]. ( a < b ) ifTrue: [ 'a less than b' displayNl ]. ( a = b ) ifTrue: [ 'a is equal to b' displayNl ].</lang>
SNUSP
There are no built-in comparison operators, but you can (destructively) check which of two adjacent cells is most positive. <lang snusp>++++>++++ a b !/?\<?\# a=b
> - \# a>b - < a<b #\?/</lang>
Standard ML
<lang sml>fun compare_integers(a, b) =
if a < b then print "A is less than B\n" if a > b then print "A is greater than B\n" if a = b then print "A equals B\n"
fun test () = let open TextIO val SOME a = Int.fromString (input stdIn) val SOME b = Int.fromString (input stdIn) in compare_integers (a, b) end handle Bind => print "Invalid number entered!\n"</lang>
A more idiomatic and less error-prone way to do it in SML would be to use a compare function that returns type order, which is either LESS, GREATER, or EQUAL: <lang sml>fun myCompare (a, b) = case Int.compare (a, b) of
LESS => "A is less than B" | GREATER => "A is greater than B" | EQUAL => "A equals B"</lang>
Tcl
This is not how one would write this in Tcl, but for the sake of clarity:
<lang tcl>puts "Please enter two numbers:"
gets stdin x gets stdin y
if { $x > $y } { puts "$x is greater than $y" } if { $x < $y } { puts "$x is less than $y" } if { $x == $y } { puts "$x equals $y" }</lang>
Other comparison operators are "<=", ">=" and "!=".
Note that Tcl doesn't really have a notion of a variable "type" - all variables are just strings of bytes and notions like "integer" only ever enter at interpretation time. Thus the above code will work correctly for "5" and "6", but "5" and "5.5" will also be compared correctly. It will not be an error to enter "hello" for one of the numbers ("hello" is greater than any integer). If this is a problem, the type can be expressly cast
<lang tcl>if {int($x) > int($y)} { puts "$x is greater than $y" }</lang>
or otherwise type can be checked with "if { string is integer $x }..."
Note that there is no substitution/evaluation here anywhere: entering "3*5" and "15" will parse "3*5" as a non-numerical string (like "hello") and thus the result will be "3*5 is greater than 15".
A variant that iterates over comparison operators, demonstrated in an interactive tclsh: <lang Tcl>% set i 5;set j 6 % foreach {o s} {< "less than" > "greater than" == equal} {if [list $i $o $j] {puts "$i is $s $j"}} 5 is less than 6 % set j 5 % foreach {o s} {< "less than" > "greater than" == equal} {if [list $i $o $j] {puts "$i is $s $j"}} 5 is equal 5 % set j 4 % foreach {o s} {< "less than" > "greater than" == equal} {if [list $i $o $j] {puts "$i is $s $j"}} 5 is greater than 4</lang>
TI-89 BASIC
<lang ti89b>Local a, b, result Prompt a, b If a < b Then
"<" → result
ElseIf a = b Then
"=" → result
ElseIf a > b Then
">" → result
Else
"???" → result
EndIf Disp string(a) & " " & result & " " & string(b)</lang>
Toka
<lang toka>[ ( a b -- )
2dup < [ ." a is less than b\n" ] ifTrue 2dup > [ ." a is greater than b\n" ] ifTrue = [ ." a is equal to b\n" ] ifTrue
] is compare-integers
1 1 compare-integers 2 1 compare-integers 1 2 compare-integers</lang>
V
<lang v>[compare
[ [>] ['less than' puts] [<] ['greater than' puts] [=] ['is equal' puts] ] when].
|2 3 compare
greater than
|3 2 compare
less than
|2 2 compare
is equal</lang>
Visual Basic .NET
Platform: .NET
<lang vbnet>Sub Main()
Dim a = CInt(Console.ReadLine) Dim b = CInt(Console.ReadLine)
'Using if statements If a < b Then Console.WriteLine("a is less than b") If a = b Then Console.WriteLine("a equals b") If a > b Then Console.WriteLine("a is greater than b")
'Using Case Select Case a Case Is < b Console.WriteLine("a is less than b") Case b Console.WriteLine("a equals b") Case Is > b Console.WriteLine("a is greater than b") End Select
End Sub</lang>
XSLT
Because XSLT uses XML syntax, the less than and greater than operators which would normally be written '<' and '>' must be escaped using character entities, even inside of XPath expressions.
<lang xml><xsl:template name="compare">
<xsl:param name="a" select="1"/> <xsl:param name="b" select="2"/> <fo:block> <xsl:choose> <xsl:when test="$a < $b">a < b</xsl:when> <xsl:when test="$a > $b">a > b</xsl:when> <xsl:when test="$a = $b">a = b</xsl:when> </xsl:choose> </fo:block></lang> </xsl:template>
- Programming Tasks
- Basic Data Operations
- Arithmetic operations
- Ada
- ALGOL 68
- AutoHotkey
- AWK
- BASIC
- Befunge
- Common Lisp
- C
- C++
- C sharp
- Clean
- D
- E
- Factor
- FALSE
- Forth
- Fortran
- F Sharp
- Groovy
- Haskell
- J
- Java
- JavaScript
- Joy
- Korn Shell
- Logo
- Lua
- LSE64
- Mathematica
- MAXScript
- Metafont
- MMIX
- Modula-3
- Oberon-2
- OCaml
- Octave
- Oz
- Pascal
- Perl
- Perl 6
- PHP
- Pike
- Pop11
- PowerShell
- Python
- R
- REBOL
- Ruby
- Scheme
- Slate
- Smalltalk
- SNUSP
- Standard ML
- Tcl
- TI-89 BASIC
- Toka
- V
- Visual Basic .NET
- XSLT