Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző jegyekkel próbálják meg kiküszöbölni. Az ellenőrző jegyeket a többi számjegyből számolják és az adat végére illesztik, majd minden beolvasáskor ellenőrzik. Ma már gyakorlatilag minden árucikken szerepel a termék azonosítására szolgáló, általában 13 jegyű számból képezett vonalkód. A 13 jegyből az első három az országot azonosítja, a következő 9 jegy pedig a gyártót és azon belül a terméket. Az ország azonosítója Magyarország esetében 599. Az utolsó jegy az ellenőrző jegy, amelyet a következő szabály segítségével határozhatunk meg: Szorozzuk meg a páratlan helyeken álló számjegyeket 1gyel, a páros helyen állókat pedig 3-mal és a kapott számokat adjuk össze! Ha az így kapott összeg utolsó számjegyét kivonjuk 10-ből, megkapjuk a vonalkód utolsó jegyét. Például, ha egy termék vonalkódjának első 12 jegye 599898350115, akkor az 5*1+9*3+9*1+8*3+…+5*3 összeg értéke 135. Mivel az összeg utolsó jegy 5, a vonalkód ellenőrző jegye is 10-5=5 lesz. Az összeg utolsó jegyét Visual Basicben annak tízes maradéka adja, hiszen 135 Mod 10=5. A fenti számítást kényelmesen elvégezhetjük, ha az első számjegyet v(1)-gyel, a másodikat v(2)-vel, a harmadikat v(3)-mal, … a tizenkettediket v(12)-vel jelöljük, hiszen a számítás algoritmusa ebben az esetben a következő: s=0 Ciklus i=1-től 12-ig Ha i páratlan, akkor s=s+v(i) Ha i páros, akkor s=s+3*v(i) Ciklus vége utolsó =10 – Mod 10 Az v(1), v(2), … v(12) egy egész számokból álló sorozat, ún. egydimenziós tömb. Az azonos típusú elemek sorozatát tömbnek nevezzük. Az egydimenziós tömb vagy vektor minden egyes elemére két adattal, a tömb nevével és az elem sorszámával hivatkozunk, például: v(3). VB-ben a v egydimenziós tömböt, melynek elemeit az 1, 2, … 12 index azonosítják, a következőképpen deklaráljuk: Dim v(12) As Integer Kész programunk két ciklust tartalmaz: az elsőben beolvassuk a vonalkód jegyeit, a másodikban kiszámítjuk az összeget. Azt, hogy a második ciklusban az i ciklusváltozó éppen
páros vagy páratlan, az i szám kettes maradéka adja, mivel minden páratlan szám 2-vel osztva 1 maradékot ad. Imports System.Console Module Module1 Sub Main() Dim v(12) As Integer Dim s, utolsó As Integer For i As Integer = 1 To 12 Write(i & ".jegy = ") v(i) = ReadLine() Next s = 0 For i As Integer = 1 To 12 If i Mod 2 = 1 Then s = s + v(i) If i Mod 2 = 0 Then s = s + v(i) * 3 Next utolsó = 10 - s Mod 10 WriteLine("A vonalkód ellenőrző jegye = " & utolsó) ReadLine() End Sub End Module
Tömb megadásának módjai A tömböt a szokásos módon, a Dim v(12) As Integer deklarációs sorral hoztuk létre. A Visual Basicben a vektor elemeinek indexét 1-től szokás indítani, valóságban ez a deklarációs létrehoz egy 0. indexű elemet is, így a tömbnek véglegesen 13 eleme van. A programozó dönti el, hogy használja-e a 0. indexűt vagy sem. Deklaráláskor csak azt index legnagyobb értékét és értelemszerűen az index típusát kell megadnunk. A tömböt megadhatjuk az elemek felsorolásával, ekkor azonban akkor is kötelesek vagyunk egy 0. elemet is felvenni, ha nem használjuk Dim s(i) As Integer = (0, 5, 9 , 9 , 8, 9, 8, 3, 0, 1, 1)
A következő deklaráció egy kétdimenziós tömböt (mátrixot) hoz létre, amely egy 100x50-es táblázat kezelésére szolgál, tehát mintegy 5000 elemű: Dim pont (100, 50) As Double Kétdimenziós tömb vagy mátrix esetén minden elemre két sorszámmal (indexszel) kell hivatkoznunk, pl. pont (30,20). Dim xyz() As Integer Az ilyen tömböt dinamikus tömbnek nevezik. Dinamikus tömb esetén az elemek számát a kódban a ReDim utasítással adhatjuk meg és ezzel akár később is módosíthatjuk. Módosítás esetén a Preserve kulcsszó lehetővé teszi, hogy a tömb elemei (amennyit az új maximális index lehetővé tesz) megmaradjanak: ReDim xyz (20) ReDim Preserve xyz (30)
Összetett típusok
Névtér: System A tömbök objektumok! Hivatkozás-típusú változó mutat rájuk. A tömb2 = tömb1 értékadás a 2. tömbre mutató hivatkozást átállítja az 1-es tömbre, így mindkét változó ugyanarra a tömbre fog mutatni! (A program a 2-es tömböt törli a memóriából, ha más hivatkozás nem mutat rá.). A tömb duplikálásához az értékadás helyett használjuk a CopyTo metódust!
Megjegyzés: a többi objektummal ellentétben a tömb létrehozásánál a New operátor után nem az objektum konstruktorát hívjuk meg, csupán a tömbelemek típusát jelezzük. A nem
publikus konstruktor meghívása helyett szükség esetén használhatjuk a CreateInstance osztálymetódust (futás alatti kötés). Hatékonyabb programot írhatunk, ha tömb helyett listát használunk. Különösen a tömbméret módosítása vesz el sok időt.
Feladatok: 1)
ISBN szám A könyvek egyértelmű azonosítására az ún. ISBN számot használják, amely ma megegyezik a vonalkóddal. 2007 előtt azonban ez egy tízjegyű azonosító volt, melynek utolsó jegye az ellenőrző kód. Ezt a jegyet úgy számították ki, hogy az első jegyet 1-gyel, a másodikat 2-vel, a harmadikat 3-mal, … a kilencediket 9-cel megszorozták. A kapott számokat összeadták és vették az összeg 11-es maradékát (10 esetén X-et írtak.) Írjunk programot a fenti eljárásra!
2)
Átlag és szórás Olvassuk be egy adott létszámú osztály informatika osztályzatait és határozzuk meg a jegyek átlagát és szórását!
3)
4)
Töltsünk fel egy 6 elemű tömböt véletlen számokkal, és keressük meg a tömb legkisebb, és a legnagyobb elemét, számítsuk ki a tömb elemeinek átlagát, valamint írassuk ki az ablakba a tömb elemeit! Töltsünk fel két (0-4) elemű tömböt (1-10) közötti véletlen számokkal és a számítsuk ki a két tömb elemeinek szorzatösszegét, a két tömb elemeinek különbségéből képzett átlagát!
5)
Tervezzünk programot, amely kiszámítja egy adott szöveg hosszát, valamint levágja a bal oldalon, a jobb oldalon, ill. mindkét oldalon lévő üres karaktereket!