Today's post is about Arrays and Indexers in Zonnon. Here below you will find a very easy to follow program, that demonstrate arrays and indexer, by implementing some simple tasks that will make you grasp the idea of those 2 features real quick. The main goal of this post, is not really teaching arrays because, come on, you probably already know "all" about them, in fact, it is more to show you how you do that in Zonnon, in this case, compared to all other 22 languages on future posts, which essentially, is the real aim behind this blog.
By the way, if you missed my most recent post, "New Series - Arrays and Indexers", check it out. It has more details about the following program, and a bunch of definitions for the concepts used on this, and the following, posts. Or you can check my previous posts about arrays in C# and Oxygene just to compare.
I encourage you to copy the code below and try it yourself, normally, all programs you find in this blog are source code complete, just paste it on Zonnon Builder and run it.
Last thing. There is room for improvement of the code, using generics is one example, but Generics, Collections, lambdas, etc. will have their own "series" of posts.
(***************************************** String Utilities Module *****************************************) module Str; type {private} MArrayOfChar = array {math} * of char; type {private} ArrayOfChar = array * of char; type {private} ArrayOfString = array * of string; procedure {public} CountWords(s: array * of char; sep: char): integer; var i,slen,wlen,c: integer; begin slen := len(s)-1; c := 0; for i := 0 to slen do wlen := 0; while (i < slen) & (s[i] # sep) do inc(wlen); inc(i); end; if (i <= slen) & (wlen > 0) then inc(c) end; end; return c; end CountWords; procedure {public} Split(s: string; sep: char) : array * of string; var i,j,k,slen,wlen,pos: integer; l: array * of char; a: array * of string; begin l := new ArrayOfChar(len(s)+1); copy(s, l); slen := len(l)-1; a := new ArrayOfString(CountWords(l,sep)); pos := 0; k := 0; for i := 0 to slen do wlen := 0; while (i < slen) & (l[i] # sep) do inc(wlen); inc(i); end; if (i <= slen) & (wlen > 0) then if (i <= slen) then a[k] := s.Substring(pos,wlen); inc(k) end; for j := 0 to wlen do inc(pos) end; end; end; return a; end Split; procedure {public} Join(c: char; arr: array {math} * of char): string; var i: integer; s: string; begin s := ""; for i := 0 to len(arr) - 1 do s := s + string(arr[i]) + string(c); end; if len(s) == 0 then return s end; return s.Substring(0,s.LastIndexOf(c)); end Join; end Str. (***************************************** Alphabet Object *****************************************) object {ref} Alphabet(asize: integer; astr: string; achar: array * of char) implements []; import Str; type {private} ArrayOfChar = array * of char; type {private} ArrayOfString = array * of string; (* Array Field *) var {private} letters: array {math} * of char; (* Indexer Get/Set Property *) procedure {public} Get(i: integer): char implements [].Get; begin return self.letters[i]; end Get; procedure {public} Set(i: integer; c: char) implements [].Set; var s: string; begin s := string(c); if ~(s = s.ToUpper()) then s := s.ToUpper(); c := s[0] end; self.letters[i] := c; end Set; (* No Property, Getter instead *) procedure {public} GetLength: integer; begin return len(self.letters); end GetLength; (* Override Method *) procedure {public} ToString: string implements System.Object.ToString; begin return Str.Join(char(','), self.letters); end ToString; (* Method *) procedure {public} Slice(start: integer; length: integer) : array * of char; var l: integer; a: array * of char; begin a := new ArrayOfChar(len(self.letters)); a := self.letters[start..length-1]; return a; end Slice; (* No Overloaded Constructors Support in v 1.3.0 *) (* Contructor | Initializer *) begin if asize # 0 then self.letters := new ArrayOfChar(asize); elsif astr # nil then self.letters := new ArrayOfChar(len(astr)); copy(astr.ToUpper(),self.letters); elsif achar # nil then self.letters := achar; else self.letters := new ArrayOfChar(0); end; end Alphabet. (***************************************** Program Module *****************************************) module Main; import System.Random as Random, Str, Alphabet; type {private} ArrayOfChar = array * of char; type {private} ArrayOfString = array * of string; type {private} ArrayMatrix = array {math} *,* of integer; type {private} JaggedArrayOfString = array * of array * of string; procedure ReverseChar(var arr: array * of char) : array * of char; var reversed: array * of char; i,j: integer; begin i := 0; reversed := new ArrayOfChar(len(arr)); for j := len(arr,0)-1 to 0 by -1 do reversed[i] := arr[j]; inc(i); end; return reversed; end ReverseChar; procedure BubbleSortInt(var arr: array {math} * of integer) : array {math} * of integer; var i, j, swap: integer; begin swap := 0; for i := len(arr) - 1 to 1 by -1 do for j := 0 to i - 1 do if arr[j] > arr[j + 1] then swap := arr[j]; arr[j] := arr[j + 1]; arr[j + 1] := swap; end; end; end; return arr; end BubbleSortInt; procedure BubbleSortString(var arr: array * of string) : array * of string; var i, j: integer; swap: string; begin swap := ""; for i := len(arr) - 1 to 1 by -1 do for j := 0 to i - 1 do if arr[j,0] > arr[j + 1,0] then swap := arr[j]; arr[j] := arr[j + 1]; arr[j + 1] := swap; end; end; end; return arr; end BubbleSortString; procedure TransposeMatrix(m: array {math} *,* of integer) : array {math} *,* of integer; var i, j: integer; transposed: array {math} *,* of integer; begin (* Transposing a Matrix 2,3 * * A = [6 4 24]T [ 6 1] * [1 -9 8] [ 4 -9] * [24 8] *) transposed := new ArrayMatrix(len(m, 1), len(m, 0)); for i := 0 to len(m,0) - 1 do for j := 0 to len(m,1) - 1 do transposed[j, i] := m[i, j]; end; end; return transposed; end TransposeMatrix; procedure UpperCaseRandomArray(arr: array * of array * of string); var r: Random; i,j: integer; s: string; begin r := new Random; i := r.Next(0, len(arr) - 1); for j := 0 to len(arr[i]) - 1 do s := arr[i,j]; arr[i,j] := s.ToUpper(); end; end UpperCaseRandomArray; procedure PrintArrayChar(var arr: array * of char); begin writeln("Print Array Content Char[":0,string(len(arr)):0,"]":0); for i := 0 to len(arr, 0) - 1 do writeln(" array [",i:2,"] = ",arr[i]:2," "); end; writeln; end PrintArrayChar; procedure PrintArrayInt(var arr: array {math} * of integer); begin writeln("Print Array Content Int32[":0, string(len(arr)):0, "]":0); for i := 0 to len(arr, 0) - 1 do writeln(" array [",i:2,"] = ",arr[i]:2," "); end; writeln; end PrintArrayInt; procedure PrintArrayString(var arr: array * of string); begin writeln("Print Array Content String[":0, string(len(arr)):0, "]":0); for i := 0 to len(arr, 0) - 1 do writeln(" array [",i:2,"] = ",arr[i]:2," "); end; writeln; end PrintArrayString; procedure PrintMatrix(m: array {math} *,* of integer); var i,j: integer; begin writeln("Print Matrix Content Int32[":0, string(len(m,0)):0, ",":0, string(len(m,1)):0, "]":0); for i := 0 to len(m,0) - 1 do for j := 0 to len(m,1) - 1 do writeln(" array [":0,i:2,j:2,"] = ",m[i, j]:2," ":0); end; end; writeln; end PrintMatrix; procedure GraphJaggedArray(arr: array * of array * of string); var lineCount: integer; i,j: integer; begin writeln; writeln("Print Text Content String[][]":0); lineCount := 1; for i := 0 to len(arr) - 1 do write("Line":0,lineCount:2,"|":0); for j := 0 to len(arr[i]) - 1 do write("*":3); end; writeln(" (":0,string(len(arr[i])):0,")":0); inc(lineCount); end; writeln; end GraphJaggedArray; procedure PrintJaggedArray(arr: array * of array * of string); var i,j: integer; line: string; linearr: array * of string; begin writeln; writeln("Print Jagged Array Content String[][]":0); for i := 0 to len(arr) - 1 do line := ""; for j := 0 to len(arr[i]) - 1 do line := line + " " + arr[i,j]; end; if line = line.ToUpper() then line := line + " <-- [UPPERCASED]"; end; writeln(line:0); end; end PrintJaggedArray; procedure PrintCommonArrayExceptions(arr: array * of array * of string); (* "Extra information about the exception can be accessed by calling the predefined function 'reason'. This causes the runtime system to return a string which explains the reason for the exception." Not working in Zonnon version 1.3.0 var s: string; do ... on exception do s := reason; <- This gives a "reason not declared" error at compile time. end; *) begin do arr[100,100] := 'hola'; on NilReference do writeln; writeln("Exception: NilReference":0); on OutOfRange do writeln; writeln("Exception: OutOfRange":0); on exception do writeln; writeln("Exception: Other":0); on termination do (* nothing *) end; writeln; end PrintCommonArrayExceptions; procedure PrintTitle(message: string); begin writeln('======================================================':0); writeln(message:0); writeln('======================================================':0); writeln; end PrintTitle; var (*writeln(pos,wlen,Substring(s,pos,wlen),s.Substring(pos,wlen));*) i: integer; (* Declare Array of Chars *) letters: array 5 of char; inverse_letters: array * of char; (* Mathematical extensions Mathematical extensions of Zonnon let use arrays in a more convenient way for writing applications where multidimensional algebra is used. Arrays to be used in mathematical extensions should be defined with special {math} modifier. ArrayType = array "{" math "}" Length {"," Length} of Type. This option allow you to initialize math array with array expressions, but it only works for numerical arrays such as array {math} of integer | real | boolean but not of string. *) (* Declare Array of Integers *) numbers, ordered_numbers: array {math} * of integer; (* Declare Array of Strings *) names: array 5 of string; ordered_names: array * of string; (* Declare multi-dimensional Array *) matrix: array {math} 2, 3 of integer; transposed_matrix: array {math} *,* of integer; (* Declare Jagged Array *) text: array * of array * of string; (* Indexer *) vowels,en,na: Alphabet; vs,w: array {math} * of char; word1,word2,word3: string; begin (* Single-dimensional Array(s) *) PrintTitle("Reverse Array Elements"); (* Initialize Array of Chars *) letters[0] := 'A'; letters[1] := 'E'; letters[2] := 'I'; letters[3] := 'O'; letters[4] := 'U'; PrintArrayChar(letters); inverse_letters := ReverseChar(letters); PrintArrayChar(inverse_letters); PrintTitle("Sort Integer Array Elements"); (* Initialize Math Array of Integers *) numbers := [ 10, 8, 3, 1, 5]; PrintArrayInt(numbers); ordered_numbers := BubbleSortInt(numbers); PrintArrayInt(ordered_numbers); PrintTitle("Sort String Array Elements"); (* Initialize Array of Strings *) names[0] := "Damian"; names[1] := "Rogelio"; names[2] := "Carlos"; names[3] := "Luis"; names[4] := "Daniel"; PrintArrayString(names); ordered_names := BubbleSortString(names); PrintArrayString(ordered_names); (* Multi-dimensional Array (Matrix row,column) *) PrintTitle("Transpose Matrix"); (* Matrix row=2,col=3 * A = [6 4 24] * [1 -9 8] *) (* Array inline expression used to declare and initialize array *) matrix := [[6, 4, 24], [1, -9, 8]]; PrintMatrix(matrix); transposed_matrix := TransposeMatrix(matrix); PrintMatrix(transposed_matrix); (* Jagged Array (Array-of-Arrays) *) PrintTitle("Upper Case Random Array & Graph Number of Elements"); (* * Creating an array of System.String arrays using the (System.)String.Split method * * Text extract from: 'El ingenioso hidalgo don Quijote de la Mancha' * *) text := new JaggedArrayOfString(8,0); text[0] := Str.Split("Hoy es el diÂa mas hermoso de nuestra vida, querido Sancho;", ' '); text[1] := Str.Split("los obstaculos mas grandes, nuestras propias indecisiones;", ' '); text[2] := Str.Split("nuestro enemigo mas fuerte, miedo al poderoso y nosotros mismos;", ' '); text[3] := Str.Split("la cosa mas facil, equivocarnos;", ' '); text[4] := Str.Split("la mas destructiva, la mentira y el egoiÂsmo;", ' '); text[5] := Str.Split("la peor derrota, el desaliento;", ' '); text[6] := Str.Split("los defectos mas peligrosos, la soberbia y el rencor;", ' '); text[7] := Str.Split("las sensaciones mas gratas, la buena conciencia...", ' '); PrintJaggedArray(text); UpperCaseRandomArray(text); PrintJaggedArray(text); GraphJaggedArray(text); (* Array Exceptions *) PrintTitle("Common Array Exceptions"); PrintCommonArrayExceptions(nil); PrintCommonArrayExceptions(text); (* Accessing Class Array Elements through Indexer *) PrintTitle("Alphabets"); vowels := new Alphabet(5,nil,nil); vowels[0] := char('a'); vowels[1] := char('e'); vowels[2] := char('i'); vowels[3] := char('o'); vowels[4] := char('u'); vs := new ArrayOfChar(5); vs[0] := vowels[0]; vs[1] := vowels[1]; vs[2] := vowels[2]; vs[3] := vowels[3]; vs[4] := vowels[4]; writeln; writeln("Vowels = {":0, Str.Join(',', vs):0, "}":0); en := new Alphabet(0,'abcdefghijklmnopqrstuvwxyz',nil); writeln("English Alphabet = {":0,en.ToString(),"}":0); na := new Alphabet(0,nil,en.Slice(9, 19)); writeln("Alphabet Extract en[9..19] = {":0,na.ToString():0,"}":0); w := new ArrayOfChar(5); w[0] := en[6]; w[1] := en[14]; w[2] := en[14]; w[3] := en[3]; copy(w, word1); w := new ArrayOfChar(4); w[0] := en[1]; w[1] := en[24]; w[2] := en[4]; copy(w, word2); w := new ArrayOfChar(9); w[0] := en[4]; w[1] := en[21]; w[2] := en[4]; w[3] := en[17]; w[4] := en[24]; w[5] := en[14]; w[6] := en[13]; w[7] := en[4]; copy(w, word3); writeln; writeln(word1:0, " ":0, word2:0, ", ":0, word3:0, "!":0); writeln; readln; end Main.
The output:
VoilĂ , that's it. Next post in the following days.
such a informative article.
ReplyDelete