4 Operacje na tablicach (prezentacja)

background image

Operacje na tablicach w C#

Opracował dr Robert Fidytek

background image

Przegląd zagadnień

Ustawianie elementów na daną wartość

Kopiowanie tablic

Odwracanie tablicy

Sortowanie tablicy

Wyszukiwanie elementów w tablicy

Podsumowanie i zadania sprawdzające

background image

3

Ustawianie elementów tablicy na

daną wartość

W czasie tworzenia tablicy możemy zainicjować ją dowolnymi wartościami.

W dalszej części programu w pojedynczej instrukcji możemy nadać wartość

tylko dla pojedynczego elementu:

for

(

int

i = index; i < index + iloscElementow; i++)

{ tablica[i] = wartość; }

Metoda Clear klasy Array ustawia wybrane elementy tablicy na wartość zero,

false lub null w zależności od typu podstawowego tablicy.

int

[] tablica = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Array

.Clear(tablica, 3, 5);

//od 3 indeksu 5 elementów

foreach

(

int

el

in

tablica)

Console

.Write(

"{0}, "

, el);

//0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – numery indeksów

//1, 2, 3,

0, 0, 0, 0, 0,

9, 10 - wartości elementów tablicy

background image

4

Kopiowanie tablic

W wielu programach istnieje potrzeba dokonania kopii tablicy, w celu jej

przetworzenia, bez modyfikacji tablicy źródłowej.

typ[] tablica1 =

new

typ[rozmiar];

typ[] tablica2 =

new

typ[rozmiar];

...

tablica1=tablica2;

Zmienne tablicowe tablica1 i tablica2 będą odwoływać się do tego samego

obiektu tablicowego.

To nie jest kopiowanie tablic !!!

Co zostanie wypisane na ekranie?

int

[] tab1 =

new

int

[5] { 1, 2, 3, 4, 5 };

int

[] tab2 =

new

int

[5] { 6, 7, 8, 9, 10 };

tab2 = tab1;

tab1[0] = 99;

Console

.Write(

"{0}, "

, tab2[0]);

background image

5

Kopiowanie tablic

W celu utworzenia dwóch odmiennych tablic, z których jedna będzie

zawierać kopię elementów drugiej tablicy należy wykonać poniższy kod:

typ[] źródło =

new

typ[rozmiar1];

typ[] cel =

new

typ[rozmiar2];

...

for

(

int

i = 0; i < rozmiar3; i++)

{ cel[i] = źródło[i]; }

W przypadku odwołania się do nieistniejącego elemantu tablicy zostanie
zgłoszony wyjątek IndexOutOfRangeException.

Czy tablice źródło i cel muszą być takich samych rozmiarów?

Jaką wartość może przyjąć rozmiar3 w powyższym przykładzie?

background image

6

Kopiowanie tablic

Kopiowanie tablic za pomocą metody Copy klasy Array.

Array.Copy(tablica1,indeks1, tablica2, indeks2, ilość);

tablica1 – tablica źródłowa,

tablica2 – tablica docelowa,

indeks1 – indeks, od którego będą elementy kopiowane z tablicy1,

indeks2 – indeks, od którego będą elementy kopiowane do tablicy2,

ilość – ilość kopiowanych elementów.

Przykład:

int

[] tab1 = { 10, 11,

12, 13, 14, 15,

16, 17, 18, 19 };

int

[] tab2 = { 20, 21, 22,

23, 24, 25, 26,

27, 28, 29 };

Array

.Copy(tab1,

2

, tab2,

3

, 4);

foreach

(

int

el

in

tab2)

Console

.Write(

"{0}, "

, el);

//20, 21, 22, 12, 13, 14, 15, 27, 28, 29

background image

7

Odwracanie tablicy

Odwracanie tablicy polega na zamianie kolejności elementów tablicy.

Pierwszy staje się ostatnim, a ostatni pierwszym.

Odwracanie tablicy za pomocą metody Reverse klasy Array.

Array.Reverse(tablica, indeks, ilość);

tablica – tablica źródłowa,

indeks – indeks, od którego elementy będą odwracane,

ilość – ilość odwracanych elementów.

Przykład:

int

[] tab = { 1, 2,

3, 4, 5, 6, 7,

8, 9, 10 };

Array

.Reverse(tab, 2, 5);

foreach

(

int

el

in

tab)

Console

.Write(

"{0}, "

, el);

//1, 2, 7, 6, 5, 4, 3, 8, 9, 10,

Array

.Reverse(tab);

//odwrócenie całej tablicy

foreach

(

int

el

in

tab)

Console

.Write(

"{0}, "

, el);

