Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

15. Tablice

15. Tablice

Daniel Celeda
17 maja 2006
205 531
Odsłony
Daniel Celeda
17 maja 2006
205 531
Odsłony

Często w programowaniu spotyka się sytuację, w której korzysta się z dużej liczby zmiennych tego samego typu. Zamiast deklarować np. kilkanaście (czy kilka tysięcy) zmiennych, korzysta się z tablic lub kolekcji.

Czym są tablice?

To zbiory wielu zmiennych tego samego typu. Możemy zadeklarować zmienną typu tablicowego i przechowywać w niej np. sto liczb całkowitych. W tablicach i kolekcjach możemy przetrzymywać także klasy i struktury. Dokładniej rzecz ujmując tablica to obiekt zawierający zbiór referencji do innych zmiennych.
Jako prosty przykład napiszmy program, w którym zadeklarujemy tablicę o rozmiarze 3 (tyle elementów będzie mogła przechowywać), a następnie przypiszemy jej trzy liczby całkowite i wypiszemy je na ekranie w innej kolejności.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
class KlasaGlowna
{
    static void Main()
    {
        int[] tablicaLiczb = new int[3];
        tablicaLiczb[0] = 11;
        tablicaLiczb[1] = 22;
        tablicaLiczb[2] = 33;
        System.Console.WriteLine("Liczby znajdujące się w tablicy:");
        System.Console.WriteLine(tablicaLiczb[0] + " " + tablicaLiczb[1] + " " + tablicaLiczb[2]);
        System.Console.WriteLine("Te same liczby ale wypisane w innej kolejności:");
        System.Console.WriteLine(tablicaLiczb[1] + " " + tablicaLiczb[2] + " " + tablicaLiczb[0]);
        System.Console.Read();

Prześledźmy kod. Najpierw deklarujemy zmienną tablicową, określając typ przechowywanych elementów („int”) oraz rozmiar (maksymalna ilość przechowywanych elementów). Po słówku „int” występuje para nawiasów prostokątnych, która określa, że nie jest to zwykła zmienna typu całkowitoliczbowego lecz zmienna tablicowa. Następnie za pomocą słówka „new” tworzymy nowy obiekt (tablicę) i podajemy rozmiar w nawiasach prostokątnych (w tym wypadku „3”). Odwołać się do poszczególnych elementów w tablicy możemy także za pomocą nawiasów prostokątnych. Wystarczy tylko podać, do którego elementu chcemy się dostać. Liczby 0, 1, 2 umieszczone między nawiasami to indeksy tablicy. Im większy rozmiar tablicy tym większych indeksów możemy użyć ale zawsze muszą one być co najmniej o jeden mniejsze od rozmiaru tablicy. Indeksowanie rozpoczyna się zawsze od liczby „0”, więc pierwszy element znajduje się pod „tablica[0]”, a nie jakby się mogło wydawać pod „tablica[1]”.
W naszym programie najpierw przypisujemy wartości kolejnym zmiennym, a następnie wypisujemy je w różnej kolejności.
Wynik działania programu:

class KlasaGlowna
{
    static void Main()
    {
        int[] tablicaLiczb = { 11, 22, 33 };
        System.Console.WriteLine("Liczby znajdujące się w tablicy:");
        System.Console.WriteLine(tablicaLiczb[0] + " " + tablicaLiczb[1] + " " + tablicaLiczb[2]);
        System.Console.WriteLine("Te same liczby ale wypisane w innej kolejności:");
        System.Console.WriteLine(tablicaLiczb[1] + " " + tablicaLiczb[2] + " " + tablicaLiczb[0]);
        System.Console.Read();

Wynik działania jest identyczny jak w poprzednim programie.

Automatyczna inicjalizacja elementów

W C# podczas powoływania tablicy do życia (stworzenie obiektu typy tablicowego), wszystkie elementy są wypełniane wartościami domyślnymi, czyli dla „int” będzie to „0”, dla „string” łańcuch pusty „”, dla obiektów „null” itd.

class KlasaGlowna
{
    static void Main()
    {
        int[] tablicaInt = new int[3];
        string[] tablicaString = new string[3];
 
        System.Console.WriteLine("Liczby znajdujące się w tablicaInt:");
        for (int i = 0; i < 3; i++)
        {
            System.Console.WriteLine(tablicaInt[i] + " ");
        }
        System.Console.WriteLine("\nNapisy znajdujące się w tablicaString:");
        for (int i = 0; i < 3; i++)
        {
            System.Console.WriteLine(tablicaString[i] + " ");
        }
 
        System.Console.Read();
    }

Wynik

Praktyczne wykorzystanie tablic

Bardziej przydatnym programem jest aplikacja, która najpierw poprosi użytkownika o podanie rozmiaru tablicy, a następnie o wprowadzenie tylu liczb ile wynosi podany przez nas rozmiar. Liczby zostaną umieszczone w tablicy. W każdej chwili będziemy mogli wskazać, która liczbę chcemy wyświetlić.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.WriteLine("Podaj rozmiar tablicy.");
        string rozmiarTablicy = System.Console.ReadLine();
        int[] tablicaLiczb = new int[int.Parse(rozmiarTablicy)];
        for (int i = 0; i < int.Parse(rozmiarTablicy); i++)
        {
            System.Console.WriteLine("Podaj liczbę o indeksie " + i + ".");
            tablicaLiczb[i] = int.Parse(System.Console.ReadLine());
        }
 
        System.Console.WriteLine("Liczby znajdujące się w tablicy:");
        for (int i = 0; i < int.Parse(rozmiarTablicy); i++)
        {
            System.Console.Write(tablicaLiczb[i] + " ");
        }
 
        string koniec = "n";
 
        do
        {
            System.Console.WriteLine("\nKtórą liczbę wyświetlić?");
            string indeks = System.Console.ReadLine();
            System.Console.WriteLine("Element tablicy o indeksie " + indeks +
                " ma wartość: " + tablicaLiczb[int.Parse(indeks)]);
            System.Console.WriteLine("Koniec? (t\\n)");
            koniec = System.Console.ReadLine();
        }
        while (koniec != "t");
    }

}

Wynik wykonania programu:

Ćwiczenie

Napisz program pobierający od użytkownika 5 liczb całkowitych i wypisujący je na ekranie od najmniejszej do największej.

class KlasaGlowna
{
    static void Main()
    {
        int[] tablicaLiczb = new int[5];
 
        for (int i = 0; i < 5; i++)
        {
            System.Console.WriteLine("Podaj liczbę o indeksie " + i + ".");
            tablicaLiczb[i] = int.Parse(System.Console.ReadLine());
        }
 
        for (int i = 4; i > 0; i--)
        {
            for (int j = 0; j < i; j++)
            {
                int pierwsza = tablicaLiczb[j];
                int druga = tablicaLiczb[j + 1];
                if (pierwsza > druga)
                {
                    tablicaLiczb[j] = druga;
                    tablicaLiczb[j + 1] = pierwsza;
                }
            }
        }
 
        System.Console.WriteLine("Posortowane liczby: ");
        for (int i = 0; i < 5; i++)
        {
            System.Console.Write(tablicaLiczb[i] + " ");
        }
        System.Console.Read();
    }

Zobacz również

Komentarze

Pytam przy okazji. Jaka jest funkcja do sortowania liczb w sposob automatyczny? lub jak wyszukiwac lub sprawdzac czy istnieje interesujaca nas funkcja.
Marco, 22 czerwca 2006, 16:00
a jak napisać taką tablice ? Wypełnij losowo tablicę 10 elementową liczbami z zakresu 0-10 i oblicz: Iloczyn liczb podzielnych przez 5. Tablicę oraz wynik (sumę) wydrukuj. ppwidmo@poczta.fm
Trolek, 28 czerwca 2006, 03:01
Apropos komentarza Marco, to przydałoby się wykorzystanie funkcji sortującej artykuły z kursu C# w sposób naturalny ponieważ w tym momencie są one posortowane w sposób mało intuicyjny tzn.: 1, 10, 11 ..., 2, 20 itd.
xbeyond, 18 maja 2007, 09:44
ej Trolek: wiem, ze to dawno bylo, ale to miales zadanie z programowania, co??? lol
rakuzan, 25 czerwca 2007, 19:25
Swoją drogą obrzydliwie banalne zadanie.. studenci teraz jacyś leniwi.
złośliwy, 29 czerwca 2007, 18:19
to chyba nie student tylko jakis gimnazjalista... mam nadzieje .... :/
ruby, 2 lipca 2007, 23:58
Ja raczej znam C++, i w wyniku z tego coś mi tutaj nie pasuje. nie mogę załapać 1 rzeczy. cytuje: System.Console.WriteLine("Podaj rozmiar tablicy."); string rozmiarTablicy = System.Console.ReadLine(); i jakiś tam instrukcje. w C++ to by było tak int rozmiarTablicy; cin>>rozmiarTablicy; i bez tych stringów. Więc pytanie: jak można w C# wpisać z klawiatury liczbę int? pytam się bo w całym kursu tego nie znalazłem. bo tutaj później widzę coś takiego int["> tablicaLiczb = new int[int.Parse(rozmiarTablicy)">; for (int i = 0; i < int.Parse(rozmiarTablicy); i++) dla czego nie pisze z skąd się wziął ten " Parse ".najgorzej jest to że w tych językach programistycznych wszystkie słowa kluczowe i funkcji z biblioteki są po angielsku, a i przykładowe zmienne tak samo autory piszą po angielsku , no i początkujący weź zrozum które jest słowa z biblioteki a które podał autor. ale to nie ważne. mnie raczej interesuje czy nie można wpisać od razu wartość int do programu? bez stringu?
Sfinks, 5 lipca 2007, 15:59
Sam sobie odpowiem. int liczba = int.Parse(Console.ReadLine()); bardziej krótka i czytelniejsza ! jeszcze bym przy okazji dodał co robią metody ReadLine() i WritLine() byłoby bardziej jasne o co w tym wszystkim chodzi. Niestety nie mam bardzo czasu. No taka nauka gdzie nie pisze się co skąd się wzięło i jakie ma dobre i źle cechy , to nie nazywał bym nauką.
Sfinks, 10 lipca 2007, 17:45
O czym ty gadasz? Wszystko jest wyjaśnione w poprzednich działach. Ja robie kurs od 6 czy 5 lekcji i nie mama problemu. PS Bardzo mi się te lekcje podobają. Gratuluję autorowi.
Trez, 19 lipca 2007, 12:16
Bardzo fajny kurs, najważniejsze to przerobić cały, od początku do końca a nie tak jak Sfinks przeczytać jedna lekcje i czepiać się że czegoś nie ma, ja przerobiłem wszystkie lekcje od 1 do tej i nie mam problemu ze zrozumieniem. Autor jest super gościem bo w końcu ktoś pomyślał o ludziach którzy pierwszy raz mają styczność z programowaniem.
Luken, 28 listopada 2007, 02:00
PYTANIE: jak załadować do tablicy dane z wczytanego pliku w MS VS 2005 EE??
Student, 27 grudnia 2007, 12:20
a co mam napisać jeśli chcę aby każde z pól mojej tablicy przechowywało inny obiekt ? jak to zdeklarować ?
kivol, 13 lutego 2008, 02:36
tablice zadeklarować można tak aby przyjmowała obiekty tylko tego typu dla jakiego została zadeklarowana dlatego tam wszędzie jest rzutowanie na int. Żeby tablica przechowywała różne obiekty potrzebna by Ci była tablica wielowymiarowa lub jednowymiarowa i będziesz rzutował na typ tablicy, ale chyba łatwiej zrobić jakąś klasę, która miała by składowe o potrzebnych Ci obiektach...
graf , 21 lutego 2008, 02:47
ja mam problem z tym sortowaniem, nie mogę tego za bardzo zrozumieć jak działa program który sortuje np 5 liczb. Czy jest jakaś funkcja do tego? (c#)
mikes, 29 grudnia 2008, 16:17
Czy początkujący programista napisze sam dobrze działający algorytm sortujący? Wątpię. Najprostsza ze znanych metod to sortowanie bąbelkowe, czyli zamienianie ze sobą sąsiednich wartości z tablicy. Musi być użyta podwójna pętla "for". I raczej nie ma, zdefiniowanych w języku C#, systemowych funkcji sortujących tablice.

T, 9 stycznia 2009, 15:31
Algorytm sortujący okazuje się banalny...gdy się trochę pomyśli.... Ja nie lubię programować i robię to kiedy muszę.... ale jak juz to robię to zastanawiam się nad działaniem programu.... skracam sobie czas pisania każdej aplikacji srednio o połowę ;">

sezam, 23 stycznia 2009, 12:26
Najprostszy algorytm sortujący to quicksort. Tworzysz drugą tablicę. Bierzesz pierwszy element z tablicy i poruwnujesz z nastepnymi (czy jest mniejszy) jesli tak to go wypisujesz w pierwsze miejsce drugiej tablicy, jeśli nie bierzesz następny elemet i postępujesz tak samo. Należy tylko pamiętać aby przy porównywaniu kolejnych elementów pomijać te które juz wypisalismy.

pilsio, 5 lutego 2009, 22:20
W C++ cin i cout dzialaja identycznie, jak tu Console.Writeline(...). Cin i cout sa obiektami i jako takie tez wypisuja tylko w stringach. Tyle ze niejawnie na nasze potrzeby konwertuja dany string na float czy tam int. Dlatego mozna uzywac takiej konstrukcji: int x; cin >> x; // pobiera liczbe jako string, zamienia ja na int i juz cout << x ; // zamienia x na string i wysyla na ekran Nie wiem jeszcze jak mozna tez w C# zrobic cos podobnego, niekoniecznie z operatorami << i >>, ale przynajmniej skrocic zapis i przy okazji zeby dokonywalo automatycznej konwersji typu na string i odwrotnie. Poza tym, kurs fajny :0 Pozdarwiam
cin i cout, 5 marca 2009, 14:37
Sortować tablice można za pomocą Sort():
Array.Sort(jakaśtamtablica);

Sz x, 4 kwietnia 2009, 15:14
Jeśli chcesz sortować od elementu największego:
Array.Sort(jakaśtamtablica);

Array.Reverse(jakaśtamtablica);
 
Array.Reverse(...) zapisuje tablice od tyłu.

Sz x, 4 kwietnia 2009, 15:19
Ciekawie choc malo, a gdzie tablice wielowymiarowe???

Asmes, 29 maja 2009, 18:27
no właśnie, gdzie tablice wielowymiarowe? podaj jakąś przykładową klasę i zrób tablicę wielowymiarową tej klasy? ciekawe czy se poradzisz ;/

johnny, 7 sierpnia 2009, 18:15
Czemu nie działają linki z rozwiązaniami ćwiczeń ?
fifi, 18 grudnia 2010, 13:33
Rozwiązania ćwiczeń nie wyświetlają się w Firefox"sie. Najlepiej otworzyć sobie ten kurs w IE albo Operze. BTW bardzo dobry kurs :)
Morales, 9 stycznia 2011, 09:02
Niestety, rozwiązania do ćwiczeń nie wyświetlają mi się i w IE9.
Eldritch, 24 października 2011, 21:20
Na Chrome śmiga
Kundi, 25 października 2011, 13:41
Niestety nie moge zrozumiec deklaracji : int["> tablicaLiczb = new int[3">; dlaczego new int[3"> ?? i dlaczego nie mozna tego zapisac int[3"> talblicaliczb ... Nie rozumiem na czym polega new int[3">
Mateusz, 26 października 2011, 01:28
Witam, Czy ktoś były skłonny wytłumaczyć mi działanie programu srotującego tablicę? piotrek.wo@gmail.com
Piotr, 29 października 2012, 13:01

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.