Centrum skryptów - Systemy operacyjne

Jak zastąpić wartości zerowe w tablicy?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zastąpić wartości zerowe w tablicy?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak utworzyć pętlę, która przechodząc przez tablicę wielkości 12x12 zastąpiłaby wszystkie wartości zerowe łącznikiem?

-- AM

Cześć Skrypciarze! Odpowiedź

Cześć, AM! Przepraszam za taka zwłokę w odpisywaniu, ale jak zapewne wiesz, w tych dniach przypadała wiekopomna data 07.07.2007 i ogarnęło mnie siódemkowe szaleństwo. Do tego stopnia, że za skrypt biorę się dopiero teraz.

Niezła wymówka, nie? Myślę że zastosuję ją jeszcze przynajmniej ze dwa razy, w sierpniu przyszłego roku i wrześniu za dwa lata. Będę ogarnięty ósemkowym i dziewiątkowym szaleństwem… No i trochę zbankrutuję na prezentach ślubnych, ale czym są pieniądze przy takich cyfrowych szaleństwach! Teraz do roboty, trzeba podreperować trochę budżet innymi, skrypciarskimi cyferkami. Tak oto właśnie wygląda nasz szczęśliwy zerowo-łącznikowy skrypt:

Dim arrNumbers(2, 2)



arrNumbers(0,1) = 100

arrNumbers(1,2) = 200

arrNumbers(2,1) = 300

arrNumbers(2,2) = 400



For x = 0 to 2

    For y = 0 to 2

        If arrNumbers(x, y) = "" Then

            arrNumbers(x, y) = "-"

        End If

    Next

Next

   

For x = 0 to 2

    For y = 0 to 2

        Wscript.Echo x & "," & y & ": " & arrNumbers(x, y)

    Next

Next

Teraz czas na zwierzenia, zupełnie jak przed ślubem. W powyższym skrypcie nie dopatrzycie się ani jednej siódemki (co dowodzi tego, ze już zupełnie wyleczyliśmy się z siódemkowego szaleństwa), dopatrzycie się jednak czegoś innego. Chociaż AM dość wyraźnie prosił o tablicę o wymiarach 12x12, nasz skrypt tak właściwie tworzy tablice o wymiarach 2x2. To nie dlatego, ze jesteśmy złośliwi czy coś, w tym szaleństwie jest metoda. Chodziło nam o to, żeby pokazać, na jakiej ogólnej zasadzie on działa. W tablicy o wymiarach 2x2 łatwo jest pokazać wszystkie wartości, a skrypt nie ciągnie się na kilometry. Do utworzenia takiej tablicy używamy instrukcji Dim, po której następuje nazwa tablicy (arrNumbers ) oraz jej wymiary (2x2):

Dim arrNumbers(2, 2)

Jeżeli jednak będziemy obstawać przy tablicy o wymiarach 12x12, to trzeba tylko odpowiednio zmienić jej wymiary w odpowiednim fragmencie kodu:

Dim arrNumbers(12, 12)

Łatwizna, co nie? Po zdefiniowaniu tablicy i jej rozmiarów, używamy poniższych wierszy kodu, aby przypisać wartości elementom naszej tablicy. Tablica 2x2 wygląda jak siatka, w której kropki odpowiadają pustym polom (musimy koniecznie oznaczyć jakoś te pola ze względu na sposób ich wyświetlania w witrynie Technet):

. 0 1 2
0 . . .
1 . . .
2 . . .

Jeżeli elementowi o swpółrzędnych 0, 1 przypiszemy wartość 100 (co za chwilę zrobimy), to nasza siatka będzie wyglądała w następujący sposób:

. 0 1 2
0 . 100 .
1 . . .
2 . . .

Po przypisaniu zaś odpowiednich wartości czterem różnym elementom, zmieni się właśnie tak:

. 0 1 2
0 . 100 .
1 . . 200
2 . 300 400

Właśnie to robią poniższe cztery wiersze kodu – przypisują wartości czterem elementom naszej tablicy:

arrNumbers(0,1) = 100

arrNumbers(1,2) = 200

