Create a two-dimensional array at runtime: Difference between revisions
(add Common Lisp example) |
No edit summary |
||
Line 98: | Line 98: | ||
The <code>[http://www.lispworks.com/documentation/HyperSpec/Body/m_assert.htm assert]</code> will allow the user to reenter the dimensions if they are not positive integers. |
The <code>[http://www.lispworks.com/documentation/HyperSpec/Body/m_assert.htm assert]</code> will allow the user to reenter the dimensions if they are not positive integers. |
||
==[[Perl]]== |
|||
[[Category:Perl]] |
|||
'''Interpreter:''' [[Perl]] 5.x |
|||
Predefining an array (or multi-dimension array) size is unnecessary, Perl dynamically resizes the array to meet the requirements. Hence you can see here that I define the array, then add multi-dimensional elements. After, I loop through all of the elements which are expected to exist based on the input, and display X for the defined elements and O for the non-defined. 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; |
|||
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 |
|||
foreach my $dy (0 .. $y){ |
|||
foreach my $dx (0 .. $x){ |
|||
(defined $array[$dy][$dx]) ? (print $array[$dy][$dx] . ' ') : (print 'O '); |
|||
} |
|||
print "\n"; |
|||
} |
|||
} |
|||
==[[Python]]== |
==[[Python]]== |
Revision as of 17:13, 28 March 2007
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() }
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.
Perl
Interpreter: Perl 5.x
Predefining an array (or multi-dimension array) size is unnecessary, Perl dynamically resizes the array to meet the requirements. Hence you can see here that I define the array, then add multi-dimensional elements. After, I loop through all of the elements which are expected to exist based on the input, and display X for the defined elements and O for the non-defined. 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; 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 foreach my $dy (0 .. $y){ foreach my $dx (0 .. $x){ (defined $array[$dy][$dx]) ? (print $array[$dy][$dx] . ' ') : (print 'O '); } print "\n"; } }
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