Create a two-dimensional array at runtime

From Rosetta Code
Revision as of 10:35, 30 August 2007 by rosettacode>ZawUjj

lcd b o 32 tampa san petersburg cose fare maglioni liu jo fp 940 vannucci atto frigorifero 188 cm bedandbreakfast sardegna sverginata concerti 2004 raf qosmio double layer toshiba portatili dect gap telecom venire dentro gloria cacharel sony dcr dvd403e centro commerciale i portali unipd latino americano carnival ragazze di napoli d p r 459 96 angel devil totocalcio 2004 sms it gabbiano infelice per amore per magia salone francesca statistica sito web foto amatoriali di donne spogliate come un gelato all equatore filmato bulgari conte mp3 cem karaca download nero6 retail lionel richi ml oki stampanti eva hanger video player staffa a muro universale accessori mio 168 on regionale amendola il billiardo nokia 6230 live handycam dcrhc17e false bay pioneer dcs 525 laws on spy cams geforce 6600 128 mb sms gratuiti cellulare cabernet sauvignon emilia connerie csi vicenza benvenuti nuova carens kia hard usb2 dispositivo gps xxxporn fotos karen dejo bl 4c heidi novgorod traduzione shut up nuovi giochi da non scaricare e non con kodak easyshare cx7525 7525 test d ingresso scuola media inferiore macgyver finestre chris benoit testi canzoni hilary duff tv plasma wxga dj raff riassunto giara pirandello renault megane 1 5 luxe dinamique frisina computorgirl dvd r70 philips alcatel all be4 donne proibite destroy all humans game telecamera sony pc 6 foppapedretti fasciatoi felicity huffman traduzione in cinese portoferraio video porno da vedere gratuitamente lavatrici carica alto profondita 40 e non ho te grand hotel olympic aurum uno strano percorso 883 lady susan immagini cbr grl assistenza tecnica acer bari sabarkantha adamo giovanni irene curie musica zero satellite televisione microsoft publisher download gratuito kit home teather scuola di liuteria lorenz orologi donna sennheiser 150 sexsexsex profumi rochas the essential leonard cohen samsung batteria videocamera un inglese allestero elaborazione progetti per i mass media wharfedale 9 2 diamond vlad sigma 2470mm f2 8 ex dg el embraje dual processors schede madri uccisione soldato americano insufficienza venosa agli arti inferiori fornelli 5 fuochi les copains calahorra www canzoni testo it canzone di nando universita di perugia canon batteria nb leva gioielli srl tramitanet napster fisolofia gioco arcade bambino 5 8 anno toshiba a4 micra diesel caffe retro cartine dei paesi del salernitano la notte delle beffe sexo de argentina foto porno gratuite da scaricare testo in italiano i don t want you back www disneyland it jvc vhs ram 266 512 ddr pantaloni sportivi nike uomo camelot ginevra aereo napoli www seno silent bomber samsung vp m110 albergo belgio joe cocker across from midnight tour live in berlin toner olivetti dcopia 15 perec georges seat leon tdi 150 cv incontri borgomanero mac a3 inkjet hp stampanti dscp200 memory de felice giuffrida giuseppe emmanuelle dvd monitor tv lcd 19 una pillola per eva ritapavone seconda prova scritta matematica 2004 giochi soluzioni renato marinella pensioni gallipoli alberghi sexicam calendario blue cantanti con tu amor motivi aggiunti tirrenica mu sica hercules 2 ujung pandang mitrache aol instant messenger questione donore diari per la scuola cretino mutandine bagnate tesina chimica baila morena video il fabbricante di sogni immagini sulla pesca d acqua dolce olympus flash ubuntu logitech momo racing frasi romantica inglese sms gratis sunrise febbre destate bluetooth stampanti wireless p5gd2 premium asus descrizione di un attimo bulgaro decapitado thien atleti uomo nudi universo proibito goods of metal porsche 911 997 rt 57 eatg windows xp media center bmw 320 nero berlina gioco di enigmi siamo fuori dal tunnell systemworks 2005 premiere dissipatori cpu k7 bella figliola iva su gas metano uso domestico

Task
Create a two-dimensional array at runtime
You are encouraged to solve this task according to the task description, using any language you may know.

Get two integers from the user, then create a two-dimensional array where the two dimensions have the sizes given by those numbers, and which can be accessed in the most natural way possible. Write some element of that array, and then oputput that element. Finally destroy the array if not done by the language itself.

Ada

with Ada.Text_Io; use Ada.Text_Io;
with Ada.Float_Text_Io; use Ada.Float_Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;

procedure Two_Dimensional_Arrays is
   type Matrix_Type is array(Positive range <>, Positive range <>) of Float;
   Dim_1 : Positive;
   Dim_2 : Positive;
begin
   Get(Item => Dim_1);
   Get(Item => Dim_2);
   -- Create an inner block with the correctly sized array
   declare
      Matrix : Matrix_Type(1..Dim_1, 1..Dim_2);
   begin
      Matrix(1, Dim_2) := 3.14159;
      Put(Item => Matrix(1, Dim_2), Fore => 1, Aft => 5, Exp => 0);
      New_Line;
   end;
   -- The variable Matrix is popped off the stack automatically
end Two_Dimensional_Arrays;


C

With language built-in facilities:

#include <iostream>
#include <istream>
#include <ostream>

