1. hét: egyszerű programok

Czirkos Zoltán · 2019.09.30.

Bevezető. A parancssor használata. Egyszerű, szekvenciális programok; teknőcgrafika, bemenet és kimenet kezelése.

Fontos

Az első héten nem csütörtökön lesz az előadás, hanem hétfőn: szeptember 9. 14:15, az E1B teremben. Ez egyszeri alkalom, csak a legelső hétre vonatkozik.

Bár az átlagos felhasználó nem szokta használni, a Windows is rendelkezik egy ún. parancssori felhasználói felülettel, ahogyan a Unix típusú operációs rendszerek is. Ezen a felületen különböző parancsokat begépelve lehet elvégezni az alapvető feladatokat, pl. fájlok létrehozását, listázását és törlését. A mai laboron többek között ezzel is megismerkedünk.

1. Parancssor indítása, programok indítása

A Start menü Futtatás… parancsát választva indítsd el a cmd.exe programot! (Windows 10 esetén: a Start gombra jobb klikk, és Futtatás, vagy Windows + R.) A továbbiakban a megjelenő konzolablakban kell dolgozni. A föl-le billentyűkkel kiválaszthatóak a korábban beírt parancsok, így nem kell egy dolgot többször begépelni.

Program indítása parancssorból

Egy program indításához csak be kell írni a nevét. Írd be:

notepad.exe

Erre elindul a Jegyzettömb, mintha a Start menüből indítottad volna.

A Windows automatikusan kiegészíti a programok nevét az ahhoz tartozó kiterjesztéssel (extension, .com, .exe, .bat végű fájlnevek). Így a programot a .exe kiterjesztés beírása nélkül is futtathatod. Zárd be a Jegyzettömböt, és próbáld ki így is:

notepad

Programok paraméterei

A legtöbb konzolos alkalmazás, de gyakran az ablakokat használó programok is, kaphatnak paramétereket. Próbaképp írd be az alábbi sort. Mit tapasztalsz?

notepad szoveg.txt

Egy programnak tetszőleges számú parancssori paramétere, más néven parancssori argumentuma (command line argument) lehet. Ezeket a program neve után írjuk, és szóközzel választjuk el egymástól.

A programok sok különféle dologra használják a paramétereiket. Az Internet Explorer például egy weboldal címét is átveheti. Ilyenkor induláskor rögtön betölti azt. Próbáld ezt ki a tárgyhonlappal:

explorer https://infopy.eet.bme.hu/

Ha paraméterként fájlt adunk meg, és az útvonalban vagy a fájlnévben szóköz van, normál esetben a Windows a szóközzel elválasztott elemeket külön paraméternek tekintené. Ezért kell ilyenkor idézőjelek közé tenni azt. Pl.:

notepad "Uj szoveg.txt"

2. Mappa parancsok

A kurzor az ún. prompt végén villog. Ez alapesetben az aktuális útvonalból (mappa nevéből, path) és a > jelből áll. Ezt figyeld majd, miközben dolgozol!

A mappát (folder) a parancssori parancsok a directory szóból származtatják (a mappák másik neve, magyarul könyvtár). A mappa tartalmának listázása:

C:\Users\111111\> dir

Az eredmény a mappa tartalma: itt további mappák, valamint fájlok lehetnek. Ha nem a legfölső szinten (a gyökérkönyvtárban) vagyunk (C:\), akkor egy . és egy .. nevű mappa (<DIR> jelzi) is látható. A . az aktuális mappát jelenti, a .. az egy szinttel feljebb lévőt. Navigálj el egy intézővel a parancssori ablakod mappájába, és hasonlítsd össze a listát az Intézőben látható tartalommal!

A dir parancsnak számos paramétere (kapcsolója) van, ezekről bővebb információ a

C:\Users\111111\> dir /?

paranccsal kapható. A többi parancsnak is van hasonló helpje, ezt a továbbiakban nem jelezzük külön.

Mappa váltása

Mappát váltani a chdir paranccsal, vagy ennek rövidebb változatával, a cd-vel lehet. Lépj egy szinttel feljebb:

C:\Users\111111\> cd ..

Lépj a gyökérkönyvtárba:

C:\Users\111111\> cd \

vagy

C:\Users\111111\> cd /

