User Input

From Rosetta Code
Revision as of 18:19, 6 January 2009 by rosettacode>Mbishop (Modula-3)
Task
User Input
You are encouraged to solve this task according to the task description, using any language you may know.

In this task, the goal is to input a string and the integer 75000, from the normal user interface.

Text Terminal

Ada

Works with: GCC version 4.1.2

<ada>

  function Get_String return String is
    Line : String (1 .. 1_000);
    Last : Natural;
  begin
    Get_Line (Line, Last);
    return Line (1 .. Last);
  end Get_String;
  function Get_Integer return Integer is
    S : constant String := Get_String;
  begin
    return Integer'Value (S);
    --  may raise exception Constraint_Error if value entered is not a well-formed integer
  end Get_Integer;
</ada>

The functions above may be called as shown below <ada>

  My_String  : String  := Get_String;
  My_Integer : Integer := Get_Integer;

</ada>

ALGOL 68

print("Enter a string: ");
STRING s := read string;
print("Enter a number: ");
INT i := read int;
~

BASIC

Works with: QuickBasic version 4.5
 INPUT "Enter a string: ", s$
 INPUT "Enter a number: ", i%
Works with: FreeBASIC
 dim s as string
 dim i as integer
 
 input "Enter a string: ", s
 input "Enter the integer 75000: ", i

Befunge

This prompts for a string and pushes it to the stack a character at a time (~) until end of input (-1).

<>:v:"Enter a string: "
 ^,_ >~:1+v
     ^    _@

Numeric input is easier, using the & command.

<>:v:"Enter a number: "
 ^,_ & @

C

Works with: gcc
#include <stdio.h>
int main(int argc, char* argv[])
{
        int input;
        if((scanf("%d", &input))==1)
        {
                printf("Read in %d\n", input);
                return 1;
        }
        return 0;
}

C++

Works with: g++
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;

int main()
{
     // while probably all current implementations have int wide enough for 75000, the C++ standard
     // only guarantees this for long int.
     long int integer_input;
     string string_input;
     cout << "Enter an integer:  ";
     cin >> integer_input;
     cout << "Enter a string:  ";
     cin >> string_input;
     return 0;
}

Note: The program as written above only reads the string up to the first whitespace character. To get a complete line into the string, replace

cin >> string_input;

with

readline(cin, string_input);

C#

 using System;
 
 namespace C_Sharp_Console {
 
     class example {
 
         static void Main() {
             string word;
             int num;
             
             Console.Write("Enter an integer: ");
             num = Console.Read();
             Console.Write("Enter a String: ");
             word = Console.ReadLine();
         }
     }
 }

Erlang

{ok, [String]} = io:fread("Enter a string: ","~s").
{ok, [Number]} = io:fread("Enter a number: ","~d").

Alternatively, you could use io:get_line to get a string:

String = io:get_line("Enter a string: ").

Forth

Input a string

: INPUT$ ( n -- addr n )
   PAD SWAP ACCEPT
   PAD SWAP ;

Input a number

The only ANS standard number interpretation word is >NUMBER ( ud str len -- ud str len ), which is meant to be the base factor for more convenient (but non-standard) parsing words.

: INPUT# ( -- u true | false )
  0. 16 INPUT$ DUP >R
  >NUMBER NIP NIP 
  R> <> DUP 0= IF NIP THEN ;
Works with: GNU Forth
: INPUT# ( -- n true | d 1 | false )
   16 INPUT$ SNUMBER? ;
Works with: Win32Forth
: INPUT# ( -- n true | false )
   16 INPUT$ NUMBER? NIP
   DUP 0= IF NIP THEN ;

Note that NUMBER? always leaves a double result on the stack. INPUT# returns a single precision number. If you desire a double precision result, remove the NIP.

Here is an example that puts it all together:

: TEST
  ." Enter your name: " 80 INPUT$ CR
  ." Hello there, " TYPE CR
  ." Enter a number: " INPUT# CR
  IF   ." Your number is " .
  ELSE ." That's not a number!" THEN CR ;

Groovy

word = System.in.readLine()
num = System.in.readLine().toInteger()


Haskell

main = do
    putStr "Enter a string: "
    str <- getLine
    putStr "Enter an integer: "
    num <- readLn :: IO Int 
    putStrLn $ str ++ (show num)

Note: :: IO Int is only there to disambiguate what type we wanted from read. If num were used in a numerical context, its type would have been inferred by the interpreter/compiler.

Java

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class GetInput {
    public static void main(String[] args) throws Exception {
        BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
        int number = Integer.parseInt(sysin.readLine());
        String string = sysin.readLine();
    }
}

or

Works with: Java version 1.5/5.0+
import java.util.Scanner;

Scanner stdin = new Scanner(System.in);
String string = stdin.nextLine();
int number = stdin.nextInt();

Logo literals may be read from a line of input from stdin as either a list or a single word.

make "input readlist   ; in: string 75000
show map "number? :input  ; [false true]

make "input readword   ; in: 75000
show :input + 123       ; 75123 
make "input readword   ; in: string 75000
show :input             ; string 75000

mIRC Scripting Language