//10, 9, 8, 3, 4, 5, 6, 7, 2, 1,

Metoda Reverse
działa tylko z
tablicami
jednowymiarowymi.

Próba jej użycia
do tablicy
wielowymiarowej
spowoduje
zgłoszenie wyjątku
RankException.

background image

8

Sortowanie tablicy

Sortowaniem nazywamy proces ustawienia elementów pewnego zbioru w

określonym porządku. Sortowanie wykonuje się w celu ułatwienia

ewentualnego wyszukiwania elementów danego zbioru.

W przypadku sortowania tablic bardzo ważna jest oszczędność pamięci.

Metodę sortowania, która nie potrzebuje tworzenia dodatkowej tablicy, do

której przenosimy elementy, nazywamy sortowaniem w miejscu.

W algorytmice jest szereg metod sortujących. Jedną z najpopularniejszych,

choć niezbyt wydajną, jest metoda nazywana sortowaniem bąbelkowym.

Sortowanie bąbelkowe polega na zamianie dwóch sąsiadujących ze sobą

elementów, jeżeli względem siebie zajmują nieprawidłowe miejsca.

background image

9

Sortowanie bąbelkowe (bubble sort)

background image

10

Sortowanie tablicy

Sortowanie tablicy za pomocą metody Sort klasy Array.

int

[] tab = { 34, 1, 17, 21, 5, 90, 45, 67 };

Array

.Sort(tab);

foreach

(

int

el

in

tab)

Console

.Write(

"{0}, "

, el);

//1, 5, 17, 21, 34, 45, 67, 90

Metoda Sort klasy Array wykorzystuje algorytm QuickSort. (Algorytm ten

zostanie omówiony na wykładzie 10.) Za pomocą metody Sort klasy Array

można sortować tylko tablice jednowymiarowe. Podczas próby sortowania
tablicy wielowymiarowej zostanie zgłoszony wyjątek RankException.

background image

11

Wyszukiwanie elementu w tablicy

Wyszukiwanie indeksu elementu (o danej wartości) w tablicy za pomocą

metod IndexOf i LastIndexOf klasy Array.

Array.IndexOf(tablica, element);

Array.IndexOf(tablica, element, indeks_początkowy);

tablica – tablica źródłowa,

element – wyszukiwany element tablicy,

indeks_początkowy – indeks, od którego następuje wyszukiwanie.

Metoda IndexOf przeszukuje tablicę od początku, natomiast metoda

LastIndexOf natomiast przegląda tablicę od końca.

Przykład: Znalezienie indeksów wszystkich elementów o wartości 3 w tablicy tab.

int

[] tab ={ 1, 4, 3, 5, 3, 3, 2, 1, 3, 4 };

int

i =

Array

.IndexOf(tab, 3);

while

(i != -1)

{

Console

.Write(

"{0}, "

, i);

i =

Array

.IndexOf(tab, 3, i + 1);

}

//2, 4, 5, 8

Metody IndexOf i
LastIndexOf zwracają
indeks poszukiwanego
elementu lub -1 w
przypadku jego braku.

background image

12

Wyszukiwanie binarne

W przypadku, gdy chcemy przeszukiwać tablice posortowane, wydajność

operacji wyszukiwania można znacznie poprawić, stosując wyszukiwanie

binarne (połówkowe).

W przypadku wyszukiwania binarnego wybraną wartość porównujemy ze

środkowym elementem tablicy.

Jeżeli wartość środkowego elementu jest równa wybranej wartości,

przerywamy wyszukiwanie. Element środkowy jest szukanym elementem.

W przypadku, gdy szukana wartość jest mniejsza od wartości środkowego

elementu, żadaną wartość próbujemy znaleźć w pierwszej połowie tablicy.

Natomiast, gdy wybrana wartość jest większa od wartości środkowego

elementu, żądaną wartość próbujemy znaleźć w drógiej połowie tablicy.

Oczywiście do wyszukiwania żądanej wartości w poszczególnych częściach

tablicy stosujemy wyszukiwanie połówkowe. Wyszukiwanie kończymy w

momencie znalezienia żadanej wartości lub, gdy w wyniku podziału

otrzymamy pustą podtablicę, co jest równoważne z brakiem elementu o

żądanej wartości w przeszukiwanej tablicy.

background image

13

Wyszukiwanie binarne

Wyszukiwanie binarne indeksu elementu (o danej wartości) w tablicy jest

realizowane za pomocą metody BinarySearch klasy Array. Metoda ta zwraca

numer indeksu wyszukiwanego elementu lub wartość ujemną, gdy tablica nie

