Jak zastąpić wartości zerowe w tablicy?
Skrypciarze odpowiadają na Wasze pytania
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! Jak utworzyć pętlę, która przechodząc przez tablicę wielkości 12x12 zastąpiłaby wszystkie wartości zerowe łącznikiem?
-- AM
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 |