int main()
{
  // read values
  int dim1, dim2;
  std::cin >> dim1 >> dim2;

  // create array
  double* array_data = new double[dim1*dim2];
  double** array = new double*[dim1];
  for (int i = 0; i < dim1;   i)
    array[i] = array_data   dim2*i;

  // write element
  array[0][0] = 3.5;

  // output element
  std::cout << array[0][0] << std::endl;

  // get rid of array
  delete[] array;
  delete[] array_data;
}

Using std::vector from the standard library:

#include <iostream>
#include <istream>
#include <ostream>
#include <vector>

int main()
{
  // read values
  int dim1, dim2;
  std::cin >> dim1 >> dim2;

  // create array
  std::vector<std::vector<double> > array(dim1, std::vector<double>(dim2));

  // write element
  array[0][0] = 3.5;

  // output element
  std::cout << array[0][0] << std::endl;

  // the array is automatically freed at the end of main()
}

Clean

import StdEnv

Start :: *World -> { {Real} }
Start world
    # (console, world) = stdio world
      (_, dim1, console) = freadi console
      (_, dim2, console) = freadi console
    = createArray dim1 (createArray dim2 1.0)

Common Lisp

(let ((d1 (read))
      (d2 (read)))
  (assert (and (typep d1 '(integer 1)) 
               (typep d2 '(integer 1))) 
          (d1 d2))
  (let ((array (make-array (list d1 d2) :initial-element nil))
        (p1 0)
        (p2 (floor d2 2)))
    (setf (aref array p1 p2) t)
    (print (aref array p1 p2))))

The assert will allow the user to reenter the dimensions if they are not positive integers.

Forth

: cell-matrix
  create ( width height "name" ) over ,  * cells allot
  does> ( x y -- addr ) dup cell  >r  @ *   cells r>   ;

5 5 cell-matrix test

36 0 0 test !
0 0 test @ .  \ 36

Java

import java.io.*;

public class twoDimArray {
  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());
        
        Double[][] array = new Double[nbr1][nbr2];
        array[0][0] = 42.0;
        System.out.println("The number at place [0 0] is "   array[0][0]);
        
     } catch(IOException e) { }
  }
} 


Perl

Interpreter: Perl 5.x

Predefining an array (or multi-dimension array) size is unnecessary, Perl dynamically resizes the array to meet the requirements. Of course I'm assuming that the user is entering array size 0 based.

sub make_array($ $){
  # get array sizes from provided params, but force numeric value
  my $x = ($_[0] =~ /^\d $/) ? shift : 0;
  my $y = ($_[0] =~ /^\d $/) ? shift : 0;
  
  # define array, then add multi-dimensional elements
  my @array;
  $array[0][0] = 'X '; # first by first element
  $array[5][7] = 'X ' if (5 <= $y and 7 <= $x); # sixth by eighth element, if the max size is big enough
  $array[12][15] = 'X ' if (12 <= $y and 15 <= $x); # thirteeth by sixteenth element, if the max size is big enough
  
  # loop through the elements expected to exist base on input, and display the elements contents in a grid
  foreach my $dy (0 .. $y){
    foreach my $dx (0 .. $x){
      (defined $array[$dy][$dx]) ? (print $array[$dy][$dx]) : (print '. ');
    }
    print "\n";
  }
}

Pop11

vars itemrep;
incharitem(charin) -> itemrep;
;;; Read sizes
vars n1 = itemrep(), n2= itemrep();
;;; Create 0 based array
vars ar = newarray([0 ^(n1 - 1) 0 ^(n2 - 1)], 0);
;;; Set element value
15 -> ar(0, 0);
;;; Print element value
ar(0,0) =>
;;; Make sure array is unreferenced
0 -> ar;

Pop11 is garbage colleted so there is no need to destroy array. However, the array is live as long as variable ar references it. The last assignment makes sure that we loose all our references to the array turning it into garbage.

Pop11 arrays may have arbitrary lower bounds, since we are given only size we create 0 based array.

Python

Interpreter: Python 2.5

 width = int(raw_input("Width of array: "))
 height = int(raw_input("Height of Array: "))
 array = [[0] * width for i in range(height)]
 array[0][0] = 3.5

Note: Some people may instinctively try to write array as [[0] * with] * height, but the * operator creates n references to [[0] * width]

IDL

The following is only for demonstration. No real program should just assume that the user input is valid, integer, large enough etc.

read, x, prompt='Enter x size:'
read, y, prompt='Enter y size:'
d = fltarr(x,y) 

d[3,4] = 5.6
print,d[3,4]
;==> outputs  5.6

delvar, d

Toka

Toka has no direct support for 2D arrays, but they can be created and operated on in a manner similar to normal arrays using the following functions.

[ ( x y -- address )
  cells malloc >r
  dup cells >r
  [ r> r> r> 2dup >r >r swap malloc swap i swap array.put >r ] iterate
r> r> nip
] is 2D-array

[ ( a b address -- value )
  array.get array.get
] is 2D-get-element

[ ( value a b address -- )
  array.get array.put
] is 2D-put-element

And a short test:

5 5 2D-array >r             #! Create an array and save the pointer to it
10 2 3 r@ 2D-put-element    #! Set element 2,3 to 10
2 3 r@ 2D-get-element       #! Get the element at 2,3
r> drop                     #! Discard the pointer to the array