1 BME VEGYÉSZMÉRNÖKI ÉS BIOMÉRNÖKI KAR MESTERSZINTŰ MŰSZERES ANALITIKA KÉMIA SZAKIRÁNYÚ TOVÁBBKÉPZÉSI SZAK INFORMATIKA (SZÁMÍTÁSTECHNIKA) nov.19. „Hurok” programozása Tömbök (indexes változók). Adatok beolvasása txt fájlból
2 A múlt heti program „hurokkal” - Az Excel munkalap A oszlopát átmásoltuk egy másik munkalapra. Ezután megnyitottuk a Visual Basic Editort (Fejlesztőeszközök Kód Visual Basic), és beszúrtunk egy modul-lapot, ahová beírtuk a programot: Sub elsot() Dim x As Double, f#, fc#, a#, b#, sor As Integer, n% Cells(1, 2) = "f": Cells(1, 3) = "fc": Cells(1, 4) = "(f-fc)^2" a = 2: b = InputBox("b=?",, 6): n = InputBox("n=?",, 16) sor = 2 vissza: x = Cells(sor, 1) If sor = 2 Then f=0 Else f = Cells(sor - 1, 2) + (x - Cells(sor - 1, 1)) * 4 * Cos(5 * x) End If fc = a * Sin(b * x) / 5 Cells(sor, 2) = f: Cells(sor, 3) = fc sor=sor+1 Cells(sor, 4) = (f - fc) ^ 2: sor=sor+1 If sor <= n Then GoTo vissza End Sub Do Loop While sor <= n For sor=2 to n x = Cells(sor, 1) If sor = 2 Then f = 0 Else f = Cells(sor - 1, 2) + (x - Cells(sor - 1, 1)) * 4 * Cos(5 * x) End If fc = a * Sin(b * x) / 5 Cells(sor, 2) = f: Cells(sor, 3) = fc Cells(sor, 4) = (f - fc) ^ 2 Next sor „Hurok” For To – Next ciklusutasítással „Hurok” átírása Do – Loop While ciklusutasítással A két ciklus utasítás nem ugyanazon a helyen „tesztel”!!
3 Do - Loop While ciklus hátul tesztelő ciklus megad: n k=1 megad: NEV, Z1, Z2 ZH=(Z1+Z2)/2 kiír: NEV, ZH k=k+1 k<=n ? vége start nem igen n=InputBox(“n=?”): k=1 Do NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”) ZH=(Z1+Z2)/2 : Cells(k,1)=NEV Cells(k,2)=ZH : k=k+1 Loop While k<=n Visual Basic program részlet Példa: két ZH átlagának kiszámítása n hallgató esetén. Hurok programozása
4 Do - Loop Until ciklus hátul tesztelő ciklus megad: n k=1 megad: NEV, Z1, Z2 ZH=(Z1+Z2)/2 kiír: NEV, ZH k=k+1 k > n ? vége start igen nem n=InputBox(“n=?”): k=1 Do NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”) ZH=(Z1+Z2)/2 : Cells(k,1)=NEV Cells(k,2)=ZH : k=k+1 Loop Until k>n Visual Basic program részlet Példa: két ZH átlagának kiszámítása n hallgató esetén. Hurok programozása
5 Do While - Loop ciklus n=InputBox(“n=?”): k=1 Do While k<=n NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”) ZH=(Z1+Z2)/2 : Cells(k,1)=NEV Cells(k,2)=ZH : k=k+1 Loop Visual Basic program részlet start megad: n k=1 k<=n ? nem vége igen megad: NEV, Z1, Z2 ZH=(Z1+Z2)/2 kiír: NEV, ZH k=k+1 elől tesztelő ciklus Példa: két ZH átlagának kiszámítása n hallgató esetén. Hurok programozása
6 Do Until - Loop ciklus n=InputBox(“n=?”): k=1 Do Until k>n NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”) ZH=(Z1+Z2)/2 : Cells(k,1)=NEV Cells(k,2)=ZH : k=k+1 Loop Visual Basic program részlet start megad: n k=1 k > n ? igen vége nem megad: NEV, Z1, Z2 ZH=(Z1+Z2)/2 kiír: NEV, ZH k=k+1 elől tesztelő ciklus Példa: két ZH átlagának kiszámítása n hallgató esetén. Hurok programozása
7 Do While - Loop ciklus átírása For To – Next ciklusba: (elől tesztelő ciklusok) Példa: két ZH átlagának kiszámítása n hallgató esetén. Hurok programozása n=InputBox(“n=?”) k=1 Do While k<=n NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”) ZH=(Z1+Z2)/2 : Cells(k,1)=NEV Cells(k,2)=ZH k=k+1 Loop Visual Basic program részletek n=InputBox(“n=?”) For k=1 To n NEV=InputBox(“NEV=?”) Z1=InputBox(“Z1=?”) Z2=InputBox(“Z2=?”): ZH=(Z1+Z2)/2 Cells(k,1)=NEV : Cells(k,2)=ZH Next k A Do While - Loop For To – Next átírás nem mindig lehetséges, de a fordítottja igen!
8 Programot írunk az m 0 egész szám beolvasására, az első (m+1) páratlan szám reciprokának, és ezen számsorozatból az alábbi összegnek a kiszámítására: A programban a For k=0 To m … Next k ciklust használjuk, a kiiratás m=10 esetén a jobbra látható táblázatnak fog megfeleni. For To – Next ciklus A For k=0 To m … Next k ciklus a k ciklusváltozó 0,1,2,…,m értékeivel való számításokat jelenti a ciklus törzsében. Ha k értékét „lépésenként” nem 1-gyel, hanem pl. 2-vel akarjuk növelni, azaz a ciklus törzsében k ciklusváltozó 0,2,4,… értékeivel akarunk számolni, a For k=0 To m Step 2 … Next k utasítást használjuk.
9 Programot írunk két vektor minden elemének egy-egy számmal való megszorzására, és a szorzatok összeadására: Tömbök (indexes változók) Sub KetVektor() Dim a%(3), b%(3), k%, c%(3) a(1) = 3: a(2) = 0: a(3) = 4 b(1) = 1: b(2) = 2: b(3) = 2. For k = 1 To 3 c(k) = 2 * a(k) + 3 * b(k) Next k End Sub Tömbök deklarációja (kötelező!) Értékadás tömb-elemeknek
10 Tömbök, olvasás fájlból Öt nap 3 áruból származó bevételének számítása Az adatok.txt fájl Beolvasások fájlból Fájl megnyitása Fájl bezárása Sub elad() Dim Mit$(3), FtCim$, FtKg%(3), kgCim$, kg#(5, 3), j%, k%, Ft# Openadatok.txtFor Input As #1 Open "adatok.txt" For Input As #1 Input #1, Mit(1), Mit(2), Mit(3) Input #1, FtCim Input #1, FtCim: Cells(2, 5) = FtCim For j = 1 To 3 Input #1, FtKg(j): Input #1, FtKg(j): Cells(j + 2, 5) = FtKg(j) Next j Input #1, kgCim Input #1, kgCim: Cells(1, 2) = kgCim For k = 1 To 5 For j = 1 To 3 Input #1, kg(k, j): Input #1, kg(k, j): Cells(k + 1, j) = kg(k, j) Next j Next k Close #1 For j = 1 To 3: Cells(7, j) = Mit(j): Next j For k = 1 To 5 Ft = 0 For j = 1 To 3 Ft = Ft + kg(k, j) * FtKg(j) Next j Cells(k + 1, 7) = Ft Next k Cells(1, 7) = "Ft" End Sub A kiiratások
11 Tömbök, olvasás fájlból Öt vektor mindegyikét szeretnénk megszorozni egy adott vektorral… skalárszorzatok 1,0,1 1,3,2 -2,0,6 1,1,1 0,0,5 -3,1,4 A vektorok.txt fájl A kiiratások Sub sokvektor Sub sokvektor() Dim a#(5, 3), b#(3) Dim c#(5), k%, j%, cim$, ures Openvektorok.txtFor Input As #1 Open "vektorok.txt" For Input As #1 Input #1, cim Input #1, cim : Cells(6, 1) = cim Input #1, b(1), b(2), b(3) For j = 1 To 3 Cells(j + 1, 5) = b(j) Next j Input #1, ures For k = 1 To 5 For j = 1 To 3 Input #1, a(k, j) Cells(k, j) = a(k, j) Next j Next k Close #1... End Sub Beolvasások fájlból Beolvasás fájlból Fájl megnyitása Fájl bezárása Az adatfájl üres sorának kezelése
12 Az itt (balra) látható energia12.txt fájl a villany szöveg után a villany Ft/kWh árát, a gáz szöveg után a gáz Ft/m 3 árát tartalmazza, majd az ezt követő 12 hónapnév és számpár egy család kWh-ban ill. m 3 –ben mért adott havi villany- ill. gáz-fogyasztását adja meg. Írjon programot a fájl adatainak beolvasására. Az egyes hónapok nevét, és az adott hónapra vonatkozó villany- ill. gázfogyasztási értékeket egy-egy tömb elemeiként olvastassa be (pl. a hónapok nevéhez a honap$(12) tömböt, a havi villany- ill. gázfogyasztási értékeknek vill#(12) ill gaz#(12) tömböket deklaráljon). 2.HF Elküldendő jan. 10-ig:.xlsm (vagy xls) fájl a címre A program a beolvastatás után számítsa ki és írja ki a család havi összes (villany + gáz) energiaköltségeit, valamint a 6 „hideg” ill. 6 „meleg” hónap össz-energia költségét a jobbra látható ábrának megfelelően! A feladatot kétféleképpen oldja meg: a.) A beolvastatási résznek megfelelő hurkot For-Next ciklussal programozza. b.) A beolvastatási résznek megfelelő hurkot Do-Loop ciklussal programozza. A kiiratásnak megfelelő sor számát a hónap számából (k) az alábbiak szerint számíthatja: „meleg” hónapok esetén: sor=k-2 (pl. május az 5-2 = 3. sorba kerül) „hideg” hónapok esetén: if k<4 then sor=k+1 else sor=k-5 (pl. január az 1+1=2. sorba kerül és november a 11-5=6. sorba)