alias askmesomething {
  echo -a You answered: $input(What's your name?, e)
}

Modula-3

MODULE Input EXPORTS Main;

IMPORT IO, Fmt;

VAR string: TEXT;
    number: INTEGER;

BEGIN
  IO.Put("Enter a string: ");
  string := IO.GetLine();
  IO.Put("Enter a number: ");
  number := IO.GetInt();
  IO.Put("You entered: " & string & " and " & Fmt.Int(number) & "\n");
END Input.

newLISP

Works with: newLISP version 9.0
(print "Enter an integer: ")
(set 'x (read-line))
(print "Enter a string: ")
(set 'y (read-line))

OCaml

<ocaml>print_string "Enter a string: "; let str = read_line () in

 print_string "Enter an integer: ";
 let num = read_int () in
   Printf.printf "%s%d\n" str num</ocaml>

Pascal

program UserInput(input, output);
var i : Integer;
    s : String;
begin
 write('Enter an integer: ');
 readln(i);
 write('Enter a string: ');
 readln(s)
end.

Perl

Works with: Perl version 5.8.8
#!/usr/bin/perl

my $string = <>; # equivalent to readline(*STDIN)
my $integer = <>;

PHP

Works with: CLI SAPI
#!/usr/bin/php
<?php
$string = fgets(STDIN);
$integer = (int) fgets(STDIN);

Pop11

;;; Setup item reader
lvars itemrep = incharitem(charin);
lvars s, c, j = 0;
;;; read chars up to a newline and put them on the stack
while (charin() ->> c) /= `\n` do j + 1 -> j ; c endwhile;
;;; build the string
consstring(j) -> s;
;;; read the integer
lvars i = itemrep();

PostScript

Works with: PostScript version level-2
%open stdin for reading (and name the channel "kbd"):
/kbd (%stdin) (r) file def
%make ten-char buffer to read string into:
/buf (..........) def
%read string into buffer:
kbd buf readline

At this point there will be two items on the stack: a boolean which is "true" if the read was successful and the string that was read from the kbd (input terminates on a <return>). If the length of the string exceeds the buffer length, an error condition occurs (rangecheck). For the second part, the above could be followed by this:

%if the read was successful, convert the string to integer:
{cvi} if

which will read the conversion operator 'cvi' (convert to integer) and the boolean and execute the former if the latter is true.

PowerShell

$string = Read-Host "Input a string"
$number = Read-Host "Input a number"

Python

Input a string

  string = raw_input("Input a string: ")

In Python 3.0, raw_input will be renamed to input(). The Python 3.0 equivalent would be

  string = input("Input a string: ")

Input a number

While input() gets a string in Python 3.0, in 2.x it is the equivalent of eval(raw_input(...)). Because this runs arbitrary code, and just isn't nice, it is being removed in Python 3.0. raw_input() is being changed to input() because there will be no other kind of input function in Python 3.0.

  number = input("Input a number: ")  # Deprecated, please don't use.

Python 3.0 equivalent:

  number = eval(input("Input a number: ")) # Evil, please don't use.

The preferred way of getting numbers from the user is to take the input as a string, and pass it to any one of the numeric types to create an instance of the appropriate number.

  number = float(raw_input("Input a number: "))

Python 3.0 equivalent:

  number = float(input("Input a number: "))

float may be replaced by any numeric type, such as int, complex, or decimal.Decimal. Each one varies in expected input.

Raven

'Input a string: '   print expect as str
'Input an integer: ' print expect 0 prefer as num

Ruby

Works with: Ruby version 1.8.4
print "Enter a string: "
s = gets
print "Enter an integer: "
i = gets.to_i   # If string entered, will return zero
puts "String  = " + s
puts "Integer = " + i.to_s

Scheme

The read procedure is R5RS standard, inputs a scheme representation so, in order to read a string, one must enter "hello world"

 (define str (read))
 (define num (read))
 (display "String = ") (display str)
 (display "Integer = ") (display num)

Tcl

Like LISP, there is no concept of a "number" in TCL - the only real variable type is a string (whether a string might represent a number is a matter of interpretation of the string in a mathematical expression at some later time). Thus the input is the same for both tasks:

 set str [gets stdin]
 set num [gets stdin]

possibly followed by something like

 if {![string is integer $num]} then { ...do something here...}

Toka

needs readline
." Enter a string: " readline is-data the-string
." Enter a number: " readline >number [ ." Not a number!" drop 0 ] ifFalse is-data the-number
the-string type cr
the-number . cr

UNIX Shell

#!/bin/sh

read STRING
read INTEGER

Works with: Bourne Again SHell
#!/bin/bash

read STRING
read INTEGER

Vedit macro language

Get_Input(1, "Enter a string: ")
#2 = Get_Num("Enter a number: ")

GUI

AppleScript

set input to text returned of (display dialog "Enter text:" default answer "")
set input to text returned of (display dialog "Enter a number:" default answer "") as integer

Java

Library: Swing
import javax.swing.*;

public class GetInputSwing {
    public static void main(String[] args) throws Exception {
        int number = Integer.parseInt(JOptionPane.showInputDialog ("Enter an Integer"));
        String string = JOptionPane.showInputDialog ("Enter a String");
    }
}

Python

Works with: Python version 2.5
Library: Tkinter
 import tkSimpleDialog
 
 number = tkSimpleDialog.askinteger("Integer", "Enter a Number")
 string = tkSimpleDialog.askstring("String", "Enter a String")

Tcl

Library: Tk
 # create entry widget:
 pack [entry .e1]
 # read its content:
 set input [.e get]

Alternatively, the content of the widget can be tied to a variable:

 pack [entry .e1 -textvar input]
 # show the content at any time by
 puts $input

The -validate option can be used to test the contents/edits of the widget at any time against any parameters (including testing string is integer when the user hits <Return> or such)

VBScript

 strUserIn = InputBox("Enter Data")
 Wscript.Echo strUserIn

Vedit macro language

Displays a dialog box with two input fields and default OK button. The values entered are stored in text registers 1 and 2. The value from 2nd field is then converted into numeric value. (Accepts integers or integer expressions.)

Dialog_Input_1(1, "`User Input example`,
                   `??Enter a string `,
                   `??Enter a number `") 
#2 = Num_Eval_Reg(2)