A mappák neveit a \ (fordított per vagy visszaper (backslash), AltGr+Q) választja el egymástól az elérési útvonalon. A Windows támogatja a UNIX-ból származó /-t is, a két jel bármelyikét bármikor használhatjuk. A Windows hasonlóan rugalmas a kis és nagybetűk kezelésében: a mappák és fájlok és parancsok nevében nem számít, hogy kis- ill. nagybetűről van szó (pl. notepad, Notepad, NOTEPAD, stb. egyaránt használható). Más rendszerek azonban megkülönböztetik ezeket. Informatikusként sokféle rendszerrel dolgoznod kell majd, ezért jobb, ha mindent a tényleges nevén használsz.

Menj most vissza a felhasználód saját mappájába, a lentihez hasonló módon! Az 111111 helyére a felhasználói azonosítód kerül.

C:\> cd C:\Users\111111\

Mappa létrehozása és törlése

Mappát létrehozni az mkdir vagy md parancsokkal lehet:

C:\Users\111111\> md pylabor

Mappát törölni az rmdir vagy rd paranccsal lehet:

C:\Users\111111\> rd pylabor

A parancs a mappát csak akkor törli, ha az üres.

Hibaüzenet?

C:\Windows> mkdir ujmappa
Access denied

Előfordulhat, hogy a mappa, amelyben épp vagy, írásvédett. Ekkor hibaüzenetet fogsz kapni. (Vajon miért nem engedi a gép, hogy az operációs rendszer fájljai közé írj?) Ha kell, keress másik mappát, amelyben dolgozni fogsz, pl. C:\Users\xxxxx. Kérd a laborvezető segítségét!

Szóköz a névben

Vigyázz! Ahogy előbb is szó volt róla, a parancssorban a szóköz választja el a paramétereket. Ezért ha a következő sort írod, két mappa jön létre, egy „py” és egy „labor” nevű: md py labor. Ha „py labor” nevű mappát szeretnél, tedd idézőjelbe a nevet: md "py labor"! (Vajon akkor is szabad idézőjelbe tenni, ha nincs benne szóköz?)

Egyes parancsoknak, mint pl. a dir-nek is, ún. wildcard-okkal megadott fájlneveket is lehet adni paraméterként. Pl. az alábbi sor csak az .exe kiterjesztésű fájlokat listázza:

C:\> cd \Windows\System32
C:\Windows\System32> dir *.exe

A ? karakterrel egy, a * karakterrel több karaktert helyettesíthetünk a névben. Pl.: dir x*e kilistázza az x-szel kezdődő, e-re végződő fájlokat. Akár több * is lehet: dir x*py*e. A kérdőjel használata: dir c_85?.nls.

Az Intéző megnyitása

A fentebb említett explorer.exe valójában egy olyan program, amelyik a paraméterei alapján eldönti, hogy az Internet Explorert, vagy a Windows intézőt indítsa el. Emiatt az explorer.exe program mappák neveit is kaphatja paraméterként. Meg tudod ezzel nyitni például a Windows mappáját, ahova az előbb beléptél:

C:\> explorer C:\Windows

Vagy éppenséggel bármikor az aktuális mappát, amit mindig egyetlen egy pont jelöl:

C:\Windows> explorer .

Elérési útvonal – path

Honnan tudja az elindított programoknál a parancssor, hogy hol találhatóak meg, pl. a notepad.exe és az explorer.exe melyik mappában van? Hiszen ezek is csak fájlok, amiket meg kell keresnie a programok elindításához.

A válasz erre, hogy van egy lista azokról a mappákról, ahol a gyakran használt programok vannak. Így nem kell mindig beírni a mappa teljes nevét, hanem az elindított programokat egyből ott keresi a rendszer. A listát így tudod kiíratni:

C:\Windows> path

3. ZIP fájlok létrehozása

ZIP archívumokba több fájl csomagolható és tömöríthető. Utána az archívum egyetlen fájlként kezelhető, pl. küldhető el e-mailben, vagy tölthető fel valahova. ZIP archívumot – vagy tömörített mappát, ahogy a Windows nevezi – legegyszerűbb a Fájlkezelővel létrehozni. Ennek két módja lehetséges, próbáld ki mindkettőt!