zawiera wyszukiwanego elemantu.

Przykład:

int

[] tab ={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int

i =

Array

.BinarySearch(tab, 2);

Console

.Write(

"i = {0}, "

, i);

Ćwiczenie:

Załóżmy, że pomyślałem dowolną liczbę naturalną z przedziału od 1 do 100 i

będę odpowiadał na pytania tylko “tak” lub “nie”.

Ile co najwyżej trzeba zadać pytań, aby zawsze odgadnąć pomyślaną przeze

mnie liczbę?

A gdybym pomyślał liczbę od 1 do 1 000 000? ...

background image

14

Zadanie 1

//Jakie błędy popełniono w poniższym kodzie programu?

int

[,] tab1 = { 1, 1, 2, 2, 3, 3, 4, 4, 5 }

int

[,] tab2 = { 6, 6, 7, 7, 8, 8, 9, 9, 0, 0 }

Array

.Copy(tab1, 4, tab2, 5, 6);

foreach

(

int

el

in

tab2)

Console

.Write(

"{0}, "

, tab2);

background image

15

Zadanie 2

//Co zostanie wypisane na ekranie?

const

int

N = 10;

int

[] tab =

new

int

[N] { 1, 3, 5, 7, 9, 0, 2, 4, 6, 8 };

int

i=-1, elem;

while

(++i < N / 2)

{

elem = tab[i];

tab[i] = tab[N - 1 - i];

tab[N - 1 - i] = elem;

}

foreach

(

int

el

in

tab)

Console

.Write(

"{0}, "

,el);

background image

16

Zadanie 3

//Co realizuje poniższy kod programu?

const

int

N = 10;

int

[] tab =

new

int

[N];

int

elem;

Random

r =

new

Random

();

for

(

int

i = 0; i < N; i++) tab[i] = r.Next(1, 101);

for

(

int

j = 0; j < N; j++)

for

(

int

k = j; k < N; k++)

if

(tab[j] < tab[k])

{

elem = tab[j];

tab[j] = tab[k];

tab[k] = elem;

}

foreach

(

int

el

in

tab)

Console

.Write(

"{0}, "

,el);

background image

17

Zadanie 4

//Jaką wartość osiągnie zmienna j?
//Co realizuje poniższy program?

const

int

I = 1;

int

[] tab =

new

int

[] {1,2,1,3,5,1,2,2,1};

int

i=-1, j = 0;

while

((i=

Array

.IndexOf(tab,I,i+1)) != -1) j++;

Console

.WriteLine(

"j={0}"

,j);

background image

18

Zadanie 5

//Co zostanie wypisane na ekranie?

int

[] tab =

new

int

[] {9, 3, 10, 7, 1, 5, 2, 6, 4, 8,};

foreach

(

int

el

in

tab)

Console

.Write(

"{0,2}, "

, el);

Console

.Write(

"\n"

);

Array

.Clear(tab, 1, 2);

foreach

(

int

el

in

tab)

Console

.Write(

"{0,2}, "

, el);

Console

.Write(

"\n"

);

Array

.Sort(tab);

foreach

(

int

el

in

tab)

Console

.Write(

"{0,2}, "

, el);

Console

.Write(

"\n"

);

Array

.Reverse(tab, 4, 3);

foreach

(

int

el

in

tab)

Console

.Write(

"{0,2}, "

, el);

Console

.Write(

"\n"

);

Array

.Copy(tab, 2, tab, 3, 4);

foreach

(

int

el

in

tab)

Console

.Write(

"{0,2}, "

,el);

1

2

3

4

5

6

7

8

9

10

11

12

13

14


Document Outline


Wyszukiwarka

Podobne podstrony:
1 Operacje na tablicach (materi Nieznany (2)
Ćw4 Tablice, operacje na tablicach
tabliczka na drzwi, prezentacje i inne
Uważajmy na drogach Prezentacja
4 Operacje na Plikach ppt
4 operacje na zmiennych I
Rola romantycznej poezji na przykładzie, prezentacja
34 Pliki Operacje na plikach w Pascalu
Nauczycielka w liceum narysowała kredą na tablicy punkt i zapytała
późniak koszałka,bazy?nych, Podstawowe operacje na?zach?nych
Pytania na kolokwium z prezentacji
załacznik 1 zapyt. ofert. na tablice informacyjne Pługa 2012, Przegrane 2012, Rok 2012, poczta 08.08
alfabet na tablicę
Frontex, Frontex (Europejska Agencja Zarządzania Współpracą Operacyjną na Zewnętrznych Granicach Pań
Operacje na macierzach id 33628 Nieznany

więcej podobnych podstron