arrNumbers(2,1) = 300

arrNumbers(2,2) = 400

Jeżeli przyjrzeliście się uważnie naszej siatce (a zakładamy, że tak), to gołym okiem widać, że niektóre z elementów nie mają w ogóle żadnej wartości, na przykład element 0,0 świeci pustką, że aż boli. Właśnie w sprawie tych elementów pisał do nas AM. Chodziło mu o sposób na znalezienie wszystkich pustych pól (czyli elementów, które nie mają żadnych wartości w tablicy) i automatyczne zastąpienie ich łącznikami. Innymi słowy, AM chce, żeby tablica po modyfikacjach wyglądała w następujący sposób:

. 0 1 2
0 - 100 -
1 - - 200
2 - 300 400

Czy damy sobie z tym radę? Myślę, że dla kilku zer na koncie możemy się podjąć tego zadania.

Jak więc zidentyfikować te elementy w tablicy, które nie mają żadnej wartości, a potem zamienić je na łączniki? Poniższy skrypt może być na właściwym tropie:

For x = 0 to 2

    For y = 0 to 2

        If arrNumbers(x, y) = "" Then

            arrNumbers(x, y) = "-"

        End If

    Next

Next

Mamy tutaj osadzoną pętlę For Next, czyli pętlę For Next umieszczoną wewnątrz drugiej takiej pętli. Zaczynamy od pętli For Next, która w mianowniku ma zmienną x i działa od 0 do 2:

For x = 0 to 2

Wewnątrz tej pętli mamy druga pętlę For Next, która również działa od 0 do 2, z tą różnica tylko, że zmienna w mianowniku to nie x, ale y:

For y = 0 to 2

Po co tyle zachodu? Otóż jasne jest chyba, że musimy naszą pętlą przejść przez wszystkie elementy w tablicy. Dla przypomnienia, to właśnie wszystkie nasze elementy ( i szczęśliwe numery):

  • 0,0
  • 0,1
  • 0,2
  • 1,0
  • 1,1
  • 1,2
  • 2,0
  • 2,1
  • 2,2

Pierwsza pętla przechodzi przez wszystkie możliwe wartości (czyli 0, 1 i 2) w pierwszym wymiarze tablicy, a druga robi to samo, tylko, ze w jej drugim wymiarze. Używając obu pętli, docieramy do każdego elementu tablicy.

Teraz należy sprawdzić, czy któraś z wartości nie jest pustym ciągiem znaków:

If arrNumbers(x, y) = "" Then

Jeżeli wartość nie jest pustym ciągiem znaków, pętla przechodzi przez nią i robi dokładnie to samo z następnym elementem tablicy. Gdy jednak któraś z wartości jest pustym ciągiem znaków, jako nową wartość tego elementu podajemy myślnik, po czym pozwalamy, żeby przeszła przez nią pętla i powtarzamy cały proces dla następnego elementu tablicy. Oto sposób, w jaki przypisujemy danemu elementowi myślnik:

arrNumbers(x, y) = "-"

Tylko tyle. Po dokładnym przyjrzeniu się i ewentualnym zmodyfikowaniu każdej wartości uruchamiamy następujący fragment kodu, który wyświetla poszczególne elementy i ich wartości:

For x = 0 to 2

    For y = 0 to 2

        Wscript.Echo x & "," & y & ": " & arrNumbers(x, y)

    Next

Next

Wynik naszej pracy powinien wyglądać w sposób następujący:

0,0: -

0,1: 100

0,2: -

1,0: -

1,1: -

1,2: 200

2,0: -

2,1: 300

2,2: 400

Jak łatwo zauważyć, każda pusta wartość została tu zastąpiona łącznikiem. Numerologiczna magia, mówię Wam...

Mam nadzieje, ze teraz wszystkie usunięte zera przejdą od razu na moje konto i moje kolejne szaleństwo będzie szaleństwem zerowym. Z zastrzeżeniem oczywiście, że tym razem zera będą poprzedzone jakąś inna cyfrą różną od zera…

  Do początku strony  Do początku strony

Centrum skryptów - Systemy operacyjne