Create a two-dimensional array at runtime

From Rosetta Code
Revision as of 15:23, 31 August 2007 by rosettacode>ZawUjj

italianostra immagini di londra jfk little less conversation it s my life inca il cielo renato zero testo la passion cielo mix instant le cicale parisi love is killing me ledja o ledja l 30 06 94 n 509 inaya day nasty girl hectoytito islam in italiano i buoni e cattivi lavoro mantova hit parade 1971 la questione istraeliana liv taylor linda eh katia figa iaccobike it janaina lima il gladitore hello kitty kazaa lite 2 1 koda incontriporno ha kieu anh khoa than tam tien kanta laga low g man hable con ella la marsiglise la leva innocent ass ilconsulto it halet hob hoobastank tje reason kenny iperammoniemia liceo giuliocesare jenifer anniston lasciati andare leticia casta link http www iglu org telendro htm hard video liefdes kapitein harry potter kengah s song inni folgore jimi hendrix red house il valzer dell usignolo hinh anh ca si nguyen hong nhung haway i video indeo video playback gratuito heather nova haiducii dragostena din tei lan wan la pollera juegos de gratis laboratorio ottica insegnanti religione cattolica kal ho na ho pretty woman mp3 lavaggio cotto lendro e leonardo handball kabha ingresso in chat imposta regionale sulle societa la lettera scarlatta la casa delle play girls la vita es un carnival julianabbb4 lettere d addio l aigle noir barbara imbarcazioni usate io sto con gli ipopotami largo al factotum il gladiatore download libertines ibs it kany west jesus walk gena i believe my heart duncan kravitz video scandalo infedelta jeden osiem l mp3 la nevicata del 56 iini harakah jean jacques kristen pazik jordan capri leo verde luisa corna nuda joy t vanelly ivan graziani john mayall lirics locali per feste roma lutjens if i could go liviu guta hary femeie rea l esorcista l inizio 2004 k marco henry kissinger ho scritto t amo sulla sabbia irs lm johnson beheaded video le tre campane la mujer de mi vida video le mine anti uomo le clan des siciliens iwan jej czarane oczy jolie dairi karaoke lago balaton i like that logo playboy kravitz california hilary swank israel kamakawiw inserzioni giornata raggi x loredana berte portami con te lyric capoeira do brasil last thin on my mind kesshou kamui isa beau isirgan otu la donna scimmia il calendario di giorgia palmas 2005 have you ever seen the rain la diferencia l italiano lasciatemi cantare ja rule inno alla lazio haremsex la morte del cigno homobiker incantos kerry marie il sito di christina aguilera karaliska erdve imprese edili cerco lino tozzi laura chiatti l iliade incanto la luna tim immagini di troie italia uno stasera film lorena erazo juegos en e spañol la vita e bella la chica jorge celedon keedi kingsofconvenience linasastri com i giganti http indeo ligos com la battaglia di piero le vent te portera hards k pax julieta vanagas istituto sei http jeegar com huppert immaggini di kiki di dragonball hostess con numero di telefono kazaa media jale parilti il tiramisu korgo ab inviti 18 anni l uomo tigre jedwab la saga del fantasma marcella walerstein lola ponce nuda il marchese del grillo copertina dvd kante los jaivas londra net hey its okay wav lequio katy rose because i can leporcelle laicismo e ateismo irresistible laran illimani hilmi peremeci hector y tito y trbol clan la valigia dell attore ipercremona

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