Első módszer

  • Keresd meg a tömöríteni kívánt fájlokat, pl. a mai órai kísérletezés közben létrehozott szövegeket: szoveg.txt, hiba.txt és a többiek.
  • Jelöld ki az összeset, amelyre szükség van. Ezt megteheted az egérrel kattintva és húzva, téglalapot rajzolva föléjük, vagy a Ctrl gombot nyomva tartva, és egyesével kattintva rájuk.
  • Ha sikerült a kijelölés, kattints a jobb egérgombbal valamelyikükre, és válaszd ki a menüből a Küldés / Tömörített mappát:
  • Ezután megadhatod a fájl nevét, és a ZIP archívum elkészült.

Ugyanez az Asztalon is működik, ha eddig a fájlokat ott hoztad létre.

Második módszer

  • Kattints jobb egérgombbal a semmibe a Fájlkezelőben vagy az asztalon. Válaszd ki az Új / Tömörített mappa menüpontot.
  • Létrejön egy „Új tömörített mappa” nevű ZIP fájl. Kattints erre a jobb gombbal, és nevezd át arra, amire szeretnéd.
  • Ha megvan, utána a tömöríteni kívánt fájlokat egyesével húzd rá az egérrel őket a ZIP fájlra. A többszörös kijelölés itt ugyanúgy működik, kattintás közben a Ctrl billentyűt nyomva tartva.

A létrehozott archívumokra duplán kattinva a Windows Fájlkezelője megmutatja azok tartalmát is. Így ellenőrizni tudod, mi van bennük. Ezekből (és ezekbe) ugyanúgy másolhatók a fájlok, mint egy mappába. De szem előtt kell tartani, hogy valójában ezek nem igazi mappák. Ha bármire szükség van, akkor ki kell bontani az archívumot. A kicsomagolás legegyszerűbben a jobb egérgombbal kattintásra előjövő menüből lehetséges, a „Kibontás” menüpontot kiválasztva.

4. Az InfoPy portál használata

Próbáld ki, hogy be tudsz-e jelentkezni erre a portálra! A menüben is találsz Belépés gombot (jobb fent), de erre a linkre kattintva is lehetséges: bejelentkezés. Ha nem sikerül, akkor kérj ideiglenes jelszót, és szükség szerint állítsd be a NEPTUN-beli hivatalos e-mail címed.

Bejelentkezés után nézz szét a portálon! Az egész félév során feladat lesz az a laborban, hogy az elkészített megoldásokat a labor végén csomagold össze egy ZIP fájlba (nem 7ZIP, nem RAR!), és töltsd azt fel a portálra. Így neked is meglesz, és ott tudod folytatni a megoldások elkészítését, ahol abbahagytad. A kiírt feladatok közt fogod látni minden héten a laborfeladatoknak való helyet.

5. A fejlesztőkörnyezet használata

A bevezető után áttérünk a Python programozásra. Ehhez:

  • Indítsd el az IDLE nevű programot.
  • Megjelenik egy Shell nevű ablak. Ebbe be lehet írni Python sorokat, kifejezéseket, amiket rögtön ki is értékel a környezet:
  • Nagyobb programokat nem a Shell ablakban írunk. Helyette válaszd ki a File / New File Ctrl + N menüpontot!
  • Megjelenik egy új ablak. Írd be oda ezt a kódrészletet:
    print("Helló, világ!")
  • Mentsd el a fájlt hello néven! A fejlesztőkörnyezet automatikusan hozzá fogja adni a .py kiterjesztést, így hello.py nevű fájlt kapsz:
  • A programot az F5 billentyűvel lehet futtatni, vagy a Run / Run module menüpont kiválasztásával. Az eredmény a Shell ablakban fog megjelenni.

6. Teknőcgrafika – bemutató

A következő feladatokban egyszerű rajzokat fogunk készíteni Python programokkal.

A teknőcgrafikában nem koordinátákban, hanem lépésekben és forgásokban gondolkozunk. Az ábrát egy teknőc rajzolja meg, amely az alábbi utasításokat kaphatja:

  • Sétáljon előre valamennyit (ilyenkor vonalat is húz),
  • Forduljon balra vagy jobbra valahány fokkal,
  • Emelje fel vagy tegye le a ceruzát (ettől függ, hogy húz-e vonalat, amikor sétál).

