5.6 C#

W C# występują tablice wzorowane na tych jakie znamy z Javy, ale jest też specjalny typ wielowymiarowych tablic — tablice prostokątne, bliższe tablicom z C czy Fortranu. Omówimy pokrótce te typy na przykładzie poniższego programu:


P30: Tab.cs     Tablice w C#

      1.  using System;
      2.  
      3.  class Tablice {
      4.      public static void Main() {
      5.          string[]  names =
      6.              new string[] { "Ola", "Ala", "Ula" };
      7.          int[,]   wzrwag = new int[3,2];
      8.          int[][] stopnie = new int[3][];
      9.  
     10.          for (int i =0; i < 3; i++) {
     11.              wzrwag[i,0] = 168 + i;
     12.              wzrwag[i,1] =  68 - 2*i;
     13.          }
     14.  
     15.          stopnie[0] = new int[] {4,4,4,5};
     16.          stopnie[1] = new int[] {4,5};
     17.          stopnie[2] = new int[] {3,4,3};
     18.  
     19.          Console.WriteLine("Imie Wzrost Waga Stopnie\n"+
     20.                            "------------------------");
     21.          for (int i = 0; i < names.Length; i++) {
     22.              Console.Write(names[i] + "  " + wzrwag[i,0] +
     23.                      "    " + wzrwag[i,1] + "  ");
     24.              for (int j = 0; j < stopnie[i].Length; j++)
     25.                  Console.Write(" " +  stopnie[i][j]);
     26.              Console.WriteLine();
     27.          }
     28.      }
     29.  }

Tablica names zadeklarowana w linii 5
       string[]  names = new string[] { "Ola", "Ala", "Ula" };
ma postać tablicy z Javy: jest to trzyelementowa tablica odnośników do napisów (zainicjowana odnośnikami do konkretnych napisów podanych w postaci literałów). W linii 8 deklarujemy tablicę dwuwymiarową liczb, stopnie,
       int[][] stopnie = new int[3][];
która, jak w Javie, jest w zasadzie jednowymiarową tablicą o elementach stopnie[0], stopnie[1], stopnie[2], z których każdy jest odnośnikiem do tablicy liczb. Zaraz po utworzeniu w linii 8 ta jednowymiarowa tablica inicjowana jest wartościami NULL. W liniach 15-17 programu
       stopnie[0] = new int[] {4,4,4,5};
       stopnie[1] = new int[] {4,5};
       stopnie[2] = new int[] {3,4,3};
tworzymy tablice liczb (różnych rozmiarów) i odnośniki do nich wpisujemy do elementów stopnie[0], stopnie[1], stopnie[2] tablicy stopnie. Zatem do poszczególnych ocen zapisanych w tablicy będziemy się odnosić poprzez podanie dwóch indeksów, każdy w osobnej parze nawiasów kwadratowych. Widać to na przykład w linii 25. Tego rodzaju tablica, jak w Javie, może mieć wiersze różnej długości (czyli być „postrzępiona”, ang. jagged array). Nie ma też żadnej gwarancji, że dane odpowiadające poszczególnym wierszom będą ułożone w pamięci w jakiś określony sposób — każdy wiersz może być alokowany osobno.

Charakterystyczna dla C# jest konstrukcja użyta w linii 7 programu

       int[,] wzrwag = new int[3,2];
Deklarujemy tu liczbową tablicę prostokątną o wymiarach 3×2. Jest ona odpowiednikiem tablic z Fortranu czy C: musi być ściśle prostokątna, tzn. długości wierszy muszą być równe. Cała tablica jest alokowana w spójnym obszarze pamięci w dobrze określonym porządku (wierszami, jak w C, a nie kolumnami, jak w Fortranie). Znacznie zwiększa to efektywność przetwarzania danych zawartych w tablicach w stosunku do Javy.

Widać z naszego przykładu, że takie tablice oznaczane są w specjalny sposób: indeksy umieszcza się w jednej parze nawiasów kwadratowych, oddzielone przecinkami (patrz linie 7, 11, 12, 22, i 23 programu).

Wynik programu to:

    Imie Wzrost Waga Stopnie
    ------------------------
    Ola  168    68   4 4 4 5
    Ala  169    66   4 5
    Ula  170    64   3 4 3
Jak widzimy, język C# daje nam dużą swobodę i elastyczność w posługiwaniu się tablicami — wspierane są zarówno tablice "w stylu Javy” jak i te znane z C czy Fortranu.

T.R. Werner, 21 lutego 2016; 20:17