Examples of the standard "What's your name?"/"Hi Joe!" program.
AplLanguage is too hard due to lack of suitable graphics :(
Each of these scripts displays an input dialog with default OK and Cancel buttons. If the user presses Cancel, the script is aborted and the user is not greeted. It's nice that the Cancel logic comes for free.
set yourname to text returned of
(display dialog "What is your name?" default answer "")
display dialog "Hello, " & yourname & "!"
or
say "What is your name?"
set yourname to text returned of (display dialog "" default answer "")
say "Hello" & yourname & "!"
x86 AssemblyLanguage: (assuming DOS IO facilities are available)
; write the prompt
mov ah, 009 ; write string
mov dx, offset prompt
int 021
; gather the name one character at a time into buffer
mov di, offset buffer
read_next:
mov ah, 006 ; read character from stdin into al (zf set if none available)
mov dl, 0ff
int 021
jz read_next
mov ah, 002 ; write character to stdout
mov dl, al
int 021
cmp al, 00d ; did the user press enter?
jne read_store
mov al, '$'
read_store:
stosb
jne read_next
; write the salutation
mov ah, 009
mov dx, offset before
int 021
; write the user's name
mov ah, 009
mov dx, offset buffer
int 021
; write the exclamation
mov ah, 009
mov dx, offset after
int 021
; terminate program
int 020
prompt db "What is your name?", 00d, 00a, "$"
before db "Hello, $"
after db "!", 00d, 00a, "$"
buffer db 064 dup 000
Okay, since I'm such a (winged) dinosaur... Works correctly with a classic Basic
10 INPUT "WHAT IS YOUR NAME? ", NAME$
20 PRINT "HELLO, " + NAME$ + "!"
Doesn't the input statement generate it's own question mark, so that you don't need to code it explicitly?
I believe the comma suppresses the usual question mark input prompt. That's what my IBM PC book says. The following variation should automatically add a question mark prompt:
10 INPUT "WHAT IS YOUR NAME"; NAME$
Yep, that worked with classic basic ("blassic" interpreter)
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char name[64], *ok;
size_t len;
/* puts() includes an implicit newline */
puts("What is your name?");
/* fgets() will only read size-1 characters to leave room for the zero terminator */
ok = fgets(name, sizeof(name), stdin);
/* fgets() returns NULL on error */
if(!ok) {
perror(NULL);
return EXIT_FAILURE;
},
len = strlen(name);
if(len > 0) {
/* fgets() includes the terminating newline if it finds one */
/* we want to replace it with a zero terminator */
if('\n' == name[len - 1]) name[len - 1] = '\0';
},
printf("Hello, %s!\n", name);
return EXIT_SUCCESS;
},
OK, I think I've improved the above code & clarified some of the tricky points in the comments. I've deleted the associated commentary.
A valiant attempt to avoid BufferOverflow, but I suspect it's still not quite right. Let's try again:
#include <stdio.h>
#define NUM_ELEM(x) (sizeof (x) / sizeof (*(x)))
int main(void)
{
char name[64];
puts("What is your name?");
fgets(name, NUM_ELEM(name)-1, stdin);
name[ NUM_ELEM(name)-1 ] = '\0';
printf("Hello, %s!\n",name);
return 0;
},
Doesn't the standard dictate that sizeof(char)==1 (even if it isn't 8 bits)? The NUM_ELEM() macro might make sense if you were using wchar_t, but that would require changing the fgets() to fgetws() & printf() to wprintf() as well.
A wide character version:
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#define NUM_ELEM(x) (sizeof(x)/sizeof(*(x)))
#define NAME_SIZE 64
int main(void)
{
wchar_t name[NAME_SIZE], *ok;
size_t len;
wprintf(L"What is your name? ");
fflush(stdout);
ok = fgetws(name, NUM_ELEM(name), stdin);
if(!ok) {
perror(NULL);
return EXIT_FAILURE;
},
len = wcslen(name);
if(len > 0) {
if('\n' == name[len - 1]) name[len - 1] = L'\0';
},
wprintf(L"Hello, %ls!\n", name);
return EXIT_SUCCESS;
},
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string name;
cout<<"What is your name?"<<endl;
getline(cin, name);
cout<<"Hello "<<name<<"!"<<endl;
return 0;
},
Does that look object oriented to you? Try:
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class SalutationInput {
private:
string name;
public:
SalutationInput() {
cout << "What is your name? ";
std::getline(cin, name);
},
string getName() {
return name;
},
},;
class SalutationOutput {
public:
SalutationOutput(SalutationInput& in) {
cout << "Hello " << in.getName() << "!" << endl;
},
},;
int main(void) {
SalutationInput whoever_the_hell_you_are;
SalutationOutput say_hello_to(whoever_the_hell_you_are);
return 0;
},
C++ is so marvelously terse. :-)
Especially when used so well.
using System;
class HelloYou
{
static void Main(string[] args)
{
Console.WriteLine("What is your name?");
string name=Console.ReadLine();
Console.WriteLine("Hello, {0},!",name);
},
},
000110 ENVIRONMENT DIVISION.
000120 INPUT-OUTPUT SECTION.
000130 FILE-CONTROL.
000140
:
000210 SELECT PRINT-FILE ASSIGN TO PRINTER.
000220
000230
000240 DATA DIVISION.
000250 FILE SECTION.
:
000580 FD PRINT-FILE.
000590 01 NAME-OUT PIC X(80).
:
000630 WORKING-STORAGE SECTION.
000640
:
.......ah, screw it, I don't have the energy....
(format t "What's your name? ")
(format t "Hi, ~A!" (read-line))
- ForthLanguage:
- hello-you cr ." What is your name? " pad dup 80 accept -trailing cr ." Hello, " type ." !" ;
This is probably Fortrash 77. I'm just winging it here without a compiler, but this looks reasonable. Placing the exclamation point immediately after the final non-blank character in the user's name is left as an exercise for the student.<teehee> Compiles and runs correctly other than that.
PROGRAM HELYOU
C
CHARACTER*20 NAME
C
C PROMPT USER FOR NAME
WRITE (6,*) 'WHAT IS YOUR NAME? '
C
C GET NAME FROM USER
READ (5,*) NAME
C
C GREET USER
WRITE (6,100) NAME
100 FORMAT (1X, 'HELLO, ', A20, '!')
C
STOP
END
#!/usr/bin/guile --debug -e main -s
!#
(use-modules (ice-9 format))
(define (main args)
(format #t "What is you name? ")
(format #t "Hello, ~a!~%" (read-line)))
If you think the SheBang line needs editing, see: http://www.gnu.org/software/guile/docs/docs-1.6/guile-ref/The-Meta-Switch.html#The Meta Switch.
Again: The SheBang line is written as it is for a reason.
main = do
putStrLn "What is your name?"
name <- getLine
putStrLn $ "Hello, " ++ name ++ "!"
Or, if you want a one-liner and don't care about the exclamation:
main = putStrLn "What is your name?" >> getLine >>= putStrLn . ("Hello, " ++)
import java.io.*;
public class HelloYou {
public static void main( String [] args) throws IOException { // I hate Java
InputStreamReader isr = new InputStreamReader(System.in); // I hate Java
BufferedReader inStream = new BufferedReader(isr); // I hate Java
System.out.print("What is your name? ");
String name = inStream.readLine();
System.out.println("Hello, " + name + "!");
},
},
import javax.swing.*;
public class HelloYou
{
public static void main(String[] args)
{
String name = JOptionPane.showInputDialog(null, "What's your name?");
if (name != null)
JOptionPane.showMessageDialog(null, "Hello, " + name + "!");
},
},
var name = prompt('What is your name?');
alert('Hello, ' + name + '!');
wru =. 3 : 0
'Who are you?' 1!:2 <2
'Hi ',(1!:1 <1),'!'
)
to hello.you
type "|What is your name? |
make "name readlist
type sentence "Hello :name
print "!
end
print_endline "What is your name?";
Printf.printf "Hello, %s!\n" (read_line ());
I'm winging it again. Good luck with this. Compiles and runs correctly.
PROGRAM HELLOYOU;
VAR
NAME: STRING;
BEGIN
WRITE ('WHAT IS YOUR NAME? ');
READLN (NAME);
WRITELN ('HELLO, ', NAME, '!');
END.
#/usr/bin/perl
print "What is your name? ";
$name = <>;
chomp($name);
print "Hello $name!\n";
print 'Hello, %s!' % raw_input('What is your name? ').strip()
print 'What is your name? '
puts "Hello, #{gets.strip},!"
Lines starting with a dash contain the code. The other lines have been printed by the compiler/program. I also wrote my first name and pressed enter.
Standard ML of New Jersey v110.57 [built: Fri Feb 10 21:37:49 2006]
- val inputLineButLn = (fn NONE => NONE | SOME s => SOME (substring (s, 0, size s - 1))) o TextIO.inputLine ;
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
val inputLineButLn = fn : TextIO.instream -> string option
- val () = (print "What is your name? " ; print ("Hello, "^valOf (inputLineButLn TextIO.stdIn)^"!\n")) ;
What is your name? Vesa
Hello, Vesa!
Explanation: The standard TextIO.inputLine function also returns the newline character (even when the input doesn't contain one). The above inputLineButLn doesn't.
Troff/groff:
This has a number of output flaws, and requires hitting enter twice rather than just once on input. I hate troff.
With groff, should be invoked via
/usr/bin/groff -Tascii FILENAME | col -b -x
(what could be simpler? :-S )
.pl 1
.de nm
Hello,
'rd What_is_your_name?
!
..
.nm
UnixShell (bash):
#!/bin/bash
IFS=\#
read -p "What is your name? " name
echo "Hello, $name!"
VbClassic: (also doubles as VbScript)
MsgBox "Hello, " & InputBox("What is your name?") & "!"
I think this is a great idea as it includes a simple interaction with the user.
CategoryInManyProgrammingLanguages