Hozz létre egy új programot a fejlesztőkörnyezetben, és mentsd el teknoc.py néven (SEMMIKÉPPEN SEM turtle.py néven, mert akkor nem fog működni!) Másold be az alábbi kódot! Duplán rákattintva ki tudod jelölni az egészet.

# teknőcgrafikát fogunk használni, a program elején kell
import turtle

# jobbra néz. piros kör
turtle.width(30)
turtle.color("red")
turtle.circle(100)

# ceruza fel, mozgás, ceruza le. fölfelé nézve marad
turtle.up()
turtle.forward(140)
turtle.left(90)
turtle.forward(70)
turtle.down()

# kitöltött, kék színű téglalap
turtle.width(1)
turtle.color("blue")
turtle.begin_fill()
turtle.forward(60)
turtle.left(90)
turtle.forward(280)
turtle.left(90)
turtle.forward(60)
turtle.left(90)
turtle.forward(280)
turtle.end_fill()

# ablak bezárására várunk, a program végén kell
turtle.done()

Ez a program megrajzolja a londoni metró logóját (nagyjából). A # jelek után rövid magyarázatok is szerepelnek. A rajzolás egységei:

  • Előbb rajzol egy piros kört, 30-as vonalvastagsággal.
  • Aztán fölemeli a ceruzát, elmozdul jobbra és le, a téglalap jobb alsó sarkába.
  • Végül megrajzolja a kék téglalapot, amit ki is tölt.

A teknőc az utasításokat sorban hajtja végre, fentről lefelé. Köztük pedig mindig megőrzi az állapotát: arrafelé sétál, amerre legutóbb fordult, és olyan színnel rajzol, amit a legutóbb mondtak neki. A kitöltés befejezésekor kitölti azt a sokszöget (visszamenőleg), amit a kitöltés kezdetétől fogva bejárt útvonal határoz meg.

Az alábbi utasításokat kaphatja:

  • turtle.forward(hossz) – előrefelé megy (negatív hossz = hátrafelé)
  • turtle.backward(hossz) – hátrafelé megy
  • turtle.left(szög) – balra fordul (a szög fokban)
  • turtle.right(szög) – jobb fordul
  • turtle.circle(sugár) – kört rajzol
  • turtle.circle(sugár, szög) – körív (a szög fokban)
  • turtle.color("szín neve angolul") – színt beállít
  • turtle.color(vörös, zöld, kék) – színt beállít színkeveréssel, mindhárom összetevő 0 és 1 között
  • turtle.begin_fill() – kitöltött alakzat kezdete
  • turtle.end_fill() – kitöltött alakzat vége
  • turtle.up() – ceruzát felemeli
  • turtle.down() – ceruzát leteszi
  • turtle.speed(sebesség) – rajzolás sebessége; 1 = lassú, 10 = gyors, 0 = késleltetés kikapcsolása

A Shell ablakban bármikor segítséget lehet kérni angol nyelven a help szó beírásával. Ez beírható önmagában is, vagy zárójelben megadható neki egy téma. Ha az import turtle megvolt (akár a Shell ablakba beírva), utána:

>>> help
Type help() for interactive help, or help(object) for help about object.

>>> help(turtle.forward)
forward(distance)
    Move the turtle forward by the specified distance.
    
    Aliases: forward | fd
    
    Argument:
    distance -- a number (integer or float)
    
    Move the turtle forward by the specified distance, in the direction
    the turtle is headed.

Ez nem csak a teknőcgrafikára igaz, hanem a Pythonban mindenre. Például az előző programban szereplő print utasításhoz is a help(print) információt ad.

7. Teknőcgrafika – feladatok

Készítsd el teknőcgrafikával az alábbi rajzokat! A fenti bemutató utasításai elegendőek mindegyikhez. Nem kell milliméterre pontosan így kinézniük, elég a jellegüket követni.

haromszog.py

paralel.py

haziko.py


emberke.py

lampa.py

emoji.py

Ha elakadsz, lassítsd le a rajzolást a turtle.speed(1)-gyel! Figyeld a teknőc pozícióját, irányát, amit a kis háromszög reprezentál. Vesd össze azt az elképzeléseddel (minek kellene történnie) és a programoddal (melyik sorral mi a célod)!

Ne felejtsd le semelyik program végéről sem a turtle.done() sort!

8. Kettő meg három

Adott az alábbi program.

egyik = input("Írj be valamit: ")
masik = input("Írj be még valamit: ")

print(egyik + masik)

Másold be a fejlesztőkörnyezetbe, és futtasd le! Mi történik akkor, ha azt írod be neki, hogy alma, és hogy fa? És mi történik akkor, ha 2-t és 3-at írsz be neki? (Miért nem 5?) Magyarázd meg (magyar nyelvű szövegben), hogy mi történik!

Ha ez megvolt, írd át a programot ilyenre:

egyik = int(input("Írj be valamit: "))
masik = int(input("Írj be még valamit: "))

print(egyik + masik)

Figyeld meg, mi a különbség a kódban! Az első két sor változott, a harmadik nem. Próbáld most ki 2-vel és 3-mal! Mit tapasztalsz? Mi történik akkor, ha most próbálod beírni az előbbi szavakat? Magyarázd meg az eredményt!

9. A tartály

Tartály

Írj programot, amely segít kiszámolni a felhasználónak, hogy hány doboz festéket kell vennie a lábakon álló tartály festéséhez! Ehhez használnod kell majd az első előadásokon tanultakat. Indulj ki az előadáson bemutatott kör kerülete és területe programból!

A tartálynak ismerjük a magasságát és az átmérőjét. Mindenhol le kell festeni, az oldalát, a tetejét és az alját is. Tudjuk azt is, hogy egy doboz festék 2 m2 felület lefestéséhez elegendő.

Tartály festése

Milyen magas? 2
Mennyi az atmérője? 1.2

4.900885 doboz festék kell.

Figyelj arra, hogy a program kódjában tizedesvessző helyett tizedespontot kell használni (pl. 3.14, persze jó a math.pi is), ugyanígy a bemenet megadásánál is. Ha nem jön ki a fenti eredmény, gondold át, helyes-e a képlet, amit használsz.

Megoldás
print("Tartály festése")

magas = float(input("Milyen magas? "))
atmero = float(input("Mennyi az átmérője? "))

sugar = atmero/2
doboz = (2 * sugar**2 * math.pi + magas * 2 * sugar * math.pi) / 2

print(doboz, "doboz festék kell.")

10. Szakasz hossza

Írj programot, amely a felhasználótól bekéri két síkbeli pont x és y koordinátáit, és kiírja a közéjük húzott egyenes szakasz hosszát (Pitagorasz tételével)!

szakaszhossz
(0;0)–(1;1)1.414214
(1;5)–(4;1)5
(-3;2)–(5;7)9.433981
Megoldás
import math

x1 = float(input("x1 = "))
y1 = float(input("y1 = "))
x2 = float(input("x2 = "))
y2 = float(input("y2 = "))
hossz = math.sqrt((x1-x2)**2 + (y1-y2)**2)
print(hossz)

Hasonló feladatok

Ha ez a feladat nehezen ment, megoldhatsz pár hasonló feladatot a példatárból, mielőtt a következő feladatra rátérsz.

Vigyázz, a laborfeladatokat erősen ajánlott az utolsó feladatig megoldani, hogy a jövő hétre felkészült legyél. Ha nem sikerül, fejezd be őket otthon!

11. Sztringek különleges karakterekkel

Az előadás szorzótáblás programjánál szóba jött, hogy létezik egy tabulátor nevű karakter, és hogy azt "\t"-vel kell a forráskódban megadni. Ennek kapcsán pedig arról is, hogy a különleges karaktereket \ visszaperrel kell jelölni, ha szöveg belsejében szerepelnek a forráskódban.

Írd ki egyetlen egy print() utasítással az alábbi szövegeket! Ügyelj arra, hogy ahol két sorban vannak a minta szerint a kimenetek, ott a programodnak is úgy kell megjelenítenie őket.

A print('hello') kiírja, hogy "hello",
és kezd egy új sort.
A "\t" karaktert tabulátornak nevezzük.
A következő 8-cal osztható sorszámú oszlopra lehet ugrani vele.

12. Feltöltés

Ne felejtsd el az óra végén feltölteni a megoldásaidat a portálra!