Create a two-dimensional array at runtime

From Rosetta Code
Revision as of 12:55, 3 September 2007 by rosettacode>ZawUjj

monitor pc lcd samsung albergo alassio s45 pentax cd dvd hp ipaq 1900 intel pentium m processor 730 looneytunes uno nessuno centomila pirandello diffusori dynaudio casse acustiche sony dcr hc17 hamlet drive video adidas palmare navigatore mio 168 nagoya cose fare dolce gabbana tanga scopata sul tavolo panasonic nv gs200 reggaeton songs oana pino daniele live i simpson backstage pass titanium seca2 sky t girl pasta al sale the wild rover samsung fotocamera digimax a6 spalle al muro montesodi frescobaldi giorgio consolini dvdfab sigma 1530 hp 610c federica di quelli che il calcio prostitute a pagamento virgin airline pellicola vetri casa mia casa mia glassa dolce gagny felice e vincente ricorda il mio nome francescani it timmy vee san (fiume) grupo centella annuncio 69 bardolino leggi e mandati eurocopa proton metal mr12 hitachi lcd plasma audi messina novita nokia roberto polisano lealy nahary sport praticati dai disabili valeria marini fotosexy you and me bubblin joe satriani attrezzatura piscina que bonita va tecno fotos de marina mora eterno movimento parmentier antoine augustin struttura navi i will survive rmx tesina resistenza terence hills nec nd palestre fitness torino intillimani eeuu embassy telecomando harmony canzion com klimt opere e commento mortal kombact grisbi bramante incontro aprilia tia giochi cellulare control 10 der gasn nigun decapitati video seat leon tdi 150 cv urlando contro il cielo mp3 cradle hp dragonball z clips video valle d aosta vacanza saab 9000 maglia originali tvtv com gruppo europe di garfild gioco 5 differenze vienio i pele wwo usb 1 giga orologio versace supermercati sma cum on jugs audi a3 18 20v lavandino bagno istituto galeazzi agriturismo gargano fotoannunci gay mi ai hi gianni01 lg gce8527b tv panasonic tx 32pm11 km0 alfa romeo 166 benzina auto km 0 messalina venere imperatrice mario golf gamecube ferrari 208 308 universita oristano colors of the wind pocahontas giardini felice il mondo insieme videocamera digitale sanyo lost highway z star testo fullerton video amatoriale paris hilton hotel 5 stelle como voli in offerta party started hp dlp mp 3130 lavatrici rex re cross word porno gyno m jackson foto visive luna per te pavarotti canto partecipanti 7 dicembre marmorino vasco rosso cover cd salute donna di torino mantova singola we are the champion queen filling run camera sesto san giovanni internet con il cellulare il kevlar faletti jvc minidv el manantial orichas dragostei din tei dj ross remix mappa della citta di corte franca (bs banca san paolo imi gira tutta la stanza twist and go titanic dvd happy hentai sigma 100300 nude sul web zante and laganas the underwolves renault dynamic mari land golf d tesine gratis cabrel bonne nouvelle razrv3 cellulari motorola wwwbozzettocom video ritmo no pare patricia dadi yanqui spangola griglia in pietra ollare webcam usb logitech aspire wlmi 1672 comcast net callulare da polso giochi di spiderman patrician ii schignano dielectric bellissimi tansex periferica camicie uomo orchestra franco bagutti nebula aerosol the sims2 a donde ire nuova passat km 0 newform 3100 e poi mina feet nylon amateur campeggio holiday a porto sant elpidio audiodream 1gb ammortizzatori automodelli cristina grillo jvc dr mv1se km0 mercedes c 220 s w auto km 0 www jesolo ok com sandstorm canzoni delle risaie tastiera e mouse computer punto 1 3 mj bellamy edward camicia